From f571cf0182abd65176fb1512c5cb5ddaea49c4a3 Mon Sep 17 00:00:00 2001
From: baoshiwei <baoshiwei@shlanbao.cn>
Date: 星期二, 24 六月 2025 09:00:14 +0800
Subject: [PATCH] feat(eims): 设备状态变更记录功能

---
 eims-ui-mobile/src/pages/home/index.vue |  466 +++++++++++++++++++++++++++++++++++++++++++--------------
 1 files changed, 348 insertions(+), 118 deletions(-)

diff --git a/eims-ui-mobile/src/pages/home/index.vue b/eims-ui-mobile/src/pages/home/index.vue
index bd131e7..c4e42ed 100644
--- a/eims-ui-mobile/src/pages/home/index.vue
+++ b/eims-ui-mobile/src/pages/home/index.vue
@@ -8,144 +8,265 @@
 }
 </route>
 <template>
-  <view
-    class="bg-base overflow-hidden"
-    :style="{
-      marginTop: safeAreaInsets?.top + 'px',
-    }"
+  <z-paging
+    ref="paging"
+    v-model="dataList"
+    @query="queryList"
+    show-refresher-update-time
+    hide-empty-view
   >
-    <view class="bg-white h-[80rpx] px-2 flex items-center justify-between">
-      <view class="flex items-center" @click="handleUserInfo">
-        <wd-icon name="user" size="40rpx" class="icon-color-base"></wd-icon>
-        <text class="ml-1 text-color-base">寮犱笁</text>
-      </view>
-
-      <view class="flex items-center">
-        <wd-icon name="notification" size="40rpx" class="icon-color-base mr-3"></wd-icon>
-        <wd-icon name="tips" size="40rpx" class="icon-color-base mr-3"></wd-icon>
-        <wd-icon name="app" size="40rpx" class="icon-color-base"></wd-icon>
-      </view>
-    </view>
-
-    <view class="bg-white py-2 px-2">
-      <wd-img class="w-full h-[260rpx]" src="/static/images/pic4.jpeg" />
-    </view>
-    <view class="bg-noti flex flex-row">
-      <wd-notice-bar
-        text="杩欐槸涓�鏉℃秷鎭彁绀轰俊鎭紝杩欐槸涓�鏉℃秷鎭彁绀轰俊鎭紝杩欐槸涓�鏉℃秷鎭彁绀轰俊鎭�"
-        prefix="clock"
-        type="info"
-        :scrollable="false"
-        custom-class="flex-1  overflow-hidden"
-      />
-      <wd-button type="text" class="w-[120rpx]">鏌ョ湅</wd-button>
-    </view>
-
-    <view class="bg-white">
-      <wd-card type="rectangle">
-        <template #title>
-          <view class="flex items-center menu-title-box">
-            <view class="menu-indicator"></view>
-            <view class="ml-1 text-xs">鏁版嵁鎬昏</view>
-          </view>
-        </template>
-        <view class="flex flex-row justify-around">
-          <view class="flex flex-col justify-center">
-            <text class="text-lg text-center">0</text>
-            <text class="text-color-gray">璁惧鎬绘暟</text>
-          </view>
-          <view class="flex flex-col justify-center">
-            <text class="text-lg text-center">0</text>
-            <text class="text-color-gray">鏁呴殰璁惧鏁�</text>
-          </view>
-          <view class="flex flex-col justify-center">
-            <text class="text-lg text-center">0</text>
-            <text class="text-color-gray">鏈慨澶嶆晠闅�</text>
-          </view>
+    <template #top>
+      <view class="bg-white h-[80rpx] px-2 flex items-center justify-between">
+        <view class="flex items-center" @click="handleUserInfo">
+          <wd-icon name="user" size="40rpx" class="icon-color-base"></wd-icon>
+          <text class="ml-1 text-color-base">{{ realName }}</text>
         </view>
-      </wd-card>
-    </view>
 
-    <view class="bg-white mt-2">
-      <wd-card type="rectangle">
-        <template #title>
-          <view class="flex items-center menu-title-box">
-            <view class="menu-indicator"></view>
-            <view class="ml-1 text-xs">璁惧绠$悊</view>
-          </view>
-        </template>
-        <wd-grid :column="4">
-          <wd-grid-item
-            use-slot
-            class="flex justify-center items-center"
-            v-for="(item, index) in equMenu"
-            @click.stop="goItemPage(item.path)"
-          >
-            <image class="slot-img text-center" :src="item.icon" />
-            <text>{{ item.name }}</text>
-          </wd-grid-item>
-        </wd-grid>
-      </wd-card>
-    </view>
+        <view class="flex items-center">
+          <wd-icon
+            name="notification"
+            size="40rpx"
+            class="icon-color-base mr-3"
+            @click="handleInfo"
+          ></wd-icon>
+          <wd-icon
+            name="tips"
+            size="40rpx"
+            class="icon-color-base mr-3"
+            @click="handleInfo"
+          ></wd-icon>
+          <wd-icon name="app" size="40rpx" class="icon-color-base" @click="handleInfo"></wd-icon>
+        </view>
+      </view>
 
