From bfffb0306f8e37ea39624499c55306837bf23ecf Mon Sep 17 00:00:00 2001 From: xwt <2740516069@qq.com> Date: 星期四, 21 八月 2025 17:55:42 +0800 Subject: [PATCH] 优化 --- pages/QC/RKJ/List.vue | 832 +++++++++++----------- pages/QC/RKJ/Add.vue | 1225 +++++++++++++++++++++++++++++++++ manifest.json | 2 pages/QC/LLJ/List.vue | 56 + store/index.js | 4 5 files changed, 1,666 insertions(+), 453 deletions(-) diff --git a/manifest.json b/manifest.json index e54fe41..29c6881 100644 --- a/manifest.json +++ b/manifest.json @@ -2,7 +2,7 @@ "name" : "GS-MES-AP", "appid" : "__UNI__F08FAE3", "description" : "", - "versionName" : "1.1.3.1", + "versionName" : "1.1.3.3", "versionCode" : 1, "transformPx" : false, /* 5+App鐗规湁鐩稿叧 */ diff --git a/pages/QC/LLJ/List.vue b/pages/QC/LLJ/List.vue index 4b8dc8f..3011dc8 100644 --- a/pages/QC/LLJ/List.vue +++ b/pages/QC/LLJ/List.vue @@ -16,7 +16,7 @@ </view> <!-- 鏂板鎼滅储妗嗗拰鎸夐挳 --> <view class="search-container"> - <input class="search-input" v-model="searchValue" :placeholder="'璇疯緭鍏�'+options[optionsIndex]" + <input class="search-input" v-model="searchValue" :placeholder="optionsIndex === 0 ? '閫夋嫨椤圭洰鏃舵樉绀哄叏閮ㄦ暟鎹�' : '璇疯緭鍏�'+options[optionsIndex]" @confirm="handleSearch" /> <button class="search-button" @click="handleSearch">鎼滅储</button> </view> @@ -42,7 +42,10 @@ <text class="badge normal" v-if="item.first == 1">棣栨鏉ユ枡</text> <text class="card-title">妫�楠屽崟鍙�: {{item.releaseNo}}</text> <view v-if="item.userName == null && item.activeTab == 0"> - <text class="status pending" :class="{ 'emergency-pending': item.lotNo1 === '绱ф�ユ斁琛岋紝璇峰嬁楠岄��!' }"> + <text class="status pending" :class="{ + 'emergency-pending': item.lotNo1 === '绱ф�ユ斁琛岋紝璇峰嬁楠岄��!', + 'unmaintained-not-emergency': isUnmaintainedAndNotEmergency(item) + }"> {{ item.lotNo1 === '绱ф�ユ斁琛岋紝璇峰嬁楠岄��!' ? '绱ф�ユ斁琛�/' + getStatusText(item) : getStatusText(item) }} </text> @@ -65,7 +68,7 @@ <view class="info-row"> <view class="info-item"> <text class="info-label">椤圭洰</text> - <text class="info-content">{{item.projectCodes}}</text> + <text class="info-content">{{item.DEPARTMENTNAME}}</text> </view> <view class="info-item" v-if="item.extendNo1!=null"> <text class="info-label">鎶�鏀圭姸鎬�</text> @@ -126,7 +129,7 @@ pageIndex: 1, limit: 20, IQCJL: 0, - options: ['椤圭洰', '鐗╂枡缂栧彿', '鐗╂枡鍚嶇О', '渚涘簲鍟�', '閲囪喘鍛�','鍒拌揣鍗曞彿','妫�楠屽崟鍙�','鐗╂枡瑙勬牸'], + options: ['椤圭洰', '鐗╂枡缂栧彿', '鐗╂枡鍚嶇О', '渚涘簲鍟�', '鍒拌揣鍗曞彿','妫�楠屽崟鍙�','鐗╂枡瑙勬牸'], searchValue: '' } @@ -139,21 +142,28 @@ //鎼滅储 onOptionsChange(e) { this.optionsIndex = e.detail.value; + // 褰撻�夋嫨椤圭洰鏃讹紝娓呯┖鎼滅储鍊� + if (this.optionsIndex === 0) { + this.searchValue = ''; + } // 鏍规嵁閫夋嫨鐨勯�夐」璁剧疆鎼滅储瀛楁 const fieldMap = { - 0: 'projectCodes', // 椤圭洰 + 0: 'DEPARTMENTNAME', // 椤圭洰 1: 'itemNo', // 鐗╂枡缂栧彿 2: 'itemName', // 鐗╂枡鍚嶇О 3: 'suppName', // 渚涘簲鍟� - 4: 'purchaser' ,// 閲囪喘鍛� - 5: 'lotNO' ,// 鍒拌揣鍗曞彿 - 6: 'releaseNO' ,// 妫�楠屽崟鍙� - 7: 'ItemModel',//鐗╂枡瑙勬牸 + 4: 'lotNo' ,// 鍒拌揣鍗曞彿 + 5: 'releaseNo' ,// 妫�楠屽崟鍙� + 6: 'itemModel',//鐗╂枡瑙勬牸 }; this.selectedField = fieldMap[this.optionsIndex]; }, //鎼滅储鎸夐挳鐐瑰嚮浜嬩欢 handleSearch() { + // 褰撻�夋嫨椤圭洰鏃讹紝娓呯┖鎼滅储鍊� + if (this.optionsIndex === 0) { + this.searchValue = ''; + } this.init(); }, init() { @@ -349,6 +359,23 @@ } // 濡傛灉鏈夋楠岄」鐩紝鏄剧ず"寰呮楠�" return '寰呮楠�'; + }, + + // 鍒ゆ柇鏄惁涓烘湭缁存姢涓旈潪绱ф�ユ斁琛� + isUnmaintainedAndNotEmergency(item) { + // 妫�鏌ユ槸鍚︿负鏈淮鎶わ紙娌℃湁妫�楠岄」鐩級 + const isUnmaintained = !item.inspectionItemCount || item.inspectionItemCount === 0; + // 妫�鏌ユ槸鍚︿负闈炵揣鎬ユ斁琛� + const isNotEmergency = item.lotNo1 !== '绱ф�ユ斁琛岋紝璇峰嬁楠岄��!'; + return isUnmaintained && isNotEmergency; + }, + + // 鍒ゆ柇鏄惁涓哄緟鍒嗛厤鐘舵�侊紙鐗╂枡娌℃湁缁存姢妫�楠屽憳鎴栬�呰鐗╂枡鏈湪V_LLJ_USER閲岋級 + isUnmaintainedItem(item) { + // 妫�鏌ョ墿鏂欐槸鍚﹀湪V_LLJ_USER瑙嗗浘涓紙鍗虫槸鍚︽湁缁存姢妫�楠屽憳锛� + // 濡傛灉item.fcode涓簄ull鎴杣ndefined锛岃鏄庤鐗╂枡鏈湪V_LLJ_USER瑙嗗浘涓� + // 鎴栬�呰鐗╂枡娌℃湁缁存姢妫�楠屽憳 + return !item.fcode || item.fcode === null || item.fcode === ''; } } } @@ -513,6 +540,11 @@ color: white; } + .badge.unmaintained { + background-color: #1e8449; + color: white; + } + .badge.emergency { background-color: #ff4d4f; color: white; @@ -663,5 +695,11 @@ background-color: #ff0000; /* 绾㈣壊鑳屾櫙 */ color: white; } + + .status.unmaintained-not-emergency { + background-color: #9c27b0; /* 绱壊鑳屾櫙 */ + color: white; + box-shadow: 0 0 8px rgba(156, 39, 176, 0.3); + } } </style> \ No newline at end of file diff --git a/pages/QC/RKJ/Add.vue b/pages/QC/RKJ/Add.vue index 9791f40..ceb1d79 100644 --- a/pages/QC/RKJ/Add.vue +++ b/pages/QC/RKJ/Add.vue @@ -50,7 +50,7 @@ <input type="number" v-model="formData.quantity" placeholder="璇疯緭鍏ラ�佹鏁伴噺" - class="form-input" + class="large-quantity-input" @input="onQuantityChange"/> </view> </view> @@ -76,6 +76,11 @@ <view class="form-row" v-if="formData.planQty"> <label class="form-label">宸ュ崟鏁伴噺锛�</label> <span class="form-value">{{formData.planQty}}</span> + </view> + + <view class="form-row" v-if="formData.rbillNo"> + <label class="form-label">閫佹鎵规锛�</label> + <span class="form-value">{{formData.rbillNo}}</span> </view> </view> </view> @@ -158,9 +163,42 @@ <view class="info-value">{{formData.billNo || formData.rBillNo}}</view> </view> + <view class="dropdown-row"> + <view class="info-label">閫佹鎵规锛�</view> + <view class="info-value">{{formData.rbillNo}}</view> + </view> + + <!-- 鏂板涓嬫媺妗嗗尯鍩� --> + <view class="dropdown-row"> + <view class="info-label">涓嶈壇鍘熷洜锛�</view> + <picker v-if="!isUpdate" :value="badreasonIndex" :range="badreasonOptions" @change="onBadreasonChange"> + <view class="picker-text" :class="{ 'selected': badreason }">{{ badreason || '璇烽�夋嫨涓嶈壇鍘熷洜' }}</view> + </picker> + <view v-else class="info-value">{{ badreason }}</view> + </view> + <view class="dropdown-row"> + <view class="info-label">鎵�灞炶溅闂达細</view> + <picker v-if="!isUpdate" :value="workshopIndex" :range="workshopOptions" @change="onWorkshopChange"> + <view class="picker-text" :class="{ 'selected': WORKSHOP }">{{ WORKSHOP || '璇烽�夋嫨鎵�灞炶溅闂�' }}</view> + </picker> + <view v-else class="info-value">{{ WORKSHOP }}</view> + </view> + <view class="dropdown-row"> + <view class="info-label">璇勫鐘舵�侊細</view> + <picker v-if="!isUpdate" :value="pstypeIndex" :range="pstypeOptions" @change="onPstypeChange"> + <view class="picker-text" :class="{ 'selected': PSTYPE }">{{ PSTYPE || '璇烽�夋嫨璇勫鐘舵��' }}</view> + </picker> + <view v-else class="info-value">{{ PSTYPE }}</view> + </view> + <view class="dropdown-row"> + <view class="info-label">涓嶈壇鎻忚堪锛�</view> + <input v-if="!isUpdate" v-model="formData.fngDesc" placeholder="璇疯緭鍏ヤ笉鑹弿杩�" class="input-field" @blur="saveFngDesc" /> + <view v-else class="info-value">{{ formData.fngDesc }}</view> + </view> + <!-- 琛ㄥ崟涓婃柟鎿嶄綔鎸夐挳鍖� --> <view class="top-action-buttons"> - <button class="action-btn" v-if="tableData.length === 0 && formData.fsubmit != 1" @click="getInspectionItems">鑾峰彇妫�楠岄」鐩�</button> + <button class="action-btn" v-if="formData.fsubmit != 1" @click="getInspectionItems">鑾峰彇妫�楠岄」鐩�</button> </view> <!-- 妫�楠岄」鐩〃鏍� --> @@ -203,8 +241,8 @@ <!-- 琛ㄥ崟涓嬫柟鎿嶄綔鎸夐挳鍖� --> <view class="bottom-action-buttons"> <button class="action-btn small" @click="toImage">涓婁紶/鏌ョ湅鍥剧墖</button> + <button class="action-btn small" @click="viewAttachmentInfo">鏌ョ湅闄勪欢淇℃伅</button> <button class="action-btn small" @click="saveRemarks" v-if="formData.fsubmit != 1">娣诲姞涓嶅悎鏍兼弿杩�</button> - <button class="action-btn small" @click="cleanResult" v-if="formData.fsubmit != 1">娓呴櫎妫�楠岀粨鏋�</button> <button class="action-btn small primary" @click="submitInspection" v-if="formData.fsubmit != 1 && tableData.length > 0">鎻愪氦妫�楠�</button> </view> @@ -220,6 +258,106 @@ </form> <button class="updateBut" @click="edit">淇敼</button> <button @click="showPopup = !showPopup">鍙栨秷</button> + </view> + </view> + + <!-- 闄勪欢璇︽儏寮圭獥 --> + <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> + </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> + </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> + </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> @@ -249,7 +387,8 @@ workShop: "", // 宸ヤ綔杞﹂棿 lineName: "", // 绾夸綋鍚嶇О quantity: "", // 閫佹鏁伴噺 - planQty: "" // 宸ュ崟璁″垝鏁伴噺 + planQty: "", // 宸ュ崟璁″垝鏁伴噺 + fngDesc: "" // 涓嶈壇鎻忚堪 }, DAA020List: [], @@ -275,6 +414,28 @@ showPopup: false, departmentList: [], // 杞﹂棿鍒楄〃 selectedDepartmentId: "", // 閫変腑鐨勮溅闂碔D + // 闄勪欢鐩稿叧鏁版嵁 + attachments: [], + showAttachmentPopup: false, + attachmentsLoading: false, + selectedAttachment: null, + showAttachmentDetail: false, + showFilePreviewPopup: false, + previewContent: '', + previewTitle: '', + previewItemNo: '', + previewType: '', // 'text', 'image', 'excel', 'unsupported' + + // 鏂板涓嬫媺妗嗙浉鍏虫暟鎹� + badreason: '', + PSTYPE: '', + WORKSHOP: '', + badreasonOptions: ['', '澶栬涓嶈壇', '灏哄涓嶈壇', '鍖呰涓嶈壇', '鎬ц兘涓嶈壇', '瑁呴厤涓嶈壇', '瀹夎涓嶈壇'], + badreasonIndex: 0, + workshopOptions: ['', '鐢熶骇涓�閮�', '鐢熶骇浜岄儴', '娉ㄥ杞﹂棿', '鍏朵粬'], + workshopIndex: 0, + pstypeOptions: ['', '鐗归噰/璁╂浣跨敤', '鎸戦��/杩斿伐浣跨敤', '閫�璐�', '寰呭垽'], + pstypeIndex: 0, }; }, onLoad(options) { @@ -451,6 +612,7 @@ this.formData.itemId = ""; // 娓呯┖鐗╂枡ID this.formData.itemModel = ""; this.formData.planQty = ""; + this.formData.rbillNo = ""; // 娓呯┖閫佹鎵规鍙� this.tableData = []; }) }, @@ -488,6 +650,7 @@ this.formData.itemId = ""; // 娓呯┖鐗╂枡ID this.formData.itemModel = ""; this.formData.planQty = ""; + this.formData.rbillNo = ""; // 娓呯┖閫佹鎵规鍙� this.tableData = []; }); } @@ -504,19 +667,21 @@ this.formData.itemNo = ""; this.formData.itemId = ""; this.formData.billNo = ""; + this.formData.rbillNo = ""; this.formData.quantity = ""; this.formData.itemModel = ""; this.tableData = []; return; } - // 鑷姩濉厖鐗╂枡淇℃伅 - this.formData.itemName = data.daa003; // 浜у搧鍚嶇О - this.formData.itemNo = data.daa002; // 浜у搧缂栫爜 - this.formData.itemId = data.itemId || ""; // 鐗╂枡ID - this.formData.billNo = data.daa001; // 宸ュ崟鍙蜂綔涓篵illNo - this.formData.itemModel = data.daa004 || ""; // 浜у搧瑙勬牸 - this.formData.planQty = data.daa008 || ""; // 宸ュ崟鏁伴噺 + // 鑷姩濉厖鐗╂枡淇℃伅 + this.formData.itemName = data.daa003; // 浜у搧鍚嶇О + this.formData.itemNo = data.daa002; // 浜у搧缂栫爜 + this.formData.itemId = data.itemId || ""; // 鐗╂枡ID + this.formData.billNo = data.daa001; // 宸ュ崟鍙蜂綔涓篵illNo + this.formData.rbillNo = "鏃犳簮鍗�"; // 閫佹鎵规鍙凤紙浣跨敤榛樿鍊硷級 + this.formData.itemModel = data.daa004 || ""; // 浜у搧瑙勬牸 + this.formData.planQty = data.daa008 || ""; // 宸ュ崟鏁伴噺 // 涓嶆竻绌洪�佹鏁伴噺锛屼繚鎸佺敤鎴峰凡杈撳叆鐨勫�� this.tableData = []; }, @@ -591,6 +756,17 @@ this.formData.itemName = data.itemName; this.formData.itemModel = data.itemModel; this.formData.daa015 = data.daa015; + + // 鍔犺浇涓嬫媺妗嗗瓧娈垫暟鎹� + this.badreason = data.blyy || ''; + this.PSTYPE = data.pszt || ''; + this.WORKSHOP = data.sscj || ''; + this.formData.fngDesc = data.fngDesc || ''; // 鍔犺浇涓嶈壇鎻忚堪 + + // 璁剧疆 picker 绱㈠紩 + this.badreasonIndex = this.badreasonOptions.indexOf(this.badreason); + this.workshopIndex = this.workshopOptions.indexOf(this.WORKSHOP); + this.pstypeIndex = this.pstypeOptions.indexOf(this.PSTYPE); // 璁剧疆鐢熶骇绾垮悕绉帮紙濡傛灉鏈塴ineNo锛� if (this.formData.lineNo && this.formData.workShop) { @@ -870,10 +1046,21 @@ return; } + // 妫�鏌ラ拤閽夋帹閫佹潯浠讹細PSZT涓哄緟鍒わ紝涓斾笉鑹師鍥犮�佷笉鑹弿杩般�佹墍灞炶溅闂翠笉涓虹┖ + const shouldPushToDingTalk = this.PSTYPE === '寰呭垽' && + this.badreason && + this.formData.fngDesc && + this.WORKSHOP; + + let confirmMessage = '纭畾瑕佹彁浜ゆ妫�楠屽崟鍚楋紵鎻愪氦鍚庡皢鏃犳硶淇敼銆�'; + if (shouldPushToDingTalk) { + confirmMessage += '\n\n婊¤冻閽夐拤鎺ㄩ�佹潯浠讹紝灏嗚嚜鍔ㄦ帹閫佸埌閽夐拤瀹℃壒娴佺▼銆�'; + } + // 纭鎻愪氦 uni.showModal({ title: '纭鎻愪氦', - content: '纭畾瑕佹彁浜ゆ妫�楠屽崟鍚楋紵鎻愪氦鍚庡皢鏃犳硶淇敼銆�', + content: confirmMessage, success: (res) => { if (res.confirm) { this.$post({ @@ -884,7 +1071,11 @@ } }).then(res => { if (res.status == 0) { - this.$showMessage("妫�楠屽崟鎻愪氦鎴愬姛锛�"); + let successMessage = "妫�楠屽崟鎻愪氦鎴愬姛锛�"; + if (shouldPushToDingTalk) { + successMessage += "\n宸叉帹閫佸埌閽夐拤瀹℃壒娴佺▼銆�"; + } + this.$showMessage(successMessage); // 鏇存柊鏈湴鐘舵�� this.formData.fsubmit = 1; // 鍒锋柊鏁版嵁 @@ -899,7 +1090,523 @@ } } }); - } + }, + viewAttachmentInfo() { + this.showAttachmentPopup = true; // 鍏堝脊绐� + this.attachmentsLoading = true; + this.attachments = []; + this.$post({ + url: "/RKJ/getAttachments", + data: { itemNo: this.formData.itemNo } + }).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" }); + } + }); + }, + downloadAttachment(item) { + // 鍘婚櫎鎵�鏈夌┖鏍笺�佸叏瑙掔┖鏍笺�佸洖杞︺�佹崲琛� + const fileName = item.fattach.replace(/[\s\u3000\r\n]+/g, '').trim(); + // 浣跨敤閰嶇疆鐨勬湇鍔″櫒鍦板潃鍜孎TP鏈嶅姟鍣ㄥ湴鍧� + const url = this.$store.state.serverInfo.serverAPI + "/RKJ/DownloadFtpFile?itemNo=" + encodeURIComponent(item.itemNo) + "&fileName=" + encodeURIComponent(fileName) + "&ftpServer=" + encodeURIComponent(this.$store.state.serverInfo.ftpServer); + + // 妫�鏌ヨ繍琛岀幆澧� + // #ifdef H5 + // H5鐜锛氫娇鐢ㄦ祻瑙堝櫒涓嬭浇 + this.downloadFileInBrowser(url, fileName); + // #endif + + // #ifdef APP-PLUS + // APP鐜锛氫娇鐢╱ni.downloadFile + this.downloadFileInApp(url, fileName); + // #endif + + // #ifdef MP + // 灏忕▼搴忕幆澧冿細浣跨敤uni.downloadFile + this.downloadFileInApp(url, fileName); + // #endif + }, + // 鍦ㄦ祻瑙堝櫒涓笅杞芥枃浠� + downloadFileInBrowser(url, fileName) { + uni.showLoading({ title: '姝e湪鍑嗗涓嬭浇...' }); + + // 鏂规硶1锛氬垱寤洪殣钘忕殑a鏍囩涓嬭浇 + try { + const link = document.createElement('a'); + link.href = url; + link.download = fileName; + link.style.display = 'none'; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + + uni.hideLoading(); + uni.showToast({ + title: '涓嬭浇宸插紑濮�', + icon: 'success', + duration: 2000 + }); + } catch (error) { + console.log('a鏍囩涓嬭浇澶辫触锛屽皾璇晈indow.open鏂瑰紡:', error); + // 鏂规硶2锛氫娇鐢╳indow.open + try { + window.open(url, '_blank'); + uni.hideLoading(); + uni.showToast({ + title: '涓嬭浇宸插紑濮�', + icon: 'success', + duration: 2000 + }); + } catch (error2) { + console.log('window.open涓嬭浇澶辫触锛屽皾璇昮etch鏂瑰紡:', error2); + // 鏂规硶3锛氫娇鐢╢etch涓嬭浇 + this.downloadFileWithFetch(url, fileName); + } + } + }, + // 浣跨敤fetch涓嬭浇鏂囦欢 + downloadFileWithFetch(url, fileName) { + fetch(url) + .then(response => { + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + return response.blob(); + }) + .then(blob => { + // 鍒涘缓blob URL + const blobUrl = window.URL.createObjectURL(blob); + + // 鍒涘缓涓嬭浇閾炬帴 + const link = document.createElement('a'); + link.href = blobUrl; + link.download = fileName; + link.style.display = 'none'; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + + // 閲婃斁blob URL + window.URL.revokeObjectURL(blobUrl); + + uni.hideLoading(); + uni.showToast({ + title: '涓嬭浇鎴愬姛', + icon: 'success', + duration: 2000 + }); + }) + .catch(error => { + console.error('Fetch涓嬭浇澶辫触:', error); + uni.hideLoading(); + if (error.message.includes('404')) { + uni.showModal({ + title: '鏂囦欢涓嶅瓨鍦�', + content: `璇ラ檮浠跺湪FTP鏈嶅姟鍣ㄤ笂涓嶅瓨鍦╜, + showCancel: false + }); + } else { + uni.showModal({ + title: '涓嬭浇澶辫触', + content: `涓嬭浇澶辫触: ${error.message}`, + showCancel: false + }); + } + }); + }, + // 鍦ˋPP涓笅杞芥枃浠� + downloadFileInApp(url, fileName) { + // #ifdef APP-PLUS + uni.showLoading({ title: '浠嶧TP鏈嶅姟鍣ㄤ笅杞戒腑...' }); + + // Android 鑾峰彇瀛樺偍璺緞 + const saveDir = plus.os.name === 'Android' ? plus.io.convertLocalFileSystemURL('_downloads/') : plus.io.convertLocalFileSystemURL('_documents/'); + const filePath = `${saveDir}${fileName}`; + + const downloadTask = uni.downloadFile({ + url: url, + filePath: filePath, // 鎸囧畾淇濆瓨璺緞 + success: (res) => { + uni.hideLoading(); + if (res.statusCode === 200) { + const fileInfo = { + name: fileName, + path: res.filePath || filePath, + tempPath: res.tempFilePath + }; + + uni.showModal({ + title: '涓嬭浇鎴愬姛', + content: `鏂囦欢宸蹭繚瀛樺埌锛�${fileInfo.path}`, + showCancel: true, + confirmText: '鎵撳紑鏂囦欢', + cancelText: '纭畾', + success: (modalRes) => { + if (modalRes.confirm) { + // 鐢ㄦ埛閫夋嫨鎵撳紑鏂囦欢 + this.openFileInApp(fileInfo); + } + } + }); + } else if (res.statusCode === 404) { + uni.showModal({ + title: '鏂囦欢涓嶅瓨鍦�', + content: `璇ラ檮浠跺湪FTP鏈嶅姟鍣ㄤ笂涓嶅瓨鍦╜, + showCancel: false + }); + } else { + uni.showModal({ + title: '涓嬭浇澶辫触', + content: `鐘舵�佺爜锛�${res.statusCode}`, + showCancel: false + }); + } + }, + fail: (error) => { + uni.hideLoading(); + console.error('涓嬭浇澶辫触:', error); + uni.showModal({ + title: '涓嬭浇澶辫触', + content: `缃戠粶閿欒锛�${error.errMsg}`, + showCancel: false + }); + } + }); + + // 鐩戝惉涓嬭浇杩涘害 + downloadTask.onProgressUpdate((res) => { + const progress = Math.round(res.progress); + uni.showLoading({ + title: `涓嬭浇涓� ${progress}%`, + mask: true + }); + }); + // #endif + + // #ifdef MP + // 灏忕▼搴忕幆澧冪殑绠�鍖栧疄鐜� + uni.showLoading({ title: '涓嬭浇涓�...' }); + uni.downloadFile({ + url: url, + success: (res) => { + uni.hideLoading(); + if (res.statusCode === 200) { + uni.showToast({ title: '涓嬭浇瀹屾垚', icon: 'success' }); + } + }, + fail: (error) => { + uni.hideLoading(); + uni.showModal({ title: '涓嬭浇澶辫触', content: error.errMsg, showCancel: false }); + } + }); + // #endif + }, + // APP涓墦寮�鏂囦欢 + openFileInApp(fileInfo) { + // #ifdef APP-PLUS + if (typeof plus !== 'undefined') { + const filePath = fileInfo.path || fileInfo.tempPath; + + // 灏濊瘯鎵撳紑鏂囦欢 + plus.runtime.openFile(filePath, {}, (error) => { + console.error('鎵撳紑鏂囦欢澶辫触:', error); + uni.showModal({ + title: '鏃犳硶鎵撳紑', + content: '绯荤粺涓病鏈夋壘鍒拌兘鎵撳紑姝ゆ枃浠剁殑搴旂敤绋嬪簭', + showCancel: false + }); + }); + } + // #endif + }, + // 棰勮FTP鏂囦欢 + 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 + "/RKJ/PreviewFtpFile?itemNo=" + encodeURIComponent(item.itemNo) + "&fileName=" + encodeURIComponent(fileName) + "&ftpServer=" + encodeURIComponent(this.$store.state.serverInfo.ftpServer); + + // 鏍规嵁鏂囦欢绫诲瀷杩涜涓嶅悓鐨勯瑙堝鐞� + 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 if (['doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx'].includes(fileExt)) { + this.previewOfficeFile(previewUrl, fileName); + } else { + // 灏濊瘯閫氱敤棰勮 + this.previewGenericFile(previewUrl, fileName); + } + }, + + // 棰勮PDF鏂囦欢 + previewPdfFile(url, fileName) { + // 鍏堜笅杞絇DF鏂囦欢锛岃浆涓篵ase64鍚庨瑙� + uni.request({ + url: url, + method: 'GET', + responseType: 'arraybuffer', + success: (res) => { + if (res.statusCode === 200) { + const base64Data = uni.arrayBufferToBase64(res.data); + // 瀛樺偍鍒板叏灞�鍙橀噺 + getApp().globalData.tempPDF = base64Data; + uni.navigateTo({ + url: `/pages/fileView/pdfView` + }); + } else { + this.handlePreviewError(res.statusCode, fileName); + } + }, + fail: (error) => { + this.handlePreviewError(0, fileName, error.errMsg); + } + }); + }, + + // 棰勮鍥剧墖鏂囦欢 + previewImageFile(url, fileName) { + // #ifdef APP-PLUS + // APP鐜锛氬厛涓嬭浇鍒版湰鍦板啀棰勮锛岄伩鍏嶇綉缁滃浘鐗囧姞杞介棶棰� + uni.showLoading({ title: '鍔犺浇鍥剧墖...' }); + uni.downloadFile({ + url: url, + success: (res) => { + uni.hideLoading(); + if (res.statusCode === 200) { + // 浣跨敤鏈湴涓存椂璺緞 + uni.navigateTo({ + url: `/pages/fileView/imageView?url=${encodeURIComponent(res.tempFilePath)}` + }); + } else { + this.handlePreviewError(res.statusCode, fileName); + } + }, + fail: (error) => { + uni.hideLoading(); + this.handlePreviewError(0, fileName, error.errMsg); + } + }); + // #endif + + // #ifdef H5 || MP + // H5鍜屽皬绋嬪簭锛氱洿鎺ヤ娇鐢ㄧ綉缁淯RL + uni.navigateTo({ + url: `/pages/fileView/imageView?url=${encodeURIComponent(url)}` + }); + // #endif + }, + + // 棰勮鏂囨湰鏂囦欢 + previewTextFile(url, fileName) { + // 鏂囨湰鏂囦欢鐩存帴鏄剧ず鍦ㄥ脊绐椾腑 + uni.showLoading({ title: '鍔犺浇鏂囦欢鍐呭...' }); + uni.request({ + url: url, + method: 'GET', + success: (res) => { + uni.hideLoading(); + if (res.statusCode === 200) { + const fileType = this.getFileType(fileName); + + if (fileType === 'text') { + // 鏂囨湰鏂囦欢锛氭樉绀哄唴瀹� + this.showFilePreview(res.data, fileName); + } else if (fileType === 'image') { + // 鍥剧墖鏂囦欢锛氭樉绀哄浘鐗嘦RL + this.showFilePreview(url, fileName); + } else { + // 鍏朵粬鏂囦欢绫诲瀷锛氭樉绀烘彁绀轰俊鎭� + this.showFilePreview('', fileName); + } + } else { + this.handlePreviewError(res.statusCode, fileName); + } + }, + fail: (error) => { + uni.hideLoading(); + this.handlePreviewError(0, fileName, error.errMsg); + } + }); + }, + + // 妫�娴嬫枃浠剁被鍨� + getFileType(fileName) { + const fileExt = fileName.split('.').pop().toLowerCase(); + + if (['txt', 'log', 'md', 'csv', 'json', 'xml'].includes(fileExt)) { + return 'text'; + } else if (['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp'].includes(fileExt)) { + return 'image'; + } else if (['xls', 'xlsx', 'doc', 'docx', 'ppt', 'pptx'].includes(fileExt)) { + return 'excel'; + } else { + return 'unsupported'; + } + }, + + // 鏄剧ず鏂囦欢棰勮寮圭獥 + showFilePreview(content, fileName) { + this.previewContent = content; + this.previewTitle = fileName; + this.previewItemNo = this.selectedAttachment?.itemNo || ''; + this.previewType = this.getFileType(fileName); + this.showFilePreviewPopup = true; + }, + + // 鍏抽棴鏂囦欢棰勮寮圭獥 + closeFilePreview() { + this.showFilePreviewPopup = false; + this.previewContent = ''; + this.previewTitle = ''; + this.previewItemNo = ''; + this.previewType = ''; + }, + + // 涓嬭浇棰勮鏂囦欢 + downloadPreviewFile() { + const item = { fattach: this.previewTitle, itemNo: this.previewItemNo }; + this.downloadAttachment(item); + this.closeFilePreview(); + }, + + // 鍦ㄥ脊绐椾腑棰勮鍥剧墖锛堟斁澶у姛鑳斤級 + previewImageInPopup() { + // 浣跨敤uni.previewImage API瀹炵幇鍥剧墖鏀惧ぇ棰勮 + uni.previewImage({ + current: this.previewContent, // 褰撳墠鏄剧ず鍥剧墖鐨勯摼鎺� + urls: [this.previewContent], // 闇�瑕侀瑙堢殑鍥剧墖閾炬帴鍒楄〃 + loop: false, // 鏄惁寮�鍚浘鐗囪疆鎾� + indicator: 'default', // 鍥剧墖鎸囩ず鍣ㄧ被鍨� + longPressActions: { + itemList: ['鍙戦�佺粰鏈嬪弸', '淇濆瓨鍥剧墖', '鏀惰棌'], + success: function (data) { + console.log('閫変腑浜嗙' + (data.tapIndex + 1) + '涓寜閽�'); + }, + fail: function (err) { + console.log(err.errMsg); + } + }, + success: () => { + console.log('鍥剧墖棰勮鎴愬姛'); + }, + fail: (err) => { + console.error('鍥剧墖棰勮澶辫触:', err); + uni.showToast({ + title: '鍥剧墖棰勮澶辫触', + icon: 'none' + }); + } + }); + }, + + // 棰勮Office鏂囦欢 + previewOfficeFile(url, fileName) { + // 鍏堟鏌xcel鏂囦欢锛屼娇鐢ㄤ笓闂ㄧ殑Excel棰勮椤甸潰 + const fileExt = fileName.split('.').pop().toLowerCase(); + if (['xls', 'xlsx'].includes(fileExt)) { + // Excel鏂囦欢棰勮 + uni.request({ + url: url, + method: 'GET', + responseType: 'arraybuffer', + success: (res) => { + if (res.statusCode === 200) { + const base64Data = uni.arrayBufferToBase64(res.data); + // 瀛樺偍 Base64 鏁版嵁鍒版湰鍦板瓨鍌� + uni.setStorageSync('excelBase64Data', base64Data); + uni.navigateTo({ + url: `/pages/fileView/excelView` + }); + } else { + this.handlePreviewError(res.statusCode, fileName); + } + }, + fail: (error) => { + this.handlePreviewError(0, fileName, error.errMsg); + } + }); + } else if (['doc', 'docx'].includes(fileExt)) { + // Word鏂囦欢锛屽皾璇曚娇鐢╓ord棰勮椤甸潰鎴栬�呭井杞湪绾块瑙� + try { + const officePreviewUrl = `https://view.officeapps.live.com/op/view.aspx?src=${encodeURIComponent(url)}`; + // 濡傛灉鏈墂ebView椤甸潰锛屼娇鐢╳ebView棰勮 + this.previewGenericFile(officePreviewUrl, fileName); + } catch (error) { + this.handlePreviewError(0, fileName, '涓嶆敮鎸佹Office鏂囦欢绫诲瀷鐨勯瑙�'); + } + } else { + // 鍏朵粬Office鏂囦欢锛屼娇鐢ㄥ井杞湪绾块瑙堟湇鍔� + const officePreviewUrl = `https://view.officeapps.live.com/op/view.aspx?src=${encodeURIComponent(url)}`; + this.previewGenericFile(officePreviewUrl, fileName); + } + }, + + // 閫氱敤鏂囦欢棰勮 + previewGenericFile(url, fileName) { + // 鐢变簬娌℃湁閫氱敤鐨剋ebView椤甸潰锛屾樉绀烘彁绀哄苟鎻愪緵涓嬭浇 + uni.showModal({ + title: '鏂囦欢棰勮', + content: `鏂囦欢 "${fileName}" 闇�瑕佷笅杞藉悗鏌ョ湅锛屾槸鍚︾珛鍗充笅杞斤紵`, + showCancel: true, + confirmText: '涓嬭浇', + cancelText: '鍙栨秷', + success: (res) => { + if (res.confirm) { + const item = { fattach: fileName, itemNo: this.selectedAttachment.itemNo }; + this.downloadAttachment(item); + } + } + }); + }, + + // 澶勭悊棰勮閿欒 + handlePreviewError(statusCode, fileName, errorMsg = '') { + let message = ''; + if (statusCode === 404) { + message = `鏂囦欢 ${fileName} 鍦‵TP鏈嶅姟鍣ㄤ笂涓嶅瓨鍦╜; + } else if (statusCode === 0) { + message = `棰勮澶辫触锛�${errorMsg}`; + } else { + message = `棰勮澶辫触锛岀姸鎬佺爜锛�${statusCode}`; + } + + uni.showModal({ + title: '棰勮澶辫触', + content: message, + showCancel: true, + confirmText: '涓嬭浇', + cancelText: '鍙栨秷', + success: (res) => { + if (res.confirm) { + // 鐢ㄦ埛閫夋嫨涓嬭浇鏂囦欢 + const item = { fattach: fileName, itemNo: this.selectedAttachment.itemNo }; + this.downloadAttachment(item); + } + } + }); }, onShow() { //姣忔杩涘叆椤甸潰閮戒細鎵ц鐨勬柟娉� @@ -907,6 +1614,104 @@ this.init(); } }, + // 闄勪欢鐩稿叧鏂规硶 + closeAttachmentPopup() { + this.showAttachmentPopup = false; + }, + showAttachmentDetailDialog(item) { + console.log('鏌ョ湅璇︽儏', item); + this.selectedAttachment = item; + this.showAttachmentPopup = false; + this.showAttachmentDetail = true; + console.log('showAttachmentDetail:', this.showAttachmentDetail); + }, + 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', // PDF鏂囦欢 + 'jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', // 鍥剧墖鏂囦欢 + 'txt', 'log', 'md', // 鏂囨湰鏂囦欢 + 'doc', 'docx', // Word鏂囨。 + 'xls', 'xlsx', // Excel琛ㄦ牸 + 'ppt', 'pptx', // PowerPoint婕旂ず鏂囩 + 'csv' // CSV鏂囦欢 + ].includes(ext); + }, + + // 涓嬫媺妗嗕簨浠跺鐞嗘柟娉� + onBadreasonChange(e) { + const index = e.detail.value; + this.badreasonIndex = index; + this.badreason = this.badreasonOptions[index]; + this.saveDropdownFields('badreason'); + }, + onWorkshopChange(e) { + const index = e.detail.value; + this.workshopIndex = index; + this.WORKSHOP = this.workshopOptions[index]; + this.saveDropdownFields('WORKSHOP'); + }, + onPstypeChange(e) { + const index = e.detail.value; + this.pstypeIndex = index; + this.PSTYPE = this.pstypeOptions[index]; + this.saveDropdownFields('PSTYPE'); + }, + saveDropdownFields(fieldName) { + // 鐩存帴淇濆瓨鍒版暟鎹簱 + const requestData = { + gid: this.formData.id, + releaseNo: this.formData.releaseNo, + BLYY: this.badreason || '', + SSCJ: this.WORKSHOP || '', + PSZT: this.PSTYPE || '' + }; + console.log('鍙戦�佺殑鏁版嵁:', requestData); + console.log('badreason:', this.badreason); + console.log('WORKSHOP:', this.WORKSHOP); + console.log('PSTYPE:', this.PSTYPE); + console.log('閫夋嫨鐨勫瓧娈�:', fieldName); + this.$post({ + url: "/RKJ/saveDropdownFields", + data: requestData + }).then(res => { + if (res && res.data && res.data.data && res.data.data.tbBillList && res.data.data.tbBillList.length > 0) { + // 寤惰繜閲嶆柊鍔犺浇鏁版嵁锛岀‘淇濇暟鎹簱鏇存柊瀹屾垚 + setTimeout(() => { + this.init(); + }, 500); + } + }).catch(err => { + console.error('淇濆瓨澶辫触锛�', err); + }); + }, + saveFngDesc() { + // 淇濆瓨涓嶈壇鎻忚堪鍒版暟鎹簱 + this.$post({ + url: "/RKJ/saveFngDesc", + data: { + gid: this.formData.id, + fngDesc: this.formData.fngDesc + } + }).then(res => { + if (res.status == 0) { + this.$showMessage("涓嶈壇鎻忚堪淇濆瓨鎴愬姛"); + } else { + this.$showMessage("涓嶈壇鎻忚堪淇濆瓨澶辫触"); + } + }).catch(error => { + console.error("淇濆瓨涓嶈壇鎻忚堪澶辫触:", error); + this.$showMessage("淇濆瓨涓嶈壇鎻忚堪澶辫触锛岃閲嶈瘯"); + }); + } + } }; </script> @@ -996,7 +1801,7 @@ } .form-label { - width: 120px; + width: 100px; font-weight: 500; color: #34495e; flex-shrink: 0; @@ -1040,22 +1845,55 @@ .form-input { flex: 1; - padding: 15px 12px; - border: 2px solid #e9ecef; - border-radius: 8px; + min-width: 200px; + padding: 8px 12px; + border: 1px solid #ddd; + border-radius: 4px; font-size: 14px; background-color: white; - color: #2c3e50; - transition: all 0.3s ease; - min-width: 200px; - width: 100%; - min-height: 50px; + box-sizing: border-box; } - .form-input:focus { + .large-quantity-input { + min-width: 200px !important; + padding: 8px 12px !important; + font-size: 14px !important; + border: 1px solid #ddd !important; + border-radius: 4px !important; + background-color: white !important; + transition: all 0.3s ease; + font-weight: normal !important; + text-align: left !important; + flex: 1; + } + + .large-quantity-input:focus { border-color: #3498db; - box-shadow: 0 0 0 3px rgba(52, 152, 219, 0.1); + box-shadow: 0 0 0 2px rgba(52, 152, 219, 0.2); outline: none; + background-color: white; + } + + .large-quantity-input::placeholder { + color: #95a5a6; + font-size: 16px; + } + + .input-field { + width: 100%; + padding: 8px 12px; + border: 1px solid #ddd; + border-radius: 4px; + font-size: 14px; + background-color: white; + box-sizing: border-box; + min-height: 36px; + } + + .input-field:focus { + outline: none; + border-color: #3498db; + box-shadow: 0 0 0 2px rgba(52, 152, 219, 0.2); } .form-hint { @@ -1481,4 +2319,341 @@ max-width: none; } } + + /* 闄勪欢鐩稿叧鏍峰紡 */ + .attachment-detail-popup { + width: 80vw; + max-width: 500px; + max-height: 70vh; + display: flex; + flex-direction: column; + } + + .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-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); + } + + /* 鏂囦欢棰勮寮圭獥鏍峰紡 */ + .file-preview-popup { + width: 80vw; + max-width: 600px; + max-height: 70vh; + display: flex; + flex-direction: column; + } + + .file-preview-title { + font-size: 18px; + font-weight: 700; + color: #222; + margin-bottom: 8px; + text-align: center; + word-break: break-all; + } + + .file-preview-divider { + height: 1px; + background: linear-gradient(90deg,#e0e7ef 0%,#f5f7fa 100%); + margin-bottom: 16px; + } + + .file-preview-content { + flex: 1; + max-height: 400px; + overflow-y: auto; + background: #f8fafc; + border-radius: 8px; + padding: 16px; + margin-bottom: 16px; + border: 1px solid #e2e8f0; + } + + .file-preview-content pre { + font-family: 'Consolas', 'Monaco', 'Courier New', monospace; + font-size: 12px; + line-height: 1.5; + color: #2d3748; + white-space: pre-wrap; + word-wrap: break-word; + margin: 0; + } + + /* 鍥剧墖棰勮鏍峰紡 */ + .image-preview-container { + display: flex; + justify-content: center; + align-items: center; + min-height: 200px; + } + + /* 涓嶆敮鎸佹枃浠剁被鍨嬬殑鎻愮ず鏍峰紡 */ + .unsupported-preview { + text-align: center; + padding: 40px 20px; + color: #666; + } + + .unsupported-icon { + font-size: 48px; + margin-bottom: 16px; + } + + .unsupported-text { + font-size: 16px; + font-weight: 600; + color: #333; + margin-bottom: 8px; + } + + .unsupported-hint { + font-size: 14px; + color: #999; + line-height: 1.4; + } + + .file-preview-actions { + display: flex; + gap: 12px; + justify-content: center; + } + + .file-preview-btn { + padding: 8px 20px; + border: none; + border-radius: 6px; + font-size: 14px; + font-weight: 600; + cursor: pointer; + transition: all 0.3s ease; + display: flex; + align-items: center; + justify-content: center; + min-width: 120px; + } + + .file-preview-btn.download-btn { + background: linear-gradient(135deg, #2196F3, #1976D2); + color: white; + } + + .file-preview-btn.download-btn:hover { + background: linear-gradient(135deg, #1976D2, #1565C0); + transform: translateY(-1px); + } + + .file-preview-btn.close-btn { + background: linear-gradient(135deg, #e0e0e0, #bdbdbd); + color: #444; + } + + .file-preview-btn.close-btn:hover { + background: linear-gradient(135deg, #bdbdbd, #9e9e9e); + transform: translateY(-1px); + } + + /* 鍒楄〃寮圭獥缇庡寲 */ + .attachment-list { + padding: 0; + margin: 0; + list-style: none; + max-height: 300px; + overflow-y: auto; + } + + .attachment-list li { + display: flex; + align-items: center; + justify-content: space-between; + padding: 12px 0; + border-bottom: 1px solid #f0f0f0; + } + + .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 { + display: flex; + gap: 8px; + 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; + } + + .attachment-list .secondary-btn:hover { + background: #e6f0fa; + color: #1976d2; + } + + .preview-btn { + background: #e8f5e8 !important; + color: #2e7d2e !important; + border-color: #a5d6a5 !important; + } + + .preview-btn:hover { + background: #d4eecc !important; + color: #1e5f1e !important; + } + + /* 鍥剧墖鏀惧ぇ棰勮鐩稿叧鏍峰紡 */ + .preview-image-clickable { + transition: transform 0.2s ease; + border-radius: 8px; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); + } + + .preview-image-clickable:hover { + transform: scale(1.02); + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); + } + + .image-zoom-hint { + text-align: center; + margin-top: 8px; + font-size: 12px; + color: #666; + font-style: italic; + } + + .image-preview-container { + position: relative; + display: flex; + flex-direction: column; + align-items: center; + } </style> \ No newline at end of file diff --git a/pages/QC/RKJ/List.vue b/pages/QC/RKJ/List.vue index 7758c2b..05350a0 100644 --- a/pages/QC/RKJ/List.vue +++ b/pages/QC/RKJ/List.vue @@ -1,441 +1,441 @@ <template> - <view class="inspection-app"> - <!-- 鍒锋柊椤甸潰鍚庣殑椤堕儴鎻愮ず妗� --> - <view class="tips" :class="{ 'tips-ani': tipShow }">鍒锋柊鎴愬姛</view> - - <!-- 椤堕儴绛涢�夊尯 --> - <view class="filter-section"> - <view class="filter-controls"> - <!-- 鐘舵�佸垏鎹㈡爣绛� --> - <view class="status-tabs"> - <button :class="['tab-button', current === 0 ? 'active' : '']" @click="onClickItem({currentIndex: 0})"> - {{items[0]}} - </button> - <button :class="['tab-button', current === 1 ? 'active' : '']" @click="onClickItem({currentIndex: 1})"> - {{items[1]}} - </button> + <view class="inspection-app"> + <!-- 鍒锋柊椤甸潰鍚庣殑椤堕儴鎻愮ず妗� --> + <view class="tips" :class="{ 'tips-ani': tipShow }">鍒锋柊鎴愬姛</view> + + <!-- 椤堕儴绛涢�夊尯 --> + <view class="filter-section"> + <view class="filter-controls"> + <!-- 鐘舵�佸垏鎹㈡爣绛� --> + <view class="status-tabs"> + <button :class="['tab-button', current === 0 ? 'active' : '']" @click="onClickItem({currentIndex: 0})"> + {{items[0]}} + </button> + <button :class="['tab-button', current === 1 ? 'active' : '']" @click="onClickItem({currentIndex: 1})"> + {{items[1]}} + </button> + </view> </view> </view> - </view> - - <!-- 妫�楠屽崟鍒楄〃 --> - <view class="inspection-list"> - <!-- 妫�楠屽崟鍗$墖 --> - <view class="inspection-card" v-for="item in data" :key="item.id" @click="navigateToDetail(item)"> - <view class="card-header"> - <text class="card-title">妫�楠屽崟鍙�: {{item.releaseNo}}</text> - <text class="status pass" v-if="item.fcheckResu === '鍚堟牸'">鍚堟牸</text> - <text class="status unqualified" v-if="item.fcheckResu === '涓嶅悎鏍�'">涓嶅悎鏍�</text> - <text class="status pending" v-if="!item.fcheckResu">寰呮楠�</text> - </view> - - <view class="card-body"> - <view class="info-row"> - <view class="info-item"> - <text class="info-label">閫佹鎵规鍙�</text> - <text class="info-content">{{item.billNo}}</text> + + <!-- 妫�楠屽崟鍒楄〃 --> + <view class="inspection-list"> + <!-- 妫�楠屽崟鍗$墖 --> + <view class="inspection-card" v-for="item in data" :key="item.id" @click="navigateToDetail(item)"> + <view class="card-header"> + <text class="card-title">妫�楠屽崟鍙�: {{item.releaseNo}}</text> + <text class="status pass" v-if="item.fcheckResu === '鍚堟牸'">鍚堟牸</text> + <text class="status unqualified" v-if="item.fcheckResu === '涓嶅悎鏍�'">涓嶅悎鏍�</text> + <text class="status pending" v-if="!item.fcheckResu">寰呮楠�</text> + </view> + + <view class="card-body"> + <view class="info-row"> + <view class="info-item"> + <text class="info-label">宸ュ崟鍙�</text> + <text class="info-content">{{item.billNo}}</text> + </view> + <view class="info-item"> + <text class="info-label">浜х嚎</text> + <text class="info-content">{{item.daa015}}</text> + </view> </view> - <view class="info-item"> - <text class="info-label">浜х嚎</text> - <text class="info-content">{{item.daa015}}</text> + + <view class="info-row"> + <view class="info-item"> + <text class="info-label">鐗╂枡淇℃伅</text> + <text class="info-content">{{item.itemNo}}<br>{{item.itemName}}</text> + </view> + <view class="info-item"> + <text class="info-label">浜у搧鍨嬪彿</text> + <text class="info-content">{{item.itemModel}}</text> + </view> + </view> + + <view class="info-row"> + <view class="info-item"> + <text class="info-label">閫佹鏁伴噺</text> + <text class="info-content highlight">{{item.quantity}}</text> + </view> + <view class="info-item"> + <text class="info-label">鍒涘缓浜�</text> + <text class="info-content">{{item.createBy}}</text> + </view> + </view> + + <view class="info-row"> + <view class="info-item"> + <text class="info-label">閫佹鎵规</text> + <text class="info-content">{{item.rbillNo}}</text> + </view> + <view class="info-item"> + <text class="info-label">妫�楠屼汉</text> + <text class="info-content">{{item.fcheckBy}}</text> + </view> + </view> + + <view class="meta-info"> + <text class="meta-item"> + <uni-icons type="calendar" size="14" color="#95a5a6"></uni-icons> + {{item.createDate}} + </text> + <text class="meta-item" v-if="item.fcheckResu"> + <uni-icons type="checkmarkempty" size="14" color="#95a5a6"></uni-icons> + 妫�娴嬬粨鏋�: {{item.fcheckResu}} + </text> </view> </view> - - <view class="info-row"> - <view class="info-item"> - <text class="info-label">鐗╂枡淇℃伅</text> - <text class="info-content">{{item.itemNo}}<br>{{item.itemName}}</text> - </view> - <view class="info-item"> - <text class="info-label">浜у搧鍨嬪彿</text> - <text class="info-content">{{item.itemModel}}</text> - </view> + + <view class="card-actions"> + <button class="primary" @click.stop="navigateToDetail(item)"> + {{current === 0 ? '寮�濮嬫楠�' : '鏌ョ湅璇︽儏'}} + </button> </view> - - <view class="info-row"> - <view class="info-item"> - <text class="info-label">閫佹鏁伴噺</text> - <text class="info-content highlight">{{item.quantity}}</text> - </view> - <view class="info-item"> - <text class="info-label">鎶ュ伐浜�</text> - <text class="info-content">{{item.bgr}}</text> - </view> - </view> - - <view class="info-row"> - <view class="info-item"> - <text class="info-label">妫�楠屼汉</text> - <text class="info-content">{{item.fcheckBy}}</text> - </view> - <view class="info-item"> - <text class="info-label">鍒涘缓浜�</text> - <text class="info-content">{{item.createBy}}</text> - </view> - </view> - - <view class="meta-info"> - <text class="meta-item"> - <uni-icons type="calendar" size="14" color="#95a5a6"></uni-icons> - {{item.createDate}} - </text> - <text class="meta-item" v-if="item.fcheckResu"> - <uni-icons type="checkmarkempty" size="14" color="#95a5a6"></uni-icons> - 妫�娴嬬粨鏋�: {{item.fcheckResu}} - </text> - </view> - </view> - - <view class="card-actions"> - <button class="primary" @click.stop="navigateToDetail(item)"> - {{current === 0 ? '寮�濮嬫楠�' : '鏌ョ湅璇︽儏'}} - </button> </view> </view> + + <!-- 鏂板鎸夐挳 --> + <view class="plus-button" @click="handleFabClick"> + + + </view> </view> - - <!-- 鏂板鎸夐挳 --> - <view class="plus-button" @click="handleFabClick"> - + - </view> - </view> -</template> - -<script> -export default { - components: {}, - data() { - return { - items: ['鏈彁浜�', '宸叉彁浜�'], - current: 0, - data: [], - pageIndex: 1, - limit: 20, - totalPage: 0, - totalCount: 0, - noData: false, // 娌℃湁鏇村鏁版嵁浜� - isLoading: false, // 鏄惁姝e湪鍔犺浇 - tipShow: false - }; - }, - onLoad() { - //椤甸潰鍔犺浇鏃惰皟鐢ㄧ殑浜嬩欢 - this.init(); - }, - methods: { - init() { - - let result = "鏈畬鎴�"; - if (this.current == 1) { - result = "宸插畬鎴�"; - } - - if (this.isLoading) return; // 濡傛灉姝e湪鍔犺浇鍒欎笉缁х画鎵ц - - this.isLoading = true; - + </template> + + <script> + export default { + components: {}, + data() { + return { + items: ['鏈彁浜�', '宸叉彁浜�'], + current: 0, + data: [], + pageIndex: 1, + limit: 20, + totalPage: 0, + totalCount: 0, + noData: false, // 娌℃湁鏇村鏁版嵁浜� + isLoading: false, // 鏄惁姝e湪鍔犺浇 + tipShow: false + }; + }, + onLoad() { //椤甸潰鍔犺浇鏃惰皟鐢ㄧ殑浜嬩欢 - this.$post({ - url: "/RKJ/getPage", - data: { - pageIndex: this.pageIndex, - limit: this.limit, - createUser: this.$loginInfo.account, - result: result - } - }).then(res => { - if (this.pageIndex === 1) { - // 濡傛灉鏄涓�椤碉紝鐩存帴瑕嗙洊鍘熸暟鎹� - this.data = res.data.tbBillList; - } else { + this.init(); + }, + methods: { + init() { - if (res.data.tbBillList.length > 0) { - // 濡傛灉鏄笅涓�椤碉紝杩藉姞鏂版暟鎹� - this.data = [...this.data, ...res.data.tbBillList]; + let fsubmit = null; // 榛樿鏌ヨ鎵�鏈夋湭鎻愪氦鐨勮褰曪紙鍖呮嫭fsubmit = 0鍜宖submit涓虹┖锛� + if (this.current == 1) { + fsubmit = "1"; // 宸叉彁浜� + } + + if (this.isLoading) return; // 濡傛灉姝e湪鍔犺浇鍒欎笉缁х画鎵ц + + this.isLoading = true; + + //椤甸潰鍔犺浇鏃惰皟鐢ㄧ殑浜嬩欢 + this.$post({ + url: "/RKJ/getPage", + data: { + pageIndex: this.pageIndex, + limit: this.limit, + createUser: this.$loginInfo.account, + fsubmit: fsubmit } - + }).then(res => { + if (this.pageIndex === 1) { + // 濡傛灉鏄涓�椤碉紝鐩存帴瑕嗙洊鍘熸暟鎹� + this.data = res.data.tbBillList; + } else { + + if (res.data.tbBillList.length > 0) { + // 濡傛灉鏄笅涓�椤碉紝杩藉姞鏂版暟鎹� + this.data = [...this.data, ...res.data.tbBillList]; + } + + } + this.totalCount = res.data.totalCount; + this.totalPage = Math.ceil(this.totalCount / this.limit); + + this.noData = this.pageIndex >= this.totalPage; + this.isLoading = false; // 缁撴潫鍔犺浇 + }).catch(() => { + this.isLoading = false; // 鍑虹幇閿欒鏃剁粨鏉熷姞杞� + }); + }, + handleFabClick() { + uni.navigateTo({ + url: 'Add?id' + }); + }, + onClickItem(index) { + if (this.current !== index.currentIndex) { + this.current = index.currentIndex; + this.data = []; + this.pageIndex = 1; + this.init(); } - this.totalCount = res.data.totalCount; - this.totalPage = Math.ceil(this.totalCount / this.limit); - - this.noData = this.pageIndex >= this.totalPage; - this.isLoading = false; // 缁撴潫鍔犺浇 - }).catch(() => { - this.isLoading = false; // 鍑虹幇閿欒鏃剁粨鏉熷姞杞� - }); + }, + navigateToDetail(item) { + uni.navigateTo({ + url: 'Add?id=' + item.id + '&releaseNo=' + item.releaseNo + }); + }, }, - handleFabClick() { - uni.navigateTo({ - url: 'Add?id' - }); + /** + * 涓嬫媺鍒锋柊鍥炶皟鍑芥暟 + */ + onPullDownRefresh() { + this.pageIndex = 1; + //閲嶆柊鎵ц涓�閬嶆煡璇� + this.init(); + this.tipShow = true; + //鍏抽棴鍔ㄧ敾 + uni.stopPullDownRefresh(); + + setTimeout(function () { + this.tipShow = false; + }, 3000); }, - onClickItem(index) { - if (this.current !== index.currentIndex) { - this.current = index.currentIndex; - this.data = []; - this.pageIndex = 1; - this.init(); - } + /** + * 涓婃媺鍔犺浇鍥炶皟鍑芥暟 + */ + onReachBottom() { + if (this.noData || this.isLoading) return; + this.pageIndex++; + this.init(); // 鍔犺浇鏇村鏁版嵁 }, - navigateToDetail(item) { - uni.navigateTo({ - url: 'Add?id=' + item.id + '&releaseNo=' + item.releaseNo - }); - }, - }, - /** - * 涓嬫媺鍒锋柊鍥炶皟鍑芥暟 - */ - onPullDownRefresh() { - this.pageIndex = 1; - //閲嶆柊鎵ц涓�閬嶆煡璇� - this.init(); - this.tipShow = true; - //鍏抽棴鍔ㄧ敾 - uni.stopPullDownRefresh(); - - setTimeout(function () { - this.tipShow = false; - }, 3000); - }, - /** - * 涓婃媺鍔犺浇鍥炶皟鍑芥暟 - */ - onReachBottom() { - if (this.noData || this.isLoading) return; - this.pageIndex++; - this.init(); // 鍔犺浇鏇村鏁版嵁 - }, - onShow() { - //姣忔杩涘叆椤甸潰閮戒細鎵ц鐨勬柟娉� - this.pageIndex = 1; - this.data = []; - //this.current = 0 - this.init(); + onShow() { + //姣忔杩涘叆椤甸潰閮戒細鎵ц鐨勬柟娉� + this.pageIndex = 1; + this.data = []; + //this.current = 0 + this.init(); + } + }; + </script> + + <style scoped> + /* 鍩虹鏍峰紡閲嶇疆 */ + .inspection-app { + padding: 10px; + background-color: #f5f7fa; + min-height: 100vh; } -}; -</script> - -<style scoped> -/* 鍩虹鏍峰紡閲嶇疆 */ -.inspection-app { - padding: 10px; - background-color: #f5f7fa; - min-height: 100vh; -} - -/* 椤堕儴绛涢�夊尯 */ -.filter-section { - margin-bottom: 24px; -} - -.filter-controls { - display: flex; - justify-content: center; - align-items: center; -} - -.status-tabs { - display: flex; - border-radius: 4px; - overflow: hidden; - background-color: #ecf0f1; - width: 300px; -} - -.tab-button { - padding: 0px 16px; - border: none; - background: none; - font-size: 14px; - transition: all 0.3s; - margin: 0; - height: 35px; - flex: 1; -} - -.tab-button.active { - background-color: #3498db; - color: white; -} - -/* 妫�楠屽崟鍒楄〃 */ -.inspection-list { - display: flex; - flex-direction: column; - gap: 20px; -} - -/* 妫�楠屽崟鍗$墖 */ -.inspection-card { - background-color: white; - border-radius: 8px; - box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05); - overflow: hidden; - transition: all 0.3s; -} - -.card-header { - padding: 16px; - border-bottom: 1px solid #eee; - display: flex; - align-items: center; -} - -.card-title { - font-size: 16px; - font-weight: 600; - flex: 1; - margin: 0 8px; -} - -.status { - font-size: 12px; - padding: 4px 8px; - border-radius: 4px; - font-weight: 500; -} - -.status.pending { - background-color: #f39c12; - color: white; -} - -.status.pass { - background-color: #00cd00; - color: white; -} - -.status.unqualified { - background-color: #ff0000; - color: white; -} - -.card-body { - padding: 16px; -} - -.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; -} - -.highlight { - font-weight: 600; - color: #2c3e50; - font-size: 16px; -} - -.meta-info { - display: flex; - gap: 16px; - font-size: 12px; - color: #95a5a6; - margin-top: 12px; -} - -.meta-item { - display: flex; - align-items: center; - gap: 4px; -} - -.card-actions { - padding: 12px 16px; - border-top: 1px solid #eee; - display: flex; - gap: 8px; -} - -button { - padding: 8px 16px; - border: 1px solid #ddd; - border-radius: 4px; - background-color: white; - font-size: 14px; - transition: all 0.2s; - flex: 1; -} - -button.primary { - background-color: #3498db; - color: white; - border-color: #2980b9; -} - -.plus-button { - position: fixed; - bottom: 20px; - right: 20px; - width: 60px; - height: 60px; - border-radius: 50%; - background-color: #3498db; - color: #ffffff; - text-align: center; - line-height: 59px; - font-size: 24px; - cursor: pointer; - z-index: 1000; - margin-bottom: 35px; -} - -.tips { - color: #67c23a; - font-size: 14px; - line-height: 40px; - text-align: center; - background-color: #f0f9eb; - height: 0; - opacity: 0; - transform: translateY(-100%); - transition: all 0.3s; -} - -.tips-ani { - transform: translateY(0); - height: 40px; - opacity: 1; -} - -/* 鍝嶅簲寮忚璁� */ -@media (min-width: 768px) { + + /* 椤堕儴绛涢�夊尯 */ + .filter-section { + margin-bottom: 24px; + } + + .filter-controls { + display: flex; + justify-content: center; + align-items: center; + } + + .status-tabs { + display: flex; + border-radius: 4px; + overflow: hidden; + background-color: #ecf0f1; + width: 300px; + } + + .tab-button { + padding: 0px 16px; + border: none; + background: none; + font-size: 14px; + transition: all 0.3s; + margin: 0; + height: 35px; + flex: 1; + } + + .tab-button.active { + background-color: #3498db; + color: white; + } + + /* 妫�楠屽崟鍒楄〃 */ .inspection-list { - display: grid; - grid-template-columns: repeat(auto-fill, minmax(400px, 1fr)); + display: flex; + flex-direction: column; + gap: 20px; + } + + /* 妫�楠屽崟鍗$墖 */ + .inspection-card { + background-color: white; + border-radius: 8px; + box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05); + overflow: hidden; + transition: all 0.3s; + } + + .card-header { + padding: 16px; + border-bottom: 1px solid #eee; + display: flex; + align-items: center; + } + + .card-title { + font-size: 16px; + font-weight: 600; + flex: 1; + margin: 0 8px; + } + + .status { + font-size: 12px; + padding: 4px 8px; + border-radius: 4px; + font-weight: 500; + } + + .status.pending { + background-color: #f39c12; + color: white; + } + + .status.pass { + background-color: #00cd00; + color: white; + } + + .status.unqualified { + background-color: #ff0000; + color: white; + } + + .card-body { + padding: 16px; } .info-row { - flex-direction: row; - } -} - -@media (min-width: 300px) { - .inspection-list { - display: grid; - grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); + display: flex; + margin-bottom: 12px; + gap: 16px; } - .info-row { - flex-direction: row; + .info-item { + flex: 1; } -} -</style> \ No newline at end of file + + .info-label { + display: block; + font-size: 12px; + color: #7f8c8d; + margin-bottom: 4px; + } + + .info-content { + font-size: 14px; + color: #2c3e50; + line-height: 1.5; + } + + .highlight { + font-weight: 600; + color: #2c3e50; + font-size: 16px; + } + + .meta-info { + display: flex; + gap: 16px; + font-size: 12px; + color: #95a5a6; + margin-top: 12px; + } + + .meta-item { + display: flex; + align-items: center; + gap: 4px; + } + + .card-actions { + padding: 12px 16px; + border-top: 1px solid #eee; + display: flex; + gap: 8px; + } + + button { + padding: 8px 16px; + border: 1px solid #ddd; + border-radius: 4px; + background-color: white; + font-size: 14px; + transition: all 0.2s; + flex: 1; + } + + button.primary { + background-color: #3498db; + color: white; + border-color: #2980b9; + } + + .plus-button { + position: fixed; + bottom: 20px; + right: 20px; + width: 60px; + height: 60px; + border-radius: 50%; + background-color: #3498db; + color: #ffffff; + text-align: center; + line-height: 59px; + font-size: 24px; + cursor: pointer; + z-index: 1000; + margin-bottom: 35px; + } + + .tips { + color: #67c23a; + font-size: 14px; + line-height: 40px; + text-align: center; + background-color: #f0f9eb; + height: 0; + opacity: 0; + transform: translateY(-100%); + transition: all 0.3s; + } + + .tips-ani { + transform: translateY(0); + height: 40px; + opacity: 1; + } + + /* 鍝嶅簲寮忚璁� */ + @media (min-width: 768px) { + .inspection-list { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(400px, 1fr)); + } + + .info-row { + flex-direction: row; + } + } + + @media (min-width: 300px) { + .inspection-list { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); + } + + .info-row { + flex-direction: row; + } + } + </style> \ No newline at end of file diff --git a/store/index.js b/store/index.js index d50ed24..0728463 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://localhost:5184/api',//褰撳墠姝e湪浣跨敤鐨勬湇鍔″櫒,榛樿涓哄缃� localhost //serverAPI:'http://192.168.1.22:10054/api',//鍐呯綉 - serverAPI:'http://36.26.21.214:10055/api', + serverAPI:'http://36.26.21.214:10054/api', ftpServer:'ftp://36.26.21.214',//FTP鏈嶅姟鍣ㄥ湴鍧� } }, -- Gitblit v1.9.3