From 4a9c0f7ddb5eae77b1f833bd2223e33fe6bb2918 Mon Sep 17 00:00:00 2001
From: xwt <2740516069@qq.com>
Date: 星期四, 30 十月 2025 12:41:24 +0800
Subject: [PATCH] XJ,SJ,RKJ序号排序,LLJ单个检验项目FTP附件

---
 pages/QC/RKJ/List.vue    |    8 
 pages/QC/XJ/Add.vue      |   20 
 pages/QC/RKJ/Add.vue     |   20 
 manifest.json            |    2 
 pages/QC/LLJ/Add.vue     |  690 +++++++++++++------
 pages/QC/LLJ/detail.vue  |  891 +++++++++++++++++++++++++
 pages/BasePages/main.vue |  363 ++++++++++
 pages/BasePages/user.vue |    7 
 pages/QC/SJ/List.vue     |    8 
 pages/QC/SJ/Add.vue      |   18 
 pages/QC/XJ/List.vue     |    8 
 store/index.js           |    6 
 12 files changed, 1,773 insertions(+), 268 deletions(-)

diff --git a/manifest.json b/manifest.json
index e219456..9b1a0a5 100644
--- a/manifest.json
+++ b/manifest.json
@@ -2,7 +2,7 @@
     "name" : "GS-MES-AP",
     "appid" : "__UNI__F08FAE3",
     "description" : "",
-    "versionName" : "1.1.4.1",
+    "versionName" : "1.1.4.2",
     "versionCode" : 1,
     "transformPx" : false,
     /* 5+App鐗规湁鐩稿叧 */
diff --git a/pages/BasePages/main.vue b/pages/BasePages/main.vue
index 1557079..d8eaf1a 100644
--- a/pages/BasePages/main.vue
+++ b/pages/BasePages/main.vue
@@ -1,7 +1,7 @@
 <template>
 	<uni-base-page :footer="false">
 		<view slot="page">
-			<view v-if="loginInfo.hasLogin">
+			<view v-if="loginInfo.hasLogin" class="main-container">
 				<!-- 鏁欏瑙嗛銆佸叕鍙稿唴閮ㄥ浼犲浘鐗囩瓑 -->
 				<!--        <swiper indicator-dots="true" :autoplay="true" :interval="3000">-->
 				<!--          <swiper-item v-for="(img,key) in imgUrls" :key="key">-->
@@ -10,6 +10,51 @@
 				<!--        </swiper>-->
 				<!-- 閫氭姤鎵硅瘎銆佹秷鎭璀︺�佸叕鍛娿�佹姤鍛� -->
 				<uni-notice-bar :show-icon="true" :scrollable="true" :speed="30" :single="true" :text="msg" />
+				
+				<!-- 绛涢�夋寜閽� -->
+				<view class="filter-btn" @click="toggleFilter">
+					<uni-icons type="funnel-fill" size="20" color="#fff"></uni-icons>
+					<text class="filter-btn-text">绛涢��</text>
+					<view v-if="selectedDepartmentId || selectedLineId" class="filter-badge"></view>
+				</view>
+				
+				<!-- 绛涢�夊脊鍑哄眰 -->
+				<view v-if="showFilter" class="filter-overlay" @click="closeFilter">
+					<view class="filter-panel" @click.stop>
+						<view class="filter-header">
+							<text class="filter-title">绛涢�夋潯浠�</text>
+							<view class="close-icon" @click="closeFilter">
+								<uni-icons type="close" size="20" color="#666"></uni-icons>
+							</view>
+						</view>
+						
+						<view class="filter-content">
+							<view class="filter-row">
+								<text class="filter-label">杞﹂棿</text>
+								<picker @change="onDepartmentChange" :value="departmentIndex" :range="departments" range-key="departmentname" class="filter-picker">
+									<view class="picker-text">
+										{{departmentIndex >= 0 ? departments[departmentIndex].departmentname : '璇烽�夋嫨杞﹂棿'}}
+									</view>
+								</picker>
+							</view>
+							
+							<view class="filter-row">
+								<text class="filter-label">绾夸綋</text>
+								<picker @change="onLineChange" :value="lineIndex" :range="lines" range-key="lineName" :disabled="!selectedDepartmentId" class="filter-picker">
+									<view class="picker-text" :class="{'disabled': !selectedDepartmentId}">
+										{{lineIndex >= 0 ? lines[lineIndex].lineName : selectedDepartmentId ? '璇烽�夋嫨绾夸綋' : '璇峰厛閫夋嫨杞﹂棿'}}
+									</view>
+								</picker>
+							</view>
+						</view>
+						
+						<view class="filter-footer">
+							<button class="reset-btn" @click="clearFilters">娓呯┖</button>
+							<button class="confirm-btn" @click="closeFilter">纭畾</button>
+						</view>
+					</view>
+				</view>
+				
 				<!-- 鐢ㄦ埛绯荤粺鑿滃崟妯″潡 -->
 				<view class="example-body">
 					<uni-grid :column="col" :showBorder="false">
@@ -54,11 +99,153 @@
 				],
 				col: 4, //鑿滃崟鍒楁暟
 				msg: "瀹佹尝骞挎繁绉戞妧鏈夐檺鍏徃",
