From d741e7a7ad7de5045e5c6b6145d9da1783cadecd Mon Sep 17 00:00:00 2001
From: heshaofeng <heshaofeng@hnkhzn.com>
Date: 星期二, 13 一月 2026 09:55:03 +0800
Subject: [PATCH] Merge branch 'htq20251215' of http://115.159.85.185:8098/r/ZhongRui/ALDbanyunxiangmu into htq20251215
---
项目代码/WIDESEA_WMSClient/src/extension/outbound/extend/NoStockOut.vue | 422 +++++++++++++++++++++++++++++++++++++++++-----------
1 files changed, 328 insertions(+), 94 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..157c95f 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"
@@ -8,9 +8,22 @@
title="铏氭嫙鍑哄叆搴�"
class="custom-vol-box"
>
+ <!-- 鎻愪氦閬僵灞傦細瑕嗙洊鏁翠釜寮圭獥鍐呭鍖哄煙 -->
+ <div class="submit-mask" v-show="submitLoading">
+ <div class="mask-content">
+ <el-loading-spinner class="loading-icon" />
+ <span class="loading-text">姝e湪鎻愪氦鍑哄簱锛岃绋嶅��...</span>
+ </div>
+ </div>
+
<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 +31,33 @@
clearable
style="width: 220px; margin-right: 10px;"
@input="handleOutboundInput"
- @keyup.enter="focusPurchaseInput"
+ @keyup.enter="validateOutboundOrder"
ref="outboundInputRef"
+ :disabled="loading || submitLoading"
></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"
+ :disabled="submitLoading"
></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 +68,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 || submitLoading"
></el-input>
</el-form-item>
<el-form-item>
@@ -59,14 +80,14 @@
size="small"
@click="handleScan"
class="custom-button"
- :disabled="!orderForm.outboundOrderNo || !orderForm.purchaseOrderNo || loading"
+ :disabled="!orderForm.outboundOrderNo || loading || submitLoading"
>
<Search /> 纭鎵弿
</el-button>
</el-form-item>
</el-form>
- <!-- 涓嬫柟鏄剧ず妗� -->
+ <!-- 涓嬫柟鏄剧ず妗嗭紙鐩存帴娓叉煋鍚庣杩斿洖鐨勬暟缁勶級 -->
<div class="scan-list">
<el-card shadow="hover" style="margin-bottom: 10px; border: none;" class="custom-card">
<div class="card-header">
@@ -75,19 +96,48 @@
<div class="card-body">
<el-scrollbar height="400px" class="custom-scrollbar">
<transition-group name="barcode-item-transition">
- <div class="barcode-item" v-for="(item, index) in scannedBarcodes" :key="item.barcode" :data-index="index">
- <span class="barcode-text">{{ index + 1 }}. {{ item.barcode }}</span>
+ <div class="barcode-item" v-for="(item, index) in scannedBarcodes" :key="`${item.barcode}-${index}`" :data-index="index">
+ <div class="barcode-detail">
+ <div class="detail-row">
+ <span class="label">鏉$爜锛�</span>
+ <span class="value">{{ item.barcode || '-' }}</span>
+ </div>
+ <div class="detail-row">
+ <span class="label">鐗╂枡缂栫爜锛�</span>
+ <span class="value">{{ item.materielCode || '-' }}</span>
+ </div>
+ <div class="detail-row">
+ <span class="label">鐗╂枡鍚嶇О锛�</span>
+ <span class="value">{{ item.materielName || '-' }}</span>
+ </div>
+ <div class="detail-row">
+ <span class="label">鎵规鍙凤細</span>
+ <span class="value">{{ item.batchNo || '-' }}</span>
+ </div>
+ <div class="detail-row">
+ <span class="label">鏉$爜鏁伴噺锛�</span>
+ <span class="value">{{ item.orderQuantity || item.quantity || 0 }}</span>
+ </div>
+ <div class="detail-row">
+ <span class="label">渚涘簲鍟嗙紪鐮侊細</span>
+ <span class="value">{{ item.supplyCode || '-' }}</span>
+ </div>
+ <div class="detail-row">
+ <span class="label">閲囪喘鍗曞彿锛�</span>
+ <span class="value">{{ item.purchaseOrderNo || '-' }}</span>
+ </div>
+ </div>
<el-button
class="delete-btn"
@click="removeItem(index, item.barcode)"
icon="Delete"
circle
- :disabled="loading"
+ :disabled="loading || submitLoading"
></el-button>
</div>
</transition-group>
<div class="empty-tip" v-if="scannedBarcodes.length === 0">
- <span>鏆傛棤鎵弿璁板綍锛岃鍏堣緭鍏ュ崟鎹悗鎵弿鏉$爜</span>
+ <span>鏆傛棤鎵弿璁板綍锛岃鍏堣緭鍏ュ嚭搴撳崟鎹悗鎵弿鏉$爜</span>
</div>
</el-scrollbar>
</div>
@@ -101,12 +151,22 @@
type="primary"
size="small"
@click="submit"
- :disabled="scannedBarcodes.length === 0 || !orderForm.outboundOrderNo || !orderForm.purchaseOrderNo || loading"
+ :disabled="scannedBarcodes.length === 0 || !orderForm.outboundOrderNo || loading || submitLoading"
class="submit-btn"
>
<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 || submitLoading"
+ >
鍙栨秷
</el-button>
</div>
@@ -118,7 +178,7 @@
<script setup>
import { ref, reactive, onMounted, nextTick } 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 +194,8 @@
});
const scannedBarcodes = ref([]);
const loading = ref(false);
+// 鏂板锛氭彁浜や笓灞瀕oading鐘舵�侊紝鎺у埗閬僵灞傛樉绀�
+const submitLoading = ref(false);
// 妯℃澘寮曠敤
const formRef = ref(null);
@@ -148,6 +210,17 @@
});
});
+// 绠�鍗曢槻鎶栧嚱鏁�
+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,95 +228,201 @@
formData.barcode = "";
orderForm.outboundOrderNo = "";
orderForm.purchaseOrderNo = "";
+ submitLoading.value = false; // 鎵撳紑寮圭獥鏃堕噸缃彁浜oading
nextTick(() => {
- outboundInputRef.value?.focus();
+ outboundInputRef.value?.focus(); // 鎵撳紑寮圭獥浠嶈仛鐒﹀嚭搴撳崟杈撳叆妗�
});
};
-// 鍑哄簱鍗曡緭鍏ュ鐞嗭紙鎵爜鎴栨墜鍔ㄨ緭鍏ワ級
-const handleOutboundInput = (value) => {
- // 鎵爜鏋緭鍏ラ�氬父浼氳嚜鍔ㄨЕ鍙慹nter浜嬩欢锛岃繖閲屼富瑕佸鐞嗘墜鍔ㄨ緭鍏ョ殑鎯呭喌
- if (value && value.trim()) {
- // 鍙互鍦ㄨ繖閲屾坊鍔犲嚭搴撳崟鍙风殑鏍煎紡楠岃瘉閫昏緫
- }
-};
-
-// 閲囪喘鍗曡緭鍏ュ鐞嗭紙鎵爜鎴栨墜鍔ㄨ緭鍏ワ級
-const handlePurchaseInput = (value) => {
- if (value && value.trim()) {
- // 鍙互鍦ㄨ繖閲屾坊鍔犻噰璐崟鍙风殑鏍煎紡楠岃瘉閫昏緫
- }
-};
-
-// 鐒︾偣璺宠浆鍑芥暟
-const focusPurchaseInput = () => {
- if (orderForm.outboundOrderNo.trim()) {
- purchaseInputRef.value?.focus();
- } else {
- ElMessage.warning("璇峰厛杈撳叆鏈夋晥鐨勫嚭搴撳崟鎹彿");
- }
-};
-
-const focusBarcodeInput = () => {
- if (orderForm.purchaseOrderNo.trim()) {
- barcodeInputRef.value?.focus();
- } else {
- ElMessage.warning("璇峰厛杈撳叆鏈夋晥鐨勯噰璐崟鎹彿");
- }
-};
-
-// 鎵弿鏉$爜澶勭悊
-const handleScan = async () => {
- if (!formRef.value) return;
- await formRef.value.validateField('barcode');
-
- const barcode = formData.barcode.trim();
-
- if (scannedBarcodes.value.some(item => item.barcode === barcode)) {
- ElMessage.warning(`鏉$爜 ${barcode} 宸叉壂鎻忚繃锛岃鍕块噸澶嶆壂鎻廯);
- formData.barcode = "";
- nextTick(() => barcodeInputRef.value?.focus());
+/**
+ * 楠岃瘉鍑哄簱鍗曟嵁鍙风殑鏈夋晥鎬�
+ * 鏍稿績淇敼锛氶獙璇佹垚鍔熷悗鐩存帴鑱氱劍鏉$爜鎵弿妗嗭紝澶辫触鍒欒仛鐒﹀洖鍑哄簱鍗曡緭鍏ユ
+ */
+const validateOutboundOrder = async () => {
+ const outboundOrderNo = orderForm.outboundOrderNo.trim();
+ if (!outboundOrderNo) {
return;
}
try {
loading.value = true;
- // 杩欓噷淇濈暀浜嗗師鏈夌殑鏉$爜楠岃瘉鎺ュ彛锛屼綘鍙互鏍规嵁瀹為檯闇�姹備慨鏀规垨淇濈暀
- const res = await http.post("/api/OutboundPicking/BarcodeValidate", {
- outOder: orderForm.outboundOrderNo, // 娉ㄦ剰锛氳繖閲岀幇鍦ㄤ紶閫掔殑鏄崟鎹彿瀛楃涓诧紝鑰屼笉鏄疘D
- inOder: orderForm.purchaseOrderNo, // 娉ㄦ剰锛氳繖閲岀幇鍦ㄤ紶閫掔殑鏄崟鎹彿瀛楃涓诧紝鑰屼笉鏄疘D
- barCode: barcode
- });
+ const res = await http.post(
+ `/api/OutboundPicking/GetAvailablePickingOrders?outOrder=`+ outboundOrderNo,
+ "楠岃瘉鍑哄簱鍗曟嵁鍙蜂腑..."
+ );
- if (res.status === true) {
- scannedBarcodes.value.push({ barcode });
- ElMessage.success("鎵弿鎴愬姛");
- formData.barcode = "";
- } else {
- ElMessage.error("鎵弿澶辫触锛�" + (res.message || '楠岃瘉澶辫触'));
+ if (res.status !== true) {
+ // 楠岃瘉澶辫触锛氭竻绌鸿緭鍏ユ锛屾彁绀洪敊璇紝鑱氱劍鍥炲嚭搴撳崟杈撳叆妗�
+ orderForm.outboundOrderNo = "";
+ ElMessage.error(res.message || "鍑哄簱鍗曟嵁鍙烽獙璇佸け璐ワ紝璇锋鏌ュ崟鎹彿鏄惁姝g‘");
+ nextTick(() => {
+ outboundInputRef.value?.focus(); // 澶辫触鑱氱劍鍑哄簱鍗曡緭鍏ユ
+ });
+ return;
}
+
+ // 楠岃瘉鎴愬姛锛氭彁绀虹敤鎴凤紝鐩存帴鑱氱劍鏉$爜鎵弿妗嗭紙鏍稿績淇敼锛�
+ ElMessage.success("鍑哄簱鍗曟嵁鍙烽獙璇侀�氳繃");
+ nextTick(() => {
+ barcodeInputRef.value?.focus(); // 鎴愬姛鐩存帴璺宠浆鍒版潯鐮佹壂鎻忔
+ });
} catch (error) {
- ElMessage.error("鎵弿楠岃瘉寮傚父锛�" + error.message);
+ // 鎺ュ彛寮傚父锛氭竻绌鸿緭鍏ユ锛屾彁绀洪敊璇紝鑱氱劍鍥炲嚭搴撳崟杈撳叆妗�
+ orderForm.outboundOrderNo = "";
+ ElMessage.error(`鍑哄簱鍗曟嵁鍙烽獙璇佸紓甯革細${error.message || "缃戠粶閿欒锛岃閲嶈瘯"}`);
+ nextTick(() => {
+ outboundInputRef.value?.focus(); // 寮傚父鑱氱劍鍑哄簱鍗曡緭鍏ユ
+ });
} finally {
loading.value = false;
- nextTick(() => barcodeInputRef.value?.focus());
}
};
-// 绉婚櫎鍗曟潯鎵弿璁板綍
+// 鍑哄簱鍗曡緭鍏ュ鐞�
+const handleOutboundInput = (value) => {
+ if (value && value.trim()) {
+ // 鍙繚鐣欏嚭搴撳崟鍙锋牸寮忛獙璇侀�昏緫
+ }
+};
+
+// 閲囪喘鍗曡緭鍏ュ鐞�
+const handlePurchaseInput = (value) => {
+ if (value && value.trim()) {
+ // 鍙繚鐣欓噰璐崟鍙锋牸寮忛獙璇侀�昏緫
+ }
+};
+
+// 鑱氱劍鏉$爜杈撳叆妗嗭紙澶嶇敤鍑芥暟锛�
+const focusBarcodeInputDirectly = () => {
+ if (orderForm.outboundOrderNo.trim()) {
+ barcodeInputRef.value?.focus();
+ } else {
+ ElMessage.warning("璇峰厛杈撳叆鏈夋晥鐨勫嚭搴撳崟鎹彿");
+ }
+};
+
+/**
+ * 鏍规嵁鏉$爜鏌ヨ閲囪喘鍗曞彿
+ */
+const getPurchaseOrderByBarcode = async (barcode) => {
+ const res = await http.post(`/api/OutboundPicking/GetPurchaseOrderByBarcode?barCode=${encodeURIComponent(barcode)}`, "鏌ヨ閲囪喘鍗曞彿涓�...");
+
+ if (res.status !== true) {
+ throw new Error(res.message || "鏌ヨ閲囪喘鍗曞彿澶辫触");
+ }
+
+ let purchaseOrderNo = '';
+ if (Array.isArray(res.data) && res.data.length > 0) {
+ purchaseOrderNo = res.data[0].purchaseOrderNo || res.data[0].orderId;
+ } else {
+ purchaseOrderNo = res.data?.purchaseOrderNo || res.data?.orderId;
+ }
+
+ return purchaseOrderNo;
+};
+
+// 鎵弿鏉$爜鏍稿績閫昏緫
+const handleScan = async () => {
+ if (!formRef.value) return;
+ await formRef.value.validateField('barcode');
+
+ const barcode = formData.barcode.trim();
+ const outboundOrderNo = orderForm.outboundOrderNo.trim();
+
+ // 鏉$爜鍘婚噸
+ const isDuplicate = scannedBarcodes.value.some(item => item.barcode === barcode);
+ if (isDuplicate) {
+ ElMessage.warning(`鏉$爜銆�${barcode}銆戝凡瀛樺湪锛屾棤闇�閲嶅鎵弿`);
+ formData.barcode = "";
+ nextTick(() => barcodeInputRef.value?.focus()); // 鍘婚噸鍚庝粛鑱氱劍鏉$爜妗�
+ return;
+ }
+
+ try {
+ loading.value = true;
+
+ // 姝ラ1锛氭煡璇㈤噰璐崟鍙�
+ const purchaseOrderNo = await getPurchaseOrderByBarcode(barcode);
+ if (purchaseOrderNo) {
+ orderForm.purchaseOrderNo = purchaseOrderNo;
+ } else {
+ ElMessage.info("鏈煡璇㈠埌璇ユ潯鐮佸搴旂殑閲囪喘鍗曞彿锛岀户缁獙璇佹潯鐮佹湁鏁堟��");
+ formData.barcode = ""; // 鏂板锛氶獙璇佸け璐ユ椂娓呯┖杈撳叆妗�
+ nextTick(() => barcodeInputRef.value?.focus()); // 鏂板锛氳仛鐒︽潯鐮佽緭鍏ユ
+ }
+
+ // 姝ラ2锛氶獙璇佹潯鐮佸苟鑾峰彇鐗╂枡淇℃伅
+ const validateRes = await http.post("/api/OutboundPicking/BarcodeValidate", {
+ outOder: outboundOrderNo,
+ inOder: purchaseOrderNo || orderForm.purchaseOrderNo,
+ barCode: barcode
+ });
+
+ if (validateRes.status === true) {
+ if (!Array.isArray(validateRes.data) || validateRes.data.length === 0) {
+ ElMessage.warning("璇ユ潯鐮侀獙璇佹垚鍔燂紝浣嗘湭杩斿洖鐗╂枡淇℃伅");
+ formData.barcode = ""; // 鏂板锛氭棤鐗╂枡淇℃伅鏃朵篃娓呯┖杈撳叆妗�
+ nextTick(() => barcodeInputRef.value?.focus()); // 鏂板锛氳仛鐒︽潯鐮佹
+ } else {
+ const newItems = validateRes.data.map(item => ({
+ barcode: item.barcode || '',
+ materielCode: item.materielCode || '',
+ materielName: item.materielName || '',
+ batchNo: item.batchNo || '',
+ orderQuantity: item.orderQuantity || item.quantity || 0,
+ supplyCode: item.supplyCode || '',
+ purchaseOrderNo: purchaseOrderNo || ''
+ }));
+ scannedBarcodes.value.push(...newItems);
+ ElMessage.success(`鎵弿鎴愬姛锛屾柊澧� ${newItems.length} 鏉$墿鏂欎俊鎭紝绱 ${scannedBarcodes.value.length} 鏉);
+ formData.barcode = "";
+ }
+ } else {
+ ElMessage.error("鎵弿澶辫触锛�" + (validateRes.message || '鏉$爜楠岃瘉澶辫触'));
+ formData.barcode = ""; // 鏂板锛氶獙璇佸け璐ユ椂娓呯┖杈撳叆妗�
+ nextTick(() => barcodeInputRef.value?.focus()); // 鏂板锛氳仛鐒︽潯鐮佽緭鍏ユ
+ }
+ } catch (error) {
+ ElMessage.error(error.message);
+ formData.barcode = ""; // 淇濈暀锛氭帴鍙e紓甯告椂娓呯┖
+ // 鏂板锛氬紓甯告椂涔熷己鍒惰仛鐒︽潯鐮佹
+ nextTick(() => barcodeInputRef.value?.focus());
+ } finally {
+ loading.value = false;
+ // 鎵弿瀹屾垚鍚庡缁堣仛鐒︽潯鐮佽緭鍏ユ锛堟柟渚胯繛缁壂鎻忥級
+ nextTick(() => {
+ 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 currentItem = scannedBarcodes.value[index];
const res = await http.post("/api/OutboundPicking/DeleteBarcode", {
outOder: orderForm.outboundOrderNo,
- inOder: orderForm.purchaseOrderNo,
+ inOder: currentItem?.purchaseOrderNo || orderForm.purchaseOrderNo,
barCode: barcode
});
if (res.status === true) {
scannedBarcodes.value.splice(index, 1);
ElMessage.success("鍒犻櫎鎴愬姛");
+ if (scannedBarcodes.value.length === 0) {
+ orderForm.purchaseOrderNo = "";
+ }
} else {
ElMessage.error("鍒犻櫎澶辫触锛�" + (res.message || '鍒犻櫎澶辫触'));
}
@@ -251,6 +430,8 @@
ElMessage.error("鍒犻櫎鏉$爜寮傚父锛�" + error.message);
} finally {
loading.value = false;
+ // 鍒犻櫎鍚庝粛鑱氱劍鏉$爜杈撳叆妗�
+ nextTick(() => barcodeInputRef.value?.focus());
}
};
@@ -258,29 +439,37 @@
const submit = async () => {
if (scannedBarcodes.value.length === 0) {
ElMessage.warning("璇峰厛鎵弿鑷冲皯涓�鏉℃潯鐮�");
+ nextTick(() => barcodeInputRef.value?.focus()); // 鎻愪氦澶辫触鑱氱劍鏉$爜妗�
return;
}
const barcodes = scannedBarcodes.value.map(item => item.barcode);
+ const purchaseOrderNos = [...new Set(scannedBarcodes.value.map(item => item.purchaseOrderNo).filter(Boolean))];
try {
- loading.value = true;
- // 杩欓噷淇濈暀浜嗗師鏈夌殑鎻愪氦鎺ュ彛锛屾敞鎰忓弬鏁扮幇鍦ㄤ紶閫掔殑鏄崟鎹彿瀛楃涓�
+ // 寮�鍚彁浜oading锛屾樉绀洪伄缃╁眰
+ submitLoading.value = true;
const res = await http.post("/api/OutboundPicking/NoStockOutSubmit", {
OutOderSubmit: orderForm.outboundOrderNo,
- InOderSubmit: orderForm.purchaseOrderNo,
+ InOderSubmit: purchaseOrderNos.join(',') || '',
BarCodeSubmit: barcodes
});
if (res.status === true) {
ElMessage.success("鍑哄簱鎻愪氦鎴愬姛");
showDetailBox.value = false;
+ scannedBarcodes.value = [];
+ orderForm.purchaseOrderNo = "";
} else {
ElMessage.error("鍑哄簱鎻愪氦澶辫触锛�" + (res.message || '鎻愪氦澶辫触'));
+ nextTick(() => barcodeInputRef.value?.focus()); // 鎻愪氦澶辫触鑱氱劍鏉$爜妗�
}
} catch (error) {
ElMessage.error("鍑哄簱鎻愪氦寮傚父锛�" + error.message);
+ nextTick(() => barcodeInputRef.value?.focus()); // 寮傚父鑱氱劍鏉$爜妗�
} finally {
+ // 鍏抽棴鎻愪氦loading锛岄殣钘忛伄缃╁眰
+ submitLoading.value = false;
loading.value = false;
}
};
@@ -292,7 +481,7 @@
</script>
<style scoped>
-/* 鍏抽敭锛氬畾涔夊垪琛ㄩ」鐨勮繃娓″姩鐢� */
+/*杩囨浮鍔ㄧ敾 */
.barcode-item-transition-enter-active,
.barcode-item-transition-leave-active {
transition: all 0.3s ease;
@@ -305,9 +494,35 @@
opacity: 0;
transform: translateX(30px);
}
-/* 纭繚鍒犻櫎鏃跺叾浠栧厓绱犲钩婊戜笂绉� */
.barcode-item-transition-move {
transition: transform 1s ease;
+}
+
+/* 鏂板锛氭彁浜ら伄缃╁眰鏍峰紡 */
+.submit-mask {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background-color: rgba(255, 255, 255, 0.85);
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ z-index: 100;
+ border-radius: inherit;
+}
+.mask-content {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 12px;
+ color: #409eff;
+ font-size: 15px;
+}
+.loading-icon {
+ font-size: 24px;
+ animation: el-loading-circle 1.5s linear infinite;
}
.scan-list {
@@ -341,7 +556,6 @@
padding: 0;
}
-/* 鑷畾涔夋粴鍔ㄦ潯 */
.custom-scrollbar :deep(.el-scrollbar__thumb) {
background: rgba(0, 0, 0, 0.2);
border-radius: 4px;
@@ -358,26 +572,47 @@
.barcode-item {
display: flex;
justify-content: space-between;
- align-items: center;
- padding: 10px 15px;
+ align-items: flex-start;
+ padding: 15px;
border-bottom: 1px solid #f7f7f7;
transition: background-color 0.2s ease;
}
.barcode-item:hover {
background-color: #fafafa;
}
-/* 涓哄鏁拌娣诲姞杞诲井鐨勮儗鏅壊锛屽寮哄彲璇绘�� */
.barcode-item:nth-child(odd) {
background-color: #f9f9f9;
}
-.barcode-text {
+.barcode-detail {
flex: 1;
+ display: grid;
+ grid-template-columns: repeat(4, 1fr);
+ gap: 8px 15px;
font-size: 14px;
- color: #666;
- transition: color 0.2s;
}
-.barcode-item:hover .barcode-text {
- color: #409eff;
+@media (max-width: 1200px) {
+ .barcode-detail {
+ grid-template-columns: repeat(3, 1fr);
+ }
+}
+@media (max-width: 992px) {
+ .barcode-detail {
+ grid-template-columns: repeat(2, 1fr);
+ }
+}
+.detail-row {
+ display: flex;
+ align-items: center;
+}
+.label {
+ color: #999;
+ margin-right: 5px;
+ white-space: nowrap;
+}
+.value {
+ color: #666;
+ flex: 1;
+ word-break: break-all;
}
.delete-btn {
@@ -385,6 +620,8 @@
font-size: 16px;
transition: all 0.2s;
opacity: 0.7;
+ margin-left: 10px;
+ flex-shrink: 0;
}
.barcode-item:hover .delete-btn {
opacity: 1;
@@ -410,7 +647,6 @@
color: #dcdfe6;
}
-/* 鑷畾涔夎緭鍏ユ */
.custom-input :deep(.el-input__inner) {
border-radius: 6px;
border-color: #e4e7ed;
@@ -423,7 +659,6 @@
box-shadow: 0 0 0 3px rgba(64, 158, 255, 0.1);
}
-/* 鑷畾涔夋寜閽� */
.custom-button {
border-radius: 6px;
height: 36px;
@@ -462,7 +697,6 @@
</style>
<style>
-/* 鍏ㄥ眬鏍峰紡閮ㄥ垎淇濇寔涓嶅彉 */
.text-button:hover {
background-color: #f0f9eb !important;
}
--
Gitblit v1.9.3