From 2d4ee49af27e50a4a394f902033704a01f2462d4 Mon Sep 17 00:00:00 2001
From: yyb <995253665@qq.com>
Date: 星期一, 18 五月 2026 14:04:05 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev_NEW_pro' into dev_NEW_pro_鹤壁

---
 src/pages/equipmentManagement/upkeep/index.vue    |    9 
 src/pages/inspectionUpload/upload.vue             | 1537 ++++++++++++++++++++++++++-----------------------
 src/pages/equipmentManagement/upkeep/fileList.vue |  133 ++-
 src/pages/equipmentManagement/upkeep/add.vue      |   11 
 src/api/basicData/storageAttachment.js            |   29 
 src/pages/inspectionUpload/index.vue              |    4 
 src/pages/equipmentManagement/upkeep/maintain.vue |   97 --
 7 files changed, 951 insertions(+), 869 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..5f3bd40 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
@@ -314,7 +322,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>
diff --git a/src/pages/inspectionUpload/upload.vue b/src/pages/inspectionUpload/upload.vue
index 746e995..6d95785 100644
--- a/src/pages/inspectionUpload/upload.vue
+++ b/src/pages/inspectionUpload/upload.vue
@@ -1,12 +1,13 @@
 <template>
   <view class="inspection-upload-page">
     <!-- 椤甸潰澶撮儴 -->
-    <PageHeader title="涓婁紶宸℃璁板綍" @back="goBack" />
-
+    <PageHeader title="涓婁紶宸℃璁板綍"
+                @back="goBack" />
     <!-- 椤甸潰鍐呭 -->
     <view class="upload-content">
       <!-- 浠诲姟淇℃伅鍗$墖 -->
-      <view class="task-info-card" v-if="taskInfo">
+      <view class="task-info-card"
+            v-if="taskInfo">
         <view class="task-info-header">
           <text class="task-name">{{ taskInfo.taskName }}</text>
         </view>
@@ -25,114 +26,115 @@
           </view>
         </view>
       </view>
-
       <!-- 寮傚父鐘舵�侀�夋嫨 -->
       <view class="section-card">
         <view class="section-title">宸℃鐘舵��</view>
         <view class="exception-options">
-          <view
-            class="exception-option"
-            :class="{ active: hasException === false }"
-            @click="setExceptionStatus(false)"
-          >
-            <u-icon name="checkmark-circle" size="20" color="#52c41a"></u-icon>
+          <view class="exception-option"
+                :class="{ active: hasException === false }"
+                @click="setExceptionStatus(false)">
+            <u-icon name="checkmark-circle"
+                    size="20"
+                    color="#52c41a"></u-icon>
             <text class="option-text">姝e父</text>
           </view>
-          <view
-            class="exception-option"
-            :class="{ active: hasException === true }"
-            @click="setExceptionStatus(true)"
-          >
-            <u-icon name="close-circle" size="20" color="#ff4d4f"></u-icon>
+          <view class="exception-option"
+                :class="{ active: hasException === true }"
+                @click="setExceptionStatus(true)">
+            <u-icon name="close-circle"
+                    size="20"
+                    color="#ff4d4f"></u-icon>
             <text class="option-text">瀛樺湪寮傚父</text>
           </view>
         </view>
       </view>
-
       <!-- 寮傚父鎻忚堪锛堜粎鍦ㄥ紓甯告椂鏄剧ず锛� -->
-      <view class="section-card" v-if="hasException === true">
+      <view class="section-card"
+            v-if="hasException === true">
         <view class="section-title">寮傚父鎻忚堪</view>
-        <textarea
-          v-model="abnormalDescription"
-          class="exception-textarea"
-          maxlength="500"
-          placeholder="璇锋弿杩板紓甯告儏鍐�..."
-        />
+        <textarea v-model="abnormalDescription"
+                  class="exception-textarea"
+                  maxlength="500"
+                  placeholder="璇锋弿杩板紓甯告儏鍐�..." />
       </view>
-
       <!-- 鍒嗙被鏍囩椤碉紙浠呭湪寮傚父鏃舵樉绀猴級 -->
-      <view class="section-card" v-if="hasException === true">
+      <view class="section-card"
+            v-if="hasException === true">
         <view class="upload-tabs">
-          <view
-            class="tab-item"
-            :class="{ active: currentUploadType === 'before' }"
-            @click="switchUploadType('before')"
-          >
+          <view class="tab-item"
+                :class="{ active: currentUploadType === 'before' }"
+                @click="switchUploadType('before')">
             鐢熶骇鍓�
           </view>
-          <view
-            class="tab-item"
-            :class="{ active: currentUploadType === 'after' }"
-            @click="switchUploadType('after')"
-          >
+          <view class="tab-item"
+                :class="{ active: currentUploadType === 'after' }"
+                @click="switchUploadType('after')">
             鐢熶骇涓�
           </view>
-          <view
-            class="tab-item"
-            :class="{ active: currentUploadType === 'issue' }"
-            @click="switchUploadType('issue')"
-          >
+          <view class="tab-item"
+                :class="{ active: currentUploadType === 'issue' }"
+                @click="switchUploadType('issue')">
             鐢熶骇鍚�
           </view>
         </view>
-
         <!-- 褰撳墠鍒嗙被鐨勪笂浼犲尯鍩� -->
         <view class="upload-area">
           <view class="upload-buttons">
-            <u-button
-              type="primary"
-              @click="chooseMedia('image')"
-              :loading="uploading"
-              :disabled="getCurrentFiles().length >= uploadConfig.limit"
-              :customStyle="{ marginRight: '10px', flex: 1 }"
-            >
-              <u-icon name="camera" size="18" color="#fff" style="margin-right: 5px"></u-icon>
+            <u-button type="primary"
+                      @click="chooseMedia('image')"
+                      :loading="uploading"
+                      :disabled="getCurrentFiles().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="getCurrentFiles().length >= uploadConfig.limit"
-              :customStyle="{ flex: 1 }"
-            >
-              <uni-icons type="videocam" size="18" color="#fff" style="margin-right: 5px"></uni-icons>
+            <u-button type="success"
+                      @click="chooseMedia('video')"
+                      :loading="uploading"
+                      :disabled="getCurrentFiles().length >= uploadConfig.limit"
+                      :customStyle="{ flex: 1 }">
+              <uni-icons type="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 v-if="uploading"
+                class="upload-progress">
+            <u-line-progress :percentage="uploadProgress"
+                             :showText="true"
+                             activeColor="#409eff"></u-line-progress>
           </view>
-
           <!-- 褰撳墠鍒嗙被鐨勬枃浠跺垪琛� -->