-				updateChecked: false
-
+				updateChecked: false,
+				// 杞﹂棿鍜岀嚎浣撶瓫閫夌浉鍏虫暟鎹�
+				departments: [],
+				departmentIndex: -1,
+				selectedDepartmentId: '',
+				lines: [],
+				lineIndex: -1,
+				selectedLineId: '',
+				showFilter: false // 鎺у埗绛涢�夐潰鏉挎樉绀�
 			};
 		},
 		methods: {
+			// 鍒囨崲绛涢�夐潰鏉挎樉绀�
+			toggleFilter() {
+				this.showFilter = !this.showFilter;
+			},
+			
+			// 鍏抽棴绛涢�夐潰鏉�
+			closeFilter() {
+				this.showFilter = false;
+			},
+			
+			// 鑾峰彇杞﹂棿鍒楄〃
+			getDepartments() {
+				this.$post({
+					url: "/Base/GetQCDepartments",
+					data: {}
+				}).then(res => {
+					this.departments = res.data || [];
+					// 浠庣紦瀛樹腑鎭㈠閫夋嫨
+					const cachedDeptId = uni.getStorageSync('qc_filter_departmentId');
+					if (cachedDeptId && this.departments.length > 0) {
+						const index = this.departments.findIndex(d => d.departmentid == cachedDeptId);
+						if (index >= 0) {
+							this.departmentIndex = index;
+							this.selectedDepartmentId = cachedDeptId;
+							this.getLines();
+						}
+					}
+				}).catch(err => {
+					console.error('鑾峰彇杞﹂棿鍒楄〃澶辫触:', err);
+				});
+			},
+			
+			// 鑾峰彇绾夸綋鍒楄〃锛堟牴鎹溅闂磋繃婊わ級
+			getLines() {
+				if (!this.selectedDepartmentId) {
+					this.lines = [];
+					return;
+				}
+				
+				this.$post({
+					url: "/Base/GetQCLines",
+					data: {
+						departmentId: this.selectedDepartmentId
+					}
+				}).then(res => {
+					this.lines = res.data || [];
+					// 浠庣紦瀛樹腑鎭㈠閫夋嫨
+					const cachedLineId = uni.getStorageSync('qc_filter_lineId');
+					if (cachedLineId && this.lines.length > 0) {
+						const index = this.lines.findIndex(l => l.lineNo == cachedLineId);
+						if (index >= 0) {
+							this.lineIndex = index;
+							this.selectedLineId = cachedLineId;
+						} else {
+							// 濡傛灉缂撳瓨鐨勭嚎浣撲笉鍦ㄥ綋鍓嶈溅闂翠笅锛屾竻闄ょ嚎浣撻�夋嫨
+							this.lineIndex = -1;
+							this.selectedLineId = '';
+							uni.removeStorageSync('qc_filter_lineId');
+							uni.removeStorageSync('qc_filter_lineName');
+						}
+					}
+				}).catch(err => {
+					console.error('鑾峰彇绾夸綋鍒楄〃澶辫触:', err);
+				});
+			},
+			
+			// 杞﹂棿閫夋嫨鏀瑰彉
+			onDepartmentChange(e) {
+				const index = parseInt(e.detail.value);
+				this.departmentIndex = index;
+				
+				if (index >= 0 && this.departments[index]) {
+					this.selectedDepartmentId = this.departments[index].departmentid;
+					const departmentName = this.departments[index].departmentname;
+					
+					// 淇濆瓨鍒扮紦瀛�
+					uni.setStorageSync('qc_filter_departmentId', this.selectedDepartmentId);
+					uni.setStorageSync('qc_filter_departmentName', departmentName);
+					
+					// 娓呴櫎绾夸綋閫夋嫨
+					this.lineIndex = -1;
+					this.selectedLineId = '';
+					uni.removeStorageSync('qc_filter_lineId');
+					uni.removeStorageSync('qc_filter_lineName');
+					
+					// 鍔犺浇璇ヨ溅闂翠笅鐨勭嚎浣�
+					this.getLines();
+					
+					uni.showToast({
+						title: `宸查�夋嫨杞﹂棿锛�${departmentName}`,
+						icon: 'none'
+					});
+				}
+			},
+			
+			// 绾夸綋閫夋嫨鏀瑰彉
+			onLineChange(e) {
+				const index = parseInt(e.detail.value);
+				this.lineIndex = index;
+				
+				if (index >= 0 && this.lines[index]) {
+					this.selectedLineId = this.lines[index].lineNo;
+					const lineName = this.lines[index].lineName;
+					
+					// 淇濆瓨鍒扮紦瀛�
+					uni.setStorageSync('qc_filter_lineId', this.selectedLineId);
+					uni.setStorageSync('qc_filter_lineName', lineName);
+					
+					uni.showToast({
+						title: `宸查�夋嫨绾夸綋锛�${lineName}`,
+						icon: 'none'
+					});
+				}
+			},
+			
+			// 娓呯┖绛涢�夋潯浠�
+			clearFilters() {
+				this.departmentIndex = -1;
+				this.selectedDepartmentId = '';
+				this.lineIndex = -1;
+				this.selectedLineId = '';
+				this.lines = [];
+				
+				// 娓呴櫎缂撳瓨
+				uni.removeStorageSync('qc_filter_departmentId');
+				uni.removeStorageSync('qc_filter_departmentName');
+				uni.removeStorageSync('qc_filter_lineId');
+				uni.removeStorageSync('qc_filter_lineName');
+				
+				uni.showToast({
+					title: '宸叉竻绌虹瓫閫夋潯浠�',
+					icon: 'success'
+				});
+			},
+			
 			getMenu(isShowMask) {
 				if (isShowMask) uni.showLoading({
 					mask: true,
@@ -199,12 +386,26 @@
 				
 				this.getMenu(true);
 				this.checkForUpdate();
+				this.getDepartments(); // 鍔犺浇杞﹂棿鍒楄〃
 			}
 
 
 		},
 		onShow() {
 			// this.getIsMsg();
+			// 姣忔鏄剧ず椤甸潰鏃舵仮澶嶇瓫閫夋潯浠舵樉绀�
+			if (this.loginInfo.hasLogin && this.departments.length === 0) {
+				this.getDepartments();
+			}
+			// 妫�鏌ョ紦瀛樼殑绛涢�夋潯浠讹紝濡傛灉涓嶅瓨鍦ㄥ垯閲嶇疆UI鐘舵��
+			const cachedDeptId = uni.getStorageSync('qc_filter_departmentId');
+			if (!cachedDeptId) {
+				this.departmentIndex = -1;
+				this.selectedDepartmentId = '';
+				this.lineIndex = -1;
+				this.selectedLineId = '';
+				this.lines = [];
+			}
 		},
 		onPullDownRefresh() {
 			if (this.loginInfo.hasLogin)
@@ -268,4 +469,160 @@
 		flex-direction: row;
 		justify-content: flex-start;
 	}
+	
+	.main-container {
+		position: relative;
+	}
+	
+	/* 绛涢�夋寜閽牱寮� */
+	.filter-btn {
+		position: fixed;
+		top: 20rpx;
+		right: 20rpx;
+		z-index: 1000;
+		display: flex;
+		align-items: center;
+		gap: 8rpx;
+		padding: 12rpx 24rpx;
+		background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+		border-radius: 50rpx;
+		box-shadow: 0 4rpx 16rpx rgba(102, 126, 234, 0.4);
+	}
+	
+	.filter-btn-text {
+		font-size: 24rpx;
+		color: #fff;
+		font-weight: 600;
+	}
+	
+	.filter-badge {
+		position: absolute;
+		top: 4rpx;
+		right: 4rpx;
+		width: 16rpx;
+		height: 16rpx;
+		background-color: #ff4757;
+		border-radius: 50%;
+		border: 2rpx solid #fff;
+	}
+	
+	/* 绛涢�夊脊鍑哄眰 */
+	.filter-overlay {
+		position: fixed;
+		top: 0;
+		left: 0;
+		right: 0;
+		bottom: 0;
+		background-color: rgba(0, 0, 0, 0.5);
+		z-index: 999;
+		display: flex;
+		align-items: flex-start;
+		justify-content: flex-end;
+		padding: 80rpx 20rpx 20rpx 20rpx;
+	}
+	
+	.filter-panel {
+		width: 500rpx;
+		max-width: 90%;
+		background-color: #fff;
+		border-radius: 16rpx;
+		box-shadow: 0 8rpx 32rpx rgba(0, 0, 0, 0.2);
+		animation: slideIn 0.3s ease-out;
+	}
+	
+	@keyframes slideIn {
+		from {
+			transform: translateX(100%);
+			opacity: 0;
+		}
+		to {
+			transform: translateX(0);
+			opacity: 1;
+		}
+	}
+	
+	.filter-header {
+		display: flex;
+		align-items: center;
+		justify-content: space-between;
+		padding: 24rpx 28rpx;
+		border-bottom: 1rpx solid #f0f0f0;
+	}
+	
+	.filter-title {
+		font-size: 32rpx;
+		font-weight: 700;
+		color: #333;
+	}
+	
+	.close-icon {
+		padding: 8rpx;
+	}
+	
+	.filter-content {
+		padding: 32rpx 28rpx;
+	}
+	
+	.filter-row {
+		margin-bottom: 32rpx;
+	}
+	
+	.filter-row:last-child {
+		margin-bottom: 0;
+	}
+	
+	.filter-label {
+		display: block;
+		font-size: 28rpx;
+		color: #666;
+		margin-bottom: 16rpx;
+		font-weight: 600;
+	}
+	
+	.filter-picker {
+		width: 100%;
+	}
+	
+	.picker-text {
+		padding: 20rpx 24rpx;
+		background-color: #f8f9ff;
+		border-radius: 12rpx;
+		border: 2rpx solid #e0e5ff;
+		font-size: 28rpx;
+		color: #333;
+		text-align: left;
+	}
+	
+	.picker-text.disabled {
+		background-color: #f5f5f5;
+		color: #999;
+		border-color: #e5e5e5;
+	}
+	
+	.filter-footer {
+		display: flex;
+		gap: 16rpx;
+		padding: 24rpx 28rpx;
+		border-top: 1rpx solid #f0f0f0;
+	}
+	
+	.reset-btn,
+	.confirm-btn {
+		flex: 1;
+		padding: 20rpx;
+		border-radius: 12rpx;
+		font-size: 28rpx;
+		font-weight: 600;
+		border: none;
+	}
+	
+	.reset-btn {
+		background-color: #f5f5f5;
+		color: #666;
+	}
+	
+	.confirm-btn {
+		background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+		color: #fff;
+	}
 </style>
\ No newline at end of file
diff --git a/pages/BasePages/user.vue b/pages/BasePages/user.vue
index 4085b94..49c16a7 100644
--- a/pages/BasePages/user.vue
+++ b/pages/BasePages/user.vue
@@ -46,6 +46,13 @@
 
 			}
 		});
+		
+		// 娓呴櫎QC绛涢�夋潯浠�
+		uni.removeStorageSync('qc_filter_departmentId');
+		uni.removeStorageSync('qc_filter_departmentName');
+		uni.removeStorageSync('qc_filter_lineId');
+		uni.removeStorageSync('qc_filter_lineName');
+		
       /**
        * 濡傛灉闇�瑕佸己鍒剁櫥褰曡烦杞洖鐧诲綍椤甸潰
        */
diff --git a/pages/QC/LLJ/Add.vue b/pages/QC/LLJ/Add.vue
index 6d6975c..a53dc0a 100644
--- a/pages/QC/LLJ/Add.vue
+++ b/pages/QC/LLJ/Add.vue
@@ -373,57 +373,119 @@
 		<!-- 闄勪欢璇︽儏寮圭獥 -->
 		<view v-if="showAttachmentDetail" class="overlay">
 			<view class="popup attachment-detail-popup">
-				<h3 class="attachment-popup-title">闄勪欢璇︽儏</h3>
-				<div class="attachment-popup-divider"></div>
-				<div v-if="selectedAttachment" class="attachment-detail-content">
-					<div class="attachment-detail-row"><span class="attachment-label">ID锛�</span><span>{{ Math.trunc(selectedAttachment.id) }}</span></div>
-					<div class="attachment-detail-row"><span class="attachment-label">闄勪欢鍚嶏細</span><span>{{ selectedAttachment.fattach }}</span></div>
-					<div class="attachment-detail-row"><span class="attachment-label">绫诲瀷锛�</span><span>{{ selectedAttachment.ftype }}</span></div>
-					<div class="attachment-detail-row"><span class="attachment-label">鐗堟湰锛�</span><span>{{ selectedAttachment.fversion }}</span></div>
-					<div class="attachment-detail-row"><span class="attachment-label">鍙楁帶鏃ユ湡锛�</span><span>{{ selectedAttachment.fdate }}</span></div>
-					<div class="attachment-detail-row"><span class="attachment-label">涓婁紶浜猴細</span><span>{{ selectedAttachment.createBy }}</span></div>
-					<div class="attachment-detail-row"><span class="attachment-label">涓婁紶鏃堕棿锛�</span><span>{{ selectedAttachment.createDate }}</span></div>
-					<div class="attachment-actions-detail">
-						<button class="attachment-action-btn preview-btn" 
-							@click="previewFtpFile(selectedAttachment)" 
-							v-if="isPreviewable(selectedAttachment.fattach)">
-							馃攳 鍦ㄧ嚎棰勮
-						</button>
-						<button class="attachment-action-btn download-btn" 
-							@click="downloadAttachment(selectedAttachment)">
-							馃摜 涓嬭浇鏂囦欢
-						</button>
+				<div class="attachment-popup-header">
+					<h3 class="attachment-popup-title">闄勪欢璇︽儏</h3>
+					<button class="attachment-close-btn" @click="closeAttachmentDetail">杩斿洖</button>
+				</div>
+				
+				<div class="attachment-popup-content">
+					<div v-if="selectedAttachment" class="attachment-detail-content">
+						<div class="attachment-detail-header">
+							<div class="file-type-badge large" :class="getFileTypeClass(selectedAttachment.fattach)">
+								{{ getFileTypeIcon(selectedAttachment.fattach) }}
+							</div>
+							<div class="attachment-detail-title">
+								{{ selectedAttachment.fattach }}
+							</div>
+						</div>
+						
+						<div class="attachment-detail-info">
+							<div class="info-row">
+								<div class="info-item">
+									<text class="info-label">ID</text>
+									<text class="info-content">{{ Math.trunc(selectedAttachment.id) }}</text>
+								</div>
+								<div class="info-item">
+									<text class="info-label">绫诲瀷</text>
+									<text class="info-content">{{ selectedAttachment.ftype || '鏈煡绫诲瀷' }}</text>
+								</div>
+							</div>
+							
+							<div class="info-row" v-if="selectedAttachment.fversion">
+								<div class="info-item">
+									<text class="info-label">鐗堟湰</text>
+									<text class="info-content">{{ selectedAttachment.fversion }}</text>
+								</div>
+								<div class="info-item" v-if="selectedAttachment.fdate">
+									<text class="info-label">鍙楁帶鏃ユ湡</text>
+									<text class="info-content">{{ formatDate(selectedAttachment.fdate) }}</text>
+								</div>
+							</div>
+							
+							<div class="info-row" v-if="selectedAttachment.createBy">
+								<div class="info-item">
+									<text class="info-label">涓婁紶浜�</text>
+									<text class="info-content">{{ selectedAttachment.createBy }}</text>
+								</div>
+								<div class="info-item" v-if="selectedAttachment.createDate">
+									<text class="info-label">涓婁紶鏃堕棿</text>
+									<text class="info-content">{{ formatDate(selectedAttachment.createDate) }}</text>
+								</div>
+							</div>
+						</div>
+						
+						<div class="attachment-detail-actions">
+							<button v-if="isPreviewable(selectedAttachment.fattach)" 
+								class="btn-primary" 
+								@click="previewFtpFile(selectedAttachment)">棰勮</button>
+							<button class="btn-success" @click="downloadAttachment(selectedAttachment)">涓嬭浇</button>
+						</div>
+					</div>
+					<div v-else class="attachment-detail-empty">
+						<div class="empty-icon">鉂�</div>
+						<div class="empty-text">鏆傛棤闄勪欢淇℃伅</div>
 					</div>
 				</div>
