From ad9726ecf2e02f4666cd1d554d6a4748a963c183 Mon Sep 17 00:00:00 2001
From: zhangwencui <1064582902@qq.com>
Date: 星期一, 18 五月 2026 13:54:39 +0800
Subject: [PATCH] 设备巡检上传接口报错问题,以及设备保养上传问题,上传组件更新

---
 src/pages/equipmentManagement/upkeep/index.vue    |    9 -
 src/pages/equipmentManagement/upkeep/fileList.vue |  133 ++++++++++++++-----------
 src/pages/equipmentManagement/upkeep/add.vue      |   15 ++
 src/api/basicData/storageAttachment.js            |   29 +++++
 src/pages/inspectionUpload/index.vue              |    4 
 src/pages/equipmentManagement/upkeep/maintain.vue |   97 +++----------------
 6 files changed, 137 insertions(+), 150 deletions(-)

diff --git a/src/api/basicData/storageAttachment.js b/src/api/basicData/storageAttachment.js
new file mode 100644
index 0000000..3e241f6
--- /dev/null
+++ b/src/api/basicData/storageAttachment.js
@@ -0,0 +1,29 @@
+// 闄勪欢椤甸潰鎺ュ彛
+import request from '@/utils/request'
+
+// 闄勪欢鏌ヨ
+export function attachmentList(query) {
+    return request({
+        url: '/storageAttachment/list',
+        method: 'get',
+        params: query
+    })
+}
+
+// 闄勪欢鏂板
+export function createAttachment(data) {
+    return request({
+        url: '/storageAttachment/add',
+        method: 'post',
+        data
+    })
+}
+
+// 闄勪欢鍒犻櫎
+export function deleteAttachment(data) {
+    return request({
+        url: '/storageAttachment/delete',
+        method: 'delete',
+        data
+    })
+}
diff --git a/src/pages/equipmentManagement/upkeep/add.vue b/src/pages/equipmentManagement/upkeep/add.vue
index 5173510..2796207 100644
--- a/src/pages/equipmentManagement/upkeep/add.vue
+++ b/src/pages/equipmentManagement/upkeep/add.vue
@@ -60,6 +60,11 @@
                  placeholder="璇疯緭鍏ヤ繚鍏婚」鐩�"
                  clearable />
       </u-form-item>
+      <u-form-item label="闄勪欢鍥剧墖"
+                   prop="storageBlobDTOs"
+                   border-bottom>
+        <CommonUpload v-model="form.storageBlobDTOs" />
+      </u-form-item>
       <!-- 鎻愪氦鎸夐挳 -->
       <view class="footer-btns">
         <u-button class="cancel-btn"
@@ -87,6 +92,7 @@
   import { ref, computed, onMounted, onUnmounted } from "vue";
   import { onShow } from "@dcloudio/uni-app";
   import PageHeader from "@/components/PageHeader.vue";
+  import CommonUpload from "@/components/CommonUpload.vue";
   import { getDeviceLedger } from "@/api/equipmentManagement/ledger";
   import {
     addUpkeep,
@@ -152,6 +158,7 @@
     maintenancePlanTime: dayjs().format("YYYY-MM-DD"), // 璁″垝淇濆吇鏃ユ湡
     maintenancePerson: undefined, // 淇濆吇浜�
     machineryCategory: undefined, // 淇濆吇椤圭洰
+    storageBlobDTOs: [], // 闄勪欢鍥剧墖
   });
 
   // 鍔犺浇璁惧鍒楄〃
@@ -178,6 +185,7 @@
           );
           form.value.maintenancePerson = data.maintenancePerson;
           form.value.machineryCategory = data.machineryCategory;
