From e058a972e99cd1005521b53c28b9b98232764dcf Mon Sep 17 00:00:00 2001
From: xwt <2740516069@qq.com>
Date: 星期五, 10 十月 2025 15:46:00 +0800
Subject: [PATCH] SJ,XJ,RKJ调用FTP附件信息

---
 pages/QC/SJ/detail.vue |  370 ++++++++++++++++++++++++++--------------------------
 1 files changed, 188 insertions(+), 182 deletions(-)

diff --git a/pages/QC/SJ/detail.vue b/pages/QC/SJ/detail.vue
index 662fca5..3c5cd56 100644
--- a/pages/QC/SJ/detail.vue
+++ b/pages/QC/SJ/detail.vue
@@ -5,7 +5,7 @@
       <view class="title">棣栨椤圭洰鏄庣粏</view>
       <view class="order-number">棣栨鍗曞彿: {{formData.billNo}}</view>
     </view>
-
+ 
     <!-- 鏍囩鏍� - 濡傛灉鏈夊涓楠岄」鐩彲浠ュ垏鎹� -->
     <view class="tabs" v-if="tabs && tabs.length > 1">
       <view v-for="(tab, index) in tabs" :key="index" class="tab" :class="{active: currentTab === index}"
@@ -71,7 +71,7 @@
           </view>
         </view>
       </view>
-
+ 
       <!-- 瑙勬牸瑕佹眰 -->
       <view class="section" v-if="formData.specRequ">
         <view class="section-header">瑙勬牸瑕佹眰</view>
@@ -79,7 +79,7 @@
           <text class="spec-text">{{ formData.specRequ }}</text>
         </view>
       </view>
-
+ 
       <!-- 妫�楠屾弿杩� -->
       <view class="section" v-if="formData.itemMod">
         <view class="section-header">妫�楠屾弿杩�</view>
@@ -87,7 +87,7 @@
           <text class="spec-text">{{ formData.itemMod }}</text>
         </view>
       </view>
-
+ 
       <!-- 妫�楠岀粨鏋� -->
       <view class="section">
         <view class="section-header">妫�楠岀粨鏋�</view>
@@ -98,19 +98,19 @@
               <view class="info-value">{{formData.result}}</view>
             </view>
           </view>
-
+ 
           <view v-if="formData.result != null" class="result-preview">
             <view class="info-label">棰勮缁撴灉</view>
             <view class="info-value">{{formData.result}}</view>
           </view>
-
+ 
           <view v-if="formData.remarks != null" class="result-ng">
             <view class="info-label">涓嶅悎鏍兼弿杩�</view>
             <view class="info-value danger">{{formData.remarks}}</view>
           </view>
         </view>
       </view>
-
+ 
       <!-- 缁撴灉褰曞叆 -->
       <view class="section">
         <view class="section-header">妫�楠岀粨鏋滃綍鍏�</view>
@@ -140,7 +140,7 @@
           </view>
         </view>
       </view>
-
+ 
       <!-- 缁撴灉琛ㄦ牸 -->
       <view v-if="formData.levelNum > 0" class="table-container">
         <view class="table-header">
@@ -151,7 +151,7 @@
               v-if="isAllCompleted">锛堣緭鍏ュ凡瀹屾垚锛�</i></view>
           <view class="th">鎿嶄綔</view>
         </view>
-
+ 
         <view v-for="(item, index) in displayTableData" :key="index" class="table-row">
           <view class="td">{{ index + 1 }}</view>
           <view class="td">{{ getHoleNumber(index) }}</view>
@@ -177,7 +177,7 @@
           </view>
         </view>
       </view>
-
+ 
       <!-- 鍥剧墖棰勮 -->
       <view v-if="isShowImg" class="section">
         <view class="section-header">鐩稿叧鍥剧墖</view>
@@ -188,7 +188,7 @@
         </view>
       </view>
     </view>