-				<div v-else class="attachment-detail-empty">鏆傛棤闄勪欢淇℃伅</div>
-				<button class="attachment-popup-close" @click="closeAttachmentDetail">杩斿洖闄勪欢鍒楄〃</button>
 			</view>
 		</view>
 		<!-- 闄勪欢鍒楄〃寮圭獥 -->
 		<view v-if="showAttachmentPopup" class="overlay">
-			<view class="popup" style="width: 60vw; max-width: 500px;">
-				<h3>闄勪欢鍒楄〃</h3>
-				<div v-if="attachmentsLoading">鍔犺浇涓�...</div>
-				<div v-else-if="attachments.length === 0">鏆傛棤闄勪欢</div>
-				<ul class="attachment-list" v-else>
-					<li v-for="item in attachments" :key="item.id">
-						<div class="attachment-info">
-							<span class="attachment-name" @click="showAttachmentDetailDialog(item)">
-								{{ item.fattach }}
-							</span>
-							<div class="attachment-meta">
-								<span class="attachment-type">{{ item.ftype || '鏈煡绫诲瀷' }}</span>
+			<view class="popup attachment-list-popup">
+				<div class="attachment-popup-header">
+					<h3 class="attachment-popup-title">闄勪欢鍒楄〃</h3>
+					<button class="attachment-close-btn" @click="closeAttachmentPopup">鍏抽棴</button>
+				</div>
+				
+				<div class="attachment-popup-content">
+					<div v-if="attachmentsLoading" class="attachment-loading">
+						<div class="loading-spinner"></div>
+						<span class="loading-text">姝e湪鍔犺浇闄勪欢...</span>
+					</div>
+					
+					<div v-else-if="attachments.length === 0" class="attachment-empty">
+						<div class="empty-icon">馃搧</div>
+						<div class="empty-text">鏆傛棤闄勪欢</div>
+						<div class="empty-hint">璇ョ墿鏂欐殏鏈笂浼犱换浣曢檮浠�</div>
+					</div>
+					
+					<div v-else class="attachment-list">
+						<div v-for="item in attachments" :key="item.id" class="attachment-item">
+							<div class="attachment-info">
+								<div class="file-type-badge" :class="getFileTypeClass(item.fattach)">
+									{{ getFileTypeIcon(item.fattach) }}
+								</div>
+								<div class="attachment-details">
+									<div class="attachment-name" @click="showAttachmentDetailDialog(item)">
+										{{ item.fattach }}
+									</div>
+									<div class="attachment-meta">
+										<span class="meta-type">{{ item.ftype || '鏈煡绫诲瀷' }}</span>
+										<span v-if="item.fversion" class="meta-version">v{{ item.fversion }}</span>
+										<span v-if="item.fdate" class="meta-date">{{ formatDate(item.fdate) }}</span>
+									</div>
+								</div>
+							</div>
+							
+							<div class="attachment-actions">
+								<button class="btn-secondary" @click="showAttachmentDetailDialog(item)">璇︽儏</button>
+								<button v-if="isPreviewable(item.fattach)" 
+									class="btn-primary" 
+									@click="previewFtpFile(item)">棰勮</button>
+								<button class="btn-success" @click="downloadAttachment(item)">涓嬭浇</button>
 							</div>
 						</div>
-						<div class="attachment-actions">
-							<button class="secondary-btn" @click="showAttachmentDetailDialog(item)">璇︽儏</button>
-							<button class="secondary-btn preview-btn" @click="previewFtpFile(item)" 
-								v-if="isPreviewable(item.fattach)">棰勮</button>
-							<button class="secondary-btn" @click="downloadAttachment(item)">涓嬭浇</button>
-						</div>
-					</li>
-				</ul>
-				<button class="attachment-popup-close" @click="closeAttachmentPopup">鍏抽棴</button>
+					</div>
+				</div>
 			</view>
 		</view>
 		
@@ -516,7 +578,7 @@
 				WORKSHOP: '',
 				REMARK: '',
 				// picker 閫夐」鍜岀储寮�
-				badreasonOptions: ['', '澶栬涓嶈壇', '灏哄涓嶈壇', '鍖呰涓嶈壇', '鎬ц兘涓嶈壇', '瑁呴厤涓嶈壇', '瀹夎涓嶈壇'],
+				badreasonOptions: ['', '澶栬涓嶈壇', '灏哄涓嶈壇', '鍖呰涓嶈壇', '鎬ц兘涓嶈壇', '瑁呴厤涓嶈壇', '瀹夎涓嶈壇','鍥剧焊涓嶈壇'],
 				badreasonIndex: 0,
 				workshopOptions: ['', '鐢熶骇涓�閮�', '鐢熶骇浜岄儴', '娉ㄥ杞﹂棿', '鍏朵粬'],
 				workshopIndex: 0,
@@ -771,7 +833,11 @@
 								// 缁熶竴鎺ㄩ�佺粰HMCS锛屼笉绠″摢涓处鍙�
 								this.QcIssueResultDetailes = {
 									fbatchQty: this.formData.fcovertQty,
-									itemName: this.formData.itemName,
+									itemName: (() => {
+									        const combined = `${this.formData.itemName || ''} ${this.formData.itemModel || ''}`.trim();
+									        // 鎴柇澶勭悊锛氳秴杩�1000瀛楃淇濈暀鍓�1000浣�
+									        return combined.length > 1000 ? combined.substring(0, 1000) : combined;
+									    })(),
 									itemNo: this.formData.itemNo,
 									suppName: this.formData.suppName,
 									appicationReason: this.formData.fngDesc,
@@ -2198,6 +2264,59 @@
 					'csv'            // CSV鏂囦欢
 				].includes(ext);
 			},
