From 8ef070c84a703c4a8b838bf9320d68d00a7d6dca Mon Sep 17 00:00:00 2001
From: huminmin <mac@MacBook-Pro.local>
Date: 星期四, 28 五月 2026 11:15:32 +0800
Subject: [PATCH] 设备巡检去掉高度限制

---
 src/views/productionManagement/workOrder/index.vue |  227 +++++++++++++++++++++++++++++++++++++++-----------------
 1 files changed, 159 insertions(+), 68 deletions(-)

diff --git a/src/views/productionManagement/workOrder/index.vue b/src/views/productionManagement/workOrder/index.vue
index 6fdccc0..88564ea 100644
--- a/src/views/productionManagement/workOrder/index.vue
+++ b/src/views/productionManagement/workOrder/index.vue
@@ -192,6 +192,7 @@
                   step="1"
                   placeholder="璇疯緭鍏ユ湰娆$敓浜ф暟閲�"
                   style="width: 100%"
+                  :class="{ 'over-limit': reportForm.quantity > reportForm.planQuantity }"
                   @input="handleQuantityInput"
               />
             </el-form-item>
@@ -218,6 +219,18 @@
                   step="1"
                   placeholder="璇疯緭鍏ユ姤搴熸暟閲�"
                   @input="handleScrapQtyInput"
+              />
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="12">
+            <el-form-item label="鍔犳斁鏁�" prop="addQty">
+              <el-input
+                  v-model.number="reportForm.addQty"
+                  type="number"
+                  min="0"
+                  step="1"
+                  placeholder="璇疯緭鍏ュ姞鏀炬暟"
               />
             </el-form-item>
           </el-col>
@@ -263,24 +276,24 @@
 <!--            </el-form-item>-->
 <!--          </el-col>-->
 
-          <el-col :span="12">
-            <el-form-item label="瀹℃牳浜�" prop="auditUserId">
-              <el-select
-                  v-model="reportForm.auditUserId"
-                  placeholder="璇烽�夋嫨瀹℃牳浜�"
-                  clearable
-                  filterable
-                  @change="handleReviewerIdChange"
-              >
-                <el-option
-                    v-for="user in userOptions"
-                    :key="user.userId"
-                    :label="user.nickName"
-                    :value="user.userId"
-                />
-              </el-select>
-            </el-form-item>
-          </el-col>
+<!--          <el-col :span="12">-->
+<!--            <el-form-item label="瀹℃牳浜�" prop="auditUserId">-->
+<!--              <el-select-->
+<!--                  v-model="reportForm.auditUserId"-->
+<!--                  placeholder="璇烽�夋嫨瀹℃牳浜�"-->
+<!--                  clearable-->
+<!--                  filterable-->
+<!--                  @change="handleReviewerIdChange"-->
+<!--              >-->
+<!--                <el-option-->
+<!--                    v-for="user in userOptions"-->
+<!--                    :key="user.userId"-->
+<!--                    :label="user.nickName"-->
+<!--                    :value="user.userId"-->
+<!--                />-->
+<!--              </el-select>-->
+<!--            </el-form-item>-->
+<!--          </el-col>-->
 
         </el-row>
       </el-form>
@@ -326,11 +339,11 @@
       </template>
     </el-dialog>
     <el-dialog v-model="scheduleDialogVisible"
-               :title="`鐢熶骇鎺掍骇(宸ュ崟缂栧彿:${currentReportRowData?.workOrderNo || '-'})`"
+               :title="scheduleDialogTitle"
                width="1000px"
                :close-on-click-modal="false">
       <div class="schedule-panel">
-        <el-row style="margin-bottom: 12px;">
+        <el-row v-if="!isScheduleHistoryMode" style="margin-bottom: 12px;">
           <el-col>
             <el-button type="primary" plain :disabled="scheduleLoading || scheduleSaving" @click="addScheduleRow">
               鏂板涓�琛�
@@ -347,7 +360,7 @@
                   filterable
                   clearable
                   style="width: 100%"
-                  :disabled="scheduleSaving"
+                  :disabled="scheduleSaving || isScheduleHistoryMode"
                   @change="val => handleScheduleDeviceChange(val, row)"
               >
                 <el-option
@@ -362,7 +375,18 @@
 
           <el-table-column label="鏈涓婃満浜�" min-width="220">
             <template #default="{ row }">
+              <div v-if="isScheduleHistoryMode" class="schedule-user-tags">
+                <el-tag
+                    v-for="(userId, index) in row.userIds"
+                    :key="`${userId}-${index}`"
+                    type="primary"
+                >
+                  {{ resolveScheduleUserName(userId) }}
+                </el-tag>
+                <span v-if="!row.userIds?.length">-</span>
+              </div>
               <el-select