-          <view v-if="getCurrentFiles().length > 0" class="file-list">
-            <view v-for="(file, index) in getCurrentFiles()" :key="index" class="file-item">
+          <view v-if="getCurrentFiles().length > 0"
+                class="file-list">
+            <view v-for="(file, index) in getCurrentFiles()"
+                  :key="index"
+                  class="file-item">
               <view class="file-preview-container">
-                <image
-                  v-if="file.type === 'image' || (file.type !== 'video' && !file.type)"
-                  :src="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" size="18" color="#fff" style="margin-right: 5px"></uni-icons>
+                <image v-if="file.type === 'image' || (file.type !== 'video' && !file.type)"
+                       :src="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"
+                             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 class="delete-btn"
+                      @click="removeFile(index)">
+                  <u-icon name="close"
+                          size="12"
+                          color="#fff"></u-icon>
                 </view>
               </view>
               <view class="file-info">
@@ -141,12 +143,11 @@
               </view>
             </view>
           </view>
-
-          <view v-if="getCurrentFiles().length === 0" class="empty-state">
+          <view v-if="getCurrentFiles().length === 0"
+                class="empty-state">
             <text>璇烽�夋嫨瑕佷笂浼犵殑{{ getUploadTypeText() }}鍥剧墖鎴栬棰�</text>
           </view>
         </view>
-
         <!-- 缁熻淇℃伅 -->
         <view class="upload-summary">
           <text class="summary-text">
@@ -156,730 +157,826 @@
           </text>
         </view>
       </view>
-
       <!-- 姝e父鐘舵�佹彁绀� -->
-      <view class="normal-tip-card" v-if="hasException === false">
-        <u-icon name="info-circle" size="60" color="#52c41a"></u-icon>
+      <view class="normal-tip-card"
+            v-if="hasException === false">
+        <u-icon name="info-circle"
+                size="60"
+                color="#52c41a"></u-icon>
         <text class="tip-text">璁惧杩愯姝e父锛屾棤闇�涓婁紶鐓х墖</text>
       </view>
     </view>
-
     <!-- 搴曢儴鎸夐挳 -->
     <view class="footer-buttons">
-      <u-button @click="goBack" :customStyle="{ marginRight: '10px' }">鍙栨秷</u-button>
-      <u-button v-if="hasException === true" type="warning" @click="goToRepair" :customStyle="{ marginRight: '10px' }">
+      <u-button @click="goBack"
+                :customStyle="{ marginRight: '10px' }">鍙栨秷</u-button>
+      <u-button v-if="hasException === true"
+                type="warning"
+                @click="goToRepair"
+                :customStyle="{ marginRight: '10px' }">
         鏂板鎶ヤ慨
       </u-button>
-      <u-button type="primary" @click="submitUpload">鎻愪氦</u-button>
+      <u-button type="primary"
+                @click="submitUpload">鎻愪氦</u-button>
     </view>
   </view>
 </template>
 
 <script setup>
-import { ref, computed, onMounted } from 'vue';
-import { onLoad } from '@dcloudio/uni-app';
-import PageHeader from '@/components/PageHeader.vue';
-import { uploadInspectionTask } from '@/api/inspectionManagement';
-import { getToken } from '@/utils/auth';
-import config from '@/config';
+  import { ref, computed, onMounted } from "vue";
+  import { onLoad } from "@dcloudio/uni-app";
+  import PageHeader from "@/components/PageHeader.vue";
+  import { uploadInspectionTask } from "@/api/inspectionManagement";
+  import { getToken } from "@/utils/auth";
+  import config from "@/config";
 
-// 浠诲姟淇℃伅
-const taskInfo = ref(null);
+  // 浠诲姟淇℃伅
+  const taskInfo = ref(null);
 
-// 涓婁紶鐩稿叧鐘舵��
-const uploading = ref(false);
-const uploadProgress = ref(0);
+  // 涓婁紶鐩稿叧鐘舵��
+  const uploading = ref(false);
+  const uploadProgress = ref(0);
 
-// 涓変釜鍒嗙被鐨勪笂浼犵姸鎬�
-const beforeModelValue = ref([]); // 鐢熶骇鍓�
-const afterModelValue = ref([]); // 鐢熶骇涓�
-const issueModelValue = ref([]); // 鐢熶骇鍚�
+  // 涓変釜鍒嗙被鐨勪笂浼犵姸鎬�
+  const beforeModelValue = ref([]); // 鐢熶骇鍓�
+  const afterModelValue = ref([]); // 鐢熶骇涓�
+  const issueModelValue = ref([]); // 鐢熶骇鍚�
 
-// 褰撳墠婵�娲荤殑涓婁紶绫诲瀷
-const currentUploadType = ref('before'); // 'before', 'after', 'issue'
+  // 褰撳墠婵�娲荤殑涓婁紶绫诲瀷
+  const currentUploadType = ref("before"); // 'before', 'after', 'issue'
 
-// 寮傚父鐘舵��
-const hasException = ref(null); // null: 鏈�夋嫨, true: 瀛樺湪寮傚父, false: 姝e父
-// 寮傚父鎻忚堪
-const abnormalDescription = ref('');
+  // 寮傚父鐘舵��
+  const hasException = ref(null); // null: 鏈�夋嫨, true: 瀛樺湪寮傚父, false: 姝e父
+  // 寮傚父鎻忚堪
+  const abnormalDescription = ref("");
 
-// 涓婁紶閰嶇疆
-const uploadConfig = {
-  action: '/file/upload',
-  limit: 10,
-  fileSize: 50, // MB
-  fileType: ['jpg', 'jpeg', 'png', 'mp4', 'mov'],
-  maxVideoDuration: 60, // 绉�
-};
+  // 涓婁紶閰嶇疆
+  const uploadConfig = {
+    action: "/common/upload",
+    limit: 10,
+    fileSize: 50, // MB
+    fileType: ["jpg", "jpeg", "png", "mp4", "mov"],
+    maxVideoDuration: 60, // 绉�
+  };
 
-// 璁$畻涓婁紶URL
-const uploadFileUrl = computed(() => {
-  const baseUrl = config.baseUrl;
-  return baseUrl + uploadConfig.action;
-});
+  // 璁$畻涓婁紶URL
+  const uploadFileUrl = computed(() => {
+    const baseUrl = config.baseUrl;
+    return baseUrl + uploadConfig.action;
+  });
 
