From 14e880475bdc908c1ce670a1a5e892347d636562 Mon Sep 17 00:00:00 2001
From: yyb <995253665@qq.com>
Date: 星期六, 16 五月 2026 13:41:49 +0800
Subject: [PATCH] 新增设备报修验收功能,更新报修表单,增加验收人字段,调整状态管理,优化报修详情展示。

---
 src/api/equipmentManagement/repair.js             |   13 +++
 src/pages.json                                    |   14 +++
 src/pages/equipmentManagement/repair/maintain.vue |   32 ++++----
 src/pages/equipmentManagement/repair/index.vue    |   80 +++++++++++++++++--
 src/pages/equipmentManagement/repair/add.vue      |   70 ++++++++++++++---
 5 files changed, 170 insertions(+), 39 deletions(-)

diff --git a/src/api/equipmentManagement/repair.js b/src/api/equipmentManagement/repair.js
index 6b19027..f47bc50 100644
--- a/src/api/equipmentManagement/repair.js
+++ b/src/api/equipmentManagement/repair.js
@@ -100,4 +100,17 @@
     url: `/device/repair/file/${fileId}`,
     method: "delete",
   });
+};
+
+/**
+ * @desc 璁惧鎶ヤ慨楠屾敹
+ * @param {楠屾敹鍙傛暟} data
+ * @returns
+ */
+export const acceptRepair = (data) => {
+  return request({
+    url: "/device/repair/acceptance",
+    method: "post",
+    data,
+  });
 };
\ No newline at end of file
diff --git a/src/pages.json b/src/pages.json
index 3dd3c20..8f3b69b 100644
--- a/src/pages.json
+++ b/src/pages.json
@@ -598,6 +598,20 @@
       }
     },
     {
+      "path": "pages/equipmentManagement/repair/detail",
+      "style": {
+        "navigationBarTitleText": "璁惧鎶ヤ慨璇︽儏",
+        "navigationStyle": "custom"
+      }
+    },
+    {
+      "path": "pages/equipmentManagement/repair/acceptance",
+      "style": {
+        "navigationBarTitleText": "璁惧鎶ヤ慨楠屾敹",
+        "navigationStyle": "custom"
+      }
+    },
+    {
       "path": "pages/equipmentManagement/upkeep/index",
       "style": {
         "navigationBarTitleText": "璁惧淇濆吇",
diff --git a/src/pages/equipmentManagement/repair/add.vue b/src/pages/equipmentManagement/repair/add.vue
index 076acb0..d641f14 100644
--- a/src/pages/equipmentManagement/repair/add.vue
+++ b/src/pages/equipmentManagement/repair/add.vue
@@ -62,11 +62,19 @@
           </template>
         </u-form-item>
         <u-form-item label="鎶ヤ慨浜�"
-                     prop="repairName"
+                     prop="maintenanceName"
                      required
                      border-bottom>
-          <u-input v-model="form.repairName"
+          <u-input v-model="form.maintenanceName"
                    placeholder="璇疯緭鍏ユ姤淇汉"
+                   clearable />
+        </u-form-item>
+        <u-form-item label="楠屾敹浜�"
+                     prop="acceptanceName"
+                     required
+                     border-bottom>
+          <u-input v-model="form.acceptanceName"
+                   placeholder="璇疯緭鍏ラ獙鏀朵汉"
                    clearable />
         </u-form-item>
         <u-form-item label="鏁呴殰鐜拌薄"
@@ -150,6 +158,9 @@
   } from "@/api/equipmentManagement/repair";
   import dayjs from "dayjs";
   import { formatDateToYMD } from "@/utils/ruoyi";
+  import useUserStore from "@/store/modules/user";
+
+  const userStore = useUserStore();
   const showToast = message => {
     uni.showToast({
       title: message,
@@ -195,7 +206,12 @@
     repairTime: [
       { required: true, trigger: "change", message: "璇烽�夋嫨鎶ヤ慨鏃ユ湡" },
     ],
-    repairName: [{ required: true, trigger: "blur", message: "璇疯緭鍏ユ姤淇汉" }],
+    maintenanceName: [
+      { required: true, trigger: "blur", message: "璇疯緭鍏ユ姤淇汉" },
+    ],
+    acceptanceName: [
+      { required: true, trigger: "blur", message: "璇疯緭鍏ラ獙鏀朵汉" },
+    ],
     remark: [{ required: true, trigger: "blur", message: "璇疯緭鍏ユ晠闅滅幇璞�" }],
   };
 
@@ -204,7 +220,9 @@
     deviceLedgerId: undefined, // 璁惧ID
     deviceModel: undefined, // 瑙勬牸鍨嬪彿
     repairTime: dayjs().format("YYYY-MM-DD"), // 鎶ヤ慨鏃ユ湡
-    repairName: undefined, // 鎶ヤ慨浜�
+    status: "0",
+    maintenanceName: userStore.nickName || userStore.name || "", // 鎶ヤ慨浜�
+    acceptanceName: undefined, // 楠屾敹浜�
     remark: undefined, // 鏁呴殰鐜拌薄
   });
 
@@ -413,10 +431,11 @@
   // 鎶ヤ慨鐘舵�侀�夐」
   const repairStatusOptions = ref([
     { name: "寰呯淮淇�", value: "0" },
-    { name: "瀹岀粨", value: "1" },
-    { name: "澶辫触", value: "2" },
+    { name: "寰呴獙鏀�", value: "3" },
+    { name: "瀹屾垚", value: "1" },
+    { name: "缁翠慨澶辫触", value: "2" },
   ]);
-  const repairStatusText = ref("");
+  const repairStatusText = ref("寰呯淮淇�");
 
   // 鎵撳紑鎶ヤ慨鐘舵�侀�夋嫨鍣�
   const openRepairStatusPicker = () => {
@@ -458,12 +477,19 @@
           form.value.deviceLedgerId = data.deviceLedgerId;
           form.value.deviceModel = data.deviceModel;
           form.value.repairTime = dayjs(data.repairTime).format("YYYY-MM-DD");
-          form.value.repairName = data.repairName;
+          form.value.maintenanceName =
+            data.maintenanceName || data.repairName || "";
+          form.value.acceptanceName = data.acceptanceName || "";
           form.value.remark = data.remark;
+          form.value.status =
+            data.status !== undefined && data.status !== null
+              ? String(data.status)
+              : "0";
           await fetchRepairFileList(id);
           repairStatusText.value =
-            repairStatusOptions.value.find(item => item.value == data.status)
-              ?.name || "";
+            repairStatusOptions.value.find(
+              item => item.value == String(data.status)
+            )?.name || "寰呯淮淇�";
           // 璁剧疆璁惧鍚嶇О鏄剧ず
           const device = deviceOptions.value.find(
             item => item.id === data.deviceLedgerId
@@ -476,8 +502,13 @@
         showToast("鑾峰彇璇︽儏澶辫触");
       }
     } else {
-      // 鏂板妯″紡
       operationType.value = "add";
+      form.value.status = "0";
+      repairStatusText.value = "寰呯淮淇�";
+      if (!form.value.maintenanceName) {
+        form.value.maintenanceName =
+          userStore.nickName || userStore.name || "";
+      }
     }
   };
 
