From 34c674d503e23c0cf6d0b6dec063f3049885e5f8 Mon Sep 17 00:00:00 2001
From: 朱桂飞 <zhuguifei@zhuguifeideMacBook-Air.local>
Date: 星期一, 10 二月 2025 13:17:10 +0800
Subject: [PATCH] 新增盘点明细

---
 /dev/null                                                                                                  |  211 --------------
 eims-ui/packages/@core/base/shared/src/constants/dict-enum.ts                                              |    4 
 eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/controller/EimsInventoryDetailController.java    |   12 
 eims-ui/packages/@core/preferences/src/config.ts                                                           |    6 
 eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsInventoryDetailBo.java             |    2 
 eims/ruoyi-modules/lb-eims/src/main/resources/mapper/eims/EimsInventoryDetailMapper.xml                    |   15 
 eims-ui/apps/web-antd/src/views/eims/equ-statu/data.tsx                                                    |   79 ----
 eims-ui/apps/web-antd/src/views/eims/inventory-detail/index.vue                                            |   98 ++++--
 eims-ui/apps/web-antd/src/views/eims/equ/data.tsx                                                          |   22 -
 eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsInventoryDetailServiceImpl.java |   45 +++
 eims-ui/apps/web-antd/src/views/eims/inventory-detail/detail-drawer.vue                                    |   79 +++++
 eims-ui/apps/web-antd/src/views/eims/inventory-detail/data.tsx                                             |  277 +++---------------
 12 files changed, 268 insertions(+), 582 deletions(-)

diff --git a/eims-ui/apps/web-antd/src/views/eims/equ-statu/data.tsx b/eims-ui/apps/web-antd/src/views/eims/equ-statu/data.tsx
index abaf3a6..3790277 100644
--- a/eims-ui/apps/web-antd/src/views/eims/equ-statu/data.tsx
+++ b/eims-ui/apps/web-antd/src/views/eims/equ-statu/data.tsx
@@ -8,6 +8,7 @@
 
 import { type FormSchemaGetter } from '#/adapter/form';
 import { getDictOptions } from '#/utils/dict';
+import { renderDict } from '#/utils/render';
 
 export const querySchema: FormSchemaGetter = () => [
   {
@@ -48,26 +49,7 @@
     sortable: true,
     slots: {
       default: ({ row }) => {
-        const statu = row.beforeChange;
-        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 '';
+        return renderDict(row.beforeChange, DictEnum.SYS_EQU_STATUS);
       }
     },
     minWidth: 80,
@@ -79,26 +61,7 @@
     sortable: true,
     slots: {
       default: ({ row }) => {
-        const statu = row.afterChange;
-        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 '';
+        return renderDict(row.afterChange, DictEnum.SYS_EQU_STATUS);
       }
     },
     minWidth: 80,
@@ -212,46 +175,14 @@
     field: 'beforeChange',
     label: '鍙樻洿鍓�',
     render(value) {
-      switch (value) {
-        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 '';
-        }
-      }
+      return renderDict(value, DictEnum.SYS_EQU_STATUS);
     }
   },
   {
     field: 'afterChange',
     label: '鍙樻洿鍚�',
     render(value) {
-      switch (value) {
-        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 '';
-        }
-      }
+      return renderDict(value, DictEnum.SYS_EQU_STATUS);
     }
   },
   {
diff --git a/eims-ui/apps/web-antd/src/views/eims/equ/data.tsx b/eims-ui/apps/web-antd/src/views/eims/equ/data.tsx
index 47e65ee..ff11e78 100644
--- a/eims-ui/apps/web-antd/src/views/eims/equ/data.tsx
+++ b/eims-ui/apps/web-antd/src/views/eims/equ/data.tsx
@@ -7,6 +7,7 @@
 
 import { type FormSchemaGetter, z } from '#/adapter/form';
 import { getDictOptions } from '#/utils/dict';
+import { renderDict } from '#/utils/render';
 
 export const querySchema: FormSchemaGetter = () => [
   {
@@ -50,26 +51,7 @@
     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 '';
+        return renderDict(row.status, DictEnum.SYS_EQU_STATUS);
       }
     },
     minWidth: 80,
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
index adec6df..6acc5ef 100644
--- 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
@@ -1,18 +1,16 @@
 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 { type FormSchemaGetter } from '#/adapter/form';
 import { getDictOptions } from '#/utils/dict';
+import { renderDict } from '#/utils/render';
 
 export const querySchema: FormSchemaGetter = () => [
   {
     component: 'Input',
     fieldName: 'equCode',
-    label: '璁惧缂栫爜'
+    label: '璁惧缂栧彿'
   },
   {
     component: 'Input',
@@ -36,83 +34,73 @@
     },
     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: 'status',
+    sortable: true,
+    minWidth: 100,
+    fixed: 'left',
+    slots: {
+      default: ({ row }) => {
+        return renderDict(row.status, DictEnum.EIMS_INVENTORY_DETAIL_STATU);
+      }
+    }
+  },
+  {
     title: '璁惧缂栧彿',
     field: 'equCode',
     minWidth: 120,
-    fixed: 'left',
+    fixed: 'left'
   },
   {
     title: '璁惧鍚嶇О',
     field: 'equName',
-    minWidth: 100,
-    fixed: 'left',
+    minWidth: 100
   },
   {
     title: '璧勪骇缂栧彿',
     field: 'equAssetNo',
-    sortable: true,
-    minWidth: 100,
-  },
-  {
-    title: '浣跨敤閮ㄩ棬',
-    field: 'deptName',
-    minWidth: 100,
-  },
-  {
-    title: '璁惧绫诲瀷',
-    field: 'equTypeName',
-    minWidth: 100,
-  },
-  {
-    title: '璁惧浣嶇疆',
-    field: 'location',
-    minWidth: 100,
+    minWidth: 100
   },
   {
     title: '璁惧鐘舵��',
     field: 'equStatus',
     sortable: true,
+    minWidth: 100,
     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 '';
+        return renderDict(row.equStatus, DictEnum.SYS_EQU_STATUS);
       }
-    },
-    minWidth: 80,
+    }
   },