-
+ 
     <!-- 淇敼涓嶅悎鏍兼弿杩板脊鍑烘 -->
     <view v-if="remarksPopup" class="overlay">
       <view class="popup">
@@ -207,7 +207,7 @@
         </view>
       </view>
     </view>
-
+ 
     <!-- 淇敼妫�楠岀粨鏋滃脊鍑烘 -->
     <view v-if="showPopup" class="overlay">
       <view class="popup">
@@ -226,7 +226,7 @@
         </view>
       </view>
     </view>
-
+ 
     <!-- 闄勪欢鍒楄〃寮圭獥 -->
     <view v-if="showAttachmentPopup" class="overlay">
       <view class="popup attachment-list-popup">
@@ -277,7 +277,7 @@
         </div>
       </view>
     </view>
-
+ 
     <!-- 闄勪欢璇︽儏寮圭獥 -->
     <view v-if="showAttachmentDetail" class="overlay">
       <view class="popup attachment-detail-popup">
@@ -346,7 +346,7 @@
         </div>
       </view>
     </view>
-
+ 
     <!-- 鏂囦欢棰勮寮圭獥 -->
     <view v-if="showFilePreviewPopup" class="overlay">
       <view class="popup file-preview-popup">
@@ -388,10 +388,10 @@
         </div>
       </view>
     </view>
-
+ 
   </view>
 </template>
-
+ 
 <script>
 export default {
   data() {
@@ -607,7 +607,7 @@
       // this.gid = id;
       // this.refreshResult();
     },
-
+ 
     // ===== 绌村彿鐩稿叧鏂规硶 =====
     getHoleNumber(index) {
       const item = this.displayTableData[index];
@@ -616,14 +616,14 @@
       }
       return index + 1;
     },
-
+ 
     getRecordValue(item, index) {
       if (this.isHoleBlocked(index)) {
         return '/';
       }
       return item.fcheckResu || '鏃�';
     },
-
+ 
     isHoleBlocked(index) {
       const item = this.displayTableData[index];
       if (item && item.holeInfo) {
@@ -631,8 +631,8 @@
       }
       return false;
     },