-// 椤甸潰鍔犺浇
-onLoad((options) => {
-  if (options.taskInfo) {
-    try {
-      taskInfo.value = JSON.parse(decodeURIComponent(options.taskInfo));
-    } catch (e) {
-      console.error('瑙f瀽浠诲姟淇℃伅澶辫触:', e);
+  // 椤甸潰鍔犺浇
+  onLoad(options => {
+    if (options.taskInfo) {
+      try {
+        const info = JSON.parse(decodeURIComponent(options.taskInfo));
+        taskInfo.value = info;
+
+        // 鍥炴樉閫昏緫锛氫粠 taskInfo 涓仮澶嶅凡涓婁紶鐨勬枃浠�
+        const mapFiles = list => {
+          if (!list || !Array.isArray(list)) return [];
+          return list.map(item => {
+            // 澶勭悊 URL锛屽幓闄ゅ彲鑳界殑绌烘牸
+            const finalUrl = (item.url || item.previewURL || "").trim();
+            // 鑷姩鎺ㄦ柇鏂囦欢绫诲瀷
+            let fileType = item.type;
+            if (!fileType && item.contentType) {
+              fileType = item.contentType.startsWith("video") ? "video" : "image";
+            } else if (!fileType) {
+              fileType = "image"; // 榛樿鍥剧墖
+            }
+
+            return {
+              ...item,
+              url: finalUrl,
+              name: item.name || item.originalFilename,
+              tempId: item.tempId || item.id || item.tempFileId,
+              size: item.size || item.byteSize || 0, // 鏄犲皠澶у皬瀛楁
+              type: fileType,
+              status: "success",
+            };
+          });
+        };
+
+        // 鏍规嵁鐢ㄦ埛瑕佹眰鏄犲皠锛欰fterDTO(鐢熶骇鍓�), DTO(鐢熶骇涓�), BeforeDTO(鐢熶骇鍚�)
+        if (
+          info.commonFileListAfterVO &&
+          Array.isArray(info.commonFileListAfterVO)
+        ) {
+          beforeModelValue.value = mapFiles(info.commonFileListAfterVO);
+        }
+        console.log(beforeModelValue.value, "beforeModelValue");
+
+        if (info.commonFileListVO && Array.isArray(info.commonFileListVO)) {
+          afterModelValue.value = mapFiles(info.commonFileListVO);
+        }
+        if (
+          info.commonFileListBeforeVO &&
+          Array.isArray(info.commonFileListBeforeVO)
+        ) {
+          issueModelValue.value = mapFiles(info.commonFileListBeforeVO);
+        }
+
+        // 濡傛灉鏈夊紓甯告弿杩帮紝涔熸仮澶�
+        if (info.abnormalDescription) {
+          abnormalDescription.value = info.abnormalDescription;
+        }
+        // 濡傛灉鏈夊紓甯哥姸鎬侊紝涔熸仮澶�
+        if (info.hasException !== undefined && info.hasException !== null) {
+          hasException.value = info.hasException;
+        } else if (
+          info.inspectionResult !== undefined &&
+          info.inspectionResult !== null
+        ) {
+          // 0-寮傚父锛�1-姝e父
+          hasException.value = String(info.inspectionResult) === "0";
+        }
+
+        // 鑷姩鍏滃簳锛氬鏋滃瓨鍦ㄥ凡涓婁紶鏂囦欢锛屽垯蹇呯劧鏄紓甯哥姸鎬侊紝纭繚 UI 姝e父鏄剧ず
+        if (
+          !hasException.value &&
+          (beforeModelValue.value.length > 0 ||
+            afterModelValue.value.length > 0 ||
+            issueModelValue.value.length > 0)
+        ) {
+          hasException.value = true;
+        }
+      } catch (e) {
+        console.error("瑙f瀽浠诲姟淇℃伅澶辫触:", e);
+      }
     }
-  }
-});
+  });
 
-// 杩斿洖涓婁竴椤�
-const goBack = () => {
-  uni.navigateBack();
-};
+  // 杩斿洖涓婁竴椤�
+  const goBack = () => {
+    uni.navigateBack();
+  };
 
-// 鍒囨崲涓婁紶绫诲瀷
-const switchUploadType = (type) => {
-  currentUploadType.value = type;
-};
+  // 鍒囨崲涓婁紶绫诲瀷
+  const switchUploadType = type => {
+    currentUploadType.value = type;
+  };
 
-// 鑾峰彇褰撳墠鍒嗙被鐨勬枃浠跺垪琛�
-const getCurrentFiles = () => {
-  switch (currentUploadType.value) {
-    case 'before':
-      return beforeModelValue.value || [];
-    case 'after':
-      return afterModelValue.value || [];
-    case 'issue':
-      return issueModelValue.value || [];
-    default:
-      return [];
-  }
-};
+  // 鑾峰彇褰撳墠鍒嗙被鐨勬枃浠跺垪琛�
+  const getCurrentFiles = () => {
+    switch (currentUploadType.value) {
+      case "before":
+        return beforeModelValue.value || [];
+      case "after":
+        return afterModelValue.value || [];
+      case "issue":
+        return issueModelValue.value || [];
+      default:
+        return [];
+    }
+  };
 
-// 鑾峰彇涓婁紶绫诲瀷鏂囨湰
-const getUploadTypeText = () => {
-  switch (currentUploadType.value) {
-    case 'before':
-      return '鐢熶骇鍓�';
-    case 'after':
-      return '鐢熶骇涓�';
-    case 'issue':
-      return '鐢熶骇鍚�';
-    default:
-      return '';
-  }
-};
+  // 鑾峰彇涓婁紶绫诲瀷鏂囨湰
+  const getUploadTypeText = () => {
+    switch (currentUploadType.value) {
+      case "before":
+        return "鐢熶骇鍓�";
+      case "after":
+        return "鐢熶骇涓�";
+      case "issue":
+        return "鐢熶骇鍚�";
+      default:
+        return "";
+    }
+  };
 
-// 璁剧疆寮傚父鐘舵��
-const setExceptionStatus = (status) => {
-  hasException.value = status;
-};
+  // 璁剧疆寮傚父鐘舵��
+  const setExceptionStatus = status => {
+    hasException.value = status;
+  };
 
-// 璺宠浆鍒版柊澧炴姤淇〉闈�
-const goToRepair = () => {
-  try {
-    const taskData = {
-      taskId: taskInfo.value?.taskId || taskInfo.value?.id,
-      taskName: taskInfo.value?.taskName,
-      inspectionLocation: taskInfo.value?.inspectionLocation,
-      inspector: taskInfo.value?.inspector,
-      uploadedFiles: {
-        before: beforeModelValue.value,
-        after: afterModelValue.value,
-        issue: issueModelValue.value,
-      },
-    };
+  // 璺宠浆鍒版柊澧炴姤淇〉闈�
+  const goToRepair = () => {
+    try {
+      const taskData = {
+        taskId: taskInfo.value?.taskId || taskInfo.value?.id,
+        taskName: taskInfo.value?.taskName,
+        inspectionLocation: taskInfo.value?.inspectionLocation,
+        inspector: taskInfo.value?.inspector,
+        hasException: hasException.value,
+        inspectionResult: hasException.value ? 0 : 1, // 0-寮傚父锛�1-姝e父
+        commonFileListAfterDTO: beforeModelValue.value,
+        commonFileListDTO: afterModelValue.value,
+        commonFileListBeforeDTO: issueModelValue.value,
+        uploadedFiles: {
+          before: beforeModelValue.value,
+          after: afterModelValue.value,
+          issue: issueModelValue.value,
+        },
+      };
 
-    uni.setStorageSync('repairTaskInfo', JSON.stringify(taskData));
+      uni.setStorageSync("repairTaskInfo", JSON.stringify(taskData));
 
-    uni.navigateTo({
-      url: '/pages/equipmentManagement/repair/add',
-    });
-  } catch (error) {
-    console.error('璺宠浆鎶ヤ慨椤甸潰澶辫触:', error);
-    uni.showToast({
-      title: '璺宠浆澶辫触锛岃閲嶈瘯',
-      icon: 'error',
-    });
-  }
-};
-
-// 鎻愪氦涓婁紶
-const submitUpload = async () => {
-  try {
-    // 妫�鏌ユ槸鍚﹂�夋嫨浜嗗紓甯哥姸鎬�
-    if (hasException.value === null) {
+      uni.navigateTo({
+        url: "/pages/equipmentManagement/repair/add",
+      });
+    } catch (error) {
+      console.error("璺宠浆鎶ヤ慨椤甸潰澶辫触:", error);
       uni.showToast({
-        title: '璇烽�夋嫨宸℃鐘舵��',
-        icon: 'none',
+        title: "璺宠浆澶辫触锛岃閲嶈瘯",
+        icon: "error",
+      });
+    }
+  };
+
+  // 鎻愪氦涓婁紶
+  const submitUpload = async () => {
+    try {
+      // 妫�鏌ユ槸鍚﹂�夋嫨浜嗗紓甯哥姸鎬�
+      if (hasException.value === null) {
+        uni.showToast({
+          title: "璇烽�夋嫨宸℃鐘舵��",
+          icon: "none",
+        });
+        return;
+      }
+
+      // 濡傛灉鏄紓甯哥姸鎬侊紝妫�鏌ユ槸鍚︽湁涓婁紶鏂囦欢鍜屾弿杩�
+      if (hasException.value === true) {
+        const totalFiles =
+          beforeModelValue.value.length +
+          afterModelValue.value.length +
+          issueModelValue.value.length;
+        if (totalFiles === 0) {
+          uni.showToast({
+            title: "璇蜂笂浼犲紓甯哥収鐗�",
+            icon: "none",
+          });
+          return;
+        }
+        // 妫�鏌ユ槸鍚﹀~鍐欎簡寮傚父鎻忚堪
+        if (!abnormalDescription.value.trim()) {
+          uni.showToast({
+            title: "璇峰~鍐欏紓甯告弿杩�",
+            icon: "none",
+          });
+          return;
+        }
+      }
+
+      // 鏄剧ず鎻愪氦涓殑鍔犺浇鎻愮ず
+      uni.showLoading({
+        title: "鎻愪氦涓�...",
+        mask: true,
+      });
+
+      // 鎸夌収閫昏緫鍚堝苟鎵�鏈夊垎绫荤殑鏂囦欢鐢ㄤ簬鎻愬彇ID
+      const allFiles = [
+        ...beforeModelValue.value,
+        ...afterModelValue.value,
+        ...issueModelValue.value,
+      ];
+
+      // 浼犵粰鍚庣鐨勪复鏃舵枃浠禝D鍒楄〃
+      let tempFileIds = [];
+      if (allFiles.length > 0) {
+        tempFileIds = allFiles
+          .map(item => item?.tempId ?? item?.tempFileId ?? item?.id)
+          .filter(v => v !== undefined && v !== null && v !== "");
+      }
+
+      // 鎻愪氦鏁版嵁
+      const submitData = {
+        ...taskInfo.value,
+        commonFileListAfterDTO: beforeModelValue.value, // 鐢熶骇鍓�
+        commonFileListDTO: afterModelValue.value, // 鐢熶骇涓�
+        commonFileListBeforeDTO: issueModelValue.value, // 鐢熶骇鍚�
+        hasException: hasException.value,
+        inspectionResult: hasException.value ? 0 : 1, // 0-寮傚父锛�1-姝e父
+        abnormalDescription: abnormalDescription.value,
+        tempFileIds: tempFileIds,
+      };
+
+      const result = await uploadInspectionTask(submitData);
+
+      // 妫�鏌ユ彁浜ょ粨鏋�
+      if (result && (result.code === 200 || result.success)) {
+        uni.hideLoading();
+        uni.showToast({
+          title: "鎻愪氦鎴愬姛",
+          icon: "success",
+        });
+
+        // 杩斿洖鍒楄〃椤靛苟鍒锋柊
+        setTimeout(() => {
+          uni.navigateBack();
+        }, 500);
+      } else {
+        uni.hideLoading();
+        uni.showToast({
+          title: result?.msg || result?.message || "鎻愪氦澶辫触",
+          icon: "error",
+        });
+      }
+    } catch (error) {
+      console.error("鎻愪氦涓婁紶澶辫触:", error);
+      uni.hideLoading();
+      uni.showToast({
+        title: error?.message || "鎻愪氦澶辫触",
+        icon: "error",
+      });
+    }
+  };
+
+  // 鏍煎紡鍖栨枃浠跺ぇ灏�
+  const formatFileSize = size => {
+    if (!size) return "0 B";
+    const units = ["B", "KB", "MB", "GB"];
+    let index = 0;
+    let fileSize = size;
+    while (fileSize >= 1024 && index < units.length - 1) {
+      fileSize /= 1024;
+      index++;
+    }
+    return `${fileSize.toFixed(2)} ${units[index]}`;
+  };
+
+  // 鎷嶇収/鎷嶈棰�
+  const chooseMedia = type => {
+    if (getCurrentFiles().length >= uploadConfig.limit) {
+      uni.showToast({
+        title: `鏈�澶氬彧鑳介�夋嫨${uploadConfig.limit}涓枃浠禶,
+        icon: "none",
       });
       return;
     }
 
-    // 濡傛灉鏄紓甯哥姸鎬侊紝妫�鏌ユ槸鍚︽湁涓婁紶鏂囦欢鍜屾弿杩�
-    if (hasException.value === true) {
-      const totalFiles = beforeModelValue.value.length + afterModelValue.value.length + issueModelValue.value.length;
-      if (totalFiles === 0) {
-        uni.showToast({
-          title: '璇蜂笂浼犲紓甯哥収鐗�',
-          icon: 'none',
-        });
-        return;
-      }
-      // 妫�鏌ユ槸鍚﹀~鍐欎簡寮傚父鎻忚堪
-      if (!abnormalDescription.value.trim()) {
-        uni.showToast({
-          title: '璇峰~鍐欏紓甯告弿杩�',
-          icon: 'none',
-        });
-        return;
-      }
-    }
+    const remaining = uploadConfig.limit - getCurrentFiles().length;
 
-    // 鏄剧ず鎻愪氦涓殑鍔犺浇鎻愮ず
-    uni.showLoading({
-      title: '鎻愪氦涓�...',
-      mask: true,
-    });
+    // 浼樺厛浣跨敤 chooseMedia
+    if (typeof uni.chooseMedia === "function") {
+      uni.chooseMedia({
+        count: Math.min(remaining, 1),
+        mediaType: [type || "image"],
+        sizeType: ["compressed", "original"],
+        sourceType: ["camera"],
+        success: res => {
+          try {
+            const files = res?.tempFiles || [];
+            if (!files.length) throw new Error("鏈幏鍙栧埌鏂囦欢");
 
-    // 鎸夌収閫昏緫鍚堝苟鎵�鏈夊垎绫荤殑鏂囦欢
-    let arr = [];
-    if (beforeModelValue.value.length > 0) {
-      arr.push(...beforeModelValue.value);
-    }
-    if (afterModelValue.value.length > 0) {
-      arr.push(...afterModelValue.value);
-    }
-    if (issueModelValue.value.length > 0) {
-      arr.push(...issueModelValue.value);
-    }
-
-    // 浼犵粰鍚庣鐨勪复鏃舵枃浠禝D鍒楄〃
-    let tempFileIds = [];
-    if (arr !== null && arr.length > 0) {
-      tempFileIds = arr
-        .map((item) => item?.tempId ?? item?.tempFileId ?? item?.id)
-        .filter((v) => v !== undefined && v !== null && v !== '');
-    }
-
-    // 鎻愪氦鏁版嵁
-    const submitData = {
-      ...taskInfo.value,
-      storageBlobDTO: arr,
-      hasException: hasException.value,
-      abnormalDescription: abnormalDescription.value,
-      tempFileIds: tempFileIds,
-    };
-
-    const result = await uploadInspectionTask(submitData);
-
-    // 妫�鏌ユ彁浜ょ粨鏋�
-    if (result && (result.code === 200 || result.success)) {
-      uni.hideLoading();
-      uni.showToast({
-        title: '鎻愪氦鎴愬姛',
-        icon: 'success',
-      });
-
-      // 杩斿洖鍒楄〃椤靛苟鍒锋柊
-      setTimeout(() => {
-        uni.navigateBack();
-      }, 500);
-    } else {
-      uni.hideLoading();
-      uni.showToast({
-        title: result?.msg || result?.message || '鎻愪氦澶辫触',
-        icon: 'error',
-      });
-    }
-  } catch (error) {
-    console.error('鎻愪氦涓婁紶澶辫触:', error);
-    uni.hideLoading();
-    uni.showToast({
-      title: error?.message || '鎻愪氦澶辫触',
-      icon: 'error',
-    });
-  }
-};
-
-// 鏍煎紡鍖栨枃浠跺ぇ灏�
-const formatFileSize = (size) => {
-  if (!size) return '0 B';
-  const units = ['B', 'KB', 'MB', 'GB'];
-  let index = 0;
-  let fileSize = size;
-  while (fileSize >= 1024 && index < units.length - 1) {
-    fileSize /= 1024;
-    index++;
-  }
-  return `${fileSize.toFixed(2)} ${units[index]}`;
-};
-
-// 鎷嶇収/鎷嶈棰�
-const chooseMedia = (type) => {
-  if (getCurrentFiles().length >= uploadConfig.limit) {
-    uni.showToast({
-      title: `鏈�澶氬彧鑳介�夋嫨${uploadConfig.limit}涓枃浠禶,
-      icon: 'none',
-    });
-    return;
-  }
-
-  const remaining = uploadConfig.limit - getCurrentFiles().length;
-
-  // 浼樺厛浣跨敤 chooseMedia
-  if (typeof uni.chooseMedia === 'function') {
-    uni.chooseMedia({
-      count: Math.min(remaining, 1),
-      mediaType: [type || 'image'],
-      sizeType: ['compressed', 'original'],
-      sourceType: ['camera'],
-      success: (res) => {
-        try {
-          const files = res?.tempFiles || [];
-          if (!files.length) throw new Error('鏈幏鍙栧埌鏂囦欢');
-
-          files.forEach((tf, idx) => {
-            const filePath = tf.tempFilePath || tf.path || '';
-            const fileType = tf.fileType || type || 'image';
-            const ext = fileType === 'video' ? 'mp4' : 'jpg';
-            const file = {
-              tempFilePath: filePath,
-              path: filePath,
-              type: fileType,
-              name: `${fileType}_${Date.now()}_${idx}.${ext}`,
-              size: tf.size || 0,
-              duration: tf.duration || 0,
-              createTime: Date.now(),
-            };
-            uploadFile(file);
-          });
-        } catch (err) {
-          uni.showToast({ title: err.message || '澶勭悊鏂囦欢澶辫触', icon: 'none' });
-        }
-      },
-      fail: (err) => {
-        console.error('閫夋嫨濯掍綋澶辫触:', err);
-        uni.showToast({ title: '閫夋嫨澶辫触', icon: 'none' });
-      },
-    });
-  } else {
-    // 闄嶇骇鏂规
-    if (type === 'video') {
-      uni.chooseVideo({
-        sourceType: ['camera'],
-        success: (res) => {
-          const file = {
-            tempFilePath: res.tempFilePath,
-            path: res.tempFilePath,
-            type: 'video',
-            name: `video_${Date.now()}.mp4`,
-            size: res.size || 0,
-            duration: res.duration || 0,
-            createTime: Date.now(),
-          };
-          uploadFile(file);
-        },
-        fail: () => {
-          uni.showToast({ title: '閫夋嫨瑙嗛澶辫触', icon: 'none' });
-        },
-      });
-    } else {
-      uni.chooseImage({
-        count: Math.min(remaining, 9),
-        sizeType: ['compressed'],
-        sourceType: ['camera'],
-        success: (res) => {
-          const list = res.tempFilePaths || res.tempFiles || [];
-          list.forEach((src, idx) => {
-            const path = typeof src === 'string' ? src : src.path;
-            const file = {
-              tempFilePath: path,
-              path: path,
-              type: 'image',
-              name: `image_${Date.now()}_${idx}.jpg`,
-              size: 0,
-              createTime: Date.now(),
-            };
-            uploadFile(file);
-          });
-        },
-        fail: () => {
-          uni.showToast({ title: '閫夋嫨鍥剧墖澶辫触', icon: 'none' });
-        },
-      });
-    }
-  }
-};
-
-// 涓婁紶鍗曚釜鏂囦欢
-const uploadFile = (file) => {
-  const token = getToken();
-  if (!token) {
-    uni.showToast({ title: '鐢ㄦ埛鏈櫥褰�', icon: 'none' });
-    return;
-  }
-
-  uploading.value = true;
-  uploadProgress.value = 0;
-
-  const uploadTask = uni.uploadFile({
-    url: uploadFileUrl.value,
-    filePath: file.tempFilePath,
-    name: 'file',
-    header: {
-      Authorization: `Bearer ${token}`,
-    },
-    formData: {
-      type: getTabType(),
-    },
-    success: (res) => {
-      try {
-        const data = JSON.parse(res.data);
-        if (data.code === 200) {
-          const uploadedFile = {
-            ...file,
-            url: data.data.url,
-            tempId: data.data.tempId || data.data.id,
-            status: 'success',
-          };
-
-          // 鏍规嵁褰撳墠绫诲瀷娣诲姞鍒板搴旀暟缁�
-          if (currentUploadType.value === 'before') {
-            beforeModelValue.value.push(uploadedFile);
-          } else if (currentUploadType.value === 'after') {
-            afterModelValue.value.push(uploadedFile);
-          } else if (currentUploadType.value === 'issue') {
-            issueModelValue.value.push(uploadedFile);
+            files.forEach((tf, idx) => {
+              const filePath = tf.tempFilePath || tf.path || "";
+              const fileType = tf.fileType || type || "image";
+              const ext = fileType === "video" ? "mp4" : "jpg";
+              const file = {
+                tempFilePath: filePath,
+                path: filePath,
+                type: fileType,
+                name: `${fileType}_${Date.now()}_${idx}.${ext}`,
+                size: tf.size || 0,
+                duration: tf.duration || 0,
+                createTime: Date.now(),
+              };
+              uploadFile(file);
+            });
+          } catch (err) {
+            uni.showToast({ title: err.message || "澶勭悊鏂囦欢澶辫触", icon: "none" });
           }
-
-          uni.showToast({ title: '涓婁紶鎴愬姛', icon: 'success' });
-        } else {
-          uni.showToast({ title: data.msg || '涓婁紶澶辫触', icon: 'none' });
-        }
-      } catch (e) {
-        uni.showToast({ title: '瑙f瀽鍝嶅簲澶辫触', icon: 'none' });
+        },
+        fail: err => {
+          console.error("閫夋嫨濯掍綋澶辫触:", err);
+          uni.showToast({ title: "閫夋嫨澶辫触", icon: "none" });
+        },
+      });
+    } else {
+      // 闄嶇骇鏂规
+      if (type === "video") {
+        uni.chooseVideo({
+          sourceType: ["camera"],
+          success: res => {
+            const file = {
+              tempFilePath: res.tempFilePath,
+              path: res.tempFilePath,
+              type: "video",
+              name: `video_${Date.now()}.mp4`,
+              size: res.size || 0,
+              duration: res.duration || 0,
+              createTime: Date.now(),
+            };
+            uploadFile(file);
+          },
+          fail: () => {
+            uni.showToast({ title: "閫夋嫨瑙嗛澶辫触", icon: "none" });
+          },
+        });
+      } else {
+        uni.chooseImage({
+          count: Math.min(remaining, 9),
+          sizeType: ["compressed"],
+          sourceType: ["camera"],
+          success: res => {
+            const list = res.tempFilePaths || res.tempFiles || [];
+            list.forEach((src, idx) => {
+              const path = typeof src === "string" ? src : src.path;
+              const file = {
+                tempFilePath: path,
+                path: path,
+                type: "image",
+                name: `image_${Date.now()}_${idx}.jpg`,
+                size: 0,
+                createTime: Date.now(),
+              };
+              uploadFile(file);
+            });
+          },
+          fail: () => {
+            uni.showToast({ title: "閫夋嫨鍥剧墖澶辫触", icon: "none" });
+          },
+        });
       }
-    },
-    fail: (err) => {
-      console.error('涓婁紶澶辫触:', err);
-      uni.showToast({ title: '涓婁紶澶辫触', icon: 'none' });
-    },
-    complete: () => {
-      uploading.value = false;
-    },
-  });
+    }
+  };
 
-  // 鐩戝惉涓婁紶杩涘害
-  uploadTask.onProgressUpdate((res) => {
-    uploadProgress.value = res.progress;
-  });
-};
+  // 涓婁紶鍗曚釜鏂囦欢
+  const uploadFile = file => {
+    const token = getToken();
+    if (!token) {
+      uni.showToast({ title: "鐢ㄦ埛鏈櫥褰�", icon: "none" });
+      return;
+    }
 
-// 鑾峰彇type鍊�
-const getTabType = () => {
-  switch (currentUploadType.value) {
-    case 'before':
-      return 10;
-    case 'after':
-      return 11;
-    case 'issue':
-      return 12;
-    default:
-      return 10;
-  }
-};
+    uploading.value = true;
+    uploadProgress.value = 0;
 
-// 鍒犻櫎鏂囦欢
-const removeFile = (index) => {
-  const files = getCurrentFiles();
-  files.splice(index, 1);
-};
+    const uploadTask = uni.uploadFile({
+      url: uploadFileUrl.value,
+      filePath: file.tempFilePath,
+      name: "files",
+      header: {
+        Authorization: `Bearer ${token}`,
+      },
+      formData: {
+        type: getTabType(),
+      },
+      success: res => {
+        try {
+          const data = JSON.parse(res.data);
+          if (data.code === 200) {
+            // 鍏煎 CommonUpload.vue 鐨勫鐞嗛�昏緫
+            const resultData = Array.isArray(data.data)
+              ? data.data[0]
+              : data.data;
+
+            // 澶勭悊 url 鍜� name 璧嬪��
+            const finalUrl = resultData.url || resultData.previewURL;
+            const finalName = resultData.name || resultData.originalFilename;
+            const finalId =
+              resultData.tempId || resultData.id || resultData.tempFileId;
+
+            const uploadedFile = {
+              ...file,
+              ...resultData, // 鍖呭惈鍚庣杩斿洖鐨勬墍鏈夊瓧娈�
+              url: finalUrl,
+              name: finalName,
+              tempId: finalId,
+              status: "success",
+            };
+
+            // 鏍规嵁褰撳墠绫诲瀷娣诲姞鍒板搴旀暟缁�
+            if (currentUploadType.value === "before") {
+              beforeModelValue.value.push(uploadedFile);
+            } else if (currentUploadType.value === "after") {
+              afterModelValue.value.push(uploadedFile);
+            } else if (currentUploadType.value === "issue") {
+              issueModelValue.value.push(uploadedFile);
+            }
+
+            uni.showToast({ title: "涓婁紶鎴愬姛", icon: "success" });
+          } else {
+            uni.showToast({ title: data.msg || "涓婁紶澶辫触", icon: "none" });
+          }
+        } catch (e) {
+          uni.showToast({ title: "瑙f瀽鍝嶅簲澶辫触", icon: "none" });
+        }
+      },
+      fail: err => {
+        console.error("涓婁紶澶辫触:", err);
+        uni.showToast({ title: "涓婁紶澶辫触", icon: "none" });
+      },
+      complete: () => {
+        uploading.value = false;
+      },
+    });
+
+    // 鐩戝惉涓婁紶杩涘害
+    uploadTask.onProgressUpdate(res => {
+      uploadProgress.value = res.progress;
+    });
+  };
+
+  // 鑾峰彇type鍊�
+  const getTabType = () => {
+    switch (currentUploadType.value) {
+      case "before":
+        return 10;
+      case "after":
+        return 11;
+      case "issue":
+        return 12;
+      default:
+        return 10;
+    }
+  };
+
+  // 鍒犻櫎鏂囦欢
+  const removeFile = index => {
+    const files = getCurrentFiles();
+    files.splice(index, 1);
+  };
 </script>
 
 <style scoped>
