| | |
| | | @input="handleOutboundInput" |
| | | @keyup.enter="validateOutboundOrder" |
| | | ref="outboundInputRef" |
| | | :disabled="loading || submitLoading" |
| | | :disabled="loading || submitLoading || isOutboundVerified" |
| | | ></el-input> |
| | | <!-- æ°å¢ï¼éªè¯ç¶ææç¤º --> |
| | | <span v-if="isOutboundVerified" class="verified-tag">â å·²éªè¯</span> |
| | | <span v-else-if="loading" class="loading-tag">⦠éªè¯ä¸...</span> |
| | | </el-form-item> |
| | | <el-form-item label="éè´åæ®:" name="purchaseOrderNo"> |
| | | <el-input |
| | |
| | | label="æ«ææ¡ç :" |
| | | style="width: 80%" |
| | | name="barcode" |
| | | :rules="[{ required: true, message: 'è¯·æ«ææè¾å
¥æ¡ç ', trigger: 'blur' }]" |
| | | > |
| | | <el-input |
| | | ref="barcodeInputRef" |
| | |
| | | @keydown.enter="debouncedHandleScan" |
| | | autofocus |
| | | class="custom-input" |
| | | :disabled="!orderForm.outboundOrderNo || loading || submitLoading" |
| | | :disabled="!isOutboundVerified || loading || submitLoading" |
| | | ></el-input> |
| | | </el-form-item> |
| | | <el-form-item> |
| | |
| | | size="small" |
| | | @click="handleScan" |
| | | class="custom-button" |
| | | :disabled="!orderForm.outboundOrderNo || loading || submitLoading" |
| | | :disabled="!isOutboundVerified || loading || submitLoading" |
| | | > |
| | | <Search /> ç¡®è®¤æ«æ |
| | | </el-button> |
| | |
| | | </div> |
| | | </transition-group> |
| | | <div class="empty-tip" v-if="scannedBarcodes.length === 0"> |
| | | <span>ææ æ«æè®°å½ï¼è¯·å
è¾å
¥åºåºåæ®åæ«ææ¡ç </span> |
| | | <span v-if="isOutboundVerified">ææ æ«æè®°å½ï¼è¯·æ«ææ¡ç </span> |
| | | <span v-else>请å
è¾å
¥å¹¶éªè¯ææçåºåºåæ®å·</span> |
| | | </div> |
| | | </el-scrollbar> |
| | | </div> |
| | |
| | | type="primary" |
| | | size="small" |
| | | @click="submit" |
| | | :disabled="scannedBarcodes.length === 0 || !orderForm.outboundOrderNo || loading || submitLoading" |
| | | :disabled="scannedBarcodes.length === 0 || !isOutboundVerified || loading || submitLoading" |
| | | class="submit-btn" |
| | | > |
| | | <Check /> æäº¤åºåº |
| | |
| | | const loading = ref(false); |
| | | // æ°å¢ï¼æäº¤ä¸å±loadingç¶æï¼æ§å¶é®ç½©å±æ¾ç¤º |
| | | const submitLoading = ref(false); |
| | | // æ ¸å¿æ°å¢ï¼åºåºåéªè¯ç¶ææ è¯ |
| | | const isOutboundVerified = ref(false); |
| | | |
| | | // 模æ¿å¼ç¨ |
| | | const formRef = ref(null); |
| | |
| | | orderForm.outboundOrderNo = ""; |
| | | orderForm.purchaseOrderNo = ""; |
| | | submitLoading.value = false; // æå¼å¼¹çªæ¶éç½®æäº¤loading |
| | | isOutboundVerified.value = false; // æå¼å¼¹çªæ¶éç½®åºåºåéªè¯ç¶æ |
| | | nextTick(() => { |
| | | outboundInputRef.value?.focus(); // æå¼å¼¹çªä»èç¦åºåºåè¾å
¥æ¡ |
| | | }); |
| | |
| | | |
| | | /** |
| | | * éªè¯åºåºåæ®å·çæææ§ |
| | | * æ ¸å¿ä¿®æ¹ï¼éªè¯æååç´æ¥èç¦æ¡ç æ«ææ¡ï¼å¤±è´¥åèç¦ååºåºåè¾å
¥æ¡ |
| | | * æ ¸å¿ä¿®æ¹ï¼éªè¯æååæ è®°isOutboundVerified为trueï¼å¤±è´¥åé置为false |
| | | */ |
| | | const validateOutboundOrder = async () => { |
| | | const outboundOrderNo = orderForm.outboundOrderNo.trim(); |
| | | if (!outboundOrderNo) { |
| | | ElMessage.warning("请è¾å
¥åºåºåæ®å·"); |
| | | return; |
| | | } |
| | | |
| | |
| | | ); |
| | | |
| | | if (res.status !== true) { |
| | | // éªè¯å¤±è´¥ï¼æ¸
空è¾å
¥æ¡ï¼æç¤ºé误ï¼èç¦ååºåºåè¾å
¥æ¡ |
| | | // éªè¯å¤±è´¥ï¼æ¸
空è¾å
¥æ¡ï¼æç¤ºé误ï¼éç½®éªè¯ç¶æï¼èç¦ååºåºåè¾å
¥æ¡ |
| | | orderForm.outboundOrderNo = ""; |
| | | isOutboundVerified.value = false; |
| | | ElMessage.error(res.message || "åºåºåæ®å·éªè¯å¤±è´¥ï¼è¯·æ£æ¥åæ®å·æ¯å¦æ£ç¡®"); |
| | | nextTick(() => { |
| | | outboundInputRef.value?.focus(); // 失败èç¦åºåºåè¾å
¥æ¡ |
| | |
| | | return; |
| | | } |
| | | |
| | | // éªè¯æåï¼æç¤ºç¨æ·ï¼ç´æ¥èç¦æ¡ç æ«ææ¡ï¼æ ¸å¿ä¿®æ¹ï¼ |
| | | // éªè¯æåï¼æ è®°éªè¯ç¶æä¸ºtrueï¼æç¤ºç¨æ·ï¼èç¦æ¡ç æ«ææ¡ |
| | | isOutboundVerified.value = true; |
| | | ElMessage.success("åºåºåæ®å·éªè¯éè¿"); |
| | | nextTick(() => { |
| | | barcodeInputRef.value?.focus(); // æåç´æ¥è·³è½¬å°æ¡ç æ«ææ¡ |
| | | }); |
| | | } catch (error) { |
| | | // æ¥å£å¼å¸¸ï¼æ¸
空è¾å
¥æ¡ï¼æç¤ºé误ï¼èç¦ååºåºåè¾å
¥æ¡ |
| | | // æ¥å£å¼å¸¸ï¼æ¸
空è¾å
¥æ¡ï¼æç¤ºé误ï¼éç½®éªè¯ç¶æï¼èç¦ååºåºåè¾å
¥æ¡ |
| | | orderForm.outboundOrderNo = ""; |
| | | isOutboundVerified.value = false; |
| | | ElMessage.error(`åºåºåæ®å·éªè¯å¼å¸¸ï¼${error.message || "ç½ç»é误ï¼è¯·éè¯"}`); |
| | | nextTick(() => { |
| | | outboundInputRef.value?.focus(); // å¼å¸¸èç¦åºåºåè¾å
¥æ¡ |
| | |
| | | |
| | | // åºåºåè¾å
¥å¤ç |
| | | const handleOutboundInput = (value) => { |
| | | // æ ¸å¿ä¿®æ¹ï¼è¾å
¥æ¶èªå¨éç½®éªè¯ç¶æï¼é²æ¢æå¨ä¿®æ¹å·²éªè¯çåºåºåå·ï¼ |
| | | if (value && value.trim()) { |
| | | // å¯ä¿çåºåºåå·æ ¼å¼éªè¯é»è¾ |
| | | isOutboundVerified.value = false; |
| | | } |
| | | }; |
| | | |
| | |
| | | |
| | | // èç¦æ¡ç è¾å
¥æ¡ï¼å¤ç¨å½æ°ï¼ |
| | | const focusBarcodeInputDirectly = () => { |
| | | if (orderForm.outboundOrderNo.trim()) { |
| | | if (isOutboundVerified.value) { |
| | | barcodeInputRef.value?.focus(); |
| | | } else { |
| | | ElMessage.warning("请å
è¾å
¥ææçåºåºåæ®å·"); |
| | | ElMessage.warning("请å
è¾å
¥å¹¶éªè¯ææçåºåºåæ®å·"); |
| | | nextTick(() => { |
| | | outboundInputRef.value?.focus(); |
| | | }); |
| | | } |
| | | }; |
| | | |
| | |
| | | |
| | | // æ«ææ¡ç æ ¸å¿é»è¾ |
| | | const handleScan = async () => { |
| | | // æ ¸å¿æ°å¢ï¼åç½®æ ¡éªï¼ç¡®ä¿åºåºåå·²éªè¯ |
| | | if (!isOutboundVerified.value) { |
| | | ElMessage.warning("请å
éªè¯ææçåºåºåæ®å·ååæ«ææ¡ç "); |
| | | nextTick(() => { |
| | | outboundInputRef.value?.focus(); |
| | | }); |
| | | return; |
| | | } |
| | | |
| | | if (!formRef.value) return; |
| | | await formRef.value.validateField('barcode'); |
| | | |
| | |
| | | orderForm.purchaseOrderNo = purchaseOrderNo; |
| | | } else { |
| | | ElMessage.info("æªæ¥è¯¢å°è¯¥æ¡ç 对åºçéè´åå·ï¼ç»§ç»éªè¯æ¡ç æææ§"); |
| | | formData.barcode = ""; // æ°å¢ï¼éªè¯å¤±è´¥æ¶æ¸
空è¾å
¥æ¡ |
| | | nextTick(() => barcodeInputRef.value?.focus()); // æ°å¢ï¼èç¦æ¡ç è¾å
¥æ¡ |
| | | formData.barcode = ""; |
| | | nextTick(() => barcodeInputRef.value?.focus()); |
| | | } |
| | | |
| | | // æ¥éª¤2ï¼éªè¯æ¡ç å¹¶è·åç©æä¿¡æ¯ |
| | |
| | | if (validateRes.status === true) { |
| | | if (!Array.isArray(validateRes.data) || validateRes.data.length === 0) { |
| | | ElMessage.warning("该æ¡ç éªè¯æåï¼ä½æªè¿åç©æä¿¡æ¯"); |
| | | formData.barcode = ""; // æ°å¢ï¼æ ç©æä¿¡æ¯æ¶ä¹æ¸
空è¾å
¥æ¡ |
| | | nextTick(() => barcodeInputRef.value?.focus()); // æ°å¢ï¼èç¦æ¡ç æ¡ |
| | | formData.barcode = ""; |
| | | nextTick(() => barcodeInputRef.value?.focus()); |
| | | } else { |
| | | const newItems = validateRes.data.map(item => ({ |
| | | barcode: item.barcode || '', |
| | |
| | | } |
| | | } else { |
| | | ElMessage.error("æ«æå¤±è´¥ï¼" + (validateRes.message || 'æ¡ç éªè¯å¤±è´¥')); |
| | | formData.barcode = ""; // æ°å¢ï¼éªè¯å¤±è´¥æ¶æ¸
空è¾å
¥æ¡ |
| | | nextTick(() => barcodeInputRef.value?.focus()); // æ°å¢ï¼èç¦æ¡ç è¾å
¥æ¡ |
| | | formData.barcode = ""; |
| | | nextTick(() => barcodeInputRef.value?.focus()); |
| | | } |
| | | } catch (error) { |
| | | ElMessage.error(error.message); |
| | | formData.barcode = ""; // ä¿çï¼æ¥å£å¼å¸¸æ¶æ¸
空 |
| | | // æ°å¢ï¼å¼å¸¸æ¶ä¹å¼ºå¶èç¦æ¡ç æ¡ |
| | | formData.barcode = ""; |
| | | nextTick(() => barcodeInputRef.value?.focus()); |
| | | } finally { |
| | | loading.value = false; |
| | |
| | | |
| | | // æäº¤åºåº |
| | | const submit = async () => { |
| | | // æ ¸å¿æ°å¢ï¼åç½®æ ¡éªåºåºåéªè¯ç¶æ |
| | | if (!isOutboundVerified.value) { |
| | | ElMessage.warning("åºåºåæ®å·æªéªè¯ï¼æ æ³æäº¤"); |
| | | nextTick(() => { |
| | | outboundInputRef.value?.focus(); |
| | | }); |
| | | return; |
| | | } |
| | | |
| | | if (scannedBarcodes.value.length === 0) { |
| | | ElMessage.warning("请å
æ«æè³å°ä¸æ¡æ¡ç "); |
| | | nextTick(() => barcodeInputRef.value?.focus()); // æäº¤å¤±è´¥èç¦æ¡ç æ¡ |
| | | nextTick(() => barcodeInputRef.value?.focus()); |
| | | return; |
| | | } |
| | | |
| | |
| | | showDetailBox.value = false; |
| | | scannedBarcodes.value = []; |
| | | orderForm.purchaseOrderNo = ""; |
| | | isOutboundVerified.value = false; // æäº¤æååéç½®éªè¯ç¶æ |
| | | } else { |
| | | ElMessage.error("åºåºæäº¤å¤±è´¥ï¼" + (res.message || 'æäº¤å¤±è´¥')); |
| | | nextTick(() => barcodeInputRef.value?.focus()); // æäº¤å¤±è´¥èç¦æ¡ç æ¡ |
| | | nextTick(() => barcodeInputRef.value?.focus()); |
| | | } |
| | | } catch (error) { |
| | | ElMessage.error("åºåºæäº¤å¼å¸¸ï¼" + error.message); |
| | | nextTick(() => barcodeInputRef.value?.focus()); // å¼å¸¸èç¦æ¡ç æ¡ |
| | | nextTick(() => barcodeInputRef.value?.focus()); |
| | | } finally { |
| | | // å
³éæäº¤loadingï¼éèé®ç½©å± |
| | | submitLoading.value = false; |
| | |
| | | animation: el-loading-circle 1.5s linear infinite; |
| | | } |
| | | |
| | | /* æ°å¢ï¼éªè¯ç¶ææ ç¾æ ·å¼ */ |
| | | .verified-tag { |
| | | color: #67c23a; |
| | | font-size: 12px; |
| | | margin-left: 8px; |
| | | font-weight: 500; |
| | | } |
| | | .loading-tag { |
| | | color: #409eff; |
| | | font-size: 12px; |
| | | margin-left: 8px; |
| | | font-weight: 500; |
| | | animation: spin 1s linear infinite; |
| | | } |
| | | @keyframes spin { |
| | | 0% { transform: rotate(0deg); } |
| | | 100% { transform: rotate(360deg); } |
| | | } |
| | | |
| | | .scan-list { |
| | | width: 100%; |
| | | } |