From 66e943c91e133eec5a0822ea22fd92cbc04bc9f3 Mon Sep 17 00:00:00 2001
From: zhuguifei <312353457@qq.com>
Date: 星期三, 12 三月 2025 16:04:14 +0800
Subject: [PATCH] 保养工单汇总
---
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsMaintOrderServiceImpl.java | 107 +++
eims-ui/apps/web-antd/src/api/eims/maint-order-st/index.ts | 62 ++
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/EimsMaintOrderSt.java | 74 ++
eims-ui/apps/web-antd/src/views/eims/maint-order-st/maint-order-st-drawer.vue | 109 +++
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/mapper/EimsMaintOrderMapper.java | 2
eims/ruoyi-modules/lb-eims/src/main/resources/mapper/eims/EimsMaintOrderMapper.xml | 26
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/job/MaintPlanToOrderJob.java | 52 -
eims-ui/apps/web-antd/src/views/eims/maint-order-st/index.vue | 223 +++++++
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/controller/EimsMaintOrderController.java | 30
eims-ui/packages/@core/base/shared/src/constants/dict-enum.ts | 1
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsMaintOrderStVo.java | 109 +++
eims-ui/apps/web-antd/src/views/eims/maint-plan/data.tsx | 6
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsMaintOrderStServiceImpl.java | 220 +++++++
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/EimsMaintPlan.java | 5
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsMaintPlanBo.java | 6
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/IEimsMaintOrderService.java | 9
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/mapper/EimsMaintOrderStMapper.java | 15
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsMaintPlanVo.java | 7
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/MaintOrdeGroupVo.java | 70 ++
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsMaintOrderStBo.java | 77 ++
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsMaintPlanServiceImpl.java | 42 -
eims-ui/apps/web-antd/src/api/eims/maint-order-st/model.d.ts | 85 ++
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/controller/EimsMaintOrderStController.java | 106 +++
eims/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/DictConstants.java | 11
eims-ui/apps/web-antd/src/api/eims/maint-order/index.ts | 12
eims-ui/apps/web-antd/src/views/eims/maint-order-st/data.tsx | 194 ++++++
eims/ruoyi-modules/lb-eims/src/main/resources/mapper/eims/EimsMaintOrderStMapper.xml | 7
eims-ui/apps/web-antd/src/api/eims/maint-order/model.d.ts | 29
eims-ui/apps/web-antd/src/views/eims/maint-plan/maint-plan-drawer.vue | 6
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/IEimsMaintOrderStService.java | 69 ++
30 files changed, 1,675 insertions(+), 96 deletions(-)
diff --git a/eims-ui/apps/web-antd/src/api/eims/maint-order-st/index.ts b/eims-ui/apps/web-antd/src/api/eims/maint-order-st/index.ts
new file mode 100644
index 0000000..0866850
--- /dev/null
+++ b/eims-ui/apps/web-antd/src/api/eims/maint-order-st/index.ts
@@ -0,0 +1,62 @@
+import type { MaintOrderStVO } from './model';
+
+import type { ID, IDS } from '#/api/common';
+
+import { commonExport } from '#/api/helper';
+import { requestClient } from '#/api/request';
+
+enum Api {
+ maintOrderrStExport = '/eims/maintOrderSt/export',
+ maintOrderrStList = '/eims/maintOrderSt/list',
+ root = '/eims/maintOrderSt'
+}
+
+/**
+ * 鏌ヨ淇濆吇宸ュ崟鍒楄〃
+ * @param query
+ * @returns {*}
+ */
+
+export function listMaintOrderSt(params?: any) {
+ return requestClient.get<MaintOrderStVO[]>(Api.maintOrderrStList, { params });
+}
+
+
+/**
+ * 鏌ヨ淇濆吇宸ュ崟璇︾粏
+ * @param maintOrderrStId
+ */
+export function getMaintOrderSt(maintOrderrStId: ID) {
+ return requestClient.get<MaintOrderStVO>(`${Api.root}/${maintOrderrStId}`);
+}
+
+/**
+ * 鏂板淇濆吇宸ュ崟
+ * @param data
+ */
+export function addMaintOrderSt(data: any) {
+ return requestClient.postWithMsg<void>(Api.root, data);
+}
+
+/**
+ * 淇敼淇濆吇宸ュ崟
+ * @param data
+ */
+export function updateMaintOrderSt(data: any) {
+ return requestClient.putWithMsg<void>(Api.root, data);
+}
+
+/**
+ * 鍒犻櫎淇濆吇宸ュ崟
+ * @param maintOrderrStId
+ */
+export function delMaintOrderSt(maintOrderrStId: IDS) {
+ return requestClient.deleteWithMsg<void>(`${Api.root}/${maintOrderrStId}`);
+}
+/**
+ * 瀵煎嚭
+ * @param
+ */
+export function maintOrderrStExport(data: any) {
+ return commonExport(Api.maintOrderrStExport, data);
+}
diff --git a/eims-ui/apps/web-antd/src/api/eims/maint-order-st/model.d.ts b/eims-ui/apps/web-antd/src/api/eims/maint-order-st/model.d.ts
new file mode 100644
index 0000000..c5a7ea3
--- /dev/null
+++ b/eims-ui/apps/web-antd/src/api/eims/maint-order-st/model.d.ts
@@ -0,0 +1,85 @@
+export interface MaintOrderStVO {
+ /**
+ *
+ */
+ id: number | string;
+
+ /**
+ *
+ */
+ title: string;
+
+ /**
+ *
+ */
+ equId: number | string;
+ status: string;
+
+ /**
+ *
+ */
+ planTime: string;
+
+ /**
+ * 淇濆吇浜�
+ */
+ maintUser: number;
+
+ /**
+ * 楠岃瘉浜�
+ */
+ verifyUser: number;
+ verifyTime: string;
+
+ /**
+ * 鐗硅浜嬮」
+ */
+ specialNote: string;
+
+ /**
+ * 澶囨敞
+ */
+ remark: string;
+}
+
+export interface MaintOrderStForm extends BaseEntity {
+ /**
+ *
+ */
+ id?: number | string;
+
+ /**
+ *
+ */
+ title?: string;
+
+ /**
+ *
+ */
+ equId?: number | string;
+
+ /**
+ *
+ */
+ planTime?: string;
+
+ /**
+ * 淇濆吇浜�
+ */
+ maintUser?: number;
+
+ /**
+ * 楠岃瘉浜�
+ */
+ verifyUser?: number;
+
+ /**
+ * 鐗硅浜嬮」
+ */
+ specialNote?: string;
+
+ /**
+ * 澶囨敞
+ */
+ remark?: string;
+}
diff --git a/eims-ui/apps/web-antd/src/api/eims/maint-order/index.ts b/eims-ui/apps/web-antd/src/api/eims/maint-order/index.ts
index e30c0ac..c2dcfb5 100644
--- a/eims-ui/apps/web-antd/src/api/eims/maint-order/index.ts
+++ b/eims-ui/apps/web-antd/src/api/eims/maint-order/index.ts
@@ -1,4 +1,4 @@
-import type { MaintOrderVO } from './model';
+import type { MaintOrderGroupVO, MaintOrderVO } from './model';
import type { ID, IDS } from '#/api/common';
@@ -7,6 +7,8 @@
enum Api {
maintOrderExport = '/eims/maintOrder/export',
+ maintOrderGroupList = '/eims/maintOrder/groupList',
+ maintOrderGroupDetailList = '/eims/maintOrder/detailList',
maintOrderList = '/eims/maintOrder/list',
root = '/eims/maintOrder'
}
@@ -21,6 +23,14 @@
return requestClient.get<MaintOrderVO[]>(Api.maintOrderList, { params });
}
+export function listMaintOrderGroup(params?: any) {
+ return requestClient.get<MaintOrderGroupVO[]>(Api.maintOrderGroupList, { params });
+}
+
+export function listMaintOrderGroupDetail(params?: any) {
+ return requestClient.get<MaintOrderVO[]>(Api.maintOrderGroupDetailList, { params });
+}
+
/**
* 鏌ヨ淇濆吇宸ュ崟璇︾粏
* @param maintOrderId
diff --git a/eims-ui/apps/web-antd/src/api/eims/maint-order/model.d.ts b/eims-ui/apps/web-antd/src/api/eims/maint-order/model.d.ts
index 996513f..8605bb8 100644
--- a/eims-ui/apps/web-antd/src/api/eims/maint-order/model.d.ts
+++ b/eims-ui/apps/web-antd/src/api/eims/maint-order/model.d.ts
@@ -87,3 +87,32 @@
remark: string;
}
+export interface MaintOrderGroupVO {
+ /**
+ *
+ */
+ id: number | string;
+
+ /**
+ *
+ */
+ equId: number | string;
+
+ /**
+ * 璁″垝琛ㄥ啑浣�-淇濆吇浜�
+ */
+ maintUserNames: string;
+
+
+ /**
+ * 楠岃瘉浜�
+ */
+ verifyUserNames: string;
+
+ /**
+ * 淇濆吇璁″垝鏃堕棿
+ */
+ planTime: string;
+
+
+}
diff --git a/eims-ui/apps/web-antd/src/views/eims/maint-order-st/data.tsx b/eims-ui/apps/web-antd/src/views/eims/maint-order-st/data.tsx
new file mode 100644
index 0000000..0629b80
--- /dev/null
+++ b/eims-ui/apps/web-antd/src/views/eims/maint-order-st/data.tsx
@@ -0,0 +1,194 @@
+import type { VxeGridProps } from '#/adapter/vxe-table';
+
+import { DictEnum } from '@vben/constants';
+import { getPopupContainer } from '@vben/utils';
+
+import { Tag } from 'ant-design-vue';
+
+import { type FormSchemaGetter } from '#/adapter/form';
+import { getDictOptions } from '#/utils/dict';
+import { renderDict } from '#/utils/render';
+
+export const querySchema: FormSchemaGetter = () => [
+ {
+ component: 'Input',
+ fieldName: 'equName',
+ label: '璁惧鍚嶇О'
+ },
+ {
+ component: 'RangePicker',
+ fieldName: 'planTime',
+ label: '淇濆吇鏃ユ湡'
+ },
+ {
+ component: 'Select',
+ componentProps: {
+ options: getDictOptions(DictEnum.MAINT_ORDER_ST_STATUS)
+ },
+ fieldName: 'status',
+ label: '鐘舵��'
+ }
+];
+
+export const columns: VxeGridProps['columns'] = [
+ { type: 'checkbox', width: 60, fixed: 'left' },
+ {
+ title: '璁惧鍚嶇О',
+ field: 'equName',
+ minWidth: 200,
+ fixed: 'left'
+ },
+ {
+ title: '璁″垝淇濆吇鏃ユ湡',
+ field: 'planTime',
+ minWidth: 200
+ },
+ {
+ title: '鐘舵��',
+ field: 'status',
+ minWidth: 80,
+ slots: {
+ default: ({ row }) => {
+ return renderDict(row.status, DictEnum.MAINT_ORDER_ST_STATUS);
+ }
+ }
+ },
+ {
+ title: '璧勪骇缂栧彿',
+ field: 'assetNo',
+ minWidth: 160
+ },
+ {
+ title: '宸ュ崟鎬绘暟',
+ field: 'orderCount',
+ minWidth: 100
+ },
+ {
+ title: '寰呬繚鍏�',
+ field: 'dbyCount',
+ minWidth: 80,
+ slots: {
+ default: ({ row }) => {
+ return <Tag color="orange">{row.dbyCount}</Tag>;
+ }
+ }
+ },
+ {
+ title: '淇濆吇涓�',
+ field: 'byCount',
+ minWidth: 80,
+ slots: {
+ default: ({ row }) => {
+ return <Tag color="blue">{row.byCount}</Tag>;
+ }
+ }
+ },
+ {
+ title: '寰呴獙璇�',
+ field: 'dyzCount',
+ minWidth: 80,
+ slots: {
+ default: ({ row }) => {
+ return <Tag color="purple">{row.dyzCount}</Tag>;
+ }
+ }
+ },
+ {
+ title: '瀹屾垚',
+ field: 'wcCount',
+ minWidth: 80,
+ slots: {
+ default: ({ row }) => {
+ return <Tag color="success">{row.wcCount}</Tag>;
+ }
+ }
+ },
+ {
+ title: '鐗硅浜嬮」',
+ field: 'specialNote',
+ minWidth: 160
+ },
+ {
+ title: '淇濆吇鎴愬憳',
+ field: 'maintUserNames',
+ minWidth: 160
+ },
+ {
+ title: '绋芥煡鏃堕棿',
+ field: 'verifyTime',
+ minWidth: 200
+ },
+ {
+ field: 'action',
+ fixed: 'right',
+ slots: { default: 'action' },
+ title: '鎿嶄綔',
+ width: 200
+ }
+];
+
+export const drawerSchema: FormSchemaGetter = () => [
+ {
+ component: 'Input',
+ dependencies: {
+ show: () => false,
+ triggerFields: ['']
+ },
+ fieldName: 'id'
+ },
+ {
+ component: 'Input',
+ dependencies: {
+ show: () => false,
+ triggerFields: ['']
+ },
+ fieldName: 'equId'
+ },
+ {
+ component: 'DatePicker',
+ dependencies: {
+ show: () => false,
+ triggerFields: ['']
+ },
+ componentProps: {
+ format: 'YYYY-MM-DD',
+ showTime: false,
+ valueFormat: 'YYYY-MM-DD',
+ getPopupContainer
+ },
+ fieldName: 'planTime',
+ label: '璁″垝淇濆吇鏃ユ湡'
+ },
+ {
+ component: 'Input',
+ componentProps: {
+ readonly: true
+ },
+ fieldName: 'title',
+ label: '鏍囬'
+ },
+ {
+ component: 'Textarea',
+ fieldName: 'specialNote',
+ label: '鐗硅浜嬮」'
+ },
+ {
+ component: 'Input',
+ fieldName: 'verifyUser',
+ label: '绋芥煡浜�',
+ dependencies: {
+ show: () => false,
+ triggerFields: ['']
+ }
+ },
+ {
+ component: 'Input',
+ fieldName: 'verifyUserName',
+ label: '绋芥煡浜�'
+ },
+ {
+ component: 'Textarea',
+ fieldName: 'remark',
+ label: '澶囨敞'
+ }
+];
diff --git a/eims-ui/apps/web-antd/src/views/eims/maint-order-st/index.vue b/eims-ui/apps/web-antd/src/views/eims/maint-order-st/index.vue
new file mode 100644
index 0000000..716379d
--- /dev/null
+++ b/eims-ui/apps/web-antd/src/views/eims/maint-order-st/index.vue
@@ -0,0 +1,223 @@
+<script setup lang="ts">
+import { onMounted, ref } from 'vue';
+
+import { Page, useVbenDrawer, type VbenFormProps } from '@vben/common-ui';
+import { addFullName, getPopupContainer, getVxePopupContainer } from '@vben/utils';
+
+import { Popconfirm, Space } from 'ant-design-vue';
+
+import { useVbenVxeGrid, type VxeGridProps, vxeSortEvent } from '#/adapter/vxe-table';
+import { listMaintOrderGroupDetail } from '#/api/eims/maint-order';
+import { delMaintOrderSt, listMaintOrderSt } from '#/api/eims/maint-order-st';
+import { getDeptTree, userList } from '#/api/system/user';
+import BasisSubTable from '#/views/eims/components/basis-sub-table.vue';
+import { columns as orderCol } from '#/views/eims/maint-order/data';
+
+import { columns, querySchema } from './data';
+import maintOrderStDrawer from './maint-order-st-drawer.vue';
+import type { Recordable } from '@vben/types';
+import { MAINT_ORDER_STATUS } from '#/constants/dict';
+import { $t } from '@vben/locales';
+
+defineExpose({
+ tableSelect
+});
+
+const formOptions: VbenFormProps = {
+ commonConfig: {
+ labelWidth: 80,
+ componentProps: {
+ allowClear: true
+ }
+ },
+ collapsed: true,
+ schema: querySchema(),
+ wrapperClass: 'grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4',
+ // 鏃ユ湡閫夋嫨鏍煎紡鍖�
+ fieldMappingTime: [['planTime', ['params[beginPlanTime]', 'params[endPlanTime]'], ['YYYY-MM-DD 00:00:00', 'YYYY-MM-DD 23:59:59']]]
+};
+
+const gridOptions: VxeGridProps = {
+ checkboxConfig: {
+ // 楂樹寒
+ highlight: true,
+ // 缈婚〉鏃朵繚鐣欓�変腑鐘舵��
+ reserve: true
+ // 鐐瑰嚮琛岄�変腑
+ // trigger: 'row'
+ },
+ columns,
+ height: 'auto',
+ keepSource: true,
+ pagerConfig: {},
+ proxyConfig: {
+ ajax: {
+ query: async ({ page }, formValues = {}) => {
+ return await listMaintOrderSt({
+ pageNum: page.currentPage,
+ pageSize: page.pageSize,
+ ...formValues
+ });
+ }
+ }
+ },
+ rowConfig: {
+ isHover: true,
+ keyField: 'id'
+ },
+ sortConfig: {
+ // 杩滅▼鎺掑簭
+ remote: true,
+ // 鏀寔澶氬瓧娈垫帓搴� 榛樿鍏抽棴
+ multiple: true
+ },
+ id: 'maint-order-group-index'
+};
+const orderId = ref<string>();
+const [BasicTable, tableApi] = useVbenVxeGrid({
+ formOptions,
+ gridOptions,
+ gridEvents: {
+ sortChange: (sortParams) => vxeSortEvent(tableApi, sortParams),
+ cellClick: (e: any) => {
+ const { row } = e;
+ orderId.value = `${row.equId}_${row.planTime}`;
+ }
+ }
+});
+
+/**
+ * 鍒濆鍖栭儴闂ㄩ�夋嫨
+ */
+async function setupDeptSelect() {
+ // updateSchema
+ const deptTree = await getDeptTree();
+ // 閫変腑鍚庢樉绀哄湪杈撳叆妗嗙殑鍊� 鍗崇埗鑺傜偣 / 瀛愯妭鐐�
+ addFullName(deptTree, 'label', ' / ');
+ tableApi.formApi.updateSchema([
+ {
+ componentProps: (formModel) => ({
+ class: 'w-full',
+ fieldNames: {
+ key: 'id',
+ value: 'id',
+ children: 'children'
+ },
+ getPopupContainer,
+ async onSelect(deptId: number | string) {
+ /** 鏍规嵁閮ㄩ棬ID鍔犺浇鐢ㄦ埛 */
+ await setupUserOptions(deptId);
+ /** 鍙樺寲鍚庨渶瑕侀噸鏂伴�夋嫨鐢ㄦ埛 */
+ formModel.maintUser = undefined;
+ },
+ placeholder: '璇烽�夋嫨',
+ showSearch: true,
+ treeData: deptTree,
+ treeDefaultExpandAll: true,
+ treeLine: { showLeafIcon: false },
+ // 绛涢�夌殑瀛楁
+ treeNodeFilterProp: 'label',
+ // 閫変腑鍚庢樉绀哄湪杈撳叆妗嗙殑鍊�
+ treeNodeLabelProp: 'fullName'
+ }),
+ fieldName: 'maintDept'
+ }
+ ]);
+}
+
+/**
+ * 鐢ㄦ埛鐨勫姞杞�
+ */
+async function setupUserOptions(deptId: any) {
+ const params = { deptId };
+ const userPageResult = await userList({
+ pageNum: 1,
+ pageSize: 500,
+ ...params
+ });
+ const options = userPageResult.rows.map((item) => ({
+ label: item.nickName || item.userName,
+ value: item.userId
+ }));
+ // 绛涢��
+ const filterOption = (input: string, option: any) => {
+ return option.label.toLowerCase().includes(input.toLowerCase());
+ };
+
+ const placeholder = options.length > 0 ? '璇烽�夋嫨' : '璇ラ儴闂ㄤ笅鏆傛棤鐢ㄦ埛';
+ tableApi.formApi.updateSchema([
+ {
+ componentProps: { options, placeholder, filterOption },
+ fieldName: 'maintUser'
+ }
+ ]);
+}
+const [MaintOrderStDrawer, maintOrderStDrawerApi] = useVbenDrawer({
+ connectedComponent: maintOrderStDrawer
+});
+
+function handleAdd() {
+ maintOrderStDrawerApi.setData({});
+ maintOrderStDrawerApi.open();
+}
+
+async function handleEdit(record: Recordable<any>) {
+ maintOrderStDrawerApi.setData({ id: record.id });
+ maintOrderStDrawerApi.open();
+}
+async function handleDelete(row: Recordable<any>) {
+ await delMaintOrderSt(row.id);
+ await tableApi.query();
+}
+
+
+onMounted(async () => {
+ await setupDeptSelect();
+});
+
+// 閫変腑鏁版嵁
+function tableSelect() {
+ return tableApi.grid.getCheckboxRecords();
+}
+</script>
+
+<template>
+ <Page :auto-content-height="true">
+ <div class="flex h-full gap-[8px] flex-col">
+ <BasicTable class="h-3/5" table-title="淇濆吇宸ュ崟鍒楄〃">
+ <template #toolbar-tools>
+ <Space />
+ </template>
+
+ <template #equName="{ row }">
+ <Space>
+ <span>{{ row.equName }}</span>
+ </Space>
+ </template>
+ <template #action="{ row }">
+ <Space>
+ <ghost-button v-access:code="['eims:maintOrderSt:edit']" @click.stop="handleEdit(row)">
+ {{ $t('pages.common.edit') }}
+ </ghost-button>
+ <Popconfirm :get-popup-container="getVxePopupContainer" placement="left" title="纭鍒犻櫎锛�"
+ @confirm="handleDelete(row)">
+ <ghost-button danger v-access:code="['eims:maintOrderSt:remove']" @click.stop="">
+ {{ $t('pages.common.delete') }}
+ </ghost-button>
+ </Popconfirm>
+ </Space>
+ </template>
+
+ </BasicTable>
+ <BasisSubTable
+ :columns="orderCol"
+ :list-api="listMaintOrderGroupDetail"
+ :req-value="orderId"
+ class="h-2/5"
+ req-key="maintCode"
+ title="淇濆吇瀹炴柦椤圭洰"
+ />
+ </div>
+ <MaintOrderStDrawer @reload="tableApi.query()" />
+ </Page>
+</template>
diff --git a/eims-ui/apps/web-antd/src/views/eims/maint-order-st/maint-order-st-drawer.vue b/eims-ui/apps/web-antd/src/views/eims/maint-order-st/maint-order-st-drawer.vue
new file mode 100644
index 0000000..414ec0f
--- /dev/null
+++ b/eims-ui/apps/web-antd/src/views/eims/maint-order-st/maint-order-st-drawer.vue
@@ -0,0 +1,109 @@
+<script setup lang="ts">
+import { computed, ref } from 'vue';
+
+import { useVbenDrawer, useVbenModal } from '@vben/common-ui';
+import { cloneDeep } from '@vben/utils';
+
+import { InputSearch } from 'ant-design-vue';
+
+import { useVbenForm } from '#/adapter/form';
+import { getMaintOrderSt, updateMaintOrderSt } from '#/api/eims/maint-order-st';
+import userModal from '#/views/eims/components/user-modal.vue';
+
+import { drawerSchema } from './data';
+
+const emit = defineEmits<{ reload: [] }>();
+
+const isUpdate = ref(false);
+const title = computed(() => {
+ return isUpdate.value ? '淇濆吇宸ュ崟姹囨�荤ń鏌�' : '淇濆吇宸ュ崟姹囨��';
+});
+
+const [BasicForm, formApi] = useVbenForm({
+ commonConfig: {
+ formItemClass: 'col-span-2',
+ componentProps: {
+ class: 'w-full'
+ },
+ labelWidth: 120
+ },
+ schema: drawerSchema(),
+ showDefaultActions: false,
+ wrapperClass: 'grid-cols-2'
+});
+
+const [BasicDrawer, drawerApi] = useVbenDrawer({
+ onCancel: handleCancel,
+ onConfirm: handleConfirm,
+ async onOpenChange(isOpen) {
+ if (!isOpen) {
+ return null;
+ }
+ drawerApi.drawerLoading(true);
+ const { id } = drawerApi.getData() as { id?: number | string };
+ isUpdate.value = !!id;
+ // 鏇存柊 && 璧嬪��
+ if (isUpdate.value && id) {
+ const record = await getMaintOrderSt(id);
+ await formApi.setValues(record);
+ }
+
+ drawerApi.drawerLoading(false);
+ }
+});
+
+async function handleConfirm() {
+ try {
+ drawerApi.drawerLoading(true);
+ const { valid } = await formApi.validate();
+ if (!valid) {
+ return;
+ }
+ const data = cloneDeep(await formApi.getValues());
+ // await (isUpdate.value ? updateMaintOrderSt(data) : addMaintOrderSt(data));
+ await (isUpdate.value ? updateMaintOrderSt(data) : updateMaintOrderSt(data));
+ emit('reload');
+ await handleCancel();
+ } catch (error) {
+ console.error(error);
+ } finally {
+ drawerApi.drawerLoading(false);
+ }
+}
+
+async function handleCancel() {
+ drawerApi.close();
+ await formApi.resetForm();
+}
+
+// user modal
+const [UserModal, userModalApi] = useVbenModal({
+ connectedComponent: userModal,
+ draggable: true,
+ title: '閫夋嫨绋芥煡浜�'
+});
+
+function handleUserModal() {
+ userModalApi.setData({});
+ userModalApi.open();
+}
+
+/**
+ * 鏇存柊閫夋嫨鐨勭敤鎴�
+ * @param user
+ */
+async function updateUser(user: any) {
+ await formApi.setValues({ 'verifyUserName': user.nickName, 'verifyUser': user.userId });
+}
+</script>
+
+<template>
+ <BasicDrawer :close-on-click-modal="false" :title="title" class="w-[600px]">
+ <BasicForm>
+ <template #verifyUserName="slotProps">
+ <InputSearch :enter-button="true" placeholder="璇烽�夋嫨" @search="handleUserModal()" v-bind="slotProps" />
+ </template>
+ </BasicForm>
+ <UserModal class="w-[1200px]" @select-user="updateUser" />
+ </BasicDrawer>
+</template>
diff --git a/eims-ui/apps/web-antd/src/views/eims/maint-plan/data.tsx b/eims-ui/apps/web-antd/src/views/eims/maint-plan/data.tsx
index aa5d7cf..dcf9cfa 100644
--- a/eims-ui/apps/web-antd/src/views/eims/maint-plan/data.tsx
+++ b/eims-ui/apps/web-antd/src/views/eims/maint-plan/data.tsx
@@ -256,7 +256,7 @@
getPopupContainer
},
fieldName: 'maintFirstTime',
- label: '棣栨鎵ц鏃堕棿'
+ label: '棣栨淇濆吇鏃堕棿'
},
{
component: 'DatePicker',
@@ -267,7 +267,7 @@
getPopupContainer
},
fieldName: 'maintLastTime',
- label: '涓婃鎵ц鏃堕棿'
+ label: '涓婃淇濆吇鏃堕棿'
},
{
component: 'DatePicker',
@@ -278,7 +278,7 @@
getPopupContainer
},
fieldName: 'maintNextTime',
- label: '涓嬫鎵ц鏃堕棿',
+ label: '涓嬫淇濆吇鏃堕棿',
},
{
component: 'Textarea',
diff --git a/eims-ui/apps/web-antd/src/views/eims/maint-plan/maint-plan-drawer.vue b/eims-ui/apps/web-antd/src/views/eims/maint-plan/maint-plan-drawer.vue
index 9f094eb..c4d5f4d 100644
--- a/eims-ui/apps/web-antd/src/views/eims/maint-plan/maint-plan-drawer.vue
+++ b/eims-ui/apps/web-antd/src/views/eims/maint-plan/maint-plan-drawer.vue
@@ -54,14 +54,14 @@
show: () => isUpdate.value,
triggerFields: ['']
},
- fieldName: 'maintLastTime'
+ fieldName: 'maintFirstTime'
},
{
dependencies: {
show: () => isUpdate.value,
triggerFields: ['']
},
- fieldName: 'maintNextTime'
+ fieldName: 'maintLastTime'
}
]);
// 鏇存柊 && 璧嬪��
@@ -126,7 +126,7 @@
* @param equ
*/
async function updateEqu(equ: any) {
- await formApi.setValues(equ);
+ await formApi.setValues({ 'equId': equ.equId, 'equName': equ.equName });
}
/**
diff --git a/eims-ui/packages/@core/base/shared/src/constants/dict-enum.ts b/eims-ui/packages/@core/base/shared/src/constants/dict-enum.ts
index 1e5e3a5..cc14eac 100644
--- a/eims-ui/packages/@core/base/shared/src/constants/dict-enum.ts
+++ b/eims-ui/packages/@core/base/shared/src/constants/dict-enum.ts
@@ -10,6 +10,7 @@
FIXTURE_BORROW_STATUS = 'fixture_borrow_status', // 宸ュ叿锛堟不鍏凤級鍊熺敤鐘舵��
MAINT_CYCLE_UNIT = 'maint_cycle_unit', // 淇濆吇鍛ㄦ湡鍗曚綅
MAINT_ORDER_STATUS = 'maint_order_status', // 淇濆吇宸ュ崟鐘舵��
+ MAINT_ORDER_ST_STATUS = 'maint_order_st_status', // 淇濆吇宸ュ崟姹囨�荤ń鏌ョ姸鎬�
MAINT_TIME_RULE = 'maint_time_rule', // 淇濆吇瑙勫垯
REPAIR_FAULT_TYPE = 'repair_fault_type', // 鎶ヤ慨鐘舵��
REPAIR_RECORD_HANDLE = 'repair_record_handle', // 缁翠慨璁板綍鎿嶄綔
diff --git a/eims/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/DictConstants.java b/eims/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/DictConstants.java
index bb8dca6..f4e85ac 100644
--- a/eims/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/DictConstants.java
+++ b/eims/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/DictConstants.java
@@ -127,7 +127,7 @@
String MAINT_ORDER_STATUS = "maint_order_status";
interface MAINT_ORDER_STATUS_DETAIL {
- String BAOYANG = "1";// 淇濆吇缁�
+ String BAOYANG = "1";// 淇濆吇
String DAIBAOYANG = "0"; // 寰呬繚鍏�
String DAIYANZHENG = "2"; // 寰呴獙璇�
String WANCHENG = "3"; // 瀹屾垚
@@ -141,4 +141,13 @@
String WEIWANCHENG = "0";// 鏈畬鎴�
String YIWANCHENG = "1"; // 宸插畬鎴�
}
+
+ /**
+ * 淇濆吇宸ュ崟姹囨�荤ń鏌ョ姸鎬�
+ */
+ String MAINT_ORDER_ST_STATUS = "maint_order_st_status";
+ interface MAINT_ORDER_ST_STATUS_DETAIL {
+ String N = "0";// 鏈畬鎴�
+ String Y = "1"; // 宸插畬鎴�
+ }
}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/controller/EimsMaintOrderController.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/controller/EimsMaintOrderController.java
index 5610c22..4eeba76 100644
--- a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/controller/EimsMaintOrderController.java
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/controller/EimsMaintOrderController.java
@@ -2,10 +2,14 @@
import java.util.List;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.dromara.common.core.utils.DateUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.eims.domain.vo.MaintOrdeGroupVo;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
@@ -46,6 +50,30 @@
return eimsMaintOrderService.queryPageListCustom(bo, pageQuery);
}
+
+ @SaCheckPermission("eims:maintOrder:list")
+ @GetMapping("/groupList")
+ public TableDataInfo<MaintOrdeGroupVo> group(EimsMaintOrderBo bo, PageQuery pageQuery) {
+// return eimsMaintOrderService.queryPageList(bo, pageQuery);
+ return eimsMaintOrderService.queryPageGroupList(bo, pageQuery);
+ }
+
+ @SaCheckPermission("eims:maintOrder:list")
+ @GetMapping("/detailList")
+ public TableDataInfo<EimsMaintOrderVo> groupDetail(EimsMaintOrderBo bo, PageQuery pageQuery) {
+ // 杩欓噷浣跨敤mintCode浼犻�掍簡 equid + plantime
+ String maintCode = bo.getMaintCode();
+ if (StringUtils.isEmpty(maintCode) || !maintCode.contains("_")) {
+ return TableDataInfo.build(new Page<>(0,0));
+ }
+ String[] split = maintCode.split("_");
+ bo.setEquId(Long.valueOf(split[0]));
+ bo.setPlanTime(DateUtils.parseDate(split[1]));
+ bo.setMaintCode(null);
+// return eimsMaintOrderService.queryPageList(bo, pageQuery);
+ return eimsMaintOrderService.queryPageListCustom(bo, pageQuery);
+ }
+
/**
* 瀵煎嚭淇濆吇宸ュ崟鍒楄〃
*/
@@ -65,7 +93,7 @@
@SaCheckPermission("eims:maintOrder:query")
@GetMapping("/{id}")
public R<EimsMaintOrderVo> getInfo(@NotNull(message = "涓婚敭涓嶈兘涓虹┖")
- @PathVariable Long id) {
+ @PathVariable Long id) {
return R.ok(eimsMaintOrderService.queryById(id));
}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/controller/EimsMaintOrderStController.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/controller/EimsMaintOrderStController.java
new file mode 100644
index 0000000..02e2735
--- /dev/null
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/controller/EimsMaintOrderStController.java
@@ -0,0 +1,106 @@
+package org.dromara.eims.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.eims.domain.vo.EimsMaintOrderStVo;
+import org.dromara.eims.domain.bo.EimsMaintOrderStBo;
+import org.dromara.eims.service.IEimsMaintOrderStService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 淇濆吇宸ュ崟姹囨��
+ *
+ * @author zhuguifei
+ * @date 2025-03-12
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/eims/maintOrderSt")
+public class EimsMaintOrderStController extends BaseController {
+
+ private final IEimsMaintOrderStService eimsMaintOrderStService;
+
+ /**
+ * 鏌ヨ淇濆吇宸ュ崟姹囨�诲垪琛�
+ */
+ @SaCheckPermission("eims:maintOrderSt:list")
+ @GetMapping("/list")
+ public TableDataInfo<EimsMaintOrderStVo> list(EimsMaintOrderStBo bo, PageQuery pageQuery) {
+ return eimsMaintOrderStService.queryPageList(bo, pageQuery);
+ }
+
+ /**
+ * 瀵煎嚭淇濆吇宸ュ崟姹囨�诲垪琛�
+ */
+ @SaCheckPermission("eims:maintOrderSt:export")
+ @Log(title = "淇濆吇宸ュ崟姹囨��", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(EimsMaintOrderStBo bo, HttpServletResponse response) {
+ List<EimsMaintOrderStVo> list = eimsMaintOrderStService.queryList(bo);
+ ExcelUtil.exportExcel(list, "淇濆吇宸ュ崟姹囨��", EimsMaintOrderStVo.class, response);
+ }
+
+ /**
+ * 鑾峰彇淇濆吇宸ュ崟姹囨�昏缁嗕俊鎭�
+ *
+ * @param id 涓婚敭
+ */
+ @SaCheckPermission("eims:maintOrderSt:query")
+ @GetMapping("/{id}")
+ public R<EimsMaintOrderStVo> getInfo(@NotNull(message = "涓婚敭涓嶈兘涓虹┖")
+ @PathVariable Long id) {
+ return R.ok(eimsMaintOrderStService.queryById(id));
+ }
+
+ /**
+ * 鏂板淇濆吇宸ュ崟姹囨��
+ */
+ @SaCheckPermission("eims:maintOrderSt:add")
+ @Log(title = "淇濆吇宸ュ崟姹囨��", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping()
+ public R<Void> add(@Validated(AddGroup.class) @RequestBody EimsMaintOrderStBo bo) {
+ return toAjax(eimsMaintOrderStService.insertByBo(bo));
+ }
+
+ /**
+ * 淇敼淇濆吇宸ュ崟姹囨��
+ */
+ @SaCheckPermission("eims:maintOrderSt:edit")
+ @Log(title = "淇濆吇宸ュ崟姹囨��", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PutMapping()
+ public R<Void> edit(@Validated(EditGroup.class) @RequestBody EimsMaintOrderStBo bo) {
+ return toAjax(eimsMaintOrderStService.updateByBo(bo));
+ }
+
+ /**
+ * 鍒犻櫎淇濆吇宸ュ崟姹囨��
+ *
+ * @param ids 涓婚敭涓�
+ */
+ @SaCheckPermission("eims:maintOrderSt:remove")
+ @Log(title = "淇濆吇宸ュ崟姹囨��", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public R<Void> remove(@NotEmpty(message = "涓婚敭涓嶈兘涓虹┖")
+ @PathVariable Long[] ids) {
+
+ return eimsMaintOrderStService.deleteWithValidByIds(List.of(ids), true);
+ }
+}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/EimsMaintOrderSt.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/EimsMaintOrderSt.java
new file mode 100644
index 0000000..051fadd
--- /dev/null
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/EimsMaintOrderSt.java
@@ -0,0 +1,74 @@
+package org.dromara.eims.domain;
+
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.io.Serial;
+
+/**
+ * 淇濆吇宸ュ崟姹囨�诲璞� eims_maint_order_st
+ *
+ * @author zhuguifei
+ * @date 2025-03-12
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("eims_maint_order_st")
+public class EimsMaintOrderSt extends BaseEntity {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ *
+ */
+ @TableId(value = "id")
+ private Long id;
+
+ /**
+ *
+ */
+ private String title;
+
+ /**
+ *
+ */
+ private String equId;
+
+ /**
+ *
+ */
+ @JsonFormat(pattern = "yyyy-MM-dd")
+ private Date planTime;
+
+ @JsonFormat(pattern = "yyyy-MM-dd")
+ private Date verifyTime;
+
+ private String status;
+
+ /**
+ * 淇濆吇浜�
+ */
+ private Long maintUser;
+
+ /**
+ * 楠岃瘉浜�
+ */
+ private Long verifyUser;
+
+ /**
+ * 鐗硅浜嬮」
+ */
+ private String specialNote;
+
+ /**
+ * 澶囨敞
+ */
+ private String remark;
+
+
+}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/EimsMaintPlan.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/EimsMaintPlan.java
index d89d93e..d8c55b6 100644
--- a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/EimsMaintPlan.java
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/EimsMaintPlan.java
@@ -1,8 +1,5 @@
package org.dromara.eims.domain;
-import jakarta.validation.constraints.NotNull;
-import org.dromara.common.core.validate.AddGroup;
-import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
@@ -115,7 +112,7 @@
* 涓婃鐢熸垚宸ュ崟鏃堕棿
*/
@JsonFormat(pattern = "yyyy-MM-dd")
- private Date lastGenerateDate;
+ private Date lastOrderDate;
}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsMaintOrderStBo.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsMaintOrderStBo.java
new file mode 100644
index 0000000..132d076
--- /dev/null
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsMaintOrderStBo.java
@@ -0,0 +1,77 @@
+package org.dromara.eims.domain.bo;
+
+import org.dromara.eims.domain.EimsMaintOrderSt;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+/**
+ * 淇濆吇宸ュ崟姹囨�讳笟鍔″璞� eims_maint_order_st
+ *
+ * @author zhuguifei
+ * @date 2025-03-12
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = EimsMaintOrderSt.class, reverseConvertGenerate = false)
+public class EimsMaintOrderStBo extends BaseEntity {
+
+ /**
+ *
+ */
+ @NotNull(message = "涓嶈兘涓虹┖", groups = { EditGroup.class })
+ private Long id;
+
+ /**
+ *
+ */
+ @NotBlank(message = "涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+ private String title;
+
+ /**
+ *
+ */
+ @NotBlank(message = "涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+ private String equId;
+
+ /**
+ *
+ */
+ @NotNull(message = "涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+ @JsonFormat(pattern = "yyyy-MM-dd")
+ private Date planTime;
+
+ @JsonFormat(pattern = "yyyy-MM-dd")
+ private Date verifyTime;
+
+ /**
+ * 淇濆吇浜�
+ */
+ private Long maintUser;
+
+
+ private String status;
+
+ /**
+ * 楠岃瘉浜�
+ */
+ private Long verifyUser;
+
+ /**
+ * 鐗硅浜嬮」
+ */
+ private String specialNote;
+
+ /**
+ * 澶囨敞
+ */
+ private String remark;
+
+
+}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsMaintPlanBo.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsMaintPlanBo.java
index f59e6cf..cf189bb 100644
--- a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsMaintPlanBo.java
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsMaintPlanBo.java
@@ -97,19 +97,21 @@
/**
* 棣栨鎵ц鏃堕棿
*/
- @NotNull(message = "淇濆吇璁″垝棣栨鎵ц鏃堕棿涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+
@JsonFormat(pattern = "yyyy-MM-dd")
private Date maintFirstTime;
/**
* 涓婃鎵ц鏃堕棿
*/
+
@JsonFormat(pattern = "yyyy-MM-dd")
private Date maintLastTime;
/**
* 涓嬫鎵ц鏃堕棿
*/
+ @NotNull(message = "涓嬫淇濆吇鏃堕棿涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
@JsonFormat(pattern = "yyyy-MM-dd")
private Date maintNextTime;
@@ -122,7 +124,7 @@
* 涓婃鐢熸垚宸ュ崟鏃堕棿
*/
@JsonFormat(pattern = "yyyy-MM-dd")
- private Date lastGenerateDate;
+ private Date lastOrderDate;
// 鍏宠仈琛ㄥ瓧娈�
private String equName;
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsMaintOrderStVo.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsMaintOrderStVo.java
new file mode 100644
index 0000000..69e1a4c
--- /dev/null
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsMaintOrderStVo.java
@@ -0,0 +1,109 @@
+package org.dromara.eims.domain.vo;
+
+import java.util.Date;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.dromara.common.translation.annotation.Translation;
+import org.dromara.common.translation.constant.TransConstant;
+import org.dromara.eims.domain.EimsMaintOrderSt;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * 淇濆吇宸ュ崟姹囨�昏鍥惧璞� eims_maint_order_st
+ *
+ * @author zhuguifei
+ * @date 2025-03-12
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = EimsMaintOrderSt.class)
+public class EimsMaintOrderStVo implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ *
+ */
+ @ExcelProperty(value = "")
+ private Long id;
+
+ /**
+ *
+ */
+ @ExcelProperty(value = "")
+ private String title;
+
+ /**
+ *
+ */
+ @ExcelProperty(value = "")
+ private Long equId;
+ /**
+ * 璁惧鍚嶇О
+ */
+ @Translation(type = TransConstant.EQU_ID_TO_NAME, mapper = "equId")
+ private String equName;
+ private String assetNo;
+ /**
+ *
+ */
+ @ExcelProperty(value = "")
+ @JsonFormat(pattern = "yyyy-MM-dd")
+ private Date planTime;
+ /**
+ *绋芥煡鏃ユ湡
+ */
+ @JsonFormat(pattern = "yyyy-MM-dd")
+ private Date verifyTime;
+
+
+ private String status;
+
+ /**
+ * 淇濆吇浜�
+ */
+ @ExcelProperty(value = "淇濆吇浜�")
+ private Long maintUser;
+
+ /**
+ * 楠岃瘉浜�
+ */
+ @ExcelProperty(value = "楠岃瘉浜�")
+ private Long verifyUser;
+ @Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "verifyUser")
+ private String verifyUserName;
+
+ /**
+ * 鐗硅浜嬮」
+ */
+ @ExcelProperty(value = "鐗硅浜嬮」")
+ private String specialNote;
+
+ /**
+ * 澶囨敞
+ */
+ @ExcelProperty(value = "澶囨敞")
+ private String remark;
+
+
+ private Integer orderCount;
+ private Integer dbyCount;
+ private Integer byCount;
+ private Integer dyzCount;
+ private Integer wcCount;
+ private String maintUserNames;
+ private String verifyUserNames;
+
+
+}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsMaintPlanVo.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsMaintPlanVo.java
index c268369..3df1153 100644
--- a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsMaintPlanVo.java
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsMaintPlanVo.java
@@ -2,9 +2,6 @@
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
-import jakarta.validation.constraints.NotNull;
-import org.dromara.common.core.validate.AddGroup;
-import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.translation.annotation.Translation;
import org.dromara.common.translation.constant.TransConstant;
import org.dromara.eims.domain.EimsMaintPlan;
@@ -17,8 +14,6 @@
import java.io.Serial;
import java.io.Serializable;
-import java.util.Date;
-
/**
@@ -160,7 +155,7 @@
* 涓婃鐢熸垚宸ュ崟鏃堕棿
*/
@JsonFormat(pattern = "yyyy-MM-dd")
- private Date lastGenerateDate;
+ private Date lastOrderDate;
}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/MaintOrdeGroupVo.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/MaintOrdeGroupVo.java
new file mode 100644
index 0000000..ad87dab
--- /dev/null
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/MaintOrdeGroupVo.java
@@ -0,0 +1,70 @@
+package org.dromara.eims.domain.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.translation.annotation.Translation;
+import org.dromara.common.translation.constant.TransConstant;
+import org.dromara.eims.domain.EimsMaintOrder;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * 淇濆吇宸ュ崟鍒嗙粍鏌ヨ
+ *
+ * @author zhuguifei
+ * @date 2025-03-011
+ */
+@Data
+@ExcelIgnoreUnannotated
+public class MaintOrdeGroupVo extends BaseEntity implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ *
+ */
+ @ExcelProperty(value = "")
+ private Long id;
+
+ /**
+ *
+ */
+ @ExcelProperty(value = "")
+ private Long equId;
+
+ private String equName;
+
+ /**
+ * 璁惧璧勪骇缂栧彿
+ */
+ private String assetNo;
+
+ private Integer orderCount;
+ private Integer dbyCount;
+ private Integer byCount;
+ private Integer dyzCount;
+ private Integer wcCount;
+ private String maintUserNames;
+ private String verifyUserNames;
+
+
+ /**
+ * 淇濆吇璁″垝鏃堕棿
+ */
+ @JsonFormat(pattern = "yyyy-MM-dd")
+ private Date planTime;
+
+
+
+
+}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/job/MaintPlanToOrderJob.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/job/MaintPlanToOrderJob.java
index 4b388cb..cb01ba0 100644
--- a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/job/MaintPlanToOrderJob.java
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/job/MaintPlanToOrderJob.java
@@ -3,10 +3,7 @@
import com.aizuda.snailjob.client.job.core.annotation.JobExecutor;
import com.aizuda.snailjob.client.job.core.dto.JobArgs;
import com.aizuda.snailjob.client.model.ExecuteResult;
-import com.aizuda.snailjob.common.core.util.JsonUtil;
-import com.aizuda.snailjob.common.log.SnailJobLog;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
@@ -14,15 +11,11 @@
import org.dromara.common.core.utils.DateUtils;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.eims.domain.*;
-import org.dromara.eims.domain.bo.EimsMaintPlanBo;
import org.dromara.eims.domain.vo.EimsMaintPlanVo;
import org.dromara.eims.mapper.EimsMaintOrderMapper;
import org.dromara.eims.mapper.EimsMaintPlanMapper;
-import org.dromara.eims.service.IEimsMaintOrderService;
-import org.dromara.eims.service.IEimsMaintPlanService;
import org.dromara.eims.service.IGenerateCodeService;
import org.springframework.beans.BeanUtils;
-import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
@@ -34,7 +27,6 @@
@JobExecutor(name = "maintPlanToOrderJob")
public class MaintPlanToOrderJob {
private final EimsMaintOrderMapper orderMapper;
-
private final EimsMaintPlanMapper planMapper;
@@ -51,8 +43,6 @@
LambdaQueryWrapper<EimsMaintPlan> planBoQueryWrapper = Wrappers.lambdaQuery();
// 鏌ヨ鍚敤鐨勪繚鍏昏鍒�
planBoQueryWrapper.eq(EimsMaintPlan::getStatus, DictConstants.SYS_NORMAL_DISABLE_DETAIL.NORMAL);
- // 杩囨护娌℃湁棣栨杩愯鏃堕棿
- planBoQueryWrapper.isNotNull(EimsMaintPlan::getMaintFirstTime);
// 杩囨护娌℃湁涓嬫杩愯鏃堕棿
planBoQueryWrapper.isNotNull(EimsMaintPlan::getMaintNextTime);
// 杩囨护娌℃湁淇濆吇鍛ㄦ湡鐨勬暟鎹�
@@ -64,8 +54,8 @@
for (int i = 0; i < planVoList.size(); i++) {
EimsMaintPlanVo planVo = planVoList.get(i);
// 淇濆吇璁″垝add鐨勬椂鍊欎細鑷姩鐢熸垚涓嬫杩愯鏃堕棿
- Date createOrderTime = planVo.getMaintNextTime();
- int day = DateUtils.differentDays(today,createOrderTime );
+ Date oldNext = planVo.getMaintNextTime();
+ int day = DateUtils.differentDays(today, oldNext);
// 濡傛灉璁″垝鐢熸垚宸ュ崟鏃ユ湡澶т簬浠婂ぉ鍒欎笉鐢熸垚宸ュ崟
if (day >= 1) {
continue;
@@ -76,48 +66,50 @@
String maintRule = planVo.getMaintRule();
Date firstTime = planVo.getMaintFirstTime();
Date lastTime = planVo.getMaintLastTime();
- Date nextTime = null;
+ Date newNext = null;
String maintCycleUnit = planVo.getMaintCycleUnit();
switch (maintCycleUnit) {
case DictConstants.MAINT_CYCLE_UNIT_DETAIL.DAY:
+ newNext = DateUtils.addDays(oldNext, maintCycle.intValue());
break;
case DictConstants.MAINT_CYCLE_UNIT_DETAIL.WEEK:
- maintCycle *= 7;
+
+ newNext = DateUtils.addWeeks(oldNext, maintCycle.intValue());
+
break;
case DictConstants.MAINT_CYCLE_UNIT_DETAIL.MONTH:
- maintCycle *= 30;
+
+ newNext = DateUtils.addMonths(oldNext, maintCycle.intValue());
+
break;
case DictConstants.MAINT_CYCLE_UNIT_DETAIL.SEASON:
- maintCycle *= 90;
+ newNext = DateUtils.addMonths(oldNext, maintCycle.intValue() * 3);
+
break;
case DictConstants.MAINT_CYCLE_UNIT_DETAIL.YEAR:
- maintCycle *= 365;
+
+ newNext = DateUtils.addYears(oldNext, maintCycle.intValue());
+
break;
}
- // 棣栨
- if (lastTime == null ) {
- nextTime = DateUtils.addDays(createOrderTime, maintCycle.intValue());
- } else {
- nextTime = DateUtils.addDays(lastTime, maintCycle.intValue());
- }
+
EimsMaintOrder order = new EimsMaintOrder();
BeanUtils.copyProperties(planVo, order);
order.setId(null);
order.setStatus(DictConstants.MAINT_ORDER_STATUS_DETAIL.DAIBAOYANG);
- order.setPlanTime(createOrderTime);
+ order.setPlanTime(oldNext);
order.setPlanId(planVo.getId());
order.setMaintCode(codeService.generateCode("BYZD"));
EimsMaintPlan plan = MapstructUtils.convert(planVo, EimsMaintPlan.class);
assert plan != null;
- plan.setLastGenerateDate(new Date());
- plan.setMaintLastTime(createOrderTime);
- plan.setMaintNextTime(nextTime);
- boolean flag = orderMapper.insert(order) > 0;
+ plan.setLastOrderDate(new Date());
+ plan.setMaintLastTime(oldNext);
+ plan.setMaintNextTime(newNext);
+ if(plan.getMaintFirstTime()==null)plan.setMaintFirstTime(oldNext);
+ boolean flag = orderMapper.insert(order) > 0;
//TODO 鐢熸垚澶辫触锛屾坊鍔犲紓甯歌褰�
if (!flag) continue;
planMapper.updateById(plan);
-
-
}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/mapper/EimsMaintOrderMapper.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/mapper/EimsMaintOrderMapper.java
index caa3aab..2473d57 100644
--- a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/mapper/EimsMaintOrderMapper.java
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/mapper/EimsMaintOrderMapper.java
@@ -9,6 +9,7 @@
import org.dromara.eims.domain.vo.EimsMaintOrderVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.eims.domain.vo.EimsMaintPlanVo;
+import org.dromara.eims.domain.vo.MaintOrdeGroupVo;
/**
* 淇濆吇宸ュ崟Mapper鎺ュ彛
@@ -18,5 +19,6 @@
*/
public interface EimsMaintOrderMapper extends BaseMapperPlus<EimsMaintOrder, EimsMaintOrderVo> {
Page<EimsMaintOrderVo> selectMaintOrderList(@Param("page") Page<EimsMaintOrderVo> page, @Param(Constants.WRAPPER) Wrapper<EimsMaintOrder> queryWrapper);
+ Page<MaintOrdeGroupVo> selectMaintOrderGroupList(@Param("page") Page<EimsMaintOrderVo> page, @Param(Constants.WRAPPER) Wrapper<EimsMaintOrder> queryWrapper);
}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/mapper/EimsMaintOrderStMapper.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/mapper/EimsMaintOrderStMapper.java
new file mode 100644
index 0000000..0ea0b0f
--- /dev/null
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/mapper/EimsMaintOrderStMapper.java
@@ -0,0 +1,15 @@
+package org.dromara.eims.mapper;
+
+import org.dromara.eims.domain.EimsMaintOrderSt;
+import org.dromara.eims.domain.vo.EimsMaintOrderStVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 淇濆吇宸ュ崟姹囨�籑apper鎺ュ彛
+ *
+ * @author zhuguifei
+ * @date 2025-03-12
+ */
+public interface EimsMaintOrderStMapper extends BaseMapperPlus<EimsMaintOrderSt, EimsMaintOrderStVo> {
+
+}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/IEimsMaintOrderService.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/IEimsMaintOrderService.java
index 8894366..0496614 100644
--- a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/IEimsMaintOrderService.java
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/IEimsMaintOrderService.java
@@ -4,6 +4,7 @@
import org.dromara.eims.domain.bo.EimsMaintOrderBo;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.eims.domain.vo.MaintOrdeGroupVo;
import java.util.Collection;
import java.util.List;
@@ -74,4 +75,12 @@
* @return 淇濆吇宸ュ崟鍒嗛〉鍒楄〃
*/
TableDataInfo<EimsMaintOrderVo> queryPageListCustom(EimsMaintOrderBo bo, PageQuery pageQuery);
+
+ /**
+ * 鏁版嵁鏍规嵁 璁惧+鏃ユ湡 鍒嗙粍
+ * @param bo
+ * @param pageQuery
+ * @return
+ */
+ TableDataInfo<MaintOrdeGroupVo> queryPageGroupList(EimsMaintOrderBo bo, PageQuery pageQuery);
}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/IEimsMaintOrderStService.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/IEimsMaintOrderStService.java
new file mode 100644
index 0000000..f0bd81f
--- /dev/null
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/IEimsMaintOrderStService.java
@@ -0,0 +1,69 @@
+package org.dromara.eims.service;
+
+import org.dromara.common.core.domain.R;
+import org.dromara.eims.domain.vo.EimsMaintOrderStVo;
+import org.dromara.eims.domain.bo.EimsMaintOrderStBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 淇濆吇宸ュ崟姹囨�籗ervice鎺ュ彛
+ *
+ * @author zhuguifei
+ * @date 2025-03-12
+ */
+public interface IEimsMaintOrderStService {
+
+ /**
+ * 鏌ヨ淇濆吇宸ュ崟姹囨��
+ *
+ * @param id 涓婚敭
+ * @return 淇濆吇宸ュ崟姹囨��
+ */
+ EimsMaintOrderStVo queryById(Long id);
+
+ /**
+ * 鍒嗛〉鏌ヨ淇濆吇宸ュ崟姹囨�诲垪琛�
+ *
+ * @param bo 鏌ヨ鏉′欢
+ * @param pageQuery 鍒嗛〉鍙傛暟
+ * @return 淇濆吇宸ュ崟姹囨�诲垎椤靛垪琛�
+ */
+ TableDataInfo<EimsMaintOrderStVo> queryPageList(EimsMaintOrderStBo bo, PageQuery pageQuery);
+
+ /**
+ * 鏌ヨ绗﹀悎鏉′欢鐨勪繚鍏诲伐鍗曟眹鎬诲垪琛�
+ *
+ * @param bo 鏌ヨ鏉′欢
+ * @return 淇濆吇宸ュ崟姹囨�诲垪琛�
+ */
+ List<EimsMaintOrderStVo> queryList(EimsMaintOrderStBo bo);
+
+ /**
+ * 鏂板淇濆吇宸ュ崟姹囨��
+ *
+ * @param bo 淇濆吇宸ュ崟姹囨��
+ * @return 鏄惁鏂板鎴愬姛
+ */
+ Boolean insertByBo(EimsMaintOrderStBo bo);
+
+ /**
+ * 淇敼淇濆吇宸ュ崟姹囨��
+ *
+ * @param bo 淇濆吇宸ュ崟姹囨��
+ * @return 鏄惁淇敼鎴愬姛
+ */
+ Boolean updateByBo(EimsMaintOrderStBo bo);
+
+ /**
+ * 鏍¢獙骞舵壒閲忓垹闄や繚鍏诲伐鍗曟眹鎬讳俊鎭�
+ *
+ * @param ids 寰呭垹闄ょ殑涓婚敭闆嗗悎
+ * @param isValid 鏄惁杩涜鏈夋晥鎬ф牎楠�
+ * @return 鏄惁鍒犻櫎鎴愬姛
+ */
+ R<Void> deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsMaintOrderServiceImpl.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsMaintOrderServiceImpl.java
index 472878a..529c96b 100644
--- a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsMaintOrderServiceImpl.java
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsMaintOrderServiceImpl.java
@@ -5,7 +5,9 @@
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.SneakyThrows;
import org.dromara.common.core.constant.DictConstants;
+import org.dromara.common.core.domain.model.LoginUser;
import org.dromara.common.core.service.MaintOrderService;
+import org.dromara.common.core.utils.DateUtils;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.SpringUtils;
import org.dromara.common.core.utils.StringUtils;
@@ -16,6 +18,11 @@
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
+import org.dromara.common.satoken.utils.LoginHelper;
+import org.dromara.eims.domain.EimsMaintPlan;
+import org.dromara.eims.domain.bo.EimsMaintPlanBo;
+import org.dromara.eims.domain.vo.MaintOrdeGroupVo;
+import org.dromara.eims.mapper.EimsMaintPlanMapper;
import org.dromara.system.domain.SysDept;
import org.dromara.system.domain.vo.SysDeptVo;
import org.dromara.system.mapper.SysDeptMapper;
@@ -27,10 +34,7 @@
import org.dromara.eims.service.IEimsMaintOrderService;
import org.springframework.transaction.annotation.Transactional;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Collection;
+import java.util.*;
/**
* 淇濆吇宸ュ崟Service涓氬姟灞傚鐞�
@@ -43,6 +47,7 @@
public class EimsMaintOrderServiceImpl implements IEimsMaintOrderService, MaintOrderService {
private final EimsMaintOrderMapper baseMapper;
+ private final EimsMaintPlanMapper planMapper;
private final SysDeptMapper sysDeptMapper;
/**
@@ -76,6 +81,12 @@
return TableDataInfo.build(page);
}
+ @Override
+ public TableDataInfo<MaintOrdeGroupVo> queryPageGroupList(EimsMaintOrderBo bo, PageQuery pageQuery) {
+ Page<MaintOrdeGroupVo> page = baseMapper.selectMaintOrderGroupList(pageQuery.build(), buildGroupWrapper(bo));
+ return TableDataInfo.build(page);
+ }
+
/**
* 鏌ヨ绗﹀悎鏉′欢鐨勪繚鍏诲伐鍗曞垪琛�
*
@@ -92,13 +103,33 @@
QueryWrapper<EimsMaintOrder> qw = Wrappers.query();
qw.like(StringUtils.isNotBlank(bo.getMaintCode()),"mo.maint_code", bo.getMaintCode());
qw.like(bo.getEquName() != null, "equ.equ_name", bo.getEquName());
+ qw.like(bo.getEquId() != null, "equ.equ_id", bo.getEquId());
qw.eq(StringUtils.isNotBlank(bo.getMaintType()), "mo.maint_type", bo.getMaintType());
qw.eq(StringUtils.isNotBlank(bo.getMaintCycleUnit()), "mo.maint_cycle_unit", bo.getMaintCycleUnit());
qw.eq(StringUtils.isNotBlank(bo.getMaintRule()), "mo.maint_rule", bo.getMaintRule());
qw.eq(bo.getMaintUser() != null, "mo.maint_user", bo.getMaintUser());
qw.in(bo.getMaintDept() != null, "mo.maint_dept", getAllDescendantIds(bo.getMaintDept()));
qw.eq(bo.getStatus() != null, "mo.status", bo.getStatus());
+ qw.eq(bo.getPlanTime()!=null,
+ "mo.plan_time", bo.getPlanTime());
qw.orderByDesc("mo.create_time");
+ return qw;
+ }
+ private QueryWrapper<EimsMaintOrder> buildGroupWrapper(EimsMaintOrderBo bo) {
+ Map<String, Object> params = bo.getParams();
+ QueryWrapper<EimsMaintOrder> qw = Wrappers.query();
+ qw.like(StringUtils.isNotBlank(bo.getMaintCode()),"mo.maint_code", bo.getMaintCode());
+ qw.like(bo.getEquName() != null, "equ.equ_name", bo.getEquName());
+ qw.eq(StringUtils.isNotBlank(bo.getMaintType()), "mo.maint_type", bo.getMaintType());
+ qw.eq(StringUtils.isNotBlank(bo.getMaintCycleUnit()), "mo.maint_cycle_unit", bo.getMaintCycleUnit());
+ qw.eq(StringUtils.isNotBlank(bo.getMaintRule()), "mo.maint_rule", bo.getMaintRule());
+ qw.eq(bo.getMaintUser() != null, "mo.maint_user", bo.getMaintUser());
+ qw.in(bo.getMaintDept() != null, "mo.maint_dept", getAllDescendantIds(bo.getMaintDept()));
+ qw.eq(bo.getStatus() != null, "mo.status", bo.getStatus());
+ qw.between(params.get("beginPlanTime") != null && params.get("endPlanTime") != null,
+ "mo.plan_time", params.get("beginPlanTime"), params.get("endPlanTime"));
+ qw.groupBy(Arrays.asList("mo.equ_id","mo.plan_time"));
+ qw.orderByDesc("mo.plan_time");
return qw;
}
@@ -152,9 +183,20 @@
* @param bo 淇濆吇宸ュ崟
* @return 鏄惁鏂板鎴愬姛
*/
+ @Transactional(rollbackFor = Exception.class)
@Override
public Boolean insertByBo(EimsMaintOrderBo bo) {
EimsMaintOrder add = MapstructUtils.convert(bo, EimsMaintOrder.class);
+ //閫氳繃淇濆吇璁″垝鐢熸垚鐨勬暟鎹渶瑕佹洿鏂颁繚鍏昏鍒�
+ Long planId = bo.getPlanId();
+ if(planId!=null){
+ EimsMaintPlan eimsMaintPlan = planMapper.selectById(planId);
+ setMaintNextTime(eimsMaintPlan);
+ planMapper.updateById(eimsMaintPlan);
+ }
+
+
+
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
@@ -162,6 +204,50 @@
}
return flag;
+ }
+
+ /**
+ * 璁$畻淇濆吇璁″垝涓嬫鎵ц鏃堕棿
+ */
+ @SneakyThrows
+ private void setMaintNextTime(EimsMaintPlan bo) {
+ Date oldNext = bo.getMaintNextTime();
+ //TODO 涓嬫淇濆吇鏃堕棿璁$畻瑙勫垯 0-鎸夊浐瀹氬懆鏈� 1-鎸変笂娆′繚鍏绘椂闂�
+ Date newNext = null;
+
+ //涓嬫娆℃墽琛屾椂闂翠负绌烘姏鍑哄紓甯�
+ if (oldNext == null) {
+ throw new Exception("涓嬫淇濆吇鏃堕棿涓嶈兘涓虹┖!");
+ }
+ //鍛ㄦ湡
+ Long maintCycle = bo.getMaintCycle();
+ //鍗曚綅 1-澶� 2-鍛� 3-鏈� 4-瀛� 5-骞�
+ String maintCycleUnit = bo.getMaintCycleUnit();
+ switch (maintCycleUnit) {
+ case "1":
+ newNext = DateUtils.addDays(oldNext, maintCycle.intValue());
+ break;
+ case "2":
+ newNext = DateUtils.addWeeks(oldNext, maintCycle.intValue());
+ break;
+ case "3":
+ newNext = DateUtils.addMonths(oldNext, maintCycle.intValue());
+ break;
+ case "4":
+ newNext = DateUtils.addMonths(oldNext, maintCycle.intValue() * 3);
+ break;
+ case "5":
+ newNext = DateUtils.addYears(oldNext, maintCycle.intValue());
+ break;
+
+ }
+ bo.setMaintNextTime(newNext);
+ if(bo.getMaintFirstTime()==null){
+ bo.setMaintFirstTime(oldNext);
+ }
+ bo.setMaintLastTime(oldNext);
+
+
}
/**
@@ -175,8 +261,19 @@
@Override
public Boolean updateByBo(EimsMaintOrderBo bo) {
EimsMaintOrder update = MapstructUtils.convert(bo, EimsMaintOrder.class);
+ if(bo.getStatus().equals(DictConstants.MAINT_ORDER_STATUS_DETAIL.BAOYANG) && bo.getStartTime() == null){
+ update.setStartTime(new Date());
+ }
- EimsMaintOrder old = baseMapper.selectById(bo.getId());
+ if(bo.getStatus().equals(DictConstants.MAINT_ORDER_STATUS_DETAIL.DAIYANZHENG) && bo.getEndTime() == null){
+ update.setEndTime(new Date());
+ }
+
+ if(bo.getStatus().equals(DictConstants.MAINT_ORDER_STATUS_DETAIL.WANCHENG) && bo.getVerifyUser() == null){
+ LoginUser loginUser = LoginHelper.getLoginUser();
+ update.setVerifyUser(loginUser.getUserId());
+ }
+
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsMaintOrderStServiceImpl.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsMaintOrderStServiceImpl.java
new file mode 100644
index 0000000..ea64041
--- /dev/null
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsMaintOrderStServiceImpl.java
@@ -0,0 +1,220 @@
+package org.dromara.eims.service.impl;
+
+import lombok.SneakyThrows;
+import org.dromara.common.core.constant.DictConstants;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.domain.model.LoginUser;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.satoken.utils.LoginHelper;
+import org.dromara.eims.domain.EimsEqu;
+import org.dromara.eims.domain.EimsMaintOrder;
+import org.dromara.eims.domain.vo.EimsMaintOrderVo;
+import org.dromara.eims.mapper.EimsEquMapper;
+import org.dromara.eims.mapper.EimsMaintOrderMapper;
+import org.springframework.stereotype.Service;
+import org.dromara.eims.domain.bo.EimsMaintOrderStBo;
+import org.dromara.eims.domain.vo.EimsMaintOrderStVo;
+import org.dromara.eims.domain.EimsMaintOrderSt;
+import org.dromara.eims.mapper.EimsMaintOrderStMapper;
+import org.dromara.eims.service.IEimsMaintOrderStService;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.time.temporal.TemporalAdjusters;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.stream.Collectors;
+
+/**
+ * 淇濆吇宸ュ崟姹囨�籗ervice涓氬姟灞傚鐞�
+ *
+ * @author zhuguifei
+ * @date 2025-03-12
+ */
+@RequiredArgsConstructor
+@Service
+public class EimsMaintOrderStServiceImpl implements IEimsMaintOrderStService {
+
+ private final EimsMaintOrderStMapper baseMapper;
+ private final EimsEquMapper equMapper;
+ private final EimsMaintOrderMapper orderMapper;
+
+ /**
+ * 鏌ヨ淇濆吇宸ュ崟姹囨��
+ *
+ * @param id 涓婚敭
+ * @return 淇濆吇宸ュ崟姹囨��
+ */
+ @Override
+ public EimsMaintOrderStVo queryById(Long id) {
+ return baseMapper.selectVoById(id);
+ }
+
+ /**
+ * 鍒嗛〉鏌ヨ淇濆吇宸ュ崟姹囨�诲垪琛�
+ *
+ * @param bo 鏌ヨ鏉′欢
+ * @param pageQuery 鍒嗛〉鍙傛暟
+ * @return 淇濆吇宸ュ崟姹囨�诲垎椤靛垪琛�
+ */
+ @Override
+ public TableDataInfo<EimsMaintOrderStVo> queryPageList(EimsMaintOrderStBo bo, PageQuery pageQuery) {
+ LambdaQueryWrapper<EimsMaintOrderSt> lqw = buildQueryWrapper(bo);
+ Page<EimsMaintOrderStVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+ // 濉厖鏁版嵁
+ fillStData(result);
+ return TableDataInfo.build(result);
+ }
+
+ private void fillStData(Page<EimsMaintOrderStVo> result) {
+ List<EimsMaintOrderStVo> records = result.getRecords();
+ for (int i = 0; i < records.size(); i++) {
+ EimsMaintOrderStVo stVo = records.get(i);
+ //1.濉厖璁惧
+ EimsEqu eimsEqu = equMapper.selectById(stVo.getEquId());
+ stVo.setAssetNo(eimsEqu.getAssetNo());
+ //2.缁熻鏁版嵁
+ LambdaQueryWrapper<EimsMaintOrder> orderLqw = Wrappers.lambdaQuery();
+ orderLqw.eq(EimsMaintOrder::getEquId, stVo.getEquId());
+ LocalDate planTime = stVo.getPlanTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
+ ;
+ LocalDate startOfMonth = planTime.with(TemporalAdjusters.firstDayOfMonth());
+ LocalDate endOfMonth = planTime.with(TemporalAdjusters.lastDayOfMonth());
+ orderLqw.between(EimsMaintOrder::getPlanTime, startOfMonth, endOfMonth);
+ // 鎵ц鏌ヨ
+ List<EimsMaintOrderVo> orderList = orderMapper.selectVoList(orderLqw);
+ // TODO 鏍规嵁瀛楀吀maint_order_status
+ Map<String, Long> cMap = orderList.stream()
+ .filter(order -> List.of("0", "1", "2", "3").contains(order.getStatus()))
+ .collect(Collectors.groupingBy(EimsMaintOrderVo::getStatus, Collectors.counting()));
+ stVo.setOrderCount(orderList.size());
+ stVo.setDbyCount(cMap.getOrDefault("0", 0L).intValue());
+ stVo.setByCount(cMap.getOrDefault("1", 0L).intValue());
+ stVo.setDyzCount(cMap.getOrDefault("2", 0L).intValue());
+ stVo.setWcCount(cMap.getOrDefault("3", 0L).intValue());
+
+ }
+
+ }
+
+ /**
+ * 鏌ヨ绗﹀悎鏉′欢鐨勪繚鍏诲伐鍗曟眹鎬诲垪琛�
+ *
+ * @param bo 鏌ヨ鏉′欢
+ * @return 淇濆吇宸ュ崟姹囨�诲垪琛�
+ */
+ @Override
+ public List<EimsMaintOrderStVo> queryList(EimsMaintOrderStBo bo) {
+ LambdaQueryWrapper<EimsMaintOrderSt> lqw = buildQueryWrapper(bo);
+ return baseMapper.selectVoList(lqw);
+ }
+
+ private LambdaQueryWrapper<EimsMaintOrderSt> buildQueryWrapper(EimsMaintOrderStBo bo) {
+ Map<String, Object> params = bo.getParams();
+ LambdaQueryWrapper<EimsMaintOrderSt> lqw = Wrappers.lambdaQuery();
+ lqw.eq(StringUtils.isNotBlank(bo.getTitle()), EimsMaintOrderSt::getTitle, bo.getTitle());
+ lqw.eq(StringUtils.isNotBlank(bo.getEquId()), EimsMaintOrderSt::getEquId, bo.getEquId());
+ lqw.eq(bo.getPlanTime() != null, EimsMaintOrderSt::getPlanTime, bo.getPlanTime());
+ lqw.eq(bo.getMaintUser() != null, EimsMaintOrderSt::getMaintUser, bo.getMaintUser());
+ lqw.eq(bo.getVerifyUser() != null, EimsMaintOrderSt::getVerifyUser, bo.getVerifyUser());
+ return lqw;
+ }
+
+ /**
+ * 鏂板淇濆吇宸ュ崟姹囨��
+ *
+ * @param bo 淇濆吇宸ュ崟姹囨��
+ * @return 鏄惁鏂板鎴愬姛
+ */
+ @Override
+ public Boolean insertByBo(EimsMaintOrderStBo bo) {
+ EimsMaintOrderSt add = MapstructUtils.convert(bo, EimsMaintOrderSt.class);
+ validEntityBeforeSave(add);
+ boolean flag = baseMapper.insert(add) > 0;
+ if (flag) {
+ bo.setId(add.getId());
+ }
+ return flag;
+ }
+
+ /**
+ * 淇敼淇濆吇宸ュ崟姹囨��
+ *
+ * @param bo 淇濆吇宸ュ崟姹囨��
+ * @return 鏄惁淇敼鎴愬姛
+ */
+ @Override
+ public Boolean updateByBo(EimsMaintOrderStBo bo) {
+ EimsMaintOrderSt update = MapstructUtils.convert(bo, EimsMaintOrderSt.class);
+
+ if(bo.getVerifyUser()!=null){
+ EimsMaintOrderSt eimsMaintOrderSt = baseMapper.selectById(bo.getId());
+ String status = eimsMaintOrderSt.getStatus();
+ if(status==null || status.equals(DictConstants.MAINT_ORDER_ST_STATUS_DETAIL.N)){
+ if(update.getVerifyTime()==null) update.setStatus(DictConstants.MAINT_ORDER_ST_STATUS_DETAIL.Y);
+ if(update.getVerifyTime()==null) update.setVerifyTime(new Date());
+ }
+ }
+
+ validEntityBeforeSave(update);
+ return baseMapper.updateById(update) > 0;
+ }
+
+ /**
+ * 淇濆瓨鍓嶇殑鏁版嵁鏍¢獙
+ */
+ private void validEntityBeforeSave(EimsMaintOrderSt entity) {
+ //TODO 鍋氫竴浜涙暟鎹牎楠�,濡傚敮涓�绾︽潫
+ }
+
+ /**
+ * 鏍¢獙骞舵壒閲忓垹闄や繚鍏诲伐鍗曟眹鎬讳俊鎭�
+ *
+ * @param ids 寰呭垹闄ょ殑涓婚敭闆嗗悎
+ * @param isValid 鏄惁杩涜鏈夋晥鎬ф牎楠�
+ * @return 鏄惁鍒犻櫎鎴愬姛
+ */
+ @Transactional(rollbackFor = Exception.class)
+ @SneakyThrows
+ @Override
+ public R<Void> deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+ if (isValid) {
+ //TODO 鍋氫竴浜涗笟鍔′笂鐨勬牎楠�,鍒ゆ柇鏄惁闇�瑕佹牎楠�
+ }
+ AtomicBoolean flag = new AtomicBoolean(false);
+ ids.stream().anyMatch(id -> {
+ EimsMaintOrderStVo stVo = baseMapper.selectVoById(id);
+ LocalDate planTime = stVo.getPlanTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
+ LocalDate startOfMonth = planTime.with(TemporalAdjusters.firstDayOfMonth());
+ LocalDate endOfMonth = planTime.with(TemporalAdjusters.lastDayOfMonth());
+
+ LambdaQueryWrapper<EimsMaintOrder> orderLqw = Wrappers.lambdaQuery(EimsMaintOrder.class)
+ .eq(EimsMaintOrder::getEquId, stVo.getEquId())
+ .between(EimsMaintOrder::getPlanTime, startOfMonth, endOfMonth);
+
+ List<EimsMaintOrderVo> orderList = orderMapper.selectVoList(orderLqw);
+ if (!orderList.isEmpty()) {
+ flag.set(true);
+ return true; // 鏈夊尮閰嶇粨鏋滐紝鍋滄閬嶅巻
+ }
+ return false;
+ });
+
+ if (flag.get()) {
+ return R.fail("瀛樺湪瀛愰」锛屼笉鑳藉垹闄わ紒");
+ }
+ boolean result = baseMapper.deleteByIds(ids) > 0;
+ return result ? R.ok("鎿嶄綔鎴愬姛锛�") : R.fail("鎿嶄綔澶辫触锛�");
+ }
+}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsMaintPlanServiceImpl.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsMaintPlanServiceImpl.java
index 8cbc9af..937832b 100644
--- a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsMaintPlanServiceImpl.java
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsMaintPlanServiceImpl.java
@@ -106,6 +106,7 @@
qw.eq(bo.getMaintUser() != null, "mp.maint_user", bo.getMaintUser());
qw.in(bo.getMaintDept() != null, "mp.maint_dept", getAllDescendantIds(bo.getMaintDept()));
qw.eq(bo.getStatus() != null, "mp.status", bo.getStatus());
+ qw.orderByDesc("mp.create_time");
return qw;
}
@@ -144,7 +145,7 @@
*/
@Override
public Boolean insertByBo(EimsMaintPlanBo bo) {
- setMaintNextTime(bo);
+ //setMaintNextTime(bo);
EimsMaintPlan add = MapstructUtils.convert(bo, EimsMaintPlan.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
@@ -154,46 +155,7 @@
return flag;
}
- /**
- * 璁$畻淇濆吇璁″垝涓嬫鎵ц鏃堕棿
- */
- @SneakyThrows
- private void setMaintNextTime(EimsMaintPlanBo bo) {
- Date maintFirstTime = bo.getMaintFirstTime();
- Date maintLastTime = bo.getMaintLastTime();
- //涓嬫淇濆吇鏃堕棿璁$畻瑙勫垯 0-鎸夊浐瀹氬懆鏈� 1-鎸変笂娆′繚鍏绘椂闂�
- Date nextDate = (maintLastTime != null && bo.getMaintRule().equals(DictConstants.MAINT_TIME_RULE_DETAIL.LAST)) ? maintLastTime :maintFirstTime;
- //棣栨鎵ц鏃堕棿涓虹┖鎶涘嚭寮傚父
- if (maintFirstTime == null) {
- throw new Exception("棣栨鎵ц鏃堕棿涓嶈兘涓虹┖!");
- }
- //鍛ㄦ湡
- Long maintCycle = bo.getMaintCycle();
- //鍗曚綅 1-澶� 2-鍛� 3-鏈� 4-瀛� 5-骞�
- String maintCycleUnit = bo.getMaintCycleUnit();
- switch (maintCycleUnit) {
- case "1":
- nextDate = DateUtils.addDays(nextDate, maintCycle.intValue());
- break;
- case "2":
- nextDate = DateUtils.addWeeks(nextDate, maintCycle.intValue());
- break;
- case "3":
- nextDate = DateUtils.addMonths(nextDate, maintCycle.intValue());
- break;
- case "4":
- nextDate = DateUtils.addMonths(nextDate, maintCycle.intValue() * 3);
- break;
- case "5":
- nextDate = DateUtils.addYears(nextDate, maintCycle.intValue());
- break;
-
- }
- bo.setMaintNextTime(nextDate);
-
-
- }
/**
* 淇敼淇濆吇璁″垝
diff --git a/eims/ruoyi-modules/lb-eims/src/main/resources/mapper/eims/EimsMaintOrderMapper.xml b/eims/ruoyi-modules/lb-eims/src/main/resources/mapper/eims/EimsMaintOrderMapper.xml
index 5497c48..40acd9e 100644
--- a/eims/ruoyi-modules/lb-eims/src/main/resources/mapper/eims/EimsMaintOrderMapper.xml
+++ b/eims/ruoyi-modules/lb-eims/src/main/resources/mapper/eims/EimsMaintOrderMapper.xml
@@ -5,6 +5,9 @@
<mapper namespace="org.dromara.eims.mapper.EimsMaintOrderMapper">
<resultMap type="org.dromara.eims.domain.vo.EimsMaintOrderVo" id="EimsMaintOrderResult">
</resultMap>
+
+ <resultMap type="org.dromara.eims.domain.vo.MaintOrdeGroupVo" id="MaintOrdeGroupVoResult">
+ </resultMap>
<select id="selectMaintOrderList" resultMap="EimsMaintOrderResult">
SELECT mo.*,equ.equ_name equName,equ.equ_code equCode,equ.asset_no assetNo,equ.model_no modelNo,mo.create_time createTime,
pl.maint_name maintName,
@@ -19,4 +22,27 @@
LEFT JOIN sys_dict_data dd on dd.dict_type = 'maint_cycle_unit' and dd.dict_value = mo.maint_cycle_unit
${ew.getCustomSqlSegment}
</select>
+ <select id="selectMaintOrderGroupList" resultMap="MaintOrdeGroupVoResult">
+ SELECT
+ mo.equ_id,
+ mo.plan_time,
+ MAX(equ.equ_name) AS equName,
+ MAX(equ.equ_code) AS equCode,
+ MAX(equ.asset_no) AS assetNo,
+ MAX(equ.model_no) AS modelNo,
+ GROUP_CONCAT(us.nick_name SEPARATOR ', ') AS maintUserNames,
+ GROUP_CONCAT(ue.nick_name SEPARATOR ', ') AS verifyUserNames,
+ COUNT(mo.id) AS orderCount, -- 缁存姢璁㈠崟鐨勬�绘暟
+ SUM(CASE WHEN mo.status = 0 THEN 1 ELSE 0 END) AS dbyCount,
+ SUM(CASE WHEN mo.status = 1 THEN 1 ELSE 0 END) AS byCount,
+ SUM(CASE WHEN mo.status = 2 THEN 1 ELSE 0 END) AS dyzCount,
+ SUM(CASE WHEN mo.status = 3 THEN 1 ELSE 0 END) AS wcCount
+ FROM eims_maint_order mo
+ LEFT JOIN eims_equ equ ON mo.equ_id = equ.equ_id
+ LEFT JOIN sys_user us ON mo.maint_user = us.user_id
+ LEFT JOIN sys_user ue ON mo.verify_user = ue.user_id
+ LEFT JOIN sys_dept dp ON mo.maint_dept = dp.dept_id
+ LEFT JOIN eims_maint_plan pl ON pl.id = mo.plan_id
+ ${ew.getCustomSqlSegment}
+ </select>
</mapper>
diff --git a/eims/ruoyi-modules/lb-eims/src/main/resources/mapper/eims/EimsMaintOrderStMapper.xml b/eims/ruoyi-modules/lb-eims/src/main/resources/mapper/eims/EimsMaintOrderStMapper.xml
new file mode 100644
index 0000000..892a6b6
--- /dev/null
+++ b/eims/ruoyi-modules/lb-eims/src/main/resources/mapper/eims/EimsMaintOrderStMapper.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.eims.mapper.EimsMaintOrderStMapper">
+
+</mapper>
--
Gitblit v1.9.3