-
-
+ 
+ 
     previewImage() {
       uni.previewImage({
         urls: [this.base64Image],
@@ -646,18 +646,18 @@
       }
     },
     submit() {
-
+ 
       let count = this.formData.levelNum;
       let fstand = "鈭�";
-
+ 
       //鏈夋渶澶у�煎拰鏈�灏忓�煎氨鏍规嵁鏄惁绗﹀悎鏍囧噯鍊兼洿鏂板垽瀹氱粨鏋滐紝娌℃湁鏈�澶у�煎拰鏈�灏忓�煎氨鏍规嵁鏄惁閫氳繃妫�楠屽垽瀹氱粨鏋�
       if (this.formData.maxValue && this.formData.minValue) {
-
+ 
         if (!this.formData.fcheckResu) {
           this.$showMessage("璇疯緭鍏ユ楠屽��");
           return;
         }
-
+ 
         if (this.formData.fcheckResu >= this.formData.minValue && this.formData.fcheckResu <= this.formData.maxValue) {
           fstand = "鈭�"
         } else {
@@ -665,11 +665,11 @@
         }
         count = 1;
       } else {
-
+ 
         if (!this.formData.fcheckResu) {
           this.formData.fcheckResu = 1
         }
-
+ 
         if (this.formData.fcheckResu == 0 || this.formData.fcheckResu == 1) {
           this.formData.isPass = this.formData.fcheckResu
           // 鏍规嵁fcheckResu璁剧疆fstand
@@ -693,9 +693,9 @@
           count = this.formData.levelNum || 1;
         }
       }
-
+ 
       this.formData.updater = this.$loginInfo.account;
-
+ 
       // 鐩存帴鎵ц淇濆瓨锛屼笉鏄剧ず纭寮圭獥
       this.$post({
         url: "/SJ/SetQSItemDetail",
@@ -712,7 +712,7 @@
         this.$showMessage("淇濆瓨鎴愬姛");
         this.refreshResult();
       })
-
+ 
     },
     refreshResult() {
       // 鍏堣幏鍙栨楠岄」鐩熀鏈俊鎭�
@@ -757,25 +757,25 @@
       this.editData = item;
     },
     eidt() {
-
+ 
       if (!this.editData.fcheckResu) {
         this.$showMessage("璇疯緭鍏ユ楠岀粨鏋�");
       }
-
+ 
       if (this.formData.fcheckResu == this.editData.fcheckResu) {
         this.$showMessage("淇敼鎴愬姛");
         return;
       }
-
+ 
       let fstand = "鈭�";
-
+ 
       if (this.formData.maxValue && this.formData.minValue) {
-
+ 
         if (!this.editData.fcheckResu) {
           this.$showMessage("璇疯緭鍏ユ楠屽��");
           return;
         }
-
+ 
         if (this.editData.fcheckResu >= this.formData.minValue && this.editData.fcheckResu <= this.formData.maxValue) {
           this.editData.isPass = 1
         } else {
@@ -783,11 +783,11 @@
           fstand = "脳";
         }
       } else {
-
+ 
         if (!this.editData.fcheckResu) {
           this.editData.fcheckResu = 1
         }
-
+ 
         if (this.editData.fcheckResu == 0 || this.editData.fcheckResu == 1) {
           if (this.editData.fcheckResu == 0) {
             fstand = "脳";
@@ -797,9 +797,9 @@
           return;
         }
       }
-
+ 
       this.editData.updater = this.$loginInfo.account;
-
+ 
       // 鏄剧ず纭鎻愮ず妗�
       uni.showModal({
         title: '纭淇敼',
@@ -829,15 +829,15 @@
       });
     },
     numberEdit(item) {
-
+ 
       let fstand = "鈭�";
       let fcheckResu = 1;
-
+ 
       if (item.fcheckResu == '1') {
         fstand = "脳";
         fcheckResu = 0;
       }
-
+ 
       this.$post({
         url: "/SJ/UpdateQSItemDetail",
         data: {
@@ -875,7 +875,7 @@
         })
       }
     },
-
+ 
     // ===== 闄勪欢鐩稿叧鏂规硶 =====
     viewAttachmentInfo() {
       this.showAttachmentPopup = true;
@@ -895,10 +895,14 @@
         if (tbBillListElement && tbBillListElement.itemNo) {
           console.log("鑾峰彇鍒扮殑鐗╂枡缂栫爜:", tbBillListElement.itemNo);
           
-          // 浣跨敤鑾峰彇鍒扮殑鐗╂枡缂栫爜璋冪敤闄勪欢鎺ュ彛
+          // 浣跨敤鑾峰彇鍒扮殑鐗╂枡缂栫爜鍜岄」鐩悕绉拌皟鐢ㄩ檮浠舵帴鍙�
           return this.$post({
             url: "/SJ/getAttachments",
-            data: { itemNo: tbBillListElement.itemNo }
+            data: { 
+              itemNo: tbBillListElement.itemNo,
+              projName: this.formData.projName,  // 浼犻�掗」鐩悕绉�
+              fromPage: 'Detail'  // 鏍囪瘑鏉ヨ嚜Detail椤甸潰锛岄渶瑕佽繃婊�
+            }
           });
         } else {
           throw new Error("鏈壘鍒扮墿鏂欑紪鐮佷俊鎭�");
@@ -1011,7 +1015,8 @@
       const fileName = item.fattach.replace(/[\s\u3000\r\n]+/g, '').trim();
       const downloadUrl = this.$store.state.serverInfo.serverAPI + "/SJ/DownloadFtpFile?itemNo=" + 
         encodeURIComponent(item.itemNo) + "&fileName=" + encodeURIComponent(fileName) + 
-        "&ftpServer=" + encodeURIComponent(this.$store.state.serverInfo.ftpServer);
+        "&ftpServer=" + encodeURIComponent(this.$store.state.serverInfo.ftpServer) +
+        "&projName=" + encodeURIComponent(this.formData.projName || '');
       
       uni.downloadFile({
         url: downloadUrl,
@@ -1044,7 +1049,8 @@
       
       const previewUrl = this.$store.state.serverInfo.serverAPI + "/SJ/PreviewFtpFile?itemNo=" + 
         encodeURIComponent(item.itemNo) + "&fileName=" + encodeURIComponent(fileName) + 
-        "&ftpServer=" + encodeURIComponent(this.$store.state.serverInfo.ftpServer);
+        "&ftpServer=" + encodeURIComponent(this.$store.state.serverInfo.ftpServer) +
+        "&projName=" + encodeURIComponent(this.formData.projName || '');
       
       if (['pdf'].includes(fileExt)) {
         this.previewPdfFile(previewUrl, fileName);
@@ -1127,50 +1133,50 @@
   onLoad(options) {
 //options涓寘鍚簡url闄勫甫鐨勫弬鏁�
     let params = options;
-
+ 
     this.id = params["id"];
     this.billNo = params["billNo"];
     this.gid = params["gid"];
-
+ 
     this.refreshResult();
   }
 }
 </script>
-
+ 
 <style lang="scss">
 $primary-color: #409EFF;
 $success-color: #67C23A;
 $danger-color: #F56C6C;
 $border-color: #DCDFE6;
 $bg-color: #f5f7fa;
-
+ 
 .container {
   padding: 20px;
   background-color: #fff;
 }
-
+ 
 .header {
   padding: 20px;
   border-bottom: 1px solid $border-color;
   background: linear-gradient(90deg, #f0f7ff, #e1f0ff);
-
+ 
   .title {
     font-size: 24px;
     color: #333;
     margin-bottom: 10px;
   }
-
+ 
   .order-number {
     color: #666;
     font-size: 14px;
   }
 }
-
+ 
 .tabs {
   display: flex;
   background-color: $bg-color;
   border-bottom: 1px solid $border-color;
-
+ 
   .tab {
     flex: 1;
     text-align: center;
@@ -1178,17 +1184,17 @@
     border-right: 1px solid $border-color;
     color: #666;
     transition: all 0.3s;
-
+ 
     &:last-child {
       border-right: none;
     }
-
+ 
     &.active {
       background-color: #fff;
       color: $primary-color;
       font-weight: bold;
       position: relative;
-
+ 
       &::after {
         content: '';
         position: absolute;
@@ -1201,52 +1207,52 @@
     }
   }
 }
-
+ 
 .section {
   margin: 20px 0;
   border: 1px solid $border-color;
   border-radius: 4px;
-
+ 
   &-header {
     padding: 12px 16px;
     background-color: $bg-color;
     border-bottom: 1px solid $border-color;
     font-weight: bold;
   }
-
+ 
   &-body {
     padding: 16px;
   }
 }
-
+ 
 .info-grid {
   display: grid;
   grid-template-columns: repeat(3, 1fr);
   gap: 16px;
-
+ 
   .info-item {
     margin-bottom: 12px;
-
+ 
     .info-label {
       color: #909399;
       font-size: 14px;
       margin-bottom: 4px;
     }
-
+ 
     .info-value {
       color: #333;
       font-weight: 500;
     }
   }
 }
-
+ 
 .input-group {
   margin: 16px 0;
-
+ 
   .input-wrapper {
     display: flex;
     gap: 12px;
-
+ 
     .result-input {
       flex: 1;
       height: 45px;
@@ -1255,7 +1261,7 @@
       border-radius: 4px;
       font-size: 14px;
     }
-
+ 
     .upload-btn {
       background-color: #909399;
       color: #fff;
@@ -1269,7 +1275,7 @@
       max-width: 120px;
       flex: 1;
     }
-
+ 
     .attachment-btn {
       background-color: #17a2b8;
       color: #fff;
@@ -1285,33 +1291,33 @@
     }
   }
 }
-
+ 
 .table-container {
   border: 1px solid $border-color;
   border-radius: 4px;
   margin-top: 20px;
-
+ 
   .table-header {
     display: flex;
     background-color: $bg-color;
     border-bottom: 1px solid $border-color;
-
+ 
     .th {
       flex: 1;
       padding: 12px;
       font-weight: bold;
     }
   }
-
+ 
   .table-row {
     display: flex;
     border-bottom: 1px solid $border-color;
     padding: 12px;
-
+ 
     &:last-child {
       border-bottom: none;
     }
-
+ 
     .td {
       flex: 1;
       display: flex;
@@ -1319,35 +1325,35 @@
     }
   }
 }
-
+ 
 .result-badge {
   display: inline-block;
   padding: 4px 8px;
   border-radius: 4px;
   font-size: 12px;
   font-weight: bold;
-
+ 
   &.OK {
     background-color: rgba($success-color, 0.1);
     color: $success-color;
   }
-
+ 
   &.NG {
     background-color: rgba($danger-color, 0.1);
     color: $danger-color;
   }
-
+ 
   &.PENDING {
     background-color: rgba(#E6A23C, 0.1);
     color: #E6A23C;
   }
-
+ 
   &.BLOCKED {
     background-color: rgba(#909399, 0.1);
     color: #909399;
   }
 }
-
+ 
 .record-value {
   font-family: 'Courier New', monospace;
   font-weight: 500;
@@ -1357,38 +1363,38 @@
   border-radius: 3px;
   border: 1px solid #e9ecef;
 }
-
+ 
 .no-data-text {
   color: #E6A23C;
   font-size: 12px;
   font-style: italic;
 }
-
+ 
 .blocked-text {
   color: #909399;
   font-size: 12px;
   font-style: italic;
 }
-
+ 
 .waiting-text {
   color: #E6A23C;
   font-size: 12px;
   font-style: italic;
 }
-
+ 
 .ready-text {
   color: #67C23A;
   font-size: 12px;
   font-weight: bold;
 }
-
-
+ 
+ 
 .spec-text {
   font-size: 14px;
   color: #333;
   line-height: 1.5;
 }
-
+ 
 .result-preview {
   margin: 16px 0;
   padding: 12px;
@@ -1397,19 +1403,19 @@
   display: flex;
   align-items: center;
   gap: 12px;
-
+ 
   .info-label {
     color: #909399;
     font-size: 14px;
     min-width: 80px;
   }
-
+ 
   .info-value {
     color: #333;
     font-weight: 500;
   }
 }
-
+ 
 .result-ng {
   margin: 16px 0;
   padding: 12px;
@@ -1418,45 +1424,45 @@
   display: flex;
   align-items: center;
   gap: 12px;
-
+ 
   .info-label {
     color: $danger-color;
     font-size: 14px;
     min-width: 80px;
   }
-
+ 
   .info-value {
     color: $danger-color;
     font-weight: 500;
   }
 }
-
+ 
 .action-buttons {
   margin-top: 20px;
   display: flex;
   justify-content: flex-end;
   gap: 12px;
-
+ 
   .btn {
     padding: 8px 20px;
     border-radius: 4px;
-
+ 
     &.primary-btn {
       background-color: $primary-color;
       color: #fff;
     }
-
+ 
     &.cancel-btn {
       background-color: #909399;
       color: #fff;
     }
   }
 }
-
+ 
 .danger {
   color: $danger-color;
 }
-
+ 
 .overlay {
   position: fixed;
   top: 0;
@@ -1469,7 +1475,7 @@
   align-items: center;
   z-index: 2000;
 }
-
+ 
 .popup {
   background-color: #fff;
   padding: 0;
@@ -1484,38 +1490,38 @@
   max-height: 80vh;
   overflow-y: auto;
 }
-
+ 
 .popup-header {
   padding: 20px;
   border-bottom: 1px solid #eee;
-
+ 
   h3 {
     font-size: 18px;
     font-weight: 600;
     color: #2c3e50;
     margin: 0;
   }
-
+ 
   .popup-subtitle {
     font-size: 14px;
     color: #7f8c8d;
     margin: 5px 0 0 0;
   }
 }
-
+ 
 .popup-content {
   padding: 20px;
-
+ 
   .input-group {
     margin-bottom: 15px;
-
+ 
     .input-label {
       font-size: 14px;
       color: #7f8c8d;
       margin-right: 10px;
       min-width: 80px;
     }
-
+ 
     .input-field {
       flex: 1;
       padding: 8px 12px;
@@ -1525,28 +1531,28 @@
       background-color: white;
     }
   }
-
+ 
   .input-hint {
     margin-top: 8px;
     padding: 8px 12px;
     background-color: #f8f9fa;
     border-radius: 4px;
     border-left: 3px solid #409EFF;
-
+ 
     text {
       font-size: 12px;
       color: #666;
     }
   }
 }
-
+ 
 .popup-actions {
   padding: 20px;
   border-top: 1px solid #eee;
   display: flex;
   gap: 10px;
   justify-content: flex-end;
-
+ 
   .action-btn {
     padding: 12px 20px;
     border: none;
@@ -1555,37 +1561,37 @@
     font-weight: 500;
     cursor: pointer;
     transition: all 0.2s;
-
+ 
     &.primary {
       background-color: #3498db;
       color: white;
     }
-
+ 
     &.secondary {
       background-color: #95a5a6;
       color: white;
     }
-
+ 
     &:hover {
       transform: translateY(-1px);
       box-shadow: 0 2px 8px rgba(0,0,0,0.15);
     }
   }
 }
-
+ 
 /* 鍥剧墖棰勮 */
 .image-preview {
   text-align: center;
   cursor: pointer;
 }
-
+ 
 .preview-image {
   max-width: 100%;
   max-height: 300px;
   border-radius: 4px;
   border: 1px solid #ddd;
 }
-
+ 
 /* 鍝嶅簲寮忚璁� */
 @media (max-width: 768px) {
   .info-grid {
@@ -1600,12 +1606,12 @@
   .input-label {
     margin-bottom: 5px;
   }
-
+ 
   .input-wrapper {
     flex-direction: column;
     gap: 8px;
   }
-
+ 
   .upload-btn,
   .attachment-btn {
     min-width: 70px;
@@ -1615,19 +1621,19 @@
     min-height: 40px;
   }
 }
-
+ 
 /* 闄勪欢鐩稿叧鏍峰紡 */
 .attachment-list-popup {
   width: 80vw;
   max-width: 800px;
   max-height: 85vh;
 }
-
+ 
 .attachment-detail-popup {
   width: 70vw;
   max-width: 600px;
 }
-
+ 
 .attachment-popup-header {
   padding: 16px;
   border-bottom: 1px solid #eee;
@@ -1636,14 +1642,14 @@
   align-items: center;
   background-color: white;
 }
-
+ 
 .attachment-popup-title {
   font-size: 16px;
   font-weight: 600;
   color: #2c3e50;
   margin: 0;
 }
-
+ 
 .attachment-close-btn {
   padding: 8px 16px;
   border: 1px solid #ddd;
@@ -1653,17 +1659,17 @@
   transition: all 0.2s;
   color: #2c3e50;
 }
-
+ 
 .attachment-close-btn:hover {
   background-color: #f8f9fa;
 }
-
+ 
 .attachment-popup-content {
   padding: 16px;
   max-height: 60vh;
   overflow-y: auto;
 }
-
+ 
 /* 鍔犺浇鐘舵�� */
 .attachment-loading {
   display: flex;
@@ -1673,7 +1679,7 @@
   padding: 40px 20px;
   gap: 16px;
 }
-
+ 
 .loading-spinner {
   width: 32px;
   height: 32px;
@@ -1682,17 +1688,17 @@
   border-radius: 50%;
   animation: spin 1s linear infinite;
 }
-
+ 
 @keyframes spin {
   0% { transform: rotate(0deg); }
   100% { transform: rotate(360deg); }
 }
-
+ 
 .loading-text {
   font-size: 14px;
   color: #7f8c8d;
 }
-
+ 
 /* 绌虹姸鎬� */
 .attachment-empty {
   display: flex;
@@ -1703,30 +1709,30 @@
   gap: 12px;
   text-align: center;
 }
-
+ 
 .empty-icon {
   font-size: 36px;
   opacity: 0.6;
 }
-
+ 
 .empty-text {
   font-size: 16px;
   color: #7f8c8d;
   font-weight: 500;
 }
-
+ 
 .empty-hint {
   font-size: 14px;
   color: #95a5a6;
 }
-
+ 
 /* 闄勪欢鍒楄〃甯冨眬 */
 .attachment-list {
   display: flex;
   flex-direction: column;
   gap: 16px;
 }
-
+ 
 .attachment-item {
   background-color: white;
   border-radius: 8px;
@@ -1735,11 +1741,11 @@
   transition: all 0.3s;
   border: 1px solid #eee;
 }
-
+ 
 .attachment-item:hover {
   box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1);
 }
-
+ 
 .attachment-info {
   padding: 16px;
   border-bottom: 1px solid #eee;
@@ -1747,7 +1753,7 @@
   align-items: center;
   gap: 16px;
 }
-
+ 
 .file-type-badge {
   width: 40px;
   height: 40px;
@@ -1760,13 +1766,13 @@
   border: 2px solid #e9ecef;
   flex-shrink: 0;
 }
-
+ 
 .file-type-badge.large {
   width: 56px;
   height: 56px;
   font-size: 28px;
 }
-
+ 
 .file-type-badge.file-pdf { background: #ffe6e6; border-color: #ffcccc; }
 .file-type-badge.file-image { background: #e6f3ff; border-color: #cce7ff; }
 .file-type-badge.file-text { background: #e6ffe6; border-color: #ccffcc; }
@@ -1776,12 +1782,12 @@
 .file-type-badge.file-archive { background: #f0e6ff; border-color: #e0ccff; }
 .file-type-badge.file-cad { background: #e6fff0; border-color: #ccffe0; }
 .file-type-badge.file-unknown { background: #f5f5f5; border-color: #e0e0e0; }
-
+ 
 .attachment-details {
   flex: 1;
   min-width: 0;
 }
-
+ 
 .attachment-name {
   font-size: 16px;
   font-weight: 600;
@@ -1793,39 +1799,39 @@
   margin-bottom: 8px;
   transition: color 0.2s;
 }
-
+ 
 .attachment-name:hover {
   color: #3498db;
 }
-
+ 
 .attachment-meta {
   display: flex;
   gap: 16px;
   font-size: 12px;
   color: #95a5a6;
 }
-
+ 
 .meta-type {
   background-color: #ecf0f1;
   padding: 2px 6px;
   border-radius: 10px;
   color: #7f8c8d;
 }
-
+ 
 .meta-version {
   background-color: #e8f5e8;
   padding: 2px 6px;
   border-radius: 10px;
   color: #2e7d32;
 }
-
+ 
 .meta-date {
   background-color: #fff3e0;
   padding: 2px 6px;
   border-radius: 10px;
   color: #f57c00;
 }
-
+ 
 .attachment-actions {
   padding: 12px 16px;
   border-top: 1px solid #eee;
@@ -1833,7 +1839,7 @@
   gap: 8px;
   background-color: #f8f9fa;
 }
-
+ 
 /* 鎸夐挳鏍峰紡 */
 .btn-secondary {
   padding: 8px 16px;
@@ -1845,11 +1851,11 @@
   color: #2c3e50;
   flex: 1;
 }
-
+ 
 .btn-secondary:hover {
   background-color: #f8f9fa;
 }
-
+ 
 .btn-primary {
   padding: 8px 16px;
   border: 1px solid #3498db;
@@ -1860,11 +1866,11 @@
   transition: all 0.2s;
   flex: 1;
 }
-
+ 
 .btn-primary:hover {
   background-color: #2980b9;
 }
-
+ 
 .btn-success {
   padding: 8px 16px;
   border: 1px solid #2ecc71;
@@ -1875,11 +1881,11 @@
   transition: all 0.2s;
   flex: 1;
 }
-
+ 
 .btn-success:hover {
   background-color: #27ae60;
 }
-
+ 
 /* 闄勪欢璇︽儏鏍峰紡 */
 .attachment-detail-header {
   display: flex;
@@ -1889,7 +1895,7 @@
   padding-bottom: 16px;
   border-bottom: 1px solid #eee;
 }
-
+ 
 .attachment-detail-title {
   font-size: 18px;
   font-weight: 600;
@@ -1897,34 +1903,34 @@
   flex: 1;
   word-break: break-all;
 }
-
+ 
 .attachment-detail-info {
   margin-bottom: 20px;
 }
-
+ 
 .info-row {
   display: flex;
   margin-bottom: 12px;
   gap: 16px;
 }
-
+ 
 .info-item {
   flex: 1;
 }
-
+ 
 .info-label {
   display: block;
   font-size: 12px;
   color: #7f8c8d;
   margin-bottom: 4px;
 }
-
+ 
 .info-content {
   font-size: 14px;
   color: #2c3e50;
   line-height: 1.5;
 }
-
+ 
 .attachment-detail-actions {
   padding: 12px 16px;
   border-top: 1px solid #eee;
@@ -1932,14 +1938,14 @@
   gap: 8px;
   background-color: #f8f9fa;
 }
-
+ 
 /* 鏂囦欢棰勮寮圭獥鏍峰紡 */
 .file-preview-popup {
   width: 80vw;
   max-width: 800px;
   max-height: 80vh;
 }
-
+ 
 .file-preview-title {
   padding: 20px;
   margin: 0;
@@ -1949,13 +1955,13 @@
   border-bottom: 1px solid #eee;
   word-break: break-all;
 }
-
+ 
 .file-preview-content {
   padding: 20px;
   max-height: 60vh;
   overflow-y: auto;
 }
-
+ 
 .file-preview-content pre {
   white-space: pre-wrap;
   word-wrap: break-word;
@@ -1967,38 +1973,38 @@
   border-radius: 4px;
   border: 1px solid #e9ecef;
 }
-
+ 
 .image-preview-container {
   text-align: center;
 }
-
+ 
 .image-zoom-hint {
   margin-top: 10px;
   font-size: 12px;
   color: #7f8c8d;
 }
-
+ 
 .unsupported-preview {
   text-align: center;
   padding: 40px 20px;
 }
-
+ 
 .unsupported-icon {
   font-size: 48px;
   margin-bottom: 16px;
 }
-
+ 
 .unsupported-text {
   font-size: 16px;
   color: #7f8c8d;
   margin-bottom: 8px;
 }
-
+ 
 .unsupported-hint {
   font-size: 14px;
   color: #95a5a6;
 }
-
+ 
 .file-preview-actions {
   padding: 15px 20px;
   border-top: 1px solid #eee;
@@ -2006,7 +2012,7 @@
   gap: 10px;
   justify-content: center;
 }
-
+ 
 .file-preview-btn {
   padding: 8px 16px;
   border-radius: 4px;
@@ -2015,17 +2021,17 @@
   cursor: pointer;
   transition: all 0.2s;
 }
-
+ 
 .file-preview-btn.download-btn {
   background: #2ecc71;
   color: white;
 }
-
+ 
 .file-preview-btn.close-btn {
   background: #95a5a6;
   color: white;
 }
-
+ 
 .file-preview-btn:hover {
   transform: translateY(-1px);
   box-shadow: 0 2px 8px rgba(0,0,0,0.15);

--
Gitblit v1.9.3