From 1bcee828a3340d5f5642b3dbcf4cd9733072b7aa Mon Sep 17 00:00:00 2001
From: 啊鑫 <t2856754968@163.com>
Date: 星期一, 21 七月 2025 14:24:35 +0800
Subject: [PATCH] LLJ检验结果录入优化:添加自动保存和回车保存功能

---
 /dev/null               |  296 ------------------------------------------
 pages/QC/LLJ/detail.vue |   84 ++++++++++++
 2 files changed, 84 insertions(+), 296 deletions(-)

diff --git "a/FTP\346\226\207\344\273\266\346\223\215\344\275\234\346\216\245\345\217\243\346\226\207\346\241\243-\346\233\264\346\226\260\347\211\210.md" "b/FTP\346\226\207\344\273\266\346\223\215\344\275\234\346\216\245\345\217\243\346\226\207\346\241\243-\346\233\264\346\226\260\347\211\210.md"
deleted file mode 100644
index 1e5bb22..0000000
--- "a/FTP\346\226\207\344\273\266\346\223\215\344\275\234\346\216\245\345\217\243\346\226\207\346\241\243-\346\233\264\346\226\260\347\211\210.md"
+++ /dev/null
@@ -1,296 +0,0 @@
-# 闄勪欢绠$悊绯荤粺 - FTP鏂囦欢鎿嶄綔鎺ュ彛鏂囨。 (鏇存柊鐗�)
-
-## 馃毃 閲嶈鏇存柊锛欳ORS璺ㄥ煙闂瑙e喅鏂规
-
-### 闂鎻忚堪
-鍦℉5鐜涓娇鐢� `DownloadFtpFile` 鎺ュ彛鏃跺嚭鐜颁互涓嬮敊璇細
-```
-Refused to get unsafe header "content-disposition"
-```
-
-### 鍘熷洜鍒嗘瀽
-杩欐槸鐢变簬娴忚鍣ㄧ殑CORS锛堣法鍩熻祫婧愬叡浜級瀹夊叏绛栫暐瀵艰嚧鐨勶紝娴忚鍣ㄩ樆姝簡鍓嶇璁块棶鏌愪簺HTTP鍝嶅簲澶淬��
-
-### 瑙e喅鏂规
-
-#### 鍚庣CORS閰嶇疆锛堝繀椤伙級
-鍚庣鎺ュ彛蹇呴』璁剧疆浠ヤ笅CORS鍝嶅簲澶达細
-
-```http
-Access-Control-Allow-Origin: *
-Access-Control-Allow-Methods: GET, POST, OPTIONS
-Access-Control-Allow-Headers: Content-Type, Authorization
-Access-Control-Expose-Headers: Content-Disposition, Content-Length, Content-Type
-```
-
-**鍏抽敭鐐�**: `Access-Control-Expose-Headers` 蹇呴』鍖呭惈 `Content-Disposition`锛屽惁鍒欏墠绔棤娉曡鍙栨枃浠跺悕淇℃伅銆�
-
-#### 鍓嶇澶氱幆澧冨吋瀹癸紙宸插疄鐜帮級
-鍓嶇浠g爜宸叉洿鏂颁负澶氱幆澧冨吋瀹癸細
-
-1. **H5鐜**: 浣跨敤澶氱涓嬭浇鏂瑰紡鐨勯檷绾х瓥鐣�
-   - 鏂规硶1: `<a>` 鏍囩涓嬭浇
-   - 鏂规硶2: `window.open` 涓嬭浇
-   - 鏂规硶3: `fetch` + `blob` 涓嬭浇
-
-2. **APP鐜**: 浣跨敤 `uni.downloadFile` 
-3. **灏忕▼搴忕幆澧�**: 浣跨敤 `uni.downloadFile`
-
----
-
-## 鍩虹淇℃伅
-- **鏈嶅姟鍣ㄥ湴鍧�**: `http://36.26.21.214:10054/api`
-- **FTP鏈嶅姟鍣�**: `ftp://36.26.21.214`
-- **妯″潡**: LLJ (鏉ユ枡妫�楠�)
-
----
-
-## 1. 鑾峰彇闄勪欢鍒楄〃
-
-### 鎺ュ彛淇℃伅
-- **URL**: `/LLJ/getAttachments`
-- **鏂规硶**: `POST`
-- **鐢ㄩ��**: 鑾峰彇鎸囧畾妫�楠屽崟鐨勯檮浠跺垪琛�
-
-### 璇锋眰鍙傛暟
-```json
-{
-  "releaseNo": "妫�楠屽崟鍙�"
-}
-```
-
-### 鍝嶅簲鏍煎紡
-```json
-{
-  "status": 0,
-  "message": "鎴愬姛",
-  "data": {
-    "tbBillList": [
-      {
-        "id": 123456,
-        "itemNo": "鐗╂枡缂栧彿",
-        "fattach": "闄勪欢鏂囦欢鍚�.pdf",
-        "ftype": "鏂囦欢绫诲瀷",
-        "fversion": "鐗堟湰鍙�",
-        "fdate": "鍙楁帶鏃ユ湡",
-        "createBy": "涓婁紶浜�",
-        "createDate": "涓婁紶鏃堕棿"
-      }
-    ]
-  }
-}
-```
-
----
-
-## 2. 棰勮FTP鏂囦欢
-
-### 鎺ュ彛淇℃伅
-- **URL**: `/LLJ/PreviewFtpFile`
-- **鏂规硶**: `GET`
-- **鐢ㄩ��**: 鑾峰彇FTP鏈嶅姟鍣ㄤ笂鏂囦欢鐨勯瑙堟祦
-
-### 璇锋眰鍙傛暟
-| 鍙傛暟鍚� | 绫诲瀷 | 蹇呭~ | 璇存槑 |
-|--------|------|------|------|
-| itemNo | string | 鏄� | 鐗╂枡缂栧彿 |
-| fileName | string | 鏄� | 鏂囦欢鍚嶏紙闇�URL缂栫爜锛� |
-| ftpServer | string | 鏄� | FTP鏈嶅姟鍣ㄥ湴鍧� `ftp://36.26.21.214` |
-
-### CORS閰嶇疆瑕佹眰
-```http
-Access-Control-Allow-Origin: *
-Access-Control-Allow-Methods: GET, OPTIONS
-Access-Control-Allow-Headers: Content-Type
-Access-Control-Expose-Headers: Content-Type, Content-Length
-```
-
-### 鏀寔鐨勬枃浠剁被鍨�
-- **PDF鏂囦欢**: `pdf`
-- **鍥剧墖鏂囦欢**: `jpg`, `jpeg`, `png`, `gif`, `bmp`, `webp`
-- **鏂囨湰鏂囦欢**: `txt`, `log`, `md`, `csv`
-- **Office鏂囨。**: `doc`, `docx`, `xls`, `xlsx`, `ppt`, `pptx`
-
----
-
-## 3. 涓嬭浇FTP鏂囦欢 猸� 閲嶇偣鏇存柊
-
-### 鎺ュ彛淇℃伅
-- **URL**: `/LLJ/DownloadFtpFile`
-- **鏂规硶**: `GET`
-- **鐢ㄩ��**: 浠嶧TP鏈嶅姟鍣ㄤ笅杞芥枃浠�
-
-### 璇锋眰鍙傛暟
-| 鍙傛暟鍚� | 绫诲瀷 | 蹇呭~ | 璇存槑 |
-|--------|------|------|------|
-| itemNo | string | 鏄� | 鐗╂枡缂栧彿 |
-| fileName | string | 鏄� | 鏂囦欢鍚嶏紙闇�URL缂栫爜锛� |
-| ftpServer | string | 鏄� | FTP鏈嶅姟鍣ㄥ湴鍧� `ftp://36.26.21.214` |
-
-### 鈿狅笍 鍏抽敭CORS閰嶇疆
-```http
-Access-Control-Allow-Origin: *
-Access-Control-Allow-Methods: GET, OPTIONS
-Access-Control-Allow-Headers: Content-Type, Authorization
-Access-Control-Expose-Headers: Content-Disposition, Content-Length, Content-Type
-```
-
-### 鍝嶅簲澶磋姹�
-```http
-Content-Type: application/octet-stream (鎴栧叿浣撶殑MIME绫诲瀷)
-Content-Disposition: attachment; filename="鏂囦欢鍚�.pdf"
-Content-Length: 鏂囦欢澶у皬
-Access-Control-Allow-Origin: *
-Access-Control-Expose-Headers: Content-Disposition, Content-Length, Content-Type
-```
-
-### 鍓嶇澶勭悊绛栫暐
-```javascript
-// H5鐜锛氬绉嶄笅杞芥柟寮�
-1. <a> 鏍囩涓嬭浇 (棣栭��)
-2. window.open 涓嬭浇 (澶囬��)
-3. fetch + blob 涓嬭浇 (鍏滃簳)
-
-// APP/灏忕▼搴忕幆澧冿細
-uni.downloadFile (鍘熺敓涓嬭浇)
-```
-
----
-
-## 4. 瀹炵幇寤鸿
-
-### 鍚庣CORS涓棿浠堕厤缃ず渚�
-
-#### .NET Core 绀轰緥
-```csharp
-public void ConfigureServices(IServiceCollection services)
-{
-    services.AddCors(options =>
-    {
-        options.AddPolicy("AllowAll",
-            builder =>
-            {
-                builder
-                    .AllowAnyOrigin()
-                    .AllowAnyMethod()
-                    .AllowAnyHeader()
-                    .WithExposedHeaders("Content-Disposition", "Content-Length", "Content-Type");
-            });
-    });
-}
-
-public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
-{
-    app.UseCors("AllowAll");
-}
-```
-
-#### Express.js 绀轰緥
-```javascript
-app.use((req, res, next) => {
-    res.header('Access-Control-Allow-Origin', '*');
-    res.header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
-    res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization');
-    res.header('Access-Control-Expose-Headers', 'Content-Disposition, Content-Length, Content-Type');
-    next();
-});
-```
-
-### 鏂囦欢涓嬭浇鍝嶅簲绀轰緥
-```http
-HTTP/1.1 200 OK
-Content-Type: application/pdf
-Content-Disposition: attachment; filename="娴嬭瘯鏂囨。.pdf"
-Content-Length: 1024000
-Access-Control-Allow-Origin: *
-Access-Control-Expose-Headers: Content-Disposition, Content-Length, Content-Type
-
-[鏂囦欢浜岃繘鍒舵暟鎹甝
-```
-
----
-
-## 5. 鏁呴殰鎺掗櫎
-
-### 甯歌闂鍙婅В鍐虫柟妗�
-
-#### 闂1: "Refused to get unsafe header"
-**鍘熷洜**: 鍚庣鏈缃� `Access-Control-Expose-Headers`
-**瑙e喅**: 娣诲姞 `Access-Control-Expose-Headers: Content-Disposition, Content-Length, Content-Type`
-
-#### 闂2: CORS棰勬璇锋眰澶辫触
-**鍘熷洜**: 鍚庣鏈鐞� OPTIONS 璇锋眰
-**瑙e喅**: 娣诲姞 OPTIONS 鏂规硶鏀寔鍜岀浉搴旂殑CORS澶�
-
-#### 闂3: 鏂囦欢涓嬭浇浣嗘枃浠跺悕涔辩爜
-**鍘熷洜**: Content-Disposition 涓殑鏂囦欢鍚嶇紪鐮侀棶棰�
-**瑙e喅**: 浣跨敤 UTF-8 缂栫爜鎴� RFC 5987 鏍煎紡
-```http
-Content-Disposition: attachment; filename*=UTF-8''%E6%B5%8B%E8%AF%95%E6%96%87%E6%A1%A3.pdf
-```
-
-#### 闂4: 澶ф枃浠朵笅杞借秴鏃�
-**鍘熷洜**: 鏈嶅姟鍣ㄦ垨缃戠粶瓒呮椂
-**瑙e喅**: 
-- 澧炲姞鏈嶅姟鍣ㄨ秴鏃惰缃�
-- 瀹炵幇鏂偣缁紶
-- 鎻愪緵鍒嗙墖涓嬭浇
-
----
-
-## 6. 娴嬭瘯鏂规
-
-### 娴嬭瘯鐜
-1. **H5鐜**: Chrome, Safari, Firefox
-2. **APP鐜**: Android, iOS 鍘熺敓搴旂敤
-3. **灏忕▼搴忕幆澧�**: 寰俊灏忕▼搴�
-
-### 娴嬭瘯鐢ㄤ緥
-```javascript
-// 娴嬭瘯CORS閰嶇疆
-fetch('http://36.26.21.214:10054/api/LLJ/DownloadFtpFile?itemNo=TEST&fileName=test.pdf&ftpServer=ftp%3A//36.26.21.214', {
-    method: 'GET'
-})
-.then(response => {
-    console.log('Content-Disposition:', response.headers.get('Content-Disposition'));
-    // 搴旇鑳芥甯歌幏鍙栧埌鏂囦欢鍚�
-})
-.catch(error => {
-    console.error('CORS Error:', error);
-});
-```
-
----
-
-## 7. 鐩戞帶涓庢棩蹇�
-
-### 寤鸿鐩戞帶鎸囨爣
-- 涓嬭浇鎴愬姛鐜�
-- 涓嬭浇鑰楁椂
-- CORS閿欒棰戠巼
-- 鏂囦欢涓嶅瓨鍦ㄩ敊璇鐜�
-
-### 鏃ュ織璁板綍寤鸿
-```javascript
-// 璁板綍涓嬭浇璇锋眰
-{
-    "timestamp": "2025-07-20T10:00:00Z",
-    "method": "DownloadFtpFile",
-    "itemNo": "ABC123",
-    "fileName": "test.pdf",
-    "userAgent": "Mozilla/5.0...",
-    "success": true,
-    "errorCode": null,
-    "responseTime": 1500
-}
-```
-
----
-
-**鏂囨。鐗堟湰**: v2.0 (CORS鏇存柊鐗�)  
-**鏈�鍚庢洿鏂�**: 2025-07-20  
-**鏇存柊鍐呭**: 
-- 鏂板CORS璺ㄥ煙闂瑙e喅鏂规
-- 鏇存柊鍓嶇澶氱幆澧冧笅杞界瓥鐣�
-- 娣诲姞鍚庣CORS閰嶇疆绀轰緥
-- 瀹屽杽鏁呴殰鎺掗櫎鎸囧崡
\ No newline at end of file
diff --git a/pages/QC/LLJ/detail.vue b/pages/QC/LLJ/detail.vue
index 68272a8..41783ec 100644
--- a/pages/QC/LLJ/detail.vue
+++ b/pages/QC/LLJ/detail.vue
@@ -142,6 +142,7 @@
 							</button>
 							<input v-if="(tableData.length < formData.checkQyt) && formData.fupAllow && formData.fdownAllow"
 								@input="onNumberInput"