-.inspection-upload-page {
-  min-height: 100vh;
-  background-color: #f5f5f5;
-  padding-bottom: 80px;
-}
+  .inspection-upload-page {
+    min-height: 100vh;
+    background-color: #f5f5f5;
+    padding-bottom: 80px;
+  }
 
-.upload-content {
-  padding: 15px;
-}
+  .upload-content {
+    padding: 15px;
+  }
 
-/* 浠诲姟淇℃伅鍗$墖 */
-.task-info-card {
-  background: #fff;
-  border-radius: 12px;
-  padding: 15px;
-  margin-bottom: 15px;
-  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
-}
+  /* 浠诲姟淇℃伅鍗$墖 */
+  .task-info-card {
+    background: #fff;
+    border-radius: 12px;
+    padding: 15px;
+    margin-bottom: 15px;
+    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
+  }
 
-.task-info-header {
-  margin-bottom: 12px;
-  padding-bottom: 12px;
-  border-bottom: 1px solid #f0f0f0;
-}
+  .task-info-header {
+    margin-bottom: 12px;
+    padding-bottom: 12px;
+    border-bottom: 1px solid #f0f0f0;
+  }
 
-.task-name {
-  font-size: 16px;
-  font-weight: 600;
-  color: #333;
-}
+  .task-name {
+    font-size: 16px;
+    font-weight: 600;
+    color: #333;
+  }
 