@@ -604,9 +635,18 @@
       } else if (!form.value.repairTime || form.value.repairTime.trim() === "") {
         isValid = false;
         errorMessage = "璇烽�夋嫨鎶ヤ慨鏃ユ湡";
-      } else if (!form.value.repairName || form.value.repairName.trim() === "") {
+      } else if (
+        !form.value.maintenanceName ||
+        form.value.maintenanceName.trim() === ""
+      ) {
         isValid = false;
         errorMessage = "璇疯緭鍏ユ姤淇汉";
+      } else if (
+        !form.value.acceptanceName ||
+        form.value.acceptanceName.trim() === ""
+      ) {
+        isValid = false;
+        errorMessage = "璇疯緭鍏ラ獙鏀朵汉";
       } else if (!form.value.remark || form.value.remark.trim() === "") {
         isValid = false;
         errorMessage = "璇疯緭鍏ユ晠闅滅幇璞�";
@@ -621,7 +661,11 @@
       const id = getPageId();
 
       // 鍑嗗鎻愪氦鏁版嵁
-      const submitData = { ...form.value };
+      const submitData = {
+        ...form.value,
+        status: Number(form.value.status ?? 0),
+        repairName: form.value.maintenanceName,
+      };
 
       const result = id
         ? await editRepair({ id: id, ...submitData })
diff --git a/src/pages/equipmentManagement/repair/index.vue b/src/pages/equipmentManagement/repair/index.vue
index a3c1eba..613f958 100644
--- a/src/pages/equipmentManagement/repair/index.vue
+++ b/src/pages/equipmentManagement/repair/index.vue
@@ -37,10 +37,8 @@
               <text class="item-id">璁惧鍚嶇О锛歿{ item.deviceName }}</text>
             </view>
             <view class="status-tag">