+			
+			// 鑾峰彇鏂囦欢绫诲瀷鍥炬爣
+			getFileTypeIcon(filename) {
+				if (!filename) return '馃搫';
+				const ext = filename.trim().split('.').pop().toLowerCase();
+				const iconMap = {
+					'pdf': '馃摃',
+					'jpg': '馃柤锔�', 'jpeg': '馃柤锔�', 'png': '馃柤锔�', 'gif': '馃柤锔�', 'bmp': '馃柤锔�', 'webp': '馃柤锔�',
+					'txt': '馃摑', 'log': '馃摑', 'md': '馃摑',
+					'doc': '馃摌', 'docx': '馃摌',
+					'xls': '馃搳', 'xlsx': '馃搳',
+					'ppt': '馃摍', 'pptx': '馃摍',
+					'csv': '馃搳',
+					'zip': '馃摝', 'rar': '馃摝', '7z': '馃摝',
+					'dwg': '馃彈锔�', 'dxf': '馃彈锔�'
+				};
+				return iconMap[ext] || '馃搫';
+			},
+			
+			// 鑾峰彇鏂囦欢绫诲瀷CSS绫�
+			getFileTypeClass(filename) {
+				if (!filename) return 'file-unknown';
+				const ext = filename.trim().split('.').pop().toLowerCase();
+				const classMap = {
+					'pdf': 'file-pdf',
+					'jpg': 'file-image', 'jpeg': 'file-image', 'png': 'file-image', 'gif': 'file-image', 'bmp': 'file-image', 'webp': 'file-image',
+					'txt': 'file-text', 'log': 'file-text', 'md': 'file-text',
+					'doc': 'file-word', 'docx': 'file-word',
+					'xls': 'file-excel', 'xlsx': 'file-excel',
+					'ppt': 'file-powerpoint', 'pptx': 'file-powerpoint',
+					'csv': 'file-excel',
+					'zip': 'file-archive', 'rar': 'file-archive', '7z': 'file-archive',
+					'dwg': 'file-cad', 'dxf': 'file-cad'
+				};
+				return classMap[ext] || 'file-unknown';
+			},
+			
+			// 鏍煎紡鍖栨棩鏈�
+			formatDate(dateString) {
+				if (!dateString) return '';
+				try {
+					const date = new Date(dateString);
+					return date.toLocaleDateString('zh-CN', {
+						year: 'numeric',
+						month: '2-digit',
+						day: '2-digit',
+						hour: '2-digit',
+						minute: '2-digit'
+					});
+				} catch (e) {
+					return dateString;
+				}
+			},
 			// 澶勭悊闄勪欢涓嬭浇閿欒
 			handleAttachmentError(item) {
 				uni.showModal({
@@ -3240,7 +3359,7 @@
 	}
 
 	/* 寮圭獥鏁翠綋缇庡寲 */
-	.popup, .attachment-detail-popup {
+	.popup {
 		background: #fff;
 		border-radius: 16px;
 		box-shadow: 0 8px 32px rgba(60,60,60,0.18);
@@ -3252,123 +3371,9 @@
 		max-height: 80vh; /* 闄愬埗鏈�澶ч珮搴︼紝閬垮厤琚簳閮ㄦ寜閽伄鎸� */
 		overflow-y: auto; /* 鍐呭杩囧鏃跺彲婊氬姩 */
 	}
-	.attachment-popup-title {
-		font-size: 22px;
-		font-weight: 700;
-		color: #222;
-		margin-bottom: 8px;
-		letter-spacing: 1px;
-		text-align: center;
-	}
-	.attachment-popup-divider {
-		height: 1px;
-		background: linear-gradient(90deg,#e0e7ef 0%,#f5f7fa 100%);
-		margin-bottom: 18px;
-	}
+	
 	.attachment-detail-content {
 		margin-bottom: 18px;
-	}
-	.attachment-detail-row {
-		display: flex;
-		align-items: center;
-		margin-bottom: 8px;
-		font-size: 15px;
-	}
-	.attachment-label {
-		min-width: 80px;
-		color: #1976d2;
-		font-weight: 500;
-		margin-right: 8px;
-	}
-	.attachment-preview-area {
-		margin: 18px 0 8px 0;
-		border-radius: 10px;
-		background: #f8fafc;
-		padding: 10px;
-		box-shadow: 0 2px 8px rgba(60,60,60,0.06);
-	}
-	.attachment-download-area {
-		margin: 18px 0 8px 0;
-		text-align: center;
-	}
-	.attachment-download-link {
-		display: inline-block;
-		padding: 7px 18px;
-		background: linear-gradient(90deg,#4f8cff 0%,#1976d2 100%);
-		color: #fff;
-		border-radius: 6px;
-		font-weight: 500;
-		text-decoration: none;
-		transition: background 0.2s;
-		box-shadow: 0 2px 8px rgba(60,60,60,0.08);
-	}
-	.attachment-download-link:hover {
-		background: linear-gradient(90deg,#1976d2 0%,#4f8cff 100%);
-	}
-	.attachment-detail-empty {
-		color: #888;
-		text-align: center;
-		margin: 30px 0;
-		font-size: 16px;
-	}
-	.attachment-popup-close {
-		margin-top: 18px;
-		width: 100%;
-		background: linear-gradient(90deg,#e0e0e0 0%,#f5f7fa 100%);
-		color: #444;
-		border-radius: 8px;
-		font-size: 16px;
-		padding: 10px 0;
-		border: none;
-		font-weight: 600;
-		letter-spacing: 1px;
-		transition: background 0.2s, color 0.2s;
-		box-shadow: 0 2px 8px rgba(60,60,60,0.06);
-	}
-	.attachment-popup-close:hover {
-		background: linear-gradient(90deg,#bdbdbd 0%,#e0e0e0 100%);
-		color: #1976d2;
-	}
-	
-	/* 闄勪欢璇︽儏椤甸潰鐨勬搷浣滄寜閽� */
-	.attachment-actions-detail {
-		margin: 20px 0;
-		display: flex;
-		gap: 12px;
-		justify-content: center;
-		flex-wrap: wrap;
-	}
-	.attachment-action-btn {
-		padding: 10px 20px;
-		border: none;
-		border-radius: 8px;
-		font-size: 14px;
-		font-weight: 600;
-		cursor: pointer;
-		transition: all 0.3s ease;
-		display: flex;
-		align-items: center;
-		justify-content: center;
-		min-width: 120px;
-		box-shadow: 0 2px 4px rgba(0,0,0,0.1);
-	}
-	.attachment-action-btn.preview-btn {
-		background: linear-gradient(135deg, #4CAF50, #45a049);
-		color: white;
-	}
-	.attachment-action-btn.preview-btn:hover {
-		background: linear-gradient(135deg, #45a049, #3d8b40);
-		transform: translateY(-1px);
-		box-shadow: 0 4px 8px rgba(0,0,0,0.15);
-	}
-	.attachment-action-btn.download-btn {
-		background: linear-gradient(135deg, #2196F3, #1976D2);
-		color: white;
-	}
-	.attachment-action-btn.download-btn:hover {
-		background: linear-gradient(135deg, #1976D2, #1565C0);
-		transform: translateY(-1px);
-		box-shadow: 0 4px 8px rgba(0,0,0,0.15);
 	}
 	
 	/* 鏂囦欢棰勮寮圭獥鏍峰紡 */
@@ -3487,84 +3492,321 @@
 		background: linear-gradient(135deg, #bdbdbd, #9e9e9e);
 		transform: translateY(-1px);
 	}
-	/* 鍒楄〃寮圭獥缇庡寲锛堜繚鐣欏師鏈夛級 */
-	.attachment-list {
-		padding: 0;
+	/* 闄勪欢鐩稿叧鏍峰紡 */
+	.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;
+		display: flex;
+		justify-content: space-between;
+		align-items: center;
+		background-color: white;
+	}
+	
+	.attachment-popup-title {
+		font-size: 16px;
+		font-weight: 600;
+		color: #2c3e50;
 		margin: 0;
-		list-style: none;
-		max-height: 300px;
+	}
+	
+	.attachment-close-btn {
+		padding: 8px 16px;
+		border: 1px solid #ddd;
+		border-radius: 4px;
+		background-color: white;
+		font-size: 14px;
+		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-list li {
+	
+	/* 鍔犺浇鐘舵�� */
+	.attachment-loading {
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+		justify-content: center;
+		padding: 40px 20px;
+		gap: 16px;
+	}
+	
+	.loading-spinner {
+		width: 32px;
+		height: 32px;
+		border: 3px solid #f3f3f3;
+		border-top: 3px solid #3498db;
+		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;
+		flex-direction: column;
+		align-items: center;
+		justify-content: center;
+		padding: 40px 20px;
+		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;
+		box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05);
+		overflow: hidden;
+		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;
 		display: flex;
 		align-items: center;
-		justify-content: space-between;
-		padding: 12px 0;
-		border-bottom: 1px solid #f0f0f0;
+		gap: 16px;
 	}
-	.attachment-info {
-		flex: 1;
-		margin-right: 10px;
-	}
-	.attachment-name {
-		color: #3498db;
-		cursor: pointer;
-		font-weight: 500;
-		transition: color 0.2s;
-		display: block;
-		margin-bottom: 4px;
-	}
-	.attachment-name:hover {
-		color: #217dbb;
-		text-decoration: underline;
-	}
-	.attachment-meta {
-		font-size: 12px;
-	}
-	.attachment-type {
-		color: #7f8c8d;
-		font-style: italic;
-	}
-	.attachment-actions {
+	
+	.file-type-badge {
+		width: 40px;
+		height: 40px;
+		border-radius: 8px;
 		display: flex;
-		gap: 8px;
+		align-items: center;
+		justify-content: center;
+		font-size: 20px;
+		background: #f8f9fa;
+		border: 2px solid #e9ecef;
 		flex-shrink: 0;
 	}
-	.attachment-list .secondary-btn {
-		padding: 4px 10px;
-		font-size: 13px;
-		border-radius: 3px;
-		background: #f5f7fa;
-		color: #333;
-		border: 1px solid #dbe2ea;
-		transition: background 0.2s, color 0.2s;
+	
+	.file-type-badge.large {
+		width: 56px;
+		height: 56px;
+		font-size: 28px;
 	}
-	.attachment-list .secondary-btn:hover {
-		background: #e6f0fa;
-		color: #1976d2;
+	
+	.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; }
+	.file-type-badge.file-word { background: #e6f0ff; border-color: #cce0ff; }
+	.file-type-badge.file-excel { background: #e6ffe6; border-color: #ccffcc; }
+	.file-type-badge.file-powerpoint { background: #fff0e6; border-color: #ffe0cc; }
+	.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;
 	}
-	.preview-btn {
-		background: #e8f5e8 !important;
-		color: #2e7d2e !important;
-		border-color: #a5d6a5 !important;
+	
+	.attachment-name {
+		font-size: 16px;
+		font-weight: 600;
+		color: #2c3e50;
+		cursor: pointer;
+		overflow: hidden;
+		text-overflow: ellipsis;
+		white-space: nowrap;
+		margin-bottom: 8px;
+		transition: color 0.2s;
 	}
-	.preview-btn:hover {
-		background: #d4eecc !important;
-		color: #1e5f1e !important;
+	
+	.attachment-name:hover {
+		color: #3498db;
 	}
-	.attachment-popup-close {
-		margin-top: 18px;
-		width: 100%;
-		background: #e0e0e0;
-		color: #444;
+	
+	.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;
+		display: flex;
+		gap: 8px;
+		background-color: #f8f9fa;
+	}
+	
+	/* 鎸夐挳鏍峰紡 */
+	.btn-secondary {
+		padding: 8px 16px;
+		border: 1px solid #ddd;
 		border-radius: 4px;
-		font-size: 15px;
-		padding: 8px 0;
-		border: none;
-		transition: background 0.2s;
+		background-color: white;
+		font-size: 14px;
+		transition: all 0.2s;
+		color: #2c3e50;
+		flex: 1;
 	}
-	.attachment-popup-close:hover {
-		background: #bdbdbd;
+	
+	.btn-secondary:hover {
+		background-color: #f8f9fa;
+	}
+	
+	.btn-primary {
+		padding: 8px 16px;
+		border: 1px solid #3498db;
+		border-radius: 4px;
+		background-color: #3498db;
+		color: white;
+		font-size: 14px;
+		transition: all 0.2s;
+		flex: 1;
+	}
+	
+	.btn-primary:hover {
+		background-color: #2980b9;
+	}
+	
+	.btn-success {
+		padding: 8px 16px;
+		border: 1px solid #2ecc71;
+		border-radius: 4px;
+		background-color: #2ecc71;
+		color: white;
+		font-size: 14px;
+		transition: all 0.2s;
+		flex: 1;
+	}
+	
+	.btn-success:hover {
+		background-color: #27ae60;
+	}
+	
+	/* 闄勪欢璇︽儏鏍峰紡 */
+	.attachment-detail-header {
+		display: flex;
+		align-items: center;
+		gap: 20px;
+		margin-bottom: 20px;
+		padding-bottom: 16px;
+		border-bottom: 1px solid #eee;
+	}
+	
+	.attachment-detail-title {
+		font-size: 18px;
+		font-weight: 600;
+		color: #2c3e50;
+		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;
+		display: flex;
+		gap: 8px;
+		background-color: #f8f9fa;
 	}
 
 	/* 鍝嶅簲寮忚璁� */
diff --git a/pages/QC/LLJ/detail.vue b/pages/QC/LLJ/detail.vue
index ff6929c..17bc7ae 100644
--- a/pages/QC/LLJ/detail.vue
+++ b/pages/QC/LLJ/detail.vue
@@ -75,11 +75,19 @@
                     <text class="spec-text">{{ formData.fspecRequ }}</text>
                 </view>
             </view>
-            <!-- 瑙勬牸瑕佹眰 -->
+            <!-- 妫�楠屾弿杩� -->
             <view class="section">
                 <view class="section-header">妫�楠屾弿杩�</view>
                 <view class="section-body">
                     <text class="spec-text">{{ formData.fcheckItemDesc }}</text>
+                    
+                    <!-- 鏌ョ湅闄勪欢淇℃伅鎸夐挳 -->
+                    <view class="attachment-btn-container">
+                        <button class="btn attachment-btn" @tap="viewAttachmentInfo">
+                            <uni-icons type="folder" size="16" color="#fff"></uni-icons>
+                            鏌ョ湅闄勪欢淇℃伅
+                        </button>
+                    </view>
                 </view>
             </view>
             <!-- 妫�楠岀粨鏋� -->
@@ -139,6 +147,7 @@
                                  <uni-icons type="upload" size="16" color="#fff"></uni-icons>
                                  涓婁紶/鏌ョ湅鍥剧墖
                              </button>
+                             
                              <button v-if="this.current" class="btn upload-btn" @tap="upRemarks">
                                  <uni-icons type="compose" size="16" color="#fff"></uni-icons>
                                  涓嶈壇鎻忚堪
@@ -184,6 +193,7 @@
                                  <uni-icons type="upload" size="16" color="#fff"></uni-icons>
                                  涓婁紶/鏌ョ湅鍥剧墖
                              </button>
+                             
                              <button v-if="this.current" class="btn upload-btn" @tap="upRemarks">
                                  <uni-icons type="compose" size="16" color="#fff"></uni-icons>
                                  涓嶈壇鎻忚堪
@@ -322,7 +332,169 @@
                     </form>
                 </view>
             </view>
- 
+
+            <!-- 闄勪欢鍒楄〃寮圭獥 -->
+            <view v-if="showAttachmentPopup" class="overlay">
+                <view class="popup attachment-list-popup">
+                    <div class="attachment-popup-header">
+                        <h3 class="attachment-popup-title">闄勪欢鍒楄〃</h3>
+                        <button class="attachment-close-btn" @click="closeAttachmentPopup">鍏抽棴</button>
+                    </div>
+                    
+                    <div class="attachment-popup-content">
+                        <div v-if="attachmentsLoading" class="attachment-loading">
+                            <div class="loading-spinner"></div>
+                            <span class="loading-text">姝e湪鍔犺浇闄勪欢...</span>
+                        </div>
+                        
+                        <div v-else-if="attachments.length === 0" class="attachment-empty">
+                            <div class="empty-icon">馃搧</div>
+                            <div class="empty-text">鏆傛棤闄勪欢</div>
+                            <div class="empty-hint">璇ョ墿鏂欐殏鏈笂浼犱换浣曢檮浠�</div>
+                        </div>
+                        
+                        <div v-else class="attachment-list">
+                            <div v-for="item in attachments" :key="item.id" class="attachment-item">
+                                <div class="attachment-info">
+                                    <div class="file-type-badge" :class="getFileTypeClass(item.fattach)">
+                                        {{ getFileTypeIcon(item.fattach) }}
+                                    </div>
+                                    <div class="attachment-details">
+                                        <div class="attachment-name" @click="showAttachmentDetailDialog(item)">
+                                            {{ item.fattach }}
+                                        </div>
+                                        <div class="attachment-meta">
+                                            <span class="meta-type">{{ item.ftype || '鏈煡绫诲瀷' }}</span>
+                                            <span v-if="item.fversion" class="meta-version">v{{ item.fversion }}</span>
+                                            <span v-if="item.fdate" class="meta-date">{{ formatDate(item.fdate) }}</span>
+                                        </div>
+                                    </div>
+                                </div>
+                                
+                                <div class="attachment-actions">
+                                    <button class="btn-secondary" @click="showAttachmentDetailDialog(item)">璇︽儏</button>
+                                    <button v-if="isPreviewable(item.fattach)" 
+                                        class="btn-primary" 
+                                        @click="previewFtpFile(item)">棰勮</button>
+                                    <button class="btn-success" @click="downloadAttachment(item)">涓嬭浇</button>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </view>
+            </view>
+
+            <!-- 闄勪欢璇︽儏寮圭獥 -->
+            <view v-if="showAttachmentDetail" class="overlay">
+                <view class="popup attachment-detail-popup">
+                    <div class="attachment-popup-header">
+                        <h3 class="attachment-popup-title">闄勪欢璇︽儏</h3>
+                        <button class="attachment-close-btn" @click="closeAttachmentDetail">杩斿洖</button>
+                    </div>
+                    
+                    <div class="attachment-popup-content">
+                        <div v-if="selectedAttachment" class="attachment-detail-content">
+                            <div class="attachment-detail-header">
+                                <div class="file-type-badge large" :class="getFileTypeClass(selectedAttachment.fattach)">
+                                    {{ getFileTypeIcon(selectedAttachment.fattach) }}
+                                </div>
+                                <div class="attachment-detail-title">
+                                    {{ selectedAttachment.fattach }}
+                                </div>
+                            </div>
+                            
+                            <div class="attachment-detail-info">
+                                <div class="info-row">
+                                    <div class="info-item">
+                                        <text class="info-label">ID</text>
+                                        <text class="info-content">{{ Math.trunc(selectedAttachment.id) }}</text>
+                                    </div>
+                                    <div class="info-item">
+                                        <text class="info-label">绫诲瀷</text>
+                                        <text class="info-content">{{ selectedAttachment.ftype || '鏈煡绫诲瀷' }}</text>
+                                    </div>
+                                </div>
+                                
+                                <div class="info-row" v-if="selectedAttachment.fversion">
+                                    <div class="info-item">
+                                        <text class="info-label">鐗堟湰</text>
+                                        <text class="info-content">{{ selectedAttachment.fversion }}</text>
+                                    </div>
+                                    <div class="info-item" v-if="selectedAttachment.fdate">
+                                        <text class="info-label">鍙楁帶鏃ユ湡</text>
+                                        <text class="info-content">{{ formatDate(selectedAttachment.fdate) }}</text>
+                                    </div>
+                                </div>
+                                
+                                <div class="info-row" v-if="selectedAttachment.createBy">
+                                    <div class="info-item">
+                                        <text class="info-label">涓婁紶浜�</text>
+                                        <text class="info-content">{{ selectedAttachment.createBy }}</text>
+                                    </div>
+                                    <div class="info-item" v-if="selectedAttachment.createDate">
+                                        <text class="info-label">涓婁紶鏃堕棿</text>
+                                        <text class="info-content">{{ formatDate(selectedAttachment.createDate) }}</text>
+                                    </div>
+                                </div>
+                            </div>
+                            
+                            <div class="attachment-detail-actions">
+                                <button v-if="isPreviewable(selectedAttachment.fattach)" 
+                                    class="btn-primary" 
+                                    @click="previewFtpFile(selectedAttachment)">棰勮</button>
+                                <button class="btn-success" @click="downloadAttachment(selectedAttachment)">涓嬭浇</button>
+                            </div>
+                        </div>
+                        <div v-else class="attachment-detail-empty">
+                            <div class="empty-icon">鉂�</div>
+                            <div class="empty-text">鏆傛棤闄勪欢淇℃伅</div>
+                        </div>
+                    </div>
+                </view>
+            </view>
+
+            <!-- 鏂囦欢棰勮寮圭獥 -->
+            <view v-if="showFilePreviewPopup" class="overlay">
+                <view class="popup file-preview-popup">
+                    <h3 class="file-preview-title">{{ previewTitle }}</h3>
+                    <div class="file-preview-divider"></div>
+                    <div class="file-preview-content">
+                        <!-- 鏂囨湰鍐呭棰勮 -->
+                        <pre v-if="previewType === 'text'">{{ previewContent }}</pre>
+                        
+                        <!-- 鍥剧墖鍐呭棰勮 -->
+                        <view v-else-if="previewType === 'image'" class="image-preview-container">
+                            <image 
+                                :src="previewContent" 
+                                mode="aspectFit" 
+                                class="preview-image-clickable"
+                                @click="previewImageInPopup"
+                                style="width: 100%; max-height: 400px; cursor: pointer;"
+                            />
+                            <div class="image-zoom-hint">鐐瑰嚮鍥剧墖鍙斁澶ф煡鐪�</div>
+                        </view>
+                        
+                        <!-- Excel 绛� Office 鏂囦欢鎻愮ず -->
+                        <view v-else-if="previewType === 'excel'" class="unsupported-preview">
+                            <view class="unsupported-icon">馃搳</view>
+                            <view class="unsupported-text">Excel 鏂囦欢鏆備笉鏀寔鍦ㄧ嚎棰勮</view>
+                            <view class="unsupported-hint">璇风偣鍑讳笅杞芥寜閽幏鍙栧畬鏁存枃浠�</view>
+                        </view>
+                        
+                        <!-- 涓嶆敮鎸佺殑鏂囦欢绫诲瀷 -->
+                        <view v-else class="unsupported-preview">
+                            <view class="unsupported-icon">馃搫</view>
+                            <view class="unsupported-text">姝ゆ枃浠舵牸寮忔殏涓嶆敮鎸侀瑙�</view>
+                            <view class="unsupported-hint">璇风偣鍑讳笅杞芥寜閽幏鍙栧畬鏁存枃浠�</view>
+                        </view>
+                    </div>
+                    <div class="file-preview-actions">
+                        <button v-if="previewType !== 'text'" class="file-preview-btn download-btn" @click="downloadPreviewFile">馃摜 涓嬭浇鏂囦欢</button>
+                        <button class="file-preview-btn close-btn" @click="closeFilePreview">鍏抽棴</button>
+                    </div>
+                </view>
+            </view>
+
         </view>
     </view>
 </template>
@@ -357,6 +529,17 @@
                 showMeom:false,
                 meom: '',
                 isFocus: false, // 鏂板锛屾帶鍒惰緭鍏ユ鑱氱劍
+                // ===== 闄勪欢鐩稿叧鏁版嵁 =====
+                showAttachmentPopup: false,
+                showAttachmentDetail: false,
+                showFilePreviewPopup: false,
+                attachments: [],
+                attachmentsLoading: false,
+                selectedAttachment: null,
+                previewTitle: '',
+                previewContent: '',
+                previewType: '',
+                previewFileUrl: ''
             }
         },
         computed: {
@@ -664,6 +847,280 @@
                     url: 'ImageItem?id=' + this.formData.id
                 });
             },
+            
+            // ===== 闄勪欢鐩稿叧鏂规硶 =====
+            viewAttachmentInfo() {
+                this.showAttachmentPopup = true;
+                this.attachmentsLoading = true;
+                this.attachments = [];
+                
+                // fversion 鐨勫�兼槸褰撳墠妫�楠岄」鐩悕绉�
+                // 浣跨敤褰撳墠婵�娲绘爣绛剧殑 fcheckItem锛歵abs[currentTab].fcheckItem
+                const currentTabData = this.tabs[this.currentTab];
+                const fversion = currentTabData && currentTabData.fcheckItem ? currentTabData.fcheckItem : '';
+                
+                console.log("========================================");
+                console.log("璋冪敤闄勪欢鎺ュ彛:");
+                console.log("妫�楠屽崟鍙� releaseNo:", this.releaseNo);
+                console.log("褰撳墠鏍囩绱㈠紩 currentTab:", this.currentTab);
+                console.log("褰撳墠鏍囩鏁版嵁:", currentTabData);
+                console.log("妫�楠岄」鐩悕绉� fcheckItem:", currentTabData ? currentTabData.fcheckItem : '');
+                console.log("鐗堟湰鍙� fversion (妫�楠岄」鐩悕绉�):", fversion);
+                console.log("========================================");
+                
+                // 鍏堥�氳繃 releaseNo 鑾峰彇鐗╂枡缂栫爜
+                this.$post({
+                    url: "/LLJ/getPage",
+                    data: {
+                        PageIndex: 1,
+                        Limit: 1,
+                        selectedIndex: 5,  // 5琛ㄧず鎸夋楠屽崟鍙锋悳绱�
+                        SearchValue: this.releaseNo,
+                        createUser: this.$loginInfo.account,
+                        UserIndex: this.$loginInfo.userIndex || "0"
+                    }
+                }).then(res => {
+                    let tbBillListElement = res.data.tbBillList[0];
+                    if (tbBillListElement && tbBillListElement.itemNo) {
+                        const itemNo = tbBillListElement.itemNo;
+                        console.log("鑾峰彇鍒扮殑鐗╂枡缂栫爜:", itemNo);
+                        console.log("鏈�缁堣皟鐢� getAttachments 鍙傛暟:", { itemNo, fversion, fromPage: 'Detail' });
+                        
+                        // 璋冪敤闄勪欢鎺ュ彛
+                        return this.$post({
+                            url: "/LLJ/getAttachments",
+                            data: { 
+                                itemNo: itemNo,
+                                fversion: fversion,  // 浣跨敤妫�楠岄」鐩甀D浣滀负鐗堟湰鍙�
+                                fromPage: 'Detail'
+                            }
+                        });
+                    } else {
+                        throw new Error("鏈壘鍒扮墿鏂欑紪鐮佷俊鎭�");
+                    }
+                }).then(res => {
+                    this.attachmentsLoading = false;
+                    if (res.status === 0) {
+                        this.attachments = res.data.tbBillList;
+                        // 涓烘瘡涓檮浠惰缃粯璁ゅ彲鐢ㄧ姸鎬�
+                        this.attachments.forEach((item, index) => {
+                            this.$set(item, 'ftpAvailable', true);
+                            this.$set(item, 'checking', false);
+                        });
+                    } else if (res.status === 1 && res.message === "璇ユ楠屽崟鏈笂浼犻檮浠朵俊鎭紒") {
+                        uni.showToast({ title: res.message, icon: "none" });
+                    } else {
+                        uni.showToast({ title: "鑾峰彇闄勪欢澶辫触", icon: "none" });
+                    }
+                }).catch(err => {
+                    this.attachmentsLoading = false;
+                    console.error("鑾峰彇闄勪欢澶辫触:", err);
+                    uni.showToast({ title: "鑾峰彇闄勪欢澶辫触锛岃閲嶈瘯", icon: "none" });
+                });
+            },
+            
+            closeAttachmentPopup() {
+                this.showAttachmentPopup = false;
+            },
+            
+            showAttachmentDetailDialog(item) {
+                this.selectedAttachment = item;
+                this.showAttachmentPopup = false;
+                this.showAttachmentDetail = true;
+            },
+            
+            closeAttachmentDetail() {
+                this.showAttachmentDetail = false;
+                this.selectedAttachment = null;
+                this.showAttachmentPopup = true;
+            },
+            
+            isPreviewable(filename) {
+                if (!filename) return false;
+                const ext = filename.trim().split('.').pop().toLowerCase();
+                return [
+                    'pdf',
+                    'jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp',
+                    'txt', 'log', 'md',
+                    'doc', 'docx',
+                    'xls', 'xlsx',
+                    'ppt', 'pptx',
+                    'csv'
+                ].includes(ext);
+            },
+            
+            // 鑾峰彇鏂囦欢绫诲瀷鍥炬爣
+            getFileTypeIcon(filename) {
+                if (!filename) return '馃搫';
+                const ext = filename.trim().split('.').pop().toLowerCase();
+                const iconMap = {
+                    'pdf': '馃摃',
+                    'jpg': '馃柤锔�', 'jpeg': '馃柤锔�', 'png': '馃柤锔�', 'gif': '馃柤锔�', 'bmp': '馃柤锔�', 'webp': '馃柤锔�',
+                    'txt': '馃摑', 'log': '馃摑', 'md': '馃摑',
+                    'doc': '馃摌', 'docx': '馃摌',
+                    'xls': '馃搳', 'xlsx': '馃搳',
+                    'ppt': '馃摍', 'pptx': '馃摍',
+                    'csv': '馃搳',
+                    'zip': '馃摝', 'rar': '馃摝', '7z': '馃摝',
+                    'dwg': '馃彈锔�', 'dxf': '馃彈锔�'
+                };
+                return iconMap[ext] || '馃搫';
+            },
+            
+            // 鑾峰彇鏂囦欢绫诲瀷CSS绫�
+            getFileTypeClass(filename) {
+                if (!filename) return 'file-unknown';
+                const ext = filename.trim().split('.').pop().toLowerCase();
+                const classMap = {
+                    'pdf': 'file-pdf',
+                    'jpg': 'file-image', 'jpeg': 'file-image', 'png': 'file-image', 'gif': 'file-image', 'bmp': 'file-image', 'webp': 'file-image',
+                    'txt': 'file-text', 'log': 'file-text', 'md': 'file-text',
+                    'doc': 'file-word', 'docx': 'file-word',
+                    'xls': 'file-excel', 'xlsx': 'file-excel',
+                    'ppt': 'file-powerpoint', 'pptx': 'file-powerpoint',
+                    'csv': 'file-excel',
+                    'zip': 'file-archive', 'rar': 'file-archive', '7z': 'file-archive',
+                    'dwg': 'file-cad', 'dxf': 'file-cad'
+                };
+                return classMap[ext] || 'file-unknown';
+            },
+            
+            // 鏍煎紡鍖栨棩鏈�
+            formatDate(dateString) {
+                if (!dateString) return '';
+                try {
+                    const date = new Date(dateString);
+                    return date.toLocaleDateString('zh-CN', {
+                        year: 'numeric',
+                        month: '2-digit',
+                        day: '2-digit',
+                        hour: '2-digit',
+                        minute: '2-digit'
+                    });
+                } catch (e) {
+                    return dateString;
+                }
+            },
+            
+            downloadAttachment(item) {
+                const fileName = item.fattach.replace(/[\s\u3000\r\n]+/g, '').trim();
+                const downloadUrl = this.$store.state.serverInfo.serverAPI + "/LLJ/DownloadFtpFile?itemNo=" + 
+                    encodeURIComponent(item.itemNo) + "&fileName=" + encodeURIComponent(fileName) + 
+                    "&ftpServer=" + encodeURIComponent(this.$store.state.serverInfo.ftpServer) +
+                    "&fversion=" + encodeURIComponent(item.fversion || '');
+                
+                uni.downloadFile({
+                    url: downloadUrl,
+                    success: (res) => {
+                        if (res.statusCode === 200) {
+                            uni.showToast({ title: '涓嬭浇鎴愬姛', icon: 'success' });
+                        } else {
+                            uni.showToast({ title: '涓嬭浇澶辫触', icon: 'none' });
+                        }
+                    },
+                    fail: (err) => {
+                        console.error('涓嬭浇澶辫触锛�', err);
+                        uni.showToast({ title: '涓嬭浇澶辫触锛岃閲嶈瘯', icon: 'none' });
+                    }
+                });
+            },
+            
+            previewFtpFile(item) {
+                const fileName = item.fattach.replace(/[\s\u3000\r\n]+/g, '').trim();
+                const fileExt = fileName.split('.').pop().toLowerCase();
+                
+                if (!this.isPreviewable(fileName)) {
+                    uni.showModal({
+                        title: '涓嶆敮鎸侀瑙�',
+                        content: '璇ユ枃浠剁被鍨嬩笉鏀寔鍦ㄧ嚎棰勮锛岃涓嬭浇鍚庢煡鐪�',
+                        showCancel: false
+                    });
+                    return;
+                }
+                
+                const previewUrl = this.$store.state.serverInfo.serverAPI + "/LLJ/PreviewFtpFile?itemNo=" + 
+                    encodeURIComponent(item.itemNo) + "&fileName=" + encodeURIComponent(fileName) + 
+                    "&ftpServer=" + encodeURIComponent(this.$store.state.serverInfo.ftpServer) +
+                    "&fversion=" + encodeURIComponent(item.fversion || '');
+                
+                if (['pdf'].includes(fileExt)) {
+                    this.previewPdfFile(previewUrl, fileName);
+                } else if (['jpg', 'jpeg', 'png', 'gif', 'bmp'].includes(fileExt)) {
+                    this.previewImageFile(previewUrl, fileName);
+                } else if (['txt'].includes(fileExt)) {
+                    this.previewTextFile(previewUrl, fileName);
+                } else {
+                    this.previewOfficeFile(previewUrl, fileName);
+                }
+            },
+            
+            previewPdfFile(url, fileName) {
+                this.previewTitle = fileName;
+                this.previewContent = url;
+                this.previewType = 'pdf';
+                this.previewFileUrl = url;
+                this.showFilePreviewPopup = true;
+                this.showAttachmentDetail = false;
+            },
+            
+            previewImageFile(url, fileName) {
+                this.previewTitle = fileName;
+                this.previewContent = url;
+                this.previewType = 'image';
+                this.previewFileUrl = url;
+                this.showFilePreviewPopup = true;
+                this.showAttachmentDetail = false;
+            },
+            
+            previewTextFile(url, fileName) {
+                this.previewTitle = fileName;
+                this.previewType = 'text';
+                this.previewFileUrl = url;
+                this.showFilePreviewPopup = true;
+                this.showAttachmentDetail = false;
+                
+                uni.request({
+                    url: url,
+                    method: 'GET',
+                    success: (res) => {
+                        this.previewContent = res.data;
+                    },
+                    fail: (err) => {
+                        this.previewContent = '棰勮澶辫触锛岃涓嬭浇鍚庢煡鐪�';
+                    }
+                });
+            },
+            
+            previewOfficeFile(url, fileName) {
+                this.previewTitle = fileName;
+                this.previewContent = '';
+                this.previewType = 'excel';
+                this.previewFileUrl = url;
+                this.showFilePreviewPopup = true;
+                this.showAttachmentDetail = false;
+            },
+            
+            closeFilePreview() {
+                this.showFilePreviewPopup = false;
+                this.showAttachmentDetail = true;
+            },
+            
+            downloadPreviewFile() {
+                if (this.previewFileUrl && this.selectedAttachment) {
+                    this.downloadAttachment(this.selectedAttachment);
+                }
+            },
+            
+            previewImageInPopup() {
+                // 鍦ㄦ柊绐楀彛涓墦寮�鍥剧墖杩涜鏀惧ぇ鏌ョ湅
+                if (this.previewContent) {
+                    uni.previewImage({
+                        urls: [this.previewContent],
+                        current: this.previewContent
+                    });
+                }
+            },
+            
             upRemarks() {
                 this.remarksPopup = true;
             },
@@ -1311,4 +1768,434 @@
         font-weight: bold;
         font-size: 12px;
     }
+
+    /* 闄勪欢鎸夐挳鏍峰紡 */
+    .attachment-btn-container {
+        margin-top: 16px;
+        display: flex;
+        justify-content: flex-start;
+    }
+    
+    .attachment-btn {
+        background-color: #17a2b8;
+        color: #fff;
+        padding: 10px 20px;
+        margin: 0;
+        display: flex;
+        align-items: center;
+        gap: 8px;
+        border-radius: 4px;
+        font-size: 14px;
+        transition: all 0.2s;
+    }
+    
+    .attachment-btn:hover {
+        background-color: #138496;
+        transform: translateY(-1px);
+        box-shadow: 0 2px 8px rgba(23, 162, 184, 0.3);
+    }
+
+    /* 闄勪欢鐩稿叧鏍峰紡 */
+    .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;
+        display: flex;
+        justify-content: space-between;
+        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;
+        border-radius: 4px;
+        background-color: white;
+        font-size: 14px;
+        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;
+        flex-direction: column;
+        align-items: center;
+        justify-content: center;
+        padding: 40px 20px;
+        gap: 16px;
+    }
+
+    .loading-spinner {
+        width: 32px;
+        height: 32px;
+        border: 3px solid #f3f3f3;
+        border-top: 3px solid #3498db;
+        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;
+        flex-direction: column;
+        align-items: center;
+        justify-content: center;
+        padding: 40px 20px;
+        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;
+        box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05);
+        overflow: hidden;
+        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;
+        display: flex;
+        align-items: center;
+        gap: 16px;
+    }
+
+    .file-type-badge {
+        width: 40px;
+        height: 40px;
+        border-radius: 8px;
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        font-size: 20px;
+        background: #f8f9fa;
+        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; }
+    .file-type-badge.file-word { background: #e6f0ff; border-color: #cce0ff; }
+    .file-type-badge.file-excel { background: #e6ffe6; border-color: #ccffcc; }
+    .file-type-badge.file-powerpoint { background: #fff0e6; border-color: #ffe0cc; }
+    .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;
+        color: #2c3e50;
+        cursor: pointer;
+        overflow: hidden;
+        text-overflow: ellipsis;
+        white-space: nowrap;
+        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;
+        display: flex;
+        gap: 8px;
+        background-color: #f8f9fa;
+    }
+
+    /* 鎸夐挳鏍峰紡 */
+    .btn-secondary {
+        padding: 8px 16px;
+        border: 1px solid #ddd;
+        border-radius: 4px;
+        background-color: white;
+        font-size: 14px;
+        transition: all 0.2s;
+        color: #2c3e50;
+        flex: 1;
+    }
+
+    .btn-secondary:hover {
+        background-color: #f8f9fa;
+    }
+
+    .btn-primary {
+        padding: 8px 16px;
+        border: 1px solid #3498db;
+        border-radius: 4px;
+        background-color: #3498db;
+        color: white;
+        font-size: 14px;
+        transition: all 0.2s;
+        flex: 1;
+    }
+
+    .btn-primary:hover {
+        background-color: #2980b9;
+    }
+
+    .btn-success {
+        padding: 8px 16px;
+        border: 1px solid #2ecc71;
+        border-radius: 4px;
+        background-color: #2ecc71;
+        color: white;
+        font-size: 14px;
+        transition: all 0.2s;
+        flex: 1;
+    }
+
+    .btn-success:hover {
+        background-color: #27ae60;
+    }
+
+    /* 闄勪欢璇︽儏鏍峰紡 */
+    .attachment-detail-header {
+        display: flex;
+        align-items: center;
+        gap: 20px;
+        margin-bottom: 20px;
+        padding-bottom: 16px;
+        border-bottom: 1px solid #eee;
+    }
+
+    .attachment-detail-title {
+        font-size: 18px;
+        font-weight: 600;
+        color: #2c3e50;
+        flex: 1;
+        word-break: break-all;
+    }
+
+    .attachment-detail-info {
+        margin-bottom: 20px;
+    }
+
+    .info-row {
+        display: flex;
+        margin-bottom: 12px;
+        gap: 16px;
+    }
+
+    .info-content {
+        font-size: 14px;
+        color: #2c3e50;
+        line-height: 1.5;
+    }
+
+    .attachment-detail-actions {
+        padding: 12px 16px;
+        border-top: 1px solid #eee;
+        display: flex;
+        gap: 8px;
+        background-color: #f8f9fa;
+    }
+
+    /* 鏂囦欢棰勮寮圭獥鏍峰紡 */
+    .file-preview-popup {
+        width: 80vw;
+        max-width: 800px;
+        max-height: 80vh;
+    }
+
+    .file-preview-title {
+        padding: 20px;
+        margin: 0;
+        font-size: 16px;
+        font-weight: 600;
+        color: #2c3e50;
+        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;
+        font-family: 'Courier New', monospace;
+        font-size: 12px;
+        line-height: 1.4;
+        background: #f8f9fa;
+        padding: 15px;
+        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;
+        display: flex;
+        gap: 10px;
+        justify-content: center;
+    }
+
+    .file-preview-btn {
+        padding: 8px 16px;
+        border-radius: 4px;
+        border: none;
+        font-size: 14px;
+        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);
+    }
 </style>
\ No newline at end of file
diff --git a/pages/QC/RKJ/Add.vue b/pages/QC/RKJ/Add.vue
index 00437a2..b9edee2 100644
--- a/pages/QC/RKJ/Add.vue
+++ b/pages/QC/RKJ/Add.vue
@@ -197,13 +197,15 @@
 			<table>
 				<thead>
 					<tr>
-						<th width="20%" style="text-align: center;">妫�楠岄」鐩�</th>
+						<th width="8%" style="text-align: center;">搴忓彿</th>
+						<th width="17%" style="text-align: center;">妫�楠岄」鐩�</th>
 						<th width="50%" style="text-align: center;">妫�楠屾弿杩�</th>
 						<th width="15%" style="text-align: center;">璁板綍(鐐瑰嚮)</th>
 					</tr>
 				</thead>
 				<tbody>
 					<tr v-for="(item, index) in tableData" :key="index">
+						<td style="text-align: center;">{{ item.forder || (index + 1) }}</td>
 						<td>{{ item.projName }}</td>
 						<td>
 							<view v-if="item.result=='鍚堟牸'" class="watermark approved">
@@ -990,16 +992,10 @@
 					}
 				}).then(res1 => {
 					let tableData = res1.data.tbBillList || [];
-
-					//褰撳凡妫�楠屼釜鏁伴兘涓嶄负绌烘椂鎸夌収妫�娴嬬粨鏋勬帓搴�
+					
+					// 鎸塅ORDER搴忓彿鎺掑簭
 					tableData.sort((a, b) => {
-						if (a.result === '鏈畬鎴�' && b.result === '鍚堟牸') {
-							return -1;
-						} else if (a.result === '鍚堟牸' && b.result === '鏈畬鎴�') {
-							return 1;
-						} else {
-							return 0;
-						}
+						return (a.forder || 0) - (b.forder || 0);
 					});
 					this.tableData = tableData;
 
@@ -2625,6 +2621,7 @@
 		padding: 12px 15px;
 		border: 1px solid #ddd;
 		text-align: left;
+		vertical-align: middle;
 	}
 
 	.inspection-table th {
@@ -2678,10 +2675,11 @@
 	}
 
 	/* 璋冩暣琛ㄦ牸鍗曞厓鏍� */
-	.inspection-table td:nth-child(2) {
+	.inspection-table td:nth-child(3) {
 		position: relative;
 		overflow: hidden;
 		padding: 0;
+		min-height: 80px;
 	}
 
 	/* 琛ㄥ崟涓婃柟鎿嶄綔鎸夐挳鍖烘牱寮� */
diff --git a/pages/QC/RKJ/List.vue b/pages/QC/RKJ/List.vue
index c4d0113..3af3e1f 100644
--- a/pages/QC/RKJ/List.vue
+++ b/pages/QC/RKJ/List.vue
@@ -215,6 +215,10 @@
 
         this.isLoading = true;
 
+        // 鑾峰彇杞﹂棿鍜岀嚎浣撶瓫閫夋潯浠�
+        const departmentId = uni.getStorageSync('qc_filter_departmentId') || '';
+        const lineId = uni.getStorageSync('qc_filter_lineId') || '';
+
         //椤甸潰鍔犺浇鏃惰皟鐢ㄧ殑浜嬩欢
         this.$post({
           url: "/RKJ/getPage",
@@ -225,7 +229,9 @@
             fsubmit: fsubmit,
             SearchValue: SearchValue,
             selectedIndex: this.optionsIndex, // 鏂板锛氭悳绱㈡潯浠剁储寮�
-            searchField: this.selectedField   // 鏂板锛氭悳绱㈠瓧娈靛悕
+            searchField: this.selectedField,  // 鏂板锛氭悳绱㈠瓧娈靛悕
+            departmentId: departmentId,       // 鏂板锛氳溅闂碔D
+            lineId: lineId                     // 鏂板锛氱嚎浣揑D
           }
         }).then(res => {
           if (this.pageIndex === 1) {
diff --git a/pages/QC/SJ/Add.vue b/pages/QC/SJ/Add.vue
index 9d3607f..ae22678 100644
--- a/pages/QC/SJ/Add.vue
+++ b/pages/QC/SJ/Add.vue
@@ -78,13 +78,15 @@
 			<table v-if="tableData.length > 0">
 				<thead>
 					<tr>
-						<th width="20%" style="text-align: center;">妫�楠岄」鐩�</th>
+						<th width="8%" style="text-align: center;">搴忓彿</th>
+						<th width="17%" style="text-align: center;">妫�楠岄」鐩�</th>
 						<th width="50%" style="text-align: center;">妫�楠屾弿杩�</th>
 						<th width="15%" style="text-align: center;">璁板綍(鐐瑰嚮)</th>
 					</tr>
 				</thead>
 				<tbody>
 					<tr v-for="(item, index) in tableData" :key="index">
+						<td style="text-align: center;">{{ item.forder || (index + 1) }}</td>
 						<td>{{ item.projName }}</td>
 						<td>
 							<view v-if="item.result=='鍚堟牸'" class="watermark approved">
@@ -647,14 +649,9 @@
 							}).then(res => {
 								this.tableData = res.data.tbBillList;
 
+								// 鎸塅ORDE...
 								this.tableData.sort((a, b) => {
-									if (a.result === '鏈畬鎴�' && b.result === '鍚堟牸') {
-										return -1;
-									} else if (a.result === '鍚堟牸' && b.result === '鏈畬鎴�') {
-										return 1;
-									} else {
-										return 0;
-									}
+									return (a.forder || 0) - (b.forder || 0);
 								});
 
 								if (this.tableData.length <= 0) {
@@ -1689,6 +1686,7 @@
   border: none;
   text-align: left;
   border-bottom: 1px solid #eee;
+  vertical-align: middle;
 }
 
 .inspection-table th {
@@ -1717,10 +1715,10 @@
 }
 
 /* 妫�楠屾弿杩板垪鐗规畩鏍峰紡 */
-.inspection-table td:nth-child(2) {
+.inspection-table td:nth-child(3) {
   position: relative;
   min-height: 80px;
-  vertical-align: top;
+  vertical-align: middle;
   padding: 16px 20px;
 }
 
diff --git a/pages/QC/SJ/List.vue b/pages/QC/SJ/List.vue
index 8268a6e..a1d9b80 100644
--- a/pages/QC/SJ/List.vue
+++ b/pages/QC/SJ/List.vue
@@ -171,6 +171,10 @@
         result = "宸插畬鎴�";
       }
       
+      // 鑾峰彇杞﹂棿鍜岀嚎浣撶瓫閫夋潯浠�
+      const departmentId = uni.getStorageSync('qc_filter_departmentId') || '';
+      const lineId = uni.getStorageSync('qc_filter_lineId') || '';
+      
       // ===== 淇敼鍚庣殑API璋冪敤锛屾坊鍔犳悳绱㈠瓧娈靛弬鏁� =====
       //椤甸潰鍔犺浇鏃惰皟鐢ㄧ殑浜嬩欢
       this.$post({
@@ -182,7 +186,9 @@
           result: result,
           SearchValue: SearchValue,
           selectedIndex: this.optionsIndex, // 鏂板锛氭悳绱㈡潯浠剁储寮�
-          searchField: this.selectedField   // 鏂板锛氭悳绱㈠瓧娈靛悕
+          searchField: this.selectedField,  // 鏂板锛氭悳绱㈠瓧娈靛悕
+          departmentId: departmentId,       // 鏂板锛氳溅闂碔D
+          lineId: lineId                     // 鏂板锛氱嚎浣揑D
         }
       }).then(res => {
         this.data = res.data.tbBillList;
diff --git a/pages/QC/XJ/Add.vue b/pages/QC/XJ/Add.vue
index 76b532d..83da2ad 100644
--- a/pages/QC/XJ/Add.vue
+++ b/pages/QC/XJ/Add.vue
@@ -79,13 +79,15 @@
             <table>
               <thead>
                 <tr>
-                  <th width="20%" style="text-align: center;">妫�楠岄」鐩�</th>
+                  <th width="8%" style="text-align: center;">搴忓彿</th>
+                  <th width="17%" style="text-align: center;">妫�楠岄」鐩�</th>
                   <th width="50%" style="text-align: center;">妫�楠屾弿杩�</th>
                   <th width="15%" style="text-align: center;">璁板綍(鐐瑰嚮)</th>
                 </tr>
               </thead>
               <tbody>
                 <tr v-for="(item, index) in tableData" :key="index">
+                  <td style="text-align: center;">{{ item.forder || (index + 1) }}</td>
                   <td>{{ item.projName }}</td>
                   <td>
                     <view v-if="item.result=='鍚堟牸'" class="watermark approved">
@@ -855,16 +857,10 @@
                  pid: this.formData.id
                }
              }).then(res1 => {
-               let tableData = res1.data.tbBillList
-               //褰撳凡妫�楠屼釜鏁伴兘涓嶄负绌烘椂鎸夌収妫�娴嬬粨鏋勬帓搴�
+               let tableData = res1.data.tbBillList;
+               // 鎸塅ORDER搴忓彿鎺掑簭
                tableData.sort((a, b) => {
-                 if (a.result === '鏈畬鎴�' && b.result === '鍚堟牸') {
-                   return -1;
-                 } else if (a.result === '鍚堟牸' && b.result === '鏈畬鎴�') {
-                   return 1;
-                 } else {
-                   return 0;
-                 }
+                 return (a.forder || 0) - (b.forder || 0);
                });
                this.tableData = tableData;
                if (this.tableData.length === 0) {
@@ -1664,6 +1660,7 @@
     padding: 12px 15px;
     text-align: left;
     border: none;
+    vertical-align: middle;
   }
 
   .inspection-table tr:nth-child(even) {
@@ -1713,10 +1710,11 @@
   }
   
   /* 璋冩暣琛ㄦ牸鍗曞厓鏍� */
-  .inspection-table td:nth-child(2) {
+  .inspection-table td:nth-child(3) {
     position: relative;
     overflow: hidden;
     padding: 0;
+    min-height: 80px;
   }
   
   .record-btn {
diff --git a/pages/QC/XJ/List.vue b/pages/QC/XJ/List.vue
index 1bf9656..bf2e174 100644
--- a/pages/QC/XJ/List.vue
+++ b/pages/QC/XJ/List.vue
@@ -155,6 +155,10 @@
         result = "宸插畬鎴�";
       }
 
+      // 鑾峰彇杞﹂棿鍜岀嚎浣撶瓫閫夋潯浠�
+      const departmentId = uni.getStorageSync('qc_filter_departmentId') || '';
+      const lineId = uni.getStorageSync('qc_filter_lineId') || '';
+
       //椤甸潰鍔犺浇鏃惰皟鐢ㄧ殑浜嬩欢
       this.$post({
         url: "/XJ/getPage",
@@ -165,7 +169,9 @@
           result: result,
           SearchValue: SearchValue,
           selectedIndex: this.optionsIndex, // 鏂板锛氭悳绱㈡潯浠剁储寮�
-          searchField: this.selectedField   // 鏂板锛氭悳绱㈠瓧娈靛悕
+          searchField: this.selectedField,  // 鏂板锛氭悳绱㈠瓧娈靛悕
+          departmentId: departmentId,       // 鏂板锛氳溅闂碔D
+          lineId: lineId                     // 鏂板锛氱嚎浣揑D
         }
       }).then(res => {
         this.data = res.data.tbBillList;
diff --git a/store/index.js b/store/index.js
index d50ed24..e459979 100644
--- a/store/index.js
+++ b/store/index.js
@@ -10,9 +10,9 @@
 			networkFlag:'鍐呯綉', 
 			serverURLInt:'http://192.168.11.251:10055',//鏈嶅姟鍣ㄤ綋妫� 10.0.1.104:10054
 			serverURL:'http://localhost:10055',//鏈湴璋冭瘯鍦板潃
-			//serverAPI:'http://localhost:5184/api',//褰撳墠姝e湪浣跨敤鐨勬湇鍔″櫒,榛樿涓哄缃�  localhost
-			//serverAPI:'http://192.168.1.22:10054/api',//鍐呯綉 
-			serverAPI:'http://36.26.21.214:10055/api',
+			serverAPI:'http://localhost:5184/api',//褰撳墠姝e湪浣跨敤鐨勬湇鍔″櫒,榛樿涓哄缃�  localhost
+			//serverAPI:'http://192.168.1.22:10055/api',//鍐呯綉 
+			//serverAPI:'http://36.26.21.214:10055/api',
 			ftpServer:'ftp://36.26.21.214',//FTP鏈嶅姟鍣ㄥ湴鍧�
 		}
 	},

--
Gitblit v1.9.3