ÏîÄ¿´úÂë/WIDESEA_WMSClient/config/buttons.js
@@ -339,6 +339,14 @@ type: 'warning', onClick: function () { } },{ name: "鿣ç»çæä½", icon: '', class: '', value: 'ReCheckGroupPallet', type: 'warning', onClick: function () { } } ] ÏîÄ¿´úÂë/WIDESEA_WMSClient/src/extension/check/extend/ReCheckGroupPallet.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,1124 @@ <template> <vol-box v-model="show" :title="'ç»çæä½ - åæ®å·ï¼' + orderNo" :height="1000" :width="1100" :padding="20" :modal="true"> <div class="barcode-scanner-container"> <!-- ä»åºéæ© - ç´§åå¸å± --> <div class="location-section compact"> <el-form :model="form" :rules="rules" ref="locationForm" class="compact-form"> <el-form-item label="å ¥åºä»åº" prop="warehouseType" class="location-select compact-item"> <el-select v-model="form.warehouseType" placeholder="è¯·éæ©ä»åº" clearable filterable @change="handleWarehouseChange" style="width: 100%" :loading="warehouseLoading" size="medium"> <el-option v-for="item in warehouseTypes" :key="item.warehouseType" :label="item.warehouseTypeDesc" :value="item.warehouseType" /> </el-select> </el-form-item> </el-form> </div> <!-- ä»åºåºåéæ© - ç´§åå¸å± --> <div class="location-section compact"> <el-form :model="form" :rules="rules" ref="locationForm" class="compact-form"> <el-form-item label="ä»åºåºå" prop="locationType" class="location-select compact-item"> <el-select v-model="form.locationType" placeholder="请å éæ©ä»åº" clearable filterable @change="handleLocationChange" style="width: 100%" :loading="locationLoading" size="medium"> <el-option v-for="item in locationTypes" :key="item.locationType" :label="item.locationTypeDesc" :value="item.locationType" /> </el-select> </el-form-item> </el-form> </div> <!-- æçä¿¡æ¯æ¾ç¤º - ç´§åå¸å± --> <div class="tray-info compact" v-if="trayBarcode"> <i class="el-icon-s-management"></i> å½åæç®±: {{ trayBarcode }} <span class="location-info" v-if="form.warehouseType"> | ä»åº: {{ currentWarehouseName }} </span> <span class="location-info" v-if="form.locationType"> | ä»åºåºå: {{ currentLocationDesc }} </span> </div> <!-- æ«ç åºå - ç´§åå¸å± --> <div class="input-section compact"> <el-card shadow="hover" class="compact-card"> <div slot="header" class="compact-header"> <span><i class="el-icon-scanner"></i> æ«ç åºå</span> <span class="scan-status"> <span class="scan-indicator"></span> {{ form.locationType && form.warehouseType ? 'æ«ç 就绪' : '请å éæ©ä»åºåä»åºåºå' }} </span> </div> <!-- æçæ¡ç è¾å ¥ --> <div class="input-wrapper custom-input-group compact-input"> <div class="input-label">æçæ¡ç </div> <el-input ref="trayInput" v-model="trayBarcode" placeholder="è¯·æ«ææè¾å ¥æç®±ç åæå车é®" clearable :disabled="!form.locationType || !form.warehouseType" @keyup.enter.native="handleTraySubmit" @clear="handleTrayClear" @input="handleTrayInput" class="custom-input" size="medium"> <template slot="append"> <el-button @click="handleTraySubmit" type="primary" icon="el-icon-position" :disabled="!form.locationType || !trayBarcode || !form.warehouseType" size="medium"> 确认 </el-button> </template> </el-input> </div> <!-- ç©ææ¡ç è¾å ¥ --> <div class="input-wrapper custom-input-group compact-input"> <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" 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"> {{ loading ? 'æ¥è¯¢ä¸...' : 'æ¥è¯¢' }} </el-button> </template> </el-input> </div> <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 && !trayBarcode" class="warning-text">â ï¸ è¯·å è¾å ¥æç®±ç </p> </div> </el-card> </div> <!-- å è½½ç¶æ --> <div v-if="loading" class="loading compact"> <el-progress :percentage="100" status="success" :show-text="false" /> <p>æ£å¨æ¥è¯¢ç©æä¿¡æ¯...</p> </div> <!-- é误æç¤º --> <div v-if="error" class="error-message compact"> <el-alert :title="error" type="error" show-icon closable @close="error = ''" /> </div> <!-- æªç»çå表 --> <div class="unpallet-section compact"> <el-card shadow="hover" class="compact-card unpallet-card"> <div slot="header" class="compact-header"> <span><i class="el-icon-tickets"></i> æªç»çæ¡ç </span> <span class="list-actions"> <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" v-loading="unpalletBarcodesLoading"> <el-table-column type="index" label="åºå·" width="60" align="center"></el-table-column> <el-table-column prop="barcode" label="æ¡ç " min-width="140" show-overflow-tooltip></el-table-column> <el-table-column prop="materielCode" label="ç©æç¼ç " min-width="150" show-overflow-tooltip></el-table-column> <el-table-column prop="batchNo" label="æ¹æ¬¡" min-width="150" show-overflow-tooltip></el-table-column> <el-table-column prop="orderQuantity" label="æ°é" min-width="130" align="right"></el-table-column> <el-table-column prop="unit" label="åä½" width="80" align="center"></el-table-column> <el-table-column prop="supplyCode" label="ä¾åºå" min-width="130" show-overflow-tooltip></el-table-column> </el-table> </div> </el-card> </div> <!-- ç©æå表 - åºå®é«åº¦å¸¦æ»å¨æ¡ --> <div class="material-list compact"> <el-card shadow="hover" class="compact-card"> <div slot="header" class="compact-header"> <span><i class="el-icon-tickets"></i> ç»çæ°æ®</span> <span class="list-actions"> <el-tag type="primary" size="small">å ± {{ materials.length }} æ¡</el-tag> <el-tag type="primary" size="small">æªå ¥åºæ°é {{ totalStockSum }}{{ uniqueUnit }}</el-tag> <el-tag v-if="trayBarcode" type="success" size="small">æç: {{ trayBarcode }}</el-tag> <el-tag v-if="form.warehouseType" type="info" size="small">ä»åº: {{ currentWarehouseName }}</el-tag> <el-tag v-if="form.locationType" type="info" size="small">åºå: {{ currentLocationDesc }}</el-tag> </span> </div> <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-else-if="!trayBarcode">请å è¾å ¥æç®±æ¡ç </p> <p v-else>ææ ç©ææ°æ®ï¼è¯·æ«ææè¾å ¥ç©ææ¡ç </p> </div> <div class="table-container" v-else> <el-table :data="materials" stripe style="width: 100%" height="100%" size="small"> <el-table-column type="index" label="åºå·" width="60" align="center"></el-table-column> <el-table-column prop="barcode" label="æ¡ç " min-width="140" show-overflow-tooltip></el-table-column> <el-table-column prop="materielCode" label="ç©æç¼ç " min-width="150" show-overflow-tooltip></el-table-column> <el-table-column prop="batchNo" label="æ¹æ¬¡" min-width="150" show-overflow-tooltip></el-table-column> <el-table-column prop="stockQuantity" label="æ°é" min-width="130" align="right"></el-table-column> <el-table-column prop="unit" label="åä½" width="80" align="center"></el-table-column> <el-table-column prop="supplyCode" label="ä¾åºå" min-width="130" show-overflow-tooltip></el-table-column> <el-table-column prop="warehouseType" label="ä»åº" min-width="120" show-overflow-tooltip></el-table-column> </el-table> </div> </el-card> </div> </div> <template #footer> <el-button type="danger" size="small" @click="handleDialogClose()">å ³é</el-button> </template> </vol-box> </template> <script> import http from '@/api/http.js'; import VolBox from '@/components/basic/VolBox.vue'; export default { components: { VolBox }, data() { return { show: false, orderNo: "", palletVisible: this.visible, trayBarcodeReg: /^[A-Z]\d{9}$/, trayBarcode: '', barcode: '', materials: [], loading: false, error: '', debugMode: false, currentFocus: 'warehouse', unpalletBarcodes: [], unpalletBarcodesLoading: false, unpalletMaterials: [], // æªç»çè¯¦ç»æ°æ®å表 // æ«ç æªç¸å ³åé scanCode: '', lastKeyTime: null, isManualInput: false, isScanning: false, scanTimer: null, manualInputTimer: null, scanTarget: 'tray', // å½åæ«ç ç®æ : tray æ material // åºåç»è®¡ç¸å ³åé totalStockSum: 0, totalStockCount: 0, uniqueUnit: '', sumLoading: false, sumError: '', // ä»åºç¸å ³åé warehouseTypes: [], warehouseLoading: false, // ä»åºåºåç¸å ³åé locationTypes: [], locationLoading: false, form: { warehouseType: null, locationType: null }, rules: { locationType: [ { validator: this.validateLocationType, trigger: 'change' } ], trayBarcode: [ { pattern: this.trayBarcodeReg, message: 'æçå·æ ¼å¼é误ï¼é为1个大å忝+9个æ°åï¼å¦A000008024ï¼', trigger: 'blur' } ], warehouseType: [ { message: 'è¯·éæ©ä»åº', trigger: 'change' } ] } } }, 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 : '' } }, watch: { visible(newVal, oldVal) { this.palletVisible = newVal; // å½ä» false å为 true æ¶ï¼è¡¨ç¤ºå¼¹æ¡æå¼ if (newVal === true && oldVal === false) { console.log('å¼¹æ¡æå¼ï¼éç½®æ°æ®'); this.resetData(); this.$nextTick(() => { setTimeout(() => { this.fetchUnpalletMaterialDetails(); }, 300); }); } // å½ä» 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: '' }; this.backData = []; this.$refs.palletForm?.reset(); this.fetchUnpalletMaterialDetails(); } } }, mounted() { document.addEventListener('keypress', this.handleKeyPress); }, beforeDestroy() { document.removeEventListener('keypress', this.handleKeyPress); this.clearAllTimers(); }, methods: { open() { this.show = true; this.orderNo = ""; this.resetData(); this.initLocationTypes(); this.initwarehouseTypes(); this.fetchUnpalletMaterialDetails(); }, validateLocationType(rule, value, callback) { if (!this.form.warehouseType) { callback(new Error('请å éæ©ä»åº')); } else if (value === null || value === undefined || value === '') { callback(new Error('è¯·éæ©ä»åºåºå')); } else { callback(); } }, // æ ¹æ®æ¡ç å表è·åè¯¦ç»æ°æ® 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: '-' })); } }, async initLocationTypes() { try { const { data } = await this.http.post("api/LocationInfo/GetLocationTypes") this.locationTypes = data } catch (e) { this.$message.error('è·ååºåç±»å失败') } }, async initwarehouseTypes() { try { const { data } = await this.http.post("api/Warehouse/GetwarehouseTypes") this.warehouseTypes = data } catch (e) { this.$message.error('è·ååºåç±»å失败') } }, async fetchStockStatistics(orderNo) { // åæ®å·ä¸ºç©ºæ¶ä¸æ¥è¯¢ if (!orderNo) { this.sumError = 'åæ®å·ä¸ºç©ºï¼æ æ³ç»è®¡'; return; } 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; } }, async validateForm() { return new Promise((resolve) => { if (!this.$refs.locationForm) { this.error = 'è¡¨åæªåå§å'; this.$message.warning('请å éæ©ä»åºåºå'); resolve(false); return; } this.$refs.locationForm.validate((valid) => { if (valid) { this.error = ''; resolve(true); } else { if (!this.from.warehouseType) { this.error = '请å éæ©ä»åº'; } else if (this.form.locationType === null || this.form.locationType === undefined || this.form.locationType === '') { this.error = '请å éæ©ä»åºåºå'; } else { this.error = 'è¯·æ£æ¥è¡¨å填忝妿£ç¡®'; } resolve(false); } }); }); }, // èç¦å°æçè¾å ¥æ¡ focusTrayInput() { if (this.$refs.trayInput && this.$refs.trayInput.$el) { const inputEl = this.$refs.trayInput.$el.querySelector('input'); if (inputEl) { inputEl.focus(); this.currentFocus = 'tray'; this.scanTarget = 'tray'; inputEl.select(); } } }, // èç¦å°ç©æè¾å ¥æ¡ focusBarcodeInput() { if (this.$refs.barcodeInput && this.$refs.barcodeInput.$el) { const inputEl = this.$refs.barcodeInput.$el.querySelector('input'); if (inputEl) { inputEl.focus(); this.currentFocus = 'material'; this.scanTarget = 'material'; inputEl.select(); } } }, // éç½®æææ°æ® resetData() { this.trayBarcode = ''; this.barcode = ''; this.materials = []; this.unpalletBarcodes = []; this.unpalletMaterials = []; this.loading = false; this.error = ''; this.scanCode = ''; this.lastKeyTime = null; this.isManualInput = false; this.isScanning = false; this.currentFocus = 'warehouse'; this.scanTarget = 'tray'; this.clearAllTimers(); this.totalStockSum = 0; this.totalStockCount = 0; this.sumLoading = false; this.sumError = ''; this.form = { warehouseType: null, locationType: null } this.warehouseTypes = []; this.locationTypes = []; // æ¸ é¤è¡¨åéªè¯ç¶æ this.$nextTick(() => { if (this.$refs.locationForm) { this.$refs.locationForm.clearValidate(); } }); }, // æ¸ é¤ææè®¡æ¶å¨ clearAllTimers() { if (this.manualInputTimer) { clearTimeout(this.manualInputTimer); this.manualInputTimer = null; } if (this.scanTimer) { clearTimeout(this.scanTimer); this.scanTimer = null; } }, handleDialogClose() { this.show = false; this.resetData(); }, // 确认æé® async handleConfirm() { if (!await this.validateForm()) return; if (this.materials.length === 0) { 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 }; // 触åç¶ç»ä»¶ç back-success äºä»¶ 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ï¼é¿å 表åéªè¯ç弿¥é®é¢ if (!this.form.warehouseType) { this.error = '请å éæ©ä»åº'; return; } if (!this.form.locationType) { this.error = '请å éæ©ä»åºåºå'; //this.$message.warning('请å éæ©ä»åºåºå'); return; } // ç¶ååè¿è¡å®æ´ç表åéªè¯ if (!await this.validateForm()) return; const currentTrayBarcode = this.trayBarcode.trim(); if (!currentTrayBarcode) { this.error = '请è¾å ¥ææ«ææçæ¡ç '; return; } this.error = ''; 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}`); }, // æ¸ é¤æç clearTray() { this.trayBarcode = ''; this.materials = []; this.focusTrayInput(); this.$message({ message: 'æçæ¡ç å·²æ¸ é¤', type: 'info', duration: 2000 }); }, // æ¸ ç©ºæçè¾å ¥ handleTrayClear() { this.error = ''; }, // æ¸ ç©ºè¾å ¥ handleClear() { this.error = ''; this.scanCode = ''; this.isManualInput = false; this.isScanning = false; }, // å¤çç©ææ¡ç æäº¤ async handleBarcodeSubmit() { if (!await this.validateForm()) 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(); // æ¸ ç©ºç©æè¾å ¥æ¡å¹¶ä¿æèç¦ 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; } }, // APIè¯·æ± - æ¿æ¢ä¸ºå®é çAPIè°ç¨ async fetchMaterialData(barcode) { try { const response = await http.post('/api/Inbound/ReCheckGroupPallet', { palletCode: this.trayBarcode, barcode: barcode, locationTypeDesc: this.currentLocationDesc, locationType: this.form.locationType, // æ·»å ä»åºåºåä¿¡æ¯ warehouseType: this.form.warehouseType } ); 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); } }, // å¤çæ«ç æªè¾å ¥ handleKeyPress(event) { // å¦ææ¯æå¨è¾å ¥æ¨¡å¼ï¼ä¸å¤çæ«ç æªé»è¾ if (this.isManualInput) { return; } const key = event.key; const currentTime = new Date().getTime(); // 忽ç¥ç´æ¥æä¸çå车é®ï¼ç±handleBarcodeSubmitå¤çï¼ if (key === 'Enter') { if (this.scanCode.length > 0) { // 黿¢é»è®¤å车è¡ä¸ºï¼é¿å 表åæäº¤ event.preventDefault(); // æ«ç 宿ï¼èªå¨è§¦åæ¥è¯¢ this.isScanning = false; // æ ¹æ®å½åæ«ç ç®æ 设置ç¸åºçè¾å ¥æ¡å¼ if (this.scanTarget === 'tray') { this.trayBarcode = this.scanCode; this.handleTraySubmit(); } else if (this.scanTarget === 'material') { this.barcode = this.scanCode; this.handleBarcodeSubmit(); } } this.scanCode = ''; this.lastKeyTime = null; return; } // æå»ºæ«ç å 容ï¼å¿«éè¿ç»è¾å ¥è§ä¸ºæ«ç ï¼ if (this.lastKeyTime && currentTime - this.lastKeyTime < 50) { this.scanCode += key; this.isScanning = true; } else { this.scanCode = key; this.isScanning = true; } // 设置计æ¶å¨ï¼å¦æä¸æ®µæ¶é´å 没æè¾å ¥ï¼åéç½®æ«æç¶æ if (this.scanTimer) { clearTimeout(this.scanTimer); } this.scanTimer = setTimeout(() => { this.isScanning = false; }, 100); this.lastKeyTime = currentTime; }, // æ ¼å¼åæ¶é´ formatTime(date) { const year = date.getFullYear(); const month = String(date.getMonth() + 1).padStart(2, '0'); const day = String(date.getDate()).padStart(2, '0'); const hours = String(date.getHours()).padStart(2, '0'); const minutes = String(date.getMinutes()).padStart(2, '0'); const seconds = String(date.getSeconds()).padStart(2, '0'); return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`; } } } </script> <style scoped> .barcode-scanner-container { max-width: 1200px; margin: 0 auto; padding: 10px; display: flex; flex-direction: column; height: 100%; gap: 8px; } /* ç´§åå¸å±æ ·å¼ */ .compact { margin-bottom: 0; } .compact-form { margin-bottom: 0; } .compact-item { margin-bottom: 0; } .compact-card { margin-bottom: 0; } .compact-card>>>.el-card__body { padding: 12px; } .compact-header { display: flex; justify-content: space-between; align-items: center; padding: 0 !important; } .compact-header>>>.el-card__header { padding: 8px 12px; } .compact-input { margin: 8px 0; } .compact-tips { margin-top: 8px; font-size: 11px; } /* ä»åºåºåéæ© - ç´§å */ .location-section.compact { margin-bottom: 8px; } .location-section.compact>>>.el-form-item { margin-bottom: 0; } /* æçä¿¡æ¯ - ç´§å */ .tray-info.compact { padding: 6px 10px; margin-bottom: 8px; font-size: 13px; } /* æ«ç åºå - ç´§å */ .input-section.compact { margin-bottom: 8px; flex-shrink: 0; } /* ç©æå表 - åºå®é«åº¦å¸¦æ»å¨ */ .material-list.compact { flex: 1; min-height: 0; /* éè¦ï¼å 许flexå项æ¶ç¼© */ display: flex; flex-direction: column; } .material-list.compact>>>.el-card { display: flex; flex-direction: column; height: 100%; } .material-list.compact>>>.el-card__body { flex: 1; display: flex; flex-direction: column; padding: 0; min-height: 0; } .table-container { flex: 1; min-height: 0; overflow: hidden; } .material-list.compact>>>.el-table { flex: 1; } .material-list.compact>>>.el-table__body-wrapper { overflow-y: auto; } /* ç´§åçç©ºç¶æ */ .empty-state.compact { padding: 20px 0; flex: 1; display: flex; flex-direction: column; justify-content: center; align-items: center; } .empty-state.compact i { font-size: 36px; margin-bottom: 8px; } .empty-state.compact p { font-size: 13px; } /* å ¶ä»åææ ·å¼è°æ´ */ .page-title { text-align: center; margin-bottom: 15px; } .scan-status { font-size: 12px; color: #67C23A; } .scan-indicator { display: inline-block; width: 8px; height: 8px; border-radius: 50%; background-color: #67C23A; margin-right: 5px; animation: pulse 1.5s infinite; } @keyframes pulse { 0% { opacity: 1; } 50% { opacity: 0.4; } 100% { opacity: 1; } } .input-wrapper { position: relative; } .input-tips { margin-top: 6px; color: #909399; } .warning-text { color: #E6A23C; font-weight: bold; } .loading.compact { text-align: center; margin: 10px 0; padding: 5px; } .loading.compact p { margin-top: 5px; color: #409EFF; font-size: 12px; } .error-message.compact { margin: 5px 0; } .error-message.compact>>>.el-alert { padding: 6px 12px; } .list-actions { display: flex; align-items: center; gap: 4px; } .list-actions>>>.el-tag { height: 24px; line-height: 22px; padding: 0 6px; } .clear-all-btn { margin-left: 8px; } .material-code { font-family: 'Courier New', monospace; font-weight: bold; color: #409EFF; } .location-info { color: #606266; font-weight: normal; } .debug-info { background: #f5f7fa; padding: 8px; border-radius: 4px; margin-top: 8px; font-size: 11px; color: #909399; } .small-button { padding: 6px 8px; font-size: 11px; } /* è¾å ¥æ¡ç»æ ·å¼è°æ´ */ .custom-input-group { display: flex; align-items: center; width: 100%; margin: 8px 0; border: 1px solid #DCDFE6; border-radius: 4px; overflow: hidden; background: #fff; } .input-label { padding: 0 12px; background: #F5F7FA; border-right: 1px solid #DCDFE6; color: #606266; font-size: 13px; white-space: nowrap; height: 36px; line-height: 36px; flex-shrink: 0; min-width: 70px; text-align: center; } .input-container { display: flex; flex: 1; align-items: center; } .custom-input { flex: 1; } .custom-input>>>.el-input__inner { border: none; border-radius: 0; height: 36px; line-height: 36px; font-size: 13px; } /* ååºå¼è°æ´ */ @media (max-width: 768px) { .barcode-scanner-container { padding: 5px; } .custom-input-group { flex-direction: column; border: none; } .input-label { width: 100%; border-right: none; border-bottom: 1px solid #DCDFE6; margin-bottom: 5px; } .input-container { width: 100%; border: 1px solid #DCDFE6; border-radius: 4px; } .unpallet-section.compact { margin-bottom: 8px; flex-shrink: 0; } .unpallet-card { flex-shrink: 0; } .unpallet-barcode-list { display: flex; flex-wrap: wrap; gap: 6px; padding: 8px 0; max-height: 180px; overflow-y: auto; } .unpallet-barcode-list>>>.el-tag { cursor: pointer; max-width: calc(33.333% - 4px); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } @media (max-width: 768px) { .unpallet-barcode-list>>>.el-tag { max-width: calc(50% - 4px); } } } </style> ÏîÄ¿´úÂë/WIDESEA_WMSClient/src/extension/check/recheckOrder.js
@@ -1,5 +1,6 @@ //æ¤jsæä»¶æ¯ç¨æ¥èªå®ä¹æ©å±ä¸å¡ä»£ç ï¼å¯ä»¥æ©å±ä¸äºèªå®ä¹é¡µé¢æè éæ°é ç½®çæç代ç import gridBody from './extend/StockSelect.vue' import gridBody from './extend/StockSelect.vue'; import gridFooter from "./extend/ReCheckGroupPallet.vue"; import http from '@/api/http.js' import { h, createVNode, render, reactive, ref } from 'vue'; import { ElDialog, ElForm, ElFormItem, ElInput, ElButton, ElMessage, ElSelect, ElOption } from 'element-plus'; // å¼å ¥ElMessageï¼è§£å³æç¤ºæ ååº @@ -8,7 +9,7 @@ //æ¥è¯¢ç颿©å±ç»ä»¶ gridHeader: '', gridBody: gridBody, gridFooter: '', gridFooter: gridFooter, //æ°å»ºãç¼è¾å¼¹åºæ¡æ©å±ç»ä»¶ modelHeader: '', modelBody: '', @@ -48,30 +49,13 @@ methods: { //ä¸é¢è¿äºæ¹æ³å¯ä»¥ä¿çä¹å¯ä»¥å é¤ onInit() { //æ¡æ¶åå§åé ç½®åï¼ let ReCheckGroupPalletBtn = this.buttons.find(x => x.value === 'ReCheckGroupPallet'); if (ReCheckGroupPalletBtn) { // éåæé®ç¹å»äºä»¶ ReCheckGroupPalletBtn.onClick = function () { let EmptyTrayOutboundBtn = this.buttons.find(x => x.value == 'BatchOrder'); if (EmptyTrayOutboundBtn) { EmptyTrayOutboundBtn.onClick = function () { let rows = this.$refs.table.getSelected(); if (rows.length == 0) return this.$error("è¯·éæ©æ°æ®!"); if (rows.length > 1) return this.$error("è¯·éæ©ä¸æ¡æ°æ®!"); this.$router.push({ path: '/outbound/picking', query: { orderId: rows[0].id,orderNo:rows[0].orderNo} }) } } let GroupPalletBtn = this.buttons.find(x=>x.value =='GroupPallet') if(GroupPalletBtn){ GroupPalletBtn.onClick = function(){ let rows = this.$refs.table.getSelected(); if(rows.length ==0 || rows.length>1) return ElMessage.warning('è¯·éæ©ä¸æ¡åæ®'); const targetRow = rows[0]; this.$emit('openPalletDialog', targetRow.orderNo); } this.$refs.gridFooter.open(); }; } }, onInited() { ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_BasicService/MESOperation/FeedbackMesService.cs
@@ -98,7 +98,23 @@ if (returnDTO.Details.Count <= 0) { if (returnRecords.Count() == returnRecords.Count(x => x.ReturnStatus == 1)) { outboundOrder.ReturnToMESStatus = 1; } else if (returnRecords.Count(x => x.ReturnStatus == 2) > 0) { outboundOrder.ReturnToMESStatus = 4; } else if (returnRecords.Count() == returnRecords.Count(x => x.ReturnStatus == 2)) { outboundOrder.ReturnToMESStatus = 2; } _outboundOrderRepository.UpdateData(outboundOrder); return webResponse = WebResponseContent.Instance.OK($"è¯¥åæ®æ²¡æéè¦åä¼ æç»ï¼å¤±è´¥æ°æ®åä¼ {returnRecords.Count()}æ¡ï¼åä¼ æå{returnRecords.Count(x=>x.ReturnStatus == 1)}æ¡ï¼åä¼ å¤±è´¥{returnRecords.Count(x => x.ReturnStatus == 2)}æ¡"); } string apiUrl = AppSettings.GetValue("MaterialOutboundFeedbackUrl"); @@ -129,6 +145,21 @@ if (returnDTO.Details.Count <= 0) { if(returnRecords.Count() == returnRecords.Count(x => x.ReturnStatus == 1)) { outboundOrder.ReturnToMESStatus = 1; } else if(returnRecords.Count(x => x.ReturnStatus == 2)>0) { outboundOrder.ReturnToMESStatus = 4; } else if (returnRecords.Count() == returnRecords.Count(x => x.ReturnStatus == 2)) { outboundOrder.ReturnToMESStatus = 2; } _outboundOrderRepository.UpdateData(outboundOrder); return webResponse = WebResponseContent.Instance.OK($"è¯¥åæ®æ²¡æéè¦åä¼ æç»ï¼å¤±è´¥æ°æ®åä¼ {returnRecords.Count()}æ¡ï¼åä¼ æå{returnRecords.Count(x => x.ReturnStatus == 1)}æ¡ï¼åä¼ å¤±è´¥{returnRecords.Count(x => x.ReturnStatus == 2)}æ¡"); } ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_CheckService/ReCheckOrderService.cs
@@ -8,6 +8,7 @@ using System.Text; using System.Threading.Tasks; using WIDESEA_Common.OrderEnum; using WIDESEA_Common.StockEnum; using WIDESEA_Core; using WIDESEA_Core.BaseRepository; using WIDESEA_Core.BaseServices; @@ -18,6 +19,7 @@ using WIDESEA_ICheckService; using WIDESEA_IOutboundService; using WIDESEA_Model.Models; using WIDESEA_Model.Models.Basic; using WIDESEA_Model.Models.Check; namespace WIDESEA_CheckService @@ -75,6 +77,18 @@ model.Creater = "MES"; model.CreateDate = DateTime.Now; model.MaterielName = materielInfo?.MaterielName ?? ""; var stockDetailIds = BaseDal.Db.Queryable<Dt_StockInfoDetail>() .Where(x => x.MaterielCode == model.MaterielCode && x.BatchNo == model.BatchNo && x.ValidDate !=null) .Select(x => x.Id) .ToList(); if (stockDetailIds.Count > 0) { BaseDal.Db.Updateable<Dt_StockInfoDetail>() .SetColumns(x => x.Status == StockStatusEmun.æå¨å»ç».ObjToInt()) .Where(x => stockDetailIds.Contains(x.Id)) .ExecuteCommand(); } BaseDal.AddData(model); var outboundOrders = ConvertToOutboundOrders(model); @@ -102,6 +116,45 @@ { isupdate = true; } if (model.Result != 0 && recheckOrder.SignSeq != model.SignSeq) { var stockDetailIds = BaseDal.Db.Queryable<Dt_StockInfoDetail>() .Where(x => x.MaterielCode == model.MaterielCode && x.BatchNo == model.BatchNo && x.ValidDate != null) .Select(x => x.Id) .ToList(); if (stockDetailIds.Count > 0) { var datevaliDate = BaseDal.Db.Queryable<Dt_MaterialExpirationDate>().Where(x => x.MaterialCode.Contains(model.MaterielCode.Substring(0, 6))).First(); BaseDal.Db.Updateable<Dt_StockInfoDetail>() .SetColumns(x => x.Status == StockStatusEmun.å ¥åºå®æ.ObjToInt()) .Where(x => stockDetailIds.Contains(x.Id)) .ExecuteCommand(); if (model.InspectionNumber == 1) { BaseDal.Db.Updateable<Dt_StockInfoDetail>() .SetColumns(x => x.ValidDate == Convert.ToDateTime(x.ValidDate).AddDays(Convert.ToDouble(datevaliDate.OneExtensionDays))) .Where(x => stockDetailIds.Contains(x.Id)) .ExecuteCommand(); } else if (model.InspectionNumber == 2) { BaseDal.Db.Updateable<Dt_StockInfoDetail>() .SetColumns(x => x.ValidDate == Convert.ToDateTime(x.ValidDate).AddDays(Convert.ToDouble(datevaliDate.TwoExtensionDays))) .Where(x => stockDetailIds.Contains(x.Id)) .ExecuteCommand(); } else { BaseDal.Db.Updateable<Dt_StockInfoDetail>() .SetColumns(x => x.ValidDate == Convert.ToDateTime(x.ValidDate).AddDays(Convert.ToDouble(datevaliDate.ThreeExtensionDays))) .Where(x => stockDetailIds.Contains(x.Id)) .ExecuteCommand(); } } } recheckOrder.OrderNo = model.OrderNo; recheckOrder.MaterielCode = model.MaterielCode; recheckOrder.BatchNo = model.BatchNo; @@ -116,6 +169,7 @@ recheckOrder.ModifyDate = DateTime.Now; var materielInfo = _materielInfoService.Db.Queryable<Dt_MaterielInfo>().First(x => model.MaterielCode.Equals(x.MaterielCode)); recheckOrder.MaterielName= materielInfo?.MaterielName??""; BaseDal.UpdateData(recheckOrder); if (isupdate) ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_IInboundService/IInboundService.cs
@@ -37,6 +37,13 @@ Task<WebResponseContent> StockTakeGroupPallet(GroupPalletDto palletDto); /// <summary> /// 鿣ç»ç /// </summary> /// <param name="palletDto"></param> /// <returns></returns> Task<WebResponseContent> ReCheckGroupPallet(GroupPalletDto palletDto); /// <summary> /// å ¥åºåæ¹åä¼ /// </summary> /// <param name="OrderNo"></param> ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_InboundService/InboundService.cs
@@ -31,6 +31,7 @@ using WIDESEA_IStockService; using WIDESEA_Model.Models; using WIDESEA_Model.Models.Basic; using WIDESEA_Model.Models.Check; namespace WIDESEA_InboundService { @@ -443,6 +444,19 @@ if (allocatefeedmodel.Details.Count <= 0) { if (returnRecords.Count() == returnRecords.Count(x => x.ReturnStatus == 1)) { inboundOrder.ReturnToMESStatus = 1; } else if (returnRecords.Count(x => x.ReturnStatus == 2) > 0) { inboundOrder.ReturnToMESStatus = 4; } else if (returnRecords.Count() == returnRecords.Count(x => x.ReturnStatus == 2)) { inboundOrder.ReturnToMESStatus = 2; } _inboundOrderRepository.UpdateData(inboundOrder); return WebResponseContent.Instance.OK($"è¯¥åæ®æ²¡æéè¦åä¼ æç»ï¼å¤±è´¥æ°æ®åä¼ {returnRecords.Count()}æ¡ï¼åä¼ æå{returnRecords.Count(x => x.ReturnStatus == 1)}æ¡ï¼åä¼ å¤±è´¥{returnRecords.Count(x => x.ReturnStatus == 2)}æ¡"); } @@ -477,6 +491,19 @@ if (feedmodel.details.Count<=0) { if (returnRecords.Count() == returnRecords.Count(x => x.ReturnStatus == 1)) { inboundOrder.ReturnToMESStatus = 1; } else if (returnRecords.Count(x => x.ReturnStatus == 2) > 0) { inboundOrder.ReturnToMESStatus = 4; } else if (returnRecords.Count() == returnRecords.Count(x => x.ReturnStatus == 2)) { inboundOrder.ReturnToMESStatus = 2; } _inboundOrderRepository.UpdateData(inboundOrder); return WebResponseContent.Instance.OK($"è¯¥åæ®æ²¡æéè¦åä¼ æç»ï¼å¤±è´¥æ°æ®åä¼ {returnRecords.Count()}æ¡ï¼åä¼ æå{returnRecords.Count(x => x.ReturnStatus == 1)}æ¡ï¼åä¼ å¤±è´¥{returnRecords.Count(x => x.ReturnStatus == 2)}æ¡"); } var response = responseModel(inboundOrder, 3, feedmodel); @@ -716,5 +743,93 @@ return content.Error(ex.Message); } } public async Task<WebResponseContent> ReCheckGroupPallet(GroupPalletDto palletDto) { WebResponseContent content = new WebResponseContent(); try { (bool, string, object?) result2 = ModelValidate.ValidateModelData(palletDto); if (!result2.Item1) return content.Error(result2.Item2); var code = _warehouseAreaRepository.Db.Queryable<Dt_WarehouseArea>().Where(x => x.Code == palletDto.WarehouseType).Select(x => x.Code).First(); if (string.IsNullOrEmpty(code)) { return content.Error($"ä»åºä¸æ²¡æè¯¥{palletDto.WarehouseType}ç¼å·ã"); } Dt_StockInfo? stockInfo = await _stockInfoRepository.Db.Queryable<Dt_StockInfo>().Includes(x => x.Details).Where(x => x.PalletCode == palletDto.PalletCode).FirstAsync(); if (_taskRepository.QueryFirst(x => x.PalletCode == palletDto.PalletCode) != null) { return content.Error($"该æçå·²çæä»»å¡"); } if (stockInfo != null && !string.IsNullOrEmpty(stockInfo.LocationCode) && stockInfo.StockStatus != (int)StockStatusEmun.ç»çæå) { return content.Error("已䏿¶çæçä¸è½å次ç»ç"); } if (stockInfo == null) { stockInfo = new Dt_StockInfo() { PalletType = (int)PalletTypeEnum.None, LocationType = Convert.ToInt32(palletDto.locationType) }; stockInfo.Details = new List<Dt_StockInfoDetail>(); } if (stockInfo != null && stockInfo.Details.Count > 0 && stockInfo.Details.FirstOrDefault()?.WarehouseCode != palletDto.WarehouseType) { return content.Error($"该æçç»çä»åºä¸º{stockInfo.Details.FirstOrDefault()?.WarehouseCode}ä¸å½åä»åº{palletDto.WarehouseType}ä¸ä¸è´ï¼ä¸å 许ç»ç"); } Dt_StockInfoDetail stockInfoDetail = _stockInfoRepository.Db.Queryable<Dt_StockInfoDetail>().Where(x => x.Barcode == palletDto.Barcode && x.Status == StockStatusEmun.æå¨å»ç».ObjToInt()).First(); if(stockInfoDetail == null) { return content.Error("æªæ¾å°åºåä¸éæ£å»ç»çæ¡ç "); } Dt_ReCheckOrder reCheckOrder = _stockInfoRepository.Db.Queryable<Dt_ReCheckOrder>().Where(x => x.MaterielCode == stockInfoDetail.MaterielCode && x.BatchNo == stockInfoDetail.BatchNo && x.Result == 0).First(); if(reCheckOrder != null) { return content.Error($"è¯¥éæ£æ¡ç çæ¹æ¬¡å¨éæ£å䏿ªæ¿å°éæ£ç»æï¼è¯·æ£æµéæ£å{reCheckOrder.OrderNo}ç¶æ"); } stockInfo.Details.Add(new Dt_StockInfoDetail { StockId = stockInfo == null ? 0 : stockInfo.Id, Barcode = stockInfoDetail.Barcode, MaterielCode = stockInfoDetail.MaterielCode, MaterielName = stockInfoDetail.MaterielName, BatchNo = stockInfoDetail.BatchNo, Unit = stockInfoDetail.Unit, SupplyCode = stockInfoDetail.SupplyCode, WarehouseCode = stockInfoDetail.WarehouseCode, StockQuantity = stockInfoDetail.StockQuantity, BarcodeQty = stockInfoDetail.BarcodeQty, BarcodeUnit = stockInfoDetail.BarcodeUnit, FactoryArea = stockInfoDetail.FactoryArea, Status = stockInfoDetail.Status, OrderNo = stockInfoDetail.OrderNo, BusinessType = "30", ValidDate = stockInfoDetail.ValidDate }); _stockInfoRepository.Db.Deleteable<Dt_StockInfoDetail>().Where(x => x.Barcode == stockInfoDetail.Barcode).ExecuteCommand(); if (stockInfo.Id == 0) { stockInfo.PalletCode = palletDto.PalletCode; stockInfo.StockStatus = (int)StockStatusEmun.鿣åºå宿; } stockInfo.PalletType = (int)PalletTypeEnum.None; _unitOfWorkManage.BeginTran(); _stockService.StockInfoService.AddMaterielGroup(stockInfo); _unitOfWorkManage.CommitTran(); Dt_StockInfo? NewstockInfo = await _stockInfoRepository.Db.Queryable<Dt_StockInfo>().Includes(x => x.Details).Where(x => x.PalletCode == palletDto.PalletCode).FirstAsync(); return WebResponseContent.Instance.OK(data: NewstockInfo.Details.OrderByDescending(x => x.Id)); } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); LogFactory.GetLog($"ç»çä¿¡æ¯").Info(true, $"ãå¼å¸¸ãï¼ã{ex.Message}ã{Environment.NewLine}ã{ex.StackTrace}ã{Environment.NewLine}{Environment.NewLine}"); return content.Error(ex.Message); } } } } ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_InboundService/TakeStockOrderService.cs
@@ -399,83 +399,6 @@ { return WebResponseContent.Instance.Error("æªæ¾å°è¯¥çç¹å·®å¼æ°æ®"); } //if(takeStockOrderDetail.Remark == "çç") //{ // Dt_InboundOrderDetail inboundOrderDetail = _inboundOrderDetailRepository.QueryFirst(x => x.Id == orderId); // if(inboundOrderDetail == null) // { // return WebResponseContent.Instance.Error("æªæ¾å°éæ©çææ¶å¹³è´¦åæ®"); // } // Dt_InboundOrder inboundOrder = _inboundOrderRepository.Db.Queryable<Dt_InboundOrder>().Where(x=>x.Id == inboundOrderDetail.OrderId).Includes(x=>x.Details).First(); // Dt_StockInfo stockInfo = _stockInfoRepository.Db.Queryable<Dt_StockInfo>().Where(x=>x.PalletCode == takeStockOrderDetail.TakePalletCode && x.StockStatus == StockStatusEmun.çç¹åºå宿.ObjToInt()).Includes(x=>x.Details).First(); // if(stockInfo== null) // { // return WebResponseContent.Instance.Error($"çç¹æç{takeStockOrderDetail.TakePalletCode}çåºåä¿¡æ¯æªæ¾å°ï¼ææçç¶æä¸æ£ç¡®"); // } // var datevaliDate = _inboundOrderRepository.Db.Queryable<Dt_MaterialExpirationDate>().Where(x => x.MaterialCode.Contains(inboundOrderDetail.MaterielCode.Substring(0, 6))).First(); // var newStockDetail = new Dt_StockInfoDetail // { // StockId = stockInfo == null ? 0 : stockInfo.Id, // Barcode = inboundOrderDetail.Barcode, // MaterielCode = inboundOrderDetail.MaterielCode, // MaterielName = inboundOrderDetail.MaterielName, // BatchNo = inboundOrderDetail.BatchNo, // Unit = inboundOrderDetail.Unit, // InboundOrderRowNo = inboundOrderDetail.lineNo, // SupplyCode = inboundOrderDetail.SupplyCode, // WarehouseCode = inboundOrderDetail.WarehouseCode, // StockQuantity = inboundOrderDetail.OrderQuantity, // BarcodeQty = inboundOrderDetail.BarcodeQty, // BarcodeUnit = inboundOrderDetail.BarcodeUnit, // FactoryArea = inboundOrder.FactoryArea, // Status = 0, // OrderNo = inboundOrder.InboundOrderNo, // BusinessType = inboundOrder.BusinessType, // ValidDate = inboundOrder.BusinessType == BusinessTypeEnum.å¤é¨ä»åºè°æºä».ToString() ? inboundOrderDetail.ValidDate : datevaliDate == null ? null : Convert.ToDateTime(DateTime.Now).AddDays(Convert.ToDouble(datevaliDate.ValidityDays)), // }; // stockInfo.Details.Add(newStockDetail); // inboundOrderDetail.ReceiptQuantity = inboundOrderDetail.OrderQuantity; // inboundOrderDetail.OverInQuantity = inboundOrderDetail.OrderQuantity; // inboundOrderDetail.OrderDetailStatus = OrderDetailStatusEnum.Over.ObjToInt(); // int overCount = 1; // int moreOverCount = inboundOrder.Details.Count(x => x.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()); // if (inboundOrder.Details.Count() == overCount + moreOverCount) // { // inboundOrder.OrderStatus = InOrderStatusEnum.å ¥åºå®æ.ObjToInt(); // } // else // { // inboundOrder.OrderStatus = InOrderStatusEnum.å ¥åºä¸.ObjToInt(); // } // takeStockOrderDetail.DifferenceQty -= inboundOrderDetail.OrderQuantity; // if(takeStockOrderDetail.DifferenceQty > 0) // { // takeStockOrderDetail.TakeDetalStatus = TakeStockDetailStatusEnum.ææ¶æå平账å¤çä¸.ObjToInt(); // } // else if (takeStockOrderDetail.DifferenceQty == 0) // { // takeStockOrderDetail.TakeDetalStatus = TakeStockDetailStatusEnum.ææ¶æå平账å¤ç.ObjToInt(); // } // else // { // return WebResponseContent.Instance.Error("è¯¥ææ¶åæ®æç»æ¡ç æ°é大äºå¾ 平账æ°éï¼è¯·å¦éå ¶ä»åæ®å¹³è´¦"); // } // _unitOfWorkManage.BeginTran(); // _inboundOrderRepository.UpdateData(inboundOrder); // _inboundOrderDetailRepository.UpdateData(inboundOrderDetail); // _takeStockOrderDetail.UpdateData(takeStockOrderDetail); // BaseDal.Db.Insertable(newStockDetail).ExecuteCommand(); // _unitOfWorkManage.CommitTran(); // List<string> barcodes = new List<string>(); // barcodes.Add(inboundOrderDetail.Barcode); // _outboundPickingService.NoStockOutBatchInOrderFeedbackToMes(inboundOrder.Id, barcodes); //} //else //{ Dt_OutboundOrderDetail outboundOrderDetail = _outboundOrderDetailRepository.QueryFirst(x => x.Remark == takeStockOrderDetail.TakeStockNo && (x.OrderQuantity-x.LockQuantity-x.MoveQty)>0); if (outboundOrderDetail == null) { @@ -711,10 +634,11 @@ List<Dt_OutboundOrderDetail> details = _outboundOrderDetailRepository.QueryData(x => x.OrderId == outboundOrder.Id); if(details.All(x => x.OverOutQuantity >= x.OrderQuantity - x.MoveQty)) { _feedbackMesService.OutboundFeedback(outboundOrder.OrderNo); outboundOrder.OrderStatus = OutOrderStatusEnum.åºåºå®æ.ObjToInt(); _outboundOrderRepository.UpdateData(outboundOrder); } _feedbackMesService.OutboundFeedback(outboundOrder.OrderNo); } catch (Exception ex) ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundService.cs
@@ -193,8 +193,14 @@ UpdateStockStatus(pickedDetails.Select(x => x.PalletCode).ToList(), StockStatusEmun.åºåºéå®.ObjToInt()); UpdateLocationStatus(pickedDetails.Select(x => x.LocationCode).ToList(), LocationStatusEnum.Lock.ObjToInt()); } //鿣å䏿£éï¼å»æéå®è®°å½ååºï¼å次ç»çæ¶æ£é¤åæ¡ç if (outboundOrder.OrderType != InOrderTypeEnum.ReCheck.ObjToInt()) { UpdateOutStockLockInfo(outStockLockInfos); } if (tasks.Any()) _taskRepository.AddData(tasks); _unitOfWorkManage.CommitTran(); @@ -484,7 +490,7 @@ x => request.StockDetailIds.Contains(x.Id) && x.MaterielCode == materielCalc.MaterielCode && x.StockQuantity > 0 && (x.Status == (int)StockStatusEmun.å ¥åºå®æ || x.Status == (int)StockStatusEmun.æå¨è§£é)); && (x.Status == (int)StockStatusEmun.å ¥åºå®æ || x.Status == (int)StockStatusEmun.æå¨å»ç»)|| x.Status == (int)StockStatusEmun.æå¨è§£é); if (!specifiedStockDetails.Any()) { @@ -670,15 +676,13 @@ decimal totalAllocatedQuantity = CalcTotalAllocatedQuantity(lockInfos, stockInfo.Id, detail.MaterielCode); lockInfo.AssignQuantity += actualAllocatedQuantity; lockInfo.AllocatedQuantity = totalAllocatedQuantity; // åééå®è®°å½ä¹æ´æ°OriginalQuantity为æçæ»åºåï¼å¯éï¼ä¿ææ°æ®ä¸è´ï¼ if (palletMaterielTotalStock > 0) lockInfo.OriginalQuantity = palletMaterielTotalStock; lockInfoList.Add(lockInfo); } else { // ===== æ ¸å¿ä¼å2ï¼OriginalQuantityèµå¼ä¸ºæçç©ææ»åºå ===== decimal originalQuantity = palletMaterielTotalStock; // æ¿ä»£åæå±é¨æç»æ°é decimal originalQuantity = palletMaterielTotalStock; List<string> allDetailIds = outboundOrder.Details.Where(x => x.OrderId == outboundOrder.Id && x.MaterielCode == detail.MaterielCode @@ -978,7 +982,7 @@ // æ´ç®±åºåºæ éæå PerformFullOutboundOperation(stockInfo, request, lockInfo.TaskNum.GetValueOrDefault()); if (outboundOrder.OrderType != 0) if (outboundOrder.OrderType == InOrderTypeEnum.InternalAllocat.ObjToInt()) { Dt_AllocateOrder allocateOrder = _allocateOrderRepository.QueryFirst(x => x.OrderNo == outboundOrder.OrderNo); if (allocateOrder != null) @@ -1004,6 +1008,29 @@ } _allocateMaterialInfoRepository.AddData(allocateMaterialInfos); } } else if(outboundOrder.OrderType == InOrderTypeEnum.ReCheck.ObjToInt()) { List<Dt_AllocateMaterialInfo> allocateMaterialInfos = new List<Dt_AllocateMaterialInfo>(); foreach (var item in stockInfo.Details) { Dt_AllocateMaterialInfo allocateMaterialInfo = new Dt_AllocateMaterialInfo() { Barcode = item.Barcode??"", BatchNo = item.BatchNo, FactoryArea = item.FactoryArea, MaterialCode = item.MaterielCode, MaterialName = item.MaterielName, OrderId = outboundOrder.Id, OrderNo = outboundOrder.OrderNo, Quantity = item.StockQuantity, SupplyCode = item.SupplyCode??"", Unit = item.Unit, WarehouseCode = item.WarehouseCode??"" }; allocateMaterialInfos.Add(allocateMaterialInfo); } _allocateMaterialInfoRepository.AddData(allocateMaterialInfos); } decimal allocatedQuantity = actualOutboundQuantity; @@ -1364,7 +1391,7 @@ MaterialCodeReturnDTO returnDTO = returnDTOs.First(x => x.Barcode == newBarcode); if (outboundOrder.OrderType != 0) if (outboundOrder.OrderType == InOrderTypeEnum.ReCheck.ObjToInt()||outboundOrder.OrderType == InOrderTypeEnum.InternalAllocat.ObjToInt()) { allocateMaterialInfo = new Dt_AllocateMaterialInfo() { @@ -1386,7 +1413,7 @@ { PerformFullOutboundOperation(stockDetail, stockInfo, actualOutboundQuantity, request, beforeQuantity, lockInfo.TaskNum.GetValueOrDefault()); if (outboundOrder.OrderType != 0) if (outboundOrder.OrderType == InOrderTypeEnum.ReCheck.ObjToInt() || outboundOrder.OrderType == InOrderTypeEnum.InternalAllocat.ObjToInt()) { allocateMaterialInfo = new Dt_AllocateMaterialInfo() { @@ -1405,8 +1432,8 @@ } // 夿æ¯å¦æ¯è°æ¨å if (outboundOrder.OrderType != 0) // 夿æ¯å¦æ¯æºä»è°æºä»å if ( outboundOrder.OrderType == InOrderTypeEnum.InternalAllocat.ObjToInt()) { Dt_AllocateOrder allocateOrder = _allocateOrderRepository.QueryFirst(x => x.OrderNo == outboundOrder.OrderNo); if (allocateOrder != null) @@ -1523,7 +1550,6 @@ _feedbackMesService.BarcodeFeedback(newBarcode); } // å é¤éå®è®°å½ï¼å¦æåºåºæç»å ¨é¨å®æï¼ ä¸CalculateActualOutboundQuantityæ¹æ³é颿³¨é代ç 2é1ä½¿ç¨ if (CheckOutboundOrderDetailCompletedByMatCode(request.OrderNo, lockInfo.MaterielCode, outboundOrderDetails.First())) { Func<Dt_OutStockLockInfo, bool> supWhere = x => string.IsNullOrEmpty(outboundOrderDetails.First().SupplyCode) ? true : x.SupplyCode == outboundOrderDetails.First().SupplyCode; @@ -1539,6 +1565,7 @@ } } // æ£æ¥åºåºåæ¯å¦å®æ if (CheckOutboundOrderCompleted(request.OrderNo)) { ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoService.cs
@@ -492,7 +492,7 @@ // æå»ºæ¥è¯¢æ¡ä»¶ var stockQuery = Db.Queryable<Dt_StockInfo>() .Where(x => locationCodes.Contains(x.LocationCode)) .Where(x => x.StockStatus == (int)StockStatusEmun.å ¥åºå®æ || x.StockStatus == (int)StockStatusEmun.è¿æ) .Where(x => x.StockStatus == (int)StockStatusEmun.å ¥åºå®æ) .Includes(x => x.Details); // æ§è¡æ¥è¯¢å¹¶æå è¿å åºæåº ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs
@@ -282,6 +282,23 @@ _inboundOrderService.UpdateData(inboundOrder); } } Dt_OutboundOrder outboundOrder = _outboundOrderService.Db.Queryable<Dt_OutboundOrder>().Where(x => x.OrderNo == stockInfo.Details.FirstOrDefault().OrderNo).Includes(x => x.Details).First(); if (outboundOrder != null) { foreach (var item in stockInfo.Details.Where(x => x.OrderNo == outboundOrder.OrderNo).ToList()) { var inbounddetail = _allocateMaterialInfo.QueryFirst(x => x.OrderNo == item.OrderNo && x.Barcode == item.Barcode); if (inbounddetail != null) { var alldelete = _allocateMaterialInfo.DeleteAndMoveIntoHty(inbounddetail, OperateTypeEnum.èªå¨å é¤); if (!alldelete) { await Db.Deleteable(task).ExecuteCommandAsync(); } } } } stockInfo.LocationCode = task.TargetAddress; stockInfo.StockStatus = StockStatusEmun.å ¥åºå®æ.ObjToInt(); stockInfo.Details.ForEach(x => @@ -345,8 +362,9 @@ Details = new List<AllocateDtoDetail>() }; var groupedData = inboundOrder.Details.GroupBy(item => new { item.MaterielCode, item.lineNo, item.BarcodeUnit, item.WarehouseCode }) var query = inboundOrder.Details.AsQueryable(); query = query.Where(item => item.ReturnToMESStatus == 0); var groupedData = query.GroupBy(item => new { item.MaterielCode, item.lineNo, item.BarcodeUnit, item.WarehouseCode }) .Select(group => new AllocateDtoDetail { MaterialCode = group.Key.MaterielCode, @@ -403,8 +421,9 @@ Details = new List<AllocateDtoDetail>() }; var groupedData = inboundOrder.Details.GroupBy(item => new { item.MaterielCode, item.lineNo, item.BarcodeUnit, item.WarehouseCode }) var query = inboundOrder.Details.AsQueryable(); query = query.Where(item => item.ReturnToMESStatus == 0); var groupedData = query.GroupBy(item => new { item.MaterielCode, item.lineNo, item.BarcodeUnit, item.WarehouseCode }) .Select(group => new AllocateDtoDetail { MaterialCode = group.Key.MaterielCode, @@ -452,8 +471,9 @@ details = new List<FeedbackInboundDetailsModel>() }; var groupedData = inboundOrder.Details.GroupBy(item => new { item.MaterielCode, item.SupplyCode, item.BatchNo, item.lineNo, item.BarcodeUnit, item.WarehouseCode }) var query = inboundOrder.Details.AsQueryable(); query = query.Where(item => item.ReturnToMESStatus == 0); var groupedData = query.GroupBy(item => new { item.MaterielCode, item.SupplyCode, item.BatchNo, item.lineNo, item.BarcodeUnit, item.WarehouseCode }) .Select(group => new FeedbackInboundDetailsModel { materialCode = group.Key.MaterielCode, @@ -588,7 +608,11 @@ stock.Details.ForEach(x => { if (x.Status != StockStatusEmun.æå¨å»ç».ObjToInt()) { x.Status = StockStatusEmun.åºåºå®æ.ObjToInt(); } }); _stockService.StockInfoService.Db.UpdateNav(stock).IncludesAllFirstLayer().ExecuteCommand(); @@ -737,6 +761,9 @@ await Db.Deleteable(task).ExecuteCommandAsync(); } Dt_OutboundOrder outboundOrder = _outboundOrderService.Db.Queryable<Dt_OutboundOrder>().Where(x => x.OrderNo == stockInfo.Details.FirstOrDefault().OrderNo).Includes(x=>x.Details).First(); if(outboundOrder != null) { foreach (var item in stockInfo.Details.Where(x => x.OrderNo == outboundOrder.OrderNo).ToList()) { var inbounddetail = _allocateMaterialInfo.QueryFirst(x => x.OrderNo == item.OrderNo && x.Barcode == item.Barcode); @@ -746,6 +773,7 @@ if (!alldelete) { await Db.Deleteable(task).ExecuteCommandAsync(); } } } } @@ -976,7 +1004,10 @@ { foreach (var detail in stockInfo.Details) { if(detail.Status != StockStatusEmun.æå¨å»ç».ObjToInt()) { detail.Status = StockStatusEmun.å ¥åºå®æ.ObjToInt(); } detail.OutboundQuantity = 0; } _stockService.StockInfoDetailService.Repository.UpdateData(stockInfo.Details); @@ -1980,6 +2011,101 @@ return await Task.FromResult(WebResponseContent.Instance.Error(ex.Message)); } } /// <summary> /// éæ£å ¥åºå®æ /// </summary> /// <param name="task"></param> /// <returns></returns> public async Task<WebResponseContent> InQualityTaskCompleted(Dt_Task task) { WebResponseContent content = new WebResponseContent(); try { Dt_StockInfo stockInfo = await _stockRepository.Db.Queryable<Dt_StockInfo>() .Includes(x => x.Details) .Where(x => x.PalletCode == task.PalletCode) .FirstAsync(); if (stockInfo == null) { return WebResponseContent.Instance.Error($"æªæ¾å°æç对åºçç»çä¿¡æ¯"); } if (stockInfo.Details.Count == 0 && stockInfo.PalletType != PalletTypeEnum.Empty.ObjToInt()) { _logger.LogInformation($"TaskService InPickTaskCompleted: æªæ¾å°è¯¥æçåºåæç»ä¿¡æ¯.{task.TaskNum}"); return WebResponseContent.Instance.Error($"æªæ¾å°è¯¥æçåºåæç»ä¿¡æ¯"); } Dt_LocationInfo locationInfo = _locationInfoService.Repository.QueryFirst(x => x.LocationCode == task.TargetAddress); if (locationInfo == null) { return content.Error($"æªæ¾å°å¯¹åºçç»ç¹è´§ä½ä¿¡æ¯"); } if (!string.IsNullOrEmpty(stockInfo.LocationCode)) { return WebResponseContent.Instance.Error($"该æçå·²ç»å®è´§ä½"); } if (locationInfo.LocationStatus == LocationStatusEnum.InStock.ObjToInt()) { return WebResponseContent.Instance.Error($"è´§ä½ç¶æä¸æ£ç¡®"); } _unitOfWorkManage.BeginTran(); var beforelocationStatus = locationInfo.LocationStatus; locationInfo.LocationStatus = LocationStatusEnum.InStock.ObjToInt(); _locationInfoService.Repository.UpdateData(locationInfo); stockInfo.LocationCode = locationInfo.LocationCode; stockInfo.PalletCode = task.PalletCode; stockInfo.LocationCode = task.TargetAddress; stockInfo.StockStatus = StockStatusEmun.å ¥åºå®æ.ObjToInt(); _stockRepository.UpdateData(stockInfo); task.TaskStatus = TaskStatusEnum.Finish.ObjToInt(); var result = _task_HtyService.DeleteAndMoveIntoHty(task, OperateTypeEnum.èªå¨å®æ); _unitOfWorkManage.CommitTran(); if (!result) { await Db.Deleteable(task).ExecuteCommandAsync(); } Dt_OutboundOrder outboundOrder = _outboundOrderService.Db.Queryable<Dt_OutboundOrder>().Where(x => x.OrderNo == stockInfo.Details.FirstOrDefault().OrderNo).Includes(x => x.Details).First(); if (outboundOrder != null) { foreach (var item in stockInfo.Details.Where(x => x.OrderNo == outboundOrder.OrderNo).ToList()) { var inbounddetail = _allocateMaterialInfo.QueryFirst(x => x.OrderNo == item.OrderNo && x.Barcode == item.Barcode); if (inbounddetail != null) { var alldelete = _allocateMaterialInfo.DeleteAndMoveIntoHty(inbounddetail, OperateTypeEnum.èªå¨å é¤); if (!alldelete) { await Db.Deleteable(task).ExecuteCommandAsync(); } } } } try { _locationStatusChangeRecordService.AddLocationStatusChangeRecord(locationInfo, beforelocationStatus, StockChangeType.Inbound.ObjToInt(), "", task.TaskNum); } catch (Exception ex) { _logger.LogInformation($"InEmptyTaskCompleted AddLocationStatusChangeRecord : {ex.Message} "); } return content; } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); return await Task.FromResult(WebResponseContent.Instance.Error(ex.Message)); } } } } ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_Inbound.cs
@@ -54,7 +54,7 @@ return WebResponseContent.Instance.Error($"æªæ¾å°ç»çä¿¡æ¯"); } if (stockInfo.StockStatus != StockStatusEmun.ç»çæå.ObjToInt() && stockInfo.StockStatus != StockStatusEmun.æå¨ç»çæå.ObjToInt() && stockInfo.StockStatus != StockStatusEmun.æ£é宿.ObjToInt() && stockInfo.StockStatus != StockStatusEmun.æºä»å ¥æºä»ç»çæå.ObjToInt()) if (stockInfo.StockStatus != StockStatusEmun.ç»çæå.ObjToInt() && stockInfo.StockStatus != StockStatusEmun.æå¨ç»çæå.ObjToInt() && stockInfo.StockStatus != StockStatusEmun.æ£é宿.ObjToInt() && stockInfo.StockStatus != StockStatusEmun.æºä»å ¥æºä»ç»çæå.ObjToInt() && stockInfo.StockStatus != StockStatusEmun.鿣åºå宿.ObjToInt()) { return WebResponseContent.Instance.Error($"该æçç¶æä¸æ£ç¡®,ä¸å¯ç³è¯·å ¥åº"); } @@ -85,7 +85,7 @@ OrderNo= stockInfo.Details.FirstOrDefault()?.OrderNo, }; //空箱 if (stockInfo.PalletType == PalletTypeEnum.Empty.ObjToInt()|| stockInfo.StockStatus == StockStatusEmun.æºä»å ¥æºä»ç»çæå.ObjToInt()) if (stockInfo.PalletType == PalletTypeEnum.Empty.ObjToInt()|| stockInfo.StockStatus == StockStatusEmun.æºä»å ¥æºä»ç»çæå.ObjToInt() || stockInfo.StockStatus == StockStatusEmun.鿣åºå宿.ObjToInt()) { _unitOfWorkManage.BeginTran(); newTask.TaskType = TaskTypeEnum.InEmpty.ObjToInt(); @@ -94,6 +94,10 @@ { newTask.TaskType = TaskTypeEnum.AllocateInWarehouse.ObjToInt(); } if (stockInfo.StockStatus == StockStatusEmun.鿣åºå宿.ObjToInt()) { newTask.TaskType = TaskTypeEnum.InQuality.ObjToInt(); } int taskId = BaseDal.AddData(newTask); newTask.TaskId = taskId; ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Inbound/InboundController.cs
@@ -52,6 +52,16 @@ } /// <summary> /// 鿣ç»ç /// </summary> /// <param name="palletDto"></param> /// <returns></returns> [HttpPost, Route("ReCheckGroupPallet"), AllowAnonymous] public async Task<WebResponseContent> ReCheckGroupPallet([FromBody] GroupPalletDto palletDto) { return await Service.ReCheckGroupPallet(palletDto); } /// <summary> /// å ¥åºåæ¹åä¼ MES /// </summary> /// <param name="palletDto"></param>