From bbfd68648872621be182fd51f3a56a09cd21e09e Mon Sep 17 00:00:00 2001 From: zhuguifei <zhuguifei@zhuguifeideiMac.local> Date: 星期一, 26 五月 2025 09:50:36 +0800 Subject: [PATCH] 添加首页数据接口 --- eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/controller/BoardController.java | 376 +++++++++++ eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/controller/EimsFixtureController.java | 33 + eims-ui/apps/web-antd/public/static/menu/ico11.png | 0 eims-ui/apps/web-antd/src/api/eims/repair-res/index.ts | 5 eims-ui/apps/web-antd/public/static/menu/ico4.png | 0 eims-ui/apps/web-antd/public/static/menu/ico9.png | 0 eims-ui/apps/web-antd/public/static/menu/ico8.png | 0 eims-ui/apps/web-antd/public/static/menu/ico12.png | 0 eims-ui/apps/web-antd/public/static/menu/ico3.png | 0 eims-ui/apps/web-antd/src/views/eims/fixture/fixture-import-modal.vue | 6 eims-ui/packages/@core/base/shared/src/constants/dict-enum.ts | 4 eims-ui/apps/web-antd/public/static/menu/ico7.png | 0 eims-ui/apps/web-antd/src/views/eims/fixture/data.tsx | 3 eims-ui/apps/web-antd/src/views/eims/fixture/index.vue | 12 eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/EimsInspectSt.java | 1 eims-ui/apps/web-antd/public/static/menu/ico2.png | 0 eims-ui/apps/web-antd/src/views/index.vue | 649 +++++++++++++------ eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/listener/EimsFixtureImportListener.java | 265 ++++++++ eims-ui/apps/web-antd/src/api/eims/dashboard/index.ts | 65 ++ eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsFixtureImportVo.java | 148 ++++ eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsFixtureVo.java | 162 +++- eims-ui/apps/web-antd/public/static/menu/ico6.png | 0 eims-ui/apps/web-antd/public/static/menu/ico1.png | 0 eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsFixtureBo.java | 44 + eims-ui/apps/web-antd/public/static/menu/ico5.png | 0 eims/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/DictConstants.java | 49 + eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsInspectStVo.java | 2 eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/EimsFixture.java | 42 + eims-ui/apps/web-antd/public/static/menu/ico10.png | 0 eims-ui/apps/web-antd/src/views/eims/equ-detail/index.vue | 12 eims-ui/apps/web-antd/public/static/menu/ico13.png | 0 eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsInspectStBo.java | 3 32 files changed, 1,603 insertions(+), 278 deletions(-) diff --git a/eims-ui/apps/web-antd/public/static/menu/ico1.png b/eims-ui/apps/web-antd/public/static/menu/ico1.png new file mode 100644 index 0000000..9ed1853 --- /dev/null +++ b/eims-ui/apps/web-antd/public/static/menu/ico1.png Binary files differ diff --git a/eims-ui/apps/web-antd/public/static/menu/ico10.png b/eims-ui/apps/web-antd/public/static/menu/ico10.png new file mode 100644 index 0000000..3a78b33 --- /dev/null +++ b/eims-ui/apps/web-antd/public/static/menu/ico10.png Binary files differ diff --git a/eims-ui/apps/web-antd/public/static/menu/ico11.png b/eims-ui/apps/web-antd/public/static/menu/ico11.png new file mode 100644 index 0000000..5720ac0 --- /dev/null +++ b/eims-ui/apps/web-antd/public/static/menu/ico11.png Binary files differ diff --git a/eims-ui/apps/web-antd/public/static/menu/ico12.png b/eims-ui/apps/web-antd/public/static/menu/ico12.png new file mode 100644 index 0000000..72bfd47 --- /dev/null +++ b/eims-ui/apps/web-antd/public/static/menu/ico12.png Binary files differ diff --git a/eims-ui/apps/web-antd/public/static/menu/ico13.png b/eims-ui/apps/web-antd/public/static/menu/ico13.png new file mode 100644 index 0000000..9774512 --- /dev/null +++ b/eims-ui/apps/web-antd/public/static/menu/ico13.png Binary files differ diff --git a/eims-ui/apps/web-antd/public/static/menu/ico2.png b/eims-ui/apps/web-antd/public/static/menu/ico2.png new file mode 100644 index 0000000..2438cc2 --- /dev/null +++ b/eims-ui/apps/web-antd/public/static/menu/ico2.png Binary files differ diff --git a/eims-ui/apps/web-antd/public/static/menu/ico3.png b/eims-ui/apps/web-antd/public/static/menu/ico3.png new file mode 100644 index 0000000..7a457a3 --- /dev/null +++ b/eims-ui/apps/web-antd/public/static/menu/ico3.png Binary files differ diff --git a/eims-ui/apps/web-antd/public/static/menu/ico4.png b/eims-ui/apps/web-antd/public/static/menu/ico4.png new file mode 100644 index 0000000..bb9b325 --- /dev/null +++ b/eims-ui/apps/web-antd/public/static/menu/ico4.png Binary files differ diff --git a/eims-ui/apps/web-antd/public/static/menu/ico5.png b/eims-ui/apps/web-antd/public/static/menu/ico5.png new file mode 100644 index 0000000..6d307cb --- /dev/null +++ b/eims-ui/apps/web-antd/public/static/menu/ico5.png Binary files differ diff --git a/eims-ui/apps/web-antd/public/static/menu/ico6.png b/eims-ui/apps/web-antd/public/static/menu/ico6.png new file mode 100644 index 0000000..23bf162 --- /dev/null +++ b/eims-ui/apps/web-antd/public/static/menu/ico6.png Binary files differ diff --git a/eims-ui/apps/web-antd/public/static/menu/ico7.png b/eims-ui/apps/web-antd/public/static/menu/ico7.png new file mode 100644 index 0000000..73f367b --- /dev/null +++ b/eims-ui/apps/web-antd/public/static/menu/ico7.png Binary files differ diff --git a/eims-ui/apps/web-antd/public/static/menu/ico8.png b/eims-ui/apps/web-antd/public/static/menu/ico8.png new file mode 100644 index 0000000..76a6409 --- /dev/null +++ b/eims-ui/apps/web-antd/public/static/menu/ico8.png Binary files differ diff --git a/eims-ui/apps/web-antd/public/static/menu/ico9.png b/eims-ui/apps/web-antd/public/static/menu/ico9.png new file mode 100644 index 0000000..93a174d --- /dev/null +++ b/eims-ui/apps/web-antd/public/static/menu/ico9.png Binary files differ diff --git a/eims-ui/apps/web-antd/src/api/eims/dashboard/index.ts b/eims-ui/apps/web-antd/src/api/eims/dashboard/index.ts new file mode 100644 index 0000000..d0438ed --- /dev/null +++ b/eims-ui/apps/web-antd/src/api/eims/dashboard/index.ts @@ -0,0 +1,65 @@ +import { requestClient } from '#/api/request'; + +enum Api { + equStatu = '/eims/board/equStatu', + monthMaint = '/eims/board/monthMainit', + monthReq = '/eims/board/monthReq', + spareWarn = '/eims/board/spareWarn', + todayInsp = '/eims/board/todayInsp', + todoList = '/eims/board/todoList' +} + +/** + * 鏌ヨ銆恡odolist銆戞澘鍧楁暟鎹� + * @param query + * @returns {*} + */ + +export function queryTodoList(params?: any) { + return requestClient.get<any[]>(Api.todoList, { params }); +} + +/** + * 鏌ヨ銆愬浠跺簱瀛橀璀︺�戞澘鍧楁暟鎹� + * @param query + * @returns {*} + */ +export function querySpareWarn(params?: any) { + return requestClient.get<any>(Api.spareWarn, { params }); +} + +/** + * 鏌ヨ銆愯澶囩姸鎬併�戞澘鍧楁暟鎹� + * @param query + * @returns {*} + */ +export function queryEquStatu(params?: any) { + return requestClient.get<any>(Api.equStatu, { params }); +} + +/** + * 鏌ヨ銆愮偣妫�缁熻銆戞澘鍧楁暟鎹� + * @param query + * @returns {*} + */ +export function queryTodayInsp(params?: any) { + return requestClient.get<any>(Api.todayInsp, { params }); +} + +/** + * 鏌ヨ銆愭湰鏈堢淮淇�戞澘鍧楁暟鎹� + * @param query + * @returns {*} + */ +export function queryMonthReq(params?: any) { + return requestClient.get<any>(Api.monthReq, { params }); +} + +/** + * 鏌ヨ銆愭湰鏈堜繚鍏汇�戞澘鍧楁暟鎹� + * @param query + * @returns {*} + */ +export function queryMonthMainit(params?: any) { + return requestClient.get<any>(Api.monthMaint, { params }); +} diff --git a/eims-ui/apps/web-antd/src/api/eims/repair-res/index.ts b/eims-ui/apps/web-antd/src/api/eims/repair-res/index.ts index 9d4bd8a..64dc447 100644 --- a/eims-ui/apps/web-antd/src/api/eims/repair-res/index.ts +++ b/eims-ui/apps/web-antd/src/api/eims/repair-res/index.ts @@ -1,6 +1,6 @@ import type { RepairResVO } from './model'; -import type { ID, IDS } from '#/api/common'; +import type { ID, IDS, PageResult } from '#/api/common'; import { commonExport } from '#/api/helper'; import { requestClient } from '#/api/request'; @@ -18,7 +18,8 @@ */ export function listRepairRes(params?: any) { - return requestClient.get<RepairResVO[]>(Api.repairResList, { params }); + // return requestClient.get<RepairResVO[]>(Api.repairResList, { params }); + return requestClient.get<PageResult<RepairResVO>>(Api.repairResList, { params }); } /** diff --git a/eims-ui/apps/web-antd/src/views/eims/equ-detail/index.vue b/eims-ui/apps/web-antd/src/views/eims/equ-detail/index.vue index 92cc264..29807b3 100644 --- a/eims-ui/apps/web-antd/src/views/eims/equ-detail/index.vue +++ b/eims-ui/apps/web-antd/src/views/eims/equ-detail/index.vue @@ -60,21 +60,21 @@ <div class="w-3/4 min-w-[640px] flex align-center justify-around"> <Divider class="h-full" type="vertical" /> <div class="flex w-1/4 h-full cursor-pointer items-center justify-center rounded-sm hover:bg-gray-100" style="background: #f2f6fe"> - <Image :preview="false" :width="40" src="/src/assets/logo.png" /> + <Image :preview="false" :width="40" src="/static/menu/ico7.png" /> <div class="flex flex-col ml-6 mr-2"> <span class="text-xl font-bold">100%</span> <span class="mt-5 text-gray-500">璁惧鍋ュ悍搴�</span> </div> </div> <div class="flex w-1/4 h-full cursor-pointer items-center justify-center rounded-sm hover:bg-gray-100" style="background: #fcf8ee"> - <Image :preview="false" :width="40" src="/src/assets/logo.png" /> + <Image :preview="false" :width="40" src="/static/menu/ico1.png" /> <div class="flex flex-col ml-6 mr-2"> - <span class="text-xl font-bold">86.6h</span> + <span class="text-xl font-bold">0.0h</span> <span class="mt-5 text-gray-500">骞冲潎鏁呴殰鏃堕棿</span> </div> </div> <div class="flex w-1/4 h-full cursor-pointer items-center justify-center rounded-sm hover:bg-gray-100" style="background: #ecf5de"> - <Image :preview="false" :width="40" src="/src/assets/logo.png" /> + <Image :preview="false" :width="40" src="/static/menu/ico5.png" /> <div class="flex flex-col ml-6 mr-2"> <span class="text-xl font-bold">0鍏�</span> <span class="mt-5 text-gray-500">缁翠繚鎬昏垂鐢�</span> @@ -120,12 +120,12 @@ </DescriptionsItem> </Descriptions> </TabPane> - <TabPane key="2" tab="缁翠慨">Content of Tab Pane 2</TabPane> +<!-- <TabPane key="2" tab="缁翠慨">Content of Tab Pane 2</TabPane> <TabPane key="3" tab="淇濆吇">Content of Tab Pane 3</TabPane> <TabPane key="4" tab="鐐规">Content of Tab Pane 3</TabPane> <TabPane key="5" tab="澶囦欢">Content of Tab Pane 3</TabPane> <TabPane key="6" tab="闄勪欢">Content of Tab Pane 3</TabPane> - <TabPane key="7" tab="璁惧灞ュ巻">Content of Tab Pane 3</TabPane> + <TabPane key="7" tab="璁惧灞ュ巻">Content of Tab Pane 3</TabPane>--> <TabPane key="8" tab="璇曚骇璁板綍"> <EquTrial :equ-detail-flag="true" :equ-id="equId" /> </TabPane> 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 406f76e..4d5e972 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 @@ -90,7 +90,8 @@ title: '宸ュ叿(娌诲叿)鍚嶇О', field: 'fixtureName', minWidth: 140, - fixed: 'left' + fixed: 'left', + slots: { default: 'fixtureName' } }, { diff --git a/eims-ui/apps/web-antd/src/views/eims/fixture/fixture-import-modal.vue b/eims-ui/apps/web-antd/src/views/eims/fixture/fixture-import-modal.vue index a22f2f7..93f33c1 100644 --- a/eims-ui/apps/web-antd/src/views/eims/fixture/fixture-import-modal.vue +++ b/eims-ui/apps/web-antd/src/views/eims/fixture/fixture-import-modal.vue @@ -8,7 +8,7 @@ import { Modal, Switch, Upload } from 'ant-design-vue'; -import { downloadImportTemplate, equImportData } from '#/api/eims/equ'; +import { downloadImportTemplate, fixtureImportData } from '#/api/eims/fixture'; import { commonDownloadExcel } from '#/utils/file/download'; const emit = defineEmits<{ reload: [] }>(); @@ -34,7 +34,7 @@ file: fileList.value[0]!.originFileObj as Blob, updateSupport: unref(checked), }; - const { code, msg } = await equImportData(data); + const { code, msg } = await fixtureImportData(data); let modal = Modal.success; if (code === 200) { emit('reload'); @@ -69,7 +69,7 @@ <BasicModal :close-on-click-modal="false" :fullscreen-button="false" - title="璁惧瀵煎叆" + title="宸ュ叿瀵煎叆" > <!-- z-index涓嶈缃細閬尅妯℃澘涓嬭浇loading --> <!-- 鎵嬪姩澶勭悊 鑰屼笉鏄斁鍏ユ枃浠跺氨涓婁紶 --> 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 ef65b27..81a789f 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 @@ -108,7 +108,7 @@ sortChange: (sortParams) => vxeSortEvent(tableApi, sortParams), cellClick: (e: any) => { const { row } = e; - handleBorroeList(row); + // handleBorroeList(row); } } }); @@ -300,9 +300,9 @@ <a-button v-access:code="['eims:fixture:export']" @click="handleDownloadExcel"> {{ $t('pages.common.export') }} </a-button> - <!-- <a-button v-access:code="['eims:fixture:import']" @click="handleImport"> + <a-button v-access:code="['eims:fixture:import']" @click="handleImport"> {{ $t('pages.common.import') }} - </a-button>--> + </a-button> <a-button :disabled="!vxeCheckboxChecked(tableApi)" danger @@ -318,6 +318,12 @@ </Space> </template> + <template #fixtureName="{ row }"> + <Space> + <a-button type="link" @click="handleBorroeList(row)"> {{ row.fixtureName }}</a-button> + </Space> + </template> + <template #action="{ row }"> <Space> <ghost-button v-access:code="['eims:fixture:edit']" @click.stop="handleEdit(row)"> diff --git a/eims-ui/apps/web-antd/src/views/index.vue b/eims-ui/apps/web-antd/src/views/index.vue index 71c466a..746ac1d 100644 --- a/eims-ui/apps/web-antd/src/views/index.vue +++ b/eims-ui/apps/web-antd/src/views/index.vue @@ -1,51 +1,166 @@ <script setup lang="ts"> -import { onMounted, ref } from 'vue'; +import { computed, onMounted, ref } from 'vue'; +import { useRouter } from 'vue-router'; import { EchartsUI, type EchartsUIType, useEcharts } from '@vben/plugins/echarts'; import { AlertTwoTone, NotificationTwoTone, TagTwoTone } from '@ant-design/icons-vue'; -import { Avatar, Card, Col, Image, Row } from 'ant-design-vue'; +import { Card, Col, Image, Row, Skeleton } from 'ant-design-vue'; + +import { queryEquStatu, queryMonthMainit, queryMonthReq, querySpareWarn, queryTodayInsp, queryTodoList } from '#/api/eims/dashboard'; +import { listEqu } from '#/api/eims/equ'; +import { listRepairRes } from '#/api/eims/repair-res'; + +const router = useRouter(); + +const equTotal = ref<number>(0); +const equFaultTotal = ref<number>(0); + +const showInstSkeleton = ref<boolean>(true); +const showEquStatuSkeleton = ref<boolean>(true); +const showInspSkeleton = ref<boolean>(true); +const showRepairSkeleton = ref<boolean>(true); +const showMaintSkeleton = ref<boolean>(true); const instChart = ref<EchartsUIType>(); const { renderEcharts: renderInstChart } = useEcharts(instChart); const useStatuChart = ref<EchartsUIType>(); const { renderEcharts: renderUseChart } = useEcharts(useStatuChart); +const inspChart = ref<EchartsUIType>(); +const { renderEcharts: renderInspChart } = useEcharts(inspChart); const repairChart = ref<EchartsUIType>(); const { renderEcharts: renderRepairChart } = useEcharts(repairChart); -const faultChart = ref<EchartsUIType>(); -const { renderEcharts: renderFaultChart } = useEcharts(faultChart); -const maintenChart = ref<EchartsUIType>(); -const { renderEcharts: renderMaintenChart } = useEcharts(maintenChart); +const maintChart = ref<EchartsUIType>(); +const { renderEcharts: renderMaintChart } = useEcharts(maintChart); const todoItems = ref<any>([ { completed: false, - content: `瀹℃煡鏈�杩戞彁浜ゅ埌Git浠撳簱鐨勫墠绔唬鐮侊紝纭繚浠g爜璐ㄩ噺鍜岃鑼冦�俙, - date: '2024-07-30 11:00:00', - title: '瀹℃煡鍓嶇浠g爜鎻愪氦' - }, - { - completed: true, - content: `妫�鏌ュ苟浼樺寲绯荤粺鎬ц兘锛岄檷浣嶤PU浣跨敤鐜囥�俙, - date: '2024-07-30 11:00:00', - title: '绯荤粺鎬ц兘浼樺寲' + content: `涓烘彁鍗囩郴缁熺ǔ瀹氭�у強鐢ㄦ埛浣撻獙锛岃澶囩鐞嗙郴缁熷皢浜� 2025骞�5鏈�25鏃ワ紙鏄熸湡鏃ワ級鍑屾櫒0:00鑷�4:00 杩涜渚嬭绯荤粺缁存姢鍗囩骇銆傛湡闂寸郴缁熷彲鑳芥殏鏃舵棤娉曡闂紝璇锋偍鎻愬墠鍋氬ソ鐩稿叧瀹夋帓銆俙, + date: '2025-05-18 10:12:00', + title: '绯荤粺缁存姢閫氱煡' }, { completed: false, - content: `杩涜绯荤粺瀹夊叏妫�鏌ワ紝纭繚娌℃湁瀹夊叏婕忔礊鎴栨湭鎺堟潈鐨勮闂�� `, - date: '2024-07-30 11:00:00', - title: '瀹夊叏妫�鏌�' - }, - + content: `涓鸿繘涓�姝ヨ鑼冭澶囨晠闅滃鐞嗘祦绋嬶紝鍗虫棩璧锋墍鏈夎澶囨姤淇渶閫氳繃绯荤粺鈥滄晠闅滄姤淇�濇ā鍧楁彁浜ょ敵璇凤紝璇峰嬁鍐嶄娇鐢ㄧ嚎涓嬬焊璐ㄦ祦绋嬨�傛妧鏈敮鎸佷汉鍛樺皢渚濇嵁宸ュ崟浼樺厛绾у強鏃跺搷搴斿鐞嗐�俙, + date: '2024-07-28 14:30:00', + title: '鏂板璁惧鎶ヤ慨娴佺▼璇存槑' + } +]); +const commonFunctions = ref<any>([ { - completed: false, - content: `淇鐢ㄦ埛鎶ュ憡鐨勯〉闈I鏄剧ず闂锛岀‘淇濆湪涓嶅悓娴忚鍣ㄤ腑鏄剧ず涓�鑷淬�� `, - date: '2024-07-30 11:00:00', - title: '淇UI鏄剧ず闂' + menu: '鏁呴殰鎶ヤ慨', + path: '/repair/repairReq', + icon: '/static/menu/ico1.png' + }, + { + menu: '缁翠慨宸ュ崟', + path: '/repair/repairRes', + icon: '/static/menu/ico2.png' + }, + { + menu: '鐐规姹囨��', + path: '/inspect/st', + icon: '/static/menu/ico3.png' + }, + { + menu: '鐐规璁″垝', + path: '/inspect/plan', + icon: '/static/menu/ico4.png' + }, + { + menu: '淇濆吇姹囨��', + path: '/maint/st', + icon: '/static/menu/ico5.png' + }, + { + menu: '淇濆吇璁″垝', + path: '/maint/plan', + icon: '/static/menu/ico6.png' + }, + { + menu: '璁惧鍙拌处', + path: '/equ/ledger', + icon: '/static/menu/ico7.png' } ]); -onMounted(() => { +const todoMenu = ref<any>([ + { + menu: '鏁呴殰鎶ヤ慨', + path: '/repair/repairReq', + icon: '/static/menu/ico1.png' + }, + { + menu: '缁翠慨浠诲姟', + path: '/repair/repairRes', + icon: '/static/menu/ico2.png' + }, + { + menu: '缁翠慨璇勪环', + path: '/repair/repairRes', + icon: '/static/menu/ico2.png' + }, + { + menu: '鐐规浠诲姟', + path: '/inspect/st', + icon: '/static/menu/ico3.png' + }, + { + menu: '淇濆吇浠诲姟', + path: '/maint/st', + icon: '/static/menu/ico5.png' + }, + { + menu: '鐘舵�佸彉鏇�', + path: '/equ/equStatu', + icon: '/static/menu/ico5.png' + }, + { + menu: '璁惧鍙拌处', + path: '/equ/ledger', + icon: '/static/menu/ico7.png' + } +]); + +// 澶囦欢棰勮 +const spareWarn = ref<any>({}); +// 璁惧浣跨敤鐘舵�� +const equStatu = ref<any>({}); +// 浠婃棩鐐规 +const todayInsp = ref<any>({}); +// 鏈湀鏁呴殰 +const monthReq = ref<any>({}); +// 鏈湀淇濆吇 +const monthMaint = ref<any>({}); + +const spareMenu = ref<any>([ + { + menu: '澶囦欢鍙拌处', + path: '/spare/index', + icon: '/static/menu/ico8.png' + }, + { + menu: '鍏ュ簱鍗�', + path: '/spare/in', + icon: '/static/menu/ico9.png' + }, + { + menu: '鍑哄簱鍗�', + path: '/spare/out', + icon: '/static/menu/ico10.png' + } +]); + +function itemClick(item: any) { + router.push(item.path); +} +function goToKnowledge() { + router.push('/faultKnow'); +} + +function initInstChart(data: any) { + showInstSkeleton.value = false; renderInstChart({ series: [ { @@ -99,16 +214,16 @@ formatter(value: number) { switch (value) { case 0.125: { - return 'Grade D'; + return '涓ラ噸鏁呴殰'; } case 0.375: { - return 'Grade C'; + return '鎬ラ渶缁存姢'; } case 0.625: { - return 'Grade B'; + return '鍩烘湰鍙敤'; } case 0.875: { - return 'Grade A'; + return '鍙潬杩愯'; } // No default } @@ -130,7 +245,7 @@ }, data: [ { - value: 0.95, + value: data?.normal, name: '姝e父璁惧鍗犳瘮' } ] @@ -140,6 +255,12 @@ trigger: 'item' } }); +} + +function initEquStatuChart(data: any) { + showEquStatuSkeleton.value = false; + const keyList = Object.keys(data); + const valueList = Object.values(data); renderUseChart({ tooltip: { trigger: 'axis', @@ -161,13 +282,13 @@ }, yAxis: { type: 'category', - data: ['寰呮', '鍦ㄧ敤', '鍋滅敤', '鍏朵粬', '鎶ュ簾'] + data: keyList }, series: [ { - name: '2012', + name: '2025', type: 'bar', - data: [10, 63, 21, 91, 8], + data: valueList, label: { show: true, position: 'right' @@ -176,127 +297,60 @@ } ] }); - renderRepairChart({ +} + +function initInspChart(data: any) { + showInspSkeleton.value = false; + const nameList = data?.data.map((item) => item.name); + renderInspChart({ tooltip: { - trigger: 'item' - }, - title: { - left: '18%', // 鍩轰簬瀹瑰櫒瀹藉害鐨�50% - top: '35%', - text: `{a|10涓獇\n{b|鏈慨澶峿\n{c|浠婃棩鏂板 +1}`, - textStyle: { - rich: { - a: { - color: '#4E5766', - fontSize: 20, - lineHeight: 30, - align: 'center' - }, - b: { - color: '#1C2029', - fontSize: 18, - lineHeight: 30, - align: 'center' - }, - c: { - color: '#ef6666', - fontSize: 15, - lineHeight: 30, - align: 'center' - } - } - } + trigger: 'item', + formatter: '{a} <br/>{b}: {c} ({d}%)' }, legend: { - orient: 'vertical', - top: 'center', - right: 'right', - left: '70%' + data: nameList }, series: [ { - name: 'Access From', + name: '鐐规椤�', type: 'pie', - radius: ['40%', '65%'], // 璋冩暣鍐呭鍗婂緞 - center: ['30%', '50%'], // 灏嗛ゼ鍥句腑蹇冨悜宸︾Щ涓�鐐� - avoidLabelOverlap: false, - itemStyle: { - borderRadius: 10, - borderColor: '#fff', - borderWidth: 2 - }, + selectedMode: 'single', + radius: [0, '30%'], label: { - show: false, - position: 'center' - }, - emphasis: { - label: { - show: false, - fontSize: 40, - fontWeight: 'bold' - } + position: 'inner', + fontSize: 14 }, labelLine: { show: false }, - data: [ - { value: 10, name: '寰呮帴鍗�' }, - { value: 8, name: '寰呯淮淇�' }, - { value: 9, name: '缁翠慨涓�' }, - { value: 16, name: '瀹℃牳涓�' }, - { value: 8, name: '鍏朵粬' } - ] - } - ] - }); - renderFaultChart({ - tooltip: { - trigger: 'axis', - axisPointer: { - type: 'shadow' - } - }, - grid: { - left: '3%', - right: '4%', - bottom: '3%', - containLabel: true - }, - xAxis: [ + data: data?.sub + }, { - type: 'category', - data: ['smt', '璐寸墖鏈�', '娉ㄨ兌鏈�'], - axisTick: { - alignWithLabel: true - } - } - ], - yAxis: [ - { - type: 'value' - } - ], - series: [ - { - name: 'Direct', - type: 'bar', - barWidth: 20, - data: [10, 8, 12], + name: '鐐规', + type: 'pie', + radius: ['45%', '60%'], + labelLine: { + length: 30 + }, label: { - show: true, - position: 'top' - } + show: true + }, + data: data?.data } ] }); - renderMaintenChart({ +} + +function initRepairChart(data: any) { + showRepairSkeleton.value = false; + renderRepairChart({ tooltip: { trigger: 'item' }, title: { left: '21%', // 鍩轰簬瀹瑰櫒瀹藉害鐨�50% top: '40%', - text: `{a|鎬诲彴鏁皚\n{b|20}`, + text: `{a|鎬绘晠闅渳\n{b|${data?.data?.length}}`, textStyle: { rich: { a: { @@ -322,7 +376,7 @@ }, series: [ { - name: 'Access From', + name: '璁惧缁翠慨', type: 'pie', radius: ['40%', '65%'], // 璋冩暣鍐呭鍗婂緞 center: ['30%', '50%'], // 灏嗛ゼ鍥句腑蹇冨悜宸︾Щ涓�鐐� @@ -346,15 +400,142 @@ labelLine: { show: false }, - data: [ - { value: 10, name: '鏈繚鍏�' }, - { value: 8, name: '寰呬繚鍏�' }, - { value: 9, name: '淇濆吇涓�' }, - { value: 16, name: '寰呮帴鍗�' } - ] + data: data?.data } ] }); +} + +function initMaintChart(data: any) { + showMaintSkeleton.value = false; + renderMaintChart({ + tooltip: { + trigger: 'item' + }, + title: { + left: '21%', // 鍩轰簬瀹瑰櫒瀹藉害鐨�50% + top: '40%', + text: `{a|鎬讳繚鍏粆\n{b|${data?.data?.length}}`, + textStyle: { + rich: { + a: { + color: '#4E5766', + fontSize: 20, + lineHeight: 30, + align: 'center' + }, + b: { + color: '#1C2029', + fontSize: 18, + lineHeight: 30, + align: 'center' + } + } + } + }, + legend: { + orient: 'vertical', + top: 'center', + right: 'right', + left: '70%' + }, + series: [ + { + name: '淇濆吇', + type: 'pie', + radius: ['40%', '65%'], // 璋冩暣鍐呭鍗婂緞 + center: ['30%', '50%'], // 灏嗛ゼ鍥句腑蹇冨悜宸︾Щ涓�鐐� + avoidLabelOverlap: false, + itemStyle: { + borderRadius: 10, + borderColor: '#fff', + borderWidth: 2 + }, + label: { + show: false, + position: 'center' + }, + emphasis: { + label: { + show: false, + fontSize: 40, + fontWeight: 'bold' + } + }, + labelLine: { + show: false + }, + data: data?.data + } + ] + }); +} + +async function initData() { + const equResult = await listEqu(); + const repairRes = await listRepairRes(); + const equCount = equResult?.total || 0; + const rpairTotal = repairRes?.total || 0; + const instData = { normal: 0 }; + if (rpairTotal > 0 && equCount > 0) { + equTotal.value = equCount; + equFaultTotal.value = rpairTotal; + instData.normal = (equCount - rpairTotal) / equCount; + } + initInstChart(instData); + + const todoList = await queryTodoList(); + todoMenu.value = todoMenu.value.map((frontendItem: any) => { + // 鏌ユ壘瀵瑰簲menu鐨勫悗绔暟鎹� + const backendItem = todoList?.find((item: any) => item.menu === frontendItem.menu); + // 濡傛灉鎵惧埌浜嗗搴旂殑鍚庣鏁版嵁锛屽垯鍚堝苟涔嬶紙涓嶈鐩栧凡鏈夌殑灞炴�э級 + if (backendItem) { + frontendItem = { ...frontendItem, ...backendItem }; + } + return frontendItem; + }); + spareWarn.value = await querySpareWarn(); + equStatu.value = await queryEquStatu(); + initEquStatuChart(equStatu.value); + const tInsp = (await queryTodayInsp()) || {}; + todayInsp.value = tInsp; + initInspChart(tInsp); + monthReq.value = (await queryMonthReq()) || {}; + initRepairChart(monthReq.value); + monthMaint.value = (await queryMonthMainit()) || {}; + initMaintChart(monthMaint.value); +} + +onMounted(async () => { + initData(); +}); + +const todayInspTotal = computed(() => { + return todayInsp.value?.data?.reduce((sum, item) => sum + item.value, 0); +}); + +const todayInspFinish = computed(() => { + return todayInsp.value?.data?.filter((item) => item.name === '宸插畬鎴�').reduce((sum, item) => sum + item.value, 0); +}); + +const finishReqCount = computed(() => { + const completedItem = monthReq.value?.data?.find((item) => item.name === '宸插畬鎴�'); + return completedItem ? completedItem.value : 0; +}); + +const reqCount = computed(() => { + // 宸插畬鎴� + return monthReq.value?.data?.reduce((sum, item) => sum + item.value, 0); +}); + +const maintCount = computed(() => { + // 宸插畬鎴� + return monthMaint.value?.data?.reduce((sum, item) => sum + item.value, 0); +}); + +const finishMaintCount = computed(() => { + const completedItem = monthMaint.value?.data?.find((item) => item.name === '宸插畬鎴�'); + return completedItem ? completedItem.value : 0; }); </script> @@ -367,13 +548,15 @@ <label class="ml-2">甯哥敤鍔熻兘</label> </template> <Row> - <Col v-for="i in 9" :span="8" class="flex cursor-pointer flex-col items-center justify-center py-6 hover:bg-gray-100"> - <Avatar size="large" src="/src/assets/logo.png"> - <!-- <template #icon> - <UserOutlined /> - </template>--> - </Avatar> - <label class="mt-1">璁惧鍙拌处{{ i }}</label> + <Col + v-for="(item, index) in commonFunctions" + :key="index" + :span="8" + class="flex cursor-pointer flex-col items-center justify-center py-6 hover:bg-gray-100" + @click.stop="itemClick(item)" + > + <Image :preview="false" :src="item.icon" :width="35" /> + <label class="mt-1"> {{ item.menu }}</label> </Col> </Row> </Card> @@ -383,52 +566,59 @@ <TagTwoTone /> <span class="ml-2">浣跨敤鐘舵��</span> </template> - - <EchartsUI ref="useStatuChart" height="400px" /> + <Skeleton :loading="showInstSkeleton" :paragraph="{ rows: 12, width: 400 }" active> + <EchartsUI ref="useStatuChart" height="400px" /> + </Skeleton> </Card> <Card :bordered="false" class="section-height mt-2 rounded-none"> <template #title> <TagTwoTone /> - <span class="ml-2">璁惧缁翠慨</span> + <span class="ml-2">浠婃棩鐐规</span> </template> - <div class="flex w-full flex-col justify-center items-center"> - <div class="flex w-full py-3"> - <div class="flex flex-col justify-center items-center w-1/3"> - <span class="font-bold text-xl">3</span> - <span>鍝嶅簲瓒呮椂</span> - </div> - <div class="flex flex-col justify-center items-center w-1/3"> - <span class="font-bold text-xl">1</span> - <span>缁翠慨瓒呮椂</span> - </div> - <div class="flex flex-col justify-center items-center w-1/3"> - <span class="font-bold text-xl">0</span> - <span>鍋滄満瓒呮椂</span> - </div> - </div> - <EchartsUI ref="repairChart" height="300px" width="400px" /> - </div> + <Skeleton :loading="showInspSkeleton" :paragraph="{ rows: 12, width: 400 }" active> + <div class="flex w-full flex-col justify-center items-center"> + <div class="flex w-full py-3"> + <div class="flex flex-col justify-center items-center w-1/3"> + <span class="font-bold text-xl">{{ todayInspTotal }}</span> + <span>鐐规鎵规</span> + </div> + <div class="flex flex-col justify-center items-center w-1/3"> + <span class="font-bold text-xl"></span> + <span> </span> + </div> + <div class="flex flex-col justify-center items-center w-1/3"> + <span class="font-bold text-xl">{{ todayInspFinish }}</span> + <span>宸插畬鎴�</span> + </div> + </div> + + <EchartsUI ref="inspChart" height="300px" width="400px" /> + </div> + </Skeleton> </Card> </div> <div class="mr-2 w-1/3"> <Card :bordered="false" class="section-height flex justify-center rounded-none p-0"> - <div class="w-full"> - <EchartsUI ref="instChart" width="400px" /> - - <div class="flex justify-around pb-5"> + <div class="w-full pt-4"> + <Skeleton :loading="showInstSkeleton" :paragraph="{ rows: 12, width: 400 }" active> <div> - <div class="text-center text-4xl">100<label class="ml-1 text-xl font-bold">鍙�</label></div> - <div class="text-center font-bold">璁惧鎬绘暟</div> - </div> + <EchartsUI ref="instChart" width="400px" /> + <div class="flex justify-around pb-5"> + <div> + <div class="text-center text-4xl">{{ equTotal }}<label class="ml-1 text-xl font-bold">鍙�</label></div> + <div class="text-center font-bold">璁惧鎬绘暟</div> + </div> - <div> - <div class="text-center text-4xl text-red-500">5<label class="ml-1 text-xl font-bold">鍙�</label></div> - <div class="text-center font-bold">鏁呴殰鎬绘暟</div> + <div> + <div class="text-center text-4xl text-red-500">{{ equFaultTotal }}<label class="ml-1 text-xl font-bold">鍙�</label></div> + <div class="text-center font-bold">鏁呴殰鎬绘暟</div> + </div> + </div> </div> - </div> + </Skeleton> </div> </Card> <Card :bordered="false" class="section-height mt-2 rounded-none"> @@ -472,26 +662,43 @@ <Card :bordered="false" class="section-height mt-2 rounded-none"> <template #title> <TagTwoTone /> - <span class="ml-2">鏁呴殰缁熻</span> + <span class="ml-2">鏈湀缁翠慨</span> </template> - <span class="text-gray-500 text-xs ml-3">鏁呴殰娆℃暟:10</span> - <EchartsUI ref="faultChart" height="360px" /> - </Card> + <Skeleton :loading="showRepairSkeleton" :paragraph="{ rows: 12, width: 400 }" active> + <div class="flex w-full flex-col justify-center items-center"> + <div class="flex w-full py-3"> + <div class="flex flex-col justify-center items-center w-1/3"> + <span class="font-bold text-xl">{{ reqCount || 0 }}</span> + <span>鏈湀鎶ヤ慨</span> + </div> + <div class="flex flex-col justify-center items-center w-1/3"> + <span class="font-bold text-xl">{{ monthReq?.today?.length || 0 }}</span> + <span>浠婃棩鏂板</span> + </div> + <div class="flex flex-col justify-center items-center w-1/3"> + <span class="font-bold text-xl">{{ finishReqCount }}</span> + <span>鏈湀瀹屾垚</span> + </div> + </div> + <EchartsUI ref="repairChart" height="300px" width="400px" /> + </div> + </Skeleton> + </Card> </div> <div class="w-1/3"> <div class="flex h-14 items-center justify-around rounded-none bg-white p-0"> <div class="flex h-10 w-28 cursor-pointer items-center justify-around rounded-sm hover:bg-gray-100" style="background: #eaf3fe"> - <Image :preview="false" :width="20" src="/src/assets/logo.png" /> - <span class="mr-2 font-bold" style="color: #2d83f4">鏁呴殰鐭ヨ瘑搴�</span> + <Image :preview="false" :width="20" src="/static/menu/ico11.png" /> + <span class="mr-2 font-bold" style="color: #2d83f4" @click="goToKnowledge()">鏁呴殰鐭ヨ瘑搴�</span> </div> <div class="flex h-10 w-28 cursor-pointer items-center justify-around rounded-sm hover:bg-gray-100" style="background: #eaeafe"> - <Image :preview="false" :width="20" src="/src/assets/logo.png" /> + <Image :preview="false" :width="20" src="/static/menu/ico12.png" /> <span class="mr-2 font-bold" style="color: #5070e0">鏅鸿兘鎼滅储</span> </div> <div class="flex h-10 w-28 cursor-pointer items-center justify-around rounded-sm hover:bg-gray-100" style="background: #ebf8f7"> - <Image :preview="false" :width="20" src="/src/assets/logo.png" /> + <Image :preview="false" :width="20" src="/static/menu/ico13.png" /> <span class="mr-2 font-bold" style="color: #32b9af">甯姪涓績</span> </div> </div> @@ -504,36 +711,38 @@ <div class="todo-title mt-5">璁惧绠$悊</div> <div class="flex w-full flex-wrap justify-between"> <div - v-for="index in 12" + v-for="(item, index) in todoMenu" :class="{ - 'justify-center': index % 3 == 2, - 'justify-end': index % 3 == 0, - 'mt-2': index > 3 + 'justify-center': (index + 1) % 3 == 2, + 'justify-end': (index + 1) % 3 == 0, + 'mt-2': index > 2 }" class="flex w-1/3" + @click="itemClick(item)" > <div class="todo-box cursor-pointer hover:bg-gray-100"> - <Image :preview="false" :width="20" src="/src/assets/logo.png" /> - <span>鏁呴殰瀹℃牳</span> - <span>{{ index }}</span> + <Image :preview="false" :src="item?.icon" :width="20" /> + <span>{{ item.menu }}</span> + <span>{{ item?.count || 0 }}</span> </div> </div> </div> - <div class="todo-title mt-20">澶囦欢绠$悊</div> + <div class="todo-title mt-44">澶囦欢绠$悊</div> <div class="flex w-full flex-wrap justify-between"> <div - v-for="index in 3" + v-for="(item, index) in spareMenu" :class="{ - 'justify-center': index % 3 == 2, - 'justify-end': index % 3 == 0 + 'justify-center': (index + 1) % 3 == 2, + 'justify-end': (index + 1) % 3 == 0 }" class="flex w-1/3" + @click="itemClick(item)" > <div class="todo-box border-gray-100"> - <Image :preview="false" :width="20" src="/src/assets/logo.png" /> - <span>鏁呴殰瀹℃牳</span> - <span>{{ index }}</span> + <Image :preview="false" :src="item?.icon" :width="20" /> + <span>{{ item.menu }}</span> + <span>{{}}</span> </div> </div> </div> @@ -548,25 +757,25 @@ <div class="up-info-box w-1/2 flex h-40"> <div class="w-1/2 flex items-center h-full justify-center flex-col"> <div class="w-16"> - <span class="text-xl text-green-600">7</span> + <span class="text-xl text-green-600">{{ spareWarn?.upper || 0 }}</span> <span class="ml-1">绉�</span> </div> <div class="w-16">楂樹簬涓婇檺</div> </div> <div class="w-1/2 h-full flex items-center justify-center"> - <Image :preview="false" src="/src/assets/img/img-up-limit.png" /> + <Image :preview="false" src="/static/img/img-up-limit.png" /> </div> </div> <div class="low-info-box w-1/2 flex h-40"> <div class="w-1/2 flex items-center h-full justify-center flex-col"> <div class="w-16"> - <span class="text-xl text-red-600">10</span> + <span class="text-xl text-red-600">{{ spareWarn?.lower || 0 }}</span> <span class="ml-1">绉�</span> </div> <div class="w-16">浣庝簬涓嬮檺</div> </div> <div class="w-1/2 h-full flex items-center justify-center"> - <Image :preview="false" src="/src/assets/img/img-lower-limit.png" /> + <Image :preview="false" src="/static/img/img-lower-limit.png" /> </div> </div> </div> @@ -575,26 +784,28 @@ <Card :bordered="false" class="section-height mt-2 rounded-none"> <template #title> <TagTwoTone /> - <span class="ml-2">璁惧淇濆吇</span> + <span class="ml-2">鏈湀淇濆吇</span> </template> - <div class="flex w-full flex-col justify-center items-center"> - <div class="flex w-full py-3"> - <div class="flex flex-col justify-center items-center w-1/3"> - <span class="font-bold text-xl">3</span> - <span>鏈繚鍏�</span> + <Skeleton :loading="showMaintSkeleton" :paragraph="{ rows: 12, width: 400 }" active> + <div class="flex w-full flex-col justify-center items-center"> + <div class="flex w-full py-3"> + <div class="flex flex-col justify-center items-center w-1/3"> + <span class="font-bold text-xl">{{ maintCount || 0 }}</span> + <span>鏈湀淇濆吇</span> + </div> + <div class="flex flex-col justify-center items-center w-1/3"> + <span class="font-bold text-xl">{{ maintCount - finishMaintCount }}</span> + <span>鏈畬鎴�</span> + </div> + <div class="flex flex-col justify-center items-center w-1/3"> + <span class="font-bold text-xl">{{ finishMaintCount }}</span> + <span>宸插畬鎴�</span> + </div> </div> - <div class="flex flex-col justify-center items-center w-1/3"> - <span class="font-bold text-xl">1</span> - <span>鏈湀鍒版湡</span> - </div> - <div class="flex flex-col justify-center items-center w-1/3"> - <span class="font-bold text-xl">0</span> - <span>涓嬫湀鍒版湡</span> - </div> - </div> - <EchartsUI ref="maintenChart" height="300px" width="400px" /> - </div> + <EchartsUI ref="maintChart" height="300px" width="400px" /> + </div> + </Skeleton> </Card> </div> </div> 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 60fdb65..df65545 100644 --- a/eims-ui/packages/@core/base/shared/src/constants/dict-enum.ts +++ b/eims-ui/packages/@core/base/shared/src/constants/dict-enum.ts @@ -1,6 +1,5 @@ export enum DictEnum { EIMS_EQU_PART = 'eims_equ_part', // 璁惧閮ㄤ綅 - EIMS_SPARE_UNIT = 'eims_spare_unit', // 澶囦欢璁¢噺鍗曚綅 EIMS_EQU_UNIT = 'eims_equ_unit', // 璁惧鐩樼偣鐘舵�� EIMS_FAULT_REASON = 'eims_fault_reason', // 鏁呴殰鍘熷洜 EIMS_FIXTURE_STATUS = 'eims_fixture_status', // 宸ュ叿锛堟不鍏凤級鐘舵�� @@ -11,6 +10,7 @@ EIMS_INVENTORY_STATU = 'inventory_statu', // 璁惧鐩樼偣鐘舵�� EIMS_MAINT_TYPE = 'eims_maint_type', // 淇濆吇绫诲瀷 EIMS_ORDITM_STATUS = 'eims_orditm_status', // 淇濆吇宸ュ崟鏄庣粏瀹屾垚鐘舵�� + EIMS_SPARE_UNIT = 'eims_spare_unit', // 澶囦欢璁¢噺鍗曚綅 EQU_IMPORT_STATU = 'equ_import_status', // 璁惧瀵煎叆鐘舵�� FIXTURE_BORROW_RECORD_STATUS = 'fixture_borrow_record_status', // 宸ュ叿锛堟不鍏凤級鍊熺敤璁板綍鐘舵�� FIXTURE_BORROW_STATUS = 'fixture_borrow_status', // 宸ュ叿锛堟不鍏凤級鍊熺敤鐘舵�� @@ -21,10 +21,10 @@ REPAIR_FAULT_TYPE = 'repair_fault_type', // 鏁呴殰绫诲埆 REPAIR_RECORD_HANDLE = 'repair_record_handle', // 缁翠慨璁板綍鎿嶄綔 REPAIR_REQ_STATUS = 'repair_req_status', // 鎶ヤ慨鐘舵�� - SPARE_INOUT_TYPE = 'spare_inout_type', // 澶囦欢鍑哄叆搴撶被鍨� 1-鍏ュ簱鍗� 2-鍑哄簱鍗� REPAIR_REQ_TYPE = 'repair_req_type', // 鎶ヤ慨绫诲瀷 REPAIR_RES_STATUS = 'repair_res_status', // 缁翠慨鐘舵�� REPAIR_URGENCY_LEVEL = 'repair_urgency_level', // 鎶ヤ慨绱ф�ョ▼搴� + SPARE_INOUT_TYPE = 'spare_inout_type', // 澶囦欢鍑哄叆搴撶被鍨� 1-鍏ュ簱鍗� 2-鍑哄簱鍗� SYS_COMMON_STATUS = 'sys_common_status', SYS_DEVICE_TYPE = 'sys_device_type', // 璁惧绫诲瀷 SYS_EQU_STATUS = 'sys_equ_status', // 璁惧鐘舵�� diff --git a/eims/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/DictConstants.java b/eims/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/DictConstants.java index 9bbaa6c..b659746 100644 --- a/eims/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/DictConstants.java +++ b/eims/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/DictConstants.java @@ -10,6 +10,42 @@ * 璁惧鍗曚綅unit */ String EIMS_EQU_UNIT = "eims_equ_unit"; + /** + * 宸ュ叿鍗曚綅 + */ + String EIMS_FIXTURE_UNIT = "eims_fixture_unit"; + + /** + * 璁惧鐘舵�� + */ + String EIMS_EQU_STATUS = "sys_equ_status"; + + interface EIMS_EQU_STATUS_DETAIL { + /** + * 璇曠敤 + */ + String CESHI = "0"; + /** + * 浣跨敤 + */ + String SHIYONG = "1"; + /** + * 鍋滅敤 + */ + String TINGYONG = "2"; + /** + * 鎶ュ簾 + */ + String BAOFEI = "3"; + /** + * 闂茬疆 + */ + String XIANZHI = "4"; + /** + * 鏂板 + */ + String XINZENG = "5"; + } /** * 璁惧瀵煎叆鐘舵�� @@ -21,6 +57,10 @@ String REPAIR_REQ_STATUS = "repair_req_status"; interface REPAIR_REQ_STATUS_DETAIL { + /** + * 寰呮帴鍗� + */ + String DAIJIEDAN = "0"; /** * 宸叉帴鍗� */ @@ -160,6 +200,15 @@ String Y = "1"; // 宸茬偣妫� } + /** + *鐐规缁撴灉 + */ + String EIMS_INSPECT_RESULT = "eims_inspect_result"; + interface EIMS_INSPECT_RESULT_DETAIL { + String N = "2";// 寮傚父 + String Y = "1"; // 姝e父 + } + /** *澶囦欢鍑哄叆搴撶被鍨� diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/controller/BoardController.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/controller/BoardController.java new file mode 100644 index 0000000..c154d92 --- /dev/null +++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/controller/BoardController.java @@ -0,0 +1,376 @@ +package org.dromara.eims.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.DictConstants; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.utils.DateUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.eims.domain.*; +import org.dromara.eims.domain.bo.EimsEquBo; +import org.dromara.eims.domain.vo.EimsInspectStVo; +import org.dromara.eims.domain.vo.EimsMaintOrderVo; +import org.dromara.eims.domain.vo.EimsRepairReqVo; +import org.dromara.eims.mapper.*; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.time.temporal.TemporalAdjusters; +import java.util.*; +import java.util.stream.Collectors; + +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/eims/board") +public class BoardController { + private final EimsRepairReqMapper reqMapper; + private final EimsRepairResMapper resMapper; + private final EimsInspectStMapper inspStMapper; + private final EimsInspectRecordMapper inspRecordMapper; + private final EimsMaintStMapper maintStMapper; + private final EimsEquStatuMapper equStatuMapper; + private final EimsSpareMapper spareMapper; + private final EimsEquMapper equMapper; + private final EimsMaintOrderMapper maintOrderMapper; + + @GetMapping("/todoList") + public R<List<Map<String,Object>>> todoList() { + List<Map<String,Object>> result = new ArrayList<>(); + + // 鎶ヤ慨鍗�-寰呮帴鍗� + LambdaQueryWrapper<EimsRepairReq> reqWrapper = new LambdaQueryWrapper<>(); + // 寰呮帴鍗� + reqWrapper.eq(EimsRepairReq::getStatus, DictConstants.REPAIR_REQ_STATUS_DETAIL.DAIJIEDAN); + Long reqCount = reqMapper.selectCount(reqWrapper); + Map<String,Object> reqMap = new HashMap<>(); + reqMap.put("menu","鏁呴殰鎶ヤ慨"); + reqMap.put("count",reqCount); + result.add(reqMap); + + + //缁翠慨宸ュ崟-鏈畬鎴� + LambdaQueryWrapper<EimsRepairRes> resWrapper = new LambdaQueryWrapper<>(); + // 鏈畬鎴� + resWrapper.ne(EimsRepairRes::getStatus, DictConstants.REPAIR_RES_STATUS_DETAIL.WANCHENG); + Long resCount = resMapper.selectCount(resWrapper); + Map<String,Object> resMap = new HashMap<>(); + resMap.put("menu","缁翠慨浠诲姟"); + resMap.put("count",resCount); + result.add(resMap); + + //缁翠慨宸ュ崟-璇勪环 + LambdaQueryWrapper<EimsRepairRes> evWrapper = new LambdaQueryWrapper<>(); + evWrapper.isNull(EimsRepairRes::getFbId); + Long evCount = resMapper.selectCount(evWrapper); + Map<String,Object> evMap = new HashMap<>(); + evMap.put("menu","缁翠慨璇勪环"); + evMap.put("count",evCount); + result.add(evMap); + + //鐐规姹囨�讳换鍔� + LambdaQueryWrapper<EimsInspectSt> inspStWrapper = new LambdaQueryWrapper<>(); + //鏈偣妫� + inspStWrapper.eq(EimsInspectSt::getStatus, DictConstants.EIMS_INSPECT_STATUS_DETAIL.N); + Long inspStCount = inspStMapper.selectCount(inspStWrapper); + Map<String,Object> inspStMap = new HashMap<>(); + inspStMap.put("menu","鐐规浠诲姟"); + inspStMap.put("count",inspStCount); + result.add(inspStMap); + + //淇濆吇姹囨�讳换鍔� + LambdaQueryWrapper<EimsMaintSt> maintStWrapper = new LambdaQueryWrapper<>(); + //鏈畬鎴愬伐鍗曟眹鎬� + maintStWrapper.eq(EimsMaintSt::getStatus,DictConstants.MAINT_ORDER_ST_STATUS_DETAIL.N); + Long maintStCount = maintStMapper.selectCount(maintStWrapper); + Map<String,Object> maintStMap = new HashMap<>(); + maintStMap.put("menu","淇濆吇浠诲姟"); + maintStMap.put("count",maintStCount); + result.add(maintStMap); + + //璁惧鐘舵�佸彉鏇� + LambdaQueryWrapper<EimsEquStatu> equStatuWrapper = new LambdaQueryWrapper<>(); + equStatuWrapper.isNotNull(EimsEquStatu::getChangeDate); + // 鑾峰彇褰撳墠鏃ユ湡 + LocalDate today = LocalDate.now(); + // 鏋勯�犲綋澶╃殑 00:00:00 + LocalDateTime startOfDay = today.atStartOfDay(); + // 鏋勯�犲綋澶╃殑 23:59:59 + LocalDateTime endOfDay = today.atTime(23, 59, 59); + // 瀹氫箟鏍煎紡鍖栨ā鏉� + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + // 鏍煎紡鍖栬緭鍑� + String startStr = startOfDay.format(formatter); + String endStr = endOfDay.format(formatter); + equStatuWrapper.between(EimsEquStatu::getChangeDate,startStr,endStr); + Long equStatuCount = equStatuMapper.selectCount(equStatuWrapper); + Map<String,Object> equStatuMap = new HashMap<>(); + equStatuMap.put("menu","鐘舵�佸彉鏇�"); + equStatuMap.put("count",equStatuCount); + result.add(equStatuMap); + + return R.ok(result); + + } + + + @GetMapping("/spareWarn") + public R<Map<String,Object>> spareWarn() { + Map<String,Object> result = new HashMap<>(); + + LambdaQueryWrapper<EimsSpare> spareUpWrapper = new LambdaQueryWrapper<>(); + spareUpWrapper.isNotNull(EimsSpare::getUpperStock) + .isNotNull(EimsSpare::getActualStock) + .gt(EimsSpare::getActualStock, 0) + .gt(EimsSpare::getUpperStock, 0) + .apply("actual_stock > upper_stock"); + Long upper = spareMapper.selectCount(spareUpWrapper); + + result.put("upper",upper); + + LambdaQueryWrapper<EimsSpare> spareLowWrapper = new LambdaQueryWrapper<>(); + spareLowWrapper.isNotNull(EimsSpare::getLowerStock) + .isNotNull(EimsSpare::getActualStock) + .gt(EimsSpare::getActualStock, 0) + .gt(EimsSpare::getLowerStock, 0) + .apply("actual_stock < lower_stock"); + Long lower = spareMapper.selectCount(spareLowWrapper); + result.put("lower",lower); + + return R.ok(result); + } + + /** + * 鏌ヨ璁惧鍦ㄧ敤鐘舵�� + * @return + */ + @GetMapping("/equStatu") + public R<Map<String,Integer>> queryEquStatu() { + List<EimsEqu> eimsEqus = equMapper.selectList(); + Map<String, Integer> result = countStatus(eimsEqus); + return R.ok(result); + } + + /** + * 鏌ヨ浠婂ぉ鐐规鏁版嵁 + * @return + */ + @GetMapping("/todayInsp") + public R<Map<String,Object>> todayInsp() { + Map<String, Object> result = new HashMap<>(); + List<Map<String, Object>> data = new ArrayList<>(); + List<Map<String, Object>> sub = new ArrayList<>(); + + // 鍒濆鍖栦富鏁版嵁缁熻椤� + data.add(createDataItem("宸插畬鎴�", 0)); + data.add(createDataItem("鏈畬鎴�", 0)); + + // 鍒濆鍖栧瓙椤圭粺璁� + sub.add(createSubItem("姝e父", 0)); + sub.add(createSubItem("寮傚父", 0)); + sub.add(createSubItem("鏈", 0)); + + result.put("data", data); + result.put("sub", sub); + + // 鏌ヨ浠婃棩璁″垝宸℃浠诲姟 + LambdaQueryWrapper<EimsInspectSt> inspStWrapper = new LambdaQueryWrapper<>(); + inspStWrapper.eq(EimsInspectSt::getType, "Day"); + inspStWrapper.eq(EimsInspectSt::getPlanTime, DateUtils.dateTimeNow(DateUtils.YYYY_MM_DD)); + List<EimsInspectStVo> inspectStList = inspStMapper.selectVoList(inspStWrapper); + + if (inspectStList == null || inspectStList.isEmpty()) { + return R.ok(result); + } + + long completedCount = 0; + List<String> stIdList = new ArrayList<>(); + + for (EimsInspectStVo item : inspectStList) { + if (DictConstants.EIMS_INSPECT_STATUS_DETAIL.Y.equals(item.getStatus())) { + completedCount++; + } + stIdList.add(item.getStId()); + } + + int total = inspectStList.size(); + data.get(0).put("value", completedCount); + data.get(1).put("value", total - completedCount); + + // 鏌ヨ宸℃璁板綍 + List<EimsInspectRecord> recordList = Collections.emptyList(); + if (!stIdList.isEmpty()) { + QueryWrapper<EimsInspectRecord> recordWrapper = new QueryWrapper<>(); + recordWrapper.in("st_id", stIdList); + recordList = inspRecordMapper.selectList(recordWrapper); + } + + if (recordList == null || recordList.isEmpty()) { + return R.ok(result); + } + + long normalCount = 0; + long abnormalCount = 0; + + for (EimsInspectRecord record : recordList) { + String status = record.getStatus(); + if (DictConstants.EIMS_INSPECT_RESULT_DETAIL.Y.equals(status)) { + normalCount++; + } else if (DictConstants.EIMS_INSPECT_RESULT_DETAIL.N.equals(status)) { + abnormalCount++; + } + } + + int unCheckedCount = recordList.size() - (int) (normalCount + abnormalCount); + + sub.get(0).put("value", normalCount); + sub.get(1).put("value", abnormalCount); + sub.get(2).put("value", unCheckedCount); + + return R.ok(result); + + } + + + @GetMapping("/monthReq") + public R<Map<String,Object>> monthReq() { + Map<String,Object> result = new HashMap<>(); + List<Map<String, Object>> statusList = new ArrayList<>(); + LocalDate today = LocalDate.now(); + LambdaQueryWrapper<EimsRepairReq> queryWrapper = new LambdaQueryWrapper<EimsRepairReq>() + .between(EimsRepairReq::getOccTime, + today.with(TemporalAdjusters.firstDayOfMonth()), + today.with(TemporalAdjusters.lastDayOfMonth())); + List<EimsRepairReqVo> reqList = reqMapper.selectVoList(queryWrapper); + long todayCount = reqList.stream() + .filter(r -> r.getReqTime() != null && + r.getReqTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate().isEqual(LocalDate.now())) + .count(); + if (reqList != null && !reqList.isEmpty()) { + // 鍋囪 reqList 宸茬粡浠庢暟鎹簱鏌ヨ鍑烘潵锛屽苟涓斾笉涓虹┖ + Map<String, Long> statusCountMap = reqList.stream() + .collect(Collectors.groupingBy( + item -> { + switch (item.getStatus()) { + case "0": return "寰呮帴鍗�"; + case "1": return "宸叉帴鍗�"; + case "2": return "缁翠慨涓�"; + case "3": return "宸插畬鎴�"; + default: return "鏈煡鐘舵��"; + } + }, + Collectors.counting() + )); + + // 鎸夊浐瀹氶『搴忔帓搴忕敓鎴� List<Map<String, Object>> + + statusList.add(Map.of("name", "寰呮帴鍗�", "value", statusCountMap.getOrDefault("寰呮帴鍗�", 0L))); + statusList.add(Map.of("name", "宸叉帴鍗�", "value", statusCountMap.getOrDefault("宸叉帴鍗�", 0L))); + statusList.add(Map.of("name", "缁翠慨涓�", "value", statusCountMap.getOrDefault("缁翠慨涓�", 0L))); + statusList.add(Map.of("name", "宸插畬鎴�", "value", statusCountMap.getOrDefault("宸插畬鎴�", 0L))); + } + result.put("data",statusList); + result.put("today",todayCount); + return R.ok(result); + + } + + @GetMapping("/monthMainit") + public R<Map<String,Object>> monthMainit() { + Map<String,Object> result = new HashMap<>(); + List<Map<String, Object>> statusList = new ArrayList<>(); + LocalDate today = LocalDate.now(); + LambdaQueryWrapper<EimsMaintOrder> queryWrapper = new LambdaQueryWrapper<EimsMaintOrder>() + .between(EimsMaintOrder::getPlanTime, + today.with(TemporalAdjusters.firstDayOfMonth()), + today.with(TemporalAdjusters.lastDayOfMonth())); + List<EimsMaintOrderVo> orderList = maintOrderMapper.selectVoList(queryWrapper); + long todayCount = orderList.stream() + .filter(r -> r.getPlanTime() != null && + r.getPlanTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate().isEqual(LocalDate.now())) + .count(); + if (orderList != null && !orderList.isEmpty()) { + + Map<String, Long> statusCountMap = orderList.stream() + .collect(Collectors.groupingBy( + item -> { + switch (item.getStatus()) { + case "0": return "寰呬繚鍏�"; + case "1": return "淇濆吇涓�"; + case "2": return "寰呴獙璇�"; + case "3": return "宸插畬鎴�"; + default: return "鏈煡鐘舵��"; + } + }, + Collectors.counting() + )); + + // 鎸夊浐瀹氶『搴忔帓搴忕敓鎴� List<Map<String, Object>> + + statusList.add(Map.of("name", "寰呬繚鍏�", "value", statusCountMap.getOrDefault("寰呬繚鍏�", 0L))); + statusList.add(Map.of("name", "淇濆吇涓�", "value", statusCountMap.getOrDefault("淇濆吇涓�", 0L))); + statusList.add(Map.of("name", "寰呴獙璇�", "value", statusCountMap.getOrDefault("寰呴獙璇�", 0L))); + statusList.add(Map.of("name", "宸插畬鎴�", "value", statusCountMap.getOrDefault("宸插畬鎴�", 0L))); + } + result.put("data",statusList); + result.put("today",todayCount); + return R.ok(result); + + } + + // 杈呭姪鏂规硶锛氬垱寤轰富鏁版嵁椤� + private Map<String, Object> createDataItem(String name, long value) { + Map<String, Object> item = new HashMap<>(); + item.put("name", name); + item.put("value", value); + return item; + } + + // 杈呭姪鏂规硶锛氬垱寤哄瓙鏁版嵁椤� + private Map<String, Object> createSubItem(String name, long value) { + Map<String, Object> item = new HashMap<>(); + item.put("name", name); + item.put("value", value); + return item; + } + + + /** + * 缁熻鍚勭姸鎬佽澶囨暟閲� + * @param eimsEqus + * @return + */ + public static Map<String, Integer> countStatus(List<EimsEqu> eimsEqus) { + Map<String, Integer> statusCount = new HashMap<>(); + Map<String, String> statusMap = new HashMap<String, String>() {{ + put("0", "璇曠敤"); + put("1", "浣跨敤"); + put("2", "鍋滅敤"); + put("3", "鎶ュ簾"); + put("4", "闂茬疆"); + put("5", "鏂板"); + put("鍏朵粬", "鍏朵粬"); + }}; + + for (EimsEqu equ : eimsEqus) { + String status = equ.getStatus(); + status = (status == null || status.trim().isEmpty()) ? "鍏朵粬" : status; + if(statusMap.containsKey(status)){ + statusCount.put(statusMap.get(status), statusCount.getOrDefault(statusMap.get(status), 0) + 1); + } + + } + + + return statusCount; + } + +} diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/controller/EimsFixtureController.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/controller/EimsFixtureController.java index f7cc822..2066271 100644 --- a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/controller/EimsFixtureController.java +++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/controller/EimsFixtureController.java @@ -1,11 +1,19 @@ package org.dromara.eims.controller; +import java.util.ArrayList; import java.util.List; import lombok.RequiredArgsConstructor; import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.constraints.*; import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.common.excel.core.ExcelResult; +import org.dromara.eims.domain.vo.EimsEquImportVo; +import org.dromara.eims.domain.vo.EimsEquVo; +import org.dromara.eims.domain.vo.EimsFixtureImportVo; +import org.dromara.eims.listener.EimsEquImportListener; +import org.dromara.eims.listener.EimsFixtureImportListener; +import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; import org.springframework.validation.annotation.Validated; import org.dromara.common.idempotent.annotation.RepeatSubmit; @@ -21,6 +29,7 @@ import org.dromara.eims.domain.bo.EimsFixtureBo; import org.dromara.eims.service.IEimsFixtureService; import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.springframework.web.multipart.MultipartFile; /** * 宸ュ叿(娌诲叿)鍙拌处 @@ -102,4 +111,28 @@ @PathVariable Long[] ids) { return toAjax(eimsFixtureService.deleteWithValidByIds(List.of(ids), true)); } + + /** + * 瀵煎叆鏁版嵁 + * + * @param file 瀵煎叆鏂囦欢 + * @param updateSupport 鏄惁鏇存柊宸插瓨鍦ㄦ暟鎹� + */ + @Log(title = "宸ュ叿绠$悊", businessType = BusinessType.IMPORT) + @SaCheckPermission("eims:fixture:import") + @PostMapping(value = "/importData", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + public R<Void> importData(@RequestPart("file") MultipartFile file, boolean updateSupport) throws Exception { + ExcelResult<EimsFixtureImportVo> result = ExcelUtil.importExcel(file.getInputStream(), EimsFixtureImportVo.class, new EimsFixtureImportListener(updateSupport)); + return R.ok(result.getAnalysis()); + } + + /** + * 鑾峰彇瀵煎叆妯℃澘 + */ + @PostMapping("/importTemplate") + public void importTemplate(HttpServletResponse response) { + ExcelUtil.exportExcel(new ArrayList<>(), "璁惧鏁版嵁", EimsFixtureVo.class, response); + } + + } 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 0dac166..6df22ab 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 @@ -1,9 +1,12 @@ package org.dromara.eims.domain; +import org.apache.poi.hpsf.Decimal; import org.dromara.common.mybatis.core.domain.BaseEntity; import com.baomidou.mybatisplus.annotation.*; import lombok.Data; import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; import java.util.Date; import com.fasterxml.jackson.annotation.JsonFormat; @@ -116,5 +119,44 @@ */ private Long curBorrowId; + /** + * 鏁伴噺 + */ + private Integer amount; + + /** + * 鍝佺墝 + */ + private String brand; + + /** + * 鍗曚綅 + */ + private String unit; + + /** + * 浣跨敤閮ㄩ棬 + */ + private Long useDept; + + /** + * 绠$悊浜� + */ + private Long manageUser; + + /** + * 绠℃帶闇�姹� + */ + private String isManage; + + /** + * 鍗曚环 + */ + private BigDecimal unitPrice; + + /** + * 鍔熺巼 + */ + private String power; } diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/EimsInspectSt.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/EimsInspectSt.java index a5acf40..687c39b 100644 --- a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/EimsInspectSt.java +++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/EimsInspectSt.java @@ -33,6 +33,7 @@ * 姹囨�荤被鍨� Day-鏃ユ眹鎬� Month-鏈堟眹鎬� */ private String type; + private String stId; /** * 鏍囬 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 c15b06e..586bd4a 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,6 +1,7 @@ package org.dromara.eims.domain.bo; import com.alibaba.excel.annotation.ExcelProperty; +import org.apache.poi.hpsf.Decimal; import org.dromara.common.excel.annotation.ExcelDictFormat; import org.dromara.common.excel.convert.ExcelDictConvert; import org.dromara.eims.domain.EimsFixture; @@ -11,6 +12,8 @@ import lombok.Data; import lombok.EqualsAndHashCode; import jakarta.validation.constraints.*; + +import java.math.BigDecimal; import java.util.Date; import com.fasterxml.jackson.annotation.JsonFormat; @@ -120,4 +123,45 @@ private Long curBorrowId; + /** + * 鏁伴噺 + */ + private Integer amount; + + /** + * 鍝佺墝 + */ + private String brand; + + /** + * 鍗曚綅 + */ + private String unit; + + /** + * 浣跨敤閮ㄩ棬 + */ + private Long useDept; + + /** + * 绠$悊浜� + */ + private Long manageUser; + + /** + * 绠℃帶闇�姹� + */ + private String isManage; + + /** + * 鍗曚环 + */ + private BigDecimal unitPrice; + + /** + * 鍔熺巼 + */ + private String power; + + } diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsInspectStBo.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsInspectStBo.java index d509485..442ca1c 100644 --- a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsInspectStBo.java +++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsInspectStBo.java @@ -80,6 +80,9 @@ * 澶囨敞 */ private String remark; + private String stId; + + //鍓嶇鐣岄潰鏌ョ湅妯″紡 day-鏃ヨ鍥� month-鏈堣鍥� private String viewMode; diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsFixtureImportVo.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsFixtureImportVo.java new file mode 100644 index 0000000..a33fc81 --- /dev/null +++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsFixtureImportVo.java @@ -0,0 +1,148 @@ +package org.dromara.eims.domain.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.apache.poi.hpsf.Decimal; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 宸ュ叿瀵硅薄瀵煎叆VO + * + * @author zhuguifei + */ +@Data +@NoArgsConstructor +public class EimsFixtureImportVo implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * + */ + private Long id; + + + + /** + * 娌诲叿鍚嶇О + */ + @ExcelProperty(value = "宸ュ叿鍚嶇О") + @ColumnWidth(30) + private String fixtureName; + + /** + * 鍨嬪彿 + */ + @ExcelProperty(value = "鍨嬪彿") + @ColumnWidth(15) + private String modelNo; + + /** + * 鍝佺墝 + */ + @ExcelProperty(value = "鍝佺墝") + @ColumnWidth(20) + private String brand; + + /** + * 鏁伴噺 + */ + @ExcelProperty(value = "鏁伴噺") + @ColumnWidth(10) + private Integer amount; + + + /** + * 鍗曚綅 + */ + @ExcelProperty(value = "鍗曚綅", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "eims_fixture_unit") + @ColumnWidth(10) + private String unit; + + /** + * 璧勪骇缂栧彿 + */ + @ExcelProperty(value = "璧勪骇缂栧彿") + @ColumnWidth(20) + private String assetNo; + + + /** + * 浣跨敤閮ㄩ棬 + */ + @ExcelProperty(value = "浣跨敤閮ㄩ棬") + @ColumnWidth(20) + private String useDeptStr; + private Long useDept; + + /** + * 绠$悊浜� + */ + @ExcelProperty(value = "绠$悊浜�") + @ColumnWidth(12) + private String manageUserStr; + private Long manageUser; + + /** + * 閲囪喘鏃ユ湡 + */ + @ExcelProperty(value = "閲囪喘鏃ユ湡") + @ColumnWidth(24) + @JsonFormat(pattern = "yyyy-MM-dd") + private String purchaseDateStr; + private Date purchaseDate; + + /** + * 浣跨敤鏃ユ湡 + */ + @ExcelProperty(value = "浣跨敤鏃ユ湡") + @ColumnWidth(24) + @JsonFormat(pattern = "yyyy-MM-dd") + private String deployDateStr; + private Date deployDate; + + + /** + * 绠℃帶闇�姹� + */ + @ExcelProperty(value = "绠℃帶闇�姹�", converter = ExcelDictConvert.class) + @ColumnWidth(10) + @ExcelDictFormat(dictType = "eims_fixture_manage") + private String isManage; + + /** + * 鐘舵�侊紙瀛楀吀锛� + */ + @ExcelProperty(value = "鐘舵��", converter = ExcelDictConvert.class) + @ColumnWidth(10) + @ExcelDictFormat(dictType = "eims_fixture_status") + private String status; + + + + + /** + * 鍗曚环 + */ + @ExcelProperty(value = "鍗曚环") + @ColumnWidth(10) + private String unitPriceStr; + private BigDecimal unitPrice; + + /** + * 鍔熺巼 + */ + @ExcelProperty(value = "鍔熺巼") + @ColumnWidth(15) + private String power; + +} 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 be56412..352a83d 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 @@ -1,7 +1,11 @@ package org.dromara.eims.domain.vo; +import java.math.BigDecimal; import java.util.Date; + +import com.alibaba.excel.annotation.write.style.ColumnWidth; import com.fasterxml.jackson.annotation.JsonFormat; +import org.apache.poi.hpsf.Decimal; import org.dromara.common.mybatis.core.domain.BaseEntity; import org.dromara.common.translation.annotation.Translation; import org.dromara.common.translation.constant.TransConstant; @@ -36,20 +40,124 @@ /** * */ - @ExcelProperty(value = "") private Long id; - /** - * 娌诲叿缂栫爜 - */ - @ExcelProperty(value = "娌诲叿缂栫爜") - private String fixtureCode; + /** * 娌诲叿鍚嶇О */ - @ExcelProperty(value = "娌诲叿鍚嶇О") + @ExcelProperty(value = "宸ュ叿鍚嶇О") + @ColumnWidth(30) private String fixtureName; + + /** + * 鍨嬪彿 + */ + @ExcelProperty(value = "鍨嬪彿") + @ColumnWidth(15) + private String modelNo; + + /** + * 鍝佺墝 + */ + @ExcelProperty(value = "鍝佺墝") + @ColumnWidth(20) + private String brand; + + /** + * 鏁伴噺 + */ + @ExcelProperty(value = "鏁伴噺") + @ColumnWidth(10) + private Integer amount; + + + /** + * 鍗曚綅 + */ + @ExcelProperty(value = "鍗曚綅", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "eims_fixture_unit") + @ColumnWidth(10) + private String unit; + + /** + * 璧勪骇缂栧彿 + */ + @ExcelProperty(value = "璧勪骇缂栧彿") + @ColumnWidth(20) + private String assetNo; + + + /** + * 浣跨敤閮ㄩ棬 + */ + @ExcelProperty(value = "浣跨敤閮ㄩ棬") + @ColumnWidth(20) + private Long useDept; + + /** + * 绠$悊浜� + */ + @ExcelProperty(value = "绠$悊浜�") + @ColumnWidth(12) + private Long manageUser; + + /** + * 閲囪喘鏃ユ湡 + */ + @ExcelProperty(value = "閲囪喘鏃ユ湡") + @ColumnWidth(24) + @JsonFormat(pattern = "yyyy-MM-dd") + private Date purchaseDate; + + /** + * 浣跨敤鏃ユ湡 + */ + @ExcelProperty(value = "浣跨敤鏃ユ湡") + @ColumnWidth(24) + @JsonFormat(pattern = "yyyy-MM-dd") + private Date deployDate; + + + /** + * 绠℃帶闇�姹� + */ + @ExcelProperty(value = "绠℃帶闇�姹�", converter = ExcelDictConvert.class) + @ColumnWidth(10) + @ExcelDictFormat(dictType = "eims_fixture_manage") + private String isManage; + + /** + * 鐘舵�侊紙瀛楀吀锛� + */ + @ExcelProperty(value = "鐘舵��", converter = ExcelDictConvert.class) + @ColumnWidth(10) + @ExcelDictFormat(dictType = "eims_fixture_status") + private String status; + + + + + /** + * 鍗曚环 + */ + @ExcelProperty(value = "鍗曚环") + @ColumnWidth(10) + private BigDecimal unitPrice; + + /** + * 鍔熺巼 + */ + @ExcelProperty(value = "鍔熺巼") + @ColumnWidth(15) + private String power; + + + /** + * 娌诲叿缂栫爜 + */ + private String fixtureCode; /** @@ -60,14 +168,12 @@ /** * 娌诲叿锛堝伐鍏凤級绫诲瀷 */ - @ExcelProperty(value = "娌诲叿绫诲瀷") @Translation(type = TransConstant.FIXTURE_TYPE_ID_TO_NAME, mapper = "fixtureType") private String fixtureTypeName; /** * 娌诲叿鎻忚堪 */ - @ExcelProperty(value = "娌诲叿鎻忚堪") private String fixtureDesc; /** @@ -88,8 +194,8 @@ /** * 鍊熺敤鐘舵�� */ - @ExcelProperty(value = "鍊熺敤鐘舵��", converter = ExcelDictConvert.class) - @ExcelDictFormat(dictType = "fixture_borrow_status") +// @ExcelProperty(value = "鍊熺敤鐘舵��", converter = ExcelDictConvert.class) +// @ExcelDictFormat(dictType = "fixture_borrow_status") private String borrowStatus; /** @@ -98,55 +204,24 @@ @Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "borrowUser") private String borrowUserName; - /** - * 鐘舵�侊紙瀛楀吀锛� - */ - @ExcelProperty(value = "鐘舵��", converter = ExcelDictConvert.class) - @ExcelDictFormat(dictType = "eims_fixture_status") - private String status; - /** - * 璧勪骇缂栧彿 - */ - @ExcelProperty(value = "璧勪骇缂栧彿") - private String assetNo; - /** - * 鍨嬪彿 - */ - @ExcelProperty(value = "鍨嬪彿") - private String modelNo; /** * 瑙勬牸 */ - @ExcelProperty(value = "瑙勬牸") private String specNo; /** * 鍒堕�犲晢 */ - @ExcelProperty(value = "鍒堕�犲晢") private String madeIn; - /** - * 閲囪喘鏃ユ湡 - */ - @ExcelProperty(value = "閲囪喘鏃ユ湡") - @JsonFormat(pattern = "yyyy-MM-dd") - private Date purchaseDate; - /** - * 浣跨敤鏃ユ湡 - */ - @ExcelProperty(value = "浣跨敤鏃ユ湡") - @JsonFormat(pattern = "yyyy-MM-dd") - private Date deployDate; /** * 浣跨敤骞撮檺 */ - @ExcelProperty(value = "浣跨敤骞撮檺") private Long serviceLife; /** @@ -161,4 +236,7 @@ private Long curBorrowId; + + + } diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsInspectStVo.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsInspectStVo.java index f9c89c9..29416e5 100644 --- a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsInspectStVo.java +++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsInspectStVo.java @@ -125,6 +125,8 @@ */ private Integer abNormalNum; + private String stId; + diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/listener/EimsFixtureImportListener.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/listener/EimsFixtureImportListener.java new file mode 100644 index 0000000..33683b5 --- /dev/null +++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/listener/EimsFixtureImportListener.java @@ -0,0 +1,265 @@ +package org.dromara.eims.listener; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; +import com.alibaba.excel.exception.ExcelDataConvertException; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.extern.slf4j.Slf4j; +import org.apache.poi.hpsf.Decimal; +import org.dromara.common.core.constant.DictConstants; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.service.DictService; +import org.dromara.common.core.utils.DateUtils; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.excel.core.ExcelListener; +import org.dromara.common.excel.core.ExcelResult; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.eims.domain.EimsFixture; +import org.dromara.eims.domain.bo.EimsEquBo; +import org.dromara.eims.domain.vo.EimsEquImportVo; +import org.dromara.eims.domain.vo.EimsEquVo; +import org.dromara.eims.domain.vo.EimsFixtureImportVo; +import org.dromara.eims.domain.vo.EimsFixtureVo; +import org.dromara.eims.mapper.EimsFixtureMapper; +import org.dromara.eims.service.IEimsEquService; +import org.dromara.eims.service.IEimsFixtureService; +import org.dromara.system.domain.SysDept; +import org.dromara.system.domain.SysUser; +import org.dromara.system.domain.vo.SysDeptVo; +import org.dromara.system.domain.vo.SysUserVo; +import org.dromara.system.mapper.SysDeptMapper; +import org.dromara.system.mapper.SysUserMapper; +import org.dromara.system.service.ISysUserService; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * 宸ュ叿鑷畾涔夊鍏� + * + * @author zhuguifei + */ +@Slf4j +public class EimsFixtureImportListener extends AnalysisEventListener<EimsFixtureImportVo> implements ExcelListener<EimsFixtureImportVo> { + + private final EimsFixtureMapper fixtureMapper; + private final SysUserMapper sysUserMapper; + private final SysDeptMapper sysDeptMapper; + + private final DictService dictService; + // 褰撳墠瀵煎叆鐢ㄦ埛 + private final Long operUserId; + + private final Boolean isUpdateSupport; + + //unit瀛楀吀 + private final Map<String, String> unitDictMap; + + + private int successNum = 0; + private int coverNum = 0; + private int failureNum = 0; + private final StringBuilder successMsg = new StringBuilder(); + private final StringBuilder failureMsg = new StringBuilder(); + + public EimsFixtureImportListener(Boolean isUpdateSupport) { + this.fixtureMapper = SpringUtils.getBean(EimsFixtureMapper.class); + this.sysUserMapper = SpringUtils.getBean(SysUserMapper.class); + this.sysDeptMapper = SpringUtils.getBean(SysDeptMapper.class); + this.dictService = SpringUtils.getBean(DictService.class); + this.isUpdateSupport = isUpdateSupport; + this.operUserId = LoginHelper.getUserId(); + this.unitDictMap = dictService.getAllDictByDictType(DictConstants.EIMS_FIXTURE_UNIT); + } + + @Override + public void invoke(EimsFixtureImportVo fixtureVo, AnalysisContext context) { + try { + fixtureVo.setStatus("0"); + // 鏍规嵁璧勪骇缂栧彿鏌ヨ宸ュ叿鏄惁宸插瓨鍦� + LambdaQueryWrapper<EimsFixture> queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(EimsFixture::getAssetNo,fixtureVo.getAssetNo()); + EimsFixtureVo eimsFixtureVo = fixtureMapper.selectVoOne(queryWrapper); + // 澶勭悊涓嶈鍒欐暟鎹� + //1.鍗曚綅unit-excel瀵煎叆鏁版嵁涓崟浣嶅瓧娈典笉瑙勫垯锛岀壒娈婂鐞� + // normalizeUnit(fixtureVo, unitDictMap); + //2.璐拱鏃ユ湡銆侀獙鏀舵棩鏈� 鐗规畩澶勭悊 + if (StringUtils.isNotEmpty(fixtureVo.getPurchaseDateStr())) { + try { + fixtureVo.setPurchaseDate(DateUtils.parseDate(fixtureVo.getPurchaseDateStr())); + } catch (Exception e) { + e.printStackTrace(); + } + } + if (StringUtils.isNotEmpty(fixtureVo.getDeployDateStr())) { + try { + fixtureVo.setDeployDate(DateUtils.parseDate(fixtureVo.getDeployDateStr())); + } catch (Exception e) { + e.printStackTrace(); + } + } + // 绠$悊浜哄鐞� + if (StringUtils.isNotEmpty(fixtureVo.getManageUserStr())) { + try { + LambdaQueryWrapper<SysUser> usrQueryWrapper = new LambdaQueryWrapper<>(); + usrQueryWrapper.eq(SysUser::getNickName,fixtureVo.getManageUserStr()); + SysUserVo sysUserVo = sysUserMapper.selectVoOne(usrQueryWrapper); + if(sysUserVo!=null){ + fixtureVo.setManageUser(sysUserVo.getUserId()); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + // 閮ㄩ棬澶勭悊 + if (StringUtils.isNotEmpty(fixtureVo.getUseDeptStr())) { + try { + LambdaQueryWrapper<SysDept> dptQueryWrapper = new LambdaQueryWrapper<>(); + dptQueryWrapper.eq(SysDept::getDeptName,fixtureVo.getUseDeptStr()); + SysDeptVo deptVo = sysDeptMapper.selectVoOne(dptQueryWrapper); + if(deptVo!=null){ + fixtureVo.setUseDept(deptVo.getDeptId()); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + + if (StringUtils.isNotEmpty(fixtureVo.getUnitPriceStr())) { + try { + String priceStr = extractNumber(fixtureVo.getUnitPriceStr()); + int price = 0; + if (priceStr != null) { + price = Integer.parseInt(priceStr); + } + if(price>0){ + fixtureVo.setUnitPrice(new BigDecimal(price)); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + + + // 楠岃瘉鏄惁瀛樺湪 + if (ObjectUtil.isNull(eimsFixtureVo)) { + EimsFixture fixture = BeanUtil.toBean(fixtureVo, EimsFixture.class); + // TODO 鏍¢獙 + //ValidatorUtils.validate(equ); + + //娣诲姞瀛楁榛樿灞炴�� + fixture.setCreateBy(operUserId); + fixtureMapper.insert(fixture); + successNum++; + successMsg.append("<br/>").append(successNum).append("銆佸伐鍏� ").append(fixture.getFixtureName()).append(" 瀵煎叆鎴愬姛"); + } else if (isUpdateSupport) { + EimsFixture fixture = BeanUtil.toBean(fixtureVo, EimsFixture.class); + fixture.setId(eimsFixtureVo.getId()); + fixture.setUpdateBy(operUserId); + fixture.setUpdateTime(new Date()); + fixtureMapper.updateById(fixture); + coverNum++; + successMsg.append("<br/>").append(successNum).append("銆佸伐鍏� ").append(fixture.getFixtureName()).append(" 鏇存柊鎴愬姛"); + } else { + failureNum++; + failureMsg.append("<br/>").append(failureNum).append("銆佸伐鍏� ").append(eimsFixtureVo.getFixtureName()).append(eimsFixtureVo.getAssetNo()).append(" 宸插瓨鍦�"); + } + } catch (Exception e) { + failureNum++; + String msg = "<br/>" + failureNum + "銆佸伐鍏� " + fixtureVo.getFixtureName() + " 瀵煎叆澶辫触锛�"; + failureMsg.append(msg).append(e.getMessage()); + log.error(msg, e); + } + } + + @Override + public void doAfterAllAnalysed(AnalysisContext context) { + + } + + @Override + public ExcelResult<EimsFixtureImportVo> getExcelResult() { + return new ExcelResult<>() { + + @Override + public String getAnalysis() { + if (failureNum > 0) { + failureMsg.insert(0, "寰堟姳姝夛紝瀵煎叆澶辫触锛佸叡 " + failureNum + " 鏉℃暟鎹牸寮忎笉姝g‘锛岄敊璇涓嬶細"); + throw new ServiceException(failureMsg.toString()); + } else { + successMsg.insert(0, "鎭枩鎮紝鏁版嵁宸插叏閮ㄥ鍏ユ垚鍔燂紒鍏� " + (successNum + coverNum )+ " 鏉★紝鏁版嵁濡備笅锛�"); + } + return successMsg.toString(); + } + + @Override + public List<EimsFixtureImportVo> getList() { + return null; + } + + @Override + public List<String> getErrorList() { + return null; + } + }; + } + + @Override + public void onException(Exception exception, AnalysisContext context) throws Exception { + log.error("瑙f瀽澶辫触锛屼絾鏄户缁В鏋愪笅涓�琛�:{}", exception.getMessage()); + // 濡傛灉鏄煇涓�涓崟鍏冩牸鐨勮浆鎹㈠紓甯� 鑳借幏鍙栧埌鍏蜂綋琛屽彿 + // 濡傛灉瑕佽幏鍙栧ご鐨勪俊鎭� 閰嶅悎invokeHeadMap浣跨敤 + if (exception instanceof ExcelDataConvertException) { + ExcelDataConvertException excelDataConvertException = (ExcelDataConvertException) exception; + log.error("绗瑊}琛岋紝绗瑊}鍒楄В鏋愬紓甯革紝鏁版嵁涓�:{}", excelDataConvertException.getRowIndex(), + excelDataConvertException.getColumnIndex(), excelDataConvertException.getCellData()); + } + } + + /** + * 鎻愬彇鏁板瓧 + * @param input + * @return + */ + private static String extractNumber(String input) { + Pattern NUMBER_PATTERN = Pattern.compile("(\\d+(\\.\\d+)?)"); + Matcher matcher = NUMBER_PATTERN.matcher(input); + if (matcher.find()) { + return matcher.group(1); // 杩斿洖绗竴涓崟鑾风粍锛屽嵆鏁板瓧閮ㄥ垎 + } + return null; + } + + + /** + * 涓哄鍏ヨ澶囧尮閰嶅崟浣� + * + * @param fixtureVo + * @param unitDictMap + */ + private void normalizeUnit(EimsFixtureImportVo fixtureVo, Map<String, String> unitDictMap) { + if (fixtureVo == null || StringUtils.isEmpty(fixtureVo.getUnit()) || unitDictMap == null || unitDictMap.isEmpty()) { + return; + } + String originalUnit = fixtureVo.getUnit(); + //閬垮厤閿欒鍗曚綅 + fixtureVo.setUnit(null); + for (Map.Entry<String, String> entry : unitDictMap.entrySet()) { + if (originalUnit.contains(entry.getValue())) { + fixtureVo.setUnit(entry.getValue()); + break; + } + } + } + +} -- Gitblit v1.9.3