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