+                  v-else
                   v-model="row.userIds"
                   placeholder="璇烽�夋嫨涓婃満浜�"
                   filterable
@@ -392,12 +416,12 @@
                   format="YYYY-MM-DD HH:mm:ss"
                   placeholder="璇烽�夋嫨涓婃満鏃堕棿"
                   style="width: 100%"
-                  :disabled="scheduleSaving"
+                  :disabled="scheduleSaving || isScheduleHistoryMode"
               />
             </template>
           </el-table-column>
 
-          <el-table-column label="鎿嶄綔" width="110" align="center">
+          <el-table-column v-if="!isScheduleHistoryMode" label="鎿嶄綔" width="110" align="center">
             <template #default="{ row }">
               <el-button
                   link
@@ -413,7 +437,7 @@
         </el-table>
 
         <Pagination
-            v-show="schedulePage.total > 0"
+            v-show="isScheduleHistoryMode && schedulePage.total > 0"
             style="margin-top: 12px"
             :total="schedulePage.total"
             :page="schedulePage.current"
@@ -424,8 +448,13 @@
 
       <template #footer>
         <span class="dialog-footer">
-          <el-button type="primary" :loading="scheduleSaving" @click="handleSaveSchedule">淇濆瓨鎺掍骇</el-button>
-          <el-button :disabled="scheduleSaving" @click="scheduleDialogVisible = false">鍙栨秷</el-button>
+          <template v-if="isScheduleHistoryMode">
+            <el-button @click="scheduleDialogVisible = false">鍏抽棴</el-button>
+          </template>
+          <template v-else>
+            <el-button type="primary" :loading="scheduleSaving" @click="handleSaveSchedule">淇濆瓨鎺掍骇</el-button>
+            <el-button :disabled="scheduleSaving" @click="scheduleDialogVisible = false">鍙栨秷</el-button>
+          </template>
         </span>
       </template>
     </el-dialog>
@@ -623,17 +652,12 @@
     return;
   }
 
-  const first = scheduleRows.value[0] || {};
-  const deviceId = first.deviceId || currentReportRowData.value?.deviceId || "";
-  const userOptions = deviceId ? buildScheduleUserOptionsByDeviceId(deviceId) : [...baseScheduleUsers.value];
-  const defaultUserId = userOptions[0]?.userId ? String(userOptions[0].userId) : "";
-
   scheduleRows.value.push(
     createScheduleRow({
       id: "",
-      deviceId,
-      deviceName: first.deviceName || currentReportRowData.value?.deviceName || "",
-      userIds: defaultUserId ? [defaultUserId] : [],
+      deviceId:"",
+      deviceName:"",
+      userIds: [],
       startTime: dayjs().format("YYYY-MM-DD HH:mm:ss"),
     })
   );
@@ -645,7 +669,7 @@
   if (!workOrderRow?.id) {
     schedulePage.current = 1;
     schedulePage.total = 0;
-    scheduleRows.value = [createScheduleRow({})];
+    scheduleRows.value = [];
     return;
   }
 
@@ -672,11 +696,11 @@
     }
 
     const rows = records.map(record => mapMachineRecordToScheduleRow(record));
-    scheduleRows.value = rows.length > 0 ? rows : [createScheduleRow({})];
+    scheduleRows.value = rows;
   } catch (error) {
     console.error("鑾峰彇鎺掍骇璁板綍澶辫触", error);
     schedulePage.total = 0;
-    scheduleRows.value = [createScheduleRow({})];
+    scheduleRows.value = [];
     ElMessage.error("鑾峰彇鎺掍骇璁板綍澶辫触");
   } finally {
     scheduleLoading.value = false;
@@ -684,12 +708,12 @@
 };
 
 const removeScheduleRow = async (row) => {
-  if (!row) return;
+  if (!row || isScheduleHistoryMode.value) return;
 
   if (!row.id) {
     scheduleRows.value = scheduleRows.value.filter((item) => item !== row);
     if (!scheduleRows.value.length) {
-      scheduleRows.value = [createScheduleRow({})];
+      addScheduleRow();
     }
     return;
   }
@@ -740,6 +764,7 @@
 };
 
 const handleSchedulePagination = ({page, limit}) => {
+  if (!isScheduleHistoryMode.value) return;
   schedulePage.current = page;
   schedulePage.size = limit;
   refreshScheduleRows();
@@ -818,6 +843,12 @@
   return (schedulePage.current - 1) * schedulePage.size + index + 1;
 };
 
