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