-
+  {
+    title: '浣跨敤閮ㄩ棬',
+    field: 'deptName',
+    minWidth: 100
+  },
+  {
+    title: '璁惧绫诲瀷',
+    field: 'equTypeName',
+    minWidth: 100
+  },
+  {
+    title: '璁惧浣嶇疆',
+    field: 'location',
+    minWidth: 100
+  },
   {
     title: '鐩樼偣浜�',
     field: 'inventoryUser',
@@ -135,194 +123,33 @@
       show: () => false,
       triggerFields: ['']
     },
+    fieldName: 'id'
+  },
+  {
+    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
+    dependencies: {
+      show: () => false,
+      triggerFields: ['']
     },
-    fieldName: 'purchaseDate',
-    label: '閲囪喘鏃ユ湡'
+    fieldName: 'inventoryId'
   },
   {
     component: 'RadioGroup',
     componentProps: {
       buttonStyle: 'solid',
-      options: getDictOptions(DictEnum.SYS_EQU_STATUS),
+      options: getDictOptions(DictEnum.EIMS_INVENTORY_DETAIL_STATU),
       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/detail-drawer.vue b/eims-ui/apps/web-antd/src/views/eims/inventory-detail/detail-drawer.vue
new file mode 100644
index 0000000..2e8f1fc
--- /dev/null
+++ b/eims-ui/apps/web-antd/src/views/eims/inventory-detail/detail-drawer.vue
@@ -0,0 +1,79 @@
+<script setup lang="ts">
+import { computed, ref } from 'vue';
+
+import { useVbenDrawer } from '@vben/common-ui';
+import { $t } from '@vben/locales';
+import { cloneDeep } from '@vben/utils';
+
+import { useVbenForm } from '#/adapter/form';
+import { addInventoryDetail, getInventoryDetail, updateInventoryDetail } from '#/api/eims/inventory-detail';
+
+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;
+    // 鏇存柊 && 璧嬪��
+    if (isUpdate.value && id) {
+      const record = await getInventoryDetail(id);
+      await formApi.setValues(record);
+    }
+    drawerApi.drawerLoading(false);
+  }
+});
+async function handleConfirm() {
+  try {
+    drawerApi.drawerLoading(true);
+    const { valid } = await formApi.validate();
+    if (!valid) {
+      return;
+    }
+    const data = cloneDeep(await formApi.getValues());
+    await (isUpdate.value ? updateInventoryDetail(data) : addInventoryDetail(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-drawer.vue b/eims-ui/apps/web-antd/src/views/eims/inventory-detail/equ-drawer.vue
deleted file mode 100644
index eafef4a..0000000
--- a/eims-ui/apps/web-antd/src/views/eims/inventory-detail/equ-drawer.vue
+++ /dev/null
@@ -1,211 +0,0 @@
-<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/index.vue b/eims-ui/apps/web-antd/src/views/eims/inventory-detail/index.vue
index 85ce23f..d8fdaae 100644
--- 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
@@ -1,9 +1,10 @@
 <script setup lang="ts">
 import type { Recordable } from '@vben/types';
 
-import { ref } from 'vue';
-import { useRoute, useRouter } from 'vue-router';
+import { computed, nextTick, ref } from 'vue';
+import { useRoute } from 'vue-router';
 
+import { useAccess } from '@vben/access';
 import { Page, useVbenDrawer, type VbenFormProps } from '@vben/common-ui';
 import { $t } from '@vben/locales';
 import { getVxePopupContainer } from '@vben/utils';
@@ -15,7 +16,7 @@
 import { commonDownloadExcel } from '#/utils/file/download';
 
 import { columns, querySchema } from './data';
-import equDrawer from './equ-drawer.vue';
+import detailDrawer from './detail-drawer.vue';
 import EquTypeTree from './equ-type-tree.vue';
 
 const route = useRoute();
@@ -23,6 +24,12 @@
 
 // 宸﹁竟閮ㄩ棬鐢�
 const selectTypeId = ref<string[]>([]);
+// 宸茬洏鐐�
+const check = ref<string>('宸茬洏');
+// 鏈洏鐐�
+const noCheck = ref<string>('鏈洏');
+// 鏌ヨ娣诲姞鐩樼偣鏍囪杩囨护
+const checkFilter = ref<string>();
 
 const formOptions: VbenFormProps = {
   commonConfig: {
@@ -35,6 +42,7 @@
   wrapperClass: 'grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4',
   handleReset: async () => {
     selectTypeId.value = [];
+    checkFilter.value = undefined;
     // eslint-disable-next-line no-use-before-define
     const { formApi, reload } = tableApi;
     await formApi.resetForm();
@@ -58,7 +66,12 @@
   columns,
   height: 'auto',
   keepSource: true,
-  pagerConfig: {},
+  pagerConfig: {
+    // 榛樿鏉℃暟
+    pageSize: 1000,
+    // 鍒嗛〉鍙�夋潯鏁�
+    pageSizes: [1000, 2000, 3000, 4000, 5000]
+  },
   proxyConfig: {
     ajax: {
       query: async ({ page }, formValues = {}) => {
@@ -68,10 +81,36 @@
         } else {
           Reflect.deleteProperty(formValues, 'equTypeId');
         }
+        // 鏄惁鐩樼偣
+        if (checkFilter.value === '0' || checkFilter.value === '1') {
+          formValues.status = checkFilter.value;
+        } else {
+          Reflect.deleteProperty(formValues, 'status');
+        }
         return await listInventoryDetail({
           pageNum: page.currentPage,
           pageSize: page.pageSize,
+          inventoryId,
           ...formValues
+        });
+      },
+      querySuccess: () => {
+        nextTick(() => {
+          // 杩囨护宸茬洏鍜屾湭鐩樼殑鏁版嵁
+          // eslint-disable-next-line no-use-before-define
+          const data = tableApi.grid.getData();
+          const data0 = data.filter((item) => {
+            return item.status === '' || item.status === null || item.status === '0';
+          });
+          if (data0 !== null && data0.length > 0) {
+            noCheck.value = `鏈洏(${data0.length})`;
+          }
+          const data1 = data.filter((item) => {
+            return item.status !== '' && item.status !== null && item.status === '1';
+          });
+          if (data1 !== null && data1.length > 0) {
+            check.value = `宸茬洏(${data1.length})`;
+          }
         });
       }
     }
@@ -97,18 +136,13 @@
   }
 });
 
-const [EquDrawer, equDrawerApi] = useVbenDrawer({
-  connectedComponent: equDrawer
+const [DetailDrawer, detailDrawerApi] = useVbenDrawer({
+  connectedComponent: detailDrawer
 });
 
-function handleAdd() {
-  equDrawerApi.setData({});
-  equDrawerApi.open();
-}
-
 async function handleEdit(record: Recordable<any>) {
-  equDrawerApi.setData({ id: record.equId });
-  equDrawerApi.open();
+  detailDrawerApi.setData({ id: record.id });
+  detailDrawerApi.open();
 }
 
 async function handleDelete(row: Recordable<any>) {
@@ -129,7 +163,6 @@
     }
   });
 }
-
 function handleDownloadExcel() {
   commonDownloadExcel(inventoryDetailExport, '鐩樼偣鏄庣粏', tableApi.formApi.form.values, {
     fieldMappingTime: formOptions.fieldMappingTime
@@ -145,11 +178,12 @@
   const inventoryFlag = row.inventoryFlag === null || row.inventoryFlag;
   return inventoryFlag ? '鏈洏鐐�' : '宸茬洏鐐�';
 }
-
-const router = useRouter();
-function handleDetail(record: Recordable<any>) {
-  router.push(`/equ/detail/${record.id}`);
+function handleQuery(isChecked: string) {
+  checkFilter.value = isChecked;
+  tableApi.query();
 }
+const { hasAccessByRoles } = useAccess();
+const isSuperAdmin = computed(() => hasAccessByRoles(['superadmin']));
 </script>
 
 <template>
@@ -159,34 +193,30 @@
       <BasicTable class="flex-1 overflow-hidden" table-title="鐩樼偣鏄庣粏鍒楄〃">
         <template #toolbar-tools>
           <Space>
+            <a-button @click="handleQuery('0')">{{ noCheck }}</a-button>
+            <a-button type="primary" @click="handleQuery('1')"> {{ check }}</a-button>
             <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">
+            <a-button
+              :disabled="!vxeCheckboxChecked(tableApi) || !isSuperAdmin"
+              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)">
+            <ghost-button :disabled="!isSuperAdmin" 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="">
+              <ghost-button :disabled="!isSuperAdmin" danger v-access:code="['eims:inventory:remove']" @click.stop="">
                 {{ $t('pages.common.delete') }}
               </ghost-button>
             </Popconfirm>
@@ -202,6 +232,6 @@
         </template>
       </BasicTable>
     </div>
-    <EquDrawer @reload="tableApi.query()" />
+    <DetailDrawer @reload="tableApi.query()" />
   </Page>
 </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 bcad996..529282a 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,6 +1,6 @@
 export enum DictEnum {
-  EIMS_INVENTORY_STATU = 'inventory_statu', // 璁惧鐩樼偣鐘舵��
   EIMS_INVENTORY_DETAIL_STATU = 'inventory_detail_statu', // 璁惧鐩樼偣鐘舵��
+  EIMS_INVENTORY_STATU = 'inventory_statu', // 璁惧鐩樼偣鐘舵��
   SYS_COMMON_STATUS = 'sys_common_status',
   SYS_DEVICE_TYPE = 'sys_device_type', // 璁惧绫诲瀷
   SYS_EQU_STATUS = 'sys_equ_status', // 璁惧鐘舵��
@@ -8,7 +8,7 @@
   SYS_NORMAL_DISABLE = 'sys_normal_disable',
   SYS_NOTICE_STATUS = 'sys_notice_status', // 閫氱煡鐘舵��
   SYS_NOTICE_TYPE = 'sys_notice_type', // 閫氱煡绫诲瀷
-  SYS_OPER_TYPE = 'sys_oper_type', // 鎿嶄綔绫诲瀷
+  SYS_OPER_TYPE = 'sys_oper_type', // 鎿嶄綔绫诲瀷S
   SYS_OSS_ACCESS_POLICY = 'oss_access_policy', // oss鏉冮檺妗剁被鍨�
   SYS_SHOW_HIDE = 'sys_show_hide', // 鏄剧ず鐘舵��
   SYS_USER_SEX = 'sys_user_sex', // 鎬у埆
diff --git a/eims-ui/packages/@core/preferences/src/config.ts b/eims-ui/packages/@core/preferences/src/config.ts
index 8a3d191..b3616b9 100644
--- a/eims-ui/packages/@core/preferences/src/config.ts
+++ b/eims-ui/packages/@core/preferences/src/config.ts
@@ -19,7 +19,7 @@
     layout: 'sidebar-nav',
     locale: 'zh-CN',
     loginExpiredMode: 'page',
-    name: 'Vben Admin',
+    name: 'eims',
     preferencesButtonPosition: 'auto',
     watermark: false,
   },
@@ -31,8 +31,8 @@
     styleType: 'normal',
   },
   copyright: {
-    companyName: 'Vben',
-    companySiteLink: 'https://www.vben.pro',
+    companyName: '涓婃捣鍏版郸',
+    companySiteLink: 'https://shlanpu.cn/',
     date: '2024',
     enable: true,
     icp: '',
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
index cddc0b9..611d31f 100644
--- 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
@@ -39,7 +39,7 @@
     /**
      * 鏌ヨ鐩樼偣鏄庣粏鍒楄〃
      */
-    @SaCheckPermission("eims:inventoryDetail:list")
+    @SaCheckPermission("eims:inventory:list")
     @GetMapping("/list")
     public TableDataInfo<EimsInventoryDetailVo> list(EimsInventoryDetailBo bo, PageQuery pageQuery) {
         //return eimsInventoryDetailService.queryPageList(bo, pageQuery);
@@ -49,7 +49,7 @@
     /**
      * 瀵煎嚭鐩樼偣鏄庣粏鍒楄〃
      */
-    @SaCheckPermission("eims:inventoryDetail:export")
+    @SaCheckPermission("eims:inventory:export")
     @Log(title = "鐩樼偣鏄庣粏", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     public void export(EimsInventoryDetailBo bo, HttpServletResponse response) {
@@ -62,7 +62,7 @@
      *
      * @param id 涓婚敭
      */
-    @SaCheckPermission("eims:inventoryDetail:query")
+    @SaCheckPermission("eims:inventory:query")
     @GetMapping("/{id}")
     public R<EimsInventoryDetailVo> getInfo(@NotNull(message = "涓婚敭涓嶈兘涓虹┖")
                                      @PathVariable Long id) {
@@ -72,7 +72,7 @@
     /**
      * 鏂板鐩樼偣鏄庣粏
      */
-    @SaCheckPermission("eims:inventoryDetail:add")
+    @SaCheckPermission("eims:inventory:add")
     @Log(title = "鐩樼偣鏄庣粏", businessType = BusinessType.INSERT)
     @RepeatSubmit()
     @PostMapping()
@@ -83,7 +83,7 @@
     /**
      * 淇敼鐩樼偣鏄庣粏
      */
-    @SaCheckPermission("eims:inventoryDetail:edit")
+    @SaCheckPermission("eims:inventory:edit")
     @Log(title = "鐩樼偣鏄庣粏", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
     @PutMapping()
@@ -96,7 +96,7 @@
      *
      * @param ids 涓婚敭涓�
      */
-    @SaCheckPermission("eims:inventoryDetail:remove")
+    @SaCheckPermission("eims:inventory:remove")
     @Log(title = "鐩樼偣鏄庣粏", businessType = BusinessType.DELETE)
     @DeleteMapping("/{ids}")
     public R<Void> remove(@NotEmpty(message = "涓婚敭涓嶈兘涓虹┖")
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
index 0d454c2..fac9f73 100644
--- 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
@@ -59,6 +59,8 @@
     private String deptName;
     //璁惧绫诲瀷鍚嶇О
     private String equTypeName;
+    //璁惧绫诲瀷
+    private Long equTypeId;
     //璁惧鎵�鍦ㄤ綅缃�
     private String location;
     //璁惧鐘舵��
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
index 16528cb..f0a9401 100644
--- 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
@@ -9,6 +9,10 @@
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.RequiredArgsConstructor;
+import org.dromara.eims.domain.EimsEqu;
+import org.dromara.eims.domain.EimsEquType;
+import org.dromara.eims.domain.vo.EimsEquTypeVo;
+import org.dromara.eims.mapper.EimsEquTypeMapper;
 import org.springframework.stereotype.Service;
 import org.dromara.eims.domain.bo.EimsInventoryDetailBo;
 import org.dromara.eims.domain.vo.EimsInventoryDetailVo;
@@ -16,6 +20,7 @@
 import org.dromara.eims.mapper.EimsInventoryDetailMapper;
 import org.dromara.eims.service.IEimsInventoryDetailService;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 import java.util.Collection;
@@ -31,6 +36,7 @@
 public class EimsInventoryDetailServiceImpl implements IEimsInventoryDetailService {
 
     private final EimsInventoryDetailMapper baseMapper;
+    private final EimsEquTypeMapper equTypeMapper;
 
     /**
      * 鏌ヨ鐩樼偣鏄庣粏
@@ -82,10 +88,49 @@
         qw.eq(StringUtils.isNotBlank(bo.getStatus()), "a.status", bo.getStatus());
 
         qw.like(StringUtils.isNotBlank(bo.getEquName()), "c.equ_name", bo.getEquName());
+        qw.like(StringUtils.isNotBlank(bo.getEquCode()), "c.equ_code", bo.getEquCode());
+        qw.like(StringUtils.isNotBlank(bo.getEquAssetNo()), "c.asset_no", bo.getEquAssetNo());
+        qw.like(StringUtils.isNotBlank(bo.getLocation()), "c.location", bo.getLocation());
+        qw.like(StringUtils.isNotBlank(bo.getEquStatus()), "c.status", bo.getEquStatus());
+        /**
+         * equTypeId = 0 鏃舵煡璇㈡墍鏈夎澶囷紙榛樿鏍圭洰褰昳d涓�0锛岃瑙丼ysEquTypeServiceImpl涓璼electEquTypeTreeList锛�
+         * equTypeId   涓哄叾浠栧�兼椂鍙煡褰撳墠璁惧绫诲瀷id鍜屽悗浠h澶囩被鍨媔d
+         */
+        if (bo.getEquTypeId() != null && bo.getEquTypeId() > 0) {
+            List<Long> allDescendantIds = getAllDescendantIds(bo.getEquTypeId());
+            qw.in("c.equ_type_id", allDescendantIds);
+        }
+
         return qw;
     }
 
     /**
+     * 鏍规嵁id锛岃幏鍙栨墍鏈夊悗浠d
+     * @param rootId
+     * @return
+     */
+    public List<Long> getAllDescendantIds(Long rootId) {
+        List<Long> result = new ArrayList<>();
+        result.add(rootId);
+        collectDescendants(rootId, result);
+        return result;
+    }
+
+    private void collectDescendants(Long currentId, List<Long> collector) {
+        QueryWrapper<EimsEquType> equTypeWrapper = new QueryWrapper<>();
+        equTypeWrapper.lambda().eq(EimsEquType::getParentId, currentId);
+
+        List<EimsEquTypeVo> children = equTypeMapper.selectVoList(equTypeWrapper);
+        if (children != null && !children.isEmpty()) {
+            for (EimsEquTypeVo child : children) {
+                Long childId = child.getEquTypeId();
+                collector.add(childId);
+                collectDescendants(childId, collector);
+            }
+        }
+    }
+
+    /**
      * 鏂板鐩樼偣鏄庣粏
      *
      * @param bo 鐩樼偣鏄庣粏
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
index a97f8f8..b1667ae 100644
--- 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
@@ -7,23 +7,24 @@
     </resultMap>
 
     <select id="selectInventoryDetailList" resultMap="EimsInventoryDetailResult">
-        SELECT c.equ_code equCode,
+        SELECT a.id id, c.equ_code equCode,
         c.equ_name equName,
         c.asset_no equAssetNo,
         e.dept_name deptName,
         d.type_name equTypeName,
         c.location location,
+        a.`status` status,
         b.`status` inventoryStatus,
         c.`status` equStatus,
         d.`status` typeStatus,
-        b.inventory_user inventoryUser
+        f.nick_name 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
+        LEFT JOIN eims_inventory b on a.inventory_id = b.inventory_id
+        LEFT JOIN eims_equ c on a.equ_id = c.equ_id
+        LEFT JOIN eims_equ_type d on c.equ_type_id = d.equ_type_id
+        LEFT JOIN sys_dept e on e.dept_id = c.dept_used
+        LEFT JOIN sys_user f on b.inventory_user = f.user_id
         ${ew.getCustomSqlSegment}
     </select>
-
 
 </mapper>

--
Gitblit v1.9.3