-    <view class="bg-white mt-2">
-      <wd-card type="rectangle">
-        <template #title>
-          <view class="flex items-center menu-title-box">
-            <view class="menu-indicator"></view>
-            <view class="ml-1 text-xs">璁惧鐐规</view>
+    </template>
+    <view class="bg-base overflow-hidden">
+
+      <view class="bg-white py-2 px-2">
+        <wd-img class="w-full h-[260rpx]" src="/static/images/pic4.jpeg" />
+      </view>
+      <view class="bg-noti flex flex-row">
+        <wd-notice-bar
+          text="杩欐槸涓�鏉℃秷鎭彁绀轰俊鎭紝杩欐槸涓�鏉℃秷鎭彁绀轰俊鎭紝杩欐槸涓�鏉℃秷鎭彁绀轰俊鎭�"
+          prefix="clock"
+          type="info"
+          :scrollable="false"
+          custom-class="flex-1  overflow-hidden"
+        />
+        <wd-button type="text" class="w-[120rpx]">鏌ョ湅</wd-button>
+      </view>
+
+      <view class="bg-white">
+        <wd-card type="rectangle">
+          <template #title>
+            <view class="flex items-center menu-title-box">
+              <view class="menu-indicator"></view>
+              <view class="ml-1 text-sm">鏁版嵁鎬昏</view>
+            </view>
+          </template>
+          <view class="flex flex-row justify-around">
+            <view class="flex flex-col justify-center">
+              <text class="text-lg text-center">{{ equTotal }}</text>
+              <text class="text-color-gray">璁惧鎬绘暟</text>
+            </view>
+            <view class="flex flex-col justify-center">
+              <text class="text-lg text-center">{{ fixtureTotal }}</text>
+              <text class="text-color-gray">宸ュ叿鎬绘暟</text>
+            </view>
+            <view class="flex flex-col justify-center">
+              <text class="text-lg text-center">{{ faultTotal }}</text>
+              <text class="text-color-gray">鏈慨澶嶆晠闅�</text>
+            </view>
           </view>
-        </template>
-        <wd-grid :column="4">
-          <wd-grid-item
-            use-slot
-            class="flex justify-center items-center"
-            v-for="(item, index) in inspectMenu"
-            :key="item.id"
-            @click.stop="goItemPage(item.path)"
-          >
-            <image class="slot-img text-center" :src="item.icon" />
-            <text>{{ item.name }}</text>
-          </wd-grid-item>
-        </wd-grid>
-      </wd-card>
+        </wd-card>
+      </view>
+<!--      <view class="bg-white mt-2">-->
+<!--        <wd-card type="rectangle">-->
+<!--          <template #title>-->
+<!--            <view class="flex items-center menu-title-box">-->
+<!--              <view class="menu-indicator"></view>-->
+<!--              <view class="ml-1 text-sm">蹇嵎鎿嶄綔</view>-->
+<!--            </view>-->
+<!--          </template>-->
+<!--          <wd-grid :column="4">-->
+<!--            <wd-grid-item-->
+<!--              use-slot-->
+<!--              class="flex justify-center items-center"-->
+<!--              v-for="(item, index) in commonMenu"-->
+<!--              :key="item.id"-->
+<!--              @click.stop="goItemPage(item)"-->
+<!--              v-show="!(isLeader() && item.custom)"-->
+<!--            >-->
+<!--              <image class="slot-img text-center" :src="item.icon" />-->
+<!--              <text>{{ item.name }}</text>-->
+<!--            </wd-grid-item>-->
+<!--          </wd-grid>-->
+<!--        </wd-card>-->
+<!--      </view>-->
+      <view class="bg-white mt-2">
+        <wd-card type="rectangle">
+          <template #title>
+            <view class="flex items-center menu-title-box">
+              <view class="menu-indicator"></view>
+              <view class="ml-1 text-sm">鐐规淇濆吇</view>
+            </view>
+          </template>
+          <wd-grid :column="4">
+            <wd-grid-item
+              use-slot
+              class="flex justify-center items-center"
+              v-for="(item, index) in inspectMenu"
+              :key="item.id"
+              @click.stop="goItemPage(item)"
+            >
+              <image class="slot-img text-center" :src="item.icon" />
+              <text>{{ item.name }}</text>
+            </wd-grid-item>
+          </wd-grid>
+        </wd-card>
+      </view>
+      <view class="bg-white mt-2">
+        <wd-card type="rectangle">
+          <template #title>
+            <view class="flex items-center menu-title-box">
+              <view class="menu-indicator"></view>
+              <view class="ml-1 text-sm">璁惧鍙板笎</view>
+            </view>
+          </template>
+          <wd-grid :column="4">
+            <wd-grid-item
+              use-slot
+              class="flex justify-center items-center"
+              v-for="(item, index) in equMenu"
+              @click.stop="goItemPage(item)"
+            >
+              <image class="slot-img text-center" :src="item.icon" />
+              <text>{{ item.name }}</text>
+            </wd-grid-item>
+          </wd-grid>
+        </wd-card>
+      </view>
+
+      <view class="w-full h-[100rpx]"></view>
     </view>
