From f29f358f589f5b1c2589c07b65845650be7aafef Mon Sep 17 00:00:00 2001
From: 647556386 <647556386@qq.com>
Date: 星期一, 08 十二月 2025 21:21:08 +0800
Subject: [PATCH] 代码优化

---
 项目代码/WIDESEA_WMSClient/src/extension/outbound/extend/NoStockOut.vue |  176 +++++++++++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 141 insertions(+), 35 deletions(-)

diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/outbound/extend/NoStockOut.vue" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/outbound/extend/NoStockOut.vue"
index 95df14e..7e80215 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/outbound/extend/NoStockOut.vue"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/outbound/extend/NoStockOut.vue"
@@ -10,7 +10,12 @@
     >
       <div>
         <!-- 鍗曟嵁杈撳叆鍖哄煙锛堟敮鎸佹壂鐮侊級 -->
-        <el-form :inline="true" :model="orderForm" style="margin-bottom: 20px; align-items: flex-end;">
+        <el-form 
+          :inline="true" 
+          :model="orderForm" 
+          style="margin-bottom: 20px; align-items: flex-end;"
+          @submit.prevent
+        >
           <el-form-item label="鍑哄簱鍗曟嵁:" name="outboundOrderNo">
             <el-input
               v-model="orderForm.outboundOrderNo"
@@ -18,25 +23,35 @@
               clearable
               style="width: 220px; margin-right: 10px;"
               @input="handleOutboundInput"
-              @keyup.enter="focusPurchaseInput"
+              @keyup.enter="(e) => {
+                e.stopPropagation(); // 闃绘浜嬩欢鍐掓场
+                e.preventDefault(); // 闃绘榛樿琛屼负
+                focusBarcodeInputDirectly();
+              }"
               ref="outboundInputRef"
             ></el-input>
           </el-form-item>
           <el-form-item label="閲囪喘鍗曟嵁:" name="purchaseOrderNo">
             <el-input
               v-model="orderForm.purchaseOrderNo"
-              placeholder="璇疯緭鍏ユ垨鎵弿閲囪喘鍗曟嵁鍙�"
+              placeholder="鎵爜鏉$爜鍚庤嚜鍔ㄥ~鍏�"
               clearable
               style="width: 220px; margin-right: 10px;"
               @input="handlePurchaseInput"
-              @keyup.enter="focusBarcodeInput"
+              readonly
               ref="purchaseInputRef"
             ></el-input>
           </el-form-item>
         </el-form>
 
         <!-- 涓婃柟杈撳叆妗� -->
-        <el-form :inline="true" :model="formData" ref="formRef" style="margin-bottom: 20px; align-items: flex-end;">
+        <el-form 
+          :inline="true" 
+          :model="formData" 
+          ref="formRef" 
+          style="margin-bottom: 20px; align-items: flex-end;"
+          @submit.prevent  
+        >
           <el-form-item
             label="鎵弿鏉$爜:"
             style="width: 80%"
@@ -47,10 +62,10 @@
               ref="barcodeInputRef"
               v-model="formData.barcode"
               placeholder="璇蜂娇鐢ㄦ壂鐮佹灙鎵弿鏉$爜锛屾垨鎵嬪姩杈撳叆"
-              @keyup.enter="handleScan"
+              @keydown.enter="debouncedHandleScan" 
               autofocus
               class="custom-input"
-              :disabled="!orderForm.outboundOrderNo || !orderForm.purchaseOrderNo"
+              :disabled="!orderForm.outboundOrderNo || loading"
             ></el-input>
           </el-form-item>
           <el-form-item>
@@ -59,7 +74,7 @@
               size="small" 
               @click="handleScan" 
               class="custom-button"
-              :disabled="!orderForm.outboundOrderNo || !orderForm.purchaseOrderNo || loading"
+              :disabled="!orderForm.outboundOrderNo || loading"
             >
               <Search /> 纭鎵弿
             </el-button>
@@ -87,7 +102,7 @@
                   </div>
                 </transition-group>
                 <div class="empty-tip" v-if="scannedBarcodes.length === 0">
-                  <span>鏆傛棤鎵弿璁板綍锛岃鍏堣緭鍏ュ崟鎹悗鎵弿鏉$爜</span>
+                  <span>鏆傛棤鎵弿璁板綍锛岃鍏堣緭鍏ュ嚭搴撳崟鎹悗鎵弿鏉$爜</span>
                 </div>
               </el-scrollbar>
             </div>
@@ -106,7 +121,17 @@
           >
             <Check /> 鎻愪氦鍑哄簱
           </el-button>
