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