-.task-info-body {
-  display: flex;
-  flex-direction: column;
-  gap: 8px;
-}
+  .task-info-body {
+    display: flex;
+    flex-direction: column;
+    gap: 8px;
+  }
 
-.info-item {
-  display: flex;
-  justify-content: space-between;
-  align-items: center;
-}
+  .info-item {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+  }
 
-.info-label {
-  font-size: 13px;
-  color: #999;
-}
+  .info-label {
+    font-size: 13px;
+    color: #999;
+  }
 
-.info-value {
-  font-size: 13px;
-  color: #666;
-}
+  .info-value {
+    font-size: 13px;
+    color: #666;
+  }
 
-/* 閫氱敤鍗$墖鏍峰紡 */
-.section-card {
-  background: #fff;
-  border-radius: 12px;
-  padding: 15px;
-  margin-bottom: 15px;
-  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
-}
+  /* 閫氱敤鍗$墖鏍峰紡 */
+  .section-card {
+    background: #fff;
+    border-radius: 12px;
+    padding: 15px;
+    margin-bottom: 15px;
+    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
+  }
 
-.section-title {
-  font-size: 14px;
-  font-weight: 600;
-  color: #333;
-  margin-bottom: 12px;
-}
+  .section-title {
+    font-size: 14px;
+    font-weight: 600;
+    color: #333;
+    margin-bottom: 12px;
+  }
 
