From 51081f3acbeef7e5358e20a653c38b0ed3afbe23 Mon Sep 17 00:00:00 2001
From: gongchunyi <deslre0381@gmail.com>
Date: 星期五, 15 五月 2026 19:39:19 +0800
Subject: [PATCH] feat: 设备维修新增报修人、验收人、维修人

---
 src/views/equipmentManagement/repair/Modal/MaintainModal.vue |  165 ++++++++++++++++++++++++++++++++++++++++++++----------
 1 files changed, 133 insertions(+), 32 deletions(-)

diff --git a/src/views/equipmentManagement/repair/Modal/MaintainModal.vue b/src/views/equipmentManagement/repair/Modal/MaintainModal.vue
index 496b072..ed09da9 100644
--- a/src/views/equipmentManagement/repair/Modal/MaintainModal.vue
+++ b/src/views/equipmentManagement/repair/Modal/MaintainModal.vue
@@ -1,27 +1,27 @@
 <template>
   <FormDialog
     v-model="visible"
-    :title="'璁惧缁翠慨'"
-    width="500px"
+    title="璁惧缁翠慨"
+    width="640px"
+    :loading="loading"
     @confirm="sendForm"
     @cancel="handleCancel"
     @close="handleClose"
   >
-    <el-form :model="form" label-width="80px">
-      <el-form-item label="缁翠慨浜�">
-        <el-input v-model="form.maintenanceName" placeholder="璇疯緭鍏ョ淮淇汉" />
+    <el-form ref="formRef" :model="form" :rules="rules" label-width="90px">
+      <el-form-item label="缁翠慨浜�" prop="maintenanceName">
+        <el-input v-model="form.maintenanceName" disabled placeholder="鎶ヤ慨鏃舵寚瀹氱殑缁翠慨浜�" />
       </el-form-item>
-      <el-form-item label="缁翠慨缁撴灉">
+      <el-form-item label="缁翠慨缁撴灉" prop="maintenanceResult">
         <el-input v-model="form.maintenanceResult" placeholder="璇疯緭鍏ョ淮淇粨鏋�" />
       </el-form-item>
-      <el-form-item label="缁翠慨鐘舵��">
-        <el-select v-model="form.status">
-          <el-option label="寰呮姤淇�" :value="0"></el-option>
-          <el-option label="瀹岀粨" :value="1"></el-option>
-          <el-option label="澶辫触" :value="2"></el-option>
+      <el-form-item label="缁翠慨鐘舵��" prop="status">
+        <el-select v-model="form.status" style="width: 100%">
+          <el-option label="寰呴獙鏀�" :value="3" />
+          <el-option label="缁翠慨澶辫触" :value="2" />
         </el-select>
       </el-form-item>
-      <el-form-item label="缁翠慨鏃ユ湡">
+      <el-form-item label="缁翠慨鏃ユ湡" prop="maintenanceTime">
         <el-date-picker
           v-model="form.maintenanceTime"
           placeholder="璇烽�夋嫨缁翠慨鏃ユ湡"
@@ -32,17 +32,39 @@
           style="width: 100%"
         />
       </el-form-item>
+      <el-form-item label="闄勪欢">
+        <el-upload
+          class="repair-attachment-upload"
+          v-model:file-list="attachmentFileList"
+          drag
+          multiple
+          :auto-upload="false"
+          :limit="9"
+          accept="image/png,image/jpeg,image/jpg"
+          :before-upload="beforeAttachmentUpload"
+        >
+          <el-icon class="repair-upload-icon"><UploadFilled /></el-icon>
+          <div class="el-upload__text">灏嗘枃浠舵嫋鍒版澶勶紝鎴� <em>鐐瑰嚮閫夋嫨鏂囦欢</em></div>
+          <template #tip>
+            <div class="el-upload__tip">
+              鏀寔 png / jpg / jpeg锛屽崟涓笉瓒呰繃 50MB锛屼繚瀛樺悗涓庡垪琛ㄣ�岄檮浠躲�嶅悓姝�
+            </div>
+          </template>
+        </el-upload>
+      </el-form-item>
     </el-form>
   </FormDialog>
 </template>
 
 <script setup>
 import FormDialog from "@/components/Dialog/FormDialog.vue";
-import { addMaintain } from "@/api/equipmentManagement/repair";
+import { addMaintain, uploadRepairFile } from "@/api/equipmentManagement/repair";
+import { REPAIR_FILE_TYPE_MAINTAIN } from "@/api/equipmentManagement/repairFileType.js";
 import useFormData from "@/hooks/useFormData";
 import useUserStore from "@/store/modules/user";
 import dayjs from "dayjs";
 import { ElMessage } from "element-plus";
