From aeabb6a019fbb7e60bd3b6c8cf3e4081abdff80c Mon Sep 17 00:00:00 2001
From: gongchunyi <deslre0381@gmail.com>
Date: 星期一, 18 五月 2026 20:39:10 +0800
Subject: [PATCH] feat: 设备巡检任务添加启用/停用

---
 src/views/equipmentManagement/upkeep/Form/PlanModal.vue |  111 ++++++++++++++++++++++++++++++++-----------------------
 1 files changed, 65 insertions(+), 46 deletions(-)

diff --git a/src/views/equipmentManagement/upkeep/Form/PlanModal.vue b/src/views/equipmentManagement/upkeep/Form/PlanModal.vue
index 0ba259d..35c8c0e 100644
--- a/src/views/equipmentManagement/upkeep/Form/PlanModal.vue
+++ b/src/views/equipmentManagement/upkeep/Form/PlanModal.vue
@@ -2,12 +2,12 @@
   <FormDialog
     v-model="visible"
     :title="id ? '缂栬緫璁惧淇濆吇璁″垝' : '鏂板璁惧淇濆吇璁″垝'"
-    width="640px"
+    width="680px"
     @confirm="sendForm"
     @cancel="handleCancel"
     @close="handleClose"
   >
-    <el-form :model="form" :rules="rules" label-width="100px">
+    <el-form ref="formRef" :model="form" :rules="rules" label-width="120px">
       <el-form-item label="璁惧鍚嶇О">
         <el-select
           v-model="form.deviceLedgerId"
@@ -56,12 +56,20 @@
           />
         </el-select>
       </el-form-item>
-      <el-form-item label="淇濆吇椤圭洰">
+      <el-form-item label="淇濆吇閮ㄤ綅" prop="maintenanceLocation">
         <el-input
           v-model="form.maintenanceLocation"
           type="textarea"
           :rows="3"
-          placeholder="璇疯緭鍏ヤ繚鍏婚」鐩�"
+          placeholder="璇疯緭鍏ヤ繚鍏婚儴浣�"
+        />
+      </el-form-item>
+      <el-form-item label="淇濆吇鍐呭" prop="maintenanceItems">
+        <el-input
+          v-model="form.maintenanceItems"
+          type="textarea"
+          :rows="3"
+          placeholder="璇疯緭鍏ヤ繚鍏诲唴瀹�"
         />
       </el-form-item>
       <el-form-item v-if="id" label="淇濅慨鐘舵��">
@@ -71,7 +79,7 @@
           <el-option label="澶辫触" :value="2"></el-option>
         </el-select>
       </el-form-item>
-      <el-form-item label="璁″垝淇濆吇鏃ユ湡">
+      <el-form-item label="璁″垝淇濆吇鏃ユ湡" prop="maintenancePlanTime">
         <el-date-picker
           style="width: 100%"
           v-model="form.maintenancePlanTime"
@@ -107,8 +115,6 @@
 } from "@/api/equipmentManagement/upkeep";
 import {
   listMaintenanceTaskFiles,
-  bindMaintenanceTaskFile,
-  uploadMaintenanceTaskFile,
   delMaintenanceTaskFile,
 } from "@/api/equipmentManagement/maintenanceTaskFile";
 import { ElMessage } from "element-plus";
@@ -132,13 +138,20 @@
 
 const pendingTempFiles = ref([]);
 const planFileList = ref([]);
+// 缂栬緫妯″紡涓嬪凡淇濆瓨浣嗗緟鍒犻櫎鐨勬枃浠跺垪琛�
+const pendingDeleteFiles = ref([]);
 
 const registrantDisplayName = computed(
   () => userStore.nickName || userStore.name || "褰撳墠鐧诲綍鐢ㄦ埛"
 );
 
+const formRef = ref();
+
 const rules = {
   maintenancePerson: [{ required: true, message: "璇烽�夋嫨淇濆吇浜�", trigger: "change" }],
+  maintenanceLocation: [{ required: true, message: "璇疯緭鍏ヤ繚鍏婚儴浣�", trigger: "blur" }],
+  maintenanceItems: [{ required: true, message: "璇疯緭鍏ヤ繚鍏诲唴瀹�", trigger: "blur" }],
+  maintenancePlanTime: [{ required: true, message: "璇烽�夋嫨璁″垝淇濆吇鏃ユ湡", trigger: "change" }],
 };
 
 const syncCreateUserFromLogin = () => {
@@ -169,6 +182,7 @@
   deviceName: undefined,
   deviceModel: undefined,
   maintenanceLocation: undefined,
+  maintenanceItems: undefined,
   maintenancePlanTime: undefined,
   maintenancePerson: undefined,
   createUser: undefined,
@@ -185,6 +199,7 @@
 const resetAttachmentState = () => {
   pendingTempFiles.value = [];
   planFileList.value = [];
+  pendingDeleteFiles.value = [];
 };
 
 const normalizeFilePreviewUrl = (url = "") => {
@@ -208,6 +223,8 @@
     status: "success",
     uid: `saved-${item.id}`,
     fileId: item.id,
+    // 鏍囪涓哄凡淇濆瓨鐨勬枃浠讹紝涓嶆槸鏂颁笂浼犵殑
+    isNew: false,
   }));
 };
 
