ÏîÄ¿´úÂë/WIDESEA_WMSClient/src/extension/inbound/extend/OrderStockTake.vue
@@ -61,6 +61,35 @@ </el-input> </el-form-item> <!-- æ°å¢ï¼ç«å°éæ©ä¸ææ¡ --> <el-form-item label="ååºç«å°ï¼" name="station" :rules="[ { required: true, message: 'è¯·éæ©ååºç«å°', trigger: 'blur', }, ]" class="form-item" > <el-select v-model="selectedStation" placeholder="è¯·éæ©ååºç«å°" :disabled="!formData.boxNo.trim() || loading" class="custom-input" :class="{ 'has-value': selectedStation }" > <el-option v-for="item in stations" :key="item.key || item.value" :label="item.label" :value="item.value" ></el-option> </el-select> </el-form-item> <!-- æ¡ç è¾å ¥æ¡ --> <el-form-item label="çç¹æ¡ç ï¼" @@ -147,7 +176,7 @@ type="info" size="small" @click="handleBoxReturn" :disabled="!formData.boxNo.trim() || loading" :disabled="!formData.boxNo.trim() || !selectedStation || loading" class="return-btn" > <Return /> æç®±ååº @@ -188,6 +217,8 @@ import VolBox from "@/components/basic/VolBox.vue"; import http from "@/api/http"; // æ°å¢ï¼å¼å ¥ç«å°ç®¡çå·¥å ·ï¼å示ä¾ä»£ç ä¿æä¸è´ï¼ import { stationManager, STATION_STORAGE_KEY } from "@/../src/uitils/stationManager"; // ååºå¼åé - åæ®å· const orderNo = ref(""); @@ -205,6 +236,13 @@ }); const loading = ref(false); const formRef = ref(null); // æ°å¢ï¼ç«å°ç¸å ³ååºå¼æ°æ®ï¼ä»¿ç §ç¤ºä¾ä»£ç ï¼ const stations = ref([ { label: "ç«å°2", value: "2-1" }, { label: "ç«å°3", value: "3-1" }, ]); const selectedStation = ref(stationManager.getStation() || ""); // é»è®¤éä¸ç¼åçç«å° // 模æ¿å¼ç¨ const boxNoInputRef = ref(null); @@ -232,6 +270,8 @@ formData.barcode = ""; formData.stockQuantity = ""; formData.actualQuantity = ""; // æ°å¢ï¼æç®±å·æ¸ 空æ¶ï¼éç½®ç«å°éæ© selectedStation.value = stationManager.getStation() || ""; } }, { immediate: true } @@ -257,6 +297,8 @@ formData.barcode = ""; formData.stockQuantity = ""; formData.actualQuantity = ""; // æ°å¢ï¼æå¼å¼¹çªæ¶éç½®ç«å°éæ©ï¼é»è®¤åç¼åçç«å°ï¼ selectedStation.value = stationManager.getStation() || ""; nextTick(() => { boxNoInputRef.value?.focus(); }); @@ -468,16 +510,21 @@ } }; // æç®±ååºåè½ // æç®±ååºåè½ï¼æ ¸å¿ä¿®æ¹ï¼å¢å ç«å°éªè¯ + ä¼ å ¥sourceAddressåæ°ï¼ const handleBoxReturn = async () => { const boxNo = formData.boxNo.trim(); // æ°å¢ï¼éªè¯ç«å°æ¯å¦éæ© if (!boxNo) { ElMessage.warning("请å è¾å ¥ææ«ææç®±å·"); return; } if (!selectedStation.value) { ElMessage.warning("è¯·éæ©ååºç«å°"); return; } try { await ElMessageBox.confirm(`ç¡®å®å°æç®±ã${boxNo}ãååºåï¼`, "ååºç¡®è®¤", { await ElMessageBox.confirm(`ç¡®å®å°æç®±ã${boxNo}ãååºè³ã${selectedStation.value}ãç«å°åï¼`, "ååºç¡®è®¤", { confirmButtonText: "ç¡®å®", cancelButtonText: "åæ¶", type: "info", @@ -488,19 +535,21 @@ loading.value = true; // æ°å¢ï¼æ¼æ¥sourceAddressåæ°ï¼ç«å°æ°æ®ï¼å°æ¥å£è¯·æ±ä¸ const res = await http.post( `/api/TakeStockOrder/ReturnBox?boxNo=${encodeURIComponent(boxNo)}&orderNo=${encodeURIComponent( orderNo.value )}`, )}&sourceAddress=${encodeURIComponent(selectedStation.value)}`, // æ°å¢sourceAddressåæ° "æç®±ååºä¸..." ); if (res.status) { ElMessage.success(`æç®±ã${boxNo}ãååºæåï¼`); ElMessage.success(`æç®±ã${boxNo}ãååºè³ã${selectedStation.value}ãç«å°æåï¼`); formData.boxNo = ""; formData.barcode = ""; formData.stockQuantity = ""; formData.actualQuantity = ""; selectedStation.value = stationManager.getStation() || ""; // éç½®ç«å°éæ© nextTick(() => { boxNoInputRef.value?.focus(); }); @@ -588,13 +637,15 @@ } /* æå¼æ¶éèå ä½ç¬¦ + ä¼åè¾¹æ¡ */ .custom-input.has-value :deep(.el-input__inner) { .custom-input.has-value :deep(.el-input__inner), .custom-input.has-value :deep(.el-select__wrapper) { --el-input-placeholder-color: transparent; /* éèå ä½ç¬¦ */ border-color: #8cc5ff; /* æµ èè¾¹æ¡ï¼åºåæ å¼ç¶æ */ background-color: #ffffff; } .custom-input :deep(.el-input__inner) { .custom-input :deep(.el-input__inner), .custom-input :deep(.el-select__wrapper) { border-radius: 8px; border-color: #e5f0fa; transition: all 0.2s ease; @@ -606,7 +657,8 @@ } /* èç¦æ ·å¼ä¼å */ .custom-input :deep(.el-input__inner:focus) { .custom-input :deep(.el-input__inner:focus), .custom-input :deep(.el-select__wrapper:focus) { border-color: #409eff; box-shadow: 0 0 0 3px rgba(64, 158, 255, 0.1); background-color: #ffffff; @@ -666,7 +718,8 @@ } /* æå¼æ¶å³ä½¿éªè¯å¤±è´¥ï¼ä¹ä¸æ¾ç¤ºéè¯¯è¾¹æ¡ */ .custom-input.has-value :deep(.el-input__inner.el-input__inner--error) { .custom-input.has-value :deep(.el-input__inner.el-input__inner--error), .custom-input.has-value :deep(.el-select__wrapper.el-select__wrapper--error) { border-color: #8cc5ff; box-shadow: none; } @@ -807,22 +860,26 @@ } /* å ä½ç¬¦æ ·å¼ - ç»ä¸é¢è² */ .el-input__inner::-webkit-input-placeholder { .el-input__inner::-webkit-input-placeholder, .el-select__placeholder { color: #b3d8ff; font-size: 13px; } .el-input__inner::-moz-placeholder { .el-input__inner::-moz-placeholder, .el-select__placeholder { color: #b3d8ff; font-size: 13px; } .el-input__inner:-ms-input-placeholder { .el-input__inner:-ms-input-placeholder, .el-select__placeholder { color: #b3d8ff; font-size: 13px; } .el-input__inner::placeholder { .el-input__inner::placeholder, .el-select__placeholder { color: #b3d8ff; font-size: 13px; } ÏîÄ¿´úÂë/WIDESEA_WMSClient/src/extension/inbound/extend/TakeStockSelect.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,288 @@ <template> <el-dialog v-model="dialogVisible" title="ææ¶æå平账" width="1000px" :close-on-click-modal="false" :destroy-on-close="true" @closed="handleDialogClosed" > <div class="reconciliation-container"> <!-- åæ®åºæ¬ä¿¡æ¯ --> <div class="order-info"> <div class="info-row"> <span class="label">åæ®IDï¼</span> <span class="value">{{ currentRow.id || '-' }}</span> </div> <div class="info-row" v-if="selectedItem"> <span class="label">å·²é订åï¼</span> <span class="value selected-order">{{ selectedItem.orderId }}</span> </div> </div> <!-- æ°æ®å表å±ç¤º --> <el-scrollbar height="400px" class="custom-scrollbar"> <transition-group name="data-item-transition"> <div class="data-item" v-for="(item, index) in displayData" :key="`${item.orderId}-${index}`"> <div class="radio-container"> <el-radio v-model="selectedItem" :label="item" :value="item" @change="handleRadioChange(item)" > <!-- åéæé®çå 容ç空ï¼åªæ¾ç¤ºåéæé® --> </el-radio> </div> <div class="data-detail"> <div class="detail-row"> <span class="label">订åIDï¼</span> <span class="value">{{ item.orderId || '-' }}</span> </div> <div class="detail-row"> <span class="label">ç©æç¼ç ï¼</span> <span class="value">{{ item.materielCode || '-' }}</span> </div> <div class="detail-row"> <span class="label">ç©æåç§°ï¼</span> <span class="value">{{ item.materielName || '-' }}</span> </div> <div class="detail-row"> <span class="label">æ¹æ¬¡å·ï¼</span> <span class="value">{{ item.batchNo || '-' }}</span> </div> <div class="detail-row"> <span class="label">è®¢åæ°éï¼</span> <span class="value">{{ item.orderQuantity || 0 }}</span> </div> <div class="detail-row"> <span class="label">åä½ï¼</span> <span class="value">{{ item.unit || '-' }}</span> </div> <div class="detail-row"> <span class="label">ä¾åºåç¼ç ï¼</span> <span class="value">{{ item.supplyCode || '-' }}</span> </div> <div class="detail-row"> <span class="label">ä»åºç¼ç ï¼</span> <span class="value">{{ item.warehouseCode || '-' }}</span> </div> </div> </div> </transition-group> <div class="empty-tip" v-if="displayData.length === 0"> <span>ææ ç¸å ³æ°æ®</span> </div> </el-scrollbar> </div> <template #footer> <el-button @click="dialogVisible = false">å ³é</el-button> <el-button type="primary" @click="handleConfirm" :disabled="!selectedItem" :loading="loading" > {{ loading ? '平账ä¸...' : '确认平账' }} </el-button> </template> </el-dialog> </template> <script setup> import { ref } from 'vue'; import { ElMessage, ElMessageBox } from 'element-plus'; // æ ¹æ®æ¨çå®é 项ç®å¼å ¥è¯·æ±æ¹æ³ï¼è¿é使ç¨axiosä½ä¸ºç¤ºä¾ import axios from 'axios'; // å¼¹çªæ¾ç¤ºç¶æ const dialogVisible = ref(false); // å½åéä¸çè¡æ°æ® const currentRow = ref({}); // è¦å±ç¤ºçæ°æ®å表 const displayData = ref([]); // éä¸çæ°æ®é¡¹ const selectedItem = ref(null); // å è½½ç¶æ const loading = ref(false); // æå¼å¼¹çªæ¹æ³ï¼ä¾ç¶ç»ä»¶è°ç¨ï¼ const open = (row, data) => { currentRow.value = row; displayData.value = data; selectedItem.value = null; // éç½®éæ© dialogVisible.value = true; }; // å¤çåéæé®åå const handleRadioChange = (item) => { selectedItem.value = item; }; // å¼¹çªå ³éæ¶çå¤ç const handleDialogClosed = () => { selectedItem.value = null; loading.value = false; }; // 确认平账æä½ const handleConfirm = async () => { if (!selectedItem.value) { ElMessage.warning('è¯·éæ©ä¸æ¡æ°æ®è¿è¡å¹³è´¦å¤ç'); return; } try { // 确认æç¤º await ElMessageBox.confirm( `ç¡®å®è¦å¯¹è®¢å ${selectedItem.value.orderId} è¿è¡å¹³è´¦å¤çåï¼`, '平账确认', { confirmButtonText: 'ç¡®å®', cancelButtonText: 'åæ¶', type: 'warning', } ); loading.value = true; // è°ç¨å¹³è´¦æ¥å£ const params = { id: currentRow.value.id, // è¡ID orderId: selectedItem.value.orderId // éæ©çåæ®orderId }; // æ ¹æ®æ¨çæ¥å£å®é æ åµè°æ´è¯·æ±æ¹å¼ const response = await axios.get('/api/TakeStockOrder/DocumentReconciliation', { params: params // GET请æ±ä¼ å // 妿æ¯POST请æ±ï¼å¯ä»¥è¿æ ·åï¼ // data: params }); if (response.status) { ElMessage.success('平账æä½æå'); dialogVisible.value = false; // å¯ä»¥éè¿emitéç¥ç¶ç»ä»¶å·æ°è¡¨æ ¼ // emit('refresh-table'); } else { } } catch (error) { // 妿æ¯ç¨æ·åæ¶æä½ï¼ä¸æ¾ç¤ºéè¯¯ä¿¡æ¯ if (error === 'cancel' || error === 'close') { return; } ElMessage.error('平账æä½å¤±è´¥ï¼è¯·ç¨åéè¯'); } finally { loading.value = false; } }; // æ´é²æ¹æ³ç»ç¶ç»ä»¶ defineExpose({ open }); </script> <style scoped> .reconciliation-container { padding: 10px 0; } .order-info { margin-bottom: 20px; padding: 10px; background: #f5f7fa; border-radius: 4px; display: flex; flex-wrap: wrap; gap: 20px; } .info-row { display: flex; align-items: center; } .label { font-weight: 600; color: #606266; margin-right: 5px; min-width: 80px; text-align: right; } .value { color: #303133; } .selected-order { color: #409EFF; font-weight: 600; } .custom-scrollbar { border: 1px solid #e4e7ed; border-radius: 4px; } .data-item { display: flex; align-items: flex-start; padding: 15px; margin: 10px; background: #fff; border: 1px solid #e4e7ed; border-radius: 4px; transition: all 0.3s; } .data-item:hover { box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1); } .data-item.selected { border-color: #409EFF; background-color: #f0f7ff; } .radio-container { margin-right: 12px; margin-top: 4px; } .data-detail { display: grid; grid-template-columns: repeat(2, 1fr); gap: 10px; flex: 1; } .detail-row { display: flex; align-items: center; } .empty-tip { text-align: center; padding: 50px 0; color: #909399; } .data-item-transition-enter-from, .data-item-transition-leave-to { opacity: 0; transform: translateY(10px); } .data-item-transition-enter-active, .data-item-transition-leave-active { transition: all 0.3s ease; } :deep(.el-radio__label) { display: none; } </style> ÏîÄ¿´úÂë/WIDESEA_WMSClient/src/extension/inbound/takeStockOrderDetail.js
@@ -1,58 +1,201 @@ //æ¤jsæä»¶æ¯ç¨æ¥èªå®ä¹æ©å±ä¸å¡ä»£ç ï¼å¯ä»¥æ©å±ä¸äºèªå®ä¹é¡µé¢æè éæ°é ç½®çæç代ç // èªå®ä¹æ©å±ä¸å¡ä»£ç import gridBody from "./extend/OrderStockTake.vue"; // å¼å ¥ææ¶æå平账弹çªç»ä»¶ import gridHeader from "./extend/TakeStockSelect.vue"; import { ElMessageBox, ElLoading, ElMessage } from "element-plus"; let extension = { components: { //æ¥è¯¢ç颿©å±ç»ä»¶ gridHeader: '', gridBody: '', gridFooter: '', //æ°å»ºãç¼è¾å¼¹åºæ¡æ©å±ç»ä»¶ modelHeader: '', modelBody: '', modelFooter: '' }, tableAction: '', //æå®æå¼ 表çæé(è¿éå¡«å表å,é»è®¤ä¸ç¨å¡«å) buttons: { view: [], box: [], detail: [] }, //æ©å±çæé® methods: { //ä¸é¢è¿äºæ¹æ³å¯ä»¥ä¿çä¹å¯ä»¥å é¤ onInit() { }, onInited() { //æ¡æ¶åå§åé ç½®å //妿è¦é ç½®æç»è¡¨,卿¤æ¹æ³æä½ //this.detailOptions.columns.forEach(column=>{ }); }, searchBefore(param) { //ç颿¥è¯¢å,å¯ä»¥ç»param.wheresæ·»å æ¥è¯¢åæ° //è¿åfalseï¼åä¸ä¼æ§è¡æ¥è¯¢ return true; }, searchAfter(result) { //æ¥è¯¢åï¼resultè¿åçæ¥è¯¢æ°æ®,å¯ä»¥å¨æ¾ç¤ºå°è¡¨æ ¼åå¤çè¡¨æ ¼çå¼ return true; }, addBefore(formData) { //æ°å»ºä¿ååformData为对象ï¼å æ¬æç»è¡¨ï¼å¯ä»¥ç»ç»è¡¨å设置å¼ï¼èªå·±è¾åºçformDataçå¼ return true; }, updateBefore(formData) { //ç¼è¾ä¿ååformData为对象ï¼å æ¬æç»è¡¨ãå é¤è¡çId return true; }, rowClick({ row, column, event }) { //æ¥è¯¢çé¢ç¹å»è¡äºä»¶ this.$refs.table.$refs.table.toggleRowSelection(row); //åå»è¡æ¶éä¸å½åè¡; }, modelOpenAfter(row) { //ç¹å»ç¼è¾ãæ°å»ºæé®å¼¹åºæ¡åï¼å¯ä»¥å¨æ¤å¤åé»è¾ï¼å¦ï¼ä»åå°è·åæ°æ® //(1)夿æ¯ç¼è¾è¿æ¯æ°å»ºæä½ï¼ this.currentAction=='Add'; //(2)ç»å¼¹åºæ¡è®¾ç½®é»è®¤å¼ //(3)this.editFormFields.åæ®µ='xxx'; //妿éè¦ç»ä¸ææ¡è®¾ç½®é»è®¤å¼ï¼è¯·éåthis.editFormOptionsæ¾å°å段é 置对åºdata屿§çkeyå¼ //ç䏿就æè¾åºçï¼console.log(this.editFormOptions) components: { // æ¥è¯¢ç颿©å±ç»ä»¶ gridHeader: gridHeader, gridBody: gridBody, // åæçç¹å¼¹çªç»ä»¶ gridFooter: '', modelHeader: '', modelBody: '', modelFooter: '' }, tableAction: '', // æ éæå®è¡¨å buttons: { view: [], box: [], detail: [] }, // æ©å±æé® methods: { onInit() { // åæçç¹æé®é»è¾ä¿ç let OrderStockTakeBtn = this.buttons.find(x => x.value === 'OrderStockTake'); if (OrderStockTakeBtn) { OrderStockTakeBtn.onClick = function () { let rows = this.$refs.table.getSelected(); if (rows.length === 0) return this.$error("è¯·éæ©ä¸æ¡çç¹åæ®æ°æ®ï¼"); if (rows.length > 1) return this.$error("åªè½éæ©ä¸æ¡çç¹åæ®æ°æ®ï¼"); const selectedReceiptNo = rows[0].orderNo; if (!selectedReceiptNo) return this.$error("éä¸çåæ®ç¼ºå°ææçåæ®å·ï¼"); this.$refs.gridBody.open(selectedReceiptNo); }; } // çå¬åæå¼¹çªäºä»¶ï¼ä¿çï¼ this.$nextTick(() => { const stockTakeComp = this.$refs.gridBody; if (stockTakeComp) { stockTakeComp.$on('refresh', () => { this.$refs.table.reload(); }); stockTakeComp.$on('box-returned', (boxNo) => { this.$success(`æç®±ã${boxNo}ãååºæåï¼è¡¨æ ¼å°å·æ°ï¼`); this.$refs.table.reload(); }); } }); // ========== æ°å¢æä½åï¼äººå·¥å¹³è´¦ + ææ¶æå平账 ========== this.columns.push({ field: 'operation', title: 'æä½', width: 200, fixed: 'right', align: 'center', formatter: (row) => { return ` <span style="cursor: pointer;color: #2d8cf0;margin-right: 10px;" class="manual-reconciliation"> <i class="el-icon-check"></i>人工平账 </span> <span style="cursor: pointer;color: #1989fa;" class="misc-reconciliation"> <i class="el-icon-edit"></i>ææ¶æå平账 </span> `; }, click: (row, column, event) => { const target = event.target; // åºåç¹å»çæ¯äººå·¥å¹³è´¦è¿æ¯ææ¶æå平账 if (target.closest('.manual-reconciliation')) { this.handleManualReconciliation(row); // 人工平账é»è¾ } else if (target.closest('.misc-reconciliation')) { this.handleMiscReconciliation(row); // ææ¶æå平账é»è¾ } } }); }, // ========== äººå·¥å¹³è´¦æ ¸å¿é»è¾ ========== handleManualReconciliation(row) { // å¼¹åºç¡®è®¤æ¡ ElMessageBox.confirm( 'ç¡®è®¤è¦æ§è¡äººå·¥å¹³è´¦æä½åï¼', 'æä½ç¡®è®¤', { confirmButtonText: '确认', cancelButtonText: 'åæ¶', type: 'warning' } ).then(async () => { // æ·»å é®ç½©å±é²æ¢éå¤ç¹å» const loading = ElLoading.service({ lock: true, text: 'å¤çä¸ï¼è¯·ç¨å...', background: 'rgba(0, 0, 0, 0.7)' }); try { // è°ç¨äººå·¥å¹³è´¦æ¥å£ const response = await this.http.get(`/api/TakeStockOrder/ManualReconciliation?id=${row.id}`); if (response.status) { ElMessage.success('人工平账æä½æåï¼'); this.$refs.table.reload(); // å·æ°è¡¨æ ¼ } else { ElMessage.error(`æä½å¤±è´¥ï¼${response.message || 'æªç¥é误'}`); } } catch (error) { } finally { // å ³éé®ç½©å± loading.close(); } }).catch(() => { ElMessage.info('å·²åæ¶äººå·¥å¹³è´¦æä½'); }); }, // ========== ææ¶æåå¹³è´¦æ ¸å¿é»è¾ï¼ä¿®æ¹åï¼ ========== handleMiscReconciliation(row) { // éä¸å½åè¡ const table = this.$refs.table.$refs.table; if (table) { table.clearSelection(); table.toggleRowSelection(row, true); } // è°ç¨æ¥å£è·åææ¶æåå¹³è´¦æ°æ® const fetchMiscData = async () => { const loading = ElLoading.service({ lock: true, text: 'å è½½æ°æ®ä¸...', background: 'rgba(0, 0, 0, 0.7)' }); try { // è°ç¨æ¥å£ï¼ä¼ érowä¸çremarkåidåæ° const response = await this.http.get(`/api/TakeStockOrder/SelectOrder?remark=${row.remark || ''}&id=${row.id}`); loading.close(); if (response.status) { if (!Array.isArray(response.data) || response.data.length === 0) { ElMessage.warning("æªæ¥è¯¢å°ç¸å ³æ°æ®"); // æå¼ç©ºæ°æ®çå¼¹çª this.$refs.gridHeader.open(row, []); return; } // æåéè¦å±ç¤ºçåæ®µ const displayData = response.data.map(item => ({ orderId: item.orderId || '', materielCode: item.materielCode || '', materielName: item.materielName || '', batchNo: item.batchNo || '', orderQuantity: item.orderQuantity || 0, unit: item.unit || '', supplyCode: item.supplyCode || '', warehouseCode: item.warehouseCode || '' })); // æå¼å¼¹çªå¹¶ä¼ éå¤çåçæ°æ® this.$refs.gridHeader.open(row, displayData); } else { ElMessage.error(`æ¥è¯¢å¤±è´¥ï¼${response.message || 'æªç¥é误'}`); } } catch (error) { loading.close(); ElMessage.error(`ç½ç»å¼å¸¸ï¼${error.message || 'æ¥å£è°ç¨å¤±è´¥'}`); } }; // æ§è¡æ°æ®æ¥è¯¢å¹¶æå¼å¼¹çª fetchMiscData(); }, onInited() { // æ¡æ¶åå§åå®æåæ§è¡ }, searchBefore(param) { // æ¥è¯¢åæ¦æª return true; }, searchAfter(result) { // æ¥è¯¢åæ°æ®å¤ç return true; }, addBefore(formData) { return true; }, updateBefore(formData) { return true; }, rowClick({ row, column, event }) { // åå»è¡éä¸å½åè¡ this.$refs.table.$refs.table.toggleRowSelection(row); }, modelOpenAfter(row) { // æ°å»º/ç¼è¾å¼¹çªæå¼åå¤ç } }; export default extension; } }; export default extension; ÏîÄ¿´úÂë/WIDESEA_WMSClient/src/views/inbound/takeStockOrder.vue
@@ -40,7 +40,15 @@ }); const searchFormOptions = ref([ [ { title: "æå«çç¹æç", field: "allPalletCode", type: "like" }, { title: "åæ®ç¼å·", field: "orderNo", type: "like" }, { field: "takeStockStatus", title: "çç¹ç¶æ", type: "select", dataKey: "takeStockStatusEnum", data: [] , }, ] ]); ÏîÄ¿´úÂë/WIDESEA_WMSClient/src/views/inbound/takeStockOrderDetail.vue
@@ -50,9 +50,16 @@ { title: "æ¡ç ", field: "barcode", type: "like" }, { title: "ä»åº", field: "warehouseCode", type: "like" }, { title: "ååº", field: "factoryArea", type: "like" }, { title: "ä¾åºåç¼å·", field: "supplyCode", type: "like" }, { field: "takeDetalStatus", title: "çç¹æç»ç¶æ", type: "select", dataKey: "takeStockDetailStatusEnum", data: [] , }, ], [ { title: "ä¾åºåç¼å·", field: "supplyCode", type: "like" }, { title: "å建人", field: "creater", type: "like" }, { title: "å建æ¶é´", field: "createDate", type: "datetime" }, ] @@ -172,6 +179,15 @@ edit: { type: "decimal" } }, { field: "differenceQty", title: "å¾ å¹³è´¦æ°é", type: "decimal", width: 90, align: "left", required: true, edit: { type: "decimal" } }, { field: "unit", title: "åä½", type: "string", ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_BasicService/MESOperation/FeedbackMesService.cs
@@ -98,7 +98,7 @@ if (returnDTO.Details.Count <= 0) { return webResponse = WebResponseContent.Instance.Error($"è¯¥åæ®æ æç»å¯åä¼ "); 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,7 +129,7 @@ if (returnDTO.Details.Count <= 0) { return webResponse = WebResponseContent.Instance.Error($"è¯¥åæ®æ æç»å¯åä¼ "); return webResponse = WebResponseContent.Instance.OK($"è¯¥åæ®æ²¡æéè¦åä¼ æç»ï¼å¤±è´¥æ°æ®åä¼ {returnRecords.Count()}æ¡ï¼åä¼ æå{returnRecords.Count(x => x.ReturnStatus == 1)}æ¡ï¼åä¼ å¤±è´¥{returnRecords.Count(x => x.ReturnStatus == 2)}æ¡"); } string apiUrl = AppSettings.GetValue("AllocationFeedbackUrl"); ; ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_Common/OrderEnum/TakeStockStatusEnum.cs
@@ -33,8 +33,8 @@ /// <summary> /// çç¹å ³é /// </summary> [Description("çç¹å ³é")] çç¹å ³é = 3, //[Description("çç¹å ³é")] //çç¹å ³é = 3, } /// <summary> /// çç¹æç»ç¶æ @@ -42,27 +42,27 @@ public enum TakeStockDetailStatusEnum { /// <summary> /// æªçç¹ /// æªè¿è¡å¹³è´¦å¤ç /// </summary> [Description("æªçç¹")] æªçç¹ = 0, [Description("æªè¿è¡å¹³è´¦å¤ç")] æªè¿è¡å¹³è´¦å¤ç = 0, /// <summary> /// çç¹ä¸ /// å·²è¿è¡å¹³è´¦å¤ç /// </summary> [Description("çç¹åºåºä¸")] çç¹åºåºä¸ = 1, [Description("人工平账å¤ç")] å·²è¿è¡å¹³è´¦å¤ç = 1, /// <summary> /// çç¹åºåºå®æ /// ææ¶æå平账å¤ç /// </summary> [Description("çç¹åºåºå®æ")] çç¹åºåºå®æ = 2, [Description("ææ¶æå平账å¤ç")] ææ¶æå平账å¤ç = 2, /// <summary> /// çç¹å®æ /// ææ¶æå平账å¤çä¸ /// </summary> [Description("çç¹å®æ")] çç¹å®æ = 3 [Description("ææ¶æå平账å¤çä¸")] ææ¶æå平账å¤çä¸ = 3 } } ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_IInboundService/ITakeStockOrderService.cs
@@ -19,6 +19,13 @@ WebResponseContent CompleteStockTake([FromBody] CompleteStockTakeDTO completeStockTakeDTO); WebResponseContent ReturnBox(string orderNo, string boxNo); WebResponseContent ReturnBox(string orderNo, string boxNo, string sourceAddress); WebResponseContent ManualReconciliation(int id); WebResponseContent SelectOrder(string remark, int id); WebResponseContent DocumentReconciliation(int orderId, int id); } } ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_IOutboundService/IOutboundPickingService.cs
@@ -58,5 +58,7 @@ /// <param name="barcode"></param> /// <returns></returns> public WebResponseContent GetPurchaseOrderByBarcode(string barcode); public WebResponseContent NoStockOutBatchInOrderFeedbackToMes(int id, List<string> barCodeList); } } ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_InboundService/InboundOrderService.cs
@@ -106,9 +106,10 @@ foreach (var item in model.Details) { Dt_MaterielInfo materielInfo = materielInfos.First(x => x.MaterielCode == item.MaterielCode); //var purchaseToStockResult = await _materialUnitService.ConvertPurchaseToStockAsync(item.MaterielCode, item.BarcodeQty); UnitConvertResultDTO totalResult = _basicService.UnitQuantityConvert(item.MaterielCode, item.Unit, item.BarcodeUnit, item.OrderQuantity); UnitConvertResultDTO totalResult = _basicService.UnitQuantityConvert(item.MaterielCode, item.Unit, materielInfo.inventoryUOM, item.OrderQuantity); item.Unit = totalResult.ToUnit; item.OrderQuantity = totalResult.ToQuantity; if (materielInfos.Any()) ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_InboundService/InboundService.cs
@@ -10,6 +10,7 @@ using System.Collections.Generic; using System.Data; using System.Linq; using System.Net; using System.Text; using System.Threading.Tasks; using WIDESEA_Common.AllocateEnum; @@ -23,6 +24,7 @@ using WIDESEA_Core.Utilities; using WIDESEA_DTO.Allocate; using WIDESEA_DTO.Inbound; using WIDESEA_DTO.Mes; using WIDESEA_DTO.ReturnMES; using WIDESEA_IBasicService; using WIDESEA_IInboundService; @@ -439,7 +441,7 @@ if (allocatefeedmodel.Details.Count <= 0) { throw new Exception("æªæ¾å°éè¦åä¼ çæ°æ®"); return WebResponseContent.Instance.OK($"è¯¥åæ®æ²¡æéè¦åä¼ æç»ï¼å¤±è´¥æ°æ®åä¼ {returnRecords.Count()}æ¡ï¼åä¼ æå{returnRecords.Count(x => x.ReturnStatus == 1)}æ¡ï¼åä¼ å¤±è´¥{returnRecords.Count(x => x.ReturnStatus == 2)}æ¡"); } var response = responseModel(inboundOrder, 3, null, allocatefeedmodel); @@ -473,7 +475,7 @@ if (feedmodel.details.Count<=0) { throw new Exception("æªæ¾å°éè¦åä¼ çæ°æ®"); return WebResponseContent.Instance.OK($"è¯¥åæ®æ²¡æéè¦åä¼ æç»ï¼å¤±è´¥æ°æ®åä¼ {returnRecords.Count()}æ¡ï¼åä¼ æå{returnRecords.Count(x => x.ReturnStatus == 1)}æ¡ï¼åä¼ å¤±è´¥{returnRecords.Count(x => x.ReturnStatus == 2)}æ¡"); } var response = responseModel(inboundOrder, 3, feedmodel); ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_InboundService/TakeStockOrderService.cs
@@ -22,6 +22,11 @@ using WIDESEA_Common.CommonEnum; using WIDESEA_Common.TaskEnum; using WIDESEA_IBasicService; using static HslCommunication.Profinet.Knx.KnxCode; using System.Collections; using WIDESEA_Common.AllocateEnum; using WIDESEA_Model.Models.Basic; using WIDESEA_IOutboundService; namespace WIDESEA_InboundService { @@ -34,7 +39,12 @@ private readonly IRepository<Dt_TakeStockOrderDetail> _takeStockOrderDetail; private readonly IRepository<Dt_Task> _taskRepository; private readonly ILocationInfoService _locationInfoService; 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) : base(BaseDal) private readonly IRepository<Dt_InboundOrder> _inboundOrderRepository; private readonly IRepository<Dt_OutboundOrder> _outboundOrderRepository; private readonly IRepository<Dt_InboundOrderDetail> _inboundOrderDetailRepository; private readonly IRepository<Dt_OutboundOrderDetail> _outboundOrderDetailRepository; private readonly IOutboundPickingService _outboundPickingService; 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) : base(BaseDal) { _unitOfWorkManage = unitOfWorkManage; _takeStockOrder = takeStockOrder; @@ -42,6 +52,11 @@ _takeStockOrderDetail = takeStockOrderDetail; _taskRepository = taskRepository; _locationInfoService = locationInfoService; _inboundOrderRepository = inboundOrderRepository; _outboundOrderRepository = outboundOrderRepository; _inboundOrderDetailRepository = inboundOrderDetailRepository; _outboundOrderDetailRepository = outboundOrderDetailRepository; _outboundPickingService = outboundPickingService; } public WebResponseContent ValidateBoxNo(string orderNo, string boxNo) @@ -52,7 +67,7 @@ if (stockInfo == null) { return WebResponseContent.Instance.Error("æªæ¾å°è¯¥æçåºå"); } if(stockInfo.StockStatus != StockStatusEmun.çç¹åºåºå®æ.ObjToInt()) if(stockInfo.StockStatus != StockStatusEmun.çç¹åºåºå®æ.ObjToInt() && stockInfo.StockStatus != StockStatusEmun.çç¹åºå宿.ObjToInt()) { return WebResponseContent.Instance.Error("该æçå¤äºéçç¹ç¶æï¼è¯·æ£æ¥çç¹ä»»å¡"); } @@ -76,15 +91,7 @@ bool isMatch = remarkValues.Any(val => val.Equals(boxNo, StringComparison.OrdinalIgnoreCase)); if (!isMatch) { return WebResponseContent.Instance.Error($"ç®±å·ã{boxNo}ãæªå¨çç¹åç®±å·ã{takeStockOrder.Remark}ã䏿¾å°å¹é 项"); } } else { bool isMatch = takeStockOrder.Remark.Trim().Equals(boxNo, StringComparison.OrdinalIgnoreCase); if (!isMatch) { return WebResponseContent.Instance.Error($"ç®±å·ã{boxNo}ãä¸çç¹åç®±å·ã{takeStockOrder.Remark}ãä¸å¹é "); return WebResponseContent.Instance.Error($"ç®±å·ã{boxNo}ãæªå¨çç¹åç®±å·ã{takeStockOrder.AllPalletCode}ã䏿¾å°å¹é 项"); } } @@ -132,6 +139,10 @@ { try { if(completeStockTakeDTO.actualQuantity == completeStockTakeDTO.stockQuantity) { return WebResponseContent.Instance.OK("该æ¡ç ä¸ºå¹³è´¦ï¼æ éè®°å½å·®å¼"); } Dt_TakeStockOrder takeStockOrder = _takeStockOrder.QueryFirst(x=>x.OrderNo == completeStockTakeDTO.orderNo); if (takeStockOrder == null) { @@ -147,38 +158,58 @@ { return WebResponseContent.Instance.Error("æ¡ç åºåæ°æ®æªæ¾å°å¹é æ°æ®"); } List<Dt_AllocateMaterialInfo> allocateMaterialInfos = new List<Dt_AllocateMaterialInfo>(); Dt_TakeStockOrderDetail takeStockOrderDetail = new Dt_TakeStockOrderDetail() { TakeStockId = takeStockOrder.Id, MaterielCode = stockInfoDetail.MaterielCode, MaterielName = stockInfoDetail.MaterielName??"", MaterielName = stockInfoDetail.MaterielName ?? "", BatchNo = stockInfoDetail.BatchNo, TakePalletCode = completeStockTakeDTO.boxNo, TakeDetalStatus = TakeStockDetailStatusEnum.çç¹å®æ.ObjToInt(), TakeDetalStatus = TakeStockDetailStatusEnum.æªè¿è¡å¹³è´¦å¤ç.ObjToInt(), Unit = stockInfoDetail.Unit, SysQty = completeStockTakeDTO.stockQuantity, Qty =completeStockTakeDTO.actualQuantity, Remark = completeStockTakeDTO.stockQuantity-completeStockTakeDTO.actualQuantity>=0 ?"çäº":"çç", Qty = completeStockTakeDTO.actualQuantity, Remark = completeStockTakeDTO.stockQuantity - completeStockTakeDTO.actualQuantity >= 0 ? "çäº" : "çç", barcode = completeStockTakeDTO.barcode, WarehouseCode = stockInfoDetail.WarehouseCode??"", WarehouseCode = stockInfoDetail.WarehouseCode ?? "", FactoryArea = stockInfoDetail.FactoryArea, SupplyCode = stockInfoDetail.SupplyCode??"", SupplyCode = stockInfoDetail.SupplyCode ?? "", TakeStockNo = takeStockOrder.OrderNo, DifferenceQty = completeStockTakeDTO.stockQuantity - completeStockTakeDTO.actualQuantity }; 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 = takeStockOrder.Id, OrderNo = takeStockOrder.OrderNo, Quantity = item.StockQuantity, SupplyCode = item.SupplyCode, Unit = item.Unit }; } stockInfo.StockStatus = StockStatusEmun.çç¹åºå宿.ObjToInt(); _unitOfWorkManage.BeginTran(); _takeStockOrderDetail.AddData(takeStockOrderDetail); _stockInfoRepository.UpdateData(stockInfo); _unitOfWorkManage.CommitTran(); return WebResponseContent.Instance.OK(); } catch (Exception ex) return WebResponseContent.Instance.OK("çç¹å®æï¼è¯·å走该å¼å¸¸æç®±è¿è¡å¹³è´¦å¤çï¼"); } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); return WebResponseContent.Instance.Error(ex.Message); } } public WebResponseContent ReturnBox(string orderNo, string boxNo) public WebResponseContent ReturnBox(string orderNo, string boxNo, string sourceAddress) { WebResponseContent content = new WebResponseContent(); try @@ -202,13 +233,33 @@ { return content.Error($"æç{boxNo}åå¨ä»»å¡ååºå¤±è´¥!"); } if(stock.StockStatus != StockStatusEmun.çç¹åºåºå®æ.ObjToInt()) if(stock.StockStatus != StockStatusEmun.çç¹åºåºå®æ.ObjToInt() && stock.StockStatus != StockStatusEmun.çç¹åºå宿.ObjToInt()) { return content.Error("该æçç¶æä¸å¯¹,ä¸å 许çç¹å ¥åº"); } stock.StockStatus = StockStatusEmun.å ¥åºç¡®è®¤.ObjToInt(); takeStockOrder.TakeStockStatus = TakeStockStatusEnum.çç¹å®æ.ObjToInt(); var palletCodes = new HashSet<string>(StringComparer.OrdinalIgnoreCase); if (!string.IsNullOrEmpty(takeStockOrder.AllPalletCode)) { palletCodes = takeStockOrder.AllPalletCode .Split(new[] { ',', ';' }, StringSplitOptions.RemoveEmptyEntries) .Select(p => p.Trim()) .ToHashSet(StringComparer.OrdinalIgnoreCase); } Dt_TakeStockOrderDetail isReturn = _takeStockOrderDetail.QueryFirst(x => x.TakePalletCode == boxNo && (x.TakeDetalStatus == TakeStockDetailStatusEnum.æªè¿è¡å¹³è´¦å¤ç.ObjToInt() || x.TakeDetalStatus == TakeStockDetailStatusEnum.ææ¶æå平账å¤çä¸.ObjToInt())); if(isReturn != null) { return WebResponseContent.Instance.Error("该æçè¿ææ¡ç å¾ å¹³è´¦ï¼è¯·å å¤çåååº"); } bool hasRelatedTasks = _taskRepository.QueryData(x => palletCodes.Contains(x.PalletCode)).Any(); bool hasRelatedDetails = _takeStockOrderDetail.QueryData(x => palletCodes.Contains(x.TakePalletCode)).Any(); if (!hasRelatedTasks && !hasRelatedDetails) { takeStockOrder.TakeStockStatus = (int)TakeStockStatusEnum.çç¹å®æ; } // åé æ°è´§ä½ var newLocation = _locationInfoService.AssignLocation(stock.LocationType); @@ -220,7 +271,7 @@ NextAddress = "", OrderNo = takeStockOrder.OrderNo, Roadway = newLocation.RoadwayNo, SourceAddress = takeStockOrder.Remark, SourceAddress = sourceAddress, TargetAddress = newLocation.LocationCode, TaskStatus = (int)TaskStatusEnum.New, TaskType = TaskTypeEnum.InInventory.ObjToInt(), @@ -247,6 +298,208 @@ return content.Error(ex.Message); } } public WebResponseContent ManualReconciliation(int id) { try { Dt_TakeStockOrderDetail takeStockOrderDetail = _takeStockOrderDetail.QueryFirst(x=>x.Id == id); if(takeStockOrderDetail == null) { return WebResponseContent.Instance.Error("æªæ¾å°è¯¥çç¹å·®å¼è®°å½"); } else { if(takeStockOrderDetail.TakeDetalStatus != TakeStockDetailStatusEnum.æªè¿è¡å¹³è´¦å¤ç.ObjToInt()) { return WebResponseContent.Instance.Error("该记å½å·²ç»è¿è¡äºå¹³è´¦æä½"); } takeStockOrderDetail.DifferenceQty = 0; takeStockOrderDetail.TakeDetalStatus = TakeStockDetailStatusEnum.å·²è¿è¡å¹³è´¦å¤ç.ObjToInt(); } _takeStockOrderDetail.UpdateData(takeStockOrderDetail); return WebResponseContent.Instance.OK(); } catch(Exception ex) { return WebResponseContent.Instance.Error(ex.Message); } } public WebResponseContent SelectOrder(string remark, int id) { try { Dt_TakeStockOrderDetail takeStockOrderDetail = _takeStockOrderDetail.QueryFirst(x => x.Id == id); if (takeStockOrderDetail == null) { return WebResponseContent.Instance.Error("æªæ¾å°è¯¥çç¹å·®å¼è®°å½"); } else { //æ¥ææ¶å if (takeStockOrderDetail.Remark == "çç") { List<Dt_InboundOrderDetail> inboundOrderDetails = new List<Dt_InboundOrderDetail>(); List<Dt_InboundOrder> inboundOrders = _inboundOrderRepository.Db.Queryable<Dt_InboundOrder>().Where(x => x.BusinessType == "12" && x.OrderStatus != InOrderStatusEnum.å ¥åºå®æ.ObjToInt()).Includes(x => x.Details).ToList(); foreach (var inboundOrder in inboundOrders) { var matchedDetails = inboundOrder.Details .Where(detail => !string.IsNullOrEmpty(detail.MaterielCode) && detail.MaterielCode == takeStockOrderDetail.MaterielCode && detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt()) .WhereIF(!string.IsNullOrEmpty(takeStockOrderDetail.FactoryArea), detail => !string.IsNullOrEmpty(inboundOrder.FactoryArea) && inboundOrder.FactoryArea == takeStockOrderDetail.FactoryArea) .WhereIF(!string.IsNullOrEmpty(takeStockOrderDetail.WarehouseCode), detail => !string.IsNullOrEmpty(detail.WarehouseCode) && detail.WarehouseCode == takeStockOrderDetail.WarehouseCode) .ToList(); // å°å¹é çæç»æ·»å å°æ»å表 if (matchedDetails.Any()) { inboundOrderDetails.AddRange(matchedDetails); } } return WebResponseContent.Instance.OK("æå",data: inboundOrderDetails); } else { List<Dt_OutboundOrderDetail> outboundOrderDetails = new List<Dt_OutboundOrderDetail>(); List<Dt_OutboundOrder> outboundOrders = _outboundOrderRepository.Db.Queryable<Dt_OutboundOrder>().Where(x => x.BusinessType == "23" && x.OrderStatus != OutOrderStatusEnum.åºåºå®æ.ObjToInt()).Includes(x => x.Details).ToList(); foreach (var outboundOrder in outboundOrders) { var matchedDetails = outboundOrder.Details .Where(detail => !string.IsNullOrWhiteSpace(detail.MaterielCode) && detail.MaterielCode == takeStockOrderDetail.MaterielCode) .WhereIF(!string.IsNullOrWhiteSpace(takeStockOrderDetail.FactoryArea), detail => !string.IsNullOrWhiteSpace(outboundOrder.FactoryArea) && outboundOrder.FactoryArea == takeStockOrderDetail.FactoryArea) .WhereIF(!string.IsNullOrWhiteSpace(takeStockOrderDetail.WarehouseCode), detail => !string.IsNullOrWhiteSpace(detail.WarehouseCode) && detail.WarehouseCode == takeStockOrderDetail.WarehouseCode) .Where(detail => string.IsNullOrWhiteSpace(detail.BatchNo)|| detail.BatchNo == takeStockOrderDetail.BatchNo) .Where(detail => string.IsNullOrWhiteSpace(detail.SupplyCode) || detail.SupplyCode == takeStockOrderDetail.SupplyCode) .ToList(); if (matchedDetails.Any()) { outboundOrderDetails.AddRange(matchedDetails); } } return WebResponseContent.Instance.OK("æå", data: outboundOrderDetails); } } } catch (Exception ex) { return WebResponseContent.Instance.Error(ex.Message); } } public WebResponseContent DocumentReconciliation(int orderId, int id) { try { Dt_TakeStockOrderDetail takeStockOrderDetail = _takeStockOrderDetail.QueryFirst(x => x.Id == id); if(takeStockOrderDetail== null) { return WebResponseContent.Instance.Error("æªæ¾å°è¯¥çç¹å·®å¼æ°æ®"); } if(takeStockOrderDetail.Remark == "çç") { Dt_InboundOrderDetail inboundOrderDetail = _inboundOrderDetailRepository.QueryFirst(x => x.OrderId == orderId); if(inboundOrderDetail == null) { return WebResponseContent.Instance.Error("æªæ¾å°éæ©çææ¶å¹³è´¦åæ®"); } Dt_InboundOrder inboundOrder = _inboundOrderRepository.Db.Queryable<Dt_InboundOrder>().Where(x=>x.Id == 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) { return WebResponseContent.Instance.Error("è¯¥ææ¶åæ®æç»æ¡ç æ°é大äºå¾ 平账æ°éï¼è¯·å¦éå ¶ä»åæ®å¹³è´¦"); } else if (takeStockOrderDetail.DifferenceQty == 0) { takeStockOrderDetail.TakeDetalStatus = TakeStockDetailStatusEnum.ææ¶æå平账å¤ç.ObjToInt(); } else { takeStockOrderDetail.TakeDetalStatus = TakeStockDetailStatusEnum.ææ¶æå平账å¤çä¸.ObjToInt(); } _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(orderId, barcodes); } else { } return WebResponseContent.Instance.OK(); } catch(Exception ex) { _unitOfWorkManage.RollbackTran(); return WebResponseContent.Instance.Error(ex.Message); } } } } ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_InboundService/WIDESEA_InboundService.csproj
@@ -9,6 +9,7 @@ <ItemGroup> <ProjectReference Include="..\WIDESEA_IBasicService\WIDESEA_IBasicService.csproj" /> <ProjectReference Include="..\WIDESEA_IInboundService\WIDESEA_IInboundService.csproj" /> <ProjectReference Include="..\WIDESEA_IOutboundService\WIDESEA_IOutboundService.csproj" /> <ProjectReference Include="..\WIDESEA_IRecordService\WIDESEA_IRecordService.csproj" /> <ProjectReference Include="..\WIDESEA_IStockService\WIDESEA_IStockService.csproj" /> <ProjectReference Include="..\WIDESEA_ITaskInfoService\WIDESEA_ITaskInfoService.csproj" /> ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_Model/Models/Inbound/Dt_TakeStockOrderDetail.cs
@@ -140,5 +140,12 @@ [SugarColumn(IsNullable = true, Length = 50, ColumnDescription = "çç¹ååæ®")] [ExporterHeader(DisplayName = "çç¹ååæ®")] public string TakeStockNo { get; set; } /// <summary> /// 差弿°é /// </summary> [SugarColumn(IsNullable = true, ColumnDescription = "差弿°é")] [ExporterHeader(DisplayName = "差弿°é")] public decimal DifferenceQty { get; set; } } } ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Inbound/TakeStockOrderController.cs
@@ -49,9 +49,36 @@ /// çç¹æç®±ååº /// </summary> [HttpPost, HttpGet, Route("ReturnBox"), AllowAnonymous] public WebResponseContent ReturnBox(string orderNo, string boxNo) public WebResponseContent ReturnBox(string orderNo, string boxNo, string sourceAddress) { return Service.ReturnBox(orderNo, boxNo); return Service.ReturnBox(orderNo, boxNo,sourceAddress); } /// <summary> /// 人工平账å¤ç /// </summary> [HttpPost, HttpGet, Route("ManualReconciliation"), AllowAnonymous] public WebResponseContent ManualReconciliation(int id) { return Service.ManualReconciliation(id); } /// <summary> /// ææ¶æååæ®æ¥è¯¢ /// </summary> [HttpPost, HttpGet, Route("SelectOrder"), AllowAnonymous] public WebResponseContent SelectOrder(string remark,int id) { return Service.SelectOrder(remark,id); } /// <summary> /// æåææ¶åå¤ç /// </summary> [HttpPost, HttpGet, Route("DocumentReconciliation"), AllowAnonymous] public WebResponseContent DocumentReconciliation(int orderId, int id) { return Service.DocumentReconciliation(orderId, id); } } }