-              <u-tag v-if="item.status === 1"
-                     type="success">瀹岀粨</u-tag>
-              <u-tag v-if="item.status === 0"
-                     type="error">寰呯淮淇�</u-tag>
+              <u-tag :type="getStatusTagType(item.status)"
+                     size="small">{{ getStatusText(item.status) }}</u-tag>
             </view>
           </view>
           <up-divider></up-divider>
@@ -55,15 +53,20 @@
             </view>
             <view class="detail-row">
               <text class="detail-label">鎶ヤ慨浜�</text>
-              <text class="detail-value">{{ item.repairName || '-' }}</text>
+              <text class="detail-value">{{ item.maintenanceName || item.repairName || '-' }}</text>
+            </view>
+            <view class="detail-row">
+              <text class="detail-label">楠屾敹浜�</text>
+              <text class="detail-value">{{ item.acceptanceName || '-' }}</text>
             </view>
             <view class="detail-row">
               <text class="detail-label">鏁呴殰鐜拌薄</text>
               <text class="detail-value">{{ item.remark || '-' }}</text>
             </view>
-            <view class="detail-row">
+            <view class="detail-row"
+                  v-if="Number(item.status) !== 0">
               <text class="detail-label">缁翠慨浜�</text>
-              <text class="detail-value">{{ item.maintenanceName || '-' }}</text>
+              <text class="detail-value">{{ item.maintenancePerson || item.maintenanceName || '-' }}</text>
             </view>
             <view class="detail-row">
               <text class="detail-label">缁翠慨缁撴灉</text>
@@ -76,19 +79,33 @@
           </view>
           <!-- 鎸夐挳鍖哄煙 -->
           <view class="action-buttons">
+            <u-button type="info"
+                      size="small"
+                      plain
+                      class="action-btn"
+                      @click="goDetail(item.id)">
+              璇︽儏
+            </u-button>
             <u-button type="primary"
                       size="small"
                       class="action-btn"
-                      :disabled="item.status === 1"
+                      :disabled="Number(item.status) !== 0"
                       @click="edit(item.id)">
               缂栬緫
             </u-button>
             <u-button type="warning"
                       size="small"
                       class="action-btn"
-                      :disabled="item.status === 1"
+                      :disabled="Number(item.status) !== 0"
                       @click="addMaintain(item.id)">
               鏂板缁翠慨
+            </u-button>
+            <u-button type="success"
+                      size="small"
+                      class="action-btn"
+                      :disabled="!canAccept(item)"
+                      @click="goAcceptance(item.id)">
+              楠屾敹
             </u-button>
             <u-button type="error"
                       size="small"
@@ -130,6 +147,30 @@
   };
 
   const userStore = useUserStore();
+
+  const STATUS_MAP = {
+    0: "寰呯淮淇�",
+    3: "寰呴獙鏀�",
+    1: "瀹屾垚",
+    2: "缁翠慨澶辫触",
+  };
+
+  const getStatusText = status => STATUS_MAP[Number(status)] || "-";
+
+  const getStatusTagType = status => {
+    const map = { 0: "error", 3: "warning", 1: "success", 2: "error" };
+    return map[Number(status)] || "info";
+  };
+
+  const getCurrentUserName = () =>
+    (userStore.nickName || userStore.name || "").trim();
+
+  const canAccept = item => {
+    if (Number(item?.status) !== 3) return false;
+    const current = getCurrentUserName();
+    const target = (item?.acceptanceName || "").trim();
+    return Boolean(current && target && current === target);
+  };
 
   // 鎼滅储鍏抽敭璇�
   const searchKeyword = ref("");
@@ -205,6 +246,24 @@
     });
   };
 
+  const goDetail = id => {
+    if (!id) return;
+    uni.navigateTo({
+      url: `/pages/equipmentManagement/repair/detail?id=${id}`,
+    });
+  };
+
+  const goAcceptance = id => {
+    if (!id) {
+      showToast("鍙傛暟閿欒");
+      return;
+    }
+    uni.setStorageSync("repairId", id);
+    uni.navigateTo({
+      url: `/pages/equipmentManagement/repair/acceptance?id=${id}`,
+    });
+  };
+
   // 缂栬緫 - 璺宠浆鍒癮dd椤甸潰锛岄�氳繃id鍖哄垎鏂板杩樻槸缂栬緫
   const edit = id => {
     if (!id) return;
@@ -262,6 +321,7 @@
   }
 
   .action-buttons {
-    gap: 8px; // 涓庡叕鍏辨牱寮忎腑鐨� 12px 涓嶅悓
+    flex-wrap: wrap;
+    gap: 8px;
   }
 </style>