@@ -226,38 +243,33 @@
 const handlePlanFileUpload = async (options) => {
   const { file, onSuccess, onError } = options;
   try {
-    if (id.value) {
-      const fd = new FormData();
-      fd.append("file", file);
-      fd.append("deviceMaintenanceId", String(id.value));
-      const res = await uploadMaintenanceTaskFile(fd);
-      if (res.code === 200) {
-        await loadPlanFiles(id.value);
-        onSuccess(res);
-        ElMessage.success("闄勪欢涓婁紶鎴愬姛");
-      } else {
-        onError(new Error(res.msg || "涓婁紶澶辫触"));
-      }
-      return;
-    }
+    // 鏃犺鏂板杩樻槸缂栬緫锛岄兘鍏堜笂浼犲埌涓存椂鐩綍
     const res = await uploadTempFile(file);
     if (res.code !== 200) {
       onError(new Error(res.msg || "涓婁紶澶辫触"));
       return;
     }
     const data = res.data || {};
+    const tempId = data.tempId;
+
+    // 璁板綍涓存椂鏂囦欢淇℃伅
     pendingTempFiles.value.push({
-      tempId: data.tempId,
+      tempId: tempId,
       name: data.originalName || file.name,
+      fileId: id.value ? tempId : undefined,
     });
+
     onSuccess(res);
     planFileList.value.push({
       name: data.originalName || file.name,
       url: "",
       status: "success",
-      uid: data.tempId,
-      tempId: data.tempId,
+      uid: tempId,
+      tempId: tempId,
+      // 鏍囪涓烘柊涓婁紶鐨勪复鏃舵枃浠�
+      isNew: true,
     });
+    ElMessage.success("闄勪欢涓婁紶鎴愬姛");
   } catch (e) {
     onError(e);
     ElMessage.error("闄勪欢涓婁紶澶辫触");
@@ -265,28 +277,29 @@
 };
 
 const handlePlanFileRemove = async (file) => {
-  if (file.fileId) {
-    try {
-      await delMaintenanceTaskFile(file.fileId);
-      await loadPlanFiles(id.value);
-    } catch (e) {
-      ElMessage.error("鍒犻櫎闄勪欢澶辫触");
-    }
+  // 浠庢樉绀哄垪琛ㄤ腑绉婚櫎
+  planFileList.value = planFileList.value.filter((f) => f.uid !== file.uid);
+
+  const tempId = file.tempId || file.uid;
+  if (file.isNew) {
+    // 鏂颁笂浼犵殑涓存椂鏂囦欢锛岀洿鎺ヤ粠寰呬笂浼犲垪琛ㄧЩ闄�
+    pendingTempFiles.value = pendingTempFiles.value.filter((f) => f.tempId !== tempId);
     return;
   }
-  const tempId = file.tempId || file.uid;
-  pendingTempFiles.value = pendingTempFiles.value.filter((f) => f.tempId !== tempId);
-  planFileList.value = planFileList.value.filter((f) => (f.tempId || f.uid) !== tempId);
+
+  if (file.fileId) {
+    pendingDeleteFiles.value.push({
+      fileId: file.fileId,
+      name: file.name,
+    });
+  }
 };
 
-const bindPendingFiles = async (planId) => {
-  if (!pendingTempFiles.value.length) return;
-  for (const item of pendingTempFiles.value) {
-    await bindMaintenanceTaskFile({
-      tempId: item.tempId,
-      name: item.name,
-      deviceMaintenanceId: planId,
-    });
+// 澶勭悊缂栬緫妯″紡涓嬪緟鍒犻櫎鐨勬枃浠�
+const processPendingDeletes = async () => {
+  if (!pendingDeleteFiles.value.length) return;
+  for (const file of pendingDeleteFiles.value) {
+    await delMaintenanceTaskFile(file.fileId);
   }
 };
 
@@ -295,6 +308,7 @@
   form.deviceName = data.deviceName;
   form.deviceModel = data.deviceModel;
   form.maintenanceLocation = data.maintenanceLocation;
+  form.maintenanceItems = data.maintenanceItems;
   form.status = data.status;
   syncCreateUserFromLogin();
   if (data.maintenancePersonId) {
@@ -324,6 +338,10 @@
       payload.maintenancePerson = maintainer.nickName;
     }
   }
+  // 浼犻�掍复鏃舵枃浠禝D鍒楄〃锛岀敱鍚庣缁熶竴澶勭悊
+  if (pendingTempFiles.value.length > 0) {
+    payload.tempFileIds = pendingTempFiles.value.map((f) => f.tempId);
+  }
   return payload;
 };
 
@@ -347,10 +365,14 @@
 
 const sendForm = async () => {
   syncCreateUserFromLogin();
+  const valid = await formRef.value?.validate().catch(() => false);
+  if (!valid) return;
   loading.value = true;
   try {
     const payload = buildSubmitPayload();
     if (id.value) {
+      // 缂栬緫妯″紡锛氬厛澶勭悊寰呭垹闄ょ殑鏂囦欢锛屽啀淇濆瓨琛ㄥ崟
+      await processPendingDeletes();
       const { code } = await editUpkeep({ id: unref(id), ...payload });
       if (code == 200) {
         ElMessage.success("缂栬緫璁″垝鎴愬姛");
@@ -358,12 +380,9 @@
         emits("ok");
       }
     } else {
+      // 鏂板妯″紡锛歵empFileIds 浼氶殢 payload 涓�璧蜂紶鍒板悗绔紝鐢卞悗绔鐞嗕复鏃舵枃浠剁殑鍏宠仈
       const res = await addUpkeep(payload);
       if (res.code == 200) {
-        const planId = res.data?.id;
-        if (planId) {
-          await bindPendingFiles(planId);
-        }
         ElMessage.success("鏂板璁″垝鎴愬姛");
         visible.value = false;
         emits("ok");

--
Gitblit v1.9.3