-/* 寮傚父鐘舵�侀�夋嫨 */
-.exception-options {
-  display: flex;
-  gap: 12px;
-}
+  /* 寮傚父鐘舵�侀�夋嫨 */
+  .exception-options {
+    display: flex;
+    gap: 12px;
+  }
 
-.exception-option {
-  flex: 1;
-  display: flex;
-  align-items: center;
-  justify-content: center;
-  gap: 8px;
-  padding: 14px 16px;
-  background: #f8f9fa;
-  border: 2px solid #e9ecef;
-  border-radius: 8px;
-  cursor: pointer;
-  transition: all 0.3s ease;
-}
+  .exception-option {
+    flex: 1;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    gap: 8px;
+    padding: 14px 16px;
+    background: #f8f9fa;
+    border: 2px solid #e9ecef;
+    border-radius: 8px;
+    cursor: pointer;
+    transition: all 0.3s ease;
+  }
 
-.exception-option.active {
-  border-color: #409eff;
-  background: #f0f8ff;
-}
+  .exception-option.active {
+    border-color: #409eff;
+    background: #f0f8ff;
+  }
 
-.option-text {
-  font-size: 14px;
-  color: #333;
-  font-weight: 500;
-}
+  .option-text {
+    font-size: 14px;
+    color: #333;
+    font-weight: 500;
+  }
 