+const scheduleDialogMode = ref("create");
+const isScheduleHistoryMode = computed(() => scheduleDialogMode.value === "history");
+const scheduleDialogTitle = computed(() =>
+  `${isScheduleHistoryMode.value ? "鎺掍骇璁板綍" : "鐢熶骇鎺掍骇"}(宸ュ崟缂栧彿:${currentReportRowData.value?.workOrderNo || "-"})`
+);
+
 const mapMachineRecordToScheduleRow = (record) => {
   const id = record?.id ?? "";
   const deviceId = record?.machineId ?? record?.deviceId ?? "";
@@ -863,11 +894,29 @@
   );
 };
 
+const resetCreateScheduleRows = () => {
+  schedulePage.current = 1;
+  schedulePage.total = 0;
+  scheduleRows.value = [];
+  addScheduleRow();
+};
+
 const openScheduleDialog = async (row) => {
+  scheduleDialogMode.value = "create";
+  currentReportRowData.value = row;
+  baseScheduleUsers.value = buildBaseScheduleUsersByRow(row);
+  userTemp.value = [...baseScheduleUsers.value];
+  scheduleDialogVisible.value = true;
+  resetCreateScheduleRows();
+};
+
+const openHistoryTimelineDialog = async (row) => {
+  scheduleDialogMode.value = "history";
   currentReportRowData.value = row;
   baseScheduleUsers.value = buildBaseScheduleUsersByRow(row);
   userTemp.value = [...baseScheduleUsers.value];
   schedulePage.current = 1;
+  schedulePage.total = 0;
   scheduleRows.value = [];
   scheduleDialogVisible.value = true;
 
@@ -875,6 +924,7 @@
 };
 
 const handleSaveSchedule = async () => {
+  if (isScheduleHistoryMode.value) return;
   if (scheduleSaving.value) return;
   if (!validateScheduleRows()) return;
 
@@ -899,8 +949,9 @@
     }
 
     proxy.$modal.msgSuccess("鎺掍骇宸蹭繚瀛�");
-    await refreshScheduleRows();
-    getList();
+    scheduleDialogVisible.value = false;
+    resetCreateScheduleRows();
+    await getList();
   } catch (error) {
     console.error("淇濆瓨鎺掍骇澶辫触", error);
     ElMessage.error("淇濆瓨鎺掍骇澶辫触锛岃閲嶈瘯");
@@ -924,20 +975,27 @@
     label: "鐢熶骇璁㈠崟鍙�",
     prop: "productOrderNpsNo",
     width: "140",
+    formatData: val => (val && val.length > 4 ? val.slice(0, -4) : val || ""),
   },
   {
-    label: "浜у搧鍚嶇О",
-    prop: "productName",
-    width: "140",
+    label: "鎴愬搧鍚嶇О",
+    prop: "finalProductModel",
+    minWidth: 200,
+    overHidden: false
   },
-  {
-    label: "瑙勬牸",
-    prop: "model",
-  },
-  {
-    label: "鍗曚綅",
-    prop: "unit",
-  },
+  // {
+  //   label: "鍔犲伐鍝佸悕绉�",
+  //   prop: "productName",
+  //   width: "140",
+  // },
+  // {
+  //   label: "鍔犲伐鍝佽鏍�",
+  //   prop: "model",
+  // },
+  // {
+  //   label: "鍔犲伐鍝佸崟浣�",
+  //   prop: "unit",
+  // },
   {
     label: "宸ュ簭鍚嶇О",
     prop: "processName",
@@ -981,7 +1039,7 @@
   },
   {
     label: "鎿嶄綔",
-    width: "200",
+    width: "220",
     align: "center",
     dataType: "action",
     fixed: "right",
@@ -1009,9 +1067,9 @@
         clickFun: row => {
           showReportDialog(row);
         },
-        // 鐢ㄦ埛褰撳墠id
-        disabled: row => row.completeQuantity !==0 ||
-            !isCurrentUserInUserIds(row)
+        // // 鐢ㄦ埛褰撳墠id
+        disabled: row => row.completeQuantity >= row.planQuantity ||
+            !isCurrentUserInUserIds(row) || row.hasUnreportedMachine
       },
       {
         name: "鐢熶骇鎺掍骇",
@@ -1021,6 +1079,17 @@
             return;
           }
           openScheduleDialog(row);
+        },
+        disabled: row => !row.canSchedule || row.completeQuantity >= row.planQuantity
+      },
+      {
+        name: "鎺掍骇璁板綍",
+        clickFun: row => {
+          if (!row.canSchedule) {
+            ElMessage.warning("褰撳墠鐢ㄦ埛涓嶅湪璇ュ伐搴忎汉鍛樹腑锛屼笉鑳芥煡鐪嬫帓浜ц褰�");
+            return;
+          }
+          openHistoryTimelineDialog(row);
         },
         disabled: row => !row.canSchedule
       }