\ No newline at end of file
diff --git a/src/pages/equipmentManagement/repair/maintain.vue b/src/pages/equipmentManagement/repair/maintain.vue
index 9b077d6..fa6cd35 100644
--- a/src/pages/equipmentManagement/repair/maintain.vue
+++ b/src/pages/equipmentManagement/repair/maintain.vue
@@ -12,10 +12,10 @@
       <u-cell-group title="缁翠慨淇℃伅"
                     inset>
         <u-form-item prop="maintenanceName"
-                     label="鎶ヤ慨浜�"
+                     label="缁翠慨浜�"
                      required>
           <u-input v-model="form.maintenanceName"
-                   placeholder="璇疯緭鍏ユ姤淇汉"
+                   placeholder="璇疯緭鍏ョ淮淇汉"
                    clearable />
         </u-form-item>
         <u-form-item prop="maintenanceResult"
@@ -177,7 +177,7 @@
   // 琛ㄥ崟楠岃瘉瑙勫垯
   const formRules = {
     maintenanceName: [
-      { required: true, trigger: "blur", message: "璇疯緭鍏ユ姤淇汉" },
+      { required: true, trigger: "blur", message: "璇疯緭鍏ョ淮淇汉" },
     ],
     maintenanceResult: [
       { required: true, trigger: "blur", message: "璇疯緭鍏ョ淮淇粨鏋�" },
@@ -187,11 +187,11 @@
     ],
   };
   const repairStatusOptions = ref([
-    { name: "寰呯淮淇�", value: "0" },
-    { name: "瀹岀粨", value: "1" },
-    { name: "澶辫触", value: "2" },
+    { name: "寰呴獙鏀�", value: "3" },
+    { name: "瀹屾垚", value: "1" },
+    { name: "缁翠慨澶辫触", value: "2" },
   ]);
-  const repairStatusText = ref("瀹岀粨");
+  const repairStatusText = ref("寰呴獙鏀�");
   // 鎵撳紑鎶ヤ慨鐘舵�侀�夋嫨鍣�
   const openRepairStatusPicker = () => {
     uni.showActionSheet({
@@ -204,10 +204,10 @@
   };
   // 浣跨敤 ref 澹版槑琛ㄥ崟鏁版嵁
   const form = ref({
-    maintenanceName: userStore.nickName || "", // 榛樿浣跨敤褰撳墠鐢ㄦ埛鏄电О
-    maintenanceResult: undefined, // 缁翠慨缁撴灉
-    maintenanceTime: dayjs().format("YYYY-MM-DD HH:mm:ss"), // 缁翠慨鏃ユ湡锛堝彧鏄剧ず鏃ユ湡锛�
-    status: "1",
+    maintenanceName: userStore.nickName || userStore.name || "",
+    maintenanceResult: undefined,
+    maintenanceTime: dayjs().format("YYYY-MM-DD HH:mm:ss"),
+    status: "3",
     sparePartsIds: [],
   });
 
@@ -222,10 +222,10 @@
   // 閲嶇疆琛ㄥ崟鏁版嵁鍜屾牎楠岀姸鎬�
   const resetForm = () => {
     form.value = {
-      maintenanceName: userStore.nickName || "",
+      maintenanceName: userStore.nickName || userStore.name || "",
       maintenanceResult: undefined,
       maintenanceTime: dayjs().format("YYYY-MM-DD HH:mm:ss"),
-      status: "1",
+      status: "3",
       sparePartsIds: [],
     };
     selectedSpareParts.value = [];
@@ -411,9 +411,9 @@
 
   // 鍒濆鍖栬〃鍗曟暟鎹�
   const initForm = async () => {
-    form.value.status = "1";
-    // 璁剧疆鎶ヤ慨浜轰负褰撳墠鐢ㄦ埛鏄电О
-    form.value.maintenanceName = userStore.nickName || "";
+    form.value.status = "3";
+    form.value.maintenanceName = userStore.nickName || userStore.name || "";
+    repairStatusText.value = "寰呴獙鏀�";
     // 璁剧疆褰撳墠鏃ユ湡锛堝彧鍖呭惈骞存湀鏃ワ級
     form.value.maintenanceTime = dayjs().format("YYYY-MM-DD HH:mm:ss");
 

--
Gitblit v1.9.3