-/* 寮傚父鎻忚堪 */
-.exception-textarea {
-  width: 100%;
-  min-height: 100px;
-  padding: 12px;
-  background: #f8f9fa;
-  border: 1px solid #e9ecef;
-  border-radius: 8px;
-  font-size: 14px;
-  color: #333;
-  resize: none;
-  box-sizing: border-box;
-}
+  /* 寮傚父鎻忚堪 */
+  .exception-textarea {
+    width: 100%;
+    min-height: 100px;
+    padding: 12px;
+    background: #f8f9fa;
+    border: 1px solid #e9ecef;
+    border-radius: 8px;
+    font-size: 14px;
+    color: #333;
+    resize: none;
+    box-sizing: border-box;
+  }
 
-.exception-textarea:focus {
-  outline: none;
-  border-color: #409eff;
-  background: #fff;
-}
+  .exception-textarea:focus {
+    outline: none;
+    border-color: #409eff;
+    background: #fff;
+  }
 
-/* 鍒嗙被鏍囩椤� */
-.upload-tabs {
-  display: flex;
-  gap: 10px;
-  margin-bottom: 15px;
-}
+  /* 鍒嗙被鏍囩椤� */
+  .upload-tabs {
+    display: flex;
+    gap: 10px;
+    margin-bottom: 15px;
+  }
 
