From f9a12ecb4ea4b7b103b50634335704140237fef7 Mon Sep 17 00:00:00 2001
From: 朱桂飞 <zhuguifei@zhuguifeideMacBook-Air.local>
Date: 星期三, 19 二月 2025 15:11:28 +0800
Subject: [PATCH] 完成工具借用、归还相关
---
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsFixtureServiceImpl.java | 1
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/EimsFixtureBorrow.java | 88 ++
eims-ui/apps/web-antd/src/views/eims/equ-trial/equ-trial-drawer.vue | 43 +
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsFixtureBorrowVo.java | 127 +++
eims-ui/apps/web-antd/src/views/eims/equ-statu/data.tsx | 9
eims-ui/apps/web-antd/src/views/eims/fixture-borrow/fixture-borrow-drawer.vue | 242 ++++++
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsFixtureBorrowBo.java | 95 ++
eims-ui/apps/web-antd/src/views/eims/fixture-borrow/data.tsx | 234 ++++++
eims-ui/apps/web-antd/src/views/eims/fixture/dashboard/index.vue | 17
eims-ui/packages/@core/base/shared/src/constants/dict-enum.ts | 4
eims-ui/apps/web-antd/src/views/eims/repair-req/use-role-base-filters.ts | 2
eims-ui/apps/web-antd/src/views/eims/fixture/data.tsx | 28
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/IEimsFixtureBorrowService.java | 68 +
eims-ui/apps/web-antd/src/views/eims/fixture/index.vue | 84 +
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/utils/DataFilterUtil.java | 42 +
eims-ui/apps/web-antd/src/api/eims/fixture-borrow/model.d.ts | 66 +
eims-ui/apps/web-antd/src/views/eims/fixture-borrow/index.vue | 237 ++++++
eims/ruoyi-modules/lb-eims/src/main/resources/mapper/eims/EimsFixtureBorrowMapper.xml | 7
eims-ui/apps/web-antd/src/views/eims/fixture/dashboard/type.js | 0
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsFixtureBorrowServiceImpl.java | 211 ++++++
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsFixtureVo.java | 13
eims-ui/apps/web-antd/src/api/eims/fixture-borrow/index.ts | 62 +
eims-ui/apps/web-antd/src/views/eims/components/fixture-modal.vue | 49 +
eims-ui/apps/web-antd/src/views/eims/equ-trial/index.vue | 9
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/controller/EimsFixtureBorrowController.java | 105 +++
eims-ui/apps/web-antd/src/views/eims/equ-trial/data.tsx | 9
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsFixtureBo.java | 13
eims-ui/apps/web-antd/src/views/eims/repair-req/index.vue | 5
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/mapper/EimsFixtureBorrowMapper.java | 15
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/EimsFixture.java | 10
eims-ui/apps/web-antd/src/views/eims/equ-statu/index.vue | 3
eims-ui/apps/web-antd/src/views/eims/fixture/fixture-drawer.vue | 2
eims-ui/apps/web-antd/src/views/eims/fixture/dashboard/data.tsx | 91 ++
eims-ui/apps/web-antd/src/views/eims/equ-statu/equ-statu-drawer.vue | 49
eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsRepairReqServiceImpl.java | 60 +
35 files changed, 2,043 insertions(+), 57 deletions(-)
diff --git a/eims-ui/apps/web-antd/src/api/eims/fixture-borrow/index.ts b/eims-ui/apps/web-antd/src/api/eims/fixture-borrow/index.ts
new file mode 100644
index 0000000..84042b3
--- /dev/null
+++ b/eims-ui/apps/web-antd/src/api/eims/fixture-borrow/index.ts
@@ -0,0 +1,62 @@
+import type { IDS, PageQuery, PageResult } from '#/api/common';
+import type { FixBorrowVO } from '#/api/eims/fixture-borrow/model';
+
+import { commonExport } from '#/api/helper';
+import { requestClient } from '#/api/request';
+
+enum Api {
+ fixBorrowExport = '/eims/fixBorrow/export',
+ fixBorrowImport = '/eims/fixBorrow/importData',
+ fixBorrowList = '/eims/fixBorrow/list',
+ root = '/eims/fixBorrow'
+}
+
+/**
+ * 鏌ヨ銆愬伐鍏峰�熺敤銆戝垪琛�
+ * @param query
+ * @returns {*}
+ */
+
+export function listFixBorrow(params?: PageQuery) {
+ return requestClient.get<PageResult<FixBorrowVO>>(Api.fixBorrowList, { params });
+}
+
+/**
+ * 鏌ヨ銆愬伐鍏峰�熺敤銆戣缁�
+ * @param fixId
+ */
+export function getFixBorrow(fixId: any) {
+ return requestClient.get<FixBorrowVO>(`${Api.root}/${fixId}`);
+}
+
+/**
+ * 鏂板銆愬伐鍏峰�熺敤銆�
+ * @param data
+ */
+export function addFixBorrow(data: any) {
+ return requestClient.postWithMsg<void>(Api.root, data);
+}
+
+/**
+ * 淇敼銆愬伐鍏峰�熺敤銆�
+ * @param data
+ */
+export function updateFixBorrow(data: any) {
+ return requestClient.putWithMsg<void>(Api.root, data);
+}
+
+/**
+ * 鍒犻櫎銆愬伐鍏峰�熺敤銆�
+ * @param fixIds
+ */
+export function delFixBorrow(fixIds: IDS) {
+ return requestClient.deleteWithMsg<void>(`${Api.root}/${fixIds}`);
+}
+
+/**
+ * 瀵煎嚭銆愬伐鍏峰�熺敤銆�
+ * @param data
+ */
+export function fixBorrowExport(data: any) {
+ return commonExport(Api.fixBorrowExport, data);
+}
diff --git a/eims-ui/apps/web-antd/src/api/eims/fixture-borrow/model.d.ts b/eims-ui/apps/web-antd/src/api/eims/fixture-borrow/model.d.ts
new file mode 100644
index 0000000..1d796fe
--- /dev/null
+++ b/eims-ui/apps/web-antd/src/api/eims/fixture-borrow/model.d.ts
@@ -0,0 +1,66 @@
+export interface FixBorrowVO {
+ /**
+ *
+ */
+ id: number | string;
+
+ /**
+ * 鍊熺敤宸ュ叿id
+ */
+ fixtureId: number | string;
+
+ /**
+ * 鍊熺敤宸ュ叿鍚嶇О
+ */
+ fixtureName: string;
+
+ /**
+ * 鍊熺敤閮ㄩ棬
+ */
+ borrowDept: number;
+
+ /**
+ * 鍊熺敤浜�
+ */
+ borrowUser: number;
+
+ /**
+ * 缁忓姙浜�
+ */
+ agentUser: number;
+
+ /**
+ * 缁忓姙浜�
+ */
+ agentUserName: string;
+
+ /**
+ * 鍊熺敤璁板綍鐘舵�侊紙瀛楀吀锛�
+ */
+ status: string;
+
+ /**
+ * 鍊熺敤鏃堕棿
+ */
+ borrowTime: string;
+
+ /**
+ * 棰勮褰掕繕鏃堕棿
+ */
+ planReturnTime: string;
+
+ /**
+ * 褰掕繕鏃堕棿
+ */
+ returnTime: string;
+
+ /**
+ * 鍊熺敤鐞嗙敱
+ */
+ borrowReason: string;
+
+ /**
+ * 澶囨敞
+ */
+ remark: string;
+}
diff --git a/eims-ui/apps/web-antd/src/views/eims/components/fixture-modal.vue b/eims-ui/apps/web-antd/src/views/eims/components/fixture-modal.vue
new file mode 100644
index 0000000..1f38600
--- /dev/null
+++ b/eims-ui/apps/web-antd/src/views/eims/components/fixture-modal.vue
@@ -0,0 +1,49 @@
+<script setup lang="ts">
+import { ref } from 'vue';
+
+import { useVbenModal } from '@vben/common-ui';
+
+import { message } from 'ant-design-vue';
+
+import InnerView from '#/views/eims/fixture/index.vue';
+
+const emit = defineEmits<{ updateSelect: [any] }>();
+
+const [BasicModal, modalApi] = useVbenModal({
+ fullscreenButton: false,
+ draggable: true,
+ onCancel: handleCancel,
+ onConfirm: handleConfirm
+});
+const innerView = ref();
+
+async function handleConfirm() {
+ try {
+ modalApi.modalLoading(true);
+ const tableSelect = innerView.value.tableSelect();
+ if (tableSelect.length > 1) {
+ message.error('鏈�澶氬彧鑳介�夋嫨涓�涓伐鍏凤紒');
+ modalApi.modalLoading(false);
+ return false;
+ }
+ emit('updateSelect', tableSelect[0]);
+ await handleCancel();
+ } catch (error) {
+ console.error(error);
+ } finally {
+ modalApi.modalLoading(false);
+ }
+}
+
+async function handleCancel() {
+ modalApi.close();
+}
+</script>
+
+<template>
+ <BasicModal :fullscreen-button="true" class="w-[800px]">
+ <InnerView ref="innerView" />
+ </BasicModal>
+</template>
+
+<style scoped></style>
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 3f9bed4..8bb9259 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
@@ -101,7 +101,16 @@
allowClear: true,
getPopupContainer
},
+ dependencies: {
+ show: () => false,
+ triggerFields: ['']
+ },
fieldName: 'equId',
+ label: '璁惧id'
+ },
+ {
+ component: 'Input',
+ fieldName: 'equName',
label: '璁惧鍚嶇О'
},
{
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 590f7a9..a541d60 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
@@ -1,14 +1,17 @@
<script setup lang="ts">
import { computed, ref } from 'vue';
-import { useVbenDrawer } from '@vben/common-ui';
+import { useVbenDrawer, useVbenModal } from '@vben/common-ui';
import { $t } from '@vben/locales';
import { addFullName, cloneDeep, getPopupContainer } from '@vben/utils';
+
+import { InputSearch } from 'ant-design-vue';
import { useVbenForm } from '#/adapter/form';
import { listEqu } from '#/api/eims/equ';
import { addEquStatu, getEquStatu, updateEquStatu } from '#/api/eims/equ-statu';
import { getDeptTree, userList } from '#/api/system/user';
+import equModal from '#/views/eims/components/equ-modal.vue';
import { drawerSchema } from './data';
@@ -46,31 +49,14 @@
// 鍒濆鍖�
await setupEquSelect();
await setupDeptSelect();
-
- // 璁惧璇︽儏椤垫墦寮�鎸囧畾璁惧id
- const { equId } = drawerApi.getData() as { equId?: number | string };
- if (equId) {
- await formApi.setValues({ equId});
- }
// 鏇存柊 && 璧嬪��
if (isUpdate.value && id) {
const record = await getEquStatu(id);
await formApi.setValues(record);
- if(isUpdate.value && record.userDept){
+ if (isUpdate.value && record.userDept) {
await setupUserOptions(record.userDept);
}
}
- // 璁惧id鏈夊�兼椂涓嶅厑璁哥紪杈戯紙1.缂栬緫 2.璁惧璇︽儏椤垫墦寮�锛�
- const flag = equId !== undefined || isUpdate.value;
- formApi.updateSchema([
- {
- componentProps: {
- disabled: flag
- },
- fieldName: 'equId'
- }
- ]);
-
drawerApi.drawerLoading(false);
}
});
@@ -78,7 +64,7 @@
async function setupEquSelect() {
const equPageResult = await listEqu({
pageNum: 1,
- pageSize: 1000,
+ pageSize: 1000
});
// 浣跨敤map鏉ヨ窡韪凡缁忛亣鍒扮殑equId锛屼娇鐢╢ilter鏉ヨ繃婊ゆ帀閲嶅鐨勫厓绱犮��
const uniqueItems = equPageResult.rows.filter((item, index, self) => index === self.findIndex((tm) => tm.equId === item.equId));
@@ -200,10 +186,31 @@
drawerApi.close();
await formApi.resetForm();
}
+
+// EQU modal
+const [EquModal, equModalApi] = useVbenModal({
+ connectedComponent: equModal,
+ draggable: true,
+ title: '閫夋嫨鎴愬憳'
+});
+
+function handleEquModal() {
+ equModalApi.setData({});
+ equModalApi.open();
+}
+
+async function selectEqu(equ: any) {
+ await formApi.setValues({ 'equId': equ.equId, 'equName': equ.equName });
+}
</script>
<template>
<BasicDrawer :close-on-click-modal="false" :title="title" class="w-[600px]">
- <BasicForm />
+ <BasicForm>
+ <template #equName="slotProps">
+ <InputSearch :enter-button="true" placeholder="璇烽�夋嫨" @search="handleEquModal" v-bind="slotProps" />
+ </template>
+ </BasicForm>
+ <EquModal :disabled="true" class="w-[1200px]" @update-equ="selectEqu" />
</BasicDrawer>
</template>
diff --git a/eims-ui/apps/web-antd/src/views/eims/equ-statu/index.vue b/eims-ui/apps/web-antd/src/views/eims/equ-statu/index.vue
index 6cd3155..9ec0b1d 100644
--- a/eims-ui/apps/web-antd/src/views/eims/equ-statu/index.vue
+++ b/eims-ui/apps/web-antd/src/views/eims/equ-statu/index.vue
@@ -52,6 +52,9 @@
height: 'auto',
keepSource: true,
pagerConfig: {},
+ toolbarConfig: {
+ enabled: !props.equDetailFlag
+ },
proxyConfig: {
ajax: {
query: async ({ page }, formValues = {}) => {
diff --git a/eims-ui/apps/web-antd/src/views/eims/equ-trial/data.tsx b/eims-ui/apps/web-antd/src/views/eims/equ-trial/data.tsx
index 087fc37..87f99a5 100644
--- a/eims-ui/apps/web-antd/src/views/eims/equ-trial/data.tsx
+++ b/eims-ui/apps/web-antd/src/views/eims/equ-trial/data.tsx
@@ -121,7 +121,16 @@
allowClear: true,
getPopupContainer
},
+ dependencies: {
+ show: () => false,
+ triggerFields: ['']
+ },
fieldName: 'equId',
+ label: '璁惧id'
+ },
+ {
+ component: 'Input',
+ fieldName: 'equName',
label: '璁惧鍚嶇О'
},
{
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 48643ce..99daa05 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
@@ -1,14 +1,17 @@
<script setup lang="ts">
import { computed, ref } from 'vue';
-import { useVbenDrawer } from '@vben/common-ui';
+import { useVbenDrawer, useVbenModal } from '@vben/common-ui';
import { $t } from '@vben/locales';
import { addFullName, cloneDeep, getPopupContainer } from '@vben/utils';
+
+import { InputSearch, Modal } from 'ant-design-vue';
import { useVbenForm } from '#/adapter/form';
import { listEqu } from '#/api/eims/equ';
import { addEquTrial, getEquTrial, updateEquTrial } from '#/api/eims/equ-trial';
import { getDeptTree, userList } from '#/api/system/user';
+import equModal from '#/views/eims/components/equ-modal.vue';
import { drawerSchema } from './data';
@@ -54,7 +57,7 @@
if (isUpdate.value && id) {
const record = await getEquTrial(id);
await formApi.setValues(record);
- if(isUpdate.value && record.operatorDept){
+ if (isUpdate.value && record.operatorDept) {
await setupUserOptions(record.operatorDept);
}
}
@@ -172,6 +175,7 @@
}
]);
}
+
async function handleConfirm() {
try {
drawerApi.drawerLoading(true);
@@ -194,10 +198,43 @@
drawerApi.close();
await formApi.resetForm();
}
+
+// EQU modal
+const [EquModal, equModalApi] = useVbenModal({
+ connectedComponent: equModal,
+ draggable: true,
+ title: '閫夋嫨鎴愬憳'
+});
+
+function handleEquModal() {
+ equModalApi.setData({});
+ equModalApi.open();
+}
+
+async function selectEqu(equ: any) {
+ // TODO 纭畾涓庡瓧鍏稿搴攕ys_equ_status
+ if (equ.status !== null && equ.status === '0') {
+ await formApi.setValues({ 'equId': equ.equId, 'equName': equ.equName });
+ } else {
+ Modal.confirm({
+ title: '鎻愮ず',
+ okType: 'danger',
+ content: `褰撳墠璁惧鐘舵�佷笉灞炰簬璇曠敤璁惧锛岀‘璁ゆ坊鍔犲悧锛焋,
+ onOk: async () => {
+ await formApi.setValues({ 'equId': equ.equId, 'equName': equ.equName });
+ }
+ });
+ }
+}
</script>
<template>
<BasicDrawer :close-on-click-modal="false" :title="title" class="w-[600px]">
- <BasicForm />
+ <BasicForm>
+ <template #equName="slotProps">
+ <InputSearch :enter-button="true" placeholder="璇烽�夋嫨" @search="handleEquModal" v-bind="slotProps" />
+ </template>
+ </BasicForm>
+ <EquModal :disabled="true" class="w-[1200px]" @update-equ="selectEqu" />
</BasicDrawer>
</template>
diff --git a/eims-ui/apps/web-antd/src/views/eims/equ-trial/index.vue b/eims-ui/apps/web-antd/src/views/eims/equ-trial/index.vue
index 3534a0c..d914f91 100644
--- a/eims-ui/apps/web-antd/src/views/eims/equ-trial/index.vue
+++ b/eims-ui/apps/web-antd/src/views/eims/equ-trial/index.vue
@@ -52,6 +52,9 @@
height: 'auto',
keepSource: true,
pagerConfig: {},
+ toolbarConfig: {
+ enabled: !props.equDetailFlag
+ },
proxyConfig: {
ajax: {
query: async ({ page }, formValues = {}) => {
@@ -77,7 +80,7 @@
// 杩滅▼鎺掑簭
remote: true,
// 鏀寔澶氬瓧娈垫帓搴� 榛樿鍏抽棴
- multiple: true,
+ multiple: true
},
id: 'eims-equ-trial-index'
};
@@ -86,8 +89,8 @@
formOptions,
gridOptions,
gridEvents: {
- sortChange: (sortParams) => vxeSortEvent(tableApi, sortParams),
- },
+ sortChange: (sortParams) => vxeSortEvent(tableApi, sortParams)
+ }
});
const [EquTrialDrawer, equTrialDrawerApi] = useVbenDrawer({
diff --git a/eims-ui/apps/web-antd/src/views/eims/fixture-borrow/data.tsx b/eims-ui/apps/web-antd/src/views/eims/fixture-borrow/data.tsx
new file mode 100644
index 0000000..8edf2c8
--- /dev/null
+++ b/eims-ui/apps/web-antd/src/views/eims/fixture-borrow/data.tsx
@@ -0,0 +1,234 @@
+import type { VxeGridProps } from '#/adapter/vxe-table';
+
+import { DictEnum } from '@vben/constants';
+import { getPopupContainer } from '@vben/utils';
+
+import { type FormSchemaGetter } from '#/adapter/form';
+import { getDictOptions } from '#/utils/dict';
+import { renderDict } from '#/utils/render';
+
+export const querySchema: FormSchemaGetter = () => [
+ {
+ component: 'Input',
+ fieldName: 'fixtureName',
+ label: '宸ュ叿鍚嶇О'
+ },
+ {
+ component: 'TreeSelect',
+ // 鍦╠rawer閲屾洿鏂� 杩欓噷涓嶉渶瑕侀粯璁ょ殑componentProps
+ defaultValue: undefined,
+ fieldName: 'borrowDept',
+ label: '鍊熺敤閮ㄩ棬'
+ },
+ {
+ component: 'Select',
+ componentProps: {
+ showSearch: true,
+ allowClear: true,
+ getPopupContainer
+ },
+ fieldName: 'borrowUser',
+ label: '鍊熺敤浜�'
+ },
+ {
+ component: 'Select',
+ componentProps: {
+ options: getDictOptions(DictEnum.FIXTURE_BORROW_RECORD_STATUS)
+ },
+ fieldName: 'status',
+ label: '鍊熺敤鐘舵��'
+ },
+ {
+ component: 'RangePicker',
+ fieldName: 'borrowTime',
+ label: '鍊熺敤鏃堕棿'
+ }
+];
+
+export const columns: VxeGridProps['columns'] = [
+ { type: 'checkbox', width: 60, fixed: 'left' },
+ {
+ title: '宸ュ叿鍚嶇О',
+ field: 'fixtureName',
+ minWidth: 100,
+ fixed: 'left',
+ slots: { default: 'fixtureName' }
+ },
+ {
+ title: '鍊熺敤鐘舵��',
+ field: 'status',
+ sortable: true,
+ slots: {
+ default: ({ row }) => {
+ if (row.status === null || row.status === '') {
+ return '';
+ }
+ return renderDict(row.status, DictEnum.FIXTURE_BORROW_RECORD_STATUS);
+ }
+ },
+ minWidth: 100,
+ fixed: 'left'
+ },
+ {
+ title: '鍊熺敤閮ㄩ棬',
+ field: 'borrowDeptName',
+ minWidth: 120
+ },
+ {
+ title: '鍊熺敤浜�',
+ field: 'borrowUserName',
+ minWidth: 100
+ },
+ {
+ title: '缁忓姙浜�',
+ field: 'agentUserName',
+ minWidth: 100
+ },
+ {
+ title: '鍊熺敤鏃堕棿',
+ field: 'borrowTime',
+ minWidth: 120
+ },
+ {
+ title: '鍊熺敤鍘熷洜',
+ field: 'borrowReason',
+ minWidth: 140
+ },
+ {
+ title: '棰勮褰掕繕鏃堕棿',
+ field: 'planReturnTime',
+ minWidth: 160
+ },
+ {
+ title: '瀹為檯褰掕繕鏃堕棿',
+ field: 'returnTime',
+ minWidth: 160
+ },
+ {
+ field: 'action',
+ fixed: 'right',
+ slots: { default: 'action' },
+ title: '鎿嶄綔',
+ width: 200
+ }
+];
+
+export const drawerSchema: FormSchemaGetter = () => [
+ {
+ component: 'Input',
+ dependencies: {
+ show: () => false,
+ triggerFields: ['']
+ },
+ fieldName: 'id'
+ },
+ {
+ component: 'Select',
+ componentProps: {
+ showSearch: true,
+ allowClear: true,
+ getPopupContainer
+ },
+ dependencies: {
+ show: () => false,
+ triggerFields: ['']
+ },
+ fieldName: 'fixtureId',
+ label: '宸ュ叿id',
+ rules: 'required'
+ },
+ {
+ component: 'Input',
+ fieldName: 'fixtureName',
+ label: '宸ュ叿鍚嶇О',
+ rules: 'required'
+ },
+ {
+ component: 'TreeSelect',
+ // 鍦╠rawer閲屾洿鏂� 杩欓噷涓嶉渶瑕侀粯璁ょ殑componentProps
+ defaultValue: undefined,
+ fieldName: 'borrowDept',
+ label: '鍊熺敤閮ㄩ棬',
+ rules: 'selectRequired'
+ },
+ {
+ component: 'Select',
+ componentProps: {
+ showSearch: true,
+ allowClear: true,
+ getPopupContainer
+ },
+ fieldName: 'borrowUser',
+ label: '鍊熺敤浜�',
+ rules: 'required'
+ },
+ {
+ component: 'Select',
+ componentProps: {
+ showSearch: true,
+ allowClear: true,
+ getPopupContainer
+ },
+ fieldName: 'agentUser',
+ dependencies: {
+ show: () => false,
+ triggerFields: ['']
+ },
+ label: '缁忓姙浜�'
+ },
+ {
+ component: 'Input',
+ fieldName: 'agentUserName',
+ label: '缁忓姙浜�',
+ },
+ {
+ component: 'RadioGroup',
+ componentProps: {
+ buttonStyle: 'solid',
+ options: getDictOptions(DictEnum.FIXTURE_BORROW_RECORD_STATUS),
+ optionType: 'button'
+ },
+ defaultValue: '0',
+ fieldName: 'status',
+ label: '鍊熺敤鐘舵��'
+ },
+ {
+ component: 'DatePicker',
+ componentProps: {
+ format: 'YYYY-MM-DD HH:mm:ss',
+ showTime: true,
+ valueFormat: 'YYYY-MM-DD HH:mm:ss',
+ getPopupContainer
+ },
+ fieldName: 'borrowTime',
+ label: '鍊熺敤鏃堕棿'
+ },
+ {
+ component: 'Textarea',
+ formItemClass: 'items-baseline',
+ fieldName: 'borrowReason',
+ label: '鍊熺敤鍘熷洜'
+ },
+ {
+ component: 'DatePicker',
+ componentProps: {
+ format: 'YYYY-MM-DD HH:mm:ss',
+ showTime: true,
+ valueFormat: 'YYYY-MM-DD HH:mm:ss',
+ getPopupContainer
+ },
+ fieldName: 'planReturnTime',
+ label: '棰勮褰掕繕鏃堕棿'
+ },
+ {
+ component: 'DatePicker',
+ componentProps: {
+ format: 'YYYY-MM-DD HH:mm:ss',
+ showTime: true,
+ valueFormat: 'YYYY-MM-DD HH:mm:ss',
+ getPopupContainer
+ },
+ fieldName: 'returnTime',
+ label: '瀹為檯褰掕繕鏃堕棿'
+ }
+];
diff --git a/eims-ui/apps/web-antd/src/views/eims/fixture-borrow/fixture-borrow-drawer.vue b/eims-ui/apps/web-antd/src/views/eims/fixture-borrow/fixture-borrow-drawer.vue
new file mode 100644
index 0000000..564077c
--- /dev/null
+++ b/eims-ui/apps/web-antd/src/views/eims/fixture-borrow/fixture-borrow-drawer.vue
@@ -0,0 +1,242 @@
+<script setup lang="ts">
+import { computed, ref } from 'vue';
+
+import { useVbenDrawer, useVbenModal } from '@vben/common-ui';
+import { $t } from '@vben/locales';
+import { addFullName, cloneDeep, getPopupContainer } from '@vben/utils';
+
+import { InputSearch } from 'ant-design-vue';
+
+import { useVbenForm } from '#/adapter/form';
+import { addFixBorrow, getFixBorrow, updateFixBorrow } from '#/api/eims/fixture-borrow';
+import { userProfile } from '#/api/system/profile';
+import { getDeptTree, userList } from '#/api/system/user';
+import fixModal from '#/views/eims/components/fixture-modal.vue';
+import userModal from '#/views/eims/components/user-modal.vue';
+
+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();
+
+ // 浠庡伐鍏峰彴璐﹂〉闈㈡墦寮�鐗规畩澶勭悊
+ const { fixturePage } = drawerApi.getData() as { fixturePage?: boolean };
+ if (fixturePage) {
+ formApi.updateSchema([
+ {
+ componentProps: {
+ disabled: false
+ },
+ fieldName: 'fixtureName'
+ }
+ ]);
+ await updateCustomData(drawerApi.getData());
+ }
+
+ formApi.updateSchema([
+ {
+ componentProps: {
+ disabled: isUpdate.value || fixturePage
+ },
+ fieldName: 'fixtureName'
+ }
+ ]);
+ // 鏇存柊 && 璧嬪��
+ if (isUpdate.value && id) {
+ const record = await getFixBorrow(id);
+ await formApi.setValues(record);
+ if (isUpdate.value && record.borrowDept) {
+ await setupUserOptions(record.borrowDept);
+ }
+ }
+
+ drawerApi.drawerLoading(false);
+ }
+});
+
+/**
+ * 浠庤澶囧彴璐﹂〉闈㈡墦寮�鏇存柊閮ㄥ垎鏁版嵁
+ * @param data
+ */
+async function updateCustomData(data: any) {
+ const resp = await userProfile();
+ const deptId = resp?.user?.deptId;
+ await setupUserOptions(deptId);
+ data.borrowDept = deptId;
+ await formApi.setValues(data);
+}
+
+/**
+ * 鐢ㄦ埛鐨勫姞杞�
+ */
+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: 'borrowUser'
+ }
+ ]);
+}
+
+/**
+ * 鍒濆鍖栭儴闂ㄩ�夋嫨
+ */
+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.operatorId = undefined;
+ },
+ placeholder: '璇烽�夋嫨',
+ showSearch: true,
+ treeData: deptTree,
+ treeDefaultExpandAll: true,
+ treeLine: { showLeafIcon: false },
+ // 绛涢�夌殑瀛楁
+ treeNodeFilterProp: 'label',
+ // 閫変腑鍚庢樉绀哄湪杈撳叆妗嗙殑鍊�
+ treeNodeLabelProp: 'fullName'
+ }),
+ fieldName: 'borrowDept'
+ }
+ ]);
+}
+async function handleConfirm() {
+ try {
+ drawerApi.drawerLoading(true);
+ const { valid } = await formApi.validate();
+ if (!valid) {
+ return;
+ }
+ const data = cloneDeep(await formApi.getValues());
+ await (isUpdate.value ? updateFixBorrow(data) : addFixBorrow(data));
+ emit('reload');
+ await handleCancel();
+ } catch (error) {
+ console.error(error);
+ } finally {
+ drawerApi.drawerLoading(false);
+ }
+}
+
+async function handleCancel() {
+ drawerApi.close();
+ await formApi.resetForm();
+}
+
+// user modal
+const [UserModal, userModalApi] = useVbenModal({
+ connectedComponent: userModal,
+ draggable: true,
+ title: '閫夋嫨鎴愬憳'
+});
+
+function handleUserModal() {
+ userModalApi.setData({});
+ userModalApi.open();
+}
+
+/**
+ * 鏇存柊閫夋嫨鐨勬垚鍛�
+ * @param user
+ */
+async function selectUser(user: any) {
+ await formApi.setValues({ 'agentUser': user.userId, 'agentUserName': user.nickName });
+}
+
+// user modal
+const [FixModal, fixModalApi] = useVbenModal({
+ connectedComponent: fixModal,
+ draggable: true,
+ title: '閫夋嫨宸ュ叿'
+});
+
+function handleFixModal() {
+ fixModalApi.setData({});
+ fixModalApi.open();
+}
+
+/**
+ * 鏇存柊閫夋嫨鐨勫伐鍏�
+ * @param fix
+ */
+async function selectFix(fix: any) {
+ await formApi.setValues({ 'fixtureId': fix.id, 'fixtureName': fix.fixtureName });
+}
+</script>
+
+<template>
+ <BasicDrawer :close-on-click-modal="false" :title="title" class="w-[600px]">
+ <BasicForm>
+ <template #agentUserName="slotProps">
+ <InputSearch :enter-button="true" placeholder="璇烽�夋嫨" @search="handleUserModal" v-bind="slotProps" />
+ </template>
+ <template #fixtureName="slotProps">
+ <InputSearch :enter-button="true" placeholder="璇烽�夋嫨" @search="handleFixModal" v-bind="slotProps" />
+ </template>
+ </BasicForm>
+ <UserModal class="w-[1200px]" @select-user="selectUser" />
+ <FixModal class="w-[1200px]" @update-select="selectFix" />
+ </BasicDrawer>
+</template>
diff --git a/eims-ui/apps/web-antd/src/views/eims/fixture-borrow/index.vue b/eims-ui/apps/web-antd/src/views/eims/fixture-borrow/index.vue
new file mode 100644
index 0000000..92bcc07
--- /dev/null
+++ b/eims-ui/apps/web-antd/src/views/eims/fixture-borrow/index.vue
@@ -0,0 +1,237 @@
+<script setup lang="ts">
+import type { Recordable } from '@vben/types';
+
+import { onMounted } from 'vue';
+
+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 { delFixBorrow, fixBorrowExport, listFixBorrow } from '#/api/eims/fixture-borrow';
+import { getDeptTree, userList } from '#/api/system/user';
+import { commonDownloadExcel } from '#/utils/file/download';
+
+import { columns, querySchema } from './data';
+import fixBorrowDrawer from './fixture-borrow-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: [
+ ['borrowTime', ['params[beginBorrowTime]', 'params[endBorrowTime]'], ['YYYY-MM-DD 00:00:00', 'YYYY-MM-DD 23:59:59']],
+ ['planReturnTime', ['params[beginPlanReturnTime]', 'params[endPlanReturnTime]'], ['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 = {}) => {
+ return await listFixBorrow({
+ pageNum: page.currentPage,
+ pageSize: page.pageSize,
+ ...formValues
+ });
+ }
+ }
+ },
+ rowConfig: {
+ isHover: true,
+ keyField: 'id'
+ },
+ sortConfig: {
+ // 杩滅▼鎺掑簭
+ remote: true,
+ // 鏀寔澶氬瓧娈垫帓搴� 榛樿鍏抽棴
+ multiple: true
+ },
+ id: 'fixture-borrow-index'
+};
+
+const [BasicTable, tableApi] = useVbenVxeGrid({
+ formOptions,
+ gridOptions,
+ gridEvents: {
+ sortChange: (sortParams) => vxeSortEvent(tableApi, sortParams)
+ }
+});
+
+const [FixBorrowDrawer, fixBorrowDrawerApi] = useVbenDrawer({
+ connectedComponent: fixBorrowDrawer
+});
+
+function handleAdd() {
+ fixBorrowDrawerApi.setData({});
+ fixBorrowDrawerApi.open();
+}
+
+async function handleEdit(record: Recordable<any>) {
+ fixBorrowDrawerApi.setData({ id: record.id });
+ fixBorrowDrawerApi.open();
+}
+
+async function handleDelete(row: Recordable<any>) {
+ await delFixBorrow(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 delFixBorrow(ids);
+ await tableApi.query();
+ }
+ });
+}
+
+function handleDownloadExcel() {
+ commonDownloadExcel(fixBorrowExport, '宸ュ叿鍊熺敤璁板綍', tableApi.formApi.form.values, {
+ fieldMappingTime: formOptions.fieldMappingTime
+ });
+}
+/**
+ * 鐢ㄦ埛鐨勫姞杞�
+ */
+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: 'borrowUser'
+ }
+ ]);
+}
+
+/**
+ * 鍒濆鍖栭儴闂ㄩ�夋嫨
+ */
+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.inventoryUser = undefined;
+ },
+ placeholder: '璇烽�夋嫨',
+ showSearch: true,
+ treeData: deptTree,
+ treeDefaultExpandAll: true,
+ treeLine: { showLeafIcon: false },
+ // 绛涢�夌殑瀛楁
+ treeNodeFilterProp: 'label',
+ // 閫変腑鍚庢樉绀哄湪杈撳叆妗嗙殑鍊�
+ treeNodeLabelProp: 'fullName'
+ }),
+ fieldName: 'borrowDept'
+ }
+ ]);
+}
+
+onMounted(async () => {
+ await setupDeptSelect();
+});
+</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:fixtureBorrow:export']" @click="handleDownloadExcel">
+ {{ $t('pages.common.export') }}
+ </a-button>
+ <a-button
+ :disabled="!vxeCheckboxChecked(tableApi)"
+ danger
+ type="primary"
+ v-access:code="['eims:fixtureBorrow:remove']"
+ @click="handleMultiDelete"
+ >
+ {{ $t('pages.common.delete') }}
+ </a-button>
+ <a-button type="primary" v-access:code="['eims:fixtureBorrow:add']" @click="handleAdd">
+ {{ $t('pages.common.add') }}
+ </a-button>
+ </Space>
+ </template>
+
+ <template #fixtureName="{ row }">
+ <Space>
+ <span>{{ row.fixtureName }}</span>
+ </Space>
+ </template>
+
+ <template #action="{ row }">
+ <Space>
+ <ghost-button v-access:code="['eims:fixtureBorrow: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:fixtureBorrow:remove']" @click.stop="">
+ {{ $t('pages.common.delete') }}
+ </ghost-button>
+ </Popconfirm>
+ </Space>
+ </template>
+ </BasicTable>
+ </div>
+ <FixBorrowDrawer @reload="tableApi.query()" />
+ </Page>
+</template>
diff --git a/eims-ui/apps/web-antd/src/views/eims/fixture/dashboard/data.tsx b/eims-ui/apps/web-antd/src/views/eims/fixture/dashboard/data.tsx
new file mode 100644
index 0000000..40bb3eb
--- /dev/null
+++ b/eims-ui/apps/web-antd/src/views/eims/fixture/dashboard/data.tsx
@@ -0,0 +1,91 @@
+import type { AnalysisOverviewItem, WorkbenchTrendItem } from '@vben/common-ui';
+
+import { SvgBellIcon, SvgCakeIcon, SvgCardIcon, SvgDownloadIcon } from '@vben/icons';
+
+export const overviewItems: AnalysisOverviewItem[] = [
+ {
+ icon: SvgCardIcon,
+ title: '宸ュ叿鎬绘暟',
+ totalTitle: '宸ュ叿鎬绘暟',
+ totalValue: 120_000,
+ value: 2000
+ },
+ {
+ icon: SvgCakeIcon,
+ title: '鍙敤宸ュ叿鏁�',
+ totalTitle: '鍙敤宸ュ叿鏁�',
+ totalValue: 500_000,
+ value: 20_000
+ },
+ {
+ icon: SvgDownloadIcon,
+ title: '鏈�杩戝�熷嚭',
+ totalTitle: '鏈�杩戝�熷嚭',
+ totalValue: 120_000,
+ value: 8000
+ },
+ {
+ icon: SvgBellIcon,
+ title: '鏈�杩戞洿鏂�',
+ totalTitle: '鏈�杩戞洿鏂�',
+ totalValue: 50_000,
+ value: 5000
+ }
+];
+
+export const trendItems: WorkbenchTrendItem[] = [
+ {
+ avatar: 'svg:avatar-1',
+ content: `鍦� <a>寮�婧愮粍</a> 鍒涘缓浜嗛」鐩� <a>Vue</a>`,
+ date: '鍒氬垰',
+ title: '濞佸粔',
+ },
+ {
+ avatar: 'svg:avatar-2',
+ content: `鍏虫敞浜� <a>濞佸粔</a> `,
+ date: '1涓皬鏃跺墠',
+ title: '鑹炬枃',
+ },
+ {
+ avatar: 'svg:avatar-3',
+ content: `鍙戝竷浜� <a>涓汉鍔ㄦ��</a> `,
+ date: '1澶╁墠',
+ title: '鍏嬮噷鏂�',
+ },
+ {
+ avatar: 'svg:avatar-4',
+ content: `鍙戣〃鏂囩珷 <a>濡備綍缂栧啓涓�涓猇ite鎻掍欢</a> `,
+ date: '2澶╁墠',
+ title: 'Vben',
+ },
+ {
+ avatar: 'svg:avatar-1',
+ content: `鍥炲浜� <a>鏉板厠</a> 鐨勯棶棰� <a>濡備綍杩涜椤圭洰浼樺寲锛�</a>`,
+ date: '3澶╁墠',
+ title: '鐨壒',
+ },
+ {
+ avatar: 'svg:avatar-2',
+ content: `鍏抽棴浜嗛棶棰� <a>濡備綍杩愯椤圭洰</a> `,
+ date: '1鍛ㄥ墠',
+ title: '鏉板厠',
+ },
+ {
+ avatar: 'svg:avatar-3',
+ content: `鍙戝竷浜� <a>涓汉鍔ㄦ��</a> `,
+ date: '1鍛ㄥ墠',
+ title: '濞佸粔',
+ },
+ {
+ avatar: 'svg:avatar-4',
+ content: `鎺ㄩ�佷簡浠g爜鍒� <a>Github</a>`,
+ date: '2021-04-01 20:00',
+ title: '濞佸粔',
+ },
+ {
+ avatar: 'svg:avatar-4',
+ content: `鍙戣〃鏂囩珷 <a>濡備綍缂栧啓浣跨敤 Admin Vben</a> `,
+ date: '2021-03-01 20:00',
+ title: 'Vben',
+ },
+];
diff --git a/eims-ui/apps/web-antd/src/views/eims/fixture/dashboard/index.vue b/eims-ui/apps/web-antd/src/views/eims/fixture/dashboard/index.vue
new file mode 100644
index 0000000..d114a9a
--- /dev/null
+++ b/eims-ui/apps/web-antd/src/views/eims/fixture/dashboard/index.vue
@@ -0,0 +1,17 @@
+<script setup lang="ts">
+import { AnalysisOverview, Page, WorkbenchTrends } from '@vben/common-ui';
+
+import { overviewItems, trendItems } from './data';
+</script>
+
+<template>
+ <Page :auto-content-height="true">
+ <div class="h-full">
+ <AnalysisOverview :items="overviewItems" />
+ <WorkbenchTrends :items="trendItems" class="mt-5" title="鏈�鏂板姩鎬�" />
+ <div class="h-5"></div>
+ </div>
+ </Page>
+</template>
+
+<style scoped></style>
diff --git a/eims-ui/apps/web-antd/src/views/eims/fixture/dashboard/type.js b/eims-ui/apps/web-antd/src/views/eims/fixture/dashboard/type.js
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/eims-ui/apps/web-antd/src/views/eims/fixture/dashboard/type.js
diff --git a/eims-ui/apps/web-antd/src/views/eims/fixture/data.tsx b/eims-ui/apps/web-antd/src/views/eims/fixture/data.tsx
index 8b58bfd..406f76e 100644
--- a/eims-ui/apps/web-antd/src/views/eims/fixture/data.tsx
+++ b/eims-ui/apps/web-antd/src/views/eims/fixture/data.tsx
@@ -27,6 +27,14 @@
label: '宸ュ叿鐘舵��'
},
{
+ component: 'Select',
+ componentProps: {
+ options: getDictOptions(DictEnum.FIXTURE_BORROW_STATUS)
+ },
+ fieldName: 'borrowStatus',
+ label: '鍊熺敤鐘舵��'
+ },
+ {
component: 'Input',
fieldName: 'assetNo',
label: '璧勪骇缂栧彿'
@@ -101,6 +109,21 @@
fixed: 'left'
},
{
+ title: '鍊熺敤鐘舵��',
+ field: 'borrowStatus',
+ sortable: true,
+ slots: {
+ default: ({ row }) => {
+ if (row.borrowStatus === null || row.borrowStatus === '') {
+ return '';
+ }
+ return renderDict(row.borrowStatus, DictEnum.FIXTURE_BORROW_STATUS);
+ }
+ },
+ minWidth: 100,
+ fixed: 'left'
+ },
+ {
title: '绫诲瀷',
field: 'fixtureTypeName',
minWidth: 100
@@ -112,6 +135,11 @@
minWidth: 140
},
{
+ title: '鍊熺敤浜�',
+ field: 'borrowUserName',
+ minWidth: 100
+ },
+ {
title: '宸ュ叿缂栫爜',
field: 'fixtureCode',
sortable: true,
diff --git a/eims-ui/apps/web-antd/src/views/eims/fixture/fixture-drawer.vue b/eims-ui/apps/web-antd/src/views/eims/fixture/fixture-drawer.vue
index f91f8d6..4150940 100644
--- a/eims-ui/apps/web-antd/src/views/eims/fixture/fixture-drawer.vue
+++ b/eims-ui/apps/web-antd/src/views/eims/fixture/fixture-drawer.vue
@@ -36,8 +36,6 @@
const [BasicDrawer, drawerApi] = useVbenDrawer({
onCancel: handleCancel,
- closeOnPressEscape: true,
- placement: 'left',
onConfirm: handleConfirm,
async onOpenChange(isOpen) {
if (!isOpen) {
diff --git a/eims-ui/apps/web-antd/src/views/eims/fixture/index.vue b/eims-ui/apps/web-antd/src/views/eims/fixture/index.vue
index 76e3dde..022cd7f 100644
--- a/eims-ui/apps/web-antd/src/views/eims/fixture/index.vue
+++ b/eims-ui/apps/web-antd/src/views/eims/fixture/index.vue
@@ -1,11 +1,12 @@
<script setup lang="ts">
import type { Recordable } from '@vben/types';
-import { onMounted, ref } from 'vue';
-import { useRouter } from 'vue-router';
+import { computed, onMounted, ref } from 'vue';
+import { useAccess } from '@vben/access';
import { Page, useVbenDrawer, useVbenModal, type VbenFormProps } from '@vben/common-ui';
import { $t } from '@vben/locales';
+import { useUserStore } from '@vben/stores';
import { addFullName, getPopupContainer, getVxePopupContainer } from '@vben/utils';
import { Modal, Popconfirm, Space } from 'ant-design-vue';
@@ -14,14 +15,21 @@
import { delFixture, fixtureExport, listFixture } from '#/api/eims/fixture';
import { getDeptTree, userList } from '#/api/system/user';
import { commonDownloadExcel } from '#/utils/file/download';
+import fixtureBorrowDrawer from '#/views/eims/fixture-borrow/fixture-borrow-drawer.vue';
import { columns, querySchema } from './data';
import fixtureDrawer from './fixture-drawer.vue';
import fixtureImportModal from './fixture-import-modal.vue';
import FixtureTypeTree from './fixture-type-tree.vue';
+const userStore = useUserStore();
+const userId = userStore.userInfo?.userId;
+
// 宸﹁竟宸ュ叿绫诲瀷
const selectTypeId = ref<string[]>([]);
+defineExpose({
+ tableSelect
+});
const formOptions: VbenFormProps = {
commonConfig: {
@@ -104,6 +112,10 @@
connectedComponent: fixtureDrawer
});
+const [FixtureBorrowDrawer, fixtureBorrowDrawerApi] = useVbenDrawer({
+ connectedComponent: fixtureBorrowDrawer
+});
+
/**
* 瀵煎叆
*/
@@ -143,17 +155,29 @@
}
});
}
-
+function handleBorrow(row: Recordable<any>, status: string) {
+ if (userId === null || userId === undefined || userId === '') {
+ Modal.error({
+ content: '鑾峰彇鐢ㄦ埛淇℃伅澶辫触锛岃閲嶆柊鐧诲綍鍚庨噸璇曪紒',
+ title: '鎻愮ず'
+ });
+ return false;
+ }
+ // 宸ュ叿鍙拌处鍊熺敤鐘舵�乀ODO fixture_borrow_status 0-绌洪棽 1-鍊熷嚭
+ if (status === '0') {
+ // 绌洪棽鏃跺�熷嚭锛屾柊澧炰竴鏉″�熷嚭鏁版嵁
+ fixtureBorrowDrawerApi.setData({ status, borrowUser: userId, fixtureId: row.id, fixtureName: row.fixtureName, fixturePage: true });
+ fixtureBorrowDrawerApi.open();
+ } else if (status === '1') {
+ // 鍊熷嚭鏃跺綊杩橈紝鏇存柊鍊熷嚭鏁版嵁
+ fixtureBorrowDrawerApi.setData({ id: row.curBorrowId });
+ fixtureBorrowDrawerApi.open();
+ }
+}
function handleDownloadExcel() {
commonDownloadExcel(fixtureExport, '宸ュ叿鍙拌处', tableApi.formApi.form.values, {
fieldMappingTime: formOptions.fieldMappingTime
});
-}
-
-const router = useRouter();
-
-function handleDetail(record: Recordable<any>) {
- router.push(`/fixture/detail/${record.id}`);
}
/**
@@ -226,6 +250,30 @@
onMounted(async () => {
await setupDeptSelect();
});
+
+const { hasAccessByRoles } = useAccess();
+const isSuperAdmin = computed(() => hasAccessByRoles(['superadmin']));
+/**
+ * 鍙湁鍊熺敤鐢ㄦ埛鍜岀鐞嗗憳鍙互鐐瑰嚮褰掕繕
+ */
+function isBorrowUser(row: any) {
+ return isSuperAdmin.value || row?.borrowUser === userId;
+}
+
+function isBorrow(row: any) {
+ // TODO 瀵瑰簲瀛楀吀鐘舵�乫ixture_borrow_status 0-绌洪棽 1-鍊熷嚭
+ return row.borrowStatus === '0' || row.borrowStatus === null;
+}
+
+function isReturn(row: any) {
+ // TODO 瀵瑰簲瀛楀吀鐘舵�乫ixture_borrow_status 0-绌洪棽 1-鍊熷嚭
+ return row.borrowStatus === '1';
+}
+
+// 閫変腑鏁版嵁
+function tableSelect() {
+ return tableApi.grid.getCheckboxRecords();
+}
</script>
<template>
@@ -256,19 +304,20 @@
</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:fixture: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:fixture:list']" @click="handleDetail(row)">
- {{ $t('pages.common.info') }}
+ <ghost-button v-if="isBorrow(row)" class="btn-success" v-access:code="['eims:fixture:borrow']" @click="handleBorrow(row, '0')">
+ 鍊熺敤
+ </ghost-button>
+ <ghost-button
+ v-else-if="isReturn(row) && isBorrowUser(row)"
+ v-access:code="['eims:fixture:borrow']"
+ @click="handleBorrow(row, '1')"
+ >
+ 褰掕繕
</ghost-button>
<Popconfirm :get-popup-container="getVxePopupContainer" placement="left" title="纭鍒犻櫎锛�" @confirm="handleDelete(row)">
<ghost-button danger v-access:code="['eims:fixture:remove']" @click.stop="">
@@ -280,6 +329,7 @@
</BasicTable>
</div>
<FixtureDrawer @reload="tableApi.query()" />
+ <FixtureBorrowDrawer @reload="tableApi.query()" />
<FixtureImportModal @reload="tableApi.query()" />
</Page>
</template>
diff --git a/eims-ui/apps/web-antd/src/views/eims/repair-req/index.vue b/eims-ui/apps/web-antd/src/views/eims/repair-req/index.vue
index d248376..52487f2 100644
--- a/eims-ui/apps/web-antd/src/views/eims/repair-req/index.vue
+++ b/eims-ui/apps/web-antd/src/views/eims/repair-req/index.vue
@@ -13,7 +13,6 @@
import { delRepairReq, listRepairReq, repairReqExport } from '#/api/eims/repair-req';
import { getDeptTree, userList } from '#/api/system/user';
import { commonDownloadExcel } from '#/utils/file/download';
-import { useRoleBaseFilters } from '#/views/eims/repair-req/use-role-base-filters';
import { columns, querySchema } from './data';
import repairReqDrawer from './repair-req-drawer.vue';
@@ -51,8 +50,8 @@
return await listRepairReq({
pageNum: page.currentPage,
pageSize: page.pageSize,
- ...formValues,
- ...useRoleBaseFilters()
+ ...formValues
+ // ...useRoleBaseFilters()
});
}
}
diff --git a/eims-ui/apps/web-antd/src/views/eims/repair-req/use-role-base-filters.ts b/eims-ui/apps/web-antd/src/views/eims/repair-req/use-role-base-filters.ts
index 80e948d..f574a24 100644
--- a/eims-ui/apps/web-antd/src/views/eims/repair-req/use-role-base-filters.ts
+++ b/eims-ui/apps/web-antd/src/views/eims/repair-req/use-role-base-filters.ts
@@ -22,5 +22,7 @@
if (repair.value) {
params.status = '0';
}
+ console.info('useRoleBaseFilters');
+ console.info(params);
return { params };
}
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 f6546a1..1c0cb60 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,9 +1,11 @@
export enum DictEnum {
EIMS_EQU_UNIT = 'eims_equ_unit', // 璁惧鐩樼偣鐘舵��
- EIMS_FIXTURE_STATUS = 'eims_fixture_status', // 璁惧鐩樼偣鐘舵��
+ EIMS_FIXTURE_STATUS = 'eims_fixture_status', // 宸ュ叿锛堟不鍏凤級鐘舵��
EIMS_INVENTORY_DETAIL_STATU = 'inventory_detail_statu', // 璁惧鐩樼偣鐘舵��
EIMS_INVENTORY_STATU = 'inventory_statu', // 璁惧鐩樼偣鐘舵��
EQU_IMPORT_STATU = 'equ_import_status', // 璁惧瀵煎叆鐘舵��
+ FIXTURE_BORROW_RECORD_STATUS = 'fixture_borrow_record_status', // 宸ュ叿锛堟不鍏凤級鍊熺敤璁板綍鐘舵��
+ FIXTURE_BORROW_STATUS = 'fixture_borrow_status', // 宸ュ叿锛堟不鍏凤級鍊熺敤鐘舵��
REPAIR_FAULT_TYPE = 'repair_fault_type', // 鎶ヤ慨鐘舵��
REPAIR_REQ_STATUS = 'repair_req_status', // 鎶ヤ慨鐘舵��
REPAIR_REQ_TYPE = 'repair_req_type', // 鎶ヤ慨绫诲瀷
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/controller/EimsFixtureBorrowController.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/controller/EimsFixtureBorrowController.java
new file mode 100644
index 0000000..59f2bf9
--- /dev/null
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/controller/EimsFixtureBorrowController.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.EimsFixtureBorrowVo;
+import org.dromara.eims.domain.bo.EimsFixtureBorrowBo;
+import org.dromara.eims.service.IEimsFixtureBorrowService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 鍊熺敤璁板綍
+ *
+ * @author zhuguifei
+ * @date 2025-02-18
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/eims/fixBorrow")
+public class EimsFixtureBorrowController extends BaseController {
+
+ private final IEimsFixtureBorrowService eimsFixtureBorrowService;
+
+ /**
+ * 鏌ヨ鍊熺敤璁板綍鍒楄〃
+ */
+ @SaCheckPermission("eims:fixtureBorrow:list")
+ @GetMapping("/list")
+ public TableDataInfo<EimsFixtureBorrowVo> list(EimsFixtureBorrowBo bo, PageQuery pageQuery) {
+ return eimsFixtureBorrowService.queryPageList(bo, pageQuery);
+ }
+
+ /**
+ * 瀵煎嚭鍊熺敤璁板綍鍒楄〃
+ */
+ @SaCheckPermission("eims:fixtureBorrow:export")
+ @Log(title = "鍊熺敤璁板綍", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(EimsFixtureBorrowBo bo, HttpServletResponse response) {
+ List<EimsFixtureBorrowVo> list = eimsFixtureBorrowService.queryList(bo);
+ ExcelUtil.exportExcel(list, "鍊熺敤璁板綍", EimsFixtureBorrowVo.class, response);
+ }
+
+ /**
+ * 鑾峰彇鍊熺敤璁板綍璇︾粏淇℃伅
+ *
+ * @param id 涓婚敭
+ */
+ @SaCheckPermission("eims:fixtureBorrow:query")
+ @GetMapping("/{id}")
+ public R<EimsFixtureBorrowVo> getInfo(@NotNull(message = "涓婚敭涓嶈兘涓虹┖")
+ @PathVariable Long id) {
+ return R.ok(eimsFixtureBorrowService.queryById(id));
+ }
+
+ /**
+ * 鏂板鍊熺敤璁板綍
+ */
+ @SaCheckPermission("eims:fixtureBorrow:add")
+ @Log(title = "鍊熺敤璁板綍", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping()
+ public R<Void> add(@Validated(AddGroup.class) @RequestBody EimsFixtureBorrowBo bo) {
+ return toAjax(eimsFixtureBorrowService.insertByBo(bo));
+ }
+
+ /**
+ * 淇敼鍊熺敤璁板綍
+ */
+ @SaCheckPermission("eims:fixtureBorrow:edit")
+ @Log(title = "鍊熺敤璁板綍", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PutMapping()
+ public R<Void> edit(@Validated(EditGroup.class) @RequestBody EimsFixtureBorrowBo bo) {
+ return toAjax(eimsFixtureBorrowService.updateByBo(bo));
+ }
+
+ /**
+ * 鍒犻櫎鍊熺敤璁板綍
+ *
+ * @param ids 涓婚敭涓�
+ */
+ @SaCheckPermission("eims:fixtureBorrow:remove")
+ @Log(title = "鍊熺敤璁板綍", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public R<Void> remove(@NotEmpty(message = "涓婚敭涓嶈兘涓虹┖")
+ @PathVariable Long[] ids) {
+ return toAjax(eimsFixtureBorrowService.deleteWithValidByIds(List.of(ids), true));
+ }
+}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/EimsFixture.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/EimsFixture.java
index c821e00..0dac166 100644
--- a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/EimsFixture.java
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/EimsFixture.java
@@ -60,6 +60,11 @@
private Long borrowUser;
/**
+ * 鍊熺敤鐘舵��
+ */
+ private String borrowStatus;
+
+ /**
* 鐘舵�侊紙瀛楀吀锛�
*/
private String status;
@@ -106,5 +111,10 @@
*/
private String remark;
+ /**
+ * 褰撳墠鍊熺敤璁板綍id
+ */
+ private Long curBorrowId;
+
}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/EimsFixtureBorrow.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/EimsFixtureBorrow.java
new file mode 100644
index 0000000..bab7347
--- /dev/null
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/EimsFixtureBorrow.java
@@ -0,0 +1,88 @@
+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_fixture_borrow
+ *
+ * @author zhuguifei
+ * @date 2025-02-18
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("eims_fixture_borrow")
+public class EimsFixtureBorrow extends BaseEntity {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ *
+ */
+ @TableId(value = "id")
+ private Long id;
+
+ /**
+ * 鍊熺敤宸ュ叿id
+ */
+ private Long fixtureId;
+
+ /**
+ * 鍊熺敤宸ュ叿鍚嶇О
+ */
+ private String fixtureName;
+
+ /**
+ * 鍊熺敤閮ㄩ棬
+ */
+ private Long borrowDept;
+
+ /**
+ * 鍊熺敤浜�
+ */
+ private Long borrowUser;
+
+ /**
+ * 缁忓姙浜�
+ */
+ private Long agentUser;
+
+ /**
+ * 鍊熺敤璁板綍鐘舵�侊紙瀛楀吀锛�
+ */
+ private String status;
+
+ /**
+ * 鍊熺敤鏃堕棿
+ */
+ private Date borrowTime;
+
+ /**
+ * 棰勮褰掕繕鏃堕棿
+ */
+ private Date planReturnTime;
+
+ /**
+ * 褰掕繕鏃堕棿
+ */
+ private Date returnTime;
+
+ /**
+ * 鍊熺敤鐞嗙敱
+ */
+ private String borrowReason;
+
+ /**
+ * 澶囨敞
+ */
+ private String remark;
+
+
+}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsFixtureBo.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsFixtureBo.java
index 202a1fd..c15b06e 100644
--- a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsFixtureBo.java
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsFixtureBo.java
@@ -1,5 +1,8 @@
package org.dromara.eims.domain.bo;
+import com.alibaba.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
import org.dromara.eims.domain.EimsFixture;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.common.core.validate.AddGroup;
@@ -60,6 +63,11 @@
private Long borrowUser;
/**
+ * 鍊熺敤鐘舵��
+ */
+ private String borrowStatus;
+
+ /**
* 鐘舵�侊紙瀛楀吀锛�
*/
private String status;
@@ -106,5 +114,10 @@
*/
private String remark;
+ /**
+ * 褰撳墠鍊熺敤璁板綍id
+ */
+ private Long curBorrowId;
+
}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsFixtureBorrowBo.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsFixtureBorrowBo.java
new file mode 100644
index 0000000..f22a524
--- /dev/null
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsFixtureBorrowBo.java
@@ -0,0 +1,95 @@
+package org.dromara.eims.domain.bo;
+
+import org.dromara.eims.domain.EimsFixtureBorrow;
+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 com.fasterxml.jackson.annotation.JsonFormat;
+
+/**
+ * 宸ュ叿鍊熺敤涓氬姟瀵硅薄 eims_fixture_borrow
+ *
+ * @author zhuguifei
+ * @date 2025-02-18
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = EimsFixtureBorrow.class, reverseConvertGenerate = false)
+public class EimsFixtureBorrowBo extends BaseEntity {
+
+ /**
+ *
+ */
+ @NotNull(message = "涓嶈兘涓虹┖", groups = { EditGroup.class })
+ private Long id;
+
+ /**
+ * 鍊熺敤宸ュ叿id
+ */
+ @NotNull(message = "鍊熺敤宸ュ叿id涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+ private Long fixtureId;
+
+ /**
+ * 鍊熺敤宸ュ叿鍚嶇О
+ */
+ @NotBlank(message = "鍊熺敤宸ュ叿鍚嶇О涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+ private String fixtureName;
+
+ /**
+ * 鍊熺敤閮ㄩ棬
+ */
+ @NotNull(message = "鍊熺敤閮ㄩ棬涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+ private Long borrowDept;
+
+ /**
+ * 鍊熺敤浜�
+ */
+ @NotNull(message = "鍊熺敤浜轰笉鑳戒负绌�", groups = { AddGroup.class, EditGroup.class })
+ private Long borrowUser;
+
+ /**
+ * 缁忓姙浜�
+ */
+ private Long agentUser;
+
+ /**
+ * 鍊熺敤璁板綍鐘舵�侊紙瀛楀吀锛�
+ */
+ @NotBlank(message = "鍊熺敤璁板綍鐘舵�侊紙瀛楀吀锛変笉鑳戒负绌�", groups = { AddGroup.class, EditGroup.class })
+ private String status;
+
+ /**
+ * 鍊熺敤鏃堕棿
+ */
+ @NotNull(message = "鍊熺敤鏃堕棿涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+ private Date borrowTime;
+
+ /**
+ * 棰勮褰掕繕鏃堕棿
+ */
+ @NotNull(message = "棰勮褰掕繕鏃堕棿涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+ private Date planReturnTime;
+
+ /**
+ * 褰掕繕鏃堕棿
+ */
+ private Date returnTime;
+
+ /**
+ * 鍊熺敤鐞嗙敱
+ */
+ @NotBlank(message = "鍊熺敤鐞嗙敱涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+ private String borrowReason;
+
+ /**
+ * 澶囨敞
+ */
+ private String remark;
+
+
+}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsFixtureBorrowVo.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsFixtureBorrowVo.java
new file mode 100644
index 0000000..7b6d7d1
--- /dev/null
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsFixtureBorrowVo.java
@@ -0,0 +1,127 @@
+package org.dromara.eims.domain.vo;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.dromara.common.translation.annotation.Translation;
+import org.dromara.common.translation.constant.TransConstant;
+import org.dromara.eims.domain.EimsFixtureBorrow;
+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_fixture_borrow
+ *
+ * @author zhuguifei
+ * @date 2025-02-18
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = EimsFixtureBorrow.class)
+public class EimsFixtureBorrowVo implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ *
+ */
+ @ExcelProperty(value = "")
+ private Long id;
+
+ /**
+ * 鍊熺敤宸ュ叿id
+ */
+ @ExcelProperty(value = "鍊熺敤宸ュ叿id")
+ private Long fixtureId;
+
+ /**
+ * 鍊熺敤宸ュ叿鍚嶇О
+ */
+ @ExcelProperty(value = "鍊熺敤宸ュ叿鍚嶇О")
+ private String fixtureName;
+
+ /**
+ * 鍊熺敤閮ㄩ棬
+ */
+ private Long borrowDept;
+
+ /**
+ * 鍊熺敤閮ㄩ棬
+ */
+ @ExcelProperty(value = "鍊熺敤閮ㄩ棬")
+ @Translation(type = TransConstant.DEPT_ID_TO_NAME, mapper = "borrowDept")
+ private String borrowDeptName;
+
+ /**
+ * 鍊熺敤浜�
+ */
+ private Long borrowUser;
+ /**
+ * 鍊熺敤浜�
+ */
+ @ExcelProperty(value = "鍊熺敤浜�")
+ @Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "borrowUser")
+ private String borrowUserName;
+
+ /**
+ * 缁忓姙浜�
+ */
+ private Long agentUser;
+
+ /**
+ * 缁忓姙浜�
+ */
+ @ExcelProperty(value = "缁忓姙浜�")
+ @Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "agentUser")
+ private Long agentUserName;
+
+
+ /**
+ * 鍊熺敤璁板綍鐘舵�侊紙瀛楀吀锛�
+ */
+ @ExcelProperty(value = "鍊熺敤璁板綍鐘舵��", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(dictType = "fixture_borrow_record_status")
+ private String status;
+
+ /**
+ * 鍊熺敤鏃堕棿
+ */
+ @ExcelProperty(value = "鍊熺敤鏃堕棿")
+ private Date borrowTime;
+
+ /**
+ * 棰勮褰掕繕鏃堕棿
+ */
+ @ExcelProperty(value = "棰勮褰掕繕鏃堕棿")
+ private Date planReturnTime;
+
+ /**
+ * 褰掕繕鏃堕棿
+ */
+ @ExcelProperty(value = "褰掕繕鏃堕棿")
+ private Date returnTime;
+
+ /**
+ * 鍊熺敤鐞嗙敱
+ */
+ @ExcelProperty(value = "鍊熺敤鐞嗙敱")
+ private String borrowReason;
+
+ /**
+ * 澶囨敞
+ */
+ @ExcelProperty(value = "澶囨敞")
+ private String remark;
+
+
+}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsFixtureVo.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsFixtureVo.java
index 86f6a85..7ca4dae 100644
--- a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsFixtureVo.java
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsFixtureVo.java
@@ -85,8 +85,16 @@
private Long borrowUser;
/**
+ * 鍊熺敤鐘舵��
+ */
+ @ExcelProperty(value = "鍊熺敤鐘舵��", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(dictType = "fixture_borrow_status")
+ private String borrowStatus;
+
+ /**
* 鍊熺敤浜�
*/
+ @Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "borrowUser")
private String borrowUserName;
/**
@@ -146,5 +154,10 @@
@ExcelProperty(value = "澶囨敞")
private String remark;
+ /**
+ * 褰撳墠鍊熺敤璁板綍id
+ */
+ private Long curBorrowId;
+
}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/mapper/EimsFixtureBorrowMapper.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/mapper/EimsFixtureBorrowMapper.java
new file mode 100644
index 0000000..368b3e5
--- /dev/null
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/mapper/EimsFixtureBorrowMapper.java
@@ -0,0 +1,15 @@
+package org.dromara.eims.mapper;
+
+import org.dromara.eims.domain.EimsFixtureBorrow;
+import org.dromara.eims.domain.vo.EimsFixtureBorrowVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 宸ュ叿鍊熺敤Mapper鎺ュ彛
+ *
+ * @author zhuguifei
+ * @date 2025-02-18
+ */
+public interface EimsFixtureBorrowMapper extends BaseMapperPlus<EimsFixtureBorrow, EimsFixtureBorrowVo> {
+
+}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/IEimsFixtureBorrowService.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/IEimsFixtureBorrowService.java
new file mode 100644
index 0000000..c0c27f5
--- /dev/null
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/IEimsFixtureBorrowService.java
@@ -0,0 +1,68 @@
+package org.dromara.eims.service;
+
+import org.dromara.eims.domain.vo.EimsFixtureBorrowVo;
+import org.dromara.eims.domain.bo.EimsFixtureBorrowBo;
+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-18
+ */
+public interface IEimsFixtureBorrowService {
+
+ /**
+ * 鏌ヨ宸ュ叿鍊熺敤
+ *
+ * @param id 涓婚敭
+ * @return 宸ュ叿鍊熺敤
+ */
+ EimsFixtureBorrowVo queryById(Long id);
+
+ /**
+ * 鍒嗛〉鏌ヨ宸ュ叿鍊熺敤鍒楄〃
+ *
+ * @param bo 鏌ヨ鏉′欢
+ * @param pageQuery 鍒嗛〉鍙傛暟
+ * @return 宸ュ叿鍊熺敤鍒嗛〉鍒楄〃
+ */
+ TableDataInfo<EimsFixtureBorrowVo> queryPageList(EimsFixtureBorrowBo bo, PageQuery pageQuery);
+
+ /**
+ * 鏌ヨ绗﹀悎鏉′欢鐨勫伐鍏峰�熺敤鍒楄〃
+ *
+ * @param bo 鏌ヨ鏉′欢
+ * @return 宸ュ叿鍊熺敤鍒楄〃
+ */
+ List<EimsFixtureBorrowVo> queryList(EimsFixtureBorrowBo bo);
+
+ /**
+ * 鏂板宸ュ叿鍊熺敤
+ *
+ * @param bo 宸ュ叿鍊熺敤
+ * @return 鏄惁鏂板鎴愬姛
+ */
+ Boolean insertByBo(EimsFixtureBorrowBo bo);
+
+ /**
+ * 淇敼宸ュ叿鍊熺敤
+ *
+ * @param bo 宸ュ叿鍊熺敤
+ * @return 鏄惁淇敼鎴愬姛
+ */
+ Boolean updateByBo(EimsFixtureBorrowBo 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/EimsFixtureBorrowServiceImpl.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsFixtureBorrowServiceImpl.java
new file mode 100644
index 0000000..8c191a9
--- /dev/null
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsFixtureBorrowServiceImpl.java
@@ -0,0 +1,211 @@
+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.dromara.common.satoken.utils.LoginHelper;
+import org.dromara.eims.domain.EimsEquType;
+import org.dromara.eims.domain.EimsFixture;
+import org.dromara.eims.domain.vo.EimsEquTypeVo;
+import org.dromara.eims.domain.vo.EimsFixtureVo;
+import org.dromara.eims.mapper.EimsFixtureMapper;
+import org.dromara.system.domain.SysDept;
+import org.dromara.system.domain.vo.SysDeptVo;
+import org.dromara.system.mapper.SysDeptMapper;
+import org.dromara.system.service.ISysDeptService;
+import org.springframework.stereotype.Service;
+import org.dromara.eims.domain.bo.EimsFixtureBorrowBo;
+import org.dromara.eims.domain.vo.EimsFixtureBorrowVo;
+import org.dromara.eims.domain.EimsFixtureBorrow;
+import org.dromara.eims.mapper.EimsFixtureBorrowMapper;
+import org.dromara.eims.service.IEimsFixtureBorrowService;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 宸ュ叿鍊熺敤Service涓氬姟灞傚鐞�
+ *
+ * @author zhuguifei
+ * @date 2025-02-18
+ */
+@RequiredArgsConstructor
+@Service
+public class EimsFixtureBorrowServiceImpl implements IEimsFixtureBorrowService {
+
+ private final EimsFixtureBorrowMapper baseMapper;
+ private final EimsFixtureMapper fixtureMapper;
+ private final SysDeptMapper sysDeptMapper;
+
+ /**
+ * 鏌ヨ宸ュ叿鍊熺敤
+ *
+ * @param id 涓婚敭
+ * @return 宸ュ叿鍊熺敤
+ */
+ @Override
+ public EimsFixtureBorrowVo queryById(Long id){
+ return baseMapper.selectVoById(id);
+ }
+
+ /**
+ * 鍒嗛〉鏌ヨ宸ュ叿鍊熺敤鍒楄〃
+ *
+ * @param bo 鏌ヨ鏉′欢
+ * @param pageQuery 鍒嗛〉鍙傛暟
+ * @return 宸ュ叿鍊熺敤鍒嗛〉鍒楄〃
+ */
+ @Override
+ public TableDataInfo<EimsFixtureBorrowVo> queryPageList(EimsFixtureBorrowBo bo, PageQuery pageQuery) {
+ LambdaQueryWrapper<EimsFixtureBorrow> lqw = buildQueryWrapper(bo);
+ Page<EimsFixtureBorrowVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+ return TableDataInfo.build(result);
+ }
+
+ /**
+ * 鏌ヨ绗﹀悎鏉′欢鐨勫伐鍏峰�熺敤鍒楄〃
+ *
+ * @param bo 鏌ヨ鏉′欢
+ * @return 宸ュ叿鍊熺敤鍒楄〃
+ */
+ @Override
+ public List<EimsFixtureBorrowVo> queryList(EimsFixtureBorrowBo bo) {
+ LambdaQueryWrapper<EimsFixtureBorrow> lqw = buildQueryWrapper(bo);
+ return baseMapper.selectVoList(lqw);
+ }
+
+ private LambdaQueryWrapper<EimsFixtureBorrow> buildQueryWrapper(EimsFixtureBorrowBo bo) {
+ Map<String, Object> params = bo.getParams();
+ LambdaQueryWrapper<EimsFixtureBorrow> lqw = Wrappers.lambdaQuery();
+ lqw.eq(bo.getFixtureId() != null, EimsFixtureBorrow::getFixtureId, bo.getFixtureId());
+ lqw.like(StringUtils.isNotBlank(bo.getFixtureName()), EimsFixtureBorrow::getFixtureName, bo.getFixtureName());
+
+ lqw.eq(bo.getBorrowUser() != null, EimsFixtureBorrow::getBorrowUser, bo.getBorrowUser());
+ lqw.eq(bo.getAgentUser() != null, EimsFixtureBorrow::getAgentUser, bo.getAgentUser());
+ lqw.eq(StringUtils.isNotBlank(bo.getStatus()), EimsFixtureBorrow::getStatus, bo.getStatus());
+ lqw.between(params.get("beginBorrowTime") != null && params.get("endBorrowTime") != null,
+ EimsFixtureBorrow::getBorrowTime ,params.get("beginBorrowTime"), params.get("endBorrowTime"));
+ lqw.between(params.get("beginPlanReturnTime") != null && params.get("endPlanReturnTime") != null,
+ EimsFixtureBorrow::getPlanReturnTime ,params.get("beginPlanReturnTime"), params.get("endPlanReturnTime"));
+ lqw.eq(bo.getReturnTime() != null, EimsFixtureBorrow::getReturnTime, bo.getReturnTime());
+ lqw.eq(StringUtils.isNotBlank(bo.getBorrowReason()), EimsFixtureBorrow::getBorrowReason, bo.getBorrowReason());
+
+ /**
+ * 鏌ヨ閮ㄩ棬涓嬫墍鏈夊瓙閮ㄩ棬
+ */
+ if (bo.getBorrowDept() != null ) {
+ List<Long> allDescendantIds = getAllDescendantIds(bo.getBorrowDept());
+ lqw.in(bo.getBorrowDept() != null ,EimsFixtureBorrow::getBorrowDept, allDescendantIds);
+ }
+
+
+ return lqw;
+ }
+
+ /**
+ * 鏍规嵁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<SysDept> sysDeptWrapper = new QueryWrapper<>();
+ sysDeptWrapper.lambda().eq(SysDept::getParentId, currentId);
+
+ List<SysDeptVo> children = sysDeptMapper.selectVoList(sysDeptWrapper);
+ if (children != null && !children.isEmpty()) {
+ for (SysDeptVo child : children) {
+ Long childId = child.getDeptId();
+ collector.add(childId);
+ collectDescendants(childId, collector);
+ }
+ }
+ }
+
+ /**
+ * 鏂板宸ュ叿鍊熺敤
+ *
+ * @param bo 宸ュ叿鍊熺敤
+ * @return 鏄惁鏂板鎴愬姛
+ */
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public Boolean insertByBo(EimsFixtureBorrowBo bo) {
+ EimsFixtureBorrow add = MapstructUtils.convert(bo, EimsFixtureBorrow.class);
+ validEntityBeforeSave(add);
+ boolean flag = baseMapper.insert(add) > 0;
+ if (flag) {
+ bo.setId(add.getId());
+ //鍚屾椂鏇存柊宸ュ叿鍙拌处琛ㄤ腑鍊熺敤浜�
+ EimsFixtureVo eimsFixtureVo = fixtureMapper.selectVoById(bo.getFixtureId());
+ eimsFixtureVo.setBorrowUser(LoginHelper.getUserId());
+ //璁剧疆宸ュ叿鍙拌处鐘舵�佷负鍊熺敤
+ eimsFixtureVo.setBorrowStatus("1");//TODO 淇濇寔瀛楀吀鏁版嵁涓�鑷磃ixture_borrow_status
+ //鏇存柊宸ュ叿鍙拌处褰撳墠鍊熺敤璁板綍id
+ eimsFixtureVo.setCurBorrowId(add.getId());
+ eimsFixtureVo.setBorrowDept(LoginHelper.getDeptId());
+ EimsFixture fixture = MapstructUtils.convert(eimsFixtureVo, EimsFixture.class);
+ fixtureMapper.updateById(fixture);
+ }
+ return flag;
+ }
+
+ /**
+ * 淇敼宸ュ叿鍊熺敤
+ *
+ * @param bo 宸ュ叿鍊熺敤
+ * @return 鏄惁淇敼鎴愬姛
+ */
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public Boolean updateByBo(EimsFixtureBorrowBo bo) {
+ EimsFixtureBorrow update = MapstructUtils.convert(bo, EimsFixtureBorrow.class);
+ validEntityBeforeSave(update);
+ //璁剧疆宸ュ叿鍙拌处鐘舵�佷负褰掕繕 TODO 淇濇寔瀛楀吀鏁版嵁涓�鑷磃ixture_borrow_record_status
+ if(bo.getStatus().equals("1")){
+ EimsFixtureVo eimsFixtureVo = fixtureMapper.selectVoById(bo.getFixtureId());
+ //璁剧疆宸ュ叿鍙拌处鐘舵�佷负褰掕繕
+ eimsFixtureVo.setBorrowStatus("0"); //TODO 淇濇寔瀛楀吀鏁版嵁涓�鑷磃ixture_borrow_status
+ EimsFixture fixture = MapstructUtils.convert(eimsFixtureVo, EimsFixture.class);
+ fixtureMapper.updateById(fixture);
+ }
+ return baseMapper.updateById(update) > 0;
+ }
+
+ /**
+ * 淇濆瓨鍓嶇殑鏁版嵁鏍¢獙
+ */
+ private void validEntityBeforeSave(EimsFixtureBorrow 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/EimsFixtureServiceImpl.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsFixtureServiceImpl.java
index e6cf528..41a18a0 100644
--- a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsFixtureServiceImpl.java
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsFixtureServiceImpl.java
@@ -100,6 +100,7 @@
lqw.eq(StringUtils.isNotBlank(bo.getFixtureDesc()), EimsFixture::getFixtureDesc, bo.getFixtureDesc());
lqw.eq(bo.getBorrowDept()!=null, EimsFixture::getBorrowDept, bo.getBorrowDept());
lqw.eq(bo.getBorrowUser()!=null, EimsFixture::getBorrowUser, bo.getBorrowUser());
+ lqw.eq(StringUtils.isNotEmpty(bo.getBorrowStatus()), EimsFixture::getBorrowStatus, bo.getBorrowStatus());
lqw.eq(StringUtils.isNotBlank(bo.getStatus()), EimsFixture::getStatus, bo.getStatus());
lqw.like(StringUtils.isNotBlank(bo.getAssetNo()), EimsFixture::getAssetNo, bo.getAssetNo());
lqw.like(StringUtils.isNotBlank(bo.getModelNo()), EimsFixture::getModelNo, bo.getModelNo());
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsRepairReqServiceImpl.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsRepairReqServiceImpl.java
index 6ef4ace..b191443 100644
--- a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsRepairReqServiceImpl.java
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsRepairReqServiceImpl.java
@@ -10,7 +10,12 @@
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.dromara.eims.domain.EimsEqu;
+import org.dromara.eims.domain.EimsFixtureBorrow;
import org.dromara.eims.domain.vo.EimsInventoryDetailVo;
+import org.dromara.eims.utils.DataFilterUtil;
+import org.dromara.system.domain.SysDept;
+import org.dromara.system.domain.vo.SysDeptVo;
+import org.dromara.system.mapper.SysDeptMapper;
import org.springframework.stereotype.Service;
import org.dromara.eims.domain.bo.EimsRepairReqBo;
import org.dromara.eims.domain.vo.EimsRepairReqVo;
@@ -18,6 +23,7 @@
import org.dromara.eims.mapper.EimsRepairReqMapper;
import org.dromara.eims.service.IEimsRepairReqService;
+import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Collection;
@@ -33,6 +39,7 @@
public class EimsRepairReqServiceImpl implements IEimsRepairReqService {
private final EimsRepairReqMapper baseMapper;
+ private final SysDeptMapper sysDeptMapper;
/**
* 鏌ヨ鏁呴殰鎶ヤ慨
@@ -41,7 +48,7 @@
* @return 鏁呴殰鎶ヤ慨
*/
@Override
- public EimsRepairReqVo queryById(Long id){
+ public EimsRepairReqVo queryById(Long id) {
return baseMapper.selectVoById(id);
}
@@ -61,6 +68,7 @@
@Override
public TableDataInfo<EimsRepairReqVo> queryPageListCustom(EimsRepairReqBo bo, PageQuery pageQuery) {
+ DataFilterUtil.getInstance().filterRepairReq(bo);
Page<EimsRepairReqVo> page = baseMapper.selectRepairReqList(pageQuery.build(), buildWrapper(bo));
return TableDataInfo.build(page);
}
@@ -68,24 +76,62 @@
private QueryWrapper<EimsRepairReq> buildWrapper(EimsRepairReqBo bo) {
Map<String, Object> params = bo.getParams();
QueryWrapper<EimsRepairReq> qw = Wrappers.query();
- qw.like(StringUtils.isNotBlank(bo.getCode()),"a.code", bo.getCode());
+ qw.like(StringUtils.isNotBlank(bo.getCode()), "a.code", bo.getCode());
qw.eq(StringUtils.isNotBlank(bo.getStatus()), "a.status", bo.getStatus());
qw.eq(bo.getReqTime() != null, "a.req_time", bo.getReqTime());
- qw.eq(bo.getReqDept() != null, "a.req_dept", bo.getReqDept());
- qw.eq(bo.getReqUser() != null,"a.req_user", bo.getReqUser());
+ qw.eq(bo.getReqUser() != null, "a.req_user", bo.getReqUser());
qw.eq(StringUtils.isNotBlank(bo.getUrgencyLevel()), "a.urgency_level", bo.getUrgencyLevel());
qw.eq(StringUtils.isNotBlank(bo.getReqType()), "a.req_type", bo.getReqType());
qw.eq(bo.getEquId() != null, "a.equ_id", bo.getEquId());
- qw.eq(bo.getRepairDept() != null,"a.repair_dept", bo.getRepairDept());
+ qw.eq(bo.getRepairDept() != null, "a.repair_dept", bo.getRepairDept());
qw.eq(bo.getRepairUser() != null, "a.repair_user", bo.getRepairUser());
qw.eq(StringUtils.isNotBlank(bo.getFaultType()), "a,fault_type", bo.getFaultType());
qw.eq(params.containsKey("createBy"), "a.create_by", params.get("createBy"));
qw.eq(params.containsKey("status"), "a.status", params.get("status"));
qw.between(params.get("beginReqTime") != null && params.get("endReqTime") != null,
"a.req_time", params.get("beginReqTime"), params.get("endReqTime"));
+
+
+ qw.eq(bo.getCreateBy()!=null, "a.create_by", bo.getCreateBy());
+ qw.eq(StringUtils.isNotEmpty(bo.getStatus()), "a.status", bo.getStatus());
+
+ /**
+ * 鏌ヨ閮ㄩ棬涓嬫墍鏈夊瓙閮ㄩ棬
+ */
+ if (bo.getReqDept() != null) {
+ List<Long> allDescendantIds = getAllDescendantIds(bo.getReqDept());
+ qw.in(bo.getReqDept() != null, "a.req_dept", 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<SysDept> sysDeptWrapper = new QueryWrapper<>();
+ sysDeptWrapper.lambda().eq(SysDept::getParentId, currentId);
+
+ List<SysDeptVo> children = sysDeptMapper.selectVoList(sysDeptWrapper);
+ if (children != null && !children.isEmpty()) {
+ for (SysDeptVo child : children) {
+ Long childId = child.getDeptId();
+ collector.add(childId);
+ collectDescendants(childId, collector);
+ }
+ }
+ }
/**
* 鏌ヨ绗﹀悎鏉′欢鐨勬晠闅滄姤淇垪琛�
@@ -149,7 +195,7 @@
/**
* 淇濆瓨鍓嶇殑鏁版嵁鏍¢獙
*/
- private void validEntityBeforeSave(EimsRepairReq entity){
+ private void validEntityBeforeSave(EimsRepairReq entity) {
//TODO 鍋氫竴浜涙暟鎹牎楠�,濡傚敮涓�绾︽潫
}
@@ -162,7 +208,7 @@
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
- if(isValid){
+ if (isValid) {
//TODO 鍋氫竴浜涗笟鍔′笂鐨勬牎楠�,鍒ゆ柇鏄惁闇�瑕佹牎楠�
}
return baseMapper.deleteByIds(ids) > 0;
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/utils/DataFilterUtil.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/utils/DataFilterUtil.java
new file mode 100644
index 0000000..bee36a7
--- /dev/null
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/utils/DataFilterUtil.java
@@ -0,0 +1,42 @@
+package org.dromara.eims.utils;
+
+import org.dromara.common.core.domain.model.LoginUser;
+import org.dromara.common.satoken.utils.LoginHelper;
+import org.dromara.eims.domain.bo.EimsRepairReqBo;
+
+import java.util.Set;
+
+/**
+ * 鑷畾涔夋暟鎹殧绂�
+ */
+public class DataFilterUtil {
+
+ //TODO 淇濇寔涓庢暟鎹簱涓�鐩� 瀹氫箟瑙掕壊绫诲瀷 operator-鎿嶄綔宸� repair-缁翠慨宸�
+ private enum Role {
+ operator, repair
+ }
+
+ private static final DataFilterUtil INSTANCE = new DataFilterUtil();
+
+ private DataFilterUtil() {
+ }
+ public static DataFilterUtil getInstance() {
+ return INSTANCE;
+ }
+ //鎶ヤ慨鍗�
+ public void filterRepairReq(EimsRepairReqBo bo){
+ LoginUser loginUser = LoginHelper.getLoginUser();
+ if (loginUser == null) return;
+ Set<String> rolePermission = loginUser.getRolePermission();
+ if (rolePermission == null) return;
+ if (rolePermission.contains(Role.operator.name())) {
+ //缁翠慨宸ュ彧鑳芥煡璇㈣嚜宸辩殑鏁版嵁
+ bo.setCreateBy(loginUser.getUserId());
+ }else if (rolePermission.contains(Role.repair.name())) {
+ //TODO 缁翠慨宸ュ彧鑳芥煡璇㈡湭鎺ュ崟鐘舵�佺殑鎶ヤ慨鍗曪紙鍏蜂綋鐘舵�佸弬鑰冨瓧鍏竢epair_req_status锛�
+ bo.setStatus("0");
+ }
+ System.err.println(loginUser);
+ }
+
+}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/resources/mapper/eims/EimsFixtureBorrowMapper.xml b/eims/ruoyi-modules/lb-eims/src/main/resources/mapper/eims/EimsFixtureBorrowMapper.xml
new file mode 100644
index 0000000..413d14f
--- /dev/null
+++ b/eims/ruoyi-modules/lb-eims/src/main/resources/mapper/eims/EimsFixtureBorrowMapper.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.EimsFixtureBorrowMapper">
+
+</mapper>
--
Gitblit v1.9.3