+import { UploadFilled } from "@element-plus/icons-vue";
 
 defineOptions({
   name: "缁翠慨妯℃�佹",
@@ -50,39 +72,95 @@
 
 const emits = defineEmits(["ok"]);
 
-// 淇濆瓨鎶ヤ慨璁板綍鐨刬d
 const repairId = ref();
 const visible = ref(false);
 const loading = ref(false);
+const formRef = ref();
+const attachmentFileList = ref([]);
+const ATTACH_MAX_MB = 50;
 
 const userStore = useUserStore();
+
+const rules = {
+  maintenanceName: [{ required: true, message: "璇烽�夋嫨缁翠慨浜�", trigger: "change" }],
+  maintenanceResult: [{ required: true, message: "璇疯緭鍏ョ淮淇粨鏋�", trigger: "blur" }],
+  maintenanceTime: [{ required: true, message: "璇烽�夋嫨缁翠慨鏃ユ湡", trigger: "change" }],
+};
+
 const { form, resetForm } = useFormData({
-  maintenanceName: undefined, // 缁翠慨鍚嶇О
-  maintenanceResult: undefined, // 缁翠慨缁撴灉
-  maintenanceTime: undefined, // 缁翠慨鏃ユ湡
-  status: 0,
+  maintenanceName: undefined,
+  maintenanceResult: undefined,
+  maintenanceTime: dayjs().format("YYYY-MM-DD HH:mm:ss"),
+  status: 3,
 });
 
+const syncMaintenanceNameFromRow = (row) => {
+  form.maintenanceName = row?.maintenanceName || "";
+};
+
+const beforeAttachmentUpload = (rawFile) => {
+  const okType = ["image/jpeg", "image/jpg", "image/png"].includes(rawFile.type);
+  if (!okType) {
+    ElMessage.error("鍙兘涓婁紶 png / jpg / jpeg 鍥剧墖");
+    return false;
+  }
+  if (rawFile.size > ATTACH_MAX_MB * 1024 * 1024) {
+    ElMessage.error(`鍗曚釜鏂囦欢涓嶈兘瓒呰繃 ${ATTACH_MAX_MB}MB`);
+    return false;
+  }
+  return true;
+};
+
+const clearAttachmentQueue = () => {
+  attachmentFileList.value = [];
+};
+
+const uploadQueuedImages = async (id) => {
+  const files = (attachmentFileList.value || []).map((f) => f.raw).filter(Boolean);
+  for (const file of files) {
+    const fd = new FormData();
+    fd.append("file", file);
+    fd.append("deviceRepairId", String(id));
+    fd.append("fileType", String(REPAIR_FILE_TYPE_MAINTAIN));
+    const res = await uploadRepairFile(fd);
+    if (res.code !== 200) {
+      throw new Error(res.msg || "闄勪欢涓婁紶澶辫触");
+    }
+  }
+};
+
 const setForm = (data) => {
-  form.maintenanceName = data.maintenanceName ?? userStore.nickName;
+  syncMaintenanceNameFromRow(data);
   form.maintenanceResult = data.maintenanceResult;
-  form.maintenanceTime =
-    data.maintenanceTime 
-      ? dayjs(data.maintenanceTime).format("YYYY-MM-DD HH:mm:ss")
-      : dayjs().format("YYYY-MM-DD HH:mm:ss");
-  form.status = 1; // 榛樿鐘舵�佷负瀹岀粨
+  form.maintenanceTime = data.maintenanceTime
+    ? dayjs(data.maintenanceTime).format("YYYY-MM-DD HH:mm:ss")
+    : dayjs().format("YYYY-MM-DD HH:mm:ss");
+  form.status = 3;
 };
 
 const sendForm = async () => {
+  const valid = await formRef.value?.validate().catch(() => false);
+  if (!valid) return;
+  if (form.maintenanceName !== userStore.nickName) {
+    ElMessage.warning("浠呮寚瀹氱殑缁翠慨浜哄彲杩涜缁翠慨");
+    return;
+  }
   loading.value = true;
   try {
-    const { code } = await addMaintain({ id: repairId.value, ...form });
-    if (code == 200) {
-      ElMessage.success("缁翠慨鎴愬姛");
-      emits("ok");
-      resetForm();
-      visible.value = false;
+    const { code, msg } = await addMaintain({ id: repairId.value, ...form });
+    if (code !== 200) {
+      if (msg) ElMessage.error(msg);
+      return;
     }
+    if (attachmentFileList.value.length) {
+      await uploadQueuedImages(repairId.value);
+    }
+    ElMessage.success("缁翠慨鎴愬姛");
+    clearAttachmentQueue();
+    visible.value = false;
+    emits("ok");
+  } catch (e) {
+    ElMessage.error(e?.message || "淇濆瓨鎴栦笂浼犻檮浠跺け璐�");
   } finally {
     loading.value = false;
   }
@@ -90,19 +168,26 @@
 
 const handleCancel = () => {
   resetForm();
+  clearAttachmentQueue();
   visible.value = false;
 };
 
 const handleClose = () => {
   resetForm();
+  clearAttachmentQueue();
   visible.value = false;
 };
 
 const open = async (id, row) => {
-  repairId.value = id; // 淇濆瓨鎶ヤ慨璁板綍鐨刬d
+  repairId.value = id;
+  clearAttachmentQueue();
   visible.value = true;
   await nextTick();
   setForm(row);
+  if (row?.maintenanceName && row.maintenanceName !== userStore.nickName) {
+    ElMessage.warning("浠呮寚瀹氱殑缁翠慨浜哄彲杩涜缁翠慨");
+    visible.value = false;
+  }
 };
 
 defineExpose({
@@ -110,4 +195,20 @@
 });
 </script>
 
-<style lang="scss" scoped></style>
+<style lang="scss" scoped>
+.repair-attachment-upload {
+  width: 100%;
+  :deep(.el-upload) {
+    width: 100%;
+  }
+  :deep(.el-upload-dragger) {
+    width: 100%;
+    padding: 20px 16px;
+  }
+}
+.repair-upload-icon {
+  font-size: 42px;
+  color: var(--el-color-primary);
+  margin-bottom: 8px;
+}
+</style>

--
Gitblit v1.9.3