@@ -1065,6 +1134,7 @@
   planQuantity: 0,
   quantity: null,
   scrapQty: null,
+  addQty: 0,
   startTime: "",
   endTime: "",
   userName: "",
@@ -1076,7 +1146,10 @@
   teamList: [],
   deviceId: null,
 });
-
+function removeLastFour(str) {
+  if (!str) return ''; // 绌哄�间繚鎶�
+  return str.toString().slice(0, -4); // 鏍稿績锛氭埅鍙� 0 鍒� 鍊掓暟绗�4浣�
+}
 // 鏈鐢熶骇鏁伴噺楠岃瘉瑙勫垯
 const validateQuantity = (rule, value, callback) => {
   if (value === null || value === undefined || value === "") {
@@ -1148,7 +1221,7 @@
     await Promise.all(updates);
     ElMessage.success("瀹℃牳鎴愬姛");
     auditDialogVisible.value = false;
-    getList();
+    await getList();
   } finally {
     auditLoading.value = false;
   }
@@ -1169,7 +1242,7 @@
   scrapQty: [{validator: validateScrapQty, trigger: "blur"}],
   startTime: [{required: true, message: "璇烽�夋嫨寮�濮嬫椂闂�", trigger: "change"}],
   endTime: [{required: true, message: "璇烽�夋嫨缁撴潫鏃堕棿", trigger: "change"}],
-  auditUserId: [{required: true, message: "璇烽�夋嫨瀹℃牳浜�", trigger: "change"}],
+  // auditUserId: [{required: true, message: "璇烽�夋嫨瀹℃牳浜�", trigger: "change"}],
   teamList: [{required: true, message: "璇烽�夋嫨鐝粍", trigger: "change"}],
   deviceId: [{required: true, message: "璇烽�夋嫨璁惧", trigger: "change"}],
 };
@@ -1260,7 +1333,7 @@
 /** 鎼滅储鎸夐挳鎿嶄綔 */
 const handleQuery = () => {
   page.current = 1;
-  getList();
+   getList();
 };
 const pagination = obj => {
   page.current = obj.page;
@@ -1378,9 +1451,10 @@
 };
 
 const showReportDialog = row => {
+
   currentReportRowData.value = row;
   reportForm.planQuantity = row.planQuantity - row.completeQuantity;
-  reportForm.quantity = row.quantity !== undefined && row.quantity !== null ? row.quantity : null;
+  reportForm.quantity = row.planQuantity - row.completeQuantity;
   reportForm.productProcessRouteItemId = row.productProcessRouteItemId;
   reportForm.workOrderId = row.id;
   reportForm.reportWork = row.reportWork;
@@ -1390,6 +1464,7 @@
   reportForm.replenishQty = 0;
   reportForm.teamList = [];
   reportForm.scrapQty = 0;
+  reportForm.addQty = 0;
   reportForm.userIds = row.userIds || [];
 
   const ids = (row.userIds || "")
@@ -1398,7 +1473,7 @@
       .filter(Boolean);
 
   reportForm.userIdsList = userTeamOptions.value
-      .filter(item => ids.includes(String(item.userId)))
+      // .filter(item => ids.includes(String(item.userId)))
       .map(item => ({
         userId: item.userId,
         nickName: item.nickName
@@ -1469,12 +1544,12 @@
       return;
     }
 
-    if (quantity > reportForm.planQuantity) {
-      ElMessageBox.alert("鏈鐢熶骇鏁伴噺涓嶈兘瓒呰繃寰呯敓浜ф暟閲�", "鎻愮ず", {
-        confirmButtonText: "纭畾",
-      });
-      return;
-    }
+    // if (quantity > reportForm.planQuantity) {
+    //   ElMessageBox.alert("鏈鐢熶骇鏁伴噺涓嶈兘瓒呰繃寰呯敓浜ф暟閲�", "鎻愮ず", {
+    //     confirmButtonText: "纭畾",
+    //   });
+    //   return;
+    // }
 
     const submitData = {
       ...reportForm,
@@ -1641,6 +1716,14 @@
     justify-content: flex-start;
   }
 }
+
+.schedule-user-tags {
+  display: flex;
+  flex-wrap: wrap;
+  gap: 8px;
+  min-height: 32px;
+  align-items: center;
+}
 </style>
 
 <style lang="scss">
@@ -1727,4 +1810,12 @@
     height: 140px !important;
   }
 }
+.el-table .cell {
+  white-space: normal !important;
+  word-break: break-all;
+}
+
+.over-limit .el-input__inner {
+  color: #f56c6c !important;
+}
 </style>

--
Gitblit v1.9.3