From 91dec349aa88c58c587199d9601529d60824e1d0 Mon Sep 17 00:00:00 2001
From: zhangwencui <1064582902@qq.com>
Date: 星期四, 02 七月 2026 13:24:34 +0800
Subject: [PATCH] 生产订单对齐管理端新增两个字段展示

---
 src/pages/equipmentManagement/upkeep/maintain.vue |  191 +++++++++++++++++++++--------------------------
 1 files changed, 84 insertions(+), 107 deletions(-)

diff --git a/src/pages/equipmentManagement/upkeep/maintain.vue b/src/pages/equipmentManagement/upkeep/maintain.vue
index b11a585..3abfc58 100644
--- a/src/pages/equipmentManagement/upkeep/maintain.vue
+++ b/src/pages/equipmentManagement/upkeep/maintain.vue
@@ -79,7 +79,6 @@
                   @click="showSparePartPicker" />
         </template>
       </u-form-item>
-
       <u-form-item v-if="selectedSpareParts.length"
                    label="棰嗙敤鏁伴噺"
                    border-bottom>
@@ -101,81 +100,9 @@
       <!-- 涓婁紶闄勪欢 -->
       <u-form-item v-if="form.status == '1'"
                    label="淇濆吇闄勪欢"
+                   prop="storageBlobDTOs"
                    border-bottom>
-        <view class="simple-upload-area">
-          <view class="upload-buttons">
-            <u-button type="primary"
-                      @click="chooseMedia('image')"
-                      :loading="uploading"
-                      :disabled="uploadFiles.length >= uploadConfig.limit"
-                      :customStyle="{ marginRight: '10px', flex: 1 }">
-              <u-icon name="camera"
-                      size="18"
-                      color="#fff"
-                      style="margin-right: 5px;"></u-icon>
-              {{ uploading ? '涓婁紶涓�...' : '鎷嶇収' }}
-            </u-button>
-            <!-- <u-button type="success"
-                      @click="chooseMedia('video')"
-                      :loading="uploading"
-                      :disabled="uploadFiles.length >= uploadConfig.limit"
-                      :customStyle="{ flex: 1 }">
-              <uni-icons type="videocam"
-                         name="videocam"
-                         size="18"
-                         color="#fff"
-                         style="margin-right: 5px;"></uni-icons>
-              {{ uploading ? '涓婁紶涓�...' : '鎷嶈棰�' }}
-            </u-button> -->
-          </view>
-          <!-- 涓婁紶杩涘害 -->
-          <view v-if="uploading"
-                class="upload-progress">
-            <u-line-progress :percentage="uploadProgress"
-                             :showText="true"
-                             activeColor="#409eff"></u-line-progress>
-          </view>
-          <!-- 涓婁紶鐨勬枃浠跺垪琛� -->
-          <view v-if="uploadFiles.length > 0"
-                class="file-list">
-            <view v-for="(file, index) in uploadFiles"
-                  :key="index"
-                  class="file-item">
-              <view class="file-preview-container">
-                <!-- {{formatFileUrl(file.url)}} -->
-                <image v-if="file.type === 'image' || isImageFile(file)"
-                       :src="formatFileUrl(file.url || file.tempFilePath || file.path || file.downloadUrl)"
-                       class="file-preview"
-                       mode="aspectFill" />
-                <view v-else-if="file.type === 'video'"
-                      class="video-preview">
-                  <uni-icons type="videocam"
-                             name="videocam"
-                             size="18"
-                             color="#fff"
-                             style="margin-right: 5px;"></uni-icons>
-                  <text class="video-text">瑙嗛</text>
-                </view>
-                <!-- 鍒犻櫎鎸夐挳 -->
-                <view class="delete-btn"
-                      @click="removeFile(index)">
-                  <u-icon name="close"
-                          size="12"
-                          color="#fff"></u-icon>
-                </view>
-              </view>
-              <view class="file-info">
-                <text class="file-name">{{ file.bucketFilename || file.name || (file.type === 'image' ? '鍥剧墖' : '瑙嗛')
-                  }}</text>
-                <text class="file-size">{{ formatFileSize(file.size) }}</text>
-              </view>
-            </view>
-          </view>
-          <view v-if="uploadFiles.length === 0"
-                class="empty-state">
-            <text>璇烽�夋嫨瑕佷笂浼犵殑淇濆吇鍥剧墖</text>
-          </view>
-        </view>
+        <CommonUpload v-model="form.storageBlobDTOs" />
       </u-form-item>
       <!-- 鎻愪氦鎸夐挳 -->
       <view class="footer-btns">
