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