From bab490d2da009c1a23b352b3b964e0c2dd06a0b3 Mon Sep 17 00:00:00 2001
From: baoshiwei <baoshiwei@shlanbao.cn>
Date: 星期四, 12 六月 2025 17:32:42 +0800
Subject: [PATCH] 移动端功能优化

---
 eims-ui-mobile/src/pages/repair/req-detail.vue                                                        |  252 +++++++
 eims-ui-mobile/src/pages/inspect/insp-st.vue                                                          |   13 
 eims-ui-mobile/src/pages/maint/maint-order.vue                                                        |   10 
 eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsInspectPlanBo.java            |    6 
 eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsRepairResServiceImpl.java  |   47 +
 eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/EimsRepairRes.java                   |    2 
 eims-ui-mobile/src/utils/RoleUtils.ts                                                                 |   43 +
 eims-ui-mobile/src/components/repair/req-card.vue                                                     |  189 +++++
 eims-ui-mobile/src/pages/inspect/insp-record.vue                                                      |   34 
 eims-ui-mobile/src/types/uni-pages.d.ts                                                               |    1 
 eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsRepairFbServiceImpl.java   |    2 
 eims-ui-mobile/src/pages/repair/repair-fb.vue                                                         |   52 
 eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsInspectStServiceImpl.java  |    1 
 eims-ui-mobile/src/pages/repair/res-detail.vue                                                        |  153 ++++
 eims-ui-mobile/src/pages/repair/res-list.vue                                                          |  509 +++++---------
 eims/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/DictConstants.java |    5 
 eims-ui-mobile/src/pages/repair/repair-add.vue                                                        |   51 +
 eims-ui-mobile/src/components/repair/res-card.vue                                                     |  236 ++++++
 eims-ui-mobile/src/pages/maint/order-detail.vue                                                       |    8 
 eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsRepairReqBo.java              |    2 
 eims-ui-mobile/src/pages/scan/index.vue                                                               |  116 +++
 eims-ui-mobile/src/pages.json                                                                         |   10 
 eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsRepairResBo.java              |    8 
 eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsRepairResVo.java              |    3 
 eims-ui-mobile/src/pages/repair/req-list.vue                                                          |  270 ++++---
 eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsRepairReqServiceImpl.java  |    8 
 26 files changed, 1,487 insertions(+), 544 deletions(-)

diff --git a/eims-ui-mobile/src/components/repair/req-card.vue b/eims-ui-mobile/src/components/repair/req-card.vue
new file mode 100644
index 0000000..3e937c3
--- /dev/null
+++ b/eims-ui-mobile/src/components/repair/req-card.vue
@@ -0,0 +1,189 @@
+<template>
+  <wd-card type="rectangle" :key="item.id">
+    <template #title>
+      <view class="flex justify-between items-center">
+        <view class="flex items-center menu-title-box">
+          <view class="menu-indicator"></view>
+          <text class="ml-1 text-sm">{{ item.code }}</text>
+        </view>
+
+        <view>
+          <wd-button size="small" v-if="item.status === '0'" type="info">寰呮帴鍗�</wd-button>
+          <wd-button size="small" v-else-if="item.status === '1'" type="warning">宸叉帴鍗�</wd-button>
+          <wd-button size="small" v-else-if="item.status === '2'" type="primary">缁翠慨涓�</wd-button>
+          <wd-button size="small" v-else-if="item.status === '3'" type="success">宸插畬鎴�</wd-button>
+        </view>
+      </view>
+    </template>
+    <wd-swipe-action>
+      <view class="flex items-center" @click.stop="itemClick(item)">
+        <image
+          v-if="item.reqType === '1'"
+          class="slot-img text-center"
+          src="/static/ico/ico-huiyi.png"
+        />
+        <image
+          v-else-if="item.reqType === '2'"
+          class="slot-img text-center"
+          src="/static/ico/ico-setting.png"
+        />
+        <image
+          v-else-if="item.reqType === '3'"
+          class="slot-img text-center"
+          src="/static/ico/ico-faxian.png"
+        />
+        <view class="flex-1 mt-1">
+          <view class="text-color-base">
+            <template v-if="item.reqType === '1'">
+              <text>璁惧绫诲瀷</text>
+              <text class="mx-2">|</text>
+              <text>{{ item.equName }}</text>
+            </template>
+
+            <template v-if="item.reqType === '2'">
+              <text>宸ュ叿绫诲瀷</text>
+              <text class="mx-2">|</text>
+              <text>{{ item.fixtureName }}</text>
+            </template>
+
+            <template v-if="item.reqType === '3'">
+              <text>鍏朵粬绫诲瀷</text>
+            </template>
+            <view class="text-color-gray mt-1 text-mini">
+              <text>鍙戠敓鏃堕棿: {{ item.occTime }}</text>
+            </view>
+
+            <view class="text-color-gray mt-1 text-mini">
+              <text>鎶ヤ慨浜�: {{ item.reqUserName }}</text>
+            </view>
+            <view class="text-color-gray mt-1 text-mini">
+              <text>鎻忚堪: {{ item.reqDesc }}</text>
+            </view>
+            <view class="text-color-gray mt-1 text-mini">
+              <text>绱ф�ョ▼搴�: </text>
+              <wd-tag type="danger" v-if="item.urgencyLevel === '1'">绱ф��</wd-tag>
+              <wd-tag type="warning" v-else-if="item.urgencyLevel === '2'">涓�鑸�</wd-tag>
+              <wd-tag type="success" v-else-if="item.urgencyLevel === '3'">鏅��</wd-tag>
+            </view>
+          </view>
+          <view class="text-color-gray text-sm mt-1">
+            {{ item.location }} {{ item.madeIn }}
+          </view>
+
+        </view>
+        <view v-if="isRepair() || isEquAdmin()">
+          <wd-button size="small" icon="edit-outline" @click.stop="handleSelectReq(item)">
+            鎺ュ崟
+          </wd-button>
+        </view>
+      </view>
+      <template #right>
+        <view class="h-full px-3 flex items-center">
+          <wd-button size="small" type="error" @click.stop="handleDelete(item)">鍒犻櫎</wd-button>
+        </view>
+      </template>
+    </wd-swipe-action>
+  </wd-card>
+</template>
+
+<script setup lang="ts">
+import { useToast, useMessage } from 'wot-design-uni'
+import type { RepairReqVO } from '@/service/repair.d'
+import {addRepairRes} from "@/service/repair";
+import { isEquAdmin, isRepair } from "@/utils/RoleUtils";
+import { useUserStore } from "@/store";
+
+const userStore = useUserStore()
+const message = useMessage()
+const toast = useToast()
+defineProps({
+  item: {
+    type: Object as () => RepairReqVO,
+    required: true
+  }
+})
+
+const emit = defineEmits(['click'])
+
+function itemClick(item) {
+  emit('click', item)
+  // 璺宠浆鍒版姤淇崟璇︽儏椤甸潰
+  uni.navigateTo({
+    url: '/pages/repair/req-detail?id=' + item.id
+  })
+}
+
+
+function handleSelectReq(item: any) {
+  // 寮瑰嚭纭鏄惁鎺ュ崟寮圭獥
+  message.confirm({
+    msg: '纭畾鎺ュ崟锛�',
+    title: '鎻愮ず',
+    beforeConfirm: ({ resolve }) => {
+      resolve(true)
+      addNewRepairRes(item)
+    },
+  })
+}
+function addNewRepairRes(data: any) {
+  console.error(data)
+  // 閫夋嫨鎶ヤ慨鍗曞悗锛屼慨鏀规姤淇崟鐘舵�佸拰鏂板缁翠慨宸ュ崟
+  const resCode = `WXD${data.code.slice(3)}`
+  const deptId = userStore?.userInfo?.deptId
+  const userId = userStore?.userInfo?.userId
+  const resData = {
+    reqId: data.id,
+    reqCode: data.code,
+    reqUser: data.reqUser,
+    reqDept: data.reqDept,
+    resCode,
+    status: '1',
+    resUser: userId,
+    resDept: deptId,
+  }
+  addRepairRes(resData)
+    .then((res: any) => {
+      if (res.code === 200) {
+        toast.success(res?.msg || '鎿嶄綔鎴愬姛')
+        uni.$emit('list-refresh')
+      } else {
+        toast.error(res?.msg || '鐢熸垚缁翠慨宸ュ崟澶辫触锛岃閲嶈瘯')
+      }
+    })
+    .catch((res) => {
+      toast.error(res?.msg || '鐢熸垚缁翠慨宸ュ崟澶辫触锛岃閲嶈瘯')
+    })
+}
+</script>
+
+<style scoped lang="scss">
+.menu-title-box {
+  height: 30rpx;
+  line-height: 30rpx;
+}
+
+.slot-img {
+  width: 72rpx;
+  height: 72rpx;
+  margin-right: 24rpx;
+}
+.text-mini {
+  font-size: 22rpx;
+}
+
+.menu-indicator {
+  width: 6rpx;
+  height: 22rpx;
+  border-radius: 10rpx;
+  background-color: $uni-color-primary;
+}
+:deep(.wd-card__title-content) {
+  padding: 16rpx !important;
+}
+:deep(.wd-card__content) {
+  padding: 16rpx !important;
+}
+:deep(.wd-card__footer) {
+  padding: 10rpx !important;
+}
+</style>
diff --git a/eims-ui-mobile/src/components/repair/res-card.vue b/eims-ui-mobile/src/components/repair/res-card.vue
new file mode 100644
index 0000000..230b442
--- /dev/null
+++ b/eims-ui-mobile/src/components/repair/res-card.vue
@@ -0,0 +1,236 @@
+<template>
+  <wd-card type="rectangle" :key="item.id">
+    <template #title>
+      <view class="flex justify-between items-center">
+        <view class="flex items-center menu-title-box">
+          <view class="menu-indicator"></view>
+          <text class="ml-1 text-sm">{{ item.resCode }}</text>
+          <text class="text-color-gray ml-2 text-mini">鎺ュ崟:{{ item.createTime }}</text>
+        </view>
+
+        <view>
+          <wd-tag size="small" v-if="item.status === '1'" type="warning">宸叉帴鍗�</wd-tag>
+          <wd-tag size="small" v-else-if="item.status === '2'" type="primary">缁翠慨涓�</wd-tag>
+          <wd-tag size="small" v-else-if="item.status === '3'" type="success">宸插畬鎴�</wd-tag>
+        </view>
+      </view>
+    </template>
+    <view class="flex h-[240rpx] items-center">
+      <image
+        v-if="item.reqType === '1'"
+        class="slot-img text-center"
+        src="/static/ico/ico-huiyi.png"
+      />
+      <image
+        v-else-if="item.reqType === '2'"
+        class="slot-img text-center"
+        src="/static/ico/ico-setting.png"
+      />
+      <image
+        v-else-if="item.reqType === '3'"
+        class="slot-img text-center"
+        src="/static/ico/ico-faxian.png"
+      />
+      <view class="flex-1 mt-1">
+        <view class="text-color-base">
+          <template v-if="item.reqType === '1'">
+            <text>璁惧绫诲瀷</text>
+            <text class="mx-2">|</text>
+            <text>{{ item.equName }}</text>
+          </template>
+
+          <template v-if="item.reqType === '2'">
+            <text>宸ュ叿绫诲瀷</text>
+            <text class="mx-2">|</text>
+            <text>{{ item.fixtureName }}</text>
+          </template>
+
+          <template v-if="item.reqType === '3'">
+            <text>鍏朵粬绫诲瀷</text>
+          </template>
+          <view class="text-color-gray mt-1 text-mini">
+            <text>鎶ヤ慨浜�: {{ item.reqUserName }}</text>
+          </view>
+          <view class="text-color-gray mt-1 text-mini">
+            <text>鎶ヤ慨鏃堕棿: {{ item.reqTime }}</text>
+          </view>
+
+          <view class="text-color-gray mt-1 text-mini">
+            <text>缁翠慨寮�濮�: {{ item.startTime }}</text>
+          </view>
+          <view class="text-color-gray mt-1 text-mini">
+            <text>缁翠慨缁撴潫: {{ item.endTime }}</text>
+          </view>
+          <view class="text-color-gray mt-1 text-mini">
+            <text>缁翠慨浜�: {{ item.resUserName }}</text>
+          </view>
+        </view>
+      </view>
+      <view>
+        <template v-if="item.status === '3'">
+          <view class="h-full flex flex-col">
+            <wd-button size="small" icon="warn-bold" @click.stop="itemClick(item)">
+              璇︽儏
+            </wd-button>
+            <wd-button
+              class="mt-4"
+              size="small"
+              icon="edit-outline"
+              @click.stop="goToFeedBack(item)"
+              type="warning"
+            >
+              {{ item.fbId == null ? '鍐欒瘎浠�' : '鏌ョ湅璇勪环' }}
+            </wd-button>
+          </view>
+        </template>
+        <!--鎿嶄綔宸ユ垨缁翠慨宸ヨ鑹�-->
+        <template v-if="isRepair() || isEquAdmin()">
+          <wd-button
+            v-if="item.status === '1'"
+            size="small"
+            icon="edit-outline"
+            @click.stop="handleStartRepair(item)"
+          >
+            寮�濮嬬淮淇�
+          </wd-button>
+          <wd-button
+            v-else-if="item.status === '2'"
+            size="small"
+            icon="edit-outline"
+            @click.stop="itemClick(item)"
+            type="success"
+          >
+            瀹屾垚缁翠慨
+          </wd-button>
+
+        </template>
+
+      </view>
+    </view>
+  </wd-card>
+</template>
+
+<script setup lang="ts">
+import type { RepairResVO } from '@/service/repair.d'
+import { isEquAdmin, isLeader, isLineOrRepair, isRepair } from "@/utils/RoleUtils";
+import { formatDate } from "@/utils/DateUtils";
+import { updateRepairRes } from "@/service/repair";
+import { useToast, useMessage } from 'wot-design-uni'
+import { useUserStore } from "@/store";
+
+const userStore = useUserStore()
+const message = useMessage()
+const toast = useToast()
+defineProps({
+  item: {
+    type: Object as () => RepairResVO,
+    required: true
+  }
+})
+
+const emit = defineEmits(['click'])
+
+function handleClick(item) {
+  emit('click', item)
+}
+
+/**
+ * 寮�濮嬬淮淇�
+ * @param item
+ */
+function handleStartRepair(item: any) {
+  // 纭寮�濮嬩慨鏀圭姸鎬佷负2-缁翠慨涓�
+  const data = Object.assign({}, item)
+  // 纭寮�濮嬩慨鏀圭姸鎬佷负2-缁翠慨涓�
+  data.status = '2'
+  // 璁剧疆寮�濮嬬淮淇椂闂�
+  data.startTime = formatDate(new Date())
+  message
+    .confirm({
+      msg: '纭畾寮�濮嬬淮淇紵',
+      title: '鎻愮ず',
+      beforeConfirm: ({ resolve }) => {
+        updateRepair(data, resolve)
+      },
+    })
+    .then(() => {})
+    .catch((error) => {
+      console.log(error)
+    })
+}
+
+/**
+ * 鏇存柊缁翠慨宸ュ崟
+ * @param data
+ * @param resolve
+ */
+function updateRepair(data: any, resolve: any) {
+  updateRepairRes(data)
+    .then((res: any) => {
+      resolve(true)
+      if (res?.code === 200) {
+        uni.$emit('list-refresh')
+        // 缁翠慨涓姸鎬佹墠闇�瑕佽烦杞�
+        if (data?.status === '3') {
+          goToDetail(data)
+        }
+      }
+    })
+    .catch((res) => {
+      console.error(res)
+    })
+}
+
+/**
+ * 鏉$洰鐐瑰嚮浜嬩欢
+ * @param item
+ */
+function itemClick(item: any) {
+  goToDetail(item)
+}
+
+function goToDetail(item) {
+  uni.navigateTo({
+    url: `/pages/repair/res-detail?id=${item.id}`,
+  })
+}
+
+function goToFeedBack(item) {
+  uni.navigateTo({
+    url: `/pages/repair/repair-fb?id=${item.id}`,
+  })
+}
+
+</script>
+
+<style scoped lang="scss">
+.menu-title-box {
+  height: 30rpx;
+  line-height: 30rpx;
+}
+
+.slot-img {
+  width: 72rpx;
+  height: 72rpx;
+  margin-right: 24rpx;
+}
+.text-mini {
+  font-size: 22rpx;
+}
+
+.menu-indicator {
+  width: 6rpx;
+  height: 22rpx;
+  border-radius: 10rpx;
+  background-color: $uni-color-primary;
+}
+:deep(.wd-card__title-content) {
+  padding: 16rpx !important;
+}
+:deep(.wd-card__content) {
+  padding: 16rpx !important;
+}
+:deep(.wd-card__footer) {
+  padding: 10rpx !important;
+}
+</style>
diff --git a/eims-ui-mobile/src/pages.json b/eims-ui-mobile/src/pages.json
index 08bf8fa..dd4e52f 100644
--- a/eims-ui-mobile/src/pages.json
+++ b/eims-ui-mobile/src/pages.json
@@ -200,6 +200,16 @@
       }
     },
     {
+      "path": "pages/repair/req-detail",
+      "type": "page",
+      "layout": "default",
+      "needLogin": true,
+      "style": {
+        "navigationBarTitleText": "鎶ヤ慨璇︽儏",
+        "navigationStyle": "custom"
+      }
+    },
+    {
       "path": "pages/repair/req-list",
       "type": "page",
       "layout": "default",
diff --git a/eims-ui-mobile/src/pages/inspect/insp-record.vue b/eims-ui-mobile/src/pages/inspect/insp-record.vue
index c039bad..d38c7ea 100644
--- a/eims-ui-mobile/src/pages/inspect/insp-record.vue
+++ b/eims-ui-mobile/src/pages/inspect/insp-record.vue
@@ -124,7 +124,7 @@
             </view>
           </template>
 
-          <view v-if="item.showDesc" class="mt-2">
+          <view v-if="item.inspResult === '2'" class="mt-2">
             <wd-input
               v-model="item.inspDesc"
               placeholder="璇疯緭鍏ュ紓甯告弿杩�"
@@ -177,8 +177,8 @@
       />
       <!-- 鏂板鎻愪氦鎸夐挳 -->
       <view class="flex justify-around mt-4">
-        <wd-button type="primary" block size="large" v-if="inspSt.status === '0'" @click="handleClickRight">鎻愪氦</wd-button>
-        <wd-button type="success" block size="large" v-if="isLeader() && inspSt.status === '1'" @click="handleComplete">纭瀹屾垚</wd-button>
+        <wd-button type="primary" block size="large" v-if="inspSt.status === '0' || inspSt.status === '1'" @click="handleClickRight">鎻愪氦</wd-button>
+<!--        <wd-button type="success" block size="large" v-if="isLeader() && inspSt.status === '1'" @click="handleComplete">纭瀹屾垚</wd-button>-->
       </view>
     </view>
   </z-paging>
@@ -186,7 +186,7 @@
 
 <script setup lang="ts">
 import { useUserStore, useAccessStore, useSystemConfigStore } from '@/store'
-import { isLeader, isOperatorOrRepair } from '@/utils/RoleUtils'
+import { isLeader, isLineOrRepair } from '@/utils/RoleUtils'
 import {
   getInspStRecordList,
   getInspSt,
@@ -244,8 +244,8 @@
   status: '',
   inspUser: '',
   specialNote: '',
-  runTimes: 0,
-  faultTimes: 0,
+  runTimes: undefined,
+  faultTimes: undefined,
 })
 
 const paging = ref(null)