@@ -236,10 +163,9 @@
   import { ref, onMounted, reactive } from "vue";
   import { onShow } from "@dcloudio/uni-app";
   import PageHeader from "@/components/PageHeader.vue";
-  import {
-    addMaintenance,
-  } from "@/api/equipmentManagement/upkeep";
-  import { getSparePartsList } from "@/api/equipmentManagement/spareParts";
+  import CommonUpload from "@/components/CommonUpload.vue";
+  import { addMaintenance } from "@/api/equipmentManagement/upkeep";
+  import { getSparePartsList } from "@/api/equipmentManagement/repair";
   import useUserStore from "@/store/modules/user";
   import dayjs from "dayjs";
   import { formatDateToYMD } from "@/utils/ruoyi";
@@ -278,7 +204,6 @@
   const sparePartsQtyRaw = ref("");
 
   // 鏂囦欢涓婁紶鐩稿叧
-  const uploadFiles = ref([]);
   const uploading = ref(false);
   const uploadProgress = ref(0);
   const number = ref(0);
@@ -319,6 +244,7 @@
     maintenanceResult: undefined, // 淇濆吇缁撴灉
     maintenanceActuallyTime: dayjs().format("YYYY-MM-DD HH:mm:ss"), // 瀹為檯淇濆吇鏃ユ湡锛堝彧鏄剧ず鏃ユ湡锛�
     sparePartsIds: undefined, // 璁惧澶囦欢ID
+    storageBlobDTOs: [], // 淇濆吇闄勪欢
   });
 
   // 娓呴櫎琛ㄥ崟鏍¢獙鐘舵��
@@ -333,11 +259,12 @@
       maintenanceResult: undefined,
       maintenanceActuallyTime: dayjs().format("YYYY-MM-DD HH:mm:ss"),
       sparePartsIds: [],
+      storageBlobDTOs: [],
     };
     maintenancestatusText.value = "";
     selectedSpareParts.value = [];
     tempSelectedSpareParts.value = [];
-    Object.keys(sparePartQtyMap).forEach((k) => delete sparePartQtyMap[k]);
+    Object.keys(sparePartQtyMap).forEach(k => delete sparePartQtyMap[k]);
     sparePartsQtyRaw.value = "";
   };
 
@@ -377,7 +304,11 @@
       } else if (form.value.maintenanceResult === undefined) {
         isValid = false;
         errorMessage = "璇烽�夋嫨淇濆吇缁撴灉";
-      } else if (uploadFiles.value.length === 0 && form.value.status == "1") {
+      } else if (
+        (!form.value.storageBlobDTOs ||
+          form.value.storageBlobDTOs.length === 0) &&
+        form.value.status == "1"
+      ) {
         isValid = false;
         errorMessage = "璇蜂笂浼犱繚鍏荤収鐗�";
       }
@@ -406,7 +337,9 @@
         return;
       }
       // 棰嗙敤鏁伴噺鏍¢獙