-  </view>
+  </z-paging>
 </template>
 
 <script lang="ts" setup>
 import { getAllMenusApi } from '@/service/menu'
+import { useUserStore } from '@/store'
+import { tabbarStore } from '@/components/fg-tabbar/tabbar'
+import { getEquList } from '@/service/equ'
+import { getRepairResList, getRepairResUnfinished } from "@/service/repair";
+import { getFixtureList } from '@/service/fixture'
+import { receiveOrderRepair } from '@/service/mobile'
+import { useToast, useMessage } from 'wot-design-uni'
+import { ref } from 'vue'
+import {isLeader} from "@/utils/RoleUtils";
 
+const message = useMessage()
+const toast = useToast()
 defineOptions({
   name: 'Home',
 })
+
+const userStore = useUserStore()
+
+const equTotal = ref(0)
+const faultTotal = ref(0)
+const fixtureTotal = ref(0)
+
+const paging = ref(null)
+const dataList = ref([])
 
 // 鑾峰彇灞忓箷杈圭晫鍒板畨鍏ㄥ尯鍩熻窛绂�
 const { safeAreaInsets } = uni.getSystemInfoSync()
 
 const getAllMenus = async () => {
   const menuList = await getAllMenusApi()
-  console.error(menuList)
+}
+function handleInfo() {
+  uni.showToast({
+    title: '鍔熻兘寮�鍙戜腑',
+    icon: 'none',
+  })
 }
 