-          <el-button type="text" size="small" @click="showDetailBox = false" class="cancel-btn" :disabled="loading">
+          <el-button 
+            type="text" 
+            size="small" 
+            @click="(e) => {
+              e.stopPropagation();
+              e.preventDefault();
+              showDetailBox = false;
+            }" 
+            class="cancel-btn" 
+            :disabled="loading"
+          >
             鍙栨秷
           </el-button>
         </div>
@@ -116,9 +141,9 @@
 </template>
 
 <script setup>
-import { ref, reactive, onMounted, nextTick } from 'vue';
+import { ref, reactive, onMounted, nextTick, watch } from 'vue';
 import { ElMessage } from 'element-plus';
-import { Search } from '@element-plus/icons-vue';
+import { Search, Check } from '@element-plus/icons-vue';
 
 import VolBox from "@/components/basic/VolBox.vue";
 import http from '@/api/http';
@@ -134,6 +159,8 @@
 });
 const scannedBarcodes = ref([]);
 const loading = ref(false);
+// 鏂板锛氬瓨鍌ㄩ娆℃壂鎻忕殑閲囪喘鍗曞彿锛堢敤浜庝竴鑷存�ф牎楠岋級
+const firstPurchaseOrderNo = ref(null);
 
 // 妯℃澘寮曠敤
 const formRef = ref(null);
@@ -148,6 +175,25 @@
   });
 });
 
