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