-.tab-item {
-  flex: 1;
-  padding: 10px;
-  text-align: center;
-  background: #f5f5f5;
-  border-radius: 6px;
-  font-size: 13px;
-  color: #666;
-  cursor: pointer;
-  transition: all 0.3s;
-}
+  .tab-item {
+    flex: 1;
+    padding: 10px;
+    text-align: center;
+    background: #f5f5f5;
+    border-radius: 6px;
+    font-size: 13px;
+    color: #666;
+    cursor: pointer;
+    transition: all 0.3s;
+  }
 
-.tab-item.active {
-  background: #409eff;
-  color: #fff;
-}
+  .tab-item.active {
+    background: #409eff;
+    color: #fff;
+  }
 
-/* 涓婁紶鍖哄煙 */
-.upload-area {
-  padding: 10px 0;
-}
+  /* 涓婁紶鍖哄煙 */
+  .upload-area {
+    padding: 10px 0;
+  }
 
-.upload-buttons {
-  display: flex;
-  gap: 10px;
-  margin-bottom: 15px;
-}
+  .upload-buttons {
+    display: flex;
+    gap: 10px;
+    margin-bottom: 15px;
+  }
 
-.upload-progress {
-  margin-bottom: 15px;
-}
+  .upload-progress {
+    margin-bottom: 15px;
+  }
 
-/* 鏂囦欢鍒楄〃 */
-.file-list {
-  display: flex;
-  flex-wrap: wrap;
-  gap: 10px;
-}
+  /* 鏂囦欢鍒楄〃 */
+  .file-list {
+    display: flex;
+    flex-wrap: wrap;
+    gap: 10px;
+  }
 
-.file-item {
-  width: calc(33.33% - 7px);
-}
+  .file-item {
+    width: calc(33.33% - 7px);
+  }
 
-.file-preview-container {
-  position: relative;
-  width: 100%;
-  aspect-ratio: 1;
-  border-radius: 8px;
-  overflow: hidden;
-  background: #f5f5f5;
-}
+  .file-preview-container {
+    position: relative;
+    width: 100%;
+    aspect-ratio: 1;
+    border-radius: 8px;
+    overflow: hidden;
+    background: #f5f5f5;
+  }
 
-.file-preview {
-  width: 100%;
-  height: 100%;
-  object-fit: cover;
-}
+  .file-preview {
+    width: 100%;
+    height: 100%;
+    object-fit: cover;
+  }
 
-.video-preview {
-  width: 100%;
-  height: 100%;
-  display: flex;
-  flex-direction: column;
-  align-items: center;
-  justify-content: center;
-  background: #333;
-}
+  .video-preview {
+    width: 100%;
+    height: 100%;
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    justify-content: center;
+    background: #333;
+  }
 
-.video-text {
-  font-size: 12px;
-  color: #fff;
-  margin-top: 5px;
-}
+  .video-text {
+    font-size: 12px;
+    color: #fff;
+    margin-top: 5px;
+  }
 
-.delete-btn {
-  position: absolute;
-  top: 5px;
-  right: 5px;
-  width: 22px;
-  height: 22px;
-  background: rgba(0, 0, 0, 0.5);
-  border-radius: 50%;
-  display: flex;
-  align-items: center;
-  justify-content: center;
-}
+  .delete-btn {
+    position: absolute;
+    top: 5px;
+    right: 5px;
+    width: 22px;
+    height: 22px;
+    background: rgba(0, 0, 0, 0.5);
+    border-radius: 50%;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+  }
 
-.file-info {
-  margin-top: 5px;
-}
+  .file-info {
+    margin-top: 5px;
+  }
 
-.file-name {
-  display: block;
-  font-size: 11px;
-  color: #666;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
+  .file-name {
+    display: block;
+    font-size: 11px;
+    color: #666;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+  }
 
-.file-size {
-  display: block;
-  font-size: 10px;
-  color: #999;
-  margin-top: 2px;
-}
+  .file-size {
+    display: block;
+    font-size: 10px;
+    color: #999;
+    margin-top: 2px;
+  }
 
-.empty-state {
-  text-align: center;
-  padding: 30px;
-  color: #999;
-  font-size: 13px;
-}
+  .empty-state {
+    text-align: center;
+    padding: 30px;
+    color: #999;
+    font-size: 13px;
+  }
 
-/* 缁熻淇℃伅 */
-.upload-summary {
-  margin-top: 15px;
-  padding: 10px;
-  background: #f8f9fa;
-  border-radius: 6px;
-  border-left: 3px solid #409eff;
-}
+  /* 缁熻淇℃伅 */
+  .upload-summary {
+    margin-top: 15px;
+    padding: 10px;
+    background: #f8f9fa;
+    border-radius: 6px;
+    border-left: 3px solid #409eff;
+  }
 
-.summary-text {
-  font-size: 12px;
-  color: #666;
-}
+  .summary-text {
+    font-size: 12px;
+    color: #666;
+  }
 
-/* 姝e父鐘舵�佹彁绀� */
-.normal-tip-card {
-  background: #f6ffed;
-  border: 2px dashed #b7eb8f;
-  border-radius: 12px;
-  padding: 50px 20px;
-  display: flex;
-  flex-direction: column;
-  align-items: center;
-  justify-content: center;
-  margin-bottom: 15px;
-}
+  /* 姝e父鐘舵�佹彁绀� */
+  .normal-tip-card {
+    background: #f6ffed;
+    border: 2px dashed #b7eb8f;
+    border-radius: 12px;
+    padding: 50px 20px;
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    justify-content: center;
+    margin-bottom: 15px;
+  }
 
-.normal-tip-card .tip-text {
-  margin-top: 15px;
-  font-size: 16px;
-  color: #52c41a;
-  font-weight: 500;
-}
+  .normal-tip-card .tip-text {
+    margin-top: 15px;
+    font-size: 16px;
+    color: #52c41a;
+    font-weight: 500;
+  }
 
-/* 搴曢儴鎸夐挳 */
-.footer-buttons {
-  position: fixed;
-  bottom: 0;
-  left: 0;
-  right: 0;
-  display: flex;
-  padding: 15px;
-  background: #fff;
-  border-top: 1px solid #f0f0f0;
-  box-shadow: 0 -2px 10px rgba(0, 0, 0, 0.05);
-}
+  /* 搴曢儴鎸夐挳 */
+  .footer-buttons {
+    position: fixed;
+    bottom: 0;
+    left: 0;
+    right: 0;
+    display: flex;
+    padding: 15px;
+    background: #fff;
+    border-top: 1px solid #f0f0f0;
+    box-shadow: 0 -2px 10px rgba(0, 0, 0, 0.05);
+  }
 </style>

--
Gitblit v1.9.3