-const goItemPage = (path: string) => {
-  const url = `/${path}`
-  uni.navigateTo({
-    url,
-  })
+const queryList = (pageNum?: number, pageSize?: number) => {
+  getEquList({ pageNum, pageSize })
+    .then((res: any) => {
+      equTotal.value = res?.total || 0
+      // queryRepairResList()
+      queryUnFinishedRepairResList()
+      queryFixtureList()
+      paging.value.complete(true)
+    })
+    .catch((res) => {
+      paging.value.complete(true)
+    })
+}
+
+const goItemPage = (item: any) => {
+  if (!item?.custom) {
+    const url = `/${item.path}`
+    uni.navigateTo({
+      url,
+    })
+  } else {
+    switch (item.name) {
+      case '鎺ュ崟缁翠慨':
+        if (isLeader()) {
+          toast.info('璇风櫥褰曠淮淇伐璐﹀彿鎺ュ崟')
+        } else {
+          handleSelectReq()
+        }
+        break
+    }
+  }
 }
 
 onLoad(() => {
   // getAllMenus()
+  queryEquList()
+  queryUnFinishedRepairResList()
+  queryFixtureList()
 })
+
+const commonMenu = reactive([
+  {
+    id: 1,
+    name: '鏁呴殰鎶ヤ慨',
+    icon: '/static/ico/ico7.png',
+    path: 'pages/repair/repair-add',
+  },
+  {
+    id: 2,
+    custom: true,
+    name: '鎺ュ崟缁翠慨',
+    icon: '/static/ico/ico8.png',
+    path: 'pages/repair/repair-add',
+  },
+])
 
 const equMenu = reactive([
   {
     id: 1,
-    name: '璁惧绠$悊',
-    icon: '/static/menu/menu1.png',
+    name: '璁惧鍒楄〃',
+    icon: '/static/ico/ico15.png',
     path: 'pages/equ/equ-list',
-  }
+  },
+  {
+    id: 2,
+    name: '鐘舵�佸彉鏇磋褰�',
+    icon: '/static/ico/ico15.png',
+    path: 'pages/equ-status/list',
+  },
+  // {
+  //   id: 2,
+  //   name: '宸ュ叿鍒楄〃',
+  //   icon: '/static/ico/ico16.png',
+  //   path: 'pages/fixture/fixture-list',
+  // },
 ])
 
 const inspectMenu = reactive([
@@ -157,32 +278,138 @@
   }, */
   {
     id: 1,
-    name: '鐐规姒傝',
-    icon: '/static/menu/menu1.png',
+    name: '鐐规姹囨��',
+    icon: '/static/ico/ico17.png',
     path: 'pages/inspect/insp-st',
   },
   {
     id: 2,
-    name: '鐐规姹囨��',
-    icon: '/static/menu/menu2.png',
-    path: 'pages/inspect/insp-st',
+    name: '淇濆吇姹囨��',
+    icon: '/static/ico/ico11.png',
+    path: 'pages/maint/maint-st',
   },
   {
     id: 3,
-    name: '鐐规璁板綍',
-    icon: '/static/menu/menu3.png',
-    path: 'pages/inspect/insp-record',
+    name: '鎶ヤ慨鍒楄〃',
+    icon: '/static/ico/ico18.png',
+    path: 'pages/repair/req-list',
   },
   {
     id: 4,
-    name: '鐐规璁″垝',
-    icon: '/static/menu/menu4.png',
-    path: 'pages/inspect/insp-add',
+    name: '缁翠慨鍒楄〃',
+    icon: '/static/ico/ico19.png',
+    path: 'pages/repair/res-list',
   },
 ])
 
 function handleUserInfo() {
-  getAllMenus()
+  goToMy()
+}
+
+function goToMy() {
+  tabbarStore.setCurIdx(4)
+  uni.switchTab({
+    url: '/pages/my/index',
+  })
+}
+
+const realName = computed(() => userStore?.userInfo?.realName)
+
+/**
+ * 閫夋嫨鎶ヤ慨鍗�
+ */
+function handleSelectReq() {
+  uni.navigateTo({
+    url: '/pages/repair/req-list',
+    events: {
+      // 涓烘寚瀹氫簨浠舵坊鍔犱竴涓洃鍚櫒锛岃幏鍙栬鎵撳紑椤甸潰浼犻�佸埌褰撳墠椤甸潰鐨勬暟鎹�
+      selectReq: function (data) {
+        // 閫夋嫨鎶ヤ慨鍗曞悗锛屼慨鏀规姤淇崟鐘舵�佸拰鏂板缁翠慨宸ュ崟
+        const resCode = `WXD${data.data.code.slice(3)}`
+        const deptId = userStore?.userInfo?.deptId
+        const userId = userStore?.userInfo?.userId
+        const resData = {
+          reqId: data.data.id,
+          reqCode: data.data.code,
+          reqUser: data.data.reqUser,
+          reqDept: data.data.reqDept,
+          resCode,
+          status: '1',
+          resUser: userId,
+          resDept: deptId,
+        }
+        receiveOrderRepair(resData)
+          .then((res: any) => {
+            if (res?.id) {
+              toast.success(res?.msg || '鎿嶄綔鎴愬姛')
+              uni.navigateTo({
+                url: `/pages/repair/res-detail?id=${res?.id}`,
+              })
+            } else {
+              toast.error(res?.msg || '鐢熸垚缁翠慨宸ュ崟澶辫触锛岃閲嶈瘯')
+            }
+          })
+          .catch((res) => {
+            toast.error(res?.msg || '鐢熸垚缁翠慨宸ュ崟澶辫触锛岃閲嶈瘯')
+          })
+      },
+    },
+    success: function (res) {
+      // 閫氳繃eventChannel鍚戣鎵撳紑椤甸潰浼犻�佹暟鎹�
+      res.eventChannel.emit('OnSelectReq', { data: '缁翠慨鍗曢〉闈㈤�夋嫨鎶ヤ慨鍗�' })
+    },
+  })
+}
+
+function queryEquList() {
+  getEquList({
+    page: 1,
+    size: 10,
+  })
+    .then((res: any) => {
+      equTotal.value = res?.total || 0
+    })
+    .catch((err) => {
+      console.log(err)
+    })
+}
+
+function queryRepairResList() {
+  getRepairResList({
+    page: 1,
+    size: 10,
+    status: '2',
+  })
+    .then((res: any) => {
+      faultTotal.value = res?.total || 0
+    })
+    .catch((res) => {})
+}
+
+function queryUnFinishedRepairResList() {
+  getRepairResUnfinished('0,1,2')
+    .then((res: any) => {
+      console.log("res", res)
+      faultTotal.value = res || 0
+    })
+    .catch((res) => {})
+}
+
+function queryFixtureList() {
+  getFixtureList({
+    page: 1,
+    size: 10,
+  })
+    .then((res: any) => {
+      fixtureTotal.value = res?.total || 0
+    })
+    .catch((res) => {})
+}
+
+function goToDetail(item) {
+  uni.navigateTo({
+    url: `/pages/repair/res-detail?id=${item.id}`,
+  })
 }
 </script>
 
@@ -223,4 +450,7 @@
   height: 72rpx;
   margin-left: 4rpx;
 }
+:deep(.wd-grid-item__content) {
+  align-items: center;
+}
 </style>

--
Gitblit v1.9.3