From a4e9be7205274b93571c74268855b39129145328 Mon Sep 17 00:00:00 2001
From: 朱桂飞 <zhuguifei@zhuguifeideMacBook-Air.local>
Date: 星期六, 08 二月 2025 11:22:21 +0800
Subject: [PATCH] 添加盘点模块
---
eims-ui/apps/web-antd/src/views/eims/equ-trial/equ-trial-drawer.vue | 5
eims-ui/apps/web-antd/src/views/eims/inventory/inventory-drawer.vue | 221 ++++
eims-ui/apps/web-antd/src/api/eims/inventory/index.ts | 61 +
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsInventoryServiceImpl.java | 215 ++++
eims-ui/apps/web-antd/src/api/eims/inventory-detail/index.ts | 61 +
eims-ui/packages/@core/base/shared/src/constants/dict-enum.ts | 4
eims/ruoyi-modules/lb-eims/src/main/resources/mapper/eims/EimsInventoryMapper.xml | 7
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/EimsInventory.java | 83 +
eims-ui/apps/web-antd/src/views/eims/inventory-detail/equ-type-tree.vue | 121 ++
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsInventoryDetailServiceImpl.java | 139 ++
eims-ui/apps/web-antd/src/router/routes/local.ts | 24
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/controller/EimsInventoryController.java | 105 ++
eims/ruoyi-modules/lb-eims/src/main/resources/mapper/eims/EimsInventoryDetailMapper.xml | 29
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsInventoryDetailVo.java | 79 +
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/EimsInventoryDetail.java | 51
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/IEimsInventoryDetailService.java | 71 +
eims-ui/apps/web-antd/src/api/eims/inventory-detail/model.d.ts | 50
eims-ui/apps/web-antd/src/views/eims/inventory/index.vue | 242 ++++
eims-ui/apps/web-antd/src/views/eims/inventory/data.tsx | 211 ++++
eims-ui/apps/web-antd/src/api/eims/equ-trial/model.d.ts | 5
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/controller/EimsInventoryDetailController.java | 106 ++
eims-ui/apps/web-antd/src/api/eims/inventory/model.d.ts | 87 +
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsInventoryDetailBo.java | 70 +
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/IEimsInventoryService.java | 67 +
eims-ui/apps/web-antd/src/views/eims/inventory-detail/index.vue | 207 +++
eims-ui/apps/web-antd/src/views/eims/inventory-detail/equ-drawer.vue | 211 ++++
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsInventoryBo.java | 91 +
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/mapper/EimsInventoryDetailMapper.java | 23
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/mapper/EimsInventoryMapper.java | 16
eims-ui/apps/web-antd/src/views/eims/equ-statu/equ-statu-drawer.vue | 5
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsInventoryVo.java | 113 ++
eims-ui/apps/web-antd/src/views/eims/inventory-detail/data.tsx | 328 ++++++
32 files changed, 3,105 insertions(+), 3 deletions(-)
diff --git a/eims-ui/apps/web-antd/src/api/eims/equ-trial/model.d.ts b/eims-ui/apps/web-antd/src/api/eims/equ-trial/model.d.ts
index f81731c..8482151 100644
--- a/eims-ui/apps/web-antd/src/api/eims/equ-trial/model.d.ts
+++ b/eims-ui/apps/web-antd/src/api/eims/equ-trial/model.d.ts
@@ -35,6 +35,11 @@
operatorId: number | string;
/**
+ * 鎿嶄綔浜洪儴闂�
+ */
+ operatorDept: operatorDept | string;
+
+ /**
* 寮�濮嬫椂闂�
*/
startTime: string;
diff --git a/eims-ui/apps/web-antd/src/api/eims/inventory-detail/index.ts b/eims-ui/apps/web-antd/src/api/eims/inventory-detail/index.ts
new file mode 100644
index 0000000..c72d038
--- /dev/null
+++ b/eims-ui/apps/web-antd/src/api/eims/inventory-detail/index.ts
@@ -0,0 +1,61 @@
+import type { InventoryDetailVO } from './model';
+
+import type { ID, IDS } from '#/api/common';
+
+import { commonExport } from '#/api/helper';
+import { requestClient } from '#/api/request';
+
+enum Api {
+ inventoryDetailExport = '/eims/inventoryDetail/export',
+ inventoryDetailList = '/eims/inventoryDetail/list',
+ root = '/eims/inventoryDetail'
+}
+
+/**
+ * 鏌ヨ鐩樼偣鍒楄〃
+ * @param query
+ * @returns {*}
+ */
+
+export function listInventoryDetail(params?: any) {
+ return requestClient.get<InventoryDetailVO[]>(Api.inventoryDetailList, { params });
+}
+
+/**
+ * 鏌ヨ鐩樼偣鏄庣粏
+ * @param inventoryDetailId
+ */
+export function getInventoryDetail(inventoryDetailId: ID) {
+ return requestClient.get<InventoryDetailVO>(`${Api.root}/${inventoryDetailId}`);
+}
+
+/**
+ * 鏂板鐩樼偣鏄庣粏
+ * @param data
+ */
+export function addInventoryDetail(data: any) {
+ return requestClient.postWithMsg<void>(Api.root, data);
+}
+
+/**
+ * 淇敼鐩樼偣鏄庣粏
+ * @param data
+ */
+export function updateInventoryDetail(data: any) {
+ return requestClient.putWithMsg<void>(Api.root, data);
+}
+
+/**
+ * 鍒犻櫎鐩樼偣鏄庣粏
+ * @param inventoryId
+ */
+export function delInventoryDetail(inventoryDetailId: IDS) {
+ return requestClient.deleteWithMsg<void>(`${Api.root}/${inventoryDetailId}`);
+}
+/**
+ * 瀵煎嚭
+ * @param
+ */
+export function inventoryDetailExport(data: any) {
+ return commonExport(Api.inventoryDetailExport, data);
+}
diff --git a/eims-ui/apps/web-antd/src/api/eims/inventory-detail/model.d.ts b/eims-ui/apps/web-antd/src/api/eims/inventory-detail/model.d.ts
new file mode 100644
index 0000000..42ab0ff
--- /dev/null
+++ b/eims-ui/apps/web-antd/src/api/eims/inventory-detail/model.d.ts
@@ -0,0 +1,50 @@
+export interface InventoryDetailVO {
+ /**
+ * 鏄庣粏id
+ */
+ id: number | string;
+
+ /**
+ * 鐩樼偣id
+ */
+ inventoryId: number | string;
+
+ /**
+ * 鐘舵��
+ */
+ status: string;
+
+ /**
+ * 璁惧鍚嶇О
+ */
+ equName: string;
+ /**
+ * 璁惧缂栫爜
+ */
+ equCode: string;
+ /**
+ * 璁惧璧勪骇缂栧彿
+ */
+ equAssetNo: string;
+ /**
+ * 閮ㄩ棬鍚嶇О
+ */
+ deptName: string;
+ /**
+ * 璁惧绫诲瀷鍚嶇О
+ */
+ equTypeName: string;
+ /**
+ * 璁惧鎵�鍦ㄤ綅缃�
+ */
+ location: string;
+ /**
+ * 璁惧鐘舵��
+ */
+ equStatus: string;
+ //
+ /**
+ * 鐩樼偣浜�
+ */
+ inventoryUser: string;
+}
diff --git a/eims-ui/apps/web-antd/src/api/eims/inventory/index.ts b/eims-ui/apps/web-antd/src/api/eims/inventory/index.ts
new file mode 100644
index 0000000..64e8e70
--- /dev/null
+++ b/eims-ui/apps/web-antd/src/api/eims/inventory/index.ts
@@ -0,0 +1,61 @@
+import type { InventoryVO } from './model';
+
+import type { ID, IDS } from '#/api/common';
+
+import { commonExport } from '#/api/helper';
+import { requestClient } from '#/api/request';
+
+enum Api {
+ inventoryExport = '/eims/inventory/export',
+ inventoryList = '/eims/inventory/list',
+ root = '/eims/inventory'
+}
+
+/**
+ * 鏌ヨ鐩樼偣鍒楄〃
+ * @param query
+ * @returns {*}
+ */
+
+export function listInventory(params?: any) {
+ return requestClient.get<InventoryVO[]>(Api.inventoryList, { params });
+}
+
+/**
+ * 鏌ヨ鐩樼偣璇︾粏
+ * @param inventoryId
+ */
+export function getInventory(inventoryId: ID) {
+ return requestClient.get<InventoryVO>(`${Api.root}/${inventoryId}`);
+}
+
+/**
+ * 鏂板鐩樼偣
+ * @param data
+ */
+export function addInventory(data: any) {
+ return requestClient.postWithMsg<void>(Api.root, data);
+}
+
+/**
+ * 淇敼鐩樼偣
+ * @param data
+ */
+export function updateInventory(data: any) {
+ return requestClient.putWithMsg<void>(Api.root, data);
+}
+
+/**
+ * 鍒犻櫎鐩樼偣
+ * @param inventoryId
+ */
+export function delInventory(inventoryId: IDS) {
+ return requestClient.deleteWithMsg<void>(`${Api.root}/${inventoryId}`);
+}
+/**
+ * 瀵煎嚭
+ * @param
+ */
+export function inventoryExport(data: any) {
+ return commonExport(Api.inventoryExport, data);
+}
diff --git a/eims-ui/apps/web-antd/src/api/eims/inventory/model.d.ts b/eims-ui/apps/web-antd/src/api/eims/inventory/model.d.ts
new file mode 100644
index 0000000..d3d00ef
--- /dev/null
+++ b/eims-ui/apps/web-antd/src/api/eims/inventory/model.d.ts
@@ -0,0 +1,87 @@
+export interface InventoryVO {
+ /**
+ * 鐩樼偣id
+ */
+ inventoryId: number | string;
+
+ /**
+ * 鐩樼偣鍗曞彿
+ */
+ inventoryCode: string;
+
+ /**
+ * 鐩樼偣鍚嶇О
+ */
+ inventoryName: string;
+
+ /**
+ * 鐩樼偣浜�
+ */
+ inventoryUser: number;
+ /**
+ * 鐩樼偣浜洪儴闂�
+ */
+ userDept: number;
+
+ /**
+ * 寮�濮嬫棩鏈�
+ */
+ startDate: string;
+
+ /**
+ * 缁撴潫鏃ユ湡
+ */
+ endDate: string;
+
+ /**
+ * 鐩樼偣鐘舵��
+ */
+ status: string;
+
+ /**
+ * 澶囨敞
+ */
+ remark: string;
+}
+
+export interface InventoryForm extends BaseEntity {
+ /**
+ * 鐩樼偣id
+ */
+ inventoryId?: number | string;
+
+ /**
+ * 鐩樼偣鍗曞彿
+ */
+ inventoryCode?: string;
+
+ /**
+ * 鐩樼偣鍚嶇О
+ */
+ inventoryName?: string;
+
+ /**
+ * 鐩樼偣浜�
+ */
+ inventoryUser?: number;
+
+ /**
+ * 寮�濮嬫棩鏈�
+ */
+ startDate?: string;
+
+ /**
+ * 缁撴潫鏃ユ湡
+ */
+ endDate?: string;
+
+ /**
+ * 鐩樼偣鐘舵��
+ */
+ status?: string;
+
+ /**
+ * 澶囨敞
+ */
+ remark?: string;
+}
diff --git a/eims-ui/apps/web-antd/src/router/routes/local.ts b/eims-ui/apps/web-antd/src/router/routes/local.ts
index f1883dd..cec7e95 100644
--- a/eims-ui/apps/web-antd/src/router/routes/local.ts
+++ b/eims-ui/apps/web-antd/src/router/routes/local.ts
@@ -129,6 +129,30 @@
}
]
},
+ {
+ component: 'BasicLayout',
+ meta: {
+ hideChildrenInMenu: true,
+ hideInMenu: true,
+ title: '鐩樼偣鏄庣粏'
+ },
+ name: 'InventoryDetail',
+ path: '/',
+ redirect: '/inventory/detail',
+ children: [
+ {
+ component: '/eims/inventory-detail/index',
+ meta: {
+ activePath: '/equ/inventory',
+ icon: 'eos-icons:role-binding-outlined',
+ keepAlive: true,
+ title: '鐩樼偣鏄庣粏'
+ },
+ name: 'InventoryDetailIndex',
+ path: '/inventory/detail/:inventoryId'
+ }
+ ]
+ },
];
/**
diff --git a/eims-ui/apps/web-antd/src/views/eims/equ-statu/equ-statu-drawer.vue b/eims-ui/apps/web-antd/src/views/eims/equ-statu/equ-statu-drawer.vue
index e0d5c75..590f7a9 100644
--- a/eims-ui/apps/web-antd/src/views/eims/equ-statu/equ-statu-drawer.vue
+++ b/eims-ui/apps/web-antd/src/views/eims/equ-statu/equ-statu-drawer.vue
@@ -56,6 +56,9 @@
if (isUpdate.value && id) {
const record = await getEquStatu(id);
await formApi.setValues(record);
+ if(isUpdate.value && record.userDept){
+ await setupUserOptions(record.userDept);
+ }
}
// 璁惧id鏈夊�兼椂涓嶅厑璁哥紪杈戯紙1.缂栬緫 2.璁惧璇︽儏椤垫墦寮�锛�
const flag = equId !== undefined || isUpdate.value;
@@ -158,7 +161,7 @@
/** 鏍规嵁閮ㄩ棬ID鍔犺浇鐢ㄦ埛 */
await setupUserOptions(deptId);
/** 鍙樺寲鍚庨渶瑕侀噸鏂伴�夋嫨鐢ㄦ埛 */
- formModel.respPerson = undefined;
+ formModel.changeUser = undefined;
},
placeholder: '璇烽�夋嫨',
showSearch: true,
diff --git a/eims-ui/apps/web-antd/src/views/eims/equ-trial/equ-trial-drawer.vue b/eims-ui/apps/web-antd/src/views/eims/equ-trial/equ-trial-drawer.vue
index 99c5f21..48643ce 100644
--- a/eims-ui/apps/web-antd/src/views/eims/equ-trial/equ-trial-drawer.vue
+++ b/eims-ui/apps/web-antd/src/views/eims/equ-trial/equ-trial-drawer.vue
@@ -54,6 +54,9 @@
if (isUpdate.value && id) {
const record = await getEquTrial(id);
await formApi.setValues(record);
+ if(isUpdate.value && record.operatorDept){
+ await setupUserOptions(record.operatorDept);
+ }
}
// 璁惧id鏈夊�兼椂涓嶅厑璁哥紪杈戯紙1.缂栬緫 2.璁惧璇︽儏椤垫墦寮�锛�
const flag = equId !== undefined || isUpdate.value;
@@ -153,7 +156,7 @@
/** 鏍规嵁閮ㄩ棬ID鍔犺浇鐢ㄦ埛 */
await setupUserOptions(deptId);
/** 鍙樺寲鍚庨渶瑕侀噸鏂伴�夋嫨鐢ㄦ埛 */
- formModel.respPerson = undefined;
+ formModel.operatorId = undefined;
},
placeholder: '璇烽�夋嫨',
showSearch: true,
diff --git a/eims-ui/apps/web-antd/src/views/eims/inventory-detail/data.tsx b/eims-ui/apps/web-antd/src/views/eims/inventory-detail/data.tsx
new file mode 100644
index 0000000..adec6df
--- /dev/null
+++ b/eims-ui/apps/web-antd/src/views/eims/inventory-detail/data.tsx
@@ -0,0 +1,328 @@
+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, z } from '#/adapter/form';
+import { getDictOptions } from '#/utils/dict';
+
+export const querySchema: FormSchemaGetter = () => [
+ {
+ component: 'Input',
+ fieldName: 'equCode',
+ label: '璁惧缂栫爜'
+ },
+ {
+ component: 'Input',
+ fieldName: 'equName',
+ label: '璁惧鍚嶇О'
+ },
+ {
+ component: 'Input',
+ fieldName: 'equAssetNo',
+ label: '璧勪骇缂栧彿'
+ },
+ {
+ component: 'Input',
+ fieldName: 'location',
+ label: '鎵�鍦ㄥ満鎵�'
+ },
+ {
+ component: 'Select',
+ componentProps: {
+ options: getDictOptions(DictEnum.SYS_EQU_STATUS)
+ },
+ fieldName: 'equStatus',
+ label: '璁惧鐘舵��'
+ },
+ {
+ component: 'Select',
+ componentProps: {
+ options: getDictOptions(DictEnum.EIMS_INVENTORY_DETAIL_STATU)
+ },
+ fieldName: 'status',
+ label: '鐩樼偣鏄庣粏'
+ }
+];
+
+export const columns: VxeGridProps['columns'] = [
+ { type: 'checkbox', width: 60, fixed: 'left' },
+ {
+ title: '璁惧缂栧彿',
+ field: 'equCode',
+ minWidth: 120,
+ fixed: 'left',
+ },
+ {
+ title: '璁惧鍚嶇О',
+ field: 'equName',
+ minWidth: 100,
+ fixed: 'left',
+ },
+ {
+ title: '璧勪骇缂栧彿',
+ field: 'equAssetNo',
+ sortable: true,
+ minWidth: 100,
+ },
+ {
+ title: '浣跨敤閮ㄩ棬',
+ field: 'deptName',
+ minWidth: 100,
+ },
+ {
+ title: '璁惧绫诲瀷',
+ field: 'equTypeName',
+ minWidth: 100,
+ },
+ {
+ title: '璁惧浣嶇疆',
+ field: 'location',
+ minWidth: 100,
+ },
+ {
+ title: '璁惧鐘舵��',
+ field: 'equStatus',
+ sortable: true,
+ slots: {
+ default: ({ row }) => {
+ const statu = row.status;
+ switch (statu) {
+ case '0': {
+ return <Tag color="cyan">璇曠敤</Tag>;
+ }
+ case '1': {
+ return <Tag color="green">鍏ュ浐</Tag>;
+ }
+ case '2': {
+ return <Tag color="orange">杩佺Щ</Tag>;
+ }
+ case '3': {
+ return <Tag color="red">鎶ュ簾</Tag>;
+ }
+ case null: {
+ return '';
+ }
+ // No default
+ }
+ return '';
+ }
+ },
+ minWidth: 80,
+ },
+
+ {
+ title: '鐩樼偣浜�',
+ field: 'inventoryUser',
+ sortable: true,
+ minWidth: 100
+ },
+ {
+ field: 'action',
+ fixed: 'right',
+ slots: { default: 'action' },
+ title: '鎿嶄綔',
+ width: 200
+ }
+];
+
+export const drawerSchema: FormSchemaGetter = () => [
+ {
+ component: 'Input',
+ dependencies: {
+ show: () => false,
+ triggerFields: ['']
+ },
+ fieldName: 'equId'
+ },
+ {
+ component: 'TreeSelect',
+ defaultValue: 0,
+ fieldName: 'equTypeId',
+ label: '璁惧绫诲瀷',
+ rules: 'selectRequired'
+ },
+ {
+ component: 'Input',
+ fieldName: 'equName',
+ label: '璁惧鍚嶇О',
+ rules: 'required'
+ },
+ {
+ component: 'Input',
+ fieldName: 'equCode',
+ label: '璁惧缂栫爜',
+ help: '璁惧鍞竴缂栫爜'
+ },
+ {
+ component: 'Input',
+ fieldName: 'assetNo',
+ label: '璧勪骇缂栧彿'
+ },
+ {
+ component: 'Input',
+ fieldName: 'modelNo',
+ label: '鍨嬪彿'
+ },
+ {
+ component: 'Input',
+ fieldName: 'madeIn',
+ label: '鍒堕�犲晢'
+ },
+ {
+ component: 'Input',
+ fieldName: 'ratedPower',
+ label: '棰濆畾鍔熺巼'
+ },
+ {
+ component: 'Input',
+ fieldName: 'plateInfo',
+ label: '閾墝淇℃伅'
+ },
+ {
+ component: 'DatePicker',
+ componentProps: {
+ format: 'YYYY-MM-DD',
+ showTime: false,
+ valueFormat: 'YYYY-MM-DD',
+ getPopupContainer
+ },
+ fieldName: 'purchaseDate',
+ label: '閲囪喘鏃ユ湡'
+ },
+ {
+ component: 'RadioGroup',
+ componentProps: {
+ buttonStyle: 'solid',
+ options: getDictOptions(DictEnum.SYS_EQU_STATUS),
+ optionType: 'button'
+ },
+ defaultValue: '0',
+ fieldName: 'status',
+ label: '鐘舵��'
+ },
+ {
+ component: 'Input',
+ fieldName: 'location',
+ label: '鎵�鍦ㄥ満鎵�',
+ help: `璁惧瀹為檯鎽嗘斁鍦烘墍`
+ },
+
+ {
+ component: 'TreeSelect',
+ // 鍦╠rawer閲屾洿鏂� 杩欓噷涓嶉渶瑕侀粯璁ょ殑componentProps
+ defaultValue: undefined,
+ fieldName: 'deptUsed',
+ label: '浣跨敤閮ㄩ棬'
+ // rules: 'selectRequired',
+ },
+ {
+ component: 'Select',
+ componentProps: {
+ allowClear: true,
+ showSearch: true,
+ getPopupContainer
+ },
+ fieldName: 'respPerson',
+ label: '璐d换浜�',
+ help: `璁惧璐熻矗浜猴紝绠$悊浜哄憳`
+ },
+ {
+ component: 'Input',
+ fieldName: 'contactPhone',
+ label: '鑱旂郴鐢佃瘽',
+ defaultValue: undefined,
+ rules: z
+ .string()
+ .regex(/^1[3-9]\d{9}$/, '璇疯緭鍏ユ纭殑鎵嬫満鍙风爜')
+ .optional()
+ .or(z.literal(''))
+ },
+ {
+ component: 'DatePicker',
+ componentProps: {
+ format: 'YYYY-MM-DD',
+ showTime: false,
+ valueFormat: 'YYYY-MM-DD',
+ getPopupContainer
+ },
+ fieldName: 'deployDate',
+ label: '姝e紡浣跨敤鏃ユ湡'
+ },
+ {
+ component: 'DatePicker',
+ componentProps: {
+ format: 'YYYY-MM-DD',
+ showTime: false,
+ valueFormat: 'YYYY-MM-DD',
+ getPopupContainer
+ },
+ fieldName: 'trialDate',
+ label: '寮�濮嬭瘯鐢ㄦ棩鏈�'
+ },
+ {
+ component: 'DatePicker',
+ componentProps: {
+ format: 'YYYY-MM-DD',
+ showTime: false,
+ valueFormat: 'YYYY-MM-DD',
+ getPopupContainer
+ },
+ fieldName: 'planAcceptDate',
+ label: '璁″垝楠屾敹鏃ユ湡'
+ },
+ {
+ component: 'DatePicker',
+ componentProps: {
+ format: 'YYYY-MM-DD',
+ showTime: false,
+ valueFormat: 'YYYY-MM-DD',
+ getPopupContainer
+ },
+ fieldName: 'actualAcceptDate',
+ label: '瀹為檯楠屾敹鏃ユ湡'
+ },
+ {
+ component: 'RadioGroup',
+ componentProps: {
+ buttonStyle: 'solid',
+ options: getDictOptions(DictEnum.SYS_NORMAL_DISABLE),
+ optionType: 'button'
+ },
+ defaultValue: '0',
+ fieldName: 'importStatus',
+ formItemClass: 'col-span-2 lg:col-span-1',
+ label: '瀵煎叆鐘舵��'
+ },
+
+ {
+ component: 'Input',
+ fieldName: 'serviceLife',
+ label: '浣跨敤骞撮檺'
+ },
+ {
+ component: 'RadioGroup',
+ componentProps: {
+ buttonStyle: 'solid',
+ options: getDictOptions(DictEnum.SYS_NORMAL_DISABLE),
+ optionType: 'button'
+ },
+ defaultValue: '0',
+ fieldName: 'inventoryFlag',
+ formItemClass: 'col-span-2 lg:col-span-1',
+ label: '鐩樼偣鏍囧織'
+ },
+ {
+ component: 'DatePicker',
+ componentProps: {
+ format: 'YYYY-MM-DD',
+ showTime: false,
+ valueFormat: 'YYYY-MM-DD',
+ getPopupContainer
+ },
+ fieldName: 'inventoryDate',
+ label: '涓婃鐩樼偣鏃ユ湡'
+ }
+];
diff --git a/eims-ui/apps/web-antd/src/views/eims/inventory-detail/equ-drawer.vue b/eims-ui/apps/web-antd/src/views/eims/inventory-detail/equ-drawer.vue
new file mode 100644
index 0000000..eafef4a
--- /dev/null
+++ b/eims-ui/apps/web-antd/src/views/eims/inventory-detail/equ-drawer.vue
@@ -0,0 +1,211 @@
+<script setup lang="ts">
+import { computed, ref } from 'vue';
+
+import { useVbenDrawer } from '@vben/common-ui';
+import { $t } from '@vben/locales';
+import { addFullName, cloneDeep, getPopupContainer, listToTree } from '@vben/utils';
+
+import { useVbenForm } from '#/adapter/form';
+import { addEqu, getEqu, updateEqu } from '#/api/eims/equ';
+import { getEquType, listEquType } from '#/api/eims/equ-type';
+import { getDeptTree, userList } from '#/api/system/user';
+
+import { drawerSchema } from './data';
+
+const emit = defineEmits<{ reload: [] }>();
+const typeDisabled = ref(false);
+
+const isUpdate = ref(false);
+const title = computed(() => {
+ return isUpdate.value ? $t('pages.common.edit') : $t('pages.common.add');
+});
+
+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 };
+ const { typeDisable } = drawerApi.getData() as { typeDisable?: boolean };
+ typeDisabled.value = !!typeDisable;
+ isUpdate.value = !!id;
+ // 鍒濆鍖�
+ await setupDeptSelect();
+ // 鏇存柊 && 璧嬪��
+ if (isUpdate.value && id) {
+ const record = await getEqu(id);
+ await formApi.setValues(record);
+ if(isUpdate.value && record.deptUsed){
+ await setupUserOptions(record.deptUsed)
+ }
+
+ }
+
+ // 鍔犺浇璁惧绫诲瀷鏍戦�夋嫨
+ await setupEquTypeSelect();
+ if (id) {
+ await formApi.setFieldValue('parentId', id);
+ if (isUpdate.value && id) {
+ const record = await getEquType(id);
+ await formApi.setValues(record);
+ }
+ }
+ drawerApi.drawerLoading(false);
+ }
+});
+
+
+async function setupEquTypeSelect() {
+ // status-0 鍙煡璇㈡湭鍋滅敤璁惧
+ const equArray = await listEquType({ status: 0 });
+ // support i18n
+ equArray.forEach((item) => {
+ item.typeName = $t(item.typeName);
+ });
+ const equTree = listToTree(equArray, { id: 'equTypeId', pid: 'parentId' });
+ const fullEquTree = [
+ {
+ equTypeId: 0,
+ typeName: $t('menu.root'),
+ children: equTree,
+ },
+ ];
+ addFullName(fullEquTree, 'typeName', ' / ');
+ formApi.updateSchema([
+ {
+ componentProps: {
+ fieldNames: {
+ label: 'typeName',
+ value: 'equTypeId',
+ },
+ getPopupContainer,
+ // 璁剧疆寮圭獥婊氬姩楂樺害 榛樿256
+ listHeight: 300,
+ showSearch: true,
+ treeData: fullEquTree,
+ disabled: typeDisabled.value,
+ treeDefaultExpandAll: false,
+ // 榛樿灞曞紑鐨勬爲鑺傜偣
+ treeDefaultExpandedKeys: [0],
+ treeLine: { showLeafIcon: false },
+ // 绛涢�夌殑瀛楁
+ treeNodeFilterProp: 'typeName',
+ treeNodeLabelProp: 'fullName',
+ },
+ fieldName: 'equTypeId',
+ },
+ ]);
+}
+
+/**
+ * 鐢ㄦ埛鐨勫姞杞�
+ */
+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 ? '璇烽�夋嫨' : '璇ラ儴闂ㄤ笅鏆傛棤鐢ㄦ埛';
+ formApi.updateSchema([
+ {
+ componentProps: { options, placeholder ,filterOption },
+ fieldName: 'respPerson'
+ }
+ ]);
+}
+
+/**
+ * 鍒濆鍖栭儴闂ㄩ�夋嫨
+ */
+async function setupDeptSelect() {
+ // updateSchema
+ const deptTree = await getDeptTree();
+ // 閫変腑鍚庢樉绀哄湪杈撳叆妗嗙殑鍊� 鍗崇埗鑺傜偣 / 瀛愯妭鐐�
+ addFullName(deptTree, 'label', ' / ');
+ 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.respPerson = undefined;
+ },
+ placeholder: '璇烽�夋嫨',
+ showSearch: true,
+ treeData: deptTree,
+ treeDefaultExpandAll: true,
+ treeLine: { showLeafIcon: false },
+ // 绛涢�夌殑瀛楁
+ treeNodeFilterProp: 'label',
+ // 閫変腑鍚庢樉绀哄湪杈撳叆妗嗙殑鍊�
+ treeNodeLabelProp: 'fullName'
+ }),
+ fieldName: 'deptUsed'
+ }
+ ]);
+}
+
+async function handleConfirm() {
+ try {
+ drawerApi.drawerLoading(true);
+ const { valid } = await formApi.validate();
+ if (!valid) {
+ return;
+ }
+ const data = cloneDeep(await formApi.getValues());
+ await (isUpdate.value ? updateEqu(data) : addEqu(data));
+ emit('reload');
+ await handleCancel();
+ } catch (error) {
+ console.error(error);
+ } finally {
+ drawerApi.drawerLoading(false);
+ }
+}
+
+async function handleCancel() {
+ drawerApi.close();
+ await formApi.resetForm();
+}
+</script>
+
+<template>
+ <BasicDrawer :close-on-click-modal="false" :title="title" class="w-[600px]">
+ <BasicForm />
+ </BasicDrawer>
+</template>
diff --git a/eims-ui/apps/web-antd/src/views/eims/inventory-detail/equ-type-tree.vue b/eims-ui/apps/web-antd/src/views/eims/inventory-detail/equ-type-tree.vue
new file mode 100644
index 0000000..0dd28c0
--- /dev/null
+++ b/eims-ui/apps/web-antd/src/views/eims/inventory-detail/equ-type-tree.vue
@@ -0,0 +1,121 @@
+<script setup lang="ts">
+import type { DeptTree } from '#/api/system/user/model';
+
+import { onMounted, type PropType, ref } from 'vue';
+
+import { SyncOutlined } from '@ant-design/icons-vue';
+import { Empty, InputSearch, Skeleton, Tree } from 'ant-design-vue';
+
+import { getEquTypeTree } from '#/api/eims/equ-type';
+
+defineOptions({ inheritAttrs: false });
+
+const emit = defineEmits<{
+ /**
+ * 鐐瑰嚮鍒锋柊鎸夐挳鐨勪簨浠�
+ */
+ reload: [];
+ /**
+ * 鐐瑰嚮鑺傜偣鐨勪簨浠�
+ */
+ select: [];
+}>();
+
+const selectDeptId = defineModel('selectDeptId', {
+ required: true,
+ type: Array as PropType<string[]>,
+});
+
+const searchValue = defineModel('searchValue', {
+ type: String,
+ default: '',
+});
+
+/** 閮ㄩ棬鏁版嵁婧� */
+type DeptTreeArray = DeptTree[];
+const deptTreeArray = ref<DeptTreeArray>([]);
+/** 楠ㄦ灦灞忓姞杞� */
+const showTreeSkeleton = ref<boolean>(true);
+
+async function loadTree() {
+ showTreeSkeleton.value = true;
+ searchValue.value = '';
+ selectDeptId.value = [];
+
+ const ret = await getEquTypeTree();
+
+ deptTreeArray.value = ret;
+ showTreeSkeleton.value = false;
+}
+
+async function handleReload() {
+ await loadTree();
+ emit('reload');
+}
+
+onMounted(loadTree);
+</script>
+
+<template>
+ <div :class="$attrs.class">
+ <Skeleton
+ :loading="showTreeSkeleton"
+ :paragraph="{ rows: 8 }"
+ active
+ class="p-[8px]"
+ >
+ <div
+ class="bg-background flex h-full flex-col overflow-y-auto rounded-lg"
+ >
+ <!-- 鍥哄畾鍦ㄩ《閮� 蹇呴』鍔犱笂bg-background鑳屾櫙鑹� 鍚﹀垯浼氫骇鐢�'绌块��'鏁堟灉 -->
+ <div class="bg-background z-100 sticky left-0 top-0 p-[8px]">
+ <InputSearch
+ v-model:value="searchValue"
+ :placeholder="$t('pages.common.search')"
+ size="small"
+ >
+ <template #enterButton>
+ <a-button @click="handleReload">
+ <SyncOutlined class="text-primary" />
+ </a-button>
+ </template>
+ </InputSearch>
+ </div>
+ <div class="h-full overflow-x-hidden px-[8px]">
+ <Tree
+ v-bind="$attrs"
+ v-if="deptTreeArray.length > 0"
+ v-model:selected-keys="selectDeptId"
+ :class="$attrs.class"
+ :field-names="{ title: 'label', key: 'id' }"
+ :show-line="{ showLeafIcon: false }"
+ :tree-data="deptTreeArray"
+ :virtual="false"
+ default-expand-all
+ @select="$emit('select')"
+ >
+ <template #title="{ label }">
+ <span v-if="label.indexOf(searchValue) > -1">
+ {{ label.substring(0, label.indexOf(searchValue)) }}
+ <span style="color: #f50">{{ searchValue }}</span>
+ {{
+ label.substring(
+ label.indexOf(searchValue) + searchValue.length,
+ )
+ }}
+ </span>
+ <span v-else>{{ label }}</span>
+ </template>
+ </Tree>
+ <!-- 浠呮湰浜烘暟鎹潈闄� 鍙互鑰冭檻鐩存帴涓嶆樉绀� -->
+ <div v-else class="mt-5">
+ <Empty
+ :image="Empty.PRESENTED_IMAGE_SIMPLE"
+ description="鏃犻儴闂ㄦ暟鎹�"
+ />
+ </div>
+ </div>
+ </div>
+ </Skeleton>
+ </div>
+</template>
diff --git a/eims-ui/apps/web-antd/src/views/eims/inventory-detail/index.vue b/eims-ui/apps/web-antd/src/views/eims/inventory-detail/index.vue
new file mode 100644
index 0000000..85ce23f
--- /dev/null
+++ b/eims-ui/apps/web-antd/src/views/eims/inventory-detail/index.vue
@@ -0,0 +1,207 @@
+<script setup lang="ts">
+import type { Recordable } from '@vben/types';
+
+import { ref } from 'vue';
+import { useRoute, useRouter } from 'vue-router';
+
+import { Page, useVbenDrawer, type VbenFormProps } from '@vben/common-ui';
+import { $t } from '@vben/locales';
+import { getVxePopupContainer } from '@vben/utils';
+
+import { Modal, Popconfirm, Space } from 'ant-design-vue';
+
+import { useVbenVxeGrid, vxeCheckboxChecked, type VxeGridProps, vxeSortEvent } from '#/adapter/vxe-table';
+import { delInventoryDetail, inventoryDetailExport, listInventoryDetail } from '#/api/eims/inventory-detail';
+import { commonDownloadExcel } from '#/utils/file/download';
+
+import { columns, querySchema } from './data';
+import equDrawer from './equ-drawer.vue';
+import EquTypeTree from './equ-type-tree.vue';
+
+const route = useRoute();
+const inventoryId = route.params.inventoryId as string;
+
+// 宸﹁竟閮ㄩ棬鐢�
+const selectTypeId = ref<string[]>([]);
+
+const formOptions: VbenFormProps = {
+ commonConfig: {
+ labelWidth: 80,
+ componentProps: {
+ allowClear: true
+ }
+ },
+ schema: querySchema(),
+ wrapperClass: 'grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4',
+ handleReset: async () => {
+ selectTypeId.value = [];
+ // eslint-disable-next-line no-use-before-define
+ const { formApi, reload } = tableApi;
+ await formApi.resetForm();
+ const formValues = formApi.form.values;
+ formApi.setLatestSubmissionValues(formValues);
+ await reload(formValues);
+ },
+ // 鏃ユ湡閫夋嫨鏍煎紡鍖�
+ fieldMappingTime: [['createTime', ['params[beginTime]', 'params[endTime]'], ['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 = {}) => {
+ // 閮ㄩ棬鏍戦�夋嫨澶勭悊
+ if (selectTypeId.value.length === 1) {
+ formValues.equTypeId = selectTypeId.value[0];
+ } else {
+ Reflect.deleteProperty(formValues, 'equTypeId');
+ }
+ return await listInventoryDetail({
+ pageNum: page.currentPage,
+ pageSize: page.pageSize,
+ ...formValues
+ });
+ }
+ }
+ },
+ rowConfig: {
+ isHover: true,
+ keyField: 'id'
+ },
+ sortConfig: {
+ // 杩滅▼鎺掑簭
+ remote: true,
+ // 鏀寔澶氬瓧娈垫帓搴� 榛樿鍏抽棴
+ multiple: true
+ },
+ id: 'eims-inventory-detail-index'
+};
+
+const [BasicTable, tableApi] = useVbenVxeGrid({
+ formOptions,
+ gridOptions,
+ gridEvents: {
+ sortChange: (sortParams) => vxeSortEvent(tableApi, sortParams)
+ }
+});
+
+const [EquDrawer, equDrawerApi] = useVbenDrawer({
+ connectedComponent: equDrawer
+});
+
+function handleAdd() {
+ equDrawerApi.setData({});
+ equDrawerApi.open();
+}
+
+async function handleEdit(record: Recordable<any>) {
+ equDrawerApi.setData({ id: record.equId });
+ equDrawerApi.open();
+}
+
+async function handleDelete(row: Recordable<any>) {
+ await delInventoryDetail(row.id);
+ await tableApi.query();
+}
+
+function handleMultiDelete() {
+ const rows = tableApi.grid.getCheckboxRecords();
+ const ids = rows.map((row: any) => row.id);
+ Modal.confirm({
+ title: '鎻愮ず',
+ okType: 'danger',
+ content: `纭鍒犻櫎閫変腑鐨�${ids.length}鏉¤褰曞悧锛焋,
+ onOk: async () => {
+ await delInventoryDetail(ids);
+ await tableApi.query();
+ }
+ });
+}
+
+function handleDownloadExcel() {
+ commonDownloadExcel(inventoryDetailExport, '鐩樼偣鏄庣粏', tableApi.formApi.form.values, {
+ fieldMappingTime: formOptions.fieldMappingTime
+ });
+}
+
+function getImportStatus(row: any) {
+ const importStatus = row.importStatus === null || row.importStatus;
+ return importStatus ? '鏈鍏�' : '宸插鍏�';
+}
+
+function getInventoryFlag(row: any) {
+ const inventoryFlag = row.inventoryFlag === null || row.inventoryFlag;
+ return inventoryFlag ? '鏈洏鐐�' : '宸茬洏鐐�';
+}
+
+const router = useRouter();
+function handleDetail(record: Recordable<any>) {
+ router.push(`/equ/detail/${record.id}`);
+}
+</script>
+
+<template>
+ <Page :auto-content-height="true">
+ <div class="flex h-full gap-[8px]">
+ <EquTypeTree v-model:select-dept-id="selectTypeId" class="w-[260px]" @reload="() => tableApi.reload()" @select="() => tableApi.reload()" />
+ <BasicTable class="flex-1 overflow-hidden" table-title="鐩樼偣鏄庣粏鍒楄〃">
+ <template #toolbar-tools>
+ <Space>
+ <a-button v-access:code="['eims:inventory:export']" @click="handleDownloadExcel">
+ {{ $t('pages.common.export') }}
+ </a-button>
+ <a-button :disabled="!vxeCheckboxChecked(tableApi)" danger type="primary" v-access:code="['eims:inventory:remove']" @click="handleMultiDelete">
+ {{ $t('pages.common.delete') }}
+ </a-button>
+ <a-button type="primary" v-access:code="['eims:inventory:add']" @click="handleAdd">
+ {{ $t('pages.common.add') }}
+ </a-button>
+ </Space>
+ </template>
+
+ <template #equName="{ row }">
+ <Space>
+ <a-button type="link" @click="handleDetail(row)"> {{ row.equName }}</a-button>
+ </Space>
+ </template>
+
+ <template #action="{ row }">
+ <Space>
+ <ghost-button v-access:code="['eims:inventory:edit']" @click.stop="handleEdit(row)">
+ {{ $t('pages.common.edit') }}
+ </ghost-button>
+ <ghost-button v-if="row.menuType !== 'F'" class="btn-success" v-access:code="['eims:inventory:list']" @click="handleDetail(row)">
+ {{ $t('pages.common.info') }}
+ </ghost-button>
+ <Popconfirm :get-popup-container="getVxePopupContainer" placement="left" title="纭鍒犻櫎锛�" @confirm="handleDelete(row)">
+ <ghost-button danger v-access:code="['eims:inventory:remove']" @click.stop="">
+ {{ $t('pages.common.delete') }}
+ </ghost-button>
+ </Popconfirm>
+ </Space>
+ </template>
+
+ <template #importStatus="{ row }">
+ <span>{{ getImportStatus(row) }}</span>
+ </template>
+
+ <template #inventoryFlag="{ row }">
+ <span>{{ getInventoryFlag(row) }}</span>
+ </template>
+ </BasicTable>
+ </div>
+ <EquDrawer @reload="tableApi.query()" />
+ </Page>
+</template>
diff --git a/eims-ui/apps/web-antd/src/views/eims/inventory/data.tsx b/eims-ui/apps/web-antd/src/views/eims/inventory/data.tsx
new file mode 100644
index 0000000..b343ba0
--- /dev/null
+++ b/eims-ui/apps/web-antd/src/views/eims/inventory/data.tsx
@@ -0,0 +1,211 @@
+import type { VxeGridProps } from '#/adapter/vxe-table';
+
+import { DictEnum } from '@vben/constants';
+import { getPopupContainer } from '@vben/utils';
+
+import { Badge } from 'ant-design-vue';
+
+import { type FormSchemaGetter } from '#/adapter/form';
+import { getDictOptions } from '#/utils/dict';
+
+export const querySchema: FormSchemaGetter = () => [
+ {
+ component: 'Input',
+ fieldName: 'inventoryName',
+ label: '鐩樼偣鍚嶇О'
+ },
+ {
+ component: 'Input',
+ fieldName: 'inventoryCode',
+ label: '鐩樼偣鍗曞彿'
+ },
+ {
+ component: 'TreeSelect',
+ // 鍦╠rawer閲屾洿鏂� 杩欓噷涓嶉渶瑕侀粯璁ょ殑componentProps
+ defaultValue: undefined,
+ fieldName: 'userDept',
+ label: '鐩樼偣閮ㄩ棬',
+ help: `鐩樼偣鎿嶄綔浜哄憳鎵�灞為儴闂╜
+ // rules: 'selectRequired',
+ },
+ {
+ component: 'Select',
+ componentProps: {
+ showSearch: true,
+ allowClear: true,
+ getPopupContainer
+ },
+ fieldName: 'inventoryUser',
+ label: '鐩樼偣浜�'
+ },
+ {
+ component: 'RangePicker',
+ fieldName: 'startDate',
+ label: '鐩樼偣鏃ユ湡',
+ help: '寮�濮嬬洏鐐规棩鏈�'
+ }
+];
+
+export const columns: VxeGridProps['columns'] = [
+ { type: 'checkbox', width: 60, fixed: 'left' },
+ {
+ title: '鐩樼偣鍚嶇О',
+ field: 'inventoryName',
+ minWidth: 100
+ },
+ {
+ title: '鐩樼偣鍗曞彿',
+ field: 'inventoryCode',
+ minWidth: 100,
+ slots: { default: 'inventoryCode' }
+ },
+ {
+ title: '鐩樼偣鐘舵��',
+ field: 'status',
+ minWidth: 100,
+ slots: {
+ default: ({ row }) => {
+ const statu = row.status;
+ switch (statu) {
+ case '0': {
+ return <Badge status="processing" text="鐩樼偣涓�" />;
+ }
+ case '1': {
+ return <Badge status="success" text="鐩樼偣缁撴潫" />;
+ }
+ case null: {
+ return <Badge status="processing" text="鐩樼偣涓�" />;
+ }
+ // No default
+ }
+ return '';
+ }
+ }
+ },
+ {
+ title: '寮�濮嬫棩鏈�',
+ field: 'startDate',
+ sortable: true,
+ minWidth: 120
+ },
+ {
+ title: '缁撴潫鏃ユ湡',
+ field: 'endDate',
+ sortable: true,
+ minWidth: 120
+ },
+ {
+ title: '鐩樼偣浜�',
+ field: 'inventoryUserName',
+ minWidth: 100
+ },
+ {
+ field: 'action',
+ fixed: 'right',
+ slots: { default: 'action' },
+ title: '鎿嶄綔',
+ width: 200
+ }
+];
+
+export const drawerSchema: FormSchemaGetter = () => [
+ {
+ component: 'Input',
+ dependencies: {
+ show: () => false,
+ triggerFields: ['']
+ },
+ fieldName: 'inventoryId'
+ },
+ {
+ component: 'Input',
+ fieldName: 'inventoryName',
+ label: '鐩樼偣鍚嶇О'
+ },
+ {
+ component: 'Input',
+ fieldName: 'inventoryCode',
+ label: '鐩樼偣鍗曞彿'
+ },
+ {
+ component: 'Radio',
+ dependencies: {
+ show: () => false,
+ triggerFields: [''],
+ },
+ fieldName: 'checkStrictly',
+ label: '鐖跺瓙鑱斿姩'
+ },
+ {
+ component: 'Input',
+ defaultValue: [],
+ fieldName: 'equTypesList',
+ label: '璁惧绫诲瀷',
+ help: `璁惧绫诲瀷鐣欑┖涓嶅嬀閫夛紝绯荤粺榛樿鐩樼偣鍏ㄩ儴`,
+ formItemClass: 'col-span-2',
+ },
+ {
+ component: 'Select',
+ componentProps: {
+ getPopupContainer,
+ mode: 'multiple',
+ optionFilterProp: 'label',
+ options: getDictOptions(DictEnum.SYS_EQU_STATUS),
+ },
+ fieldName: 'equStatusList',
+ label: '浣跨敤鐘舵��',
+ help: `浣跨敤鐘舵�佺暀绌轰笉鍕鹃�夛紝绯荤粺榛樿鐩樼偣鍏ㄩ儴`,
+ },
+ {
+ component: 'RadioGroup',
+ componentProps: {
+ buttonStyle: 'solid',
+ options: getDictOptions(DictEnum.EIMS_INVENTORY_STATU),
+ optionType: 'button'
+ },
+ defaultValue: '0',
+ fieldName: 'status',
+ label: '鐘舵��'
+ },
+ {
+ component: 'DatePicker',
+ componentProps: {
+ format: 'YYYY-MM-DD',
+ showTime: false,
+ valueFormat: 'YYYY-MM-DD',
+ getPopupContainer
+ },
+ fieldName: 'startDate',
+ label: '寮�濮嬫棩鏈�'
+ },
+ {
+ component: 'DatePicker',
+ componentProps: {
+ format: 'YYYY-MM-DD',
+ showTime: false,
+ valueFormat: 'YYYY-MM-DD',
+ getPopupContainer
+ },
+ fieldName: 'endDate',
+ label: '缁撴潫鏃ユ湡'
+ },
+ {
+ component: 'TreeSelect',
+ // 鍦╠rawer閲屾洿鏂� 杩欓噷涓嶉渶瑕侀粯璁ょ殑componentProps
+ defaultValue: undefined,
+ fieldName: 'userDept',
+ label: '鐩樼偣浜洪儴闂�',
+ help: `鐩樼偣鎿嶄綔浜哄憳鎵�灞為儴闂╜
+ // rules: 'selectRequired',
+ },
+ {
+ component: 'Select',
+ componentProps: {
+ showSearch: true,
+ allowClear: true,
+ getPopupContainer
+ },
+ fieldName: 'inventoryUser',
+ label: '鐩樼偣浜�'
+ }
+];
diff --git a/eims-ui/apps/web-antd/src/views/eims/inventory/index.vue b/eims-ui/apps/web-antd/src/views/eims/inventory/index.vue
new file mode 100644
index 0000000..edfcb99
--- /dev/null
+++ b/eims-ui/apps/web-antd/src/views/eims/inventory/index.vue
@@ -0,0 +1,242 @@
+<script setup lang="ts">
+import type { Recordable } from '@vben/types';
+
+import { onMounted } from 'vue';
+import { useRouter } from 'vue-router';
+
+import { Page, useVbenDrawer, type VbenFormProps } from '@vben/common-ui';
+import { $t } from '@vben/locales';
+import { addFullName, getPopupContainer, getVxePopupContainer } from '@vben/utils';
+
+import { Modal, Popconfirm, Space } from 'ant-design-vue';
+
+import { useVbenVxeGrid, vxeCheckboxChecked, type VxeGridProps, vxeSortEvent } from '#/adapter/vxe-table';
+import { delInventory, inventoryExport, listInventory } from '#/api/eims/inventory';
+import { getDeptTree, userList } from '#/api/system/user';
+import { commonDownloadExcel } from '#/utils/file/download';
+
+import { columns, querySchema } from './data';
+import inventoryDrawer from './inventory-drawer.vue';
+
+const formOptions: VbenFormProps = {
+ commonConfig: {
+ labelWidth: 80,
+ componentProps: {
+ allowClear: true
+ }
+ },
+ schema: querySchema(),
+ wrapperClass: 'grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4',
+ // 鏃ユ湡閫夋嫨鏍煎紡鍖�
+ fieldMappingTime: [['startDate', ['params[beginStartDate]', 'params[endStartDate]'], ['YYYY-MM-DD', 'YYYY-MM-DD']]]
+};
+
+const gridOptions: VxeGridProps = {
+ checkboxConfig: {
+ // 楂樹寒
+ highlight: true,
+ // 缈婚〉鏃朵繚鐣欓�変腑鐘舵��
+ reserve: true
+ // 鐐瑰嚮琛岄�変腑
+ // trigger: 'row'
+ },
+ columns,
+ height: 'auto',
+ keepSource: true,
+ pagerConfig: {},
+ proxyConfig: {
+ ajax: {
+ query: async ({ page }, formValues = {}) => {
+ return await listInventory({
+ pageNum: page.currentPage,
+ pageSize: page.pageSize,
+ ...formValues
+ });
+ }
+ }
+ },
+ rowConfig: {
+ isHover: true,
+ keyField: 'inventoryId'
+ },
+ sortConfig: {
+ // 杩滅▼鎺掑簭
+ remote: true,
+ // 鏀寔澶氬瓧娈垫帓搴� 榛樿鍏抽棴
+ multiple: true
+ },
+ id: 'eims-inventory-index'
+};
+
+const [BasicTable, tableApi] = useVbenVxeGrid({
+ formOptions,
+ gridOptions,
+ gridEvents: {
+ sortChange: (sortParams) => vxeSortEvent(tableApi, sortParams)
+ }
+});
+
+const [InventoryDrawer, inventoryDrawerApi] = useVbenDrawer({
+ connectedComponent: inventoryDrawer
+});
+
+function handleAdd() {
+ inventoryDrawerApi.setData({});
+ inventoryDrawerApi.open();
+}
+
+async function handleEdit(record: Recordable<any>) {
+ inventoryDrawerApi.setData({ id: record.inventoryId });
+ inventoryDrawerApi.open();
+}
+
+async function handleDelete(row: Recordable<any>) {
+ await delInventory(row.inventoryId);
+ await tableApi.query();
+}
+
+function handleMultiDelete() {
+ const rows = tableApi.grid.getCheckboxRecords();
+ const ids = rows.map((row: any) => row.inventoryId);
+ Modal.confirm({
+ title: '鎻愮ず',
+ okType: 'danger',
+ content: `纭鍒犻櫎閫変腑鐨�${ids.length}鏉¤褰曞悧锛焋,
+ onOk: async () => {
+ await delInventory(ids);
+ await tableApi.query();
+ }
+ });
+}
+
+function handleDownloadExcel() {
+ commonDownloadExcel(inventoryExport, '璁惧鐩樼偣璁板綍', tableApi.formApi.form.values, {
+ fieldMappingTime: formOptions.fieldMappingTime
+ });
+}
+
+onMounted(async () => {
+ await setupDeptSelect();
+});
+
+/**
+ * 鐢ㄦ埛鐨勫姞杞�
+ */
+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: 'inventoryUser'
+ }
+ ]);
+}
+
+/**
+ * 鍒濆鍖栭儴闂ㄩ�夋嫨
+ */
+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.respPerson = undefined;
+ },
+ placeholder: '璇烽�夋嫨',
+ showSearch: true,
+ treeData: deptTree,
+ treeDefaultExpandAll: true,
+ treeLine: { showLeafIcon: false },
+ // 绛涢�夌殑瀛楁
+ treeNodeFilterProp: 'label',
+ // 閫変腑鍚庢樉绀哄湪杈撳叆妗嗙殑鍊�
+ treeNodeLabelProp: 'fullName'
+ }),
+ fieldName: 'userDept'
+ }
+ ]);
+}
+
+const router = useRouter();
+function handleDetail(record: Recordable<any>) {
+ router.push(`/inventory/detail/${record.inventoryId}`);
+}
+
+</script>
+
+<template>
+ <Page :auto-content-height="true">
+ <div class="flex h-full gap-[8px]">
+ <BasicTable class="flex-1 overflow-hidden" table-title="璁惧鐩樼偣鍒楄〃">
+ <template #toolbar-tools>
+ <Space>
+ <a-button v-access:code="['eims:inventory:export']" @click="handleDownloadExcel">
+ {{ $t('pages.common.export') }}
+ </a-button>
+ <a-button
+ :disabled="!vxeCheckboxChecked(tableApi)"
+ danger
+ type="primary"
+ v-access:code="['eims:inventory:remove']"
+ @click="handleMultiDelete"
+ >
+ {{ $t('pages.common.delete') }}
+ </a-button>
+ <a-button type="primary" v-access:code="['eims:inventory:add']" @click="handleAdd">
+ {{ $t('pages.common.add') }}
+ </a-button>
+ </Space>
+ </template>
+
+ <template #inventoryCode="{ row }">
+ <Space>
+ <a-button type="link" @click="handleDetail(row)"> {{ row.inventoryCode }}</a-button>
+ </Space>
+ </template>
+
+ <template #action="{ row }">
+ <Space>
+ <ghost-button v-access:code="['eims:inventory: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:inventory:remove']" @click.stop="">
+ {{ $t('pages.common.delete') }}
+ </ghost-button>
+ </Popconfirm>
+ </Space>
+ </template>
+ </BasicTable>
+ </div>
+ <InventoryDrawer @reload="tableApi.query()" />
+ </Page>
+</template>
diff --git a/eims-ui/apps/web-antd/src/views/eims/inventory/inventory-drawer.vue b/eims-ui/apps/web-antd/src/views/eims/inventory/inventory-drawer.vue
new file mode 100644
index 0000000..5851a2b
--- /dev/null
+++ b/eims-ui/apps/web-antd/src/views/eims/inventory/inventory-drawer.vue
@@ -0,0 +1,221 @@
+<script setup lang="ts">
+import { computed, ref } from 'vue';
+
+import { useVbenDrawer } from '@vben/common-ui';
+import { $t } from '@vben/locales';
+import { addFullName, cloneDeep, getPopupContainer, listToTree } from '@vben/utils';
+
+import { useVbenForm } from '#/adapter/form';
+import { listEquType } from '#/api/eims/equ-type';
+import { addInventory, getInventory, updateInventory } from '#/api/eims/inventory';
+import { getDeptTree, userList } from '#/api/system/user';
+import { TreeSelectPanel } from '#/components/tree';
+
+import { drawerSchema } from './data';
+
+const emit = defineEmits<{ reload: [] }>();
+
+const isUpdate = ref(false);
+const title = computed(() => {
+ return isUpdate.value ? $t('pages.common.edit') : $t('pages.common.add');
+});
+
+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;
+ // 鍒濆鍖�
+ await setupDeptSelect();
+ await setupEquTypeSelect();
+
+ formApi.updateSchema([
+ {
+ dependencies: {
+ show: () => !isUpdate.value,
+ triggerFields: ['']
+ },
+ fieldName: 'equTypesList'
+ },
+ {
+ dependencies: {
+ show: () => !isUpdate.value,
+ triggerFields: ['']
+ },
+ fieldName: 'equStatusList'
+ }
+ ]);
+ // 鏇存柊 && 璧嬪��
+ if (isUpdate.value && id) {
+ const record = await getInventory(id);
+ await formApi.setValues(record);
+ // 鏇存柊鏃朵笉鍙慨鏀圭洏鐐硅寖鍥�
+ if (isUpdate.value && record.userDept) {
+ await setupUserOptions(record.userDept);
+ }
+ }
+
+ drawerApi.drawerLoading(false);
+ }
+});
+
+/**
+ * 鍔犺浇璁惧绫绘爲
+ */
+const equTypeTree = ref();
+async function setupEquTypeSelect() {
+ const result = (await listEquType()) || [];
+ // 鏋勫缓缁勪欢闇�瑕佹暟鎹�
+ const equArray = result.map((item) => {
+ return {
+ ...item, // 淇濈暀鍘熸湁瀵硅薄鐨勬墍鏈夊睘鎬�
+ id: item.equTypeId,
+ label: item.typeName,
+ weight: item.orderNum
+ };
+ });
+ // support i18n
+ equArray.forEach((item) => {
+ item.typeName = $t(item.typeName);
+ });
+ const equTree = listToTree(equArray, { id: 'id', pid: 'parentId' });
+ equTypeTree.value = equTree;
+}
+
+/**
+ * 鐢ㄦ埛鐨勫姞杞�
+ */
+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 ? '璇烽�夋嫨' : '璇ラ儴闂ㄤ笅鏆傛棤鐢ㄦ埛';
+ formApi.updateSchema([
+ {
+ componentProps: { options, placeholder, filterOption },
+ fieldName: 'inventoryUser'
+ }
+ ]);
+}
+
+/**
+ * 鍒濆鍖栭儴闂ㄩ�夋嫨
+ */
+async function setupDeptSelect() {
+ // updateSchema
+ const deptTree = await getDeptTree();
+ // 閫変腑鍚庢樉绀哄湪杈撳叆妗嗙殑鍊� 鍗崇埗鑺傜偣 / 瀛愯妭鐐�
+ addFullName(deptTree, 'label', ' / ');
+ 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.respPerson = undefined;
+ },
+ placeholder: '璇烽�夋嫨',
+ showSearch: true,
+ treeData: deptTree,
+ treeDefaultExpandAll: true,
+ treeLine: { showLeafIcon: false },
+ // 绛涢�夌殑瀛楁
+ treeNodeFilterProp: 'label',
+ // 閫変腑鍚庢樉绀哄湪杈撳叆妗嗙殑鍊�
+ treeNodeLabelProp: 'fullName'
+ }),
+ fieldName: 'userDept'
+ }
+ ]);
+}
+/**
+ * 閫氳繃鍥炶皟鏇存柊 鏃犳硶閫氳繃v-model
+ * @param value 鑿滃崟閫夋嫨鏄惁涓ユ牸妯″紡
+ */
+function handleCheckStrictlyChange(value: boolean) {
+ formApi.setFieldValue('checkStrictly', value);
+}
+
+const equTypeSelectRef = ref();
+async function handleConfirm() {
+ try {
+ drawerApi.drawerLoading(true);
+ const { valid } = await formApi.validate();
+ if (!valid) {
+ return;
+ }
+ // 杩欎釜鐢ㄤ簬鎻愪氦
+ const equTypes = equTypeSelectRef.value?.[0]?.getCheckedKeys() ?? [];
+ const data = cloneDeep(await formApi.getValues());
+ data.equTypes = equTypes;
+ await (isUpdate.value ? updateInventory(data) : addInventory(data));
+ emit('reload');
+ await handleCancel();
+ } catch (error) {
+ console.error(error);
+ } finally {
+ drawerApi.drawerLoading(false);
+ }
+}
+
+async function handleCancel() {
+ drawerApi.close();
+ await formApi.resetForm();
+}
+</script>
+
+<template>
+ <BasicDrawer :close-on-click-modal="false" :title="title" class="w-[600px]">
+ <BasicForm>
+ <template #equTypesList="slotProps">
+ <!-- check-strictly涓簉eadonly 涓嶈兘閫氳繃v-model缁戝畾 -->
+ <TreeSelectPanel
+ ref="equTypeSelectRef"
+ :disabled="true"
+ v-bind="slotProps"
+ :check-strictly="formApi.form.values.checkStrictly"
+ :tree-data="equTypeTree"
+ @check-strictly-change="handleCheckStrictlyChange"
+ />
+ </template>
+ </BasicForm>
+ </BasicDrawer>
+</template>
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 e3d5740..bcad996 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
@@ -1,4 +1,6 @@
export enum DictEnum {
+ EIMS_INVENTORY_STATU = 'inventory_statu', // 璁惧鐩樼偣鐘舵��
+ EIMS_INVENTORY_DETAIL_STATU = 'inventory_detail_statu', // 璁惧鐩樼偣鐘舵��
SYS_COMMON_STATUS = 'sys_common_status',
SYS_DEVICE_TYPE = 'sys_device_type', // 璁惧绫诲瀷
SYS_EQU_STATUS = 'sys_equ_status', // 璁惧鐘舵��
@@ -13,5 +15,5 @@
SYS_YES_NO = 'sys_yes_no', // 鏄惁
WF_BUSINESS_STATUS = 'wf_business_status', // 涓氬姟鐘舵��
- WF_FORM_TYPE = 'wf_form_type', // 琛ㄥ崟绫诲瀷
+ WF_FORM_TYPE = 'wf_form_type' // 琛ㄥ崟绫诲瀷
}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/controller/EimsInventoryController.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/controller/EimsInventoryController.java
new file mode 100644
index 0000000..d39f28c
--- /dev/null
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/controller/EimsInventoryController.java
@@ -0,0 +1,105 @@
+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.EimsInventoryVo;
+import org.dromara.eims.domain.bo.EimsInventoryBo;
+import org.dromara.eims.service.IEimsInventoryService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 鐩樼偣
+ *
+ * @author zhuguifei
+ * @date 2025-01-16
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/eims/inventory")
+public class EimsInventoryController extends BaseController {
+
+ private final IEimsInventoryService eimsInventoryService;
+
+ /**
+ * 鏌ヨ鐩樼偣鍒楄〃
+ */
+ @SaCheckPermission("eims:inventory:list")
+ @GetMapping("/list")
+ public TableDataInfo<EimsInventoryVo> list(EimsInventoryBo bo, PageQuery pageQuery) {
+ return eimsInventoryService.queryPageList(bo, pageQuery);
+ }
+
+ /**
+ * 瀵煎嚭鐩樼偣鍒楄〃
+ */
+ @SaCheckPermission("eims:inventory:export")
+ @Log(title = "鐩樼偣", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(EimsInventoryBo bo, HttpServletResponse response) {
+ List<EimsInventoryVo> list = eimsInventoryService.queryList(bo);
+ ExcelUtil.exportExcel(list, "鐩樼偣", EimsInventoryVo.class, response);
+ }
+
+ /**
+ * 鑾峰彇鐩樼偣璇︾粏淇℃伅
+ *
+ * @param inventoryId 涓婚敭
+ */
+ @SaCheckPermission("eims:inventory:query")
+ @GetMapping("/{inventoryId}")
+ public R<EimsInventoryVo> getInfo(@NotNull(message = "涓婚敭涓嶈兘涓虹┖")
+ @PathVariable Long inventoryId) {
+ return R.ok(eimsInventoryService.queryById(inventoryId));
+ }
+
+ /**
+ * 鏂板鐩樼偣
+ */
+ @SaCheckPermission("eims:inventory:add")
+ @Log(title = "鐩樼偣", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping()
+ public R<Void> add(@Validated(AddGroup.class) @RequestBody EimsInventoryBo bo) {
+ return toAjax(eimsInventoryService.insertByBo(bo));
+ }
+
+ /**
+ * 淇敼鐩樼偣
+ */
+ @SaCheckPermission("eims:inventory:edit")
+ @Log(title = "鐩樼偣", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PutMapping()
+ public R<Void> edit(@Validated(EditGroup.class) @RequestBody EimsInventoryBo bo) {
+ return toAjax(eimsInventoryService.updateByBo(bo));
+ }
+
+ /**
+ * 鍒犻櫎鐩樼偣
+ *
+ * @param inventoryIds 涓婚敭涓�
+ */
+ @SaCheckPermission("eims:inventory:remove")
+ @Log(title = "鐩樼偣", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{inventoryIds}")
+ public R<Void> remove(@NotEmpty(message = "涓婚敭涓嶈兘涓虹┖")
+ @PathVariable Long[] inventoryIds) {
+ return toAjax(eimsInventoryService.deleteWithValidByIds(List.of(inventoryIds), true));
+ }
+}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/controller/EimsInventoryDetailController.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/controller/EimsInventoryDetailController.java
new file mode 100644
index 0000000..cddc0b9
--- /dev/null
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/controller/EimsInventoryDetailController.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.EimsInventoryDetailVo;
+import org.dromara.eims.domain.bo.EimsInventoryDetailBo;
+import org.dromara.eims.service.IEimsInventoryDetailService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 鐩樼偣鏄庣粏
+ *
+ * @author zhuguifei
+ * @date 2025-02-06
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/eims/inventoryDetail")
+public class EimsInventoryDetailController extends BaseController {
+
+ private final IEimsInventoryDetailService eimsInventoryDetailService;
+
+ /**
+ * 鏌ヨ鐩樼偣鏄庣粏鍒楄〃
+ */
+ @SaCheckPermission("eims:inventoryDetail:list")
+ @GetMapping("/list")
+ public TableDataInfo<EimsInventoryDetailVo> list(EimsInventoryDetailBo bo, PageQuery pageQuery) {
+ //return eimsInventoryDetailService.queryPageList(bo, pageQuery);
+ return eimsInventoryDetailService.queryPageListCustom(bo, pageQuery);
+ }
+
+ /**
+ * 瀵煎嚭鐩樼偣鏄庣粏鍒楄〃
+ */
+ @SaCheckPermission("eims:inventoryDetail:export")
+ @Log(title = "鐩樼偣鏄庣粏", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(EimsInventoryDetailBo bo, HttpServletResponse response) {
+ List<EimsInventoryDetailVo> list = eimsInventoryDetailService.queryList(bo);
+ ExcelUtil.exportExcel(list, "鐩樼偣鏄庣粏", EimsInventoryDetailVo.class, response);
+ }
+
+ /**
+ * 鑾峰彇鐩樼偣鏄庣粏璇︾粏淇℃伅
+ *
+ * @param id 涓婚敭
+ */
+ @SaCheckPermission("eims:inventoryDetail:query")
+ @GetMapping("/{id}")
+ public R<EimsInventoryDetailVo> getInfo(@NotNull(message = "涓婚敭涓嶈兘涓虹┖")
+ @PathVariable Long id) {
+ return R.ok(eimsInventoryDetailService.queryById(id));
+ }
+
+ /**
+ * 鏂板鐩樼偣鏄庣粏
+ */
+ @SaCheckPermission("eims:inventoryDetail:add")
+ @Log(title = "鐩樼偣鏄庣粏", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping()
+ public R<Void> add(@Validated(AddGroup.class) @RequestBody EimsInventoryDetailBo bo) {
+ return toAjax(eimsInventoryDetailService.insertByBo(bo));
+ }
+
+ /**
+ * 淇敼鐩樼偣鏄庣粏
+ */
+ @SaCheckPermission("eims:inventoryDetail:edit")
+ @Log(title = "鐩樼偣鏄庣粏", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PutMapping()
+ public R<Void> edit(@Validated(EditGroup.class) @RequestBody EimsInventoryDetailBo bo) {
+ return toAjax(eimsInventoryDetailService.updateByBo(bo));
+ }
+
+ /**
+ * 鍒犻櫎鐩樼偣鏄庣粏
+ *
+ * @param ids 涓婚敭涓�
+ */
+ @SaCheckPermission("eims:inventoryDetail:remove")
+ @Log(title = "鐩樼偣鏄庣粏", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public R<Void> remove(@NotEmpty(message = "涓婚敭涓嶈兘涓虹┖")
+ @PathVariable Long[] ids) {
+ return toAjax(eimsInventoryDetailService.deleteWithValidByIds(List.of(ids), true));
+ }
+}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/EimsInventory.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/EimsInventory.java
new file mode 100644
index 0000000..b19d44a
--- /dev/null
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/EimsInventory.java
@@ -0,0 +1,83 @@
+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_inventory
+ *
+ * @author zhuguifei
+ * @date 2025-01-16
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("eims_inventory")
+public class EimsInventory extends BaseEntity {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 鐩樼偣id
+ */
+ @TableId(value = "inventory_id")
+ private Long inventoryId;
+
+ /**
+ * 鐩樼偣鍗曞彿
+ */
+ private String inventoryCode;
+
+ /**
+ * 鐩樼偣鍚嶇О
+ */
+ private String inventoryName;
+ /**
+ * 鐩樼偣鑼冨洿-璁惧绫诲瀷锛堣澶囩被鍨媔d-閫楀彿闅斿紑锛�
+ */
+ private String equTypes;
+ /**
+ * 鐩樼偣鑼冨洿-璁惧鐘舵�侊紙璁惧鐘舵��-瀛楀吀锛�
+ */
+ private String equStatus;
+
+ /**
+ * 鐩樼偣浜�
+ */
+ private Long inventoryUser;
+
+ /**
+ * 鐩樼偣浜洪儴闂�
+ */
+ private Long userDept;
+
+ /**
+ * 寮�濮嬫棩鏈�
+ */
+ @JsonFormat(pattern = "yyyy-MM-dd")
+ private Date startDate;
+
+ /**
+ * 缁撴潫鏃ユ湡
+ */
+ @JsonFormat(pattern = "yyyy-MM-dd")
+ private Date endDate;
+
+ /**
+ * 鐩樼偣鐘舵��
+ */
+ private String status;
+
+ /**
+ * 澶囨敞
+ */
+ private String remark;
+
+
+}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/EimsInventoryDetail.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/EimsInventoryDetail.java
new file mode 100644
index 0000000..d2efded
--- /dev/null
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/EimsInventoryDetail.java
@@ -0,0 +1,51 @@
+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.io.Serial;
+
+/**
+ * 鐩樼偣鏄庣粏瀵硅薄 eims_inventory_detail
+ *
+ * @author zhuguifei
+ * @date 2025-02-06
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("eims_inventory_detail")
+public class EimsInventoryDetail extends BaseEntity {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ *
+ */
+ @TableId(value = "id")
+ private Long id;
+
+ /**
+ * 鐩樼偣id
+ */
+ private Long inventoryId;
+
+ /**
+ * 璁惧id
+ */
+ private Long equId;
+
+ /**
+ * 鐩樼偣缁撴灉
+ */
+ private String status;
+
+ /**
+ * 澶囨敞
+ */
+ private String remark;
+
+
+}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsInventoryBo.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsInventoryBo.java
new file mode 100644
index 0000000..bd4f5d2
--- /dev/null
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsInventoryBo.java
@@ -0,0 +1,91 @@
+package org.dromara.eims.domain.bo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.fasterxml.jackson.annotation.JsonFormat;
+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 java.util.List;
+
+import org.dromara.eims.domain.EimsInventory;
+
+/**
+ * 鐩樼偣涓氬姟瀵硅薄 eims_inventory
+ *
+ * @author zhuguifei
+ * @date 2025-01-16
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = EimsInventory.class, reverseConvertGenerate = false)
+public class EimsInventoryBo extends BaseEntity {
+
+ /**
+ * 鐩樼偣id
+ */
+ @NotNull(message = "鐩樼偣id涓嶈兘涓虹┖", groups = { EditGroup.class })
+ private Long inventoryId;
+
+ /**
+ * 鐩樼偣鍗曞彿
+ */
+ @NotBlank(message = "鐩樼偣鍗曞彿涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+ private String inventoryCode;
+
+ /**
+ * 鐩樼偣鍚嶇О
+ */
+ @NotBlank(message = "鐩樼偣鍚嶇О涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+ private String inventoryName;
+ /**
+ * 鐩樼偣鑼冨洿-璁惧绫诲瀷锛堣澶囩被鍨媔d-閫楀彿闅斿紑锛�
+ */
+ private List<String> equTypesList;
+ /**
+ * 鐩樼偣鑼冨洿-璁惧鐘舵�侊紙璁惧鐘舵��-瀛楀吀锛�
+ */
+ private List<String> equStatusList;
+
+ /**
+ * 鐩樼偣浜�
+ */
+ @NotNull(message = "鐩樼偣浜轰笉鑳戒负绌�", groups = { AddGroup.class, EditGroup.class })
+ private Long inventoryUser;
+
+
+ /**
+ * 鐩樼偣浜洪儴闂�
+ */
+ private Long userDept;
+
+ /**
+ * 寮�濮嬫棩鏈�
+ */
+ @NotNull(message = "寮�濮嬫棩鏈熶笉鑳戒负绌�", groups = { AddGroup.class, EditGroup.class })
+ @JsonFormat(pattern = "yyyy-MM-dd")
+ private Date startDate;
+
+ /**
+ * 缁撴潫鏃ユ湡
+ */
+ @NotNull(message = "缁撴潫鏃ユ湡涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+ @JsonFormat(pattern = "yyyy-MM-dd")
+ private Date endDate;
+
+ /**
+ * 鐩樼偣鐘舵��
+ */
+ private String status;
+
+ /**
+ * 澶囨敞
+ */
+ private String remark;
+
+
+}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsInventoryDetailBo.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsInventoryDetailBo.java
new file mode 100644
index 0000000..0d454c2
--- /dev/null
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsInventoryDetailBo.java
@@ -0,0 +1,70 @@
+package org.dromara.eims.domain.bo;
+
+import org.dromara.eims.domain.EimsInventoryDetail;
+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.*;
+
+/**
+ * 鐩樼偣鏄庣粏涓氬姟瀵硅薄 eims_inventory_detail
+ *
+ * @author zhuguifei
+ * @date 2025-02-06
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = EimsInventoryDetail.class, reverseConvertGenerate = false)
+public class EimsInventoryDetailBo extends BaseEntity {
+
+ /**
+ *
+ */
+ @NotNull(message = "涓嶈兘涓虹┖", groups = { EditGroup.class })
+ private Long id;
+
+ /**
+ * 鐩樼偣id
+ */
+ @NotNull(message = "鐩樼偣id涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+ private Long inventoryId;
+
+ /**
+ * 璁惧id
+ */
+ @NotNull(message = "璁惧id涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+ private Long equId;
+
+ /**
+ * 鐩樼偣缁撴灉
+ */
+ @NotBlank(message = "鐩樼偣缁撴灉涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+ private String status;
+
+ /**
+ * 澶囨敞
+ */
+ private String remark;
+
+ //璁惧鍚嶇О
+ private String equName;
+ //璁惧缂栫爜
+ private String equCode;
+ //璁惧璧勪骇缂栧彿
+ private String equAssetNo;
+ //閮ㄩ棬鍚嶇О
+ private String deptName;
+ //璁惧绫诲瀷鍚嶇О
+ private String equTypeName;
+ //璁惧鎵�鍦ㄤ綅缃�
+ private String location;
+ //璁惧鐘舵��
+ private String equStatus;
+ //鐩樼偣浜�
+ private String inventoryUser;
+
+
+}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsInventoryDetailVo.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsInventoryDetailVo.java
new file mode 100644
index 0000000..bc47c9f
--- /dev/null
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsInventoryDetailVo.java
@@ -0,0 +1,79 @@
+package org.dromara.eims.domain.vo;
+
+import org.dromara.eims.domain.EimsInventoryDetail;
+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_inventory_detail
+ *
+ * @author zhuguifei
+ * @date 2025-02-06
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = EimsInventoryDetail.class)
+public class EimsInventoryDetailVo implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ *
+ */
+ @ExcelProperty(value = "")
+ private Long id;
+
+ /**
+ * 鐩樼偣id
+ */
+ @ExcelProperty(value = "鐩樼偣id")
+ private Long inventoryId;
+
+ /**
+ * 璁惧id
+ */
+ @ExcelProperty(value = "璁惧id")
+ private Long equId;
+
+ /**
+ * 鐩樼偣缁撴灉
+ */
+ @ExcelProperty(value = "鐩樼偣缁撴灉")
+ private String status;
+
+ /**
+ * 澶囨敞
+ */
+ @ExcelProperty(value = "澶囨敞")
+ private String remark;
+ //璁惧鍚嶇О
+ private String equName;
+ //璁惧缂栫爜
+ private String equCode;
+ //璁惧璧勪骇缂栧彿
+ private String equAssetNo;
+ //閮ㄩ棬鍚嶇О
+ private String deptName;
+ //璁惧绫诲瀷鍚嶇О
+ private String equTypeName;
+ //璁惧鎵�鍦ㄤ綅缃�
+ private String location;
+ //璁惧鐘舵��
+ private String equStatus;
+ //鐩樼偣浜�
+ private String inventoryUser;
+
+
+
+}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsInventoryVo.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsInventoryVo.java
new file mode 100644
index 0000000..87f8e66
--- /dev/null
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsInventoryVo.java
@@ -0,0 +1,113 @@
+package org.dromara.eims.domain.vo;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+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 org.dromara.common.translation.annotation.Translation;
+import org.dromara.common.translation.constant.TransConstant;
+import org.dromara.eims.domain.EimsInventory;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+
+/**
+ * 鐩樼偣瑙嗗浘瀵硅薄 eims_inventory
+ *
+ * @author zhuguifei
+ * @date 2025-01-16
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = EimsInventory.class)
+public class EimsInventoryVo implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 鐩樼偣id
+ */
+ @ExcelProperty(value = "鐩樼偣id")
+ private Long inventoryId;
+
+ /**
+ * 鐩樼偣鍗曞彿
+ */
+ @ExcelProperty(value = "鐩樼偣鍗曞彿")
+ private String inventoryCode;
+
+ /**
+ * 鐩樼偣鍚嶇О
+ */
+ @ExcelProperty(value = "鐩樼偣鍚嶇О")
+ private String inventoryName;
+ /**
+ * 鐩樼偣鑼冨洿-璁惧绫诲瀷锛堣澶囩被鍨媔d-閫楀彿闅斿紑锛�
+ */
+ @ExcelProperty(value = "鐩樼偣鑼冨洿-璁惧绫诲瀷")
+ private String equTypes;
+ /**
+ * 鐩樼偣鑼冨洿-璁惧鐘舵�侊紙璁惧鐘舵��-瀛楀吀锛�
+ */
+ @ExcelProperty(value = "鐩樼偣鑼冨洿-璁惧鐘舵��")
+ private String equStatus;
+ /**
+ * 鐩樼偣鑼冨洿-璁惧绫诲瀷锛堣澶囩被鍨媔d-閫楀彿闅斿紑锛�
+ */
+ private List<Long> equTypesList;
+ /**
+ * 鐩樼偣鑼冨洿-璁惧鐘舵�侊紙璁惧鐘舵��-瀛楀吀锛�
+ */
+ private List<String> equStatusList;
+
+ /**
+ * 鐩樼偣浜�
+ */
+ private Long inventoryUser;
+
+ @ExcelProperty(value = "鐩樼偣浜�")
+ @Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "inventoryUser")
+ private String inventoryUserName;
+
+ /**
+ * 鐩樼偣浜洪儴闂�
+ */
+ @ExcelProperty(value = "鐩樼偣浜洪儴闂�")
+ private Long userDept;
+
+ /**
+ * 寮�濮嬫棩鏈�
+ */
+ @ExcelProperty(value = "寮�濮嬫棩鏈�")
+ @JsonFormat(pattern = "yyyy-MM-dd")
+ private Date startDate;
+
+ /**
+ * 缁撴潫鏃ユ湡
+ */
+ @ExcelProperty(value = "缁撴潫鏃ユ湡")
+ @JsonFormat(pattern = "yyyy-MM-dd")
+ private Date endDate;
+
+ /**
+ * 鐩樼偣鐘舵��
+ */
+ @ExcelProperty(value = "鐩樼偣鐘舵��")
+ private String status;
+
+ /**
+ * 澶囨敞
+ */
+ @ExcelProperty(value = "澶囨敞")
+ private String remark;
+
+
+}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/mapper/EimsInventoryDetailMapper.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/mapper/EimsInventoryDetailMapper.java
new file mode 100644
index 0000000..6823006
--- /dev/null
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/mapper/EimsInventoryDetailMapper.java
@@ -0,0 +1,23 @@
+package org.dromara.eims.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
+import org.dromara.eims.domain.EimsInventoryDetail;
+import org.dromara.eims.domain.bo.EimsInventoryDetailBo;
+import org.dromara.eims.domain.vo.EimsInventoryDetailVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+import java.util.List;
+
+/**
+ * 鐩樼偣鏄庣粏Mapper鎺ュ彛
+ *
+ * @author zhuguifei
+ * @date 2025-02-06
+ */
+public interface EimsInventoryDetailMapper extends BaseMapperPlus<EimsInventoryDetail, EimsInventoryDetailVo> {
+ Page<EimsInventoryDetailVo> selectInventoryDetailList(@Param("page") Page<EimsInventoryDetailVo> page, @Param(Constants.WRAPPER) Wrapper<EimsInventoryDetail> queryWrapper);
+
+}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/mapper/EimsInventoryMapper.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/mapper/EimsInventoryMapper.java
new file mode 100644
index 0000000..6076f12
--- /dev/null
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/mapper/EimsInventoryMapper.java
@@ -0,0 +1,16 @@
+package org.dromara.eims.mapper;
+
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.eims.domain.EimsInventory;
+import org.dromara.eims.domain.vo.EimsInventoryVo;
+
+/**
+ * 鐩樼偣Mapper鎺ュ彛
+ *
+ * @author zhuguifei
+ * @date 2025-01-16
+ */
+public interface EimsInventoryMapper extends BaseMapperPlus<EimsInventory, EimsInventoryVo> {
+
+}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/IEimsInventoryDetailService.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/IEimsInventoryDetailService.java
new file mode 100644
index 0000000..4bce1e8
--- /dev/null
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/IEimsInventoryDetailService.java
@@ -0,0 +1,71 @@
+package org.dromara.eims.service;
+
+import org.dromara.eims.domain.vo.EimsInventoryDetailVo;
+import org.dromara.eims.domain.bo.EimsInventoryDetailBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 鐩樼偣鏄庣粏Service鎺ュ彛
+ *
+ * @author zhuguifei
+ * @date 2025-02-06
+ */
+public interface IEimsInventoryDetailService {
+
+ /**
+ * 鏌ヨ鐩樼偣鏄庣粏
+ *
+ * @param id 涓婚敭
+ * @return 鐩樼偣鏄庣粏
+ */
+ EimsInventoryDetailVo queryById(Long id);
+
+
+ /**
+ * 鍒嗛〉鏌ヨ鐩樼偣鏄庣粏鍒楄〃-澶氳〃鏌ヨ
+ *
+ * @param bo 鏌ヨ鏉′欢
+ * @param pageQuery 鍒嗛〉鍙傛暟
+ * @return 鐩樼偣鏄庣粏鍒嗛〉鍒楄〃
+ */
+ TableDataInfo<EimsInventoryDetailVo> queryPageListCustom(EimsInventoryDetailBo bo, PageQuery pageQuery);
+
+ /**
+ * 鏌ヨ绗﹀悎鏉′欢鐨勭洏鐐规槑缁嗗垪琛�
+ *
+ * @param bo 鏌ヨ鏉′欢
+ * @return 鐩樼偣鏄庣粏鍒楄〃
+ */
+ List<EimsInventoryDetailVo> queryList(EimsInventoryDetailBo bo);
+
+ /**
+ * 鏂板鐩樼偣鏄庣粏
+ *
+ * @param bo 鐩樼偣鏄庣粏
+ * @return 鏄惁鏂板鎴愬姛
+ */
+ Boolean insertByBo(EimsInventoryDetailBo bo);
+
+ /**
+ * 淇敼鐩樼偣鏄庣粏
+ *
+ * @param bo 鐩樼偣鏄庣粏
+ * @return 鏄惁淇敼鎴愬姛
+ */
+ Boolean updateByBo(EimsInventoryDetailBo bo);
+
+ /**
+ * 鏍¢獙骞舵壒閲忓垹闄ょ洏鐐规槑缁嗕俊鎭�
+ *
+ * @param ids 寰呭垹闄ょ殑涓婚敭闆嗗悎
+ * @param isValid 鏄惁杩涜鏈夋晥鎬ф牎楠�
+ * @return 鏄惁鍒犻櫎鎴愬姛
+ */
+ Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+
+
+}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/IEimsInventoryService.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/IEimsInventoryService.java
new file mode 100644
index 0000000..823af5a
--- /dev/null
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/IEimsInventoryService.java
@@ -0,0 +1,67 @@
+package org.dromara.eims.service;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.eims.domain.bo.EimsInventoryBo;
+import org.dromara.eims.domain.vo.EimsInventoryVo;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 鐩樼偣Service鎺ュ彛
+ *
+ * @author zhuguifei
+ * @date 2025-01-16
+ */
+public interface IEimsInventoryService {
+
+ /**
+ * 鏌ヨ鐩樼偣
+ *
+ * @param inventoryId 涓婚敭
+ * @return 鐩樼偣
+ */
+ EimsInventoryVo queryById(Long inventoryId);
+
+ /**
+ * 鍒嗛〉鏌ヨ鐩樼偣鍒楄〃
+ *
+ * @param bo 鏌ヨ鏉′欢
+ * @param pageQuery 鍒嗛〉鍙傛暟
+ * @return 鐩樼偣鍒嗛〉鍒楄〃
+ */
+ TableDataInfo<EimsInventoryVo> queryPageList(EimsInventoryBo bo, PageQuery pageQuery);
+
+ /**
+ * 鏌ヨ绗﹀悎鏉′欢鐨勭洏鐐瑰垪琛�
+ *
+ * @param bo 鏌ヨ鏉′欢
+ * @return 鐩樼偣鍒楄〃
+ */
+ List<EimsInventoryVo> queryList(EimsInventoryBo bo);
+
+ /**
+ * 鏂板鐩樼偣
+ *
+ * @param bo 鐩樼偣
+ * @return 鏄惁鏂板鎴愬姛
+ */
+ Boolean insertByBo(EimsInventoryBo bo);
+
+ /**
+ * 淇敼鐩樼偣
+ *
+ * @param bo 鐩樼偣
+ * @return 鏄惁淇敼鎴愬姛
+ */
+ Boolean updateByBo(EimsInventoryBo bo);
+
+ /**
+ * 鏍¢獙骞舵壒閲忓垹闄ょ洏鐐逛俊鎭�
+ *
+ * @param ids 寰呭垹闄ょ殑涓婚敭闆嗗悎
+ * @param isValid 鏄惁杩涜鏈夋晥鎬ф牎楠�
+ * @return 鏄惁鍒犻櫎鎴愬姛
+ */
+ Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsInventoryDetailServiceImpl.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsInventoryDetailServiceImpl.java
new file mode 100644
index 0000000..16528cb
--- /dev/null
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsInventoryDetailServiceImpl.java
@@ -0,0 +1,139 @@
+package org.dromara.eims.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+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.springframework.stereotype.Service;
+import org.dromara.eims.domain.bo.EimsInventoryDetailBo;
+import org.dromara.eims.domain.vo.EimsInventoryDetailVo;
+import org.dromara.eims.domain.EimsInventoryDetail;
+import org.dromara.eims.mapper.EimsInventoryDetailMapper;
+import org.dromara.eims.service.IEimsInventoryDetailService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 鐩樼偣鏄庣粏Service涓氬姟灞傚鐞�
+ *
+ * @author zhuguifei
+ * @date 2025-02-06
+ */
+@RequiredArgsConstructor
+@Service
+public class EimsInventoryDetailServiceImpl implements IEimsInventoryDetailService {
+
+ private final EimsInventoryDetailMapper baseMapper;
+
+ /**
+ * 鏌ヨ鐩樼偣鏄庣粏
+ *
+ * @param id 涓婚敭
+ * @return 鐩樼偣鏄庣粏
+ */
+ @Override
+ public EimsInventoryDetailVo queryById(Long id) {
+ return baseMapper.selectVoById(id);
+ }
+
+
+ /**
+ * 鍒嗛〉鏌ヨ鐩樼偣鏄庣粏鍒楄〃-澶氳〃鏌ヨ
+ *
+ * @param bo 鏌ヨ鏉′欢
+ * @param pageQuery 鍒嗛〉鍙傛暟
+ * @return 鐩樼偣鏄庣粏鍒嗛〉鍒楄〃
+ */
+ @Override
+ public TableDataInfo<EimsInventoryDetailVo> queryPageListCustom(EimsInventoryDetailBo bo, PageQuery pageQuery) {
+ //TODO 鐗规畩澶勭悊-澶氳〃鍚屽瓧娈靛鑷撮棶棰�
+ String orderByColumn = pageQuery.getOrderByColumn();
+ if (StringUtils.isNotEmpty(orderByColumn) && orderByColumn.contains("status")) {
+ pageQuery.setOrderByColumn(orderByColumn.replace("status", "a.status"));
+ }
+ Page<EimsInventoryDetailVo> page = baseMapper.selectInventoryDetailList(pageQuery.build(), buildQueryWrapper(bo));
+ return TableDataInfo.build(page);
+ }
+
+ /**
+ * 鏌ヨ绗﹀悎鏉′欢鐨勭洏鐐规槑缁嗗垪琛�
+ *
+ * @param bo 鏌ヨ鏉′欢
+ * @return 鐩樼偣鏄庣粏鍒楄〃
+ */
+ @Override
+ public List<EimsInventoryDetailVo> queryList(EimsInventoryDetailBo bo) {
+ QueryWrapper<EimsInventoryDetail> qw = buildQueryWrapper(bo);
+ return baseMapper.selectVoList(qw);
+ }
+
+ private QueryWrapper<EimsInventoryDetail> buildQueryWrapper(EimsInventoryDetailBo bo) {
+ Map<String, Object> params = bo.getParams();
+ QueryWrapper<EimsInventoryDetail> qw = Wrappers.query();
+ qw.eq(bo.getInventoryId() != null, "a.inventory_id", bo.getInventoryId());
+ qw.eq(bo.getEquId() != null, "a.equ_id", bo.getEquId());
+ qw.eq(StringUtils.isNotBlank(bo.getStatus()), "a.status", bo.getStatus());
+
+ qw.like(StringUtils.isNotBlank(bo.getEquName()), "c.equ_name", bo.getEquName());
+ return qw;
+ }
+
+ /**
+ * 鏂板鐩樼偣鏄庣粏
+ *
+ * @param bo 鐩樼偣鏄庣粏
+ * @return 鏄惁鏂板鎴愬姛
+ */
+ @Override
+ public Boolean insertByBo(EimsInventoryDetailBo bo) {
+ EimsInventoryDetail add = MapstructUtils.convert(bo, EimsInventoryDetail.class);
+ validEntityBeforeSave(add);
+ boolean flag = baseMapper.insert(add) > 0;
+ if (flag) {
+ bo.setId(add.getId());
+ }
+ return flag;
+ }
+
+ /**
+ * 淇敼鐩樼偣鏄庣粏
+ *
+ * @param bo 鐩樼偣鏄庣粏
+ * @return 鏄惁淇敼鎴愬姛
+ */
+ @Override
+ public Boolean updateByBo(EimsInventoryDetailBo bo) {
+ EimsInventoryDetail update = MapstructUtils.convert(bo, EimsInventoryDetail.class);
+ validEntityBeforeSave(update);
+ return baseMapper.updateById(update) > 0;
+ }
+
+ /**
+ * 淇濆瓨鍓嶇殑鏁版嵁鏍¢獙
+ */
+ private void validEntityBeforeSave(EimsInventoryDetail entity) {
+ //TODO 鍋氫竴浜涙暟鎹牎楠�,濡傚敮涓�绾︽潫
+ }
+
+ /**
+ * 鏍¢獙骞舵壒閲忓垹闄ょ洏鐐规槑缁嗕俊鎭�
+ *
+ * @param ids 寰呭垹闄ょ殑涓婚敭闆嗗悎
+ * @param isValid 鏄惁杩涜鏈夋晥鎬ф牎楠�
+ * @return 鏄惁鍒犻櫎鎴愬姛
+ */
+ @Override
+ public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+ if (isValid) {
+ //TODO 鍋氫竴浜涗笟鍔′笂鐨勬牎楠�,鍒ゆ柇鏄惁闇�瑕佹牎楠�
+ }
+ return baseMapper.deleteByIds(ids) > 0;
+ }
+}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsInventoryServiceImpl.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsInventoryServiceImpl.java
new file mode 100644
index 0000000..acc79bf
--- /dev/null
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsInventoryServiceImpl.java
@@ -0,0 +1,215 @@
+package org.dromara.eims.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StreamUtils;
+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.mybatis.helper.DataBaseHelper;
+import org.dromara.eims.domain.EimsEqu;
+import org.dromara.eims.domain.EimsEquType;
+import org.dromara.eims.domain.EimsInventoryDetail;
+import org.dromara.eims.mapper.EimsEquMapper;
+import org.dromara.eims.mapper.EimsEquTypeMapper;
+import org.dromara.eims.mapper.EimsInventoryDetailMapper;
+import org.springframework.stereotype.Service;
+import org.dromara.eims.domain.bo.EimsInventoryBo;
+import org.dromara.eims.domain.vo.EimsInventoryVo;
+import org.dromara.eims.domain.EimsInventory;
+import org.dromara.eims.mapper.EimsInventoryMapper;
+import org.dromara.eims.service.IEimsInventoryService;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+import java.util.stream.Collectors;
+
+/**
+ * 鐩樼偣Service涓氬姟灞傚鐞�
+ *
+ * @author zhuguifei
+ * @date 2025-01-16
+ */
+@RequiredArgsConstructor
+@Service
+public class EimsInventoryServiceImpl implements IEimsInventoryService {
+
+ private final EimsInventoryMapper baseMapper;
+ private final EimsInventoryDetailMapper detailMapper;
+ private final EimsEquTypeMapper equTypeMapper;
+ private final EimsEquMapper equMapper;
+
+
+ /**
+ * 鏌ヨ鐩樼偣
+ *
+ * @param inventoryId 涓婚敭
+ * @return 鐩樼偣
+ */
+ @Override
+ public EimsInventoryVo queryById(Long inventoryId) {
+ EimsInventoryVo vo = baseMapper.selectVoById(inventoryId);
+ if (StringUtils.isNotEmpty(vo.getEquTypes())) {
+ List<Long> numberList = Arrays.stream(vo.getEquTypes().split(","))
+ .map(Long::parseLong)
+ .toList();
+ vo.setEquTypesList(numberList);
+ }
+ if (StringUtils.isNotEmpty(vo.getEquStatus())) {
+ List<String> list = Arrays.asList(vo.getEquStatus().split(","));
+ vo.setEquStatusList(list);
+ }
+ return vo;
+ }
+
+ /**
+ * 鍒嗛〉鏌ヨ鐩樼偣鍒楄〃
+ *
+ * @param bo 鏌ヨ鏉′欢
+ * @param pageQuery 鍒嗛〉鍙傛暟
+ * @return 鐩樼偣鍒嗛〉鍒楄〃
+ */
+ @Override
+ public TableDataInfo<EimsInventoryVo> queryPageList(EimsInventoryBo bo, PageQuery pageQuery) {
+ LambdaQueryWrapper<EimsInventory> lqw = buildQueryWrapper(bo);
+ Page<EimsInventoryVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+ return TableDataInfo.build(result);
+ }
+
+ /**
+ * 鏌ヨ绗﹀悎鏉′欢鐨勭洏鐐瑰垪琛�
+ *
+ * @param bo 鏌ヨ鏉′欢
+ * @return 鐩樼偣鍒楄〃
+ */
+ @Override
+ public List<EimsInventoryVo> queryList(EimsInventoryBo bo) {
+ LambdaQueryWrapper<EimsInventory> lqw = buildQueryWrapper(bo);
+ return baseMapper.selectVoList(lqw);
+ }
+
+ private LambdaQueryWrapper<EimsInventory> buildQueryWrapper(EimsInventoryBo bo) {
+ Map<String, Object> params = bo.getParams();
+ LambdaQueryWrapper<EimsInventory> lqw = Wrappers.lambdaQuery();
+ lqw.like(StringUtils.isNotBlank(bo.getInventoryCode()), EimsInventory::getInventoryCode, bo.getInventoryCode());
+ lqw.like(StringUtils.isNotBlank(bo.getInventoryName()), EimsInventory::getInventoryName, bo.getInventoryName());
+ lqw.eq(bo.getInventoryUser() != null, EimsInventory::getInventoryUser, bo.getInventoryUser());
+ lqw.between(params.get("beginStartDate") != null && params.get("endStartDate") != null,
+ EimsInventory::getStartDate, params.get("beginStartDate"), params.get("endStartDate"));
+ lqw.between(params.get("beginEndDate") != null && params.get("endEndDate") != null,
+ EimsInventory::getEndDate, params.get("beginEndDate"), params.get("endEndDate"));
+ lqw.eq(StringUtils.isNotBlank(bo.getStatus()), EimsInventory::getStatus, bo.getStatus());
+ lqw.between(params.get("beginCreateBy") != null && params.get("endCreateBy") != null,
+ EimsInventory::getCreateBy, params.get("beginCreateBy"), params.get("endCreateBy"));
+ lqw.eq(bo.getUserDept() != null, EimsInventory::getUserDept, bo.getUserDept());
+ lqw.eq(bo.getInventoryUser() != null, EimsInventory::getInventoryUser, bo.getInventoryUser());
+
+ return lqw;
+ }
+
+ /**
+ * 鏂板鐩樼偣
+ *
+ * @param bo 鐩樼偣
+ * @return 鏄惁鏂板鎴愬姛
+ */
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public Boolean insertByBo(EimsInventoryBo bo) {
+ EimsInventory add = MapstructUtils.convert(bo, EimsInventory.class);
+ List<String> equTypesList = bo.getEquTypesList();
+ if (equTypesList != null && !equTypesList.isEmpty()) {
+ String result = String.join(",", equTypesList);
+ if (add != null) {
+ add.setEquTypes(result);
+ }
+ }
+ List<String> equStatusList = bo.getEquStatusList();
+ if (equStatusList != null && !equStatusList.isEmpty()) {
+ String result = String.join(",", equStatusList);
+ if (add != null) {
+ add.setEquStatus(result);
+ }
+ }
+ validEntityBeforeSave(add);
+ boolean flag = baseMapper.insert(add) > 0;
+ if (flag) {
+ bo.setInventoryId(add.getInventoryId());
+ }
+
+ //1.鏌ヨ绫诲瀷涓嬫墍鏈夎澶�
+ QueryWrapper<EimsEqu> equQueryWrapper = new QueryWrapper<>();
+ equQueryWrapper.lambda().in(CollUtil.isNotEmpty(equTypesList), EimsEqu::getEquTypeId, equTypesList);
+ equQueryWrapper.lambda().in(CollUtil.isNotEmpty(equStatusList), EimsEqu::getStatus, equStatusList);
+ List<EimsEqu> equList = equMapper.selectList(equQueryWrapper);
+
+ //2.鏂板鐩樼偣鏄庣粏
+ for (EimsEqu equ : equList) {
+ EimsInventoryDetail detail = new EimsInventoryDetail();
+ detail.setEquId(equ.getEquId());
+ detail.setInventoryId(add.getInventoryId());
+ //璁剧疆涓烘湭鐩樼偣
+ detail.setStatus("0");
+ detailMapper.insert(detail);
+ }
+
+
+ return flag;
+ }
+
+ /**
+ * 淇敼鐩樼偣
+ *
+ * @param bo 鐩樼偣
+ * @return 鏄惁淇敼鎴愬姛
+ */
+ @Override
+ public Boolean updateByBo(EimsInventoryBo bo) {
+ EimsInventory update = MapstructUtils.convert(bo, EimsInventory.class);
+ if (bo.getEquTypesList() != null && !bo.getEquTypesList().isEmpty()) {
+ String result = String.join(",", bo.getEquTypesList());
+ if (update != null) {
+ update.setEquTypes(result);
+ }
+ }
+ if (bo.getEquStatusList() != null && !bo.getEquStatusList().isEmpty()) {
+ String result = String.join(",", bo.getEquStatusList());
+ if (update != null) {
+ update.setEquStatus(result);
+ }
+ }
+ validEntityBeforeSave(update);
+ return baseMapper.updateById(update) > 0;
+ }
+
+ /**
+ * 淇濆瓨鍓嶇殑鏁版嵁鏍¢獙
+ */
+ private void validEntityBeforeSave(EimsInventory entity) {
+ //TODO 鍋氫竴浜涙暟鎹牎楠�,濡傚敮涓�绾︽潫
+ }
+
+ /**
+ * 鏍¢獙骞舵壒閲忓垹闄ょ洏鐐逛俊鎭�
+ *
+ * @param ids 寰呭垹闄ょ殑涓婚敭闆嗗悎
+ * @param isValid 鏄惁杩涜鏈夋晥鎬ф牎楠�
+ * @return 鏄惁鍒犻櫎鎴愬姛
+ */
+ @Override
+ public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+ if (isValid) {
+ //TODO 鍋氫竴浜涗笟鍔′笂鐨勬牎楠�,鍒ゆ柇鏄惁闇�瑕佹牎楠�
+ }
+ return baseMapper.deleteByIds(ids) > 0;
+ }
+}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/resources/mapper/eims/EimsInventoryDetailMapper.xml b/eims/ruoyi-modules/lb-eims/src/main/resources/mapper/eims/EimsInventoryDetailMapper.xml
new file mode 100644
index 0000000..a97f8f8
--- /dev/null
+++ b/eims/ruoyi-modules/lb-eims/src/main/resources/mapper/eims/EimsInventoryDetailMapper.xml
@@ -0,0 +1,29 @@
+<?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.EimsInventoryDetailMapper">
+ <resultMap type="org.dromara.eims.domain.vo.EimsInventoryDetailVo" id="EimsInventoryDetailResult">
+ </resultMap>
+
+ <select id="selectInventoryDetailList" resultMap="EimsInventoryDetailResult">
+ SELECT c.equ_code equCode,
+ c.equ_name equName,
+ c.asset_no equAssetNo,
+ e.dept_name deptName,
+ d.type_name equTypeName,
+ c.location location,
+ b.`status` inventoryStatus,
+ c.`status` equStatus,
+ d.`status` typeStatus,
+ b.inventory_user inventoryUser
+ FROM eims_inventory_detail a
+ JOIN eims_inventory b on a.inventory_id = b.inventory_id
+ JOIN eims_equ c on a.equ_id = c.equ_id
+ JOIN eims_equ_type d on c.equ_type_id = d.equ_type_id
+ JOIN sys_dept e on e.dept_id = c.dept_used
+ ${ew.getCustomSqlSegment}
+ </select>
+
+
+</mapper>
diff --git a/eims/ruoyi-modules/lb-eims/src/main/resources/mapper/eims/EimsInventoryMapper.xml b/eims/ruoyi-modules/lb-eims/src/main/resources/mapper/eims/EimsInventoryMapper.xml
new file mode 100644
index 0000000..d2330cb
--- /dev/null
+++ b/eims/ruoyi-modules/lb-eims/src/main/resources/mapper/eims/EimsInventoryMapper.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.EimsInventoryMapper">
+
+</mapper>
--
Gitblit v1.9.3