ÏîÄ¿´úÂë/WIDESEA_WMSClient/src/extension/inbound/extend/AllcatedPallet.vue
@@ -70,11 +70,11 @@ <div class="input-label">ç©ææ¡ç </div> <el-input ref="barcodeInput" v-model="barcode" placeholder="è¯·æ«ææè¾å ¥ç©ææ¡ç åæå车é®" clearable :disabled="!form.locationType || !trayBarcode || !form.warehouseType" @keyup.enter.native="handleBarcodeSubmit" @clear="handleClear" @input="handleBarcodeInput" @keyup.enter.native="debounceHandleBarcodeSubmit" @clear="handleClear" @input="handleBarcodeInput" class="custom-input" size="medium"> <template slot="append"> <el-button :loading="loading" @click="handleBarcodeSubmit" type="primary" icon="el-icon-search" :disabled="!form.locationType || !trayBarcode || !barcode || !from.warehouseType" size="medium"> <el-button :loading="loading" @click="debounceHandleBarcodeSubmit" type="primary" icon="el-icon-search" :disabled="!form.locationType || !trayBarcode || !barcode || !form.warehouseType" size="medium"> {{ loading ? 'æ¥è¯¢ä¸...' : 'æ¥è¯¢' }} </el-button> </template> @@ -84,7 +84,7 @@ <div class="input-tips compact-tips"> <p>æç¤ºï¼è¯·å éæ©ä»åº â éæ©ä»åºåºå â è¾å ¥æç®±ç â è¾å ¥ç©ææ¡ç </p> <p v-if="!form.warehouseType" class="warning-text">â ï¸ è¯·å éæ©ä»åº</p> <p v-if="!form.locationType && !form.warehouseType" class="warning-text">â ï¸ è¯·å éæ©ä»åºåºå</p> <p v-if="form.warehouseType && !form.locationType" class="warning-text">â ï¸ è¯·å éæ©ä»åºåºå</p> <p v-if="form.warehouseType && form.locationType && !trayBarcode" class="warning-text">â ï¸ è¯·å è¾å ¥æç®±ç </p> </div> @@ -111,7 +111,6 @@ <el-tag type="primary" size="small">æªç»ç {{ totalStockCount }}</el-tag> </span> </div> <div class="table-container"> <el-table :data="unpalletMaterials" stripe style="width: 100%" height="100%" size="small" @@ -146,7 +145,7 @@ <div v-if="materials.length === 0" class="empty-state compact"> <i class="el-icon-document"></i> <p v-if="!form.warehouseType">请å éæ©ä»åº</p> <p v-if="!form.locationType">请å éæ©ä»åºåºå</p> <p v-if="form.warehouseType && !form.locationType">请å éæ©ä»åºåºå</p> <p v-else-if="!trayBarcode">请å è¾å ¥æç®±æ¡ç </p> <p v-else>ææ ç©ææ°æ®ï¼è¯·æ«ææè¾å ¥ç©ææ¡ç </p> </div> @@ -171,9 +170,23 @@ </template> </vol-box> </template> <script> import http from '@/api/http.js'; import VolBox from '@/components/basic/VolBox.vue'; // 鲿彿°ä¿æä¸å function debounce(func, wait) { let timeout; return function () { const context = this; const args = arguments; clearTimeout(timeout); timeout = setTimeout(() => { func.apply(context, args); }, wait); }; } export default { components: { VolBox }, @@ -193,27 +206,25 @@ unpalletBarcodes: [], unpalletBarcodesLoading: false, unpalletMaterials: [], // æªç»çè¯¦ç»æ°æ®å表 unpalletMaterials: [], // æ«ç æªç¸å ³åé scanCode: '', lastKeyTime: null, isManualInput: false, isScanning: false, scanTimer: null, manualInputTimer: null, scanTarget: 'tray', // å½åæ«ç ç®æ : tray æ material scanTarget: 'tray', isSubmitting: false, palletGroupedBarcodes: {}, // åºåç»è®¡ç¸å ³åé totalStockSum: 0, totalStockCount: 0, uniqueUnit: '', sumLoading: false, sumError: '', // ä»åºç¸å ³åé warehouseTypes: [], warehouseLoading: false, // ä»åºåºåç¸å ³åé locationTypes: [], locationLoading: false, form: { @@ -245,22 +256,25 @@ }, computed: { // å½åéæ©çä»åºåç§° currentWarehouseName() { const warehouse = this.warehouseTypes.find(item => item.warehouseType === this.form.warehouseType); return warehouse ? warehouse.warehouseTypeDesc : ''; }, // å½åéæ©çä»åºåºåæè¿° currentLocationDesc() { const location = this.locationTypes.find(item => item.locationType === this.form.locationType) return location ? location.locationTypeDesc : '' }, debounceHandleBarcodeSubmit() { return debounce(this.handleBarcodeSubmit, 500); } }, watch: { visible(newVal, oldVal) { this.palletVisible = newVal; // å½ä» false å为 true æ¶ï¼è¡¨ç¤ºå¼¹æ¡æå¼ if (newVal === true && oldVal === false) { console.log('å¼¹æ¡æå¼ï¼éç½®æ°æ®'); this.resetData(); @@ -271,15 +285,16 @@ }); } // å½ä» true å为 false æ¶ï¼è¡¨ç¤ºå¼¹æ¡å ³é if (newVal === false && oldVal === true) { console.log('å¼¹æ¡å ³éï¼éç½®æ°æ®'); this.resetData(); } }, palletVisible(newVal) { this.$emit('update:visible', newVal); }, docNo(newVal) { if (newVal) { this.palletForm = { palletCode: '', barcode: '' }; @@ -289,13 +304,16 @@ } } }, mounted() { document.addEventListener('keypress', this.handleKeyPress); }, beforeDestroy() { document.removeEventListener('keypress', this.handleKeyPress); this.clearAllTimers(); }, methods: { open() { this.show = true; @@ -305,6 +323,7 @@ this.initwarehouseTypes(); this.fetchUnpalletMaterialDetails(); }, validateLocationType(rule, value, callback) { if (!this.form.warehouseType) { callback(new Error('请å éæ©ä»åº')); @@ -315,72 +334,104 @@ } }, // æ ¹æ®æ¡ç å表è·åè¯¦ç»æ°æ® async fetchUnpalletMaterialDetails() { try { const response = await http.post('/api/InboundOrder/UnPalletGroupBarcode?orderNo=' + this.orderNo, {}); if (response.status && Array.isArray(response.data)) { this.unpalletMaterials = response.data; this.unpalletBarcodes = response.data.map(item => item.barcode || ''); this.totalStockCount = response.data.length; } else { this.unpalletMaterials = []; } } catch (err) { this.unpalletMaterials = this.unpalletBarcodes.map(barcode => ({ barcode: barcode, materielCode: '-', batchNo: '-', stockQuantity: '-', unit: '-', supplyCode: '-', warehouseType: '-' })); } // è·åæªç»çç©æè¯¦æ fetchUnpalletMaterialDetails() { this.unpalletBarcodesLoading = true; http.post('/api/InboundOrder/UnPalletGroupBarcode?orderNo=' + this.orderNo, {}) .then(response => { if (response.status && Array.isArray(response.data)) { this.unpalletMaterials = response.data; this.unpalletBarcodes = response.data.map(item => item.barcode || ''); this.totalStockCount = response.data.length; } else { this.unpalletMaterials = []; } }) .catch(err => { console.error('è·åæªç»çç©æå¤±è´¥:', err); this.unpalletMaterials = this.unpalletBarcodes.map(barcode => ({ barcode: barcode, materielCode: '-', batchNo: '-', stockQuantity: '-', unit: '-', supplyCode: '-', warehouseType: '-' })); }) .finally(() => { this.unpalletBarcodesLoading = false; }); }, async initLocationTypes() { try { const { data } = await this.http.post("api/LocationInfo/GetLocationTypes") this.locationTypes = data } catch (e) { this.$message.error('è·ååºåç±»å失败') } // åå§åä»åºåºåç±»å initLocationTypes() { this.locationLoading = true; this.http.post("api/LocationInfo/GetLocationTypes") .then(({ data }) => { this.locationTypes = data; }) .catch(e => { console.error('è·ååºåç±»å失败:', e); this.$message.error('è·ååºåç±»å失败'); }) .finally(() => { this.locationLoading = false; }); }, async initwarehouseTypes() { try { const { data } = await this.http.post("api/Warehouse/GetwarehouseTypes") this.warehouseTypes = data } catch (e) { this.$message.error('è·ååºåç±»å失败') } // åå§åä»åºç±»å initwarehouseTypes() { this.warehouseLoading = true; this.http.post("api/Warehouse/GetwarehouseTypes") .then(({ data }) => { this.warehouseTypes = data; }) .catch(e => { console.error('è·åä»åºç±»å失败:', e); this.$message.error('è·åä»åºç±»å失败'); }) .finally(() => { this.warehouseLoading = false; }); }, async fetchStockStatistics(orderNo) { // åæ®å·ä¸ºç©ºæ¶ä¸æ¥è¯¢ // è·ååºåç»è®¡ fetchStockStatistics(orderNo) { if (!orderNo) { this.sumError = 'åæ®å·ä¸ºç©ºï¼æ æ³ç»è®¡'; return; return Promise.resolve(null); } this.sumLoading = true; this.sumError = ''; try { const response = await http.post('/api/InboundOrder/UnPalletQuantity?orderNo=' + orderNo, {}); if (response.data) { this.totalStockSum = response.data.stockSumQuantity || 0; this.totalStockCount = response.data.stockCount || 0; this.uniqueUnit = response.data.uniqueUnit || ''; } } catch (err) { this.sumError = 'ç»è®¡å 载失败'; this.totalStockSum = 0; this.totalStockCount = 0; } finally { this.sumLoading = false; } return http.post('/api/InboundOrder/UnPalletQuantity?orderNo=' + orderNo, {}) .then(response => { if (response.data) { this.totalStockSum = response.data.stockSumQuantity || 0; this.totalStockCount = response.data.stockCount || 0; this.uniqueUnit = response.data.uniqueUnit || ''; } return response.data; }) .catch(err => { console.error('ç»è®¡å 载失败:', err); this.sumError = 'ç»è®¡å 载失败'; this.totalStockSum = 0; this.totalStockCount = 0; throw err; }) .finally(() => { this.sumLoading = false; }); }, async validateForm() { // 表åéªè¯ validateForm() { return new Promise((resolve) => { if (!this.$refs.locationForm) { this.error = 'è¡¨åæªåå§å'; @@ -394,10 +445,9 @@ this.error = ''; resolve(true); } else { if (!this.from.warehouseType) { if (!this.form.warehouseType) { this.error = '请å éæ©ä»åº'; } else if (this.form.locationType === null || this.form.locationType === undefined || this.form.locationType === '') { } else if (!this.form.locationType) { this.error = '请å éæ©ä»åºåºå'; } else { this.error = 'è¯·æ£æ¥è¡¨å填忝妿£ç¡®'; @@ -407,7 +457,7 @@ }); }); }, // èç¦å°æçè¾å ¥æ¡ focusTrayInput() { if (this.$refs.trayInput && this.$refs.trayInput.$el) { const inputEl = this.$refs.trayInput.$el.querySelector('input'); @@ -420,7 +470,6 @@ } }, // èç¦å°ç©æè¾å ¥æ¡ focusBarcodeInput() { if (this.$refs.barcodeInput && this.$refs.barcodeInput.$el) { const inputEl = this.$refs.barcodeInput.$el.querySelector('input'); @@ -432,8 +481,10 @@ } } }, // éç½®æææ°æ® resetData() { this.palletGroupedBarcodes = {}; this.isSubmitting = false; this.trayBarcode = ''; this.barcode = ''; this.materials = []; @@ -455,10 +506,10 @@ this.form = { warehouseType: null, locationType: null } }; this.warehouseTypes = []; this.locationTypes = []; // æ¸ é¤è¡¨åéªè¯ç¶æ this.$nextTick(() => { if (this.$refs.locationForm) { this.$refs.locationForm.clearValidate(); @@ -466,7 +517,6 @@ }); }, // æ¸ é¤ææè®¡æ¶å¨ clearAllTimers() { if (this.manualInputTimer) { clearTimeout(this.manualInputTimer); @@ -477,121 +527,108 @@ this.scanTimer = null; } }, handleDialogClose() { this.show = false; this.resetData(); }, // 确认æé® async handleConfirm() { if (!await this.validateForm()) return; handleConfirm() { this.validateForm() .then(valid => { if (!valid) return; if (this.materials.length === 0) { this.$message.warning('请è³å°æ·»å ä¸ä¸ªç©æ'); return; } if (this.materials.length === 0) { this.$message.warning('请è³å°æ·»å ä¸ä¸ªç©æ'); return; } if (!this.trayBarcode) { this.$message.warning('请è¾å ¥æçæ¡ç '); return; } if (!this.trayBarcode) { this.$message.warning('请è¾å ¥æçæ¡ç '); return; } const result = { warehouseType: this.form.warehouseType, warehouseName: this.currentWarehouseName, locationType: this.form.locationType, locationDesc: this.currentLocationDesc, trayBarcode: this.trayBarcode, materials: this.materials, docNo: this.docNo }; const result = { warehouseType: this.form.warehouseType, warehouseName: this.currentWarehouseName, locationType: this.form.locationType, locationDesc: this.currentLocationDesc, trayBarcode: this.trayBarcode, materials: this.materials, docNo: this.docNo }; // 触åç¶ç»ä»¶ç back-success äºä»¶ this.$emit('back-success', result); this.palletVisible = false; this.$emit('back-success', result); this.palletVisible = false; }); }, // å¤çæçè¾å ¥ handleTrayInput() { // æ 记为æå¨è¾å ¥æ¨¡å¼ this.isManualInput = true; this.isScanning = false; // æ¸ é¤ä¹åç计æ¶å¨ if (this.manualInputTimer) { clearTimeout(this.manualInputTimer); } // 设置计æ¶å¨ï¼å¦æä¸æ®µæ¶é´å 没æè¾å ¥ï¼åé置为æ«ç æ¨¡å¼ this.manualInputTimer = setTimeout(() => { this.isManualInput = false; }, 1000); }, // å¤çç©æè¾å ¥ handleBarcodeInput() { // æ 记为æå¨è¾å ¥æ¨¡å¼ this.isManualInput = true; this.isScanning = false; // æ¸ é¤ä¹åç计æ¶å¨ if (this.manualInputTimer) { clearTimeout(this.manualInputTimer); } // 设置计æ¶å¨ï¼å¦æä¸æ®µæ¶é´å 没æè¾å ¥ï¼åé置为æ«ç æ¨¡å¼ this.manualInputTimer = setTimeout(() => { this.isManualInput = false; }, 1000); }, // å¤çæçæ¡ç æäº¤ async handleTraySubmit() { // å ç´æ¥æ£æ¥locationTypeï¼é¿å 表åéªè¯ç弿¥é®é¢ handleTraySubmit() { this.barcode = ''; this.materials = []; this.error = ''; if (!this.form.warehouseType) { this.error = '请å éæ©ä»åº'; return; } if (!this.form.locationType) { this.error = '请å éæ©ä»åºåºå'; //this.$message.warning('请å éæ©ä»åºåºå'); return; } // ç¶ååè¿è¡å®æ´ç表åéªè¯ if (!await this.validateForm()) return; this.validateForm() .then(valid => { if (!valid) return; const currentTrayBarcode = this.trayBarcode.trim(); const currentTrayBarcode = this.trayBarcode.trim(); if (!currentTrayBarcode) { this.error = '请è¾å ¥ææ«ææçæ¡ç '; return; } if (!currentTrayBarcode) { this.error = '请è¾å ¥ææ«ææçæ¡ç '; return; } this.error = ''; this.error = ''; if (!this.trayBarcodeReg.test(currentTrayBarcode)) { this.$message("æçå·æ ¼å¼é误"); this.focusTrayInput(); return; } if (!this.trayBarcodeReg.test(currentTrayBarcode)) { // ElMessage.warning({ // message: 'æçå·æ ¼å¼é误', // type: 'warning', // duration: 3000 // }) this.$message("æçå·æ ¼å¼é误"); this.focusTrayInput(); return; } // 设置æçæ¡ç åï¼èªå¨èç¦å°ç©æè¾å ¥æ¡ this.focusBarcodeInput(); // this.$message({ // message: `æçæ¡ç 已设置: ${currentTrayBarcode}`, // type: 'success', // duration: 2000 // }); this.$message.success(`æçæ¡ç 已设置: ${currentTrayBarcode}`); this.focusBarcodeInput(); this.$message.success(`æçæ¡ç 已设置: ${currentTrayBarcode}`); }); }, // æ¸ é¤æç clearTray() { this.trayBarcode = ''; this.materials = []; @@ -603,12 +640,10 @@ }); }, // æ¸ ç©ºæçè¾å ¥ handleTrayClear() { this.error = ''; }, // æ¸ ç©ºè¾å ¥ handleClear() { this.error = ''; this.scanCode = ''; @@ -616,123 +651,171 @@ this.isScanning = false; }, // å¤çç©ææ¡ç æäº¤ async handleBarcodeSubmit() { if (!await this.validateForm()) return; handleBarcodeSubmit() { if (this.isSubmitting) { this.$message.warning('æ£å¨å¤çä¸ï¼è¯·ç¨å'); return; } const currentBarcode = this.barcode.trim(); if (!this.trayBarcode) { this.error = '请å è¾å ¥æçæ¡ç '; this.focusTrayInput(); return; } if (!currentBarcode) { this.error = '请è¾å ¥ææ«æç©ææ¡ç '; return; } this.focusBarcodeInput(); this.error = ''; this.loading = true; try { // è°ç¨APIæ¥è¯¢ç©æä¿¡æ¯ const materialData = await this.fetchMaterialData(currentBarcode); if (!materialData || materialData.length === 0) { return; } this.materials = []; materialData.forEach(item => { this.materials.push({ ...item, trayCode: this.trayBarcode, locationType: this.form.locationType, locationDesc: this.currentLocationDesc, scanTime: this.formatTime(new Date()) }); }); this.orderNo = materialData[0].orderNo; await this.fetchStockStatistics(materialData[0].orderNo); await this.fetchUnpalletMaterialDetails(); // æ¸ ç©ºç©æè¾å ¥æ¡å¹¶ä¿æèç¦ const currentTrayGrouped = this.palletGroupedBarcodes[this.trayBarcode] || []; if (currentTrayGrouped.includes(currentBarcode)) { this.error = `æ¡ç ${currentBarcode} 已被å½åæçç»çï¼è¯·å¿é夿ä½`; this.barcode = ''; this.scanCode = ''; // æ¸ ç©ºæ«ç ç¼å this.isScanning = false; setTimeout(() => { this.focusBarcodeInput(); }, 100); } catch (err) { this.error = err.message || 'æ¥è¯¢æ¡ç ä¿¡æ¯å¤±è´¥ï¼è¯·éè¯'; this.focusBarcodeInput(); setTimeout(() => { // éä¸è¾å ¥æ¡å çé误å 容ï¼ç¡®ä¿focus宿忧è¡ï¼ const inputEl = this.$refs.barcodeInput?.$el?.querySelector('input'); if (inputEl) inputEl.select(); }, 100); } finally { this.loading = false; return; } this.isSubmitting = true; this.validateForm() .then(valid => { if (!valid) { this.isSubmitting = false; return; } if (!this.trayBarcode) { this.error = '请å è¾å ¥æçæ¡ç '; this.focusTrayInput(); this.isSubmitting = false; return; } if (!currentBarcode) { this.error = '请è¾å ¥ææ«æç©ææ¡ç '; this.isSubmitting = false; return; } this.focusBarcodeInput(); this.error = ''; this.loading = true; console.log('ç»ç请æ±åæ°:', { palletCode: this.trayBarcode, barcode: currentBarcode, locationTypeDesc: this.currentLocationDesc, locationType: this.form.locationType, warehouseType: this.form.warehouseType }); return this.fetchMaterialData(currentBarcode); }) .then(materialData => { if (!materialData || materialData.length === 0) { return; } this.materials = []; const newBarcodes = []; materialData.forEach(item => { this.materials.push({ ...item, trayCode: this.trayBarcode, locationType: this.form.locationType, locationDesc: this.currentLocationDesc, scanTime: this.formatTime(new Date()) }); newBarcodes.push(item.barcode); }); if (!this.palletGroupedBarcodes[this.trayBarcode]) { this.palletGroupedBarcodes[this.trayBarcode] = []; } this.palletGroupedBarcodes[this.trayBarcode] = [...new Set([...this.palletGroupedBarcodes[this.trayBarcode], ...newBarcodes])]; this.orderNo = materialData[0].orderNo; return Promise.all([ this.fetchStockStatistics(materialData[0].orderNo), this.fetchUnpalletMaterialDetails() ]); }) .then(() => { this.barcode = ''; this.scanCode = ''; this.isScanning = false; setTimeout(() => { this.focusBarcodeInput(); }, 100); }) .catch(err => { console.error('å¤çç©ææ¡ç 失败:', err); this.error = err.message || 'æ¥è¯¢æ¡ç ä¿¡æ¯å¤±è´¥ï¼è¯·éè¯'; this.focusBarcodeInput(); setTimeout(() => { const inputEl = this.$refs.barcodeInput?.$el?.querySelector('input'); if (inputEl) inputEl.select(); }, 100); }) .finally(() => { this.loading = false; this.isSubmitting = false; }); }, // APIè¯·æ± - æ¿æ¢ä¸ºå®é çAPIè°ç¨ async fetchMaterialData(barcode) { try { const response = await http.post('/api/Inbound/AllGroupPallet', { palletCode: this.trayBarcode, barcode: barcode, locationTypeDesc: this.currentLocationDesc, locationType: this.form.locationType, // æ·»å ä»åºåºåä¿¡æ¯ warehouseType: this.form.warehouseType // APIè¯·æ± fetchMaterialData(barcode) { return http.post('/api/Inbound/AllGroupPallet', { palletCode: this.trayBarcode, barcode: barcode, locationTypeDesc: this.currentLocationDesc, locationType: this.form.locationType, warehouseType: this.form.warehouseType }) .then(response => { let materialData; if (typeof response.data === 'string') { try { materialData = JSON.parse(response.data); } catch (e) { console.error('è§£æååºæ°æ®å¤±è´¥:', e); } } else { materialData = response.data; } ); let materialData; if (typeof response.data === 'string') { try { materialData = JSON.parse(response.data); } catch (e) { if (!response.status) { this.error = response.message || 'æ¥è¯¢æ¡ç ä¿¡æ¯å¤±è´¥ï¼è¯·éè¯'; return []; } } else { materialData = response.data; } if (!response.status) { this.error = response.message || 'æ¥è¯¢æ¡ç ä¿¡æ¯å¤±è´¥ï¼è¯·éè¯'; } return materialData; } catch (error) { console.error('APIè°ç¨å¤±è´¥:', error); } return materialData || []; }) .catch(error => { console.error('APIè°ç¨å¤±è´¥:', error); this.$message.error('æ¥å£è¯·æ±å¤±è´¥ï¼è¯·è系管çå'); throw error; }); }, // å¤çæ«ç æªè¾å ¥ handleKeyPress(event) { // å¦ææ¯æå¨è¾å ¥æ¨¡å¼ï¼ä¸å¤çæ«ç æªé»è¾ if (this.isManualInput) { if (this.isManualInput || this.isSubmitting) { return; } const key = event.key; const currentTime = new Date().getTime(); // 忽ç¥ç´æ¥æä¸çå车é®ï¼ç±handleBarcodeSubmitå¤çï¼ if (key === 'Enter') { event.preventDefault(); if (this.scanCode.length > 0) { // 黿¢é»è®¤å车è¡ä¸ºï¼é¿å 表åæäº¤ event.preventDefault(); if (this.scanTarget === 'material' && !this.trayBarcode) { this.$message.warning('请å 设置æçæ¡ç '); this.scanCode = ''; this.lastKeyTime = null; return; } // æ«ç 宿ï¼èªå¨è§¦åæ¥è¯¢ this.isScanning = false; // æ ¹æ®å½åæ«ç ç®æ 设置ç¸åºçè¾å ¥æ¡å¼ if (this.scanTarget === 'tray') { this.trayBarcode = this.scanCode; this.handleTraySubmit(); @@ -746,7 +829,6 @@ return; } // æå»ºæ«ç å 容ï¼å¿«éè¿ç»è¾å ¥è§ä¸ºæ«ç ï¼ if (this.lastKeyTime && currentTime - this.lastKeyTime < 50) { this.scanCode += key; this.isScanning = true; @@ -755,7 +837,6 @@ this.isScanning = true; } // 设置计æ¶å¨ï¼å¦æä¸æ®µæ¶é´å 没æè¾å ¥ï¼åéç½®æ«æç¶æ if (this.scanTimer) { clearTimeout(this.scanTimer); } @@ -776,6 +857,23 @@ const seconds = String(date.getSeconds()).padStart(2, '0'); return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`; }, // ä»åºåæ¢äºä»¶ handleWarehouseChange() { this.form.locationType = null; this.trayBarcode = ''; this.barcode = ''; this.materials = []; this.error = ''; }, // åºå忢äºä»¶ handleLocationChange() { this.trayBarcode = ''; this.barcode = ''; this.materials = []; this.error = ''; } } } ÏîÄ¿´úÂë/WIDESEA_WMSClient/src/extension/inbound/extend/Pallet.vue
@@ -175,7 +175,7 @@ import http from '@/api/http.js'; import VolBox from '@/components/basic/VolBox.vue'; // æ°å¢ï¼é²æå½æ° // 鲿彿°ä¿æä¸å function debounce(func, wait) { let timeout; return function () { @@ -206,30 +206,25 @@ unpalletBarcodes: [], unpalletBarcodesLoading: false, unpalletMaterials: [], // æªç»çè¯¦ç»æ°æ®å表 unpalletMaterials: [], // æ«ç æªç¸å ³åé scanCode: '', lastKeyTime: null, isManualInput: false, isScanning: false, scanTimer: null, manualInputTimer: null, scanTarget: 'tray', // å½åæ«ç ç®æ : tray æ material isSubmitting: false, // æ°å¢ï¼æäº¤éå®ï¼é²æ¢éå¤è¯·æ± // ä¿®å¤ï¼æ¹ä¸ºææçåå¨å·²ç»çæ¡ç ï¼é¿å ç¶ææ··æ· palletGroupedBarcodes: {}, // æ ¼å¼ï¼{ [trayBarcode]: [barcode1, barcode2, ...] } scanTarget: 'tray', isSubmitting: false, palletGroupedBarcodes: {}, // åºåç»è®¡ç¸å ³åé totalStockSum: 0, totalStockCount: 0, uniqueUnit: '', sumLoading: false, sumError: '', // ä»åºç¸å ³åé warehouseTypes: [], warehouseLoading: false, // ä»åºåºåç¸å ³åé locationTypes: [], locationLoading: false, form: { @@ -261,26 +256,25 @@ }, computed: { // å½åéæ©çä»åºåç§° currentWarehouseName() { const warehouse = this.warehouseTypes.find(item => item.warehouseType === this.form.warehouseType); return warehouse ? warehouse.warehouseTypeDesc : ''; }, // å½åéæ©çä»åºåºåæè¿° currentLocationDesc() { const location = this.locationTypes.find(item => item.locationType === this.form.locationType) return location ? location.locationTypeDesc : '' }, // æ°å¢ï¼é²æåçç©ææäº¤æ¹æ³ debounceHandleBarcodeSubmit() { return debounce(this.handleBarcodeSubmit, 500); } }, watch: { visible(newVal, oldVal) { this.palletVisible = newVal; // å½ä» false å为 true æ¶ï¼è¡¨ç¤ºå¼¹æ¡æå¼ if (newVal === true && oldVal === false) { console.log('å¼¹æ¡æå¼ï¼éç½®æ°æ®'); this.resetData(); @@ -291,15 +285,16 @@ }); } // å½ä» true å为 false æ¶ï¼è¡¨ç¤ºå¼¹æ¡å ³é if (newVal === false && oldVal === true) { console.log('å¼¹æ¡å ³éï¼éç½®æ°æ®'); this.resetData(); } }, palletVisible(newVal) { this.$emit('update:visible', newVal); }, docNo(newVal) { if (newVal) { this.palletForm = { palletCode: '', barcode: '' }; @@ -309,13 +304,16 @@ } } }, mounted() { document.addEventListener('keypress', this.handleKeyPress); }, beforeDestroy() { document.removeEventListener('keypress', this.handleKeyPress); this.clearAllTimers(); }, methods: { open() { this.show = true; @@ -325,6 +323,7 @@ this.initwarehouseTypes(); this.fetchUnpalletMaterialDetails(); }, validateLocationType(rule, value, callback) { if (!this.form.warehouseType) { callback(new Error('请å éæ©ä»åº')); @@ -335,74 +334,104 @@ } }, // æ ¹æ®æ¡ç å表è·åè¯¦ç»æ°æ® async fetchUnpalletMaterialDetails() { try { const response = await http.post('/api/InboundOrder/UnPalletGroupBarcode?orderNo=' + this.orderNo, {}); if (response.status && Array.isArray(response.data)) { this.unpalletMaterials = response.data; this.unpalletBarcodes = response.data.map(item => item.barcode || ''); this.totalStockCount = response.data.length; } else { this.unpalletMaterials = []; } } catch (err) { this.unpalletMaterials = this.unpalletBarcodes.map(barcode => ({ barcode: barcode, materielCode: '-', batchNo: '-', stockQuantity: '-', unit: '-', supplyCode: '-', warehouseType: '-' })); } // è·åæªç»çç©æè¯¦æ fetchUnpalletMaterialDetails() { this.unpalletBarcodesLoading = true; http.post('/api/InboundOrder/UnPalletGroupBarcode?orderNo=' + this.orderNo, {}) .then(response => { if (response.status && Array.isArray(response.data)) { this.unpalletMaterials = response.data; this.unpalletBarcodes = response.data.map(item => item.barcode || ''); this.totalStockCount = response.data.length; } else { this.unpalletMaterials = []; } }) .catch(err => { console.error('è·åæªç»çç©æå¤±è´¥:', err); this.unpalletMaterials = this.unpalletBarcodes.map(barcode => ({ barcode: barcode, materielCode: '-', batchNo: '-', stockQuantity: '-', unit: '-', supplyCode: '-', warehouseType: '-' })); }) .finally(() => { this.unpalletBarcodesLoading = false; }); }, async initLocationTypes() { try { // ä¿®å¤ï¼http æ¹ä¸º this.$httpï¼å代ç éè¯¯ï¼ const { data } = await this.http.post("api/LocationInfo/GetLocationTypes") this.locationTypes = data } catch (e) { this.$message.error('è·ååºåç±»å失败') } // åå§åä»åºåºåç±»å initLocationTypes() { this.locationLoading = true; this.http.post("api/LocationInfo/GetLocationTypes") .then(({ data }) => { this.locationTypes = data; }) .catch(e => { console.error('è·ååºåç±»å失败:', e); this.$message.error('è·ååºåç±»å失败'); }) .finally(() => { this.locationLoading = false; }); }, async initwarehouseTypes() { try { // ä¿®å¤ï¼http æ¹ä¸º this.$httpï¼å代ç éè¯¯ï¼ const { data } = await this.http.post("api/Warehouse/GetwarehouseTypes") this.warehouseTypes = data } catch (e) { this.$message.error('è·ååºåç±»å失败') } // åå§åä»åºç±»å initwarehouseTypes() { this.warehouseLoading = true; this.http.post("api/Warehouse/GetwarehouseTypes") .then(({ data }) => { this.warehouseTypes = data; }) .catch(e => { console.error('è·åä»åºç±»å失败:', e); this.$message.error('è·åä»åºç±»å失败'); }) .finally(() => { this.warehouseLoading = false; }); }, async fetchStockStatistics(orderNo) { // åæ®å·ä¸ºç©ºæ¶ä¸æ¥è¯¢ // è·ååºåç»è®¡ fetchStockStatistics(orderNo) { if (!orderNo) { this.sumError = 'åæ®å·ä¸ºç©ºï¼æ æ³ç»è®¡'; return; return Promise.resolve(null); } this.sumLoading = true; this.sumError = ''; try { const response = await http.post('/api/InboundOrder/UnPalletQuantity?orderNo=' + orderNo, {}); if (response.data) { this.totalStockSum = response.data.stockSumQuantity || 0; this.totalStockCount = response.data.stockCount || 0; this.uniqueUnit = response.data.uniqueUnit || ''; } } catch (err) { this.sumError = 'ç»è®¡å 载失败'; this.totalStockSum = 0; this.totalStockCount = 0; } finally { this.sumLoading = false; } return http.post('/api/InboundOrder/UnPalletQuantity?orderNo=' + orderNo, {}) .then(response => { if (response.data) { this.totalStockSum = response.data.stockSumQuantity || 0; this.totalStockCount = response.data.stockCount || 0; this.uniqueUnit = response.data.uniqueUnit || ''; } return response.data; }) .catch(err => { console.error('ç»è®¡å 载失败:', err); this.sumError = 'ç»è®¡å 载失败'; this.totalStockSum = 0; this.totalStockCount = 0; throw err; }) .finally(() => { this.sumLoading = false; }); }, async validateForm() { // 表åéªè¯ validateForm() { return new Promise((resolve) => { if (!this.$refs.locationForm) { this.error = 'è¡¨åæªåå§å'; @@ -416,10 +445,9 @@ this.error = ''; resolve(true); } else { // ä¿®å¤ï¼from æ¹ä¸º formï¼åä»£ç æ¼åéè¯¯ï¼ if (!this.form.warehouseType) { this.error = '请å éæ©ä»åº'; } else if (this.form.locationType === null || this.form.locationType === undefined || this.form.locationType === '') { } else if (!this.form.locationType) { this.error = '请å éæ©ä»åºåºå'; } else { this.error = 'è¯·æ£æ¥è¡¨å填忝妿£ç¡®'; @@ -429,7 +457,7 @@ }); }); }, // èç¦å°æçè¾å ¥æ¡ focusTrayInput() { if (this.$refs.trayInput && this.$refs.trayInput.$el) { const inputEl = this.$refs.trayInput.$el.querySelector('input'); @@ -442,7 +470,6 @@ } }, // èç¦å°ç©æè¾å ¥æ¡ focusBarcodeInput() { if (this.$refs.barcodeInput && this.$refs.barcodeInput.$el) { const inputEl = this.$refs.barcodeInput.$el.querySelector('input'); @@ -454,11 +481,10 @@ } } }, // éç½®æææ°æ® resetData() { // ä¿®å¤ï¼æ¸ 空ææçåå¨çå·²ç»çæ¡ç this.palletGroupedBarcodes = {}; this.isSubmitting = false; // éç½®æäº¤é this.isSubmitting = false; this.trayBarcode = ''; this.barcode = ''; this.materials = []; @@ -466,12 +492,12 @@ this.unpalletMaterials = []; this.loading = false; this.error = ''; this.scanCode = ''; // æ¸ ç©ºæ«ç ç¼å this.scanCode = ''; this.lastKeyTime = null; this.isManualInput = false; this.isScanning = false; this.currentFocus = 'warehouse'; this.scanTarget = 'tray'; // éç½®æ«ç ç®æ this.scanTarget = 'tray'; this.clearAllTimers(); this.totalStockSum = 0; this.totalStockCount = 0; @@ -480,10 +506,10 @@ this.form = { warehouseType: null, locationType: null } }; this.warehouseTypes = []; this.locationTypes = []; // æ¸ é¤è¡¨åéªè¯ç¶æ this.$nextTick(() => { if (this.$refs.locationForm) { this.$refs.locationForm.clearValidate(); @@ -491,7 +517,6 @@ }); }, // æ¸ é¤ææè®¡æ¶å¨ clearAllTimers() { if (this.manualInputTimer) { clearTimeout(this.manualInputTimer); @@ -502,81 +527,75 @@ this.scanTimer = null; } }, handleDialogClose() { this.show = false; this.resetData(); }, // 确认æé® async handleConfirm() { if (!await this.validateForm()) return; handleConfirm() { this.validateForm() .then(valid => { if (!valid) return; if (this.materials.length === 0) { this.$message.warning('请è³å°æ·»å ä¸ä¸ªç©æ'); return; } if (this.materials.length === 0) { this.$message.warning('请è³å°æ·»å ä¸ä¸ªç©æ'); return; } if (!this.trayBarcode) { this.$message.warning('请è¾å ¥æçæ¡ç '); return; } if (!this.trayBarcode) { this.$message.warning('请è¾å ¥æçæ¡ç '); return; } const result = { warehouseType: this.form.warehouseType, warehouseName: this.currentWarehouseName, locationType: this.form.locationType, locationDesc: this.currentLocationDesc, trayBarcode: this.trayBarcode, materials: this.materials, docNo: this.docNo }; const result = { warehouseType: this.form.warehouseType, warehouseName: this.currentWarehouseName, locationType: this.form.locationType, locationDesc: this.currentLocationDesc, trayBarcode: this.trayBarcode, materials: this.materials, docNo: this.docNo }; // 触åç¶ç»ä»¶ç back-success äºä»¶ this.$emit('back-success', result); this.palletVisible = false; this.$emit('back-success', result); this.palletVisible = false; }); }, // å¤çæçè¾å ¥ handleTrayInput() { // æ 记为æå¨è¾å ¥æ¨¡å¼ this.isManualInput = true; this.isScanning = false; // æ¸ é¤ä¹åç计æ¶å¨ if (this.manualInputTimer) { clearTimeout(this.manualInputTimer); } // 设置计æ¶å¨ï¼å¦æä¸æ®µæ¶é´å 没æè¾å ¥ï¼åé置为æ«ç æ¨¡å¼ this.manualInputTimer = setTimeout(() => { this.isManualInput = false; }, 1000); }, // å¤çç©æè¾å ¥ handleBarcodeInput() { // æ 记为æå¨è¾å ¥æ¨¡å¼ this.isManualInput = true; this.isScanning = false; // æ¸ é¤ä¹åç计æ¶å¨ if (this.manualInputTimer) { clearTimeout(this.manualInputTimer); } // 设置计æ¶å¨ï¼å¦æä¸æ®µæ¶é´å 没æè¾å ¥ï¼åé置为æ«ç æ¨¡å¼ this.manualInputTimer = setTimeout(() => { this.isManualInput = false; }, 1000); }, // å¤çæçæ¡ç æäº¤ async handleTraySubmit() { // ä¿®å¤ï¼åæ¢æçæ¶æ¸ ç©ºç©æç¸å ³ç¶æï¼é¿å æ§æ°æ®æ®ç handleTraySubmit() { this.barcode = ''; this.materials = []; this.error = ''; // å ç´æ¥æ£æ¥locationTypeï¼é¿å 表åéªè¯ç弿¥é®é¢ if (!this.form.warehouseType) { this.error = '请å éæ©ä»åº'; return; @@ -586,31 +605,30 @@ return; } // ç¶ååè¿è¡å®æ´ç表åéªè¯ if (!await this.validateForm()) return; this.validateForm() .then(valid => { if (!valid) return; const currentTrayBarcode = this.trayBarcode.trim(); const currentTrayBarcode = this.trayBarcode.trim(); if (!currentTrayBarcode) { this.error = '请è¾å ¥ææ«ææçæ¡ç '; return; } if (!currentTrayBarcode) { this.error = '请è¾å ¥ææ«ææçæ¡ç '; return; } this.error = ''; this.error = ''; if (!this.trayBarcodeReg.test(currentTrayBarcode)) { this.$message("æçå·æ ¼å¼é误"); this.focusTrayInput(); return; } if (!this.trayBarcodeReg.test(currentTrayBarcode)) { this.$message("æçå·æ ¼å¼é误"); this.focusTrayInput(); return; } // 设置æçæ¡ç åï¼èªå¨èç¦å°ç©æè¾å ¥æ¡ this.focusBarcodeInput(); this.$message.success(`æçæ¡ç 已设置: ${currentTrayBarcode}`); this.focusBarcodeInput(); this.$message.success(`æçæ¡ç 已设置: ${currentTrayBarcode}`); }); }, // æ¸ é¤æç clearTray() { this.trayBarcode = ''; this.materials = []; @@ -622,12 +640,10 @@ }); }, // æ¸ ç©ºæçè¾å ¥ handleTrayClear() { this.error = ''; }, // æ¸ ç©ºè¾å ¥ handleClear() { this.error = ''; this.scanCode = ''; @@ -636,15 +652,15 @@ }, // å¤çç©ææ¡ç æäº¤ async handleBarcodeSubmit() { handleBarcodeSubmit() { if (this.isSubmitting) { this.$message.warning('æ£å¨å¤çä¸ï¼è¯·ç¨å'); return; } // æ°å¢ï¼æ ¡éªå½åæ¡ç æ¯å¦å·²è¢«å½åæçç»ç const currentBarcode = this.barcode.trim(); const currentTrayGrouped = this.palletGroupedBarcodes[this.trayBarcode] || []; if (currentTrayGrouped.includes(currentBarcode)) { this.error = `æ¡ç ${currentBarcode} 已被å½åæçç»çï¼è¯·å¿é夿ä½`; this.barcode = ''; @@ -652,121 +668,135 @@ return; } if (!await this.validateForm()) return; this.isSubmitting = true; this.validateForm() .then(valid => { if (!valid) { this.isSubmitting = false; return; } if (!this.trayBarcode) { this.error = '请å è¾å ¥æçæ¡ç '; this.focusTrayInput(); this.isSubmitting = false; return; } if (!this.trayBarcode) { this.error = '请å è¾å ¥æçæ¡ç '; this.focusTrayInput(); return; } if (!currentBarcode) { this.error = '请è¾å ¥ææ«æç©ææ¡ç '; this.isSubmitting = false; return; } if (!currentBarcode) { this.error = '请è¾å ¥ææ«æç©ææ¡ç '; return; } this.focusBarcodeInput(); this.error = ''; this.loading = true; this.isSubmitting = true; // å¼å¯æäº¤é try { // æ°å¢ï¼è°è¯æ¥å¿ï¼æå°è¯·æ±åæ° console.log('ç»ç请æ±åæ°:', { palletCode: this.trayBarcode, barcode: currentBarcode, locationTypeDesc: this.currentLocationDesc, locationType: this.form.locationType, warehouseType: this.form.warehouseType }); // è°ç¨APIæ¥è¯¢ç©æä¿¡æ¯ const materialData = await this.fetchMaterialData(currentBarcode); if (!materialData || materialData.length === 0) { return; } this.materials = []; const newBarcodes = []; // 临æ¶å卿¬æ¬¡æ°å¢çæ¡ç materialData.forEach(item => { this.materials.push({ ...item, trayCode: this.trayBarcode, locationType: this.form.locationType, locationDesc: this.currentLocationDesc, scanTime: this.formatTime(new Date()) }); newBarcodes.push(item.barcode); // æ¶éæ¬æ¬¡ç»ççæ¡ç }); // ä¿®å¤ï¼ææçåå¨å·²ç»çæ¡ç if (!this.palletGroupedBarcodes[this.trayBarcode]) { this.palletGroupedBarcodes[this.trayBarcode] = []; } this.palletGroupedBarcodes[this.trayBarcode] = [...new Set([...this.palletGroupedBarcodes[this.trayBarcode], ...newBarcodes])]; this.orderNo = materialData[0].orderNo; await this.fetchStockStatistics(materialData[0].orderNo); await this.fetchUnpalletMaterialDetails(); // æ¸ ç©ºç©æè¾å ¥æ¡å¹¶ä¿æèç¦ this.barcode = ''; this.scanCode = ''; // æ¸ ç©ºæ«ç ç¼å this.isScanning = false; setTimeout(() => { this.focusBarcodeInput(); }, 100); } catch (err) { this.error = err.message || 'æ¥è¯¢æ¡ç ä¿¡æ¯å¤±è´¥ï¼è¯·éè¯'; this.focusBarcodeInput(); setTimeout(() => { // éä¸è¾å ¥æ¡å çé误å 容ï¼ç¡®ä¿focus宿忧è¡ï¼ const inputEl = this.$refs.barcodeInput?.$el?.querySelector('input'); if (inputEl) inputEl.select(); }, 100); } finally { this.loading = false; this.isSubmitting = false; // å ³éæäº¤é } this.error = ''; this.loading = true; console.log('ç»ç请æ±åæ°:', { palletCode: this.trayBarcode, barcode: currentBarcode, locationTypeDesc: this.currentLocationDesc, locationType: this.form.locationType, warehouseType: this.form.warehouseType }); return this.fetchMaterialData(currentBarcode); }) .then(materialData => { if (!materialData || materialData.length === 0) { return; } this.materials = []; const newBarcodes = []; materialData.forEach(item => { this.materials.push({ ...item, trayCode: this.trayBarcode, locationType: this.form.locationType, locationDesc: this.currentLocationDesc, scanTime: this.formatTime(new Date()) }); newBarcodes.push(item.barcode); }); if (!this.palletGroupedBarcodes[this.trayBarcode]) { this.palletGroupedBarcodes[this.trayBarcode] = []; } this.palletGroupedBarcodes[this.trayBarcode] = [...new Set([...this.palletGroupedBarcodes[this.trayBarcode], ...newBarcodes])]; this.orderNo = materialData[0].orderNo; return Promise.all([ this.fetchStockStatistics(materialData[0].orderNo), this.fetchUnpalletMaterialDetails() ]); }) .then(() => { this.barcode = ''; this.scanCode = ''; this.isScanning = false; setTimeout(() => { this.focusBarcodeInput(); }, 100); }) .catch(err => { console.error('å¤çç©ææ¡ç 失败:', err); this.error = err.message || 'æ¥è¯¢æ¡ç ä¿¡æ¯å¤±è´¥ï¼è¯·éè¯'; this.focusBarcodeInput(); setTimeout(() => { const inputEl = this.$refs.barcodeInput?.$el?.querySelector('input'); if (inputEl) inputEl.select(); }, 100); }) .finally(() => { this.loading = false; this.isSubmitting = false; }); }, // APIè¯·æ± - æ¿æ¢ä¸ºå®é çAPIè°ç¨ async fetchMaterialData(barcode) { try { const response = await http.post('/api/Inbound/GroupPallet', { palletCode: this.trayBarcode, barcode: barcode, locationTypeDesc: this.currentLocationDesc, locationType: this.form.locationType, // æ·»å ä»åºåºåä¿¡æ¯ warehouseType: this.form.warehouseType // APIè¯·æ± fetchMaterialData(barcode) { return http.post('/api/Inbound/GroupPallet', { palletCode: this.trayBarcode, barcode: barcode, locationTypeDesc: this.currentLocationDesc, locationType: this.form.locationType, warehouseType: this.form.warehouseType }) .then(response => { let materialData; if (typeof response.data === 'string') { try { materialData = JSON.parse(response.data); } catch (e) { console.error('è§£æååºæ°æ®å¤±è´¥:', e); } } else { materialData = response.data; } ); let materialData; if (typeof response.data === 'string') { try { materialData = JSON.parse(response.data); } catch (e) { } } else { materialData = response.data; } if (!response.status) { this.error = response.message || 'æ¥è¯¢æ¡ç ä¿¡æ¯å¤±è´¥ï¼è¯·éè¯'; } return materialData; } catch (error) { console.error('APIè°ç¨å¤±è´¥:', error); this.$message.error('æ¥å£è¯·æ±å¤±è´¥ï¼è¯·è系管çå'); return []; } if (!response.status) { this.error = response.message || 'æ¥è¯¢æ¡ç ä¿¡æ¯å¤±è´¥ï¼è¯·éè¯'; return []; } return materialData || []; }) .catch(error => { console.error('APIè°ç¨å¤±è´¥:', error); this.$message.error('æ¥å£è¯·æ±å¤±è´¥ï¼è¯·è系管çå'); throw error; }); }, // å¤çæ«ç æªè¾å ¥ handleKeyPress(event) { // å¦ææ¯æå¨è¾å ¥æ¨¡å¼ææ£å¨æäº¤ï¼ä¸å¤çæ«ç æªé»è¾ if (this.isManualInput || this.isSubmitting) { return; } @@ -774,11 +804,9 @@ const key = event.key; const currentTime = new Date().getTime(); // 忽ç¥ç´æ¥æä¸çå车é®ï¼ç±handleBarcodeSubmitå¤çï¼ if (key === 'Enter') { event.preventDefault(); // 强å¶é»æ¢é»è®¤è¡ä¸ºï¼é¿å éå¤è§¦å event.preventDefault(); if (this.scanCode.length > 0) { // æ°å¢ï¼æ«ç ç®æ ä¸ºç©ææ¶ï¼æ ¡éªå½åæçæ¯å¦åå¨ if (this.scanTarget === 'material' && !this.trayBarcode) { this.$message.warning('请å 设置æçæ¡ç '); this.scanCode = ''; @@ -786,10 +814,8 @@ return; } // æ«ç 宿ï¼èªå¨è§¦åæ¥è¯¢ this.isScanning = false; // æ ¹æ®å½åæ«ç ç®æ 设置ç¸åºçè¾å ¥æ¡å¼ if (this.scanTarget === 'tray') { this.trayBarcode = this.scanCode; this.handleTraySubmit(); @@ -803,7 +829,6 @@ return; } // æå»ºæ«ç å 容ï¼å¿«éè¿ç»è¾å ¥è§ä¸ºæ«ç ï¼ if (this.lastKeyTime && currentTime - this.lastKeyTime < 50) { this.scanCode += key; this.isScanning = true; @@ -812,7 +837,6 @@ this.isScanning = true; } // 设置计æ¶å¨ï¼å¦æä¸æ®µæ¶é´å 没æè¾å ¥ï¼åéç½®æ«æç¶æ if (this.scanTimer) { clearTimeout(this.scanTimer); } @@ -835,9 +859,8 @@ return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`; }, // ä»åºåæ¢äºä»¶ï¼è¡¥å å®ç°ï¼å代ç ç¼ºå¤±ï¼ // ä»åºåæ¢äºä»¶ handleWarehouseChange() { // 忢ä»åºæ¶æ¸ 空åºååæçç¸å ³ç¶æ this.form.locationType = null; this.trayBarcode = ''; this.barcode = ''; @@ -845,9 +868,8 @@ this.error = ''; }, // åºå忢äºä»¶ï¼è¡¥å å®ç°ï¼å代ç ç¼ºå¤±ï¼ // åºå忢äºä»¶ handleLocationChange() { // 忢åºåæ¶æ¸ 空æçç¸å ³ç¶æ this.trayBarcode = ''; this.barcode = ''; this.materials = []; ÏîÄ¿´úÂë/WIDESEA_WMSClient/src/extension/outbound/extend/NoStockOut.vue
@@ -33,8 +33,11 @@ @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 @@ -62,7 +65,6 @@ label="æ«ææ¡ç :" style="width: 80%" name="barcode" :rules="[{ required: true, message: 'è¯·æ«ææè¾å ¥æ¡ç ', trigger: 'blur' }]" > <el-input ref="barcodeInputRef" @@ -71,7 +73,7 @@ @keydown.enter="debouncedHandleScan" autofocus class="custom-input" :disabled="!orderForm.outboundOrderNo || loading || submitLoading" :disabled="!isOutboundVerified || loading || submitLoading" ></el-input> </el-form-item> <el-form-item> @@ -80,7 +82,7 @@ size="small" @click="handleScan" class="custom-button" :disabled="!orderForm.outboundOrderNo || loading || submitLoading" :disabled="!isOutboundVerified || loading || submitLoading" > <Search /> ç¡®è®¤æ«æ </el-button> @@ -137,7 +139,8 @@ </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> @@ -151,7 +154,7 @@ 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 /> æäº¤åºåº @@ -196,6 +199,8 @@ const loading = ref(false); // æ°å¢ï¼æäº¤ä¸å±loadingç¶æï¼æ§å¶é®ç½©å±æ¾ç¤º const submitLoading = ref(false); // æ ¸å¿æ°å¢ï¼åºåºåéªè¯ç¶ææ è¯ const isOutboundVerified = ref(false); // 模æ¿å¼ç¨ const formRef = ref(null); @@ -229,6 +234,7 @@ orderForm.outboundOrderNo = ""; orderForm.purchaseOrderNo = ""; submitLoading.value = false; // æå¼å¼¹çªæ¶éç½®æäº¤loading isOutboundVerified.value = false; // æå¼å¼¹çªæ¶éç½®åºåºåéªè¯ç¶æ nextTick(() => { outboundInputRef.value?.focus(); // æå¼å¼¹çªä»èç¦åºåºåè¾å ¥æ¡ }); @@ -236,11 +242,12 @@ /** * éªè¯åºåºåæ®å·çæææ§ * æ ¸å¿ä¿®æ¹ï¼éªè¯æååç´æ¥èç¦æ¡ç æ«ææ¡ï¼å¤±è´¥åèç¦ååºåºåè¾å ¥æ¡ * æ ¸å¿ä¿®æ¹ï¼éªè¯æååæ è®°isOutboundVerified为trueï¼å¤±è´¥åé置为false */ const validateOutboundOrder = async () => { const outboundOrderNo = orderForm.outboundOrderNo.trim(); if (!outboundOrderNo) { ElMessage.warning("请è¾å ¥åºåºåæ®å·"); return; } @@ -252,8 +259,9 @@ ); if (res.status !== true) { // éªè¯å¤±è´¥ï¼æ¸ 空è¾å ¥æ¡ï¼æç¤ºé误ï¼èç¦ååºåºåè¾å ¥æ¡ // éªè¯å¤±è´¥ï¼æ¸ 空è¾å ¥æ¡ï¼æç¤ºé误ï¼éç½®éªè¯ç¶æï¼èç¦ååºåºåè¾å ¥æ¡ orderForm.outboundOrderNo = ""; isOutboundVerified.value = false; ElMessage.error(res.message || "åºåºåæ®å·éªè¯å¤±è´¥ï¼è¯·æ£æ¥åæ®å·æ¯å¦æ£ç¡®"); nextTick(() => { outboundInputRef.value?.focus(); // 失败èç¦åºåºåè¾å ¥æ¡ @@ -261,14 +269,16 @@ 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(); // å¼å¸¸èç¦åºåºåè¾å ¥æ¡ @@ -280,8 +290,9 @@ // åºåºåè¾å ¥å¤ç const handleOutboundInput = (value) => { // æ ¸å¿ä¿®æ¹ï¼è¾å ¥æ¶èªå¨éç½®éªè¯ç¶æï¼é²æ¢æå¨ä¿®æ¹å·²éªè¯çåºåºåå·ï¼ if (value && value.trim()) { // å¯ä¿çåºåºåå·æ ¼å¼éªè¯é»è¾ isOutboundVerified.value = false; } }; @@ -294,10 +305,13 @@ // èç¦æ¡ç è¾å ¥æ¡ï¼å¤ç¨å½æ°ï¼ const focusBarcodeInputDirectly = () => { if (orderForm.outboundOrderNo.trim()) { if (isOutboundVerified.value) { barcodeInputRef.value?.focus(); } else { ElMessage.warning("请å è¾å ¥ææçåºåºåæ®å·"); ElMessage.warning("请å è¾å ¥å¹¶éªè¯ææçåºåºåæ®å·"); nextTick(() => { outboundInputRef.value?.focus(); }); } }; @@ -323,6 +337,15 @@ // æ«ææ¡ç æ ¸å¿é»è¾ const handleScan = async () => { // æ ¸å¿æ°å¢ï¼åç½®æ ¡éªï¼ç¡®ä¿åºåºåå·²éªè¯ if (!isOutboundVerified.value) { ElMessage.warning("请å éªè¯ææçåºåºåæ®å·ååæ«ææ¡ç "); nextTick(() => { outboundInputRef.value?.focus(); }); return; } if (!formRef.value) return; await formRef.value.validateField('barcode'); @@ -347,8 +370,8 @@ orderForm.purchaseOrderNo = purchaseOrderNo; } else { ElMessage.info("æªæ¥è¯¢å°è¯¥æ¡ç 对åºçéè´åå·ï¼ç»§ç»éªè¯æ¡ç æææ§"); formData.barcode = ""; // æ°å¢ï¼éªè¯å¤±è´¥æ¶æ¸ 空è¾å ¥æ¡ nextTick(() => barcodeInputRef.value?.focus()); // æ°å¢ï¼èç¦æ¡ç è¾å ¥æ¡ formData.barcode = ""; nextTick(() => barcodeInputRef.value?.focus()); } // æ¥éª¤2ï¼éªè¯æ¡ç å¹¶è·åç©æä¿¡æ¯ @@ -361,8 +384,8 @@ 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 || '', @@ -379,13 +402,12 @@ } } 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; @@ -437,9 +459,18 @@ // æäº¤åºåº 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; } @@ -460,13 +491,14 @@ 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; @@ -525,6 +557,25 @@ 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%; } ÏîÄ¿´úÂë/WIDESEA_WMSClient/src/views/outbound/outPicking.vue
@@ -499,43 +499,81 @@ } }, loadUnpickedData() { return new Promise((resolve, reject) => { this.http.post(`/api/Outbound/QueryPickingTasks?orderNo=${this.orderNo}&palletCode=${this.scanForm.palletCode}`, {}).then(response => { if (response.status) { if (response.data.outStockLockInfos.length > 0) { this.unpickedData = response.data.outStockLockInfos; this.matMixed = response.data.isMatMixed; this.orderOver = response.data.orderOver; this.calculateUnpickedStats() // æ£æ¥æ¯å¦éè¦æ´åºç¡®è®¤ this.$nextTick(() => { if (this.hasWholeOut()) { this.showWholeOutConfirm() } }) // èªå¨èç¦å°ç©ææ¡ç è¾å ¥æ¡ this.$nextTick(() => { if (this.$refs.materialInput) { this.$refs.materialInput.focus() } }) } else { if (flag) { this.$message.warning('该æçæ æªæ£éä»»å¡') } this.unpickedData = [] return new Promise((resolve, reject) => { // å æ¸ 空ä¹åçæç¤ºï¼é¿å éå¤æç¤º this.$message.closeAll(); this.http.post(`/api/Outbound/QueryPickingTasks?orderNo=${this.orderNo}&palletCode=${this.scanForm.palletCode}`, {}).then(response => { if (response.status) { // æ åµ1ï¼ææªæ£éæ°æ® if (response.data.outStockLockInfos && response.data.outStockLockInfos.length > 0) { this.unpickedData = response.data.outStockLockInfos; this.matMixed = response.data.isMatMixed; this.orderOver = response.data.orderOver; this.calculateUnpickedStats() // æ£æ¥æ´åºç¡®è®¤ this.$nextTick(() => { if (this.hasWholeOut()) { this.showWholeOutConfirm() } resolve() } else { this.$message.error(response.message || 'è·åæçæ°æ®å¤±è´¥') this.unpickedData = [] reject(response.message || 'è·åæçæ°æ®å¤±è´¥') } }).catch(error => { reject(error) }) }) }, }) // èç¦ç©ææ¡ç è¾å ¥æ¡ this.$nextTick(() => { if (this.$refs.materialInput) { this.$refs.materialInput.focus() } }) } // æ åµ2ï¼æ æªæ£éæ°æ® else { this.unpickedData = []; this.calculateUnpickedStats(); // éç½®ç»è®¡æ°æ® // å好æç¤º + 交äºä¼å this.$message.warning({ message: `æçã${this.scanForm.palletCode}ãææ æ£éè®°å½`, duration: 3000, // æç¤ºæ¾ç¤º3ç§ showClose: true // å 许æå¨å ³é }); // æ¸ ç©ºç©ææ¡ç å¹¶èç¦åæçç è¾å ¥æ¡ this.scanForm.materialBarcode = ''; this.$nextTick(() => { if (this.$refs.palletInput) { this.$refs.palletInput.focus(); } }); } resolve(); } // æ åµ3ï¼æ¥å£è¿å失败 else { this.unpickedData = []; this.calculateUnpickedStats(); this.$message.error({ message: response.message || `è·åæçã${this.scanForm.palletCode}ãæ£éæ°æ®å¤±è´¥`, duration: 5000, showClose: true }); reject(response.message || 'è·åæçæ°æ®å¤±è´¥'); } }).catch(error => { // æ åµ4ï¼ç½ç»/请æ±å¼å¸¸ this.unpickedData = []; this.calculateUnpickedStats(); this.$message.error({ message: `è·åæçã${this.scanForm.palletCode}ãæ£éæ°æ®å¼å¸¸ï¼${error.message || 'ç½ç»é误ï¼è¯·éè¯'}`, duration: 5000, showClose: true }); reject(error); }) }) }, loadPickedData() { return new Promise((resolve, reject) => { @@ -546,8 +584,10 @@ this.calculatePickedStats() } else { this.pickedData = [] } resolve() } else { this.$message.error(response.message || 'è·åæçæ°æ®å¤±è´¥') this.pickedData = [] ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_BasicService/MESOperation/FeedbackMesService.cs
@@ -56,6 +56,11 @@ { return webResponse = WebResponseContent.Instance.OK($"è¯¥åæ®æ éåä¼ MES"); } if (outboundOrder.IsBatch == 0 && outboundOrder.OrderStatus != OutOrderStatusEnum.åºåºå®æ.ObjToInt()) { return webResponse = WebResponseContent.Instance.OK($"è¯¥åæ®å±äºä¸åæ¹èªå¨åä¼ ï¼ä¸å¯æå¨åæ¹åä¼ "); } List<Dt_MesReturnRecord> returnRecords = BaseDal.QueryData(x => x.OrderNo == orderNo && x.OrderId == outboundOrder.Id && x.ReturnStatus == 2); foreach (var item in returnRecords) ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_InboundService/TakeStockOrderService.cs
@@ -30,6 +30,7 @@ using WIDESEA_DTO.CalcOut; using Newtonsoft.Json.Serialization; using Newtonsoft.Json; using WIDESEA_DTO.Basic; namespace WIDESEA_InboundService { @@ -50,7 +51,8 @@ private readonly IRepository<Dt_StockInfoDetail> _stockInfoDetailRepository; private readonly IOutboundService _outboundService; private readonly IFeedbackMesService _feedbackMesService; public TakeStockOrderService(IRepository<Dt_TakeStockOrder> BaseDal, IUnitOfWorkManage unitOfWorkManage,IRepository<Dt_TakeStockOrder> takeStockOrder,IRepository<Dt_StockInfo> stockInfoRepository,IRepository<Dt_TakeStockOrderDetail> takeStockOrderDetail,IRepository<Dt_Task> taskRepository,ILocationInfoService locationInfoService, IRepository<Dt_InboundOrder> inboundOrderRepository,IRepository<Dt_OutboundOrder> outboundOrderRepository,IRepository<Dt_InboundOrderDetail> inboundOrderDetailRepository, IRepository<Dt_OutboundOrderDetail> outboundOrderDetailRepository, IOutboundPickingService outboundPickingService, IRepository<Dt_StockInfoDetail> stockInfoDetailRepository, IOutboundService outboundService,IFeedbackMesService feedbackMesService) : base(BaseDal) private readonly IESSApiService _eSSApiService; public TakeStockOrderService(IRepository<Dt_TakeStockOrder> BaseDal, IUnitOfWorkManage unitOfWorkManage,IRepository<Dt_TakeStockOrder> takeStockOrder,IRepository<Dt_StockInfo> stockInfoRepository,IRepository<Dt_TakeStockOrderDetail> takeStockOrderDetail,IRepository<Dt_Task> taskRepository,ILocationInfoService locationInfoService, IRepository<Dt_InboundOrder> inboundOrderRepository,IRepository<Dt_OutboundOrder> outboundOrderRepository,IRepository<Dt_InboundOrderDetail> inboundOrderDetailRepository, IRepository<Dt_OutboundOrderDetail> outboundOrderDetailRepository, IOutboundPickingService outboundPickingService, IRepository<Dt_StockInfoDetail> stockInfoDetailRepository, IOutboundService outboundService,IFeedbackMesService feedbackMesService,IESSApiService eSSApiService) : base(BaseDal) { _unitOfWorkManage = unitOfWorkManage; _takeStockOrder = takeStockOrder; @@ -66,8 +68,20 @@ _stockInfoDetailRepository = stockInfoDetailRepository; _outboundService = outboundService; _feedbackMesService = feedbackMesService; _eSSApiService = eSSApiService; } private Dictionary<string, string> stations = new Dictionary<string, string> { {"2-1","2-9" }, {"3-1","3-9" }, }; private Dictionary<string, string> movestations = new Dictionary<string, string> { {"2-1","2-5" }, {"3-1","3-5" }, }; public WebResponseContent ValidateBoxNo(string orderNo, string boxNo) { try @@ -253,7 +267,7 @@ NextAddress = "", OrderNo = takeStockOrder.OrderNo, Roadway = newLocation.RoadwayNo, SourceAddress = sourceAddress, SourceAddress = stations.GetValueOrDefault(sourceAddress)??"", TargetAddress = newLocation.LocationCode, TaskStatus = (int)TaskStatusEnum.New, TaskType = TaskTypeEnum.InInventory.ObjToInt(), @@ -271,11 +285,11 @@ _taskRepository.AddData(newTask); _unitOfWorkManage.CommitTran(); //var moveResult = await _eSSApiService.MoveContainerAsync(new MoveContainerRequest //{ // slotCode = movestations[station], // containerCode = palletCode //}); var moveResult = _eSSApiService.MoveContainerAsync(new MoveContainerRequest { slotCode = movestations[sourceAddress], containerCode = boxNo }); return content.OK(); } ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundPickingService.cs
@@ -2336,258 +2336,370 @@ return WebResponseContent.Instance.OK("æå"); } public WebResponseContent BarcodeValidate(NoStockOutModel noStockOut) public WebResponseContent BarcodeValidate(NoStockOutModel noStockOut) { try { try Dt_InboundOrder inboundOrder = Db.Queryable<Dt_InboundOrder>() .Where(x => x.UpperOrderNo == noStockOut.inOder && x.OrderStatus != InOrderStatusEnum.å ¥åºå®æ.ObjToInt()) .Includes(x => x.Details) .First(); if (inboundOrder == null) { Dt_InboundOrder inboundOrder = Db.Queryable<Dt_InboundOrder>().Where(x => x.UpperOrderNo == noStockOut.inOder && x.OrderStatus != InOrderStatusEnum.å ¥åºå®æ.ObjToInt()).Includes(x => x.Details).First(); if (inboundOrder == null) { return WebResponseContent.Instance.Error($"æªæ¾å°éè´åï¼{noStockOut.inOder}"); } Dt_OutboundOrder outboundOrder = Db.Queryable<Dt_OutboundOrder>().Where(x => x.UpperOrderNo == noStockOut.outOder && x.OrderStatus != OutOrderStatusEnum.åºåºå®æ.ObjToInt()).Includes(x => x.Details).First(); if (outboundOrder == null) { return WebResponseContent.Instance.Error($"æªæ¾å°åºåºåï¼{noStockOut.inOder}"); } return WebResponseContent.Instance.Error($"æªæ¾å°éè´åï¼{noStockOut.inOder}"); } //åå¨å ¥åºåæ®æç»ä¿¡æ¯ var detailLists = new List<Dt_InboundOrderDetail>(); Dt_OutboundOrder outboundOrder = Db.Queryable<Dt_OutboundOrder>() .Where(x => x.UpperOrderNo == noStockOut.outOder && x.OrderStatus != OutOrderStatusEnum.åºåºå®æ.ObjToInt()) .Includes(x => x.Details) .First(); if (outboundOrder == null) { return WebResponseContent.Instance.Error($"æªæ¾å°åºåºåï¼{noStockOut.outOder}"); } var matchedDetail = inboundOrder.Details.FirstOrDefault(detail => detail.Barcode == noStockOut.barCode && var detailLists = new List<Dt_InboundOrderDetail>(); var matchedDetail = inboundOrder.Details.FirstOrDefault(detail => detail.Barcode == noStockOut.barCode && detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt()); if (matchedDetail == null) { matchedDetail = inboundOrder.Details.FirstOrDefault(detail => detail.OutBoxbarcodes == noStockOut.barCode && detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt()); if (matchedDetail == null) { matchedDetail = inboundOrder.Details.FirstOrDefault(detail => detail.OutBoxbarcodes == noStockOut.barCode && detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt()); if (matchedDetail == null) { return WebResponseContent.Instance.Error($"å¨éè´å {noStockOut.inOder} 䏿ªæ¾å°æ¡ç 为 {noStockOut.barCode} çæç»ã"); } else { // æ·»å ææéå®æç¶æçæç»æ¡ç foreach (var detail in inboundOrder.Details) { if (detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt() && !string.IsNullOrEmpty(detail.Barcode)&& detail.OutBoxbarcodes == noStockOut.barCode) { detailLists.Add(detail); } } } } else { if (!string.IsNullOrEmpty(noStockOut.barCode)) { detailLists.Add(matchedDetail); } } var outDetails = new List<Dt_OutboundOrderDetail>(); foreach (var item in detailLists) { item.NoStockOutQty = 0; var matchedCode = outboundOrder.Details.FirstOrDefault(detail => detail.MaterielCode == item.MaterielCode && detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt()&& detail.OrderQuantity - detail.LockQuantity - detail.MoveQty - detail.NoStockOutQty > 0); if (matchedCode != null) { if(matchedCode.OrderQuantity - matchedCode.LockQuantity - matchedCode.MoveQty - matchedCode.NoStockOutQty < 0) { return WebResponseContent.Instance.Error($"ç©æ{item.MaterielCode}å¯åºæ°é溢åº{(matchedCode.LockQuantity + matchedCode.MoveQty + matchedCode.NoStockOutQty) - matchedCode.OrderQuantity}"); } } else { return WebResponseContent.Instance.Error($"å¨åºåºåçç©æç¼ç 䏿ªæ¾å°ä¸éè´åä¸ç{item.MaterielCode} 对åºçç©æ"); } if (!matchedCode.BatchNo.IsNullOrEmpty() && matchedCode.BatchNo != "") { var matcheBatch = outboundOrder.Details.FirstOrDefault(detail => detail.BatchNo == item.BatchNo); if (matcheBatch == null) { return WebResponseContent.Instance.Error($"å¨åºåºåçç©æç¼ç 䏿ªæ¾å°ä¸éè´åæ¹æ¬¡ä¸ç{item.BatchNo} 对åºçç©æã"); } } if (!matchedCode.SupplyCode.IsNullOrEmpty() && matchedCode.SupplyCode != "") { var matcheBatch = outboundOrder.Details.FirstOrDefault(detail => detail.SupplyCode == item.SupplyCode); if (matcheBatch == null) { return WebResponseContent.Instance.Error($"å¨åºåºåçç©æç¼ç 䏿ªæ¾å°ä¸éè´åä¾åºåä¸ç{item.SupplyCode} 对åºçç©æã"); } } if (!outboundOrder.FactoryArea.IsNullOrEmpty() && outboundOrder.FactoryArea != "" && !inboundOrder.FactoryArea.IsNullOrEmpty() && inboundOrder.FactoryArea != "") { if (inboundOrder.FactoryArea != outboundOrder.FactoryArea) { return WebResponseContent.Instance.Error($"该æ¡ç {item.Barcode}对åºçåæ®ååºä¸åºåºåæ®ä¸ä¸è´ï¼ä¸å 许åºåºã"); } } if(inboundOrder.BusinessType != "11") { if (!matchedCode.WarehouseCode.IsNullOrEmpty() && matchedCode.WarehouseCode != "") { var matcheBatch = outboundOrder.Details.FirstOrDefault(detail => detail.WarehouseCode == item.WarehouseCode); if (matcheBatch == null) { return WebResponseContent.Instance.Error($"ä»åºä¸ä¸è´ï¼å¨åºåºåçç©æç¼ç 䏿ªæ¾å°ä¸éè´åä»åºä¸ç{item.WarehouseCode} 对åºçç©æã"); } } } else { item.WarehouseCode = matchedCode.WarehouseCode; } //å©ä½å ¥åºæ°éå³èæåºå ¥åºå©ä½å¯åºæ°é decimal outQuantity = item.OrderQuantity - item.ReceiptQuantity; if (outQuantity == 0) { return WebResponseContent.Instance.Error($"该éè´åä¸çæ¡ç 对åºçå¯åºæ°é为0"); } if (matchedCode.OrderQuantity - matchedCode.LockQuantity - matchedCode.MoveQty - matchedCode.NoStockOutQty < outQuantity) { return WebResponseContent.Instance.Error($"该éè´åä¸çæ¡ç 对åºçå¯åºæ°éè¶ åºåºåºååºåºæ°é{item.OrderQuantity - (matchedCode.OrderQuantity - matchedCode.LockQuantity - matchedCode.MoveQty)},䏿»¡è¶³æ´å åºåº"); } //åæ®åºåºé宿°é item.NoStockOutQty += outQuantity; matchedCode.NoStockOutQty += outQuantity; //åä¼ MESåæ° List<Barcodes> barcodesList = new List<Barcodes>(); Barcodes barcodes = new Barcodes { Barcode = item.Barcode, Qty = item.OrderQuantity, SupplyCode = item?.SupplyCode ?? "", BatchNo = item?.BatchNo ?? "", Unit = item?.Unit ?? "" }; if (!string.IsNullOrEmpty(matchedCode.documentsNO)) { barcodesList = JsonConvert.DeserializeObject<List<Barcodes>>(matchedCode.documentsNO) ?? new List<Barcodes>(); } barcodesList.Add(barcodes); JsonSerializerSettings settings = new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() }; matchedCode.documentsNO = JsonConvert.SerializeObject(barcodesList, settings); if ((matchedCode.LockQuantity + matchedCode.NoStockOutQty+matchedCode.MoveQty) > matchedCode.OrderQuantity) { return WebResponseContent.Instance.Error($"åºåºåæç»æ°é溢åº{matchedCode.OrderQuantity - matchedCode.LockQuantity-matchedCode.NoStockOutQty-matchedCode.MoveQty}"); } outDetails.Add(matchedCode); } _unitOfWorkManage.BeginTran(); _inboundOrderDetailService.UpdateData(detailLists); _outboundOrderDetailService.UpdateData(outDetails); _unitOfWorkManage.CommitTran(); return WebResponseContent.Instance.OK("æå",data:detailLists); } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); return WebResponseContent.Instance.Error(ex.Message); } } public WebResponseContent DeleteBarcode(NoStockOutModel noStockOut) { try { Dt_InboundOrder inboundOrder = Db.Queryable<Dt_InboundOrder>().Where(x => x.UpperOrderNo == noStockOut.inOder && x.OrderStatus != InOrderStatusEnum.å ¥åºå®æ.ObjToInt()).Includes(x => x.Details).First(); if (inboundOrder == null) { return WebResponseContent.Instance.Error($"æªæ¾å°éè´åï¼{noStockOut.inOder}"); } var matchedDetail = inboundOrder.Details.FirstOrDefault(detail => detail.Barcode == noStockOut.barCode && detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt()); if (matchedDetail == null) { return WebResponseContent.Instance.Error($"å¨éè´å {noStockOut.inOder} 䏿ªæ¾å°æ¡ç 为 {noStockOut.barCode} çæç»ã"); } matchedDetail.NoStockOutQty = 0; if (matchedDetail.ReceiptQuantity == 0 && matchedDetail.OverInQuantity == 0) else { matchedDetail.OrderDetailStatus = OrderDetailStatusEnum.New.ObjToInt(); // æ·»å ææå¹é å¤ç®±ç ä¸éå®æç¶æçæç» foreach (var detail in inboundOrder.Details) { if (detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt() && !string.IsNullOrEmpty(detail.Barcode) && detail.OutBoxbarcodes == noStockOut.barCode) { detailLists.Add(detail); } } } } else { if (!string.IsNullOrEmpty(noStockOut.barCode)) { detailLists.Add(matchedDetail); } } var outDetails = new List<Dt_OutboundOrderDetail>(); // éåæ¯ä¸ªå ¥åºæç» foreach (var item in detailLists) { // éç½®å½åå ¥åºæç»çæ åºååºåºæ°é item.NoStockOutQty = 0; // å½åæ¡ç éè¦åºåºçæ»æ°éï¼å ¥åºåå©ä½å¯åºæ°éï¼ decimal remainingBarcodeQty = item.OrderQuantity - item.ReceiptQuantity; if (remainingBarcodeQty <= 0) { return WebResponseContent.Instance.Error($"该éè´åä¸çæ¡ç {item.Barcode}对åºçå¯åºæ°é为0"); } // çéåºåºåä¸ç¬¦åæ¡ä»¶çæç»ï¼åç©æãé宿ãæå©ä½å¯åºæ°éï¼ var eligibleOutDetails = outboundOrder.Details.Where(detail => detail.MaterielCode == item.MaterielCode && detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt() && (detail.OrderQuantity - detail.LockQuantity - detail.MoveQty - detail.NoStockOutQty) > 0).ToList(); if (!eligibleOutDetails.Any()) { return WebResponseContent.Instance.Error($"å¨åºåºå䏿ªæ¾å°ç©æ{item.MaterielCode}çå¯åºåºæç»"); } // éåç¬¦åæ¡ä»¶çåºåºæç»ï¼éè¡åé æ°é foreach (var outDetail in eligibleOutDetails) { // 计ç®å½ååºåºè¡çå©ä½å¯åºæ°é decimal rowRemainingQty = outDetail.OrderQuantity - outDetail.LockQuantity - outDetail.MoveQty - outDetail.NoStockOutQty; if (rowRemainingQty <= 0) continue; if (!outDetail.BatchNo.IsNullOrEmpty()) { if (outDetail.BatchNo != item.BatchNo) { return WebResponseContent.Instance.Error($"åºåºåè¡æ¹æ¬¡{outDetail.BatchNo}ä¸éè´åæ¹æ¬¡{item.BatchNo}ä¸å¹é "); } } if (!outDetail.SupplyCode.IsNullOrEmpty()) { if (outDetail.SupplyCode != item.SupplyCode) { return WebResponseContent.Instance.Error($"åºåºåè¡ä¾åºå{outDetail.SupplyCode}ä¸éè´åä¾åºå{item.SupplyCode}ä¸å¹é "); } } if (!string.IsNullOrEmpty(outboundOrder.FactoryArea) && !string.IsNullOrEmpty(inboundOrder.FactoryArea)) { if (inboundOrder.FactoryArea != outboundOrder.FactoryArea) { return WebResponseContent.Instance.Error($"该æ¡ç {item.Barcode}对åºçåæ®ååºä¸åºåºåæ®ä¸ä¸è´ï¼ä¸å 许åºåºã"); } } if (inboundOrder.BusinessType != "11" && !outDetail.WarehouseCode.IsNullOrEmpty()) { if (outDetail.WarehouseCode != item.WarehouseCode) { return WebResponseContent.Instance.Error($"ä»åºä¸ä¸è´ï¼åºåºåè¡ä»åº{outDetail.WarehouseCode}ä¸éè´åä»åº{item.WarehouseCode}ä¸å¹é "); } } else { item.WarehouseCode = outDetail.WarehouseCode; } // è®¡ç®æ¬æ¬¡åé çæ°éï¼åå©ä½æ¡ç æ°éåå½åè¡å©ä½æ°éçè¾å°å¼ï¼ decimal assignQty = Math.Min(remainingBarcodeQty, rowRemainingQty); // æ´æ°å ¥åºæç»ååºåºæç»çæ åºååºåºæ°é item.NoStockOutQty += assignQty; outDetail.NoStockOutQty += assignQty; // æ´æ°å©ä½éè¦åé çæ¡ç æ°é remainingBarcodeQty -= assignQty; // è®°å½å·²æ´æ°çåºåºæç»ï¼å»éï¼ if (!outDetails.Contains(outDetail)) { outDetails.Add(outDetail); } // éªè¯å½åè¡æ¯å¦æº¢åº if ((outDetail.LockQuantity + outDetail.NoStockOutQty + outDetail.MoveQty) > outDetail.OrderQuantity) { return WebResponseContent.Instance.Error($"åºåºåæç»{outDetail.Id}æ°é溢åºï¼è¶ åºæ°éï¼{(outDetail.LockQuantity + outDetail.NoStockOutQty + outDetail.MoveQty) - outDetail.OrderQuantity}"); } // å¤çMESåæ°åä¼ ï¼è®°å½å½åæ¡ç åé å°è¯¥è¡çå®é æ°é List<Barcodes> barcodesList = new List<Barcodes>(); Barcodes barcodes = new Barcodes { Barcode = item.Barcode, Qty = assignQty, SupplyCode = item?.SupplyCode ?? "", BatchNo = item?.BatchNo ?? "", Unit = item?.Unit ?? "" }; // ååºåå该è¡å·²æçæ¡ç è®°å½ if (!string.IsNullOrEmpty(outDetail.documentsNO)) { try { barcodesList = JsonConvert.DeserializeObject<List<Barcodes>>(outDetail.documentsNO) ?? new List<Barcodes>(); } catch (JsonException ex) { return WebResponseContent.Instance.Error($"åºåºåæç»{outDetail.Id}çdocumentsNOåæ®µæ ¼å¼é误ï¼{ex.Message}"); } } // æ·»å æ¬æ¬¡åé çè®°å½ barcodesList.Add(barcodes); // åºåååå JsonSerializerSettings settings = new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() }; outDetail.documentsNO = JsonConvert.SerializeObject(barcodesList, settings); // æ¡ç æ°éåé 宿¯ï¼éåºå½åè¡å¾ªç¯ if (remainingBarcodeQty <= 0) { break; } } // ææç¬¦åæ¡ä»¶çåºåºè¡éåå®åï¼æ¡ç æ°é仿å©ä½ if (remainingBarcodeQty > 0) { return WebResponseContent.Instance.Error($"æ¡ç {item.Barcode}éåºåºæ°é{item.OrderQuantity - item.ReceiptQuantity}ï¼ä½åºåºåä¸ç©æ{item.MaterielCode}å©ä½å¯åºæ»éä¸è¶³ï¼ä»å©ä½{remainingBarcodeQty}æ°éæªåé "); } } Dt_OutboundOrder outboundOrder = Db.Queryable<Dt_OutboundOrder>().Where(x => x.UpperOrderNo == noStockOut.outOder && x.OrderStatus != OutOrderStatusEnum.åºåºå®æ.ObjToInt()).Includes(x => x.Details).First(); if (outboundOrder == null) { return WebResponseContent.Instance.Error($"æªæ¾å°åºåºåï¼{noStockOut.inOder}"); } _unitOfWorkManage.BeginTran(); _inboundOrderDetailService.UpdateData(detailLists); _outboundOrderDetailService.UpdateData(outDetails); _unitOfWorkManage.CommitTran(); // æ¤éåä¼ MESåæ° return WebResponseContent.Instance.OK("æå", data: detailLists); } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); return WebResponseContent.Instance.Error(ex.Message); } } public WebResponseContent DeleteBarcode(NoStockOutModel noStockOut) { try { Dt_InboundOrder inboundOrder = Db.Queryable<Dt_InboundOrder>() .Where(x => x.UpperOrderNo == noStockOut.inOder && x.OrderStatus != InOrderStatusEnum.å ¥åºå®æ.ObjToInt()) .Includes(x => x.Details) .First(); if (inboundOrder == null) { return WebResponseContent.Instance.Error($"æªæ¾å°éè´åï¼{noStockOut.inOder}"); } var matchedDetail = inboundOrder.Details.FirstOrDefault(detail => detail.Barcode == noStockOut.barCode && detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt()); if (matchedDetail == null) { return WebResponseContent.Instance.Error($"å¨éè´å {noStockOut.inOder} 䏿ªæ¾å°æ¡ç 为 {noStockOut.barCode} çæç»ã"); } // éç½®å ¥åºæç»çæ åºååºåºæ°é decimal revokedTotalQty = matchedDetail.NoStockOutQty; // è®°å½éè¦æ¤éçæ»æ°éï¼å ¥åºåä¸å·²åé çæ°éï¼ matchedDetail.NoStockOutQty = 0; if(inboundOrder.BusinessType == "11") { matchedDetail.WarehouseCode =""; } // éç½®å ¥åºæç»ç¶æ if (matchedDetail.ReceiptQuantity == 0 && matchedDetail.OverInQuantity == 0) { matchedDetail.OrderDetailStatus = OrderDetailStatusEnum.New.ObjToInt(); } Dt_OutboundOrder outboundOrder = Db.Queryable<Dt_OutboundOrder>() .Where(x => x.UpperOrderNo == noStockOut.outOder && x.OrderStatus != OutOrderStatusEnum.åºåºå®æ.ObjToInt()) .Includes(x => x.Details) .First(); if (outboundOrder == null) { return WebResponseContent.Instance.Error($"æªæ¾å°åºåºåï¼{noStockOut.outOder}"); } // æ¾å°ææå ³è该æ¡ç çåºåºæç»è¡ // åç©æãéå®æç¶æãdocumentsNOå å«è¯¥æ¡ç var matchedCodeList = outboundOrder.Details.Where(detail => detail.MaterielCode == matchedDetail.MaterielCode && // ç¡®ä¿ç©æå¹é detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt() && !string.IsNullOrEmpty(detail.documentsNO) && detail.documentsNO.Contains(noStockOut.barCode) // å å«å½åæ¡ç ).ToList(); if (!matchedCodeList.Any()) { return WebResponseContent.Instance.Error($"å¨åºåºå䏿ªæ¾å°å ³èæ¡ç {noStockOut.barCode}çç©æ{matchedDetail.MaterielCode}æç»ã"); } //éè¡å¤çåºåºæç»çæ¤éé»è¾ decimal remainingRevokeQty = revokedTotalQty; // å©ä½éè¦æ¤éçæ°é foreach (var matchedCode in matchedCodeList) { if (remainingRevokeQty <= 0) break; // æææ°éå·²æ¤éï¼éåºå¾ªç¯ // å¤çMESåæ°æ¤é List<Barcodes> barcodesList = new List<Barcodes>(); Barcodes barcodes = new Barcodes { Barcode = matchedDetail.Barcode, Qty = matchedDetail.OrderQuantity, SupplyCode = matchedDetail?.SupplyCode ?? "", BatchNo = matchedDetail?.BatchNo ?? "", Unit = matchedDetail?.Unit ?? "" }; var matchedCode = outboundOrder.Details.FirstOrDefault(detail => detail.documentsNO.Contains(barcodes.Barcode) && detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt() ); if (matchedCode == null) { return WebResponseContent.Instance.Error($"å¨åºåºåçç©æç¼ç 䏿ªæ¾å°ä¸éè´åä¸ç{matchedDetail.MaterielCode} 对åºçç©æã"); } if (!string.IsNullOrEmpty(matchedCode.documentsNO)) { barcodesList = JsonConvert.DeserializeObject<List<Barcodes>>(matchedCode.documentsNO) ?? new List<Barcodes>(); try { barcodesList = JsonConvert.DeserializeObject<List<Barcodes>>(matchedCode.documentsNO) ?? new List<Barcodes>(); } catch (JsonException ex) { return WebResponseContent.Instance.Error($"åºåºåæç»{matchedCode.Id}çdocumentsNOåæ®µæ ¼å¼é误ï¼{ex.Message}"); } } barcodesList.RemoveAll(b => string.Equals(b.Barcode, barcodes.Barcode, StringComparison.OrdinalIgnoreCase) ); // çéåºå½åæ¡ç çææè®°å½ var barcodeRecords = barcodesList.Where(b => string.Equals(b.Barcode, noStockOut.barCode, StringComparison.OrdinalIgnoreCase)).ToList(); if (!barcodeRecords.Any()) continue; // 计ç®è¯¥è¡éè¦æ¤éçæ°éï¼ç´¯å 该æ¡ç å¨è¯¥è¡çææåé æ°éï¼ decimal rowRevokeQty = barcodeRecords.Sum(b => b.Qty); // å®é æ¤éæ°éï¼å该è¡å¯æ¤éæ°éåå©ä½éè¦æ¤éæ°éçè¾å°å¼ decimal actualRevokeQty = Math.Min(rowRevokeQty, remainingRevokeQty); // ç§»é¤è¯¥è¡ä¸è¯¥æ¡ç çè®°å½ï¼æé¨åè®°å½ï¼è¥å©ä½æ¤éæ°éä¸è¶³ï¼ if (actualRevokeQty < rowRevokeQty) { // å©ä½æ¤éæ°éä¸è¶³ï¼åªç§»é¤é¨åè®°å½ï¼ææ°éæ£åï¼ decimal tempQty = actualRevokeQty; var removeList = new List<Barcodes>(); foreach (var record in barcodeRecords) { if (tempQty <= 0) break; if (record.Qty <= tempQty) { removeList.Add(record); tempQty -= record.Qty; } else { // è®°å½æ°éæåï¼æ£åé¨åæ°é record.Qty -= tempQty; tempQty = 0; } } barcodesList.RemoveAll(b => removeList.Contains(b)); } else { // ç§»é¤è¯¥è¡ä¸è¯¥æ¡ç çææè®°å½ barcodesList.RemoveAll(b => string.Equals(b.Barcode, noStockOut.barCode, StringComparison.OrdinalIgnoreCase)); } //éæ°åºååMESåæ° JsonSerializerSettings settings = new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() }; matchedCode.documentsNO = JsonConvert.SerializeObject(barcodesList, settings); matchedCode.NoStockOutQty -= matchedDetail.OrderQuantity; //æ£ååºåºæç»çæ åºååºåºæ°é matchedCode.NoStockOutQty = Math.Max(0, matchedCode.NoStockOutQty - actualRevokeQty); remainingRevokeQty -= actualRevokeQty; //éç½®åºåºæç»ç¶æ if (matchedCode.LockQuantity == 0 && matchedCode.OverOutQuantity == 0) { matchedCode.OrderDetailStatus = OrderDetailStatusEnum.New.ObjToInt(); } _unitOfWorkManage.BeginTran(); _inboundOrderDetailService.UpdateData(matchedDetail); _outboundOrderDetailService.UpdateData(matchedCode); _unitOfWorkManage.CommitTran(); return WebResponseContent.Instance.OK(); } catch (Exception ex) //è¥ä»ææªæ¤éçæ°éï¼è¯´ææ°æ®ä¸ä¸è´ if (remainingRevokeQty > 0) { _unitOfWorkManage.RollbackTran(); return WebResponseContent.Instance.Error(ex.Message); return WebResponseContent.Instance.Error($"æ¤éæ¡ç {noStockOut.barCode}æ¶ï¼åºåºåä¸å¯æ¤éæ°éä¸è¶³ï¼ä»æ{remainingRevokeQty}æ°éæªæ¤é"); } } public async Task<WebResponseContent> NoStockOutSubmit(NoStockOutSubmit noStockOutSubmit) _unitOfWorkManage.BeginTran(); _inboundOrderDetailService.UpdateData(matchedDetail); _outboundOrderDetailService.UpdateData(matchedCodeList); _unitOfWorkManage.CommitTran(); return WebResponseContent.Instance.OK("æ¡ç æ¤éæå", data: new { RevokedQty = revokedTotalQty }); } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); return WebResponseContent.Instance.Error(ex.Message); } } public async Task<WebResponseContent> NoStockOutSubmit(NoStockOutSubmit noStockOutSubmit) { try { @@ -2715,7 +2827,7 @@ { item.LockQuantity += item.NoStockOutQty; item.OverOutQuantity += item.NoStockOutQty; item.CurrentDeliveryQty = item.NoStockOutQty; item.CurrentDeliveryQty += item.NoStockOutQty; //æ·»å åä¼ MESåæ° List<Barcodes> barcodesList = new List<Barcodes>(); List<Barcodes> documentsNOList = new List<Barcodes>(); ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundService.cs
@@ -1113,8 +1113,8 @@ { barcodeQuantity = item.LockQuantity - item.OverOutQuantity; allocatedQuantity -= (item.LockQuantity - item.OverOutQuantity); item.CurrentDeliveryQty = item.LockQuantity - item.OverOutQuantity; item.OverOutQuantity = item.LockQuantity; item.CurrentDeliveryQty = item.LockQuantity; } updateDetails.Add(item); @@ -1930,6 +1930,12 @@ { var stock = await _stockInfoRepository.Db.Queryable<Dt_StockInfo>().Includes(x => x.Details).Where(x => x.PalletCode == palletCode).FirstAsync(); Dt_Task task = _taskRepository.QueryFirst(x => x.PalletCode == palletCode); if (task != null) { return WebResponseContent.Instance.Error("ä»»å¡ä¿¡æ¯å表åå¨è¯¥æççä»»å¡ä¿¡æ¯ï¼ä¸å¯å走空箱ï¼è¯·æ£æ¥ä»»å¡æ¯å¦å®æ"); } if (stock == null) { return content.Error($"æªæ¾å°æç{palletCode}åºåä¿¡æ¯");