+// 鐩戝惉鎵弿鍒楄〃锛岃嫢涓虹┖鍒欓噸缃娆¢噰璐崟鍙�
+watch(scannedBarcodes, (newVal) => {
+  if (newVal.length === 0) {
+    firstPurchaseOrderNo.value = null;
+    orderForm.purchaseOrderNo = ""; // 鍚屾娓呯┖閲囪喘鍗曡緭鍏ユ
+  }
+}, { deep: true });
+
+// 绠�鍗曢槻鎶栧嚱鏁帮紙鏃犻渶渚濊禆lodash锛�
+const debounce = (fn, delay = 100) => {
+  let timer = null;
+  return (...args) => {
+    if (timer) clearTimeout(timer);
+    timer = setTimeout(() => {
+      fn.apply(this, args);
+    }, delay);
+  };
+};
+
 // 鎵撳紑寮圭獥
 const open = () => {
   showDetailBox.value = true;
@@ -155,6 +201,8 @@
   formData.barcode = "";
   orderForm.outboundOrderNo = "";
   orderForm.purchaseOrderNo = "";
+  // 閲嶇疆棣栨閲囪喘鍗曞彿
+  firstPurchaseOrderNo.value = null;
   nextTick(() => {
     outboundInputRef.value?.focus();
   });
@@ -162,43 +210,55 @@
 
 // 鍑哄簱鍗曡緭鍏ュ鐞嗭紙鎵爜鎴栨墜鍔ㄨ緭鍏ワ級
 const handleOutboundInput = (value) => {
-  // 鎵爜鏋緭鍏ラ�氬父浼氳嚜鍔ㄨЕ鍙慹nter浜嬩欢锛岃繖閲屼富瑕佸鐞嗘墜鍔ㄨ緭鍏ョ殑鎯呭喌
   if (value && value.trim()) {
-    // 鍙互鍦ㄨ繖閲屾坊鍔犲嚭搴撳崟鍙风殑鏍煎紡楠岃瘉閫昏緫
+    // 鍑哄簱鍗曞彿鏍煎紡楠岃瘉閫昏緫锛堟寜闇�淇濈暀锛�
   }
 };
 
 // 閲囪喘鍗曡緭鍏ュ鐞嗭紙鎵爜鎴栨墜鍔ㄨ緭鍏ワ級
 const handlePurchaseInput = (value) => {
   if (value && value.trim()) {
-    // 鍙互鍦ㄨ繖閲屾坊鍔犻噰璐崟鍙风殑鏍煎紡楠岃瘉閫昏緫
+    // 閲囪喘鍗曞彿鏍煎紡楠岃瘉閫昏緫锛堟寜闇�淇濈暀锛�
   }
 };
 
-// 鐒︾偣璺宠浆鍑芥暟
-const focusPurchaseInput = () => {
+// 鐩存帴璺宠浆鍒版潯鐮佽緭鍏ユ锛堟棤闇�鍏堝~閲囪喘鍗曪級
+const focusBarcodeInputDirectly = () => {
   if (orderForm.outboundOrderNo.trim()) {
-    purchaseInputRef.value?.focus();
+    barcodeInputRef.value?.focus();
   } else {
     ElMessage.warning("璇峰厛杈撳叆鏈夋晥鐨勫嚭搴撳崟鎹彿");
   }
 };
 
-const focusBarcodeInput = () => {
-  if (orderForm.purchaseOrderNo.trim()) {
-    barcodeInputRef.value?.focus();
-  } else {
-    ElMessage.warning("璇峰厛杈撳叆鏈夋晥鐨勯噰璐崟鎹彿");
+/**
+ * 鏍规嵁鏉$爜鏌ヨ閲囪喘鍗曟帴鍙o紙瀹屽叏瀵归綈绀轰緥璇锋眰鏍煎紡锛�
+ * @param {string} barcode 鏉$爜
+ * @returns {Promise<string>} 閲囪喘鍗曞彿
+ */
+const getPurchaseOrderByBarcode = async (barcode) => {
+  // 瀹屽叏鎸夌収绀轰緥鏍煎紡锛歶rl鎷兼帴鍙傛暟 + 绗簩涓弬鏁颁紶鎻愮ず鏂囨湰
+  const res = await http.post(`/api/OutboundPicking/GetPurchaseOrderByBarcode?barCode=${encodeURIComponent(barcode)}`, "鏌ヨ閲囪喘鍗曚腑...");
+
+  if (res.status !== true) {
+    throw new Error(res.message || "鏌ヨ閲囪喘鍗曞け璐�");
   }
+  if (!res.data?.purchaseOrderNo) {
+    throw new Error("鏈煡璇㈠埌璇ユ潯鐮佸搴旂殑閲囪喘鍗�");
+  }
+  return res.data.purchaseOrderNo;
 };
 
-// 鎵弿鏉$爜澶勭悊
+// 鎵弿鏉$爜鏍稿績閫昏緫
 const handleScan = async () => {
   if (!formRef.value) return;
+  // 楠岃瘉鏉$爜蹇呭~
   await formRef.value.validateField('barcode');
 
   const barcode = formData.barcode.trim();
-  
+  const outboundOrderNo = orderForm.outboundOrderNo.trim();
+
+  // 妫�鏌ユ潯鐮佹槸鍚﹀凡鎵弿
   if (scannedBarcodes.value.some(item => item.barcode === barcode)) {
     ElMessage.warning(`鏉$爜 ${barcode} 宸叉壂鎻忚繃锛岃鍕块噸澶嶆壂鎻廯);
     formData.barcode = "";
@@ -208,33 +268,72 @@
 
   try {
     loading.value = true;
-    // 杩欓噷淇濈暀浜嗗師鏈夌殑鏉$爜楠岃瘉鎺ュ彛锛屼綘鍙互鏍规嵁瀹為檯闇�姹備慨鏀规垨淇濈暀
-    const res = await http.post("/api/OutboundPicking/BarcodeValidate", {
-      outOder: orderForm.outboundOrderNo, // 娉ㄦ剰锛氳繖閲岀幇鍦ㄤ紶閫掔殑鏄崟鎹彿瀛楃涓诧紝鑰屼笉鏄疘D
-      inOder: orderForm.purchaseOrderNo,  // 娉ㄦ剰锛氳繖閲岀幇鍦ㄤ紶閫掔殑鏄崟鎹彿瀛楃涓诧紝鑰屼笉鏄疘D
+
+    // 姝ラ1锛氫粎浼犳潯鐮佹煡璇㈤噰璐崟锛堜娇鐢ㄧず渚嬫牸寮忕殑璇锋眰锛�
+    const purchaseOrderNo = await getPurchaseOrderByBarcode(barcode);
+
+    // 鏍稿績鏍¢獙锛氶噰璐崟涓�鑷存�ф鏌�
+    if (firstPurchaseOrderNo.value) {
+      // 闈為娆℃壂鎻忥紝鏍¢獙閲囪喘鍗曞彿鏄惁涓�鑷�
+      if (purchaseOrderNo !== firstPurchaseOrderNo.value) {
+        throw new Error(`褰撳墠鏉$爜瀵瑰簲鐨勯噰璐崟銆�${purchaseOrderNo}銆戜笌棣栨鎵弿鐨勯噰璐崟銆�${firstPurchaseOrderNo.value}銆戜笉涓�鑷达紝绂佹鎵弿锛乣);
+      }
+    } else {
+      // 棣栨鎵弿锛岃褰曢噰璐崟鍙�
+      firstPurchaseOrderNo.value = purchaseOrderNo;
+    }
+
+    // 璧嬪�奸噰璐崟鍒拌緭鍏ユ
+    orderForm.purchaseOrderNo = purchaseOrderNo;
+    ElMessage.success(`鎴愬姛鏌ヨ鍒伴噰璐崟锛�${purchaseOrderNo}`);
+
+    // 姝ラ2锛氳皟鐢ㄥ師鏈夋潯鐮侀獙璇佹帴鍙o紙濡傞渶瀵归綈鏍煎紡鍙悓姝ヤ慨鏀癸紝姝ゅ淇濈暀鍘熸湁鏍煎紡锛�
+    const validateRes = await http.post("/api/OutboundPicking/BarcodeValidate", {
+      outOder: outboundOrderNo,
+      inOder: purchaseOrderNo,
       barCode: barcode
     });
 
-    if (res.status === true) {
+    if (validateRes.status === true) {
       scannedBarcodes.value.push({ barcode });
       ElMessage.success("鎵弿鎴愬姛");
       formData.barcode = "";
     } else {
-      ElMessage.error("鎵弿澶辫触锛�" + (res.message || '楠岃瘉澶辫触'));
+      ElMessage.error("鎵弿澶辫触锛�" + (validateRes.message || '鏉$爜楠岃瘉澶辫触'));
     }
   } catch (error) {
-    ElMessage.error("鎵弿楠岃瘉寮傚父锛�" + error.message);
+    // 鎹曡幏閲囪喘鍗曚笉涓�鑷寸瓑閿欒骞舵彁绀�
+    ElMessage.error(error.message);
+    // 娓呯┖褰撳墠杈撳叆妗嗭紝鑱氱劍鏉$爜杈撳叆妗�
+    formData.barcode = "";
+    nextTick(() => barcodeInputRef.value?.focus());
   } finally {
     loading.value = false;
-    nextTick(() => barcodeInputRef.value?.focus());
+    // 寮哄埗鑱氱劍鏉$爜杈撳叆妗嗭紝閬垮厤鐒︾偣璺冲埌寮圭獥澶�
+    nextTick(() => {
+      if (barcodeInputRef.value) {
+        barcodeInputRef.value.focus();
+        // 娓呯┖杈撳叆妗嗛�変腑鐘舵�侊紙鎵爜鏋彲鑳芥畫鐣欓�変腑锛�
+        if (barcodeInputRef.value.input) {
+          barcodeInputRef.value.input.select = () => {};
+        }
+      }
+    });
   }
 };
+
+// 甯﹂槻鎶栧拰浜嬩欢鎷︽埅鐨勬壂鎻忓鐞嗭紙閫傞厤鎵爜鏋級
+const debouncedHandleScan = debounce(async (e) => {
+  // 闃绘浜嬩欢鍐掓场鍜岄粯璁よ涓�
+  e.stopPropagation();
+  e.preventDefault();
+  await handleScan();
+}, 100);
 
 // 绉婚櫎鍗曟潯鎵弿璁板綍
 const removeItem = async (index, barcode) => {
   try {
     loading.value = true;
-    // 杩欓噷淇濈暀浜嗗師鏈夌殑鍒犻櫎鏉$爜鎺ュ彛锛屼綘鍙互鏍规嵁瀹為檯闇�姹備慨鏀规垨淇濈暀
     const res = await http.post("/api/OutboundPicking/DeleteBarcode", {
       outOder: orderForm.outboundOrderNo,
       inOder: orderForm.purchaseOrderNo,
@@ -244,6 +343,11 @@
     if (res.status === true) {
       scannedBarcodes.value.splice(index, 1);
       ElMessage.success("鍒犻櫎鎴愬姛");
+      // 鑻ュ垹闄ゅ悗鏃犳潯鐮侊紝鑷姩閲嶇疆棣栨閲囪喘鍗曞彿鍜岄噰璐崟杈撳叆妗�
+      if (scannedBarcodes.value.length === 0) {
+        firstPurchaseOrderNo.value = null;
+        orderForm.purchaseOrderNo = "";
+      }
     } else {
       ElMessage.error("鍒犻櫎澶辫触锛�" + (res.message || '鍒犻櫎澶辫触'));
     }
@@ -265,7 +369,6 @@
 
   try {
     loading.value = true;
-    // 杩欓噷淇濈暀浜嗗師鏈夌殑鎻愪氦鎺ュ彛锛屾敞鎰忓弬鏁扮幇鍦ㄤ紶閫掔殑鏄崟鎹彿瀛楃涓�
     const res = await http.post("/api/OutboundPicking/NoStockOutSubmit", {
       OutOderSubmit: orderForm.outboundOrderNo,
       InOderSubmit: orderForm.purchaseOrderNo,
@@ -275,6 +378,9 @@
     if (res.status === true) {
       ElMessage.success("鍑哄簱鎻愪氦鎴愬姛");
       showDetailBox.value = false;
+      // 鎻愪氦鎴愬姛鍚庨噸缃姸鎬�
+      firstPurchaseOrderNo.value = null;
+      scannedBarcodes.value = [];
     } else {
       ElMessage.error("鍑哄簱鎻愪氦澶辫触锛�" + (res.message || '鎻愪氦澶辫触'));
     }

--
Gitblit v1.9.3