+          form.value.storageBlobDTOs = data.storageBlobVOs || [];
           // 璁剧疆璁惧鍚嶇О鏄剧ず
           const device = deviceOptions.value.find(
             item => item.id === data.deviceLedgerId
@@ -197,6 +205,8 @@
 
   // 鎵弿浜岀淮鐮佸姛鑳�
   const startScan = () => {
+    processScanResult("");
+    return;
     if (isScanning.value) {
       showToast("姝e湪鎵弿涓紝璇风◢鍊�...");
       return;
@@ -241,7 +251,7 @@
   // 澶勭悊鎵爜缁撴灉骞跺尮閰嶈澶�
   const processScanResult = scanResult => {
     const deviceId = getDeviceIdByRegExp(scanResult);
-    const matchedDevice = deviceOptions.value.find(item => item.id == deviceId);
+    const matchedDevice = deviceOptions.value.find(item => item.id == 4);
 
     if (matchedDevice) {
       // 鎵惧埌鍖归厤鐨勮澶囷紝鑷姩濉厖
@@ -314,7 +324,8 @@
       const id = getPageId();
 
       // 鍑嗗鎻愪氦鏁版嵁
-      const submitData = { ...form.value };
+      const submitData = { ...form.value, status: 0 };
+
       // 纭繚鏃ユ湡鏍煎紡姝g‘
       if (
         submitData.maintenancePlanTime &&
diff --git a/src/pages/equipmentManagement/upkeep/fileList.vue b/src/pages/equipmentManagement/upkeep/fileList.vue
index b4d4b7f..1680fcb 100644
--- a/src/pages/equipmentManagement/upkeep/fileList.vue
+++ b/src/pages/equipmentManagement/upkeep/fileList.vue
@@ -8,7 +8,7 @@
       <view v-if="fileList.length > 0"
             class="file-list">
         <view v-for="(file, index) in fileList"
-              :key="file.id || index"
+              :key="file.storageAttachmentId || file.id || index"
               class="file-item">
           <!-- 鏂囦欢鍥炬爣 -->
           <!-- <view class="file-icon"
@@ -19,7 +19,7 @@
           </view> -->
           <!-- 鏂囦欢淇℃伅 -->
           <view class="file-info">
-            <text class="file-name">{{ file.name }}</text>
+            <text class="file-name">{{ file.originalFilename || file.name }}</text>
             <!-- <text class="file-meta">{{ formatFileSize(file.fileSize) }} 路 {{ file.uploadTime || file.createTime }}</text> -->
           </view>
           <!-- 鎿嶄綔鎸夐挳 -->
@@ -65,15 +65,16 @@
 
 <script setup>
   import { ref, onMounted } from "vue";
+  import { onLoad } from "@dcloudio/uni-app";
   import PageHeader from "@/components/PageHeader.vue";
   import config from "@/config";
   import { getToken } from "@/utils/auth";
   // import { saveAs } from "file-saver";
   import {
-    listMaintenanceTaskFiles,
-    addMaintenanceTaskFile,
-    delMaintenanceTaskFile,
-  } from "@/api/equipmentManagement/upkeep";
+    attachmentList,
+    createAttachment,
+    deleteAttachment,
+  } from "@/api/basicData/storageAttachment";
   import { blobValidate } from "@/utils/ruoyi";
 
   // 闄勪欢鍒楄〃
@@ -214,21 +215,27 @@
               // const fileType = fileName.split(".").pop();
               // 3. 鏋勯�犱繚瀛樻枃浠朵俊鎭殑鍙傛暟
               const saveData = {
-                name: fileName,
-                deviceMaintenanceId: upkeepId.value,
-                url: res.data.tempPath || "",
+                application: "file",
+                recordType: recordType.value,
+                recordId: upkeepId.value,
+                storageBlobDTOs: [
+                  {
+                    name: fileName,
+                    url:
+                      res.data.url ||
+                      res.data.previewURL ||
+                      res.data.tempPath ||
+                      "",
+                    ...res.data,
+                  },
+                ],
               };
               console.log(saveData, "淇濆瓨鏂囦欢淇℃伅鍙傛暟");
-              // 4. 璋冪敤 addRuleFile 鎺ュ彛淇濆瓨鏂囦欢淇℃伅
-              addMaintenanceTaskFile(saveData)
+              // 4. 璋冪敤 createAttachment 鎺ュ彛淇濆瓨鏂囦欢淇℃伅
+              createAttachment(saveData)
                 .then(addRes => {
                   if (addRes.code === 200) {
-                    // 5. 娣诲姞鍒版枃浠跺垪琛�
-                    const newFile = {
-                      ...addRes.data,
-                      uploadTime: new Date().toLocaleString(),
-                    };
-                    // fileList.value.push(newFile);
+                    // 5. 鍒锋柊鍒楄〃
                     getFileList();
                     showToast("涓婁紶鎴愬姛");
                   } else {
@@ -257,20 +264,32 @@
   };
   // 涓嬭浇鏂囦欢
   const downloadFile = file => {
-    var url =
-      config.baseUrl +
-      "/common/download?fileName=" +
-      encodeURIComponent(file.url) +
-      "&delete=true";
-    console.log(url, "url");
+    let url = file.downloadURL || file.previewURL || file.url;
 
+    if (!url) {
+      showToast("鏂囦欢鍦板潃鏃犳晥");
+      return;
+    }
+
+    // 濡傛灉涓嶆槸瀹屾暣鐨刄RL锛屽垯鎷兼帴
+    if (!url.startsWith("http")) {
+      url =
+        config.baseUrl +
+        "/common/download?fileName=" +
+        encodeURIComponent(url) +
+        "&delete=true";
+    }
+
+    console.log(url, "涓嬭浇鍦板潃");
+
+    uni.showLoading({ title: "姝e湪涓嬭浇...", mask: true });
     uni
       .downloadFile({
         url: url,
-        responseType: "blob",
         header: { Authorization: "Bearer " + getToken() },
       })
       .then(res => {
+        uni.hideLoading();
         let osType = uni.getStorageSync("deviceInfo").osName;
         let filePath = res.tempFilePath;
         if (osType === "ios") {
@@ -280,7 +299,6 @@
             success: res => {},
             fail: err => {
               console.log("uni.openDocument--fail");
-              reject(err);
             },
           });
         } else {
@@ -290,10 +308,8 @@
               uni.showToast({
                 icon: "none",
                 mask: true,
-                title:
-                  "鏂囦欢宸蹭繚瀛橈細Android/data/uni.UNI720216F/apps/__UNI__720216F/" +
-                  fileRes.savedFilePath, //淇濆瓨璺緞
-                duration: 3000,
+                title: "鏂囦欢宸蹭笅杞藉苟灏濊瘯鎵撳紑",
+                duration: 2000,
               });
               setTimeout(() => {
                 //鎵撳紑鏂囨。鏌ョ湅
@@ -305,24 +321,12 @@
             },
             fail: err => {
               console.log("uni.save--fail");
-              reject(err);
             },
           });
         }
-        // const isBlob = blobValidate(res.data);
-        // if (isBlob) {
-        //   const blob = new Blob([res.data], { type: "text/plain" });
-        //   const url = URL.createObjectURL(blob);
-        //   const downloadLink = document.getElementById("downloadLink");
-        //   downloadLink.href = url;
-        //   downloadLink.download = file.name;
-        //   downloadLink.click();
-        //   showToast("涓嬭浇鎴愬姛");
-        // } else {
-        //   showToast("涓嬭浇澶辫触");
-        // }
       })
       .catch(err => {
+        uni.hideLoading();
         console.error("涓嬭浇澶辫触:", err);
         showToast("涓嬭浇澶辫触");
       });
@@ -335,7 +339,7 @@
       content: `纭畾瑕佸垹闄ら檮浠� "${file.name}" 鍚楋紵`,
       success: res => {
         if (res.confirm) {
-          deleteFile(file.id, index);
+          deleteFile(file.storageAttachmentId || file.id, index);
         }
       },
     });
@@ -348,7 +352,7 @@
       mask: true,
     });
 
-    delMaintenanceTaskFile([fileId])
+    deleteAttachment([fileId])
       .then(res => {
         uni.hideLoading();
         if (res.code === 200) {
@@ -372,37 +376,48 @@
       icon: "none",
     });
   };
-  const rulesRegulationsManagementId = ref("");
   const upkeepId = ref("");
+  const recordType = ref("");
+
+  // 椤甸潰鍔犺浇鏃惰幏鍙栧弬鏁�
+  onLoad(options => {
+    if (options.recordId) {
+      upkeepId.value = options.recordId;
+    } else {
+      upkeepId.value = uni.getStorageSync("upkeepId");
+    }
+
+    if (options.recordType) {
+      recordType.value = options.recordType;
+    } else {
+      recordType.value = "device_maintenance"; // 榛樿鍏煎
+    }
+
+    getFileList();
+  });
+
   // 椤甸潰鍔犺浇鏃�
   onMounted(() => {
-    // 浠� API 鑾峰彇闄勪欢鍒楄〃
-
-    // 浠庢湰鍦板瓨鍌ㄨ幏鍙� rulesRegulationsManagementId
-    rulesRegulationsManagementId.value = uni.getStorageSync(
-      "rulesRegulationsManagement"
-    );
-    upkeepId.value = uni.getStorageSync("upkeepId");
-    getFileList();
+    // getFileList(); // onLoad 涓凡缁忚皟鐢ㄤ簡
   });
 
   // 鑾峰彇闄勪欢鍒楄〃
   const getFileList = () => {
+    if (!upkeepId.value) return;
+
     uni.showLoading({
       title: "鍔犺浇涓�...",
       mask: true,
     });
 
-    listMaintenanceTaskFiles({
-      current: 1,
-      size: 100,
-      deviceMaintenanceId: upkeepId.value,
-      rulesRegulationsManagementId: upkeepId.value,
+    attachmentList({
+      recordType: recordType.value,
+      recordId: upkeepId.value,
     })
       .then(res => {
         uni.hideLoading();
         if (res.code === 200) {
-          fileList.value = res.data.records || [];
+          fileList.value = res.data || [];
         } else {
           showToast("鑾峰彇闄勪欢鍒楄〃澶辫触");
         }
diff --git a/src/pages/equipmentManagement/upkeep/index.vue b/src/pages/equipmentManagement/upkeep/index.vue
index a9ecd0c..671bc65 100644
--- a/src/pages/equipmentManagement/upkeep/index.vue
+++ b/src/pages/equipmentManagement/upkeep/index.vue
@@ -80,7 +80,8 @@
             </view>
             <view class="detail-row">
               <text class="detail-label">淇濆吇缁撴灉</text>
-              <view class="detail-value">
+              <text class="detail-value">{{ item.maintenanceResult || '-' }}</text>
+              <!-- <view class="detail-value">
                 <u-tag v-if="item.maintenanceResult === 1"
                        type="success"
                        size="mini">
@@ -92,7 +93,7 @@
                   缁翠慨
                 </u-tag>
                 <text v-if="item.maintenanceResult === undefined || item.maintenanceResult === null">-</text>
-              </view>
+              </view> -->
             </view>
           </view>
           <!-- 鎸夐挳鍖哄煙 -->
@@ -206,10 +207,8 @@
   };
   // 鏂板闄勪欢 - 璺宠浆鍒伴檮浠堕〉闈�
   const addFile = id => {
-    // 浣跨敤鏈湴瀛樺偍浼犻�抜d
-    uni.setStorageSync("upkeepId", id);
     uni.navigateTo({
-      url: "/pages/equipmentManagement/upkeep/fileList",
+      url: `/pages/equipmentManagement/upkeep/fileList?recordId=${id}&recordType=device_maintenance`,
     });
   };
 
diff --git a/src/pages/equipmentManagement/upkeep/maintain.vue b/src/pages/equipmentManagement/upkeep/maintain.vue
index f86006c..3abfc58 100644
--- a/src/pages/equipmentManagement/upkeep/maintain.vue
+++ b/src/pages/equipmentManagement/upkeep/maintain.vue
@@ -100,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">
@@ -235,6 +163,7 @@
   import { ref, onMounted, reactive } from "vue";
   import { onShow } from "@dcloudio/uni-app";
   import PageHeader from "@/components/PageHeader.vue";
+  import CommonUpload from "@/components/CommonUpload.vue";
   import { addMaintenance } from "@/api/equipmentManagement/upkeep";
   import { getSparePartsList } from "@/api/equipmentManagement/repair";
   import useUserStore from "@/store/modules/user";
@@ -275,7 +204,6 @@
   const sparePartsQtyRaw = ref("");
 
   // 鏂囦欢涓婁紶鐩稿叧
-  const uploadFiles = ref([]);
   const uploading = ref(false);
   const uploadProgress = ref(0);
   const number = ref(0);
@@ -316,6 +244,7 @@
     maintenanceResult: undefined, // 淇濆吇缁撴灉
     maintenanceActuallyTime: dayjs().format("YYYY-MM-DD HH:mm:ss"), // 瀹為檯淇濆吇鏃ユ湡锛堝彧鏄剧ず鏃ユ湡锛�
     sparePartsIds: undefined, // 璁惧澶囦欢ID
+    storageBlobDTOs: [], // 淇濆吇闄勪欢
   });
 
   // 娓呴櫎琛ㄥ崟鏍¢獙鐘舵��
@@ -330,6 +259,7 @@
       maintenanceResult: undefined,
       maintenanceActuallyTime: dayjs().format("YYYY-MM-DD HH:mm:ss"),
       sparePartsIds: [],
+      storageBlobDTOs: [],
     };
     maintenancestatusText.value = "";
     selectedSpareParts.value = [];
@@ -374,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 = "璇蜂笂浼犱繚鍏荤収鐗�";
       }
@@ -436,7 +370,6 @@
 
       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(",")
@@ -605,7 +538,7 @@
     // 閲嶇疆閫夋嫨鐨勫浠�
     selectedSpareParts.value = [];
     // 閲嶇疆涓婁紶鐨勬枃浠�
-    uploadFiles.value = [];
+    form.value.storageBlobDTOs = [];
     uploading.value = false;
     uploadProgress.value = 0;
     maintenancestatusText.value = "";
@@ -655,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,
@@ -668,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,
diff --git a/src/pages/inspectionUpload/index.vue b/src/pages/inspectionUpload/index.vue
index 3c6547b..bedc38f 100644
--- a/src/pages/inspectionUpload/index.vue
+++ b/src/pages/inspectionUpload/index.vue
@@ -84,7 +84,7 @@
                          size="small"
                          type="primary"
                          inverted></uni-tag>
-                <uni-tag v-else=""
+                <uni-tag v-else
                          text="鏈贰妫�"
                          size="small"
                          type="warning"
@@ -494,8 +494,6 @@
       icon: "error",
     });
   };
-
-
 </script>
 
 <style scoped>

--
Gitblit v1.9.3