@@ -280,13 +280,6 @@
   // 淇敼鏃堕棿鏍煎紡涓� YYYY-MM-DD HH:mm:ss
   const now = new Date()
   item.inspTime = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}-${String(now.getDate()).padStart(2, '0')} ${String(now.getHours()).padStart(2, '0')}:${String(now.getMinutes()).padStart(2, '0')}:${String(now.getSeconds()).padStart(2, '0')}`
-
-  if (item.inspResult === '2') {
-    item.showDesc = true
-  } else {
-    item.showDesc = false
-    item.inspDesc = ''
-  }
 }
 
 const goBack = () => {
@@ -294,8 +287,11 @@
 }
 
 function handleClickRight() {
-  if (isOperatorOrRepair()) {
+
+  if (inspSt.status === '0') {
     handleConfirm()
+  } else if (inspSt.status === '1') {
+    handleComplete()
   }
 }
 
@@ -368,6 +364,7 @@
   } else {
     inspSt.status = '0'
   }
+
   updateInspectSt(inspSt)
     .then((res: any) => {
       toast.success('鎿嶄綔鎴愬姛')
@@ -385,15 +382,18 @@
  * 纭瀹屾垚鎸夐挳鐐瑰嚮浜嬩欢
  */
 function handleComplete() {
-  if (!isLeader()) {
-    toast.info('鏃犳潈闄愭搷浣�');
-    return;
+  console.log('handleComplete', inspSt)
+  if (!inspSt.runTimes || !inspSt.faultTimes) {
+    message.alert('璇峰~鍐欒繍琛屾鏁板拰鏁呴殰娆℃暟!')
+    return false
   }
   const now = new Date();
   const data: any = Object.assign(
     {},
     {
       id: inspSt.id,
+      runTimes: inspSt.runTimes,
+      faultTimes: inspSt.faultTimes,
       status: '2',
       verifyUser: userStore?.userInfo?.userId,
       verifyTime: `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}-${String(now.getDate()).padStart(2, '0')} ${String(now.getHours()).padStart(2, '0')}:${String(now.getMinutes()).padStart(2, '0')}:${String(now.getSeconds()).padStart(2, '0')}`
diff --git a/eims-ui-mobile/src/pages/inspect/insp-st.vue b/eims-ui-mobile/src/pages/inspect/insp-st.vue
index 0ca9158..85c1cda 100644
--- a/eims-ui-mobile/src/pages/inspect/insp-st.vue
+++ b/eims-ui-mobile/src/pages/inspect/insp-st.vue
@@ -78,7 +78,8 @@
 <script setup lang="ts">
 import { getInspStList } from '@/service/inspect'
 import dayjs from 'dayjs'
-
+import { useUserStore, useAccessStore, useSystemConfigStore } from '@/store'
+import { isLeader, isLineOrRepair, isOperator } from "@/utils/RoleUtils";
 // 鏍囩椤电浉鍏�
 const activeTab = ref(0) // 榛樿閫変腑绗竴涓爣绛鹃〉锛堝緟鐐规锛�
 
@@ -98,7 +99,7 @@
 ])
 
 const equList = ref<Record<string, any>[]>([{ label: '鎵�鏈夎澶�', value: '鎵�鏈夎澶�' }])
-
+const userStore = useUserStore()
 // 鏍囩椤靛垏鎹㈠鐞嗗嚱鏁�
 function handleTabChange({ index }) {
   // 鏍规嵁鏍囩椤电储寮曡缃搴旂殑鐘舵�佸��
@@ -142,6 +143,14 @@
   } else {
     delete params.planTime
   }
+
+  console.log('queryList::', isLineOrRepair(), isOperator(), userStore.userInfo)
+  if (isLineOrRepair() || isOperator()) {
+    params.updateBy = userStore.userInfo.userId
+  } else if (isLeader()) {
+    delete params.updateBy
+  }
+  console.log('params::', params)
   getInspStList(params)
     .then((res: any) => {
       // 璇峰嬁鍦ㄧ綉缁滆姹傚洖璋冧腑缁檇ataList璧嬪�硷紒锛佸彧闇�瑕佽皟鐢╟omplete灏卞彲浠ヤ簡
diff --git a/eims-ui-mobile/src/pages/maint/maint-order.vue b/eims-ui-mobile/src/pages/maint/maint-order.vue
index b67e041..7e60bdc 100644
--- a/eims-ui-mobile/src/pages/maint/maint-order.vue
+++ b/eims-ui-mobile/src/pages/maint/maint-order.vue
@@ -175,7 +175,7 @@
             >
               <wd-input
                 v-model="part.name"
-                label="鍚嶇О"
+                label="鍚嶇О锛�"
                 label-width="100rpx"
                 placeholder="澶囦欢鍚嶇О"
 
@@ -183,7 +183,8 @@
               />
               <wd-input
                 v-model="part.quantity"
-                label="鏁伴噺" label-width="100rpx"
+                label="鏁伴噺锛�"
+                label-width="100rpx"
                 placeholder="鏁伴噺" type="number" :maxlength="5" />
             </view>
           </view>
@@ -260,7 +261,7 @@
 import { getMaintSt, getMaintStOrderList, updateMaintOrder, updateMaintSt, updateMaintOrderBatch } from '@/service/maint'
 import { ref, reactive } from 'vue'
 import { useToast, useMessage } from 'wot-design-uni'
-import { isLeader, isOperatorOrRepair } from '@/utils/RoleUtils'
+import { isLeader, isLineOrRepair } from '@/utils/RoleUtils'
 import { formatDate } from '@/utils/DateUtils'
 import { useUserStore } from "@/store";
 import { getSpareList } from '@/service/spare'
@@ -561,9 +562,8 @@
 }
 
 function handleClickRight() {
-  if(isOperatorOrRepair()){
+
     handleUpdateMaintSt()
-  }
 
 }
 
diff --git a/eims-ui-mobile/src/pages/maint/order-detail.vue b/eims-ui-mobile/src/pages/maint/order-detail.vue
index d4755ba..6672463 100644
--- a/eims-ui-mobile/src/pages/maint/order-detail.vue
+++ b/eims-ui-mobile/src/pages/maint/order-detail.vue
@@ -17,7 +17,7 @@
       safeAreaInsetTop
     >
       <template #right>
-        <text v-if="isOperatorOrRepair()" class="text-white">鎻愪氦</text>
+        <text v-if="isLineOrRepair()" class="text-white">鎻愪氦</text>
         <text v-else-if="isLeader()" class="text-white">楠岃瘉</text>
       </template>
     </wd-navbar>
@@ -93,7 +93,7 @@
       <wd-cell
         title="淇濆吇瀹屾垚(鎿嶄綔宸�)"
         title-width="200px"
-        v-if="order.status === '1' && isOperatorOrRepair()"
+        v-if="order.status === '1' && isLineOrRepair()"
       >
         <view style="text-align: right">
           <wd-switch v-model="isFinish" />
@@ -109,7 +109,7 @@
 import { reactive, onMounted } from 'vue'
 import { FormRules } from 'wot-design-uni/components/wd-form/types'
 import { useToast, useMessage } from 'wot-design-uni'
-import { isLeader, isOperatorOrRepair } from '@/utils/RoleUtils'
+import { isLeader, isLineOrRepair } from '@/utils/RoleUtils'
 const toast = useToast()
 const message = useMessage()
 
@@ -238,7 +238,7 @@
         toast.warning('褰撳墠宸ュ崟瀹屾垚鐘舵�侊紝涓嶅彲鎿嶄綔')
         break
     }
-  } else if (isOperatorOrRepair()) {
+  } else if (isLineOrRepair()) {
     switch (order.status) {
       case '0':
         break
diff --git a/eims-ui-mobile/src/pages/repair/repair-add.vue b/eims-ui-mobile/src/pages/repair/repair-add.vue
index a498a80..1a05452 100644
--- a/eims-ui-mobile/src/pages/repair/repair-add.vue
+++ b/eims-ui-mobile/src/pages/repair/repair-add.vue
@@ -115,9 +115,9 @@
         />
         <wd-cell title="鎶ヤ慨鍥剧墖" title-width="200rpx" prop="fileList">
           <wd-upload
-            :file-list="model.fileList"
+            v-model:file-list="model.fileList"
             :action="VITE_UPLOAD_BASEURL"
-            @change="handleFileChange"
+            @success="handleUploadSuccess"
           ></wd-upload>
         </wd-cell>
 
@@ -130,9 +130,26 @@
           @open="openOccTime"
           @confirm="handleOccTimeConfirm"
         />
+        <!-- <wd-picker
+          :columns="urgencyList"
+          label-key="dictLabel"
+          value-key="dictValue"
+          label="绱ф�ョ▼搴�"
+          v-model="model.urgencyLevel"
+          @confirm="handleConfirmUrgencyLevel"
+        /> -->
+        <wd-cell title="绱ф�ョ▼搴�" title-width="200rpx" prop="urgencyLevel">
+          <wd-radio-group v-model="model.urgencyLevel" inline  shape="dot"> @change="handleConfirmUrgencyLevel">
+          <wd-radio v-for="item in urgencyList" :value="item.dictValue">{{item.dictLabel}}</wd-radio>
+        </wd-radio-group>
+        </wd-cell>
+
       </wd-cell-group>
 
-      <wd-cell-group custom-class="mt-2" title="鍏朵粬淇℃伅" border>
+
+      <wd-button style="margin: 20px" block @click="handleSubmit">鎻愪氦</wd-button>
+
+      <!-- <wd-cell-group custom-class="mt-2" title="鍏朵粬淇℃伅" border>
         <wd-picker
           :columns="faultList"
           label-key="dictLabel"
@@ -149,7 +166,7 @@
           v-model="model.urgencyLevel"
           @confirm="handleConfirmUrgencyLevel"
         />
-      </wd-cell-group>
+      </wd-cell-group> -->
     </wd-form>
   </view>
 </template>
@@ -314,7 +331,10 @@
   model.reqTime = formatDate(new Date())
   model.reqDept = userStore?.userInfo?.deptId
   model.reqUser = userStore?.userInfo?.userId
-  model.faultPicture = model.fileList.join(',')
+  console.log('model', model)
+  const map = model.fileList?.map((file) => file.url)
+  console.log('map', map)
+  model.faultPicture = map.join(',')
   addRepairReq(model)
     .then((res: any) => {
       if (res?.code === 200) {
@@ -326,17 +346,21 @@
       }
     })
     .catch((res) => {
+      console.error('娣诲姞鎶ヤ慨澶辫触:', res)
       toast.error(res?.data?.msg || '璇锋眰澶辫触')
     })
 }
 
-/**
- * 涓婁紶鐐规鍥剧墖
- * @param fileList
- */
-function handleFileChange({ fileList }) {
-  console.log('fileList:', fileList)
-  model.fileList = fileList
+
+function handleUploadSuccess({ file, fileList }) {
+  console.log('handleUploadSuccess', file)
+  // 鍒ゆ柇 file.response鏄笉鏄� 瀵硅薄锛屼笉鏄璞″皢json瀛楃涓茶浆鎹负瀵硅薄
+  if (typeof file.response === 'string') {
+    file.response = JSON.parse(file.response)
+    console.log('file.response', file.response)
+    file.ossId = file.response.data.ossId
+    file.url = file.response.data.url
+  }
 }
 
 function checkData() {
@@ -371,11 +395,14 @@
  */
 function openOccTime() {
   occTime.value = Date.now()
+  console.log('openOccTime', occTime)
+  model.occTime = formatDate(new Date(occTime.value))
 }
 /**
  * 纭閫夋嫨鍙戠敓鏃堕棿
  */
 function handleOccTimeConfirm({ value }) {
+  console.log('handleOccTimeConfirm', value)
   model.occTime = formatDate(new Date(value))
 }
 
diff --git a/eims-ui-mobile/src/pages/repair/repair-fb.vue b/eims-ui-mobile/src/pages/repair/repair-fb.vue
index 125226f..38a6d05 100644
--- a/eims-ui-mobile/src/pages/repair/repair-fb.vue
+++ b/eims-ui-mobile/src/pages/repair/repair-fb.vue
@@ -57,30 +57,13 @@
         </view>
       </template>
       <wd-cell title="缁翠慨婊℃剰搴�">
-        <wd-rate v-model="repairFb.repairSatisfaction" change="handleChange"></wd-rate>
+        <wd-radio-group v-model="repairFb.repairSatisfaction" inline shape="dot">
+          <wd-radio :value="0">涓嶆弧鎰�</wd-radio>
+          <wd-radio :value="1">婊℃剰</wd-radio>
+        </wd-radio-group>
       </wd-cell>
-      <wd-cell title="缁翠慨鍙婃椂鎬�">
-        <wd-rate v-model="repairFb.repairTimeliness" change="handleChange"></wd-rate>
-      </wd-cell>
-      <wd-cell title="缁翠慨鍙婃�佸害">
-        <wd-rate v-model="repairFb.serviceAttitude" change="handleChange"></wd-rate>
-      </wd-cell>
-      <wd-cell title="缁翠慨鐜板満6S">
-        <wd-rate v-model="repairFb.repairSs" change="handleChange"></wd-rate>
-      </wd-cell>
-
       <wd-textarea
-        label="缁撴灉鍙嶉"
-        label-width="200rpx"
-        type="textarea"
-        v-model="repairFb.fbResult"
-        auto-height
-        :maxlength="200"
-        show-word-limit
-        placeholder="璇疯緭鍏ョ粨鏋滃弽棣�"
-        clearable
-      />
-      <wd-textarea
+        v-if="repairFb.repairSatisfaction === 0"
         label="鎰忚鎴栧缓璁�"
         label-width="200rpx"
         type="textarea"
@@ -90,8 +73,12 @@
         show-word-limit
         placeholder="璇疯緭鍏ユ剰瑙佹垨寤鸿"
         clearable
+        required
+
       />
     </wd-cell-group>
+
+    <wd-button style="margin: 20px" block @click="handleRepairFb">鎻愪氦</wd-button>
   </view>
 </template>
 <script setup lang="ts">
@@ -103,9 +90,11 @@
   updateRepairFb,
 } from '@/service/repair'
 import { reactive } from 'vue'
-import { isLeader, isOperatorOrRepair } from '@/utils/RoleUtils'
+import { isLeader, isLineOrRepair } from '@/utils/RoleUtils'
 import { RepairResVO, RepairFbVO, RepairRecordVO } from '@/service/repair.d'
+import { useUserStore } from "@/store";
 
+const userStore = useUserStore()
 const isUpdate = ref(false)
 const repairRes = reactive<RepairResVO>({
   id: '',
@@ -129,7 +118,7 @@
   resCode: '',
   fbResult: '',
   suggestions: '',
-  repairSatisfaction: 0,
+  repairSatisfaction: 1,
   repairTimeliness: 0,
   serviceAttitude: 0,
   repairSs: 0,
@@ -192,9 +181,16 @@
 }
 
 function handleRepairFb() {
-  if(isOperatorOrRepair()){
+  if(repairRes.reqUser !== userStore.userInfo.userId){
     uni.showToast({
-      title: '鏃犳潈闄�,璇风櫥褰曠鐞嗗憳璐﹀彿鎿嶄綔',
+      title: '鍙湁璇锋眰浜烘墠鏈夎瘎浠锋潈闄�',
+      icon: 'none',
+    })
+    return false
+  }
+  if (repairFb.repairSatisfaction === 0 && !repairFb.suggestions) {
+    uni.showToast({
+      title: '璇峰~鍐欐剰瑙佹垨寤鸿',
       icon: 'none',
     })
     return false
@@ -209,6 +205,8 @@
             title: '淇敼鎴愬姛',
             icon: 'none',
           })
+          uni.navigateBack()
+          uni.$emit('res-list-refresh')
         }
       })
       .catch((res) => {})
@@ -220,6 +218,8 @@
             title: '璇勪环鎴愬姛',
             icon: 'none',
           })
+          uni.navigateBack()
+          uni.$emit('res-list-refresh')
         }
       })
       .catch((res) => {})
diff --git a/eims-ui-mobile/src/pages/repair/req-detail.vue b/eims-ui-mobile/src/pages/repair/req-detail.vue
new file mode 100644
index 0000000..987569c
--- /dev/null
+++ b/eims-ui-mobile/src/pages/repair/req-detail.vue
@@ -0,0 +1,252 @@
+<route lang="json5" type="page">
+{
+  layout: 'default',
+  needLogin: true,
+  style: {
+    navigationBarTitleText: '鎶ヤ慨璇︽儏',
+    navigationStyle: 'custom'
+  },
+}
+</route>
+<template>
+  <view class="bg-base container" safeAreaInsetTopBottom>
+    <wd-navbar
+      title="鎶ヤ慨璇︽儏"
+      left-arrow
+      @click-left="goBack"
+      custom-style="background: #4D80F0;"
+      safeAreaInsetTop
+    ></wd-navbar>
+
+    <view class="content">
+      <!-- 鐘舵�佸睍绀� -->
+      <view class="status-card">
+        <view class="status-header">
+          <text class="status-code">{{ repairReq.code }}</text>
+          <view class="status-tag">
+            <wd-button size="small" v-if="repairReq.status === '0'" type="info">寰呮帴鍗�</wd-button>
+            <wd-button size="small" v-else-if="repairReq.status === '1'" type="warning">宸叉帴鍗�</wd-button>
+            <wd-button size="small" v-else-if="repairReq.status === '2'" type="primary">缁翠慨涓�</wd-button>
+            <wd-button size="small" v-else-if="repairReq.status === '3'" type="success">宸插畬鎴�</wd-button>
+          </view>
+        </view>
+      </view>
+
+      <!-- 璁惧淇℃伅 -->
+      <wd-cell-group
+        v-if="repairReq.reqType === '1'"
+        custom-class="mt-2"
+        title="璁惧淇℃伅"
+        use-slot
+        border
+      >
+        <wd-cell title="璁惧鍚嶇О" title-width="200rpx">
+          <text>{{ repairReq.equName }}</text>
+        </wd-cell>
+        <wd-cell title="璧勪骇缂栧彿" title-width="200rpx">
+          <text>{{ repairReq.assetNo }}</text>
+        </wd-cell>
+      </wd-cell-group>
+
+      <!-- 宸ュ叿淇℃伅 -->
+      <wd-cell-group
+        v-if="repairReq.reqType === '2'"
+        custom-class="mt-2"
+        title="宸ュ叿淇℃伅"
+        use-slot
+        border
+      >
+        <wd-cell title="宸ュ叿鍚嶇О" title-width="200rpx">
+          <text>{{ repairReq.fixtureName }}</text>
+        </wd-cell>
+      </wd-cell-group>
+
+      <!-- 鎶ヤ慨淇℃伅 -->
+      <wd-cell-group custom-class="mt-2" title="鎶ヤ慨淇℃伅" use-slot border>
+        <wd-cell title="鎶ヤ慨绫诲瀷" title-width="200rpx">
+          <text v-if="repairReq.reqType === '1'">璁惧绫诲瀷</text>
+          <text v-else-if="repairReq.reqType === '2'">宸ュ叿绫诲瀷</text>
+          <text v-else-if="repairReq.reqType === '3'">鍏朵粬绫诲瀷</text>
+        </wd-cell>
+        <wd-cell title="鍙戠敓鏃堕棿" title-width="200rpx">
+          <text>{{ repairReq.occTime }}</text>
+        </wd-cell>
+        <wd-cell title="鎶ヤ慨鏃堕棿" title-width="200rpx">
+          <text>{{ repairReq.reqTime }}</text>
+        </wd-cell>
+        <wd-cell title="鎶ヤ慨浜�" title-width="200rpx">
+          <text>{{ repairReq.reqUserName }}</text>
+        </wd-cell>
+        <wd-cell title="绱ф�ョ▼搴�" title-width="200rpx">
+          <wd-tag type="danger" v-if="repairReq.urgencyLevel === '1'">绱ф��</wd-tag>
+          <wd-tag type="warning" v-else-if="repairReq.urgencyLevel === '2'">涓�鑸�</wd-tag>
+          <wd-tag type="success" v-else-if="repairReq.urgencyLevel === '3'">鏅��</wd-tag>
+        </wd-cell>
+      </wd-cell-group>
+
+      <!-- 鏁呴殰鎻忚堪 -->
+      <wd-cell-group custom-class="mt-2" title="鏁呴殰鎻忚堪" use-slot border>
+        <view class="description-box">
+          <text>{{ repairReq.reqDesc }}</text>
+        </view>
+      </wd-cell-group>
+
+      <!-- 鏁呴殰鍥剧墖 -->
+      <wd-cell-group v-if="repairReq.faultPicture" custom-class="mt-2" title="鏁呴殰鍥剧墖" use-slot border>
+        <view class="image-box">
+          <image 
+            class="fault-image" 
+            :src="repairReq.faultPicture" 
+            mode="aspectFit"
+            @click="previewImage"
+          />
+        </view>
+      </wd-cell-group>
+    </view>
+  </view>
+</template>
+
+<script setup lang="ts">
+import { reactive, onMounted } from 'vue'
+import { useToast } from 'wot-design-uni'
+import { getRepairReqList } from '@/service/repair'
+import type { RepairReqVO } from '@/service/repair.d'
+
+const toast = useToast()
+
+// 鎶ヤ慨璇锋眰鏁版嵁
+const repairReq = reactive<RepairReqVO>({
+  id: '',
+  code: '',
+  status: '',
+  occTime: '',
+  reqTime: '',
+  reqDept: 0,
+  reqUser: 0,
+  reqDesc: '',
+  urgencyLevel: '',
+  faultPicture: '',
+  reqType: '',
+  equId: '',
+  repairId: '',
+  repairDept: 0,
+  repairUser: 0,
+  faultType: '',
+  remark: '',
+  reqUserName: '',
+  equName: '',
+  assetNo: '',
+  fixtureName: ''
+})
+
+// 鑾峰彇鎶ヤ慨璇锋眰璇︽儏
+function getRepairReqDetail(id: string | number) {
+  getRepairReqList({ id })
+    .then((res: any) => {
+      if (res && res.rows && res.rows.length > 0) {
+        Object.assign(repairReq, res.rows[0])
+      } else {
+        toast.error('鑾峰彇鎶ヤ慨璇︽儏澶辫触')
+      }
+    })
+    .catch((err) => {
+      console.error('鑾峰彇鎶ヤ慨璇︽儏澶辫触', err)
+      toast.error('鑾峰彇鎶ヤ慨璇︽儏澶辫触')
+    })
+}
+
+// 棰勮鍥剧墖
+function previewImage() {
+  if (repairReq.faultPicture) {
+    uni.previewImage({
+      urls: [repairReq.faultPicture],
+      current: repairReq.faultPicture
+    })
+  }
+}
+
+// 杩斿洖涓婁竴椤�
+function goBack() {
+  uni.navigateBack()
+}
+
+// 椤甸潰鍔犺浇鏃惰幏鍙栨姤淇鎯�
+onLoad((options) => {
+  if (options && options.id) {
+    getRepairReqDetail(options.id)
+  } else {
+    toast.error('鍙傛暟閿欒')
+    setTimeout(() => {
+      goBack()
+    }, 1500)
+  }
+})
+</script>
+
+<style scoped lang="scss">
+.container {
+  min-height: 100vh;
+  background-color: #f5f5f5;
+}
+
+.content {
+  padding: 20rpx;
+}
+
+.status-card {
+  background-color: #ffffff;
+  border-radius: 12rpx;
+  padding: 24rpx;
+  margin-bottom: 20rpx;
+  box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.05);
+}
+
+.status-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+}
+
+.status-code {
+  font-size: 32rpx;
+  font-weight: bold;
+  color: #333333;
+}
+
+.description-box {
+  padding: 24rpx;
+  background-color: #f9f9f9;
+  border-radius: 8rpx;
+  margin: 16rpx;
+  color: #666666;
+  line-height: 1.6;
+}
+
+.image-box {
+  padding: 24rpx;
+  display: flex;
+  justify-content: center;
+}
+
+.fault-image {
+  width: 80%;
+  height: 400rpx;
+  border-radius: 8rpx;
+  box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.1);
+}
+
+:deep(.wd-cell-group__title) {
+  font-size: 28rpx;
+  font-weight: bold;
+  color: #4D80F0;
+}
+
+:deep(.wd-cell__title) {
+  color: #666666;
+}
+
+:deep(.wd-cell__value) {
+  color: #333333;
+  font-weight: 500;
+}
+</style>
\ No newline at end of file
diff --git a/eims-ui-mobile/src/pages/repair/req-list.vue b/eims-ui-mobile/src/pages/repair/req-list.vue
index c93a9ea..ea3ff6f 100644
--- a/eims-ui-mobile/src/pages/repair/req-list.vue
+++ b/eims-ui-mobile/src/pages/repair/req-list.vue
@@ -23,125 +23,134 @@
         custom-style="background: #4D80F0;"
         safeAreaInsetTop
       ></wd-navbar>
-      <wd-drop-menu v-if="!isSelectReq">
-        <wd-drop-menu-item
-          v-model="reqTypeId"
-          label-key="dictLabel"
-          value-key="dictValue"
-          :options="reqTypeList"
-          @change="handleReqType"
-        />
-        <wd-drop-menu-item
-          v-model="filterDate"
-          :options="filterDateList"
-          @change="handleFilterDate"
-        />
-        <wd-drop-menu-item
-          v-model="status"
-          label-key="dictLabel"
-          value-key="dictValue"
-          :options="statusList"
-          @change="handleReqStatu"
-        />
-      </wd-drop-menu>
+<!--      <wd-drop-menu v-if="!isSelectReq">-->
+<!--        <wd-drop-menu-item-->
+<!--          v-model="reqTypeId"-->
+<!--          label-key="dictLabel"-->
+<!--          value-key="dictValue"-->
+<!--          :options="reqTypeList"-->
+<!--          @change="handleReqType"-->
+<!--        />-->
+<!--        <wd-drop-menu-item-->
+<!--          v-model="filterDate"-->
+<!--          :options="filterDateList"-->
+<!--          @change="handleFilterDate"-->
+<!--        />-->
+<!--        <wd-drop-menu-item-->
+<!--          v-model="status"-->
+<!--          label-key="dictLabel"-->
+<!--          value-key="dictValue"-->
+<!--          :options="statusList"-->
+<!--          @change="handleReqStatu"-->
+<!--        />-->
+<!--      </wd-drop-menu>-->
     </template>
 
     <view class="bg-base">
-      <wd-card type="rectangle" v-for="(item, index) in dataList" :key="item.id">
-        <template #title>
-          <view class="flex justify-between items-center">
-            <view class="flex items-center menu-title-box">
-              <view class="menu-indicator"></view>
-              <text class="ml-1 text-sm">{{ item.code }}</text>
-            </view>
+      <ReqCard
+        v-for="item in dataList"
+        :key="item.id"
+        :item="item"
+        @itemClick="itemClick"
+      ></ReqCard>
+<!--      <wd-card type="rectangle" v-for="(item, index) in dataList" :key="item.id">-->
+<!--        <template #title>-->
+<!--          <view class="flex justify-between items-center">-->
+<!--            <view class="flex items-center menu-title-box">-->
+<!--              <view class="menu-indicator"></view>-->
+<!--              <text class="ml-1 text-sm">{{ item.code }}</text>-->
+<!--            </view>-->
 
-            <view>
-              <wd-button size="small" v-if="item.status === '0'" type="info">寰呮帴鍗�</wd-button>
-              <wd-button size="small" v-else-if="item.status === '1'" type="warning">
-                宸叉帴鍗�
-              </wd-button>
-              <wd-button size="small" v-else-if="item.status === '2'" type="primary">
-                缁翠慨涓�
-              </wd-button>
-              <wd-button size="small" v-else-if="item.status === '3'" type="success">
-                宸插畬鎴�
-              </wd-button>
-            </view>
-          </view>
-        </template>
-        <wd-swipe-action>
-          <view class="flex h-[160rpx] items-center" @click.stop="itemClick(item)">
-            <image
-              v-if="item.reqType === '1'"
-              class="slot-img text-center"
-              src="/static/ico/ico-huiyi.png"
-            />
-            <image
-              v-else-if="item.reqType === '2'"
-              class="slot-img text-center"
-              src="/static/ico/ico-setting.png"
-            />
-            <image
-              v-else-if="item.reqType === '3'"
-              class="slot-img text-center"
-              src="/static/ico/ico-faxian.png"
-            />
-            <view class="flex-1 mt-1">
-              <view class="text-color-base">
-                <template v-if="item.reqType === '1'">
-                  <text>璁惧绫诲瀷</text>
-                  <text class="mx-2">|</text>
-                  <text>{{ item.equName }}</text>
-                </template>
+<!--            <view>-->
+<!--              <wd-button size="small" v-if="item.status === '0'" type="info">寰呮帴鍗�</wd-button>-->
+<!--              <wd-button size="small" v-else-if="item.status === '1'" type="warning">-->
+<!--                宸叉帴鍗�-->
+<!--              </wd-button>-->
+<!--              <wd-button size="small" v-else-if="item.status === '2'" type="primary">-->
+<!--                缁翠慨涓�-->
+<!--              </wd-button>-->
+<!--              <wd-button size="small" v-else-if="item.status === '3'" type="success">-->
+<!--                宸插畬鎴�-->
+<!--              </wd-button>-->
+<!--            </view>-->
+<!--          </view>-->
+<!--        </template>-->
+<!--        <wd-swipe-action>-->
+<!--          <view class="flex h-[160rpx] items-center" @click.stop="itemClick(item)">-->
+<!--            <image-->
+<!--              v-if="item.reqType === '1'"-->
+<!--              class="slot-img text-center"-->
+<!--              src="/static/ico/ico-huiyi.png"-->
+<!--            />-->
+<!--            <image-->
+<!--              v-else-if="item.reqType === '2'"-->
+<!--              class="slot-img text-center"-->
+<!--              src="/static/ico/ico-setting.png"-->
+<!--            />-->
+<!--            <image-->
+<!--              v-else-if="item.reqType === '3'"-->
+<!--              class="slot-img text-center"-->
+<!--              src="/static/ico/ico-faxian.png"-->
+<!--            />-->
+<!--            <view class="flex-1 mt-1">-->
+<!--              <view class="text-color-base">-->
+<!--                <template v-if="item.reqType === '1'">-->
+<!--                  <text>璁惧绫诲瀷</text>-->
+<!--                  <text class="mx-2">|</text>-->
+<!--                  <text>{{ item.equName }}</text>-->
+<!--                </template>-->
 
-                <template v-if="item.reqType === '2'">
-                  <text>宸ュ叿绫诲瀷</text>
-                  <text class="mx-2">|</text>
-                  <text>{{ item.fixtureName }}</text>
-                </template>
+<!--                <template v-if="item.reqType === '2'">-->
+<!--                  <text>宸ュ叿绫诲瀷</text>-->
+<!--                  <text class="mx-2">|</text>-->
+<!--                  <text>{{ item.fixtureName }}</text>-->
+<!--                </template>-->
 
-                <template v-if="item.reqType === '3'">
-                  <text>鍏朵粬绫诲瀷</text>
-                </template>
-                <view class="text-color-gray mt-1 text-mini">
-                  <text>鍙戠敓鏃堕棿: {{ item.occTime }}</text>
-                </view>
+<!--                <template v-if="item.reqType === '3'">-->
+<!--                  <text>鍏朵粬绫诲瀷</text>-->
+<!--                </template>-->
+<!--                <view class="text-color-gray mt-1 text-mini">-->
+<!--                  <text>鍙戠敓鏃堕棿: {{ item.occTime }}</text>-->
+<!--                </view>-->
 
-                <view class="text-color-gray mt-1 text-mini">
-                  <text>鎶ヤ慨鏃堕棿: {{ item.reqTime }}</text>
-                </view>
-                <view class="text-color-gray mt-1 text-mini">
-                  <text>鎶ヤ慨浜�: {{ item.reqUserName }}</text>
-                </view>
-              </view>
-              <view class="text-color-gray text-sm mt-1">
-                {{ item.location }} {{ item.madeIn }}
-              </view>
-            </view>
-            <view v-if="isSelectReq">
-              <wd-button size="small" icon="edit-outline" @click.stop="handleSelectReq(item)">
-                鎺ュ崟
-              </wd-button>
-            </view>
-          </view>
-          <template #right>
-            <view class="h-full px-3 flex items-center">
-              <wd-button size="small" type="error" @click.stop="handleDelete(item)">鍒犻櫎</wd-button>
-            </view>
-          </template>
-        </wd-swipe-action>
-      </wd-card>
+<!--                <view class="text-color-gray mt-1 text-mini">-->
+<!--                  <text>鎶ヤ慨鏃堕棿: {{ item.reqTime }}</text>-->
+<!--                </view>-->
+<!--                <view class="text-color-gray mt-1 text-mini">-->
+<!--                  <text>鎶ヤ慨浜�: {{ item.reqUserName }}</text>-->
+<!--                </view>-->
+<!--              </view>-->
+<!--              <view class="text-color-gray text-sm mt-1">-->
+<!--                {{ item.location }} {{ item.madeIn }}-->
+<!--              </view>-->
+<!--            </view>-->
+<!--            <view v-if="isSelectReq">-->
+<!--              <wd-button size="small" icon="edit-outline" @click.stop="handleSelectReq(item)">-->
+<!--                鎺ュ崟-->
+<!--              </wd-button>-->
+<!--            </view>-->
+<!--          </view>-->
+<!--          <template #right>-->
+<!--            <view class="h-full px-3 flex items-center">-->
+<!--              <wd-button size="small" type="error" @click.stop="handleDelete(item)">鍒犻櫎</wd-button>-->
+<!--            </view>-->
+<!--          </template>-->
+<!--        </wd-swipe-action>-->
+<!--      </wd-card>-->
     </view>
   </z-paging>
 </template>
 
 <script setup lang="ts">
-import { onMounted, getCurrentInstance, ref } from 'vue'
 import { useToast, useMessage } from 'wot-design-uni'
 import { getRepairReqList, delRepairReq } from '@/service/repair'
 import { DICT_REPAIR_REQ_STATUS, DICT_REPAIR_REQ_TYPE, getDictInfo } from '@/service/dict'
 import dayjs from "dayjs";
+import { isEquAdmin, isRepair } from "@/utils/RoleUtils";
+import { useUserStore } from "@/store";
+import ReqCard from "@/components/repair/req-card.vue";
 
+const userStore = useUserStore()
 const message = useMessage()
 const toast = useToast()
 // 鎶ヤ慨鍗曠被鍨�
@@ -180,31 +189,38 @@
   const queryParams: any = {
     pageNum,
     pageSize,
-    reqType: reqTypeId.value,
-    status: status.value,
+    params: {},
   }
-  if (reqTypeId.value === -1) {
-    delete queryParams.reqType
-  }
-  if (status.value === -1) {
-    delete queryParams.status
-  }
+  // if (reqTypeId.value === -1) {
+  //   delete queryParams.reqType
+  // }
+  // if (status.value === -1) {
+  //   delete queryParams.status
+  // }
+  //
+  // if (filterDate.value === '1') {
+  //   // 鑾峰彇褰撳墠鏃ユ湡
+  //   const now = dayjs()
+  //   queryParams.params = {
+  //     beginReqTime: now.startOf('day').format('YYYY-MM-DD 00:00:00'),
+  //     endReqTime: now.endOf('day').format('YYYY-MM-DD 23:59:59'),
+  //   }
+  // } else if (filterDate.value === '2') {
+  //   const now = dayjs()
+  //   queryParams.params = {
+  //     beginReqTime: now.startOf('month').format('YYYY-MM-DD 00:00:00'),
+  //     endReqTime: now.endOf('month').format('YYYY-MM-DD 23:59:59'),
+  //   }
+  // } else {
+  //   delete queryParams.params
+  // }
 
-  if (filterDate.value === '1') {
-    // 鑾峰彇褰撳墠鏃ユ湡
-    const now = dayjs()
-    queryParams.params = {
-      beginReqTime: now.startOf('day').format('YYYY-MM-DD 00:00:00'),
-      endReqTime: now.endOf('day').format('YYYY-MM-DD 23:59:59'),
-    }
-  } else if (filterDate.value === '2') {
-    const now = dayjs()
-    queryParams.params = {
-      beginReqTime: now.startOf('month').format('YYYY-MM-DD 00:00:00'),
-      endReqTime: now.endOf('month').format('YYYY-MM-DD 23:59:59'),
-    }
-  } else {
-    delete queryParams.params
+  // 鏌ヨ鏈畬鎴愮殑鎶ヤ慨鍗�
+  queryParams.params.status = '0,1,2'
+  queryParams.reqUser = userStore?.userInfo?.userId
+  if (isRepair() || isEquAdmin()) {
+    queryParams.params.status = '0'
+    queryParams.reqUser = undefined
   }
 
   getRepairReqList(queryParams)
@@ -330,10 +346,10 @@
 
 onLoad(() => {
   initData()
-  uni.$on('req-list-refresh', reloadData)
+  uni.$on('list-refresh', reloadData)
 })
 onUnload(() => {
-  uni.$off('req-list-refresh', reloadData)
+  uni.$off('list-refresh', reloadData)
 })
 </script>
 
diff --git a/eims-ui-mobile/src/pages/repair/res-detail.vue b/eims-ui-mobile/src/pages/repair/res-detail.vue
index 77b739b..ddd618f 100644
--- a/eims-ui-mobile/src/pages/repair/res-detail.vue
+++ b/eims-ui-mobile/src/pages/repair/res-detail.vue
@@ -30,7 +30,15 @@
         <wd-cell title="鏁呴殰绫诲瀷" title-width="200rpx" is-link>
           <text>{{ reqType?.dictLabel }}</text>
         </wd-cell>
-        <wd-cell title="鎶ヤ慨鎻忚堪" :label="repairRes?.reqDesc" is-link />
+
+        <wd-textarea
+          label="鎶ヤ慨鎻忚堪"
+          label-width="200rpx"
+          type="textarea"
+          v-model="repairRes.reqDesc"
+          auto-height
+          readonly
+        />
       </wd-cell-group>
 
       <wd-cell-group
@@ -64,6 +72,11 @@
       </wd-cell-group>
 
       <wd-cell-group custom-class="mt-2" title="缁翠慨淇℃伅" use-slot border>
+        <wd-cell title="鏁呴殰绫诲埆" title-width="200rpx" prop="faultType">
+          <wd-radio-group v-model="repairRes.faultType" inline  shape="dot"> >
+            <wd-radio v-for="item in faultList" :value="item.dictValue">{{item.dictLabel}}</wd-radio>
+          </wd-radio-group>
+        </wd-cell>
         <wd-textarea
           label="鍘熷洜鍒嗘瀽"
           label-width="200rpx"
@@ -112,28 +125,90 @@
           clearable
         />
       </wd-cell-group>
+      <wd-cell-group custom-class="mt-2" title="澶囦欢淇℃伅" use-slot border>
+      <!-- 澶囦欢淇℃伅褰曞叆鍖哄煙 -->
+      <view v-if="repairRes.spareParts && repairRes.spareParts.length > 0" class="mt-2">
+        <view
+          v-for="(part, partIndex) in repairRes.spareParts"
+          :key="partIndex"
+          class="flex justify-between mt-1"
+        >
+          <wd-input
+            v-model="part.name"
+            label="鍚嶇О锛�"
+            label-width="100rpx"
+            placeholder="澶囦欢鍚嶇О"
+
+
+          />
+          <wd-input
+            v-model="part.quantity"
+            label="鏁伴噺锛�"
+            label-width="100rpx"
+            placeholder="鏁伴噺" type="number" :maxlength="5" />
+        </view>
+      </view>
+      <!-- 缁翠慨璇存槑鍖哄煙 -->
+      <view class="mt-2 flex justify-end">
+        <wd-button type="success" style="margin: 20px" @click.stop="addSparePart()">
+          娣诲姞澶囦欢
+        </wd-button>
+      </view>
       <view class="h-[2px] w-full bg-base"></view>
+      </wd-cell-group>
     </wd-form>
+<!--    <wd-button style="margin: 20px" block @click="handleClickRight">鎻愪氦</wd-button>-->
+    <view class="h-[20px] w-full bg-base"></view>
   </view>
+
+  <!-- 澶囦欢閫夋嫨寮瑰嚭灞� -->
+  <wd-popup v-model="showSparePopup" position="bottom" height="33.33vh">
+    <view class="flex justify-between p-2 bg-white">
+      <wd-button type="text" @click="closeSparePopup">鍙栨秷</wd-button>
+      <wd-button type="text" @click="addOtherSparePart">鍏朵粬</wd-button>
+
+    </view>
+    <wd-input
+      v-model="searchKeyword"
+      placeholder="璇疯緭鍏ュ浠跺悕绉版垨鍨嬪彿"
+      clearable
+      @input="filterSpareParts"
+    />
+    <view class="p-2">
+      <view
+        v-for="(part, index) in sparePartsList"
+        :key="index"
+        class="flex justify-between items-center p-2 border-b"
+        @click="selectFilteredSparePart(part)"
+      >
+        <text>{{ part.name }} ({{ part.code }})</text>
+        <text>鍓╀綑: {{ part.actualStock }}</text>
+      </view>
+    </view>
+  </wd-popup>
 </template>
 
 <script setup lang="ts">
 import { getRepairRes, updateRepairRes } from '@/service/repair'
 import { RepairResVO } from '@/service/repair.d'
-import { reactive, onMounted, ref } from 'vue'
 import { FormRules } from 'wot-design-uni/components/wd-form/types'
 import { useToast, useMessage } from 'wot-design-uni'
-import { isLeader, isOperatorOrRepair } from '@/utils/RoleUtils'
-import { DICT_REPAIR_REQ_TYPE, getDictInfo } from '@/service/dict'
+import { isEquAdmin, isLeader, isLineOrRepair, isRepair } from "@/utils/RoleUtils";
+import { DICT_REPAIR_FAULT_TYPE, DICT_REPAIR_REQ_TYPE, getDictInfo } from "@/service/dict";
 import { formatDate } from '@/utils/DateUtils'
 const toast = useToast()
 const message = useMessage()
-
+const showSparePopup = ref(false)
+import { getSpareList } from '@/service/spare'
+import { ref } from "vue";
 const fileList = ref<[]>()
-
+const selectedPartIndex = ref(-1)
+const sparePartsList = ref([])
+const searchKeyword = ref('')
 // 鎶ヤ慨鍗曠被鍨�
 const reqTypeList = ref<any>([])
-
+// 鏁呴殰绫诲埆
+const faultList = ref<any>([])
 const repairRes = reactive<RepairResVO>({
   id: '',
   resCode: '',
@@ -158,6 +233,59 @@
   ],
 }
 
+function filterSpareParts() {
+  if (!searchKeyword.value) {
+    loadSpareParts()
+  } else {
+    loadSpareParts(searchKeyword.value)
+  }
+}
+// 澶囦欢閫夋嫨鐩稿叧閫昏緫
+function addSparePart() {
+  // if (!item.spareParts) {
+  //   item.spareParts = []
+  // }
+  repairRes.spareParts.value = []
+
+  selectSparePart()
+}
+
+function selectSparePart(item: any) {
+  showSparePopup.value = true
+
+  loadSpareParts()
+}
+
+function loadSpareParts(value?: string) {
+  getSpareList({ name: value, pageNum: 1, pageSize: 10 }).then((res: any) => {
+    sparePartsList.value = res.rows
+
+  })
+}
+
+function selectFilteredSparePart(part: any) {
+  repairRes.spareParts.value.push({
+    id: part.id,
+    name: part.name,
+    quantity: '',
+  })
+  closeSparePopup()
+}
+function addOtherSparePart() {
+  repairRes.spareParts.value.push({
+    id:  '',
+    name: '',
+    quantity: '',
+  })
+  closeSparePopup();
+}
+
+function closeSparePopup() {
+  showSparePopup.value = false
+  selectedPartIndex.value = -1
+  searchKeyword.value = ''
+}
+
 function handleFileChange({ fileList }) {}
 
 function initRepairRes(id: any) {
@@ -172,6 +300,8 @@
   initRepairRes(options.id)
   const reqList = await getDictInfo(DICT_REPAIR_REQ_TYPE)
   reqTypeList.value = reqList
+  const fList = await getDictInfo(DICT_REPAIR_FAULT_TYPE)
+  faultList.value = fList
 }
 
 function hanldeUpdateRepairRes(data: any, resolve: any) {
@@ -180,6 +310,7 @@
       resolve(true)
       toastSucces()
       uni.$emit('res-list-refresh')
+      uni.navigateBack()
     })
     .catch((res) => {
       console.error(res)
@@ -207,9 +338,7 @@
 onNavigationBarButtonTap((e) => {
   if (e.index === 0) {
     // 绠$悊鍛樿鑹�
-    if (isLeader()) {
-      toast.warning('褰撳墠鐧诲綍瑙掕壊涓嶅彲鎿嶄綔')
-    } else if (isOperatorOrRepair()) {
+    if (isRepair() || isEquAdmin()) {
       switch (repairRes.status) {
         // 宸叉帴鍗�
         case '1':
@@ -232,9 +361,7 @@
       }
     }
   } else if (e.index === 1) {
-    if (isLeader()) {
-      toast.warning('褰撳墠鐧诲綍瑙掕壊涓嶅彲鎿嶄綔')
-    } else if (isOperatorOrRepair()) {
+    if (isRepair() || isEquAdmin()) {
       switch (repairRes.status) {
         // 宸叉帴鍗�
         case '1':
diff --git a/eims-ui-mobile/src/pages/repair/res-list.vue b/eims-ui-mobile/src/pages/repair/res-list.vue
index 914a751..e782d72 100644
--- a/eims-ui-mobile/src/pages/repair/res-list.vue
+++ b/eims-ui-mobile/src/pages/repair/res-list.vue
@@ -12,177 +12,38 @@
         title="璁惧缁翠慨"
         left-arrow
         @click-left="goBack"
-        right-text="鎻愪氦"
-        @click-right="handleClickRight"
         custom-style="background: #4D80F0;"
         safeAreaInsetTop
       >
-        <template #right>
-          <text v-if="isOperatorOrRepair()" class="text-white">鎺ュ崟</text>
-        </template>
+<!--        <template #right>-->
+<!--          <text v-if="isLineOrRepair()" class="text-white">鎺ュ崟</text>-->
+<!--        </template>-->
       </wd-navbar>
-      <wd-drop-menu>
-        <wd-drop-menu-item
-          v-model="resTypeId"
-          label-key="dictLabel"
-          value-key="dictValue"
-          :options="resTypeList"
-          @change="handleResType"
-        />
-        <wd-drop-menu-item
-          v-model="filterDate"
-          :options="filterDateList"
-          @change="handleFilterDate"
-        />
-        <wd-drop-menu-item
-          v-model="status"
-          label-key="dictLabel"
-          value-key="dictValue"
-          :options="statusList"
-          @change="handleResStatu"
-        />
-      </wd-drop-menu>
+<!--      <wd-drop-menu>-->
+<!--        <wd-drop-menu-item-->
+<!--          v-model="resTypeId"-->
+<!--          label-key="dictLabel"-->
+<!--          value-key="dictValue"-->
+<!--          :options="resTypeList"-->
+<!--          @change="handleResType"-->
+<!--        />-->
+<!--        <wd-drop-menu-item-->
+<!--          v-model="filterDate"-->
+<!--          :options="filterDateList"-->
+<!--          @change="handleFilterDate"-->
+<!--        />-->
+<!--        <wd-drop-menu-item-->
+<!--          v-model="status"-->
+<!--          label-key="dictLabel"-->
+<!--          value-key="dictValue"-->
+<!--          :options="statusList"-->
+<!--          @change="handleResStatu"-->
+<!--        />-->
+<!--      </wd-drop-menu>-->
     </template>
 
     <view class="bg-base">
-      <wd-card type="rectangle" v-for="(item, index) in dataList" :key="item.id">
-        <template #title>
-          <view class="flex justify-between items-center">
-            <view class="flex items-center menu-title-box">
-              <view class="menu-indicator"></view>
-              <text class="ml-1 text-sm">{{ item.resCode }}</text>
-              <text class="text-color-gray ml-2 text-mini">鎺ュ崟:{{ item.createTime }}</text>
-            </view>
-
-            <view>
-              <wd-tag size="small" v-if="item.status === '1'" type="warning">宸叉帴鍗�</wd-tag>
-              <wd-tag size="small" v-else-if="item.status === '2'" type="primary">缁翠慨涓�</wd-tag>
-              <wd-tag size="small" v-else-if="item.status === '3'" type="success">宸插畬鎴�</wd-tag>
-            </view>
-          </view>
-        </template>
-        <view class="flex h-[240rpx] items-center">
-          <image
-            v-if="item.reqType === '1'"
-            class="slot-img text-center"
-            src="/static/ico/ico-huiyi.png"
-          />
-          <image
-            v-else-if="item.reqType === '2'"
-            class="slot-img text-center"
-            src="/static/ico/ico-setting.png"
-          />
-          <image
-            v-else-if="item.reqType === '3'"
-            class="slot-img text-center"
-            src="/static/ico/ico-faxian.png"
-          />
-          <view class="flex-1 mt-1">
-            <view class="text-color-base">
-              <template v-if="item.reqType === '1'">
-                <text>璁惧绫诲瀷</text>
-                <text class="mx-2">|</text>
-                <text>{{ item.equName }}</text>
-              </template>
-
-              <template v-if="item.reqType === '2'">
-                <text>宸ュ叿绫诲瀷</text>
-                <text class="mx-2">|</text>
-                <text>{{ item.fixtureName }}</text>
-              </template>
-
-              <template v-if="item.reqType === '3'">
-                <text>鍏朵粬绫诲瀷</text>
-              </template>
-              <view class="text-color-gray mt-1 text-mini">
-                <text>鎶ヤ慨浜�: {{ item.reqUserName }}</text>
-              </view>
-              <view class="text-color-gray mt-1 text-mini">
-                <text>鎶ヤ慨鏃堕棿: {{ item.reqTime }}</text>
-              </view>
-
-              <view class="text-color-gray mt-1 text-mini">
-                <text>缁翠慨寮�濮�: {{ item.startTime }}</text>
-              </view>
-              <view class="text-color-gray mt-1 text-mini">
-                <text>缁翠慨缁撴潫: {{ item.endTime }}</text>
-              </view>
-              <view class="text-color-gray mt-1 text-mini">
-                <text>缁翠慨浜�: {{ item.resUserName }}</text>
-              </view>
-            </view>
-          </view>
-          <view>
-            <!--鎿嶄綔宸ユ垨缁翠慨宸ヨ鑹�-->
-            <template v-if="isOperatorOrRepair()">
-              <wd-button
-                v-if="item.status === '1'"
-                size="small"
-                icon="edit-outline"
-                @click.stop="handleStartRepair(item)"
-              >
-                寮�濮嬬淮淇�
-              </wd-button>
-              <wd-button
-                v-else-if="item.status === '2'"
-                size="small"
-                icon="edit-outline"
-                @click.stop="itemClick(item)"
-              >
-                缁翠慨涓�
-              </wd-button>
-              <view class="h-full flex flex-col" v-else-if="item.status === '3'">
-                <wd-button size="small" icon="warn-bold" @click.stop="itemClick(item)">
-                  璇︽儏
-                </wd-button>
-                <wd-button
-                  class="mt-4"
-                  size="small"
-                  icon="edit-outline"
-                  @click.stop="goToFeedBack(item)"
-                >
-                  鏌ョ湅璇勪环
-                </wd-button>
-              </view>
-            </template>
-
-            <!--绠$悊鍛樿鑹�-->
-            <template v-else-if="isLeader()">
-              <wd-button
-                v-if="item.status === '1'"
-                size="small"
-                icon="warn-bold"
-                disabled
-                @click.stop="itemClick(item)"
-              >
-                寰呯淮淇�
-              </wd-button>
-              <wd-button
-                v-else-if="item.status === '2'"
-                size="small"
-                icon="warn-bold"
-                disabled
-                @click.stop="itemClick(item)"
-              >
-                缁翠慨涓�
-              </wd-button>
-              <view class="h-full flex flex-col" v-else-if="item.status === '3'">
-                <wd-button size="small" icon="warn-bold" @click.stop="itemClick(item)">
-                  璇︽儏
-                </wd-button>
-                <wd-button
-                  class="mt-4"
-                  size="small"
-                  icon="edit-outline"
-                  @click.stop="goToFeedBack(item)"
-                >
-                  {{ item.fbId == null ? '鍐欒瘎浠�' : '鏌ョ湅璇勪环' }}
-                </wd-button>
-              </view>
-            </template>
-          </view>
-        </view>
-      </wd-card>
+      <res-card v-for="(item, index) in dataList" :key="item.id" :item="item" @click="handleResClick" />
     </view>
   </z-paging>
 </template>
@@ -192,10 +53,11 @@
 import { useToast, useMessage } from 'wot-design-uni'
 import { getRepairResList, addRepairRes, updateRepairRes } from '@/service/repair'
 import { DICT_REPAIR_RES_STATUS, DICT_REPAIR_REQ_TYPE, getDictInfo } from '@/service/dict'
-import { isLeader, isOperatorOrRepair } from '@/utils/RoleUtils'
+import { isLeader, isLineOrRepair, isRepair } from "@/utils/RoleUtils";
 import { useUserStore } from '@/store'
 import { formatDate } from '@/utils/DateUtils'
 import dayjs from "dayjs";
+import ResCard from "@/components/repair/res-card.vue";
 const userStore = useUserStore()
 
 const message = useMessage()
@@ -232,15 +94,15 @@
 ])
 const resTypeList = ref<any>([{ dictLabel: '鎵�鏈夌被鍨�', dictValue: -1 }])
 const statusList = ref<any>([{ dictLabel: '鎵�鏈夌姸鎬�', dictValue: -1 }])
-function handleResType({ value }) {
-  reloadData()
-}
-function handleResStatu({ value }) {
-  reloadData()
-}
-function handleFilterDate({ value }) {
-  reloadData()
-}
+// function handleResType({ value }) {
+//   reloadData()
+// }
+// function handleResStatu({ value }) {
+//   reloadData()
+// }
+// function handleFilterDate({ value }) {
+//   reloadData()
+// }
 
 const paging = ref(null)
 const dataList = ref([])
@@ -249,35 +111,44 @@
   const queryParams: any = {
     pageNum,
     pageSize,
-    reqType: resTypeId.value,
-    status: status.value,
+    params: {},
+    // reqType: resTypeId.value,
+    // status: status.value,
   }
-  if (resTypeId.value === -1) {
-    delete queryParams.reqType
-  }
-  if (status.value === -1) {
-    delete queryParams.status
-  }
-
-  if (filterDate.value === '1') {
-    // 鑾峰彇褰撳墠鏃ユ湡
-    const now = dayjs()
-    queryParams.params = {
-      beginReqTime: now.startOf('day').format('YYYY-MM-DD 00:00:00'),
-      endReqTime: now.endOf('day').format('YYYY-MM-DD 23:59:59'),
-    }
-  } else if (filterDate.value === '2') {
-    const now = dayjs()
-    queryParams.params = {
-      beginReqTime: now.startOf('month').format('YYYY-MM-DD 00:00:00'),
-      endReqTime: now.endOf('month').format('YYYY-MM-DD 23:59:59'),
-    }
-  } else {
-    delete queryParams.params
-  }
+  // if (resTypeId.value === -1) {
+  //   delete queryParams.reqType
+  // }
+  // if (status.value === -1) {
+  //   delete queryParams.status
+  // }
+  //
+  // if (filterDate.value === '1') {
+  //   // 鑾峰彇褰撳墠鏃ユ湡
+  //   const now = dayjs()
+  //   queryParams.params = {
+  //     beginReqTime: now.startOf('day').format('YYYY-MM-DD 00:00:00'),
+  //     endReqTime: now.endOf('day').format('YYYY-MM-DD 23:59:59'),
+  //   }
+  // } else if (filterDate.value === '2') {
+  //   const now = dayjs()
+  //   queryParams.params = {
+  //     beginReqTime: now.startOf('month').format('YYYY-MM-DD 00:00:00'),
+  //     endReqTime: now.endOf('month').format('YYYY-MM-DD 23:59:59'),
+  //   }
+  // } else {
+  //   delete queryParams.params
+  // }
   // 濡傛灉鏄粠鎵爜椤甸潰杩囨潵锛屽彧鑳芥煡璇㈠浐瀹氳澶囩殑鏁版嵁
   if (option?.from === 'scan') {
     queryParams.assetNo = option.assetNo
+  }
+  queryParams.params.status = '0,1,2,3'
+  queryParams.reqUser = userStore?.userInfo?.userId
+  if (isRepair()) {
+    queryParams.params.status = null
+    queryParams.resUser = userStore?.userInfo?.userId
+    delete queryParams.reqUser
+    delete queryParams.params
   }
   getRepairResList(queryParams)
     .then((res: any) => {
@@ -291,128 +162,128 @@
   paging.value.reload()
 }
 
-/**
- * 鏉$洰鐐瑰嚮浜嬩欢
- * @param item
- */
-function itemClick(item: any) {
-  goToDetail(item)
-}
-
-/**
- * 寮�濮嬬淮淇�
- * @param item
- */
-function handleStartRepair(item: any) {
-  // 纭寮�濮嬩慨鏀圭姸鎬佷负2-缁翠慨涓�
-  const data = Object.assign({}, item)
-  // 纭寮�濮嬩慨鏀圭姸鎬佷负2-缁翠慨涓�
-  data.status = '2'
-  // 璁剧疆寮�濮嬬淮淇椂闂�
-  data.startTime = formatDate(new Date())
-  message
-    .confirm({
-      msg: '纭畾寮�濮嬬淮淇紵',
-      title: '鎻愮ず',
-      beforeConfirm: ({ resolve }) => {
-        updateRepair(data, resolve)
-      },
-    })
-    .then(() => {})
-    .catch((error) => {
-      console.log(error)
-    })
-}
-
-/**
- * 鏇存柊缁翠慨宸ュ崟
- * @param data
- * @param resolve
- */
-function updateRepair(data: any, resolve: any) {
-  updateRepairRes(data)
-    .then((res: any) => {
-      resolve(true)
-      if (res?.code === 200) {
-        reloadData()
-        // 缁翠慨涓姸鎬佹墠闇�瑕佽烦杞�
-        if (data?.status === '2') {
-          goToDetail(data)
-        }
-      }
-    })
-    .catch((res) => {
-      console.error(res)
-    })
-}
-
-function goToDetail(item) {
-  uni.navigateTo({
-    url: `/pages/repair/res-detail?id=${item.id}`,
-  })
-}
-
-function goToFeedBack(item) {
-  uni.navigateTo({
-    url: `/pages/repair/repair-fb?id=${item.id}`,
-  })
-}
+// /**
+//  * 鏉$洰鐐瑰嚮浜嬩欢
+//  * @param item
+//  */
+// function itemClick(item: any) {
+//   goToDetail(item)
+// }
+//
+// /**
+//  * 寮�濮嬬淮淇�
+//  * @param item
+//  */
+// function handleStartRepair(item: any) {
+//   // 纭寮�濮嬩慨鏀圭姸鎬佷负2-缁翠慨涓�
+//   const data = Object.assign({}, item)
+//   // 纭寮�濮嬩慨鏀圭姸鎬佷负2-缁翠慨涓�
+//   data.status = '2'
+//   // 璁剧疆寮�濮嬬淮淇椂闂�
+//   data.startTime = formatDate(new Date())
+//   message
+//     .confirm({
+//       msg: '纭畾寮�濮嬬淮淇紵',
+//       title: '鎻愮ず',
+//       beforeConfirm: ({ resolve }) => {
+//         updateRepair(data, resolve)
+//       },
+//     })
+//     .then(() => {})
+//     .catch((error) => {
+//       console.log(error)
+//     })
+// }
+//
+// /**
+//  * 鏇存柊缁翠慨宸ュ崟
+//  * @param data
+//  * @param resolve
+//  */
+// function updateRepair(data: any, resolve: any) {
+//   updateRepairRes(data)
+//     .then((res: any) => {
+//       resolve(true)
+//       if (res?.code === 200) {
+//         reloadData()
+//         // 缁翠慨涓姸鎬佹墠闇�瑕佽烦杞�
+//         if (data?.status === '2') {
+//           goToDetail(data)
+//         }
+//       }
+//     })
+//     .catch((res) => {
+//       console.error(res)
+//     })
+// }
+//
+// function goToDetail(item) {
+//   uni.navigateTo({
+//     url: `/pages/repair/res-detail?id=${item.id}`,
+//   })
+// }
+//
+// function goToFeedBack(item) {
+//   uni.navigateTo({
+//     url: `/pages/repair/repair-fb?id=${item.id}`,
+//   })
+// }
 const goBack = () => {
   uni.navigateBack()
 }
-function handleClickRight() {
-  if (isLeader()) {
-    toast.info('璇风櫥褰曠淮淇伐璐﹀彿鎺ュ崟')
-  } else if (isOperatorOrRepair()) {
-    handleSelectReq()
-  }
-}
+// function handleClickRight() {
+//   if (isLineOrRepair()) {
+//     handleSelectReq()
+//   } else {
+//     toast.info('璇风櫥褰曟姤淇伐璐﹀彿鎺ュ崟')
+//   }
+// }
 
-
-/**
- * 閫夋嫨鎶ヤ慨鍗�
- */
-function handleSelectReq() {
-  uni.navigateTo({
-    url: '/pages/repair/req-list',
-    events: {
-      // 涓烘寚瀹氫簨浠舵坊鍔犱竴涓洃鍚櫒锛岃幏鍙栬鎵撳紑椤甸潰浼犻�佸埌褰撳墠椤甸潰鐨勬暟鎹�
-      selectReq: function (data) {
-        console.error(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,
-        }
-        addRepairRes(resData)
-          .then((res: any) => {
-            if (res.code === 200) {
-              toast.success(res?.msg || '鎿嶄綔鎴愬姛')
-              reloadData()
-            } else {
-              toast.error(res?.msg || '鐢熸垚缁翠慨宸ュ崟澶辫触锛岃閲嶈瘯')
-            }
-          })
-          .catch((res) => {
-            toast.error(res?.msg || '鐢熸垚缁翠慨宸ュ崟澶辫触锛岃閲嶈瘯')
-          })
-      },
-    },
-    success: function (res) {
-      // 閫氳繃eventChannel鍚戣鎵撳紑椤甸潰浼犻�佹暟鎹�
-      res.eventChannel.emit('OnSelectReq', { data: '缁翠慨鍗曢〉闈㈤�夋嫨鎶ヤ慨鍗�' })
-    },
-  })
-}
+//
+// /**
+//  * 閫夋嫨鎶ヤ慨鍗�
+//  */
+// function handleSelectReq() {
+//   uni.navigateTo({
+//     url: '/pages/repair/req-list',
+//     events: {
+//       // 涓烘寚瀹氫簨浠舵坊鍔犱竴涓洃鍚櫒锛岃幏鍙栬鎵撳紑椤甸潰浼犻�佸埌褰撳墠椤甸潰鐨勬暟鎹�
+//       selectReq: function (data) {
+//         console.error(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,
+//         }
+//         addRepairRes(resData)
+//           .then((res: any) => {
+//             if (res.code === 200) {
+//               toast.success(res?.msg || '鎿嶄綔鎴愬姛')
+//               reloadData()
+//             } else {
+//               toast.error(res?.msg || '鐢熸垚缁翠慨宸ュ崟澶辫触锛岃閲嶈瘯')
+//             }
+//           })
+//           .catch((res) => {
+//             toast.error(res?.msg || '鐢熸垚缁翠慨宸ュ崟澶辫触锛岃閲嶈瘯')
+//           })
+//       },
+//     },
+//     success: function (res) {
+//       // 閫氳繃eventChannel鍚戣鎵撳紑椤甸潰浼犻�佹暟鎹�
+//       res.eventChannel.emit('OnSelectReq', { data: '缁翠慨鍗曢〉闈㈤�夋嫨鎶ヤ慨鍗�' })
+//     },
+//   })
+// }
 
 async function initData() {
   const rList: any = await getDictInfo(DICT_REPAIR_REQ_TYPE)
@@ -423,10 +294,10 @@
 onLoad((options) => {
   Object.assign(option, options)
   initData()
-  uni.$on('res-list-refresh', reloadData)
+  uni.$on('list-refresh', reloadData)
 })
 onUnload(() => {
-  uni.$off('res-list-refresh', reloadData)
+  uni.$off('list-refresh', reloadData)
 })
 </script>
 
diff --git a/eims-ui-mobile/src/pages/scan/index.vue b/eims-ui-mobile/src/pages/scan/index.vue
index b9ccad5..eecf651 100644
--- a/eims-ui-mobile/src/pages/scan/index.vue
+++ b/eims-ui-mobile/src/pages/scan/index.vue
@@ -57,10 +57,44 @@
         <view class="h-[1px] bg-base"></view>
         <view class="bg-white flex justify-around py-4">
           <wd-button icon="edit-outline" @click.stop="handleInsp">鐐规</wd-button>
-          <wd-button icon="laptop" @click.stop="handMaint">淇濆吇</wd-button>
-          <wd-button icon="tools" @click.stop="showActions">缁翠慨</wd-button>
+          <wd-button icon="laptop" v-if="isRepair() || isLeader()" @click.stop="handMaint">
+            淇濆吇
+          </wd-button>
+          <wd-button icon="laptop" @click.stop="handleRequest">鎶ヤ慨</wd-button>
+          <!--          <wd-button icon="tools" @click.stop="showActions">缁翠慨</wd-button>-->
         </view>
       </view>
+      <view class="h-[10px] bg-base"></view>
+      <wd-tabs v-model="tab">
+
+        <wd-tab title="缁翠慨璇锋眰">
+          <view class="h-[10px] bg-base"></view>
+          <!-- 缁翠慨璇锋眰鍖哄煙 -->
+          <view class="mt-2" v-if="reqList.length > 0">
+
+
+            <view class="bg-base">
+              <req-card
+                v-for="item in reqList"
+                :key="item.id"
+                :item="item"
+                @click="handleReqClick"
+              />
+            </view>
+          </view>
+        </wd-tab>
+        <wd-tab title="缁翠慨鍗�">
+          <view class="h-[10px] bg-base"></view>
+          <!-- 缁翠慨鍗曞尯鍩� -->
+          <view class="mt-2" v-if="resList.length > 0">
+
+
+            <view class="bg-base">
+              <res-card v-for="item in resList" :key="item.id" :item="item" />
+            </view>
+          </view>
+        </wd-tab>
+      </wd-tabs>
 
       <wd-action-sheet
         v-model="show"
@@ -79,16 +113,25 @@
 <script setup lang="ts">
 import dayjs from 'dayjs'
 import type { EquVO } from '@/service/equ.d'
+import type { RepairReqVO, RepairResVO } from '@/service/repair.d'
 import { useToast, useMessage } from 'wot-design-uni'
 import { getEquByAssetNo } from '@/service/equ'
 import { getInspStByStId } from '@/service/inspect'
+import { isLeader, isRepair } from '@/utils/RoleUtils'
+import { getRepairReqList, getRepairResList } from '@/service/repair'
+import ReqCard from '@/components/repair/req-card.vue'
+import ResCard from '@/components/repair/res-card.vue'
+import { useUserStore } from '@/store'
+const tab = ref<number>(0)
 const message = useMessage()
 const toast = useToast()
 const model = reactive<EquVO>({})
-
+const userStore = useUserStore()
 const scanResult = ref<string>('')
 const show = ref<boolean>(false)
 const exist = ref<boolean>(false)
+const reqList = ref<RepairReqVO[]>([])
+const resList = ref<RepairResVO[]>([])
 const actions = ref([
   {
     name: '鏂板鎶ヤ慨',
@@ -105,6 +148,8 @@
       if (res?.equId) {
         exist.value = true
         Object.assign(model, res)
+        // 鍔犺浇缁翠慨璇锋眰鍜岀淮淇崟鏁版嵁
+        loadRepairData(res.equId)
       } else {
         toast.error('鏈煡璇㈠埌璇ヨ祫浜х紪鍙风浉鍏虫暟鎹紒')
       }
@@ -114,6 +159,38 @@
       toast.error(res?.data?.msg || '璇锋眰澶辫触')
     })
 }
+
+// 鍔犺浇缁翠慨璇锋眰鍜岀淮淇崟鏁版嵁
+function loadRepairData(equId: string | number) {
+  // 鍔犺浇鏈帴鍗曠殑缁翠慨璇锋眰
+  getRepairReqList({
+    equId,
+    status: '0',
+  }).then((res: any) => {
+    if (res?.rows) {
+      reqList.value = res.rows
+    }
+  })
+
+  // 鍔犺浇鏈畬鎴愮殑缁翠慨鍗�
+  const params = {
+    equId,
+    params: {
+      status: '0,1,2',
+    },
+  }
+  // 濡傛灉鏄淮淇伐鍒欏姞杞芥湰瑕佹帴鍗曠殑缁翠慨鍗�
+  if (isRepair()) {
+    params.resUser = userStore?.userInfo?.userId
+    params.params.status = '0,1,2'
+  }
+  getRepairResList(params).then((res: any) => {
+    if (res?.rows) {
+      resList.value = res.rows
+    }
+  })
+}
+
 function handleInfo() {
   uni.showToast({
     title: '鍔熻兘寮�鍙戜腑',
@@ -152,6 +229,19 @@
   })
 }
 
+function handleRequest() {
+  if (!model?.assetNo) {
+    uni.showToast({
+      title: '鏈煡璇㈠埌璁惧锛岃鑱旂郴绠$悊鍛橈紒',
+      icon: 'none',
+    })
+    return false
+  }
+  uni.navigateTo({
+    url: `/pages/repair/repair-add?equId=${model?.equId}&equName=${model?.equName}&from=scan`,
+  })
+}
+
 function showActions() {
   show.value = true
 }
@@ -159,6 +249,7 @@
 function close() {
   show.value = false
 }
+
 function select({ item, index }) {
   console.error(model?.equId)
   console.error(!model?.equId)
@@ -182,10 +273,29 @@
       break
   }
 }
+;`/pages/repair/req-list`,
+  // 澶勭悊缁翠慨璇锋眰鐐瑰嚮浜嬩欢
+  function handleReqClick(item) {
+    uni.navigateTo({
+      url: `/pages/repair/req-detail?id=${item.id}`,
+    })
+  }
+
+// // 澶勭悊缁翠慨鍗曠偣鍑讳簨浠�
+// function handleResClick(item) {
+//   uni.navigateTo({
+//     url: `/pages/repair/res-detail?id=${item.id}`,
+//   })
+// }
+
 onLoad((options) => {
+  uni.$on('list-refresh', loadRepairData)
   scanResult.value = options?.result
   initData(options?.result)
 })
+onUnload(() => {
+  uni.$off('list-refresh', loadRepairData)
+})
 </script>
 
 <style scoped lang="scss">
diff --git a/eims-ui-mobile/src/types/uni-pages.d.ts b/eims-ui-mobile/src/types/uni-pages.d.ts
index d3446bb..68e1709 100644
--- a/eims-ui-mobile/src/types/uni-pages.d.ts
+++ b/eims-ui-mobile/src/types/uni-pages.d.ts
@@ -18,6 +18,7 @@
        "/pages/my/index" |
        "/pages/repair/repair-add" |
        "/pages/repair/repair-fb" |
+       "/pages/repair/req-detail" |
        "/pages/repair/req-list" |
        "/pages/repair/res-detail" |
        "/pages/repair/res-list" |
diff --git a/eims-ui-mobile/src/utils/RoleUtils.ts b/eims-ui-mobile/src/utils/RoleUtils.ts
index 027a6fb..b111052 100644
--- a/eims-ui-mobile/src/utils/RoleUtils.ts
+++ b/eims-ui-mobile/src/utils/RoleUtils.ts
@@ -23,12 +23,42 @@
 export const ROLE_REPAIR = 'repair'
 
 /**
+ * 璁惧绠$悊鍛�
+ */
+export const ROLE_EQU_ADMIN = 'equadmin'
+
+/**
  * 鐧诲綍瑙掕壊鏄搷浣滃伐鎴栫淮淇伐
  */
-export const isOperatorOrRepair = () => {
-  // const roles = useUserStore()?.userInfo?.roles || []
-  // return roles.includes(ROLE_OPERATOR) || roles.includes(ROLE_REPAIR)
-  return true
+export const isLineOrRepair = () => {
+  const roles = useUserStore()?.userInfo?.roles || []
+  return roles.includes(ROLE_LINE) || roles.includes(ROLE_REPAIR)
+}
+
+
+export const isOperator = () => {
+  const roles = useUserStore()?.userInfo?.roles || []
+  return roles.includes(ROLE_OPERATOR)
+}
+
+export const isRepair = () => {
+  const roles = useUserStore()?.userInfo?.roles || []
+  return roles.includes(ROLE_REPAIR)
+}
+
+export const isLine = () => {
+  const roles = useUserStore()?.userInfo?.roles || []
+  return roles.includes(ROLE_LINE)
+}
+
+export const isSuperAdmin = () => {
+  const roles = useUserStore()?.userInfo?.roles || []
+  return roles.includes(ROLE_SUPER_ADMIN)
+}
+
+export const isEquAdmin = () => {
+  const roles = useUserStore()?.userInfo?.roles || []
+  return roles.includes(ROLE_EQU_ADMIN)
 }
 
 /**
@@ -37,7 +67,7 @@
 export const isLeader = () => {
   const roles = useUserStore()?.userInfo?.roles || []
   return (
-    roles.includes(ROLE_LINE) || roles.includes(ROLE_SUPER_ADMIN) || roles.includes(ROLE_LEADER)
+    roles.includes(ROLE_SUPER_ADMIN) || roles.includes(ROLE_EQU_ADMIN) || roles.includes(ROLE_LEADER)
   )
 }
 
@@ -58,4 +88,7 @@
   if (roles.includes(ROLE_REPAIR)) {
     return '缁翠慨宸�'
   }
+  if (roles.includes(ROLE_EQU_ADMIN)) {
+    return '璁惧绠$悊鍛�'
+  }
 }
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 e1f3e62..5f28d05 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
@@ -94,6 +94,11 @@
          * 瀹屾垚
          */
         String WANCHENG = "3";
+
+        /**
+         * 璇勪环
+         */
+        String PINGJIA = "4";
     }
 
     /**
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/EimsRepairRes.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/EimsRepairRes.java
index b1f1899..b2eb041 100644
--- a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/EimsRepairRes.java
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/EimsRepairRes.java
@@ -106,5 +106,7 @@
      */
     private Long fbId;
 
+    private String faultType;
+
 
 }
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsInspectPlanBo.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsInspectPlanBo.java
index 6e2d184..3c188d7 100644
--- a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsInspectPlanBo.java
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsInspectPlanBo.java
@@ -59,7 +59,7 @@
     /**
      * 鐐规鍛ㄦ湡
      */
-    @NotNull(message = "鐐规鍛ㄦ湡涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+//    @NotNull(message = "鐐规鍛ㄦ湡涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
     private Long inspCycle;
 
     /**
@@ -75,7 +75,7 @@
     /**
      * 鐐规浜�
      */
-    @NotNull(message = "鐐规浜轰笉鑳戒负绌�", groups = { AddGroup.class, EditGroup.class })
+//    @NotNull(message = "鐐规浜轰笉鑳戒负绌�", groups = { AddGroup.class, EditGroup.class })
     private Long inspUser;
 
     /**
@@ -104,7 +104,7 @@
     /**
      * 涓嬫鎵ц鏃堕棿
      */
-    @NotNull(message = "涓嬫鎵ц鏃堕棿涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+//    @NotNull(message = "涓嬫鎵ц鏃堕棿涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
     @JsonFormat(pattern = "yyyy-MM-dd")
     private Date inspNextTime;
 
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsRepairReqBo.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsRepairReqBo.java
index 2e62264..7ae188b 100644
--- a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsRepairReqBo.java
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsRepairReqBo.java
@@ -115,5 +115,7 @@
      */
     private String remark;
 
+    private String statusLt;
+
 
 }
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsRepairResBo.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsRepairResBo.java
index 23d9ed1..c800bf5 100644
--- a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsRepairResBo.java
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsRepairResBo.java
@@ -10,6 +10,8 @@
 import lombok.EqualsAndHashCode;
 import jakarta.validation.constraints.*;
 import java.util.Date;
+import java.util.List;
+
 import com.fasterxml.jackson.annotation.JsonFormat;
 
 /**
@@ -119,6 +121,12 @@
     private  String assetNo;//璁惧璧勪骇缂栧彿
 
 
+    private Long equId;
+
+
+    private String statusLt;
+
+    private List<EimsSpareBo> spareParts;
 
 
 
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsRepairResVo.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsRepairResVo.java
index aec73bf..054655c 100644
--- a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsRepairResVo.java
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsRepairResVo.java
@@ -16,7 +16,7 @@
 import java.io.Serial;
 import java.io.Serializable;
 import java.util.Date;
-
+import java.util.List;
 
 
 /**
@@ -149,6 +149,7 @@
     @Translation(type = TransConstant.REPAIR_REQ_ID_TO_CODE, mapper = "reqId")
     private String reqCode;//鎶ヤ慨缂栫爜
 
+    private List<EimsSpareVo> spareParts;
 
 
 }
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsInspectStServiceImpl.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsInspectStServiceImpl.java
index 0f7a628..4578011 100644
--- a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsInspectStServiceImpl.java
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsInspectStServiceImpl.java
@@ -256,6 +256,7 @@
         qw.eq(bo.getInspUser() != null, "st.maint_user", bo.getInspUser());
         qw.eq(bo.getVerifyUser() != null, "st.verify_user", bo.getVerifyUser());
         qw.eq(bo.getStatus() != null, "st.status", bo.getStatus());
+        qw.eq(bo.getUpdateBy() != null, "st.update_by", bo.getUpdateBy());
         qw.orderByDesc( "st.create_time");
         return qw;
     }
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsRepairFbServiceImpl.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsRepairFbServiceImpl.java
index de5fb8a..94b53e8 100644
--- a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsRepairFbServiceImpl.java
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsRepairFbServiceImpl.java
@@ -1,5 +1,6 @@
 package org.dromara.eims.service.impl;
 
+import org.dromara.common.core.constant.DictConstants;
 import org.dromara.common.core.service.RepairResService;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.StringUtils;
@@ -103,6 +104,7 @@
             bo.setId(add.getId());
             //鏂板鏃舵洿鏂皉epair_res琛ㄨ瘎浠穒d
             EimsRepairRes eimsRepairRes = repairResMapper.selectById(bo.getResId());
+            eimsRepairRes.setStatus(DictConstants.REPAIR_RES_STATUS_DETAIL.PINGJIA);
             eimsRepairRes.setFbId(add.getId());
             repairResMapper.updateById(eimsRepairRes);
         }
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsRepairReqServiceImpl.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsRepairReqServiceImpl.java
index 4e95350..7f17f4c 100644
--- a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsRepairReqServiceImpl.java
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsRepairReqServiceImpl.java
@@ -95,11 +95,13 @@
         qw.eq(bo.getRepairUser() != null, "a.repair_user", bo.getRepairUser());
         qw.eq(StringUtils.isNotBlank(bo.getFaultType()), "a,fault_type", bo.getFaultType());
         qw.in(params.containsKey("createBy"), "a.create_by",  (List<Long>) params.get("createBy"));
-        qw.eq(params.containsKey("status"), "a.status", params.get("status"));
+        Object status = params.get("status") == null ? "" : params.get("status");
+
+        String[] split = status.toString().split(",");
+        qw.in(params.containsKey("status"), "a.status", split);
         qw.between(params.get("beginReqTime") != null && params.get("endReqTime") != null,
             "a.req_time", params.get("beginReqTime"), params.get("endReqTime"));
-
-
+        qw.ne(StringUtils.isNotBlank(bo.getStatusLt()), "a.status", bo.getStatusLt());
         qw.eq(bo.getCreateBy()!=null, "a.create_by", bo.getCreateBy());
         qw.eq(StringUtils.isNotEmpty(bo.getStatus()), "a.status", bo.getStatus());
         qw.orderByDesc("a.create_time");
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsRepairResServiceImpl.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsRepairResServiceImpl.java
index ffdb5d5..d37a7ba 100644
--- a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsRepairResServiceImpl.java
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsRepairResServiceImpl.java
@@ -7,6 +7,7 @@
 import org.dromara.common.core.constant.DictConstants;
 import org.dromara.common.core.domain.model.LoginUser;
 import org.dromara.common.core.service.RepairResService;
+import org.dromara.common.core.utils.DateUtils;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.SpringUtils;
 import org.dromara.common.core.utils.StringUtils;
@@ -18,10 +19,10 @@
 import lombok.RequiredArgsConstructor;
 import org.dromara.common.satoken.utils.LoginHelper;
 import org.dromara.eims.domain.*;
-import org.dromara.eims.domain.vo.EimsEquVo;
-import org.dromara.eims.domain.vo.EimsFixtureVo;
-import org.dromara.eims.domain.vo.EimsRepairReqVo;
+import org.dromara.eims.domain.bo.EimsSpareInoutBo;
+import org.dromara.eims.domain.vo.*;
 import org.dromara.eims.mapper.*;
+import org.dromara.eims.service.IEimsSpareInoutService;
 import org.dromara.eims.utils.DataFilterUtil;
 import org.dromara.system.domain.SysDept;
 import org.dromara.system.domain.vo.SysDeptVo;
@@ -29,7 +30,6 @@
 import org.redisson.misc.LogHelper;
 import org.springframework.stereotype.Service;
 import org.dromara.eims.domain.bo.EimsRepairResBo;
-import org.dromara.eims.domain.vo.EimsRepairResVo;
 import org.dromara.eims.service.IEimsRepairResService;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -51,6 +51,7 @@
     private final EimsRepairRecordMapper recordMapper;
     private final EimsEquMapper equMapper;
     private final EimsFixtureMapper fixtureMapper;
+    private final IEimsSpareInoutService spareInoutService;
 
     /**
      * 鏌ヨ缁翠慨宸ュ崟
@@ -66,6 +67,7 @@
             EimsRepairReqVo reqVo = reqMapper.selectVoById(reqId);
             resVo.setReqType(reqVo.getReqType());
             resVo.setReqCode(reqVo.getCode());
+            resVo.setReqDesc(reqVo.getReqDesc());
 
             if(reqVo.getEquId()!=null){
                 EimsEquVo equVo = equMapper.selectVoById(reqVo.getEquId());
@@ -83,9 +85,25 @@
                 }
             }
 
+            resVo.setSpareParts(querySpareParts(resVo.getResCode()));
 
         }
         return resVo;
+    }
+
+
+    public List<EimsSpareVo> querySpareParts(String code) {
+        // 鏌ヨ鍏宠仈鐨勫浠讹紝鍏崇郴濡備笅锛氬浠跺嚭鍏ュ簱鍗曠殑associatedOrder 鍏宠仈浼犲叆鐨刢ode,澶囦欢鍑哄叆搴撴槑缁嗛�氳繃鍑哄叆搴撳崟鐨刬d鍏宠仈锛屽浠跺悕绉伴�氳繃鍑哄叆搴撴槑缁嗕腑鐨剆pareId鍏宠仈
+
+        EimsSpareInoutBo bo = new EimsSpareInoutBo();
+        bo.setAssociatedOrder(code);
+        List<EimsSpareInoutVo> list = spareInoutService.queryList(bo);
+        if (!list.isEmpty()) {
+            // 鏌ヨ澶囦欢鏄庣粏鍜屽悕绉�
+            EimsSpareInoutVo eimsSpareInoutVo = spareInoutService.queryById(list.get(0).getId());
+            return eimsSpareInoutVo.getSpareList();
+        }
+        return List.of();
     }
 
     /**
@@ -261,6 +279,23 @@
             recordMapper.insert(record);
         }
         validEntityBeforeSave(update);
+        // 鍒ゆ柇澶囦欢鍒楄〃鏄惁涓虹┖锛屼笉涓虹┖鍒欐柊澧炰竴涓浠跺嚭搴撳崟锛屽悓鏃跺鍔犲嚭搴撴槑缁�
+        if (bo.getSpareParts() != null && bo.getSpareParts().size() > 0) {
+            EimsSpareInoutBo spareInoutBo = new EimsSpareInoutBo();
+            // 鏍规嵁鏃ユ湡鐢熸垚鍗曞彿锛屾牸寮忎负CK+鏃ユ湡+娴佹按鍙�
+            spareInoutBo.setOrderCode("CK"+ DateUtils.dateTimeNow("yyyyMMddHHmmss"));
+            spareInoutBo.setOrderTime(new Date());
+            spareInoutBo.setType(DictConstants.SPARE_INOUT_TYPE_DETAIL.CK);
+            spareInoutBo.setPartnerName(loginUser.getNickname());
+            spareInoutBo.setSpareList(bo.getSpareParts());
+            spareInoutBo.setChargeUser(loginUser.getUserId());
+            spareInoutBo.setChargeDept(loginUser.getDeptId());
+            spareInoutBo.setAssociatedOrder(bo.getResCode());
+            // 淇濆瓨杩涙暟鎹簱
+            Boolean b = spareInoutService.insertByBo(spareInoutBo);
+
+
+        }
         return baseMapper.updateById(update) > 0;
     }
 
@@ -302,6 +337,7 @@
         qw.eq(bo.getReqType() != null, "req.req_type", bo.getReqType());
         qw.eq(bo.getReqUser() != null, "res.req_user", bo.getReqUser());
         qw.eq(bo.getAssetNo() != null, "equ.asset_no", bo.getAssetNo());
+        qw.eq(bo.getEquId() != null, "req.equ_id", bo.getEquId());
 
         qw.between(params.get("beginReqTime") != null && params.get("endReqTime") != null,
             "req.req_time", params.get("beginReqTime"), params.get("endReqTime"));
@@ -314,6 +350,9 @@
 
 
         qw.eq(StringUtils.isNotBlank(bo.getStatus()), "res.status", bo.getStatus());
+        String s = params.get("status") == null ? "" : params.get("status").toString();
+        String[] status = s.split(",");
+        qw.in(params.get("status") != null, "res.status", status);
         qw.orderByDesc("res.create_time");
         return qw;
     }

--
Gitblit v1.9.3