-      const spareIds = Array.isArray(form.value.sparePartsIds) ? form.value.sparePartsIds : [];
+      const spareIds = Array.isArray(form.value.sparePartsIds)
+        ? form.value.sparePartsIds
+        : [];
       if (spareIds.length > 0) {
         for (const partId of spareIds) {
           const qty = Number(sparePartQtyMap?.[partId]);
@@ -415,11 +348,19 @@
             loading.value = false;
             return;
           }
-          const part = sparePartOptions.value.find((p) => String(p.id || p.value) === String(partId));
+          const part = sparePartOptions.value.find(
+            p => String(p.id || p.value) === String(partId)
+          );
           const stock = part?.quantity;
-          if (stock !== null && stock !== undefined && Number.isFinite(Number(stock))) {
+          if (
+            stock !== null &&
+            stock !== undefined &&
+            Number.isFinite(Number(stock))
+          ) {
             if (qty > Number(stock)) {
-              showToast(`澶囦欢銆�${part?.name || ""}銆嶉鐢ㄦ暟閲忎笉鑳借秴杩囧簱瀛橈紙${stock}锛塦);
+              showToast(
+                `澶囦欢銆�${part?.name || ""}銆嶉鐢ㄦ暟閲忎笉鑳借秴杩囧簱瀛橈紙${stock}锛塦
+              );
               loading.value = false;
               return;
             }
@@ -429,10 +370,16 @@
 
       const submitData = {
         ...form.value,
-        imagesFile: form.value.status == "1" ? uploadFiles.value : [],
         sparePartsIds: spareIds.length ? spareIds.join(",") : "",
-        sparePartsQty: spareIds.length ? spareIds.map((pid) => sparePartQtyMap?.[pid] ?? 1).join(",") : "",
-        sparePartsUseList: spareIds.length ? spareIds.map((pid) => ({ id: pid, quantity: sparePartQtyMap?.[pid] ?? 1 })) : [],
+        sparePartsQty: spareIds.length
+          ? spareIds.map(pid => sparePartQtyMap?.[pid] ?? 1).join(",")
+          : "",
+        sparePartsUseList: spareIds.length
+          ? spareIds.map(pid => ({
+              id: pid,
+              quantity: sparePartQtyMap?.[pid] ?? 1,
+            }))
+          : [],
       };
       const { code } = await addMaintenance({ id: id, ...submitData });
 
@@ -512,10 +459,13 @@
   // 鏄剧ず璁惧澶囦欢閫夋嫨鍣�
   const showSparePartPicker = () => {
     tempSelectedSpareParts.value = [...selectedSpareParts.value];
-    tempSelectedSpareParts.value.forEach((p) => {
+    tempSelectedSpareParts.value.forEach(p => {
       const pid = p?.id ?? p?.value;
       if (pid !== null && pid !== undefined) {
-        if (!Number.isFinite(Number(sparePartQtyMap[pid])) || Number(sparePartQtyMap[pid]) <= 0) {
+        if (
+          !Number.isFinite(Number(sparePartQtyMap[pid])) ||
+          Number(sparePartQtyMap[pid]) <= 0
+        ) {
           sparePartQtyMap[pid] = 1;
         }
       }
@@ -541,7 +491,10 @@
       delete sparePartQtyMap[itemId];
     } else {
       tempSelectedSpareParts.value.push(item);
-      if (!Number.isFinite(Number(sparePartQtyMap[itemId])) || Number(sparePartQtyMap[itemId]) <= 0) {
+      if (
+        !Number.isFinite(Number(sparePartQtyMap[itemId])) ||
+        Number(sparePartQtyMap[itemId]) <= 0
+      ) {
         sparePartQtyMap[itemId] = 1;
       }
     }
@@ -550,11 +503,16 @@
   // 纭澶囦欢閫夋嫨
   const confirmSparePartSelection = () => {
     selectedSpareParts.value = [...tempSelectedSpareParts.value];
-    form.value.sparePartsIds = selectedSpareParts.value.map(item => item.id || item.value);
-    selectedSpareParts.value.forEach((p) => {
+    form.value.sparePartsIds = selectedSpareParts.value.map(
+      item => item.id || item.value
+    );
+    selectedSpareParts.value.forEach(p => {
       const pid = p?.id ?? p?.value;
       if (pid !== null && pid !== undefined) {
-        if (!Number.isFinite(Number(sparePartQtyMap[pid])) || Number(sparePartQtyMap[pid]) <= 0) {
+        if (
+          !Number.isFinite(Number(sparePartQtyMap[pid])) ||
+          Number(sparePartQtyMap[pid]) <= 0
+        ) {
           sparePartQtyMap[pid] = 1;
         }
       }
@@ -565,7 +523,9 @@
   // 绉婚櫎宸查�夊浠�
   const removeSparePart = index => {
     const removed = selectedSpareParts.value.splice(index, 1)[0];
-    form.value.sparePartsIds = selectedSpareParts.value.map(item => item.id || item.value);
+    form.value.sparePartsIds = selectedSpareParts.value.map(
+      item => item.id || item.value
+    );
     const rid = removed?.id ?? removed?.value;
     if (rid !== null && rid !== undefined) delete sparePartQtyMap[rid];
   };
@@ -578,7 +538,7 @@
     // 閲嶇疆閫夋嫨鐨勫浠�
     selectedSpareParts.value = [];
     // 閲嶇疆涓婁紶鐨勬枃浠�
-    uploadFiles.value = [];
+    form.value.storageBlobDTOs = [];
     uploading.value = false;
     uploadProgress.value = 0;
     maintenancestatusText.value = "";
@@ -628,8 +588,10 @@
       sparePartsIds.value = itemData.sparePartsIds;
 
       // 濉厖闄勪欢鏁版嵁
-      if (itemData.files && itemData.files.length > 0) {
-        uploadFiles.value = itemData.files.map(file => ({
+      if (itemData.storageBlobVOs && itemData.storageBlobVOs.length > 0) {
+        form.value.storageBlobDTOs = itemData.storageBlobVOs;
+      } else if (itemData.files && itemData.files.length > 0) {
+        form.value.storageBlobDTOs = itemData.files.map(file => ({
           id: file.id,
           name: file.name || file.bucketFilename || file.originalFilename,
           url: file.url || file.downloadUrl,
@@ -641,7 +603,7 @@
           size: file.size || file.byteSize,
         }));
       } else if (itemData.uploadFiles && itemData.uploadFiles.length > 0) {
-        uploadFiles.value = itemData.uploadFiles.map(file => ({
+        form.value.storageBlobDTOs = itemData.uploadFiles.map(file => ({
           id: file.id,
           name: file.name || file.bucketFilename || file.originalFilename,
           url: file.url || file.downloadUrl || file.tempFilePath || file.path,
@@ -671,7 +633,9 @@
             const idArray =
               typeof sparePartsIds.value === "string"
                 ? sparePartsIds.value.split(",")
-                : (Array.isArray(sparePartsIds.value) ? sparePartsIds.value : []);
+                : Array.isArray(sparePartsIds.value)
+                ? sparePartsIds.value
+                : [];
 
             if (idArray.length > 0) {
               selectedSpareParts.value = sparePartOptions.value
@@ -688,28 +652,41 @@
                   quantity: option.quantity,
                 }));
               // 璁剧疆澶囦欢IDs锛堜繚鎸佹暟缁勶紝鎻愪氦鏃跺啀 join锛�
-              form.value.sparePartsIds = idArray.map((v) => {
+              form.value.sparePartsIds = idArray.map(v => {
                 const n = Number(String(v).trim());
                 return Number.isFinite(n) ? n : String(v).trim();
               });
 
               // 鍥炴樉棰嗙敤鏁伴噺锛堣嫢鏈� sparePartsQty锛�
-              if (typeof sparePartsQtyRaw.value === "string" && sparePartsQtyRaw.value.trim()) {
-                const qtyArr = sparePartsQtyRaw.value.split(",").map((s) => Number(String(s).trim()));
+              if (
+                typeof sparePartsQtyRaw.value === "string" &&
+                sparePartsQtyRaw.value.trim()
+              ) {
+                const qtyArr = sparePartsQtyRaw.value
+                  .split(",")
+                  .map(s => Number(String(s).trim()));
                 selectedSpareParts.value.forEach((p, idx) => {
                   const pid = p?.id ?? p?.value;
                   const q = qtyArr[idx];
-                  if (pid !== null && pid !== undefined && Number.isFinite(q) && q > 0) {
+                  if (
+                    pid !== null &&
+                    pid !== undefined &&
+                    Number.isFinite(q) &&
+                    q > 0
+                  ) {
                     sparePartQtyMap[pid] = q;
                   }
                 });
               }
 
               // 榛樿鏁伴噺鍏滃簳
-              selectedSpareParts.value.forEach((p) => {
+              selectedSpareParts.value.forEach(p => {
                 const pid = p?.id ?? p?.value;
                 if (pid !== null && pid !== undefined) {
-                  if (!Number.isFinite(Number(sparePartQtyMap[pid])) || Number(sparePartQtyMap[pid]) <= 0) {
+                  if (
+                    !Number.isFinite(Number(sparePartQtyMap[pid])) ||
+                    Number(sparePartQtyMap[pid]) <= 0
+                  ) {
                     sparePartQtyMap[pid] = 1;
                   }
                 }

--
Gitblit v1.9.3