+								@confirm="onEnterSave"
 								v-model="formData.fcheckResu"
 								type="text"
 								class="result-input"
@@ -149,6 +150,7 @@
 								placeholder-class="placeholder" />
 							<input v-else
 								@input="search($event)"
+								@confirm="onEnterSave"
 								v-model="inputTxt"
 								type="text"
 								class="result-input"
@@ -181,6 +183,7 @@
 						<view class="input-wrapper" style="margin-top: 15px;">
 
 							<input v-if="(tableData.length < formData.checkQyt)" @input="search($event)"
+								@confirm="onEnterSave"
 								v-model="inputTxt" type="text" class="result-input" placeholder="璇疯緭鍏ユ楠岀粨鏋�..."
 								placeholder-class="placeholder" />
 							<button v-if="(tableData.length < formData.checkQyt)"
@@ -290,9 +293,75 @@
 				meomPopup: false,
 				showMeom:false,
 				meom: '',
+				autoSaveTimer: null, // 鑷姩淇濆瓨瀹氭椂鍣�
 			}
 		},
 		methods: {
+			// 闃叉姈鑷姩淇濆瓨鏂规硶
+			autoSaveResult() {
+				// 娓呴櫎涔嬪墠鐨勫畾鏃跺櫒
+				if (this.autoSaveTimer) {
+					clearTimeout(this.autoSaveTimer);
+				}
+				
+				// 璁剧疆鏂扮殑瀹氭椂鍣紝1绉掑悗鑷姩淇濆瓨
+				this.autoSaveTimer = setTimeout(() => {
+					// 妫�鏌ユ槸鍚﹀凡缁忚揪鍒版楠屾暟閲忎笂闄�
+					if (this.tableData.length >= this.formData.checkQyt) {
+						return;
+					}
+					
+					// 楠岃瘉杈撳叆骞朵繚瀛�
+					if (this.validateAndSave()) {
+						this.saveResult();
+					}
+				}, 2000);
+			},
+			
+			// 楠岃瘉杈撳叆鏄惁鏈夋晥
+			validateAndSave() {
+				// 鏈変笂涓嬮檺鐨勬儏鍐�
+				if (this.formData.fupAllow && this.formData.fdownAllow) {
+					const value = this.formData.fcheckResu;
+					if (!value || value.trim() === '') {
+						return false;
+					}
+					
+					// 楠岃瘉鏄惁涓烘湁鏁堟暟瀛�
+					if (isNaN(parseFloat(value)) || !/^-?\d+(\.\d+)?$/.test(value)) {
+						return false;
+					}
+					
+					return true;
+				} else {
+					// 鏃犱笂涓嬮檺鐨勬儏鍐碉紝妫�楠岀粨鏋滃瓨鍌ㄥ湪 formData.fcheckResu 涓�
+					const value = this.formData.fcheckResu;
+					if (!value || value.trim() === '') {
+						return false;
+					}
+					
+					return true;
+				}
+			},
+			
+			// 澶勭悊鍥炶溅閿繚瀛樹簨浠�
+			onEnterSave() {
+				// 妫�鏌ユ槸鍚﹀凡缁忚揪鍒版楠屾暟閲忎笂闄�
+				if (this.tableData.length >= this.formData.checkQyt) {
+					this.$showMessage("宸茶揪鍒版楠屾暟閲忎笂闄�");
+					return;
+				}
+				
+				// 娓呴櫎鑷姩淇濆瓨瀹氭椂鍣�
+				if (this.autoSaveTimer) {
+					clearTimeout(this.autoSaveTimer);
+					this.autoSaveTimer = null;
+				}
+				
+				// 鐩存帴淇濆瓨缁撴灉
+				this.saveResult();
+			},
+			
 			switchTab(index, mainIds) {
 				this.currentTab = index
 				this.mainId = mainIds;
@@ -377,6 +446,10 @@
 			//妫�娴嬭緭鍏ユ鐨勮緭鍏ワ紝骞剁粰鍙橀噺璧嬪��
 			search(event) {
 				this.formData.fcheckResu = event.detail.value;
+				this.inputTxt = event.detail.value;
+				
+				// 瑙﹀彂鑷姩淇濆瓨
+				this.autoSaveResult();
 			},
 			onNumberInput(e) {
 				// 鍙厑璁歌緭鍏ユ暟瀛楀拰灏忔暟鐐�
@@ -385,6 +458,9 @@
 				val = val.replace(/\.{2,}/g, '.');
 				val = val.replace('.', '$#$').replace(/\./g, '').replace('$#$', '.');
 				this.formData.fcheckResu = val;
+				
+				// 瑙﹀彂鑷姩淇濆瓨
+				this.autoSaveResult();
 			},
 			toggleResult(item) {
 				let fstand = "鈭�";
@@ -699,6 +775,14 @@
 			this.$nextTick(() => {
 				this.validateBatchInput();
 			});
+		},
+		
+		// 椤甸潰鍗歌浇鏃舵竻闄ゅ畾鏃跺櫒
+		onUnload() {
+			if (this.autoSaveTimer) {
+				clearTimeout(this.autoSaveTimer);
+				this.autoSaveTimer = null;
+			}
 		}
 	}
 </script>

--
Gitblit v1.9.3