From 80fdde551d15413cc3a546a45a3d618966914afc Mon Sep 17 00:00:00 2001
From: 647556386 <647556386@qq.com>
Date: 星期二, 06 一月 2026 10:17:00 +0800
Subject: [PATCH] 虚拟出入库优化
---
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Outbound/OutboundPickingController.cs | 4
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundPickingService.cs | 801 +++++++++++++++++++++++++++++--------------
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_IOutboundService/IOutboundPickingService.cs | 2
项目代码/WIDESEA_WMSClient/src/extension/outbound/extend/NoStockOut.vue | 262 +++++++++-----
4 files changed, 708 insertions(+), 361 deletions(-)
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/outbound/extend/NoStockOut.vue" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/outbound/extend/NoStockOut.vue"
index 06f589d..ec9dd47 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/outbound/extend/NoStockOut.vue"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/outbound/extend/NoStockOut.vue"
@@ -23,12 +23,9 @@
clearable
style="width: 220px; margin-right: 10px;"
@input="handleOutboundInput"
- @keyup.enter="(e) => {
- e.stopPropagation(); // 闃绘浜嬩欢鍐掓场
- e.preventDefault(); // 闃绘榛樿琛屼负
- focusBarcodeInputDirectly();
- }"
+ @keyup.enter="validateOutboundOrder"
ref="outboundInputRef"
+ :disabled="loading"
></el-input>
</el-form-item>
<el-form-item label="閲囪喘鍗曟嵁:" name="purchaseOrderNo">
@@ -81,7 +78,7 @@
</el-form-item>
</el-form>
- <!-- 涓嬫柟鏄剧ず妗� -->
+ <!-- 涓嬫柟鏄剧ず妗嗭紙鐩存帴娓叉煋鍚庣杩斿洖鐨勬暟缁勶級 -->
<div class="scan-list">
<el-card shadow="hover" style="margin-bottom: 10px; border: none;" class="custom-card">
<div class="card-header">
@@ -90,8 +87,37 @@
<div class="card-body">
<el-scrollbar height="400px" class="custom-scrollbar">
<transition-group name="barcode-item-transition">
- <div class="barcode-item" v-for="(item, index) in scannedBarcodes" :key="item.barcode" :data-index="index">
- <span class="barcode-text">{{ index + 1 }}. {{ item.barcode }}</span>
+ <div class="barcode-item" v-for="(item, index) in scannedBarcodes" :key="`${item.barcode}-${index}`" :data-index="index">
+ <div class="barcode-detail">
+ <div class="detail-row">
+ <span class="label">鏉$爜锛�</span>
+ <span class="value">{{ item.barcode || '-' }}</span>
+ </div>
+ <div class="detail-row">
+ <span class="label">鐗╂枡缂栫爜锛�</span>
+ <span class="value">{{ item.materielCode || '-' }}</span>
+ </div>
+ <div class="detail-row">
+ <span class="label">鐗╂枡鍚嶇О锛�</span>
+ <span class="value">{{ item.materielName || '-' }}</span>
+ </div>
+ <div class="detail-row">
+ <span class="label">鎵规鍙凤細</span>
+ <span class="value">{{ item.batchNo || '-' }}</span>
+ </div>
+ <div class="detail-row">
+ <span class="label">鏉$爜鏁伴噺锛�</span>
+ <span class="value">{{ item.orderQuantity || item.quantity || 0 }}</span>
+ </div>
+ <div class="detail-row">
+ <span class="label">渚涘簲鍟嗙紪鐮侊細</span>
+ <span class="value">{{ item.supplyCode || '-' }}</span>
+ </div>
+ <div class="detail-row">
+ <span class="label">閲囪喘鍗曞彿锛�</span>
+ <span class="value">{{ item.purchaseOrderNo || '-' }}</span>
+ </div>
+ </div>
<el-button
class="delete-btn"
@click="removeItem(index, item.barcode)"
@@ -116,7 +142,7 @@
type="primary"
size="small"
@click="submit"
- :disabled="scannedBarcodes.length === 0 || !orderForm.outboundOrderNo || !orderForm.purchaseOrderNo || loading"
+ :disabled="scannedBarcodes.length === 0 || !orderForm.outboundOrderNo || loading"
class="submit-btn"
>
<Check /> 鎻愪氦鍑哄簱
@@ -141,7 +167,7 @@
</template>
<script setup>
-import { ref, reactive, onMounted, nextTick, watch } from 'vue';
+import { ref, reactive, onMounted, nextTick } from 'vue';
import { ElMessage } from 'element-plus';
import { Search, Check } from '@element-plus/icons-vue';
@@ -159,8 +185,6 @@
});
const scannedBarcodes = ref([]);
const loading = ref(false);
-// 鏂板锛氬瓨鍌ㄩ娆℃壂鎻忕殑閲囪喘鍗曞彿锛堢敤浜庝竴鑷存�ф牎楠岋級
-const firstPurchaseOrderNo = ref(null);
// 妯℃澘寮曠敤
const formRef = ref(null);
@@ -175,15 +199,7 @@
});
});
-// 鐩戝惉鎵弿鍒楄〃锛岃嫢涓虹┖鍒欓噸缃娆¢噰璐崟鍙�
-watch(scannedBarcodes, (newVal) => {
- if (newVal.length === 0) {
- firstPurchaseOrderNo.value = null;
- orderForm.purchaseOrderNo = ""; // 鍚屾娓呯┖閲囪喘鍗曡緭鍏ユ
- }
-}, { deep: true });
-
-// 绠�鍗曢槻鎶栧嚱鏁帮紙鏃犻渶渚濊禆lodash锛�
+// 绠�鍗曢槻鎶栧嚱鏁�
const debounce = (fn, delay = 100) => {
let timer = null;
return (...args) => {
@@ -201,28 +217,70 @@
formData.barcode = "";
orderForm.outboundOrderNo = "";
orderForm.purchaseOrderNo = "";
- // 閲嶇疆棣栨閲囪喘鍗曞彿
- firstPurchaseOrderNo.value = null;
nextTick(() => {
- outboundInputRef.value?.focus();
+ outboundInputRef.value?.focus(); // 鎵撳紑寮圭獥浠嶈仛鐒﹀嚭搴撳崟杈撳叆妗�
});
};
-// 鍑哄簱鍗曡緭鍏ュ鐞嗭紙鎵爜鎴栨墜鍔ㄨ緭鍏ワ級
+/**
+ * 楠岃瘉鍑哄簱鍗曟嵁鍙风殑鏈夋晥鎬�
+ * 鏍稿績淇敼锛氶獙璇佹垚鍔熷悗鐩存帴鑱氱劍鏉$爜鎵弿妗嗭紝澶辫触鍒欒仛鐒﹀洖鍑哄簱鍗曡緭鍏ユ
+ */
+const validateOutboundOrder = async () => {
+ const outboundOrderNo = orderForm.outboundOrderNo.trim();
+ if (!outboundOrderNo) {
+ return;
+ }
+
+ try {
+ loading.value = true;
+ const res = await http.post(
+ `/api/OutboundPicking/GetAvailablePickingOrders?outOrder=`+ outboundOrderNo,
+ "楠岃瘉鍑哄簱鍗曟嵁鍙蜂腑..."
+ );
+
+ if (res.status !== true) {
+ // 楠岃瘉澶辫触锛氭竻绌鸿緭鍏ユ锛屾彁绀洪敊璇紝鑱氱劍鍥炲嚭搴撳崟杈撳叆妗�
+ orderForm.outboundOrderNo = "";
+ ElMessage.error(res.message || "鍑哄簱鍗曟嵁鍙烽獙璇佸け璐ワ紝璇锋鏌ュ崟鎹彿鏄惁姝g‘");
+ nextTick(() => {
+ outboundInputRef.value?.focus(); // 澶辫触鑱氱劍鍑哄簱鍗曡緭鍏ユ
+ });
+ return;
+ }
+
+ // 楠岃瘉鎴愬姛锛氭彁绀虹敤鎴凤紝鐩存帴鑱氱劍鏉$爜鎵弿妗嗭紙鏍稿績淇敼锛�
+ ElMessage.success("鍑哄簱鍗曟嵁鍙烽獙璇侀�氳繃");
+ nextTick(() => {
+ barcodeInputRef.value?.focus(); // 鎴愬姛鐩存帴璺宠浆鍒版潯鐮佹壂鎻忔
+ });
+ } catch (error) {
+ // 鎺ュ彛寮傚父锛氭竻绌鸿緭鍏ユ锛屾彁绀洪敊璇紝鑱氱劍鍥炲嚭搴撳崟杈撳叆妗�
+ orderForm.outboundOrderNo = "";
+ ElMessage.error(`鍑哄簱鍗曟嵁鍙烽獙璇佸紓甯革細${error.message || "缃戠粶閿欒锛岃閲嶈瘯"}`);
+ nextTick(() => {
+ outboundInputRef.value?.focus(); // 寮傚父鑱氱劍鍑哄簱鍗曡緭鍏ユ
+ });
+ } finally {
+ loading.value = false;
+ }
+};
+
+// 鍑哄簱鍗曡緭鍏ュ鐞�
const handleOutboundInput = (value) => {
if (value && value.trim()) {
- // 鍑哄簱鍗曞彿鏍煎紡楠岃瘉閫昏緫锛堟寜闇�淇濈暀锛�
+ // 鍙繚鐣欏嚭搴撳崟鍙锋牸寮忛獙璇侀�昏緫
}
};
-// 閲囪喘鍗曡緭鍏ュ鐞嗭紙鎵爜鎴栨墜鍔ㄨ緭鍏ワ級
+// 閲囪喘鍗曡緭鍏ュ鐞�
const handlePurchaseInput = (value) => {
if (value && value.trim()) {
- // 閲囪喘鍗曞彿鏍煎紡楠岃瘉閫昏緫锛堟寜闇�淇濈暀锛�
+ // 鍙繚鐣欓噰璐崟鍙锋牸寮忛獙璇侀�昏緫
}
};
-// 鐩存帴璺宠浆鍒版潯鐮佽緭鍏ユ锛堟棤闇�鍏堝~閲囪喘鍗曪級
+// 鑱氱劍鏉$爜杈撳叆妗嗭紙澶嶇敤鍑芥暟锛�
const focusBarcodeInputDirectly = () => {
if (orderForm.outboundOrderNo.trim()) {
barcodeInputRef.value?.focus();
@@ -232,120 +290,118 @@
};
/**
- * 鏍规嵁鏉$爜鏌ヨ閲囪喘鍗曟帴鍙o紙瀹屽叏瀵归綈绀轰緥璇锋眰鏍煎紡锛�
- * @param {string} barcode 鏉$爜
- * @returns {Promise<string>} 閲囪喘鍗曞彿
+ * 鏍规嵁鏉$爜鏌ヨ閲囪喘鍗曞彿
*/
const getPurchaseOrderByBarcode = async (barcode) => {
- // 瀹屽叏鎸夌収绀轰緥鏍煎紡锛歶rl鎷兼帴鍙傛暟 + 绗簩涓弬鏁颁紶鎻愮ず鏂囨湰
- const res = await http.post(`/api/OutboundPicking/GetPurchaseOrderByBarcode?barCode=${encodeURIComponent(barcode)}`, "鏌ヨ閲囪喘鍗曚腑...");
+ const res = await http.post(`/api/OutboundPicking/GetPurchaseOrderByBarcode?barCode=${encodeURIComponent(barcode)}`, "鏌ヨ閲囪喘鍗曞彿涓�...");
if (res.status !== true) {
- throw new Error(res.message || "鏌ヨ閲囪喘鍗曞け璐�");
+ throw new Error(res.message || "鏌ヨ閲囪喘鍗曞彿澶辫触");
}
- if (!res.data?.purchaseOrderNo) {
- throw new Error("鏈煡璇㈠埌璇ユ潯鐮佸搴旂殑閲囪喘鍗�");
+
+ let purchaseOrderNo = '';
+ if (Array.isArray(res.data) && res.data.length > 0) {
+ purchaseOrderNo = res.data[0].purchaseOrderNo || res.data[0].orderId;
+ } else {
+ purchaseOrderNo = res.data?.purchaseOrderNo || res.data?.orderId;
}
- return res.data.purchaseOrderNo;
+
+ return purchaseOrderNo;
};
// 鎵弿鏉$爜鏍稿績閫昏緫
const handleScan = async () => {
if (!formRef.value) return;
- // 楠岃瘉鏉$爜蹇呭~
await formRef.value.validateField('barcode');
const barcode = formData.barcode.trim();
const outboundOrderNo = orderForm.outboundOrderNo.trim();
- // 妫�鏌ユ潯鐮佹槸鍚﹀凡鎵弿
- if (scannedBarcodes.value.some(item => item.barcode === barcode)) {
- ElMessage.warning(`鏉$爜 ${barcode} 宸叉壂鎻忚繃锛岃鍕块噸澶嶆壂鎻廯);
+ // 鏉$爜鍘婚噸
+ const isDuplicate = scannedBarcodes.value.some(item => item.barcode === barcode);
+ if (isDuplicate) {
+ ElMessage.warning(`鏉$爜銆�${barcode}銆戝凡瀛樺湪锛屾棤闇�閲嶅鎵弿`);
formData.barcode = "";
- nextTick(() => barcodeInputRef.value?.focus());
+ nextTick(() => barcodeInputRef.value?.focus()); // 鍘婚噸鍚庝粛鑱氱劍鏉$爜妗�
return;
}
try {
loading.value = true;
- // 姝ラ1锛氫粎浼犳潯鐮佹煡璇㈤噰璐崟锛堜娇鐢ㄧず渚嬫牸寮忕殑璇锋眰锛�
+ // 姝ラ1锛氭煡璇㈤噰璐崟鍙�
const purchaseOrderNo = await getPurchaseOrderByBarcode(barcode);
-
- // 鏍稿績鏍¢獙锛氶噰璐崟涓�鑷存�ф鏌�
- if (firstPurchaseOrderNo.value) {
- // 闈為娆℃壂鎻忥紝鏍¢獙閲囪喘鍗曞彿鏄惁涓�鑷�
- if (purchaseOrderNo !== firstPurchaseOrderNo.value) {
- throw new Error(`褰撳墠鏉$爜瀵瑰簲鐨勯噰璐崟銆�${purchaseOrderNo}銆戜笌棣栨鎵弿鐨勯噰璐崟銆�${firstPurchaseOrderNo.value}銆戜笉涓�鑷达紝绂佹鎵弿锛乣);
- }
+ if (purchaseOrderNo) {
+ orderForm.purchaseOrderNo = purchaseOrderNo;
+ ElMessage.success(`鎴愬姛鏌ヨ鍒伴噰璐崟锛�${purchaseOrderNo}`);
} else {
- // 棣栨鎵弿锛岃褰曢噰璐崟鍙�
- firstPurchaseOrderNo.value = purchaseOrderNo;
+ ElMessage.info("鏈煡璇㈠埌璇ユ潯鐮佸搴旂殑閲囪喘鍗曞彿锛岀户缁獙璇佹潯鐮佹湁鏁堟��");
}
- // 璧嬪�奸噰璐崟鍒拌緭鍏ユ
- orderForm.purchaseOrderNo = purchaseOrderNo;
- ElMessage.success(`鎴愬姛鏌ヨ鍒伴噰璐崟锛�${purchaseOrderNo}`);
-
- // 姝ラ2锛氳皟鐢ㄥ師鏈夋潯鐮侀獙璇佹帴鍙o紙濡傞渶瀵归綈鏍煎紡鍙悓姝ヤ慨鏀癸紝姝ゅ淇濈暀鍘熸湁鏍煎紡锛�
+ // 姝ラ2锛氶獙璇佹潯鐮佸苟鑾峰彇鐗╂枡淇℃伅
const validateRes = await http.post("/api/OutboundPicking/BarcodeValidate", {
outOder: outboundOrderNo,
- inOder: purchaseOrderNo,
+ inOder: purchaseOrderNo || orderForm.purchaseOrderNo,
barCode: barcode
});
if (validateRes.status === true) {
- scannedBarcodes.value.push({ barcode });
- ElMessage.success("鎵弿鎴愬姛");
+ if (!Array.isArray(validateRes.data) || validateRes.data.length === 0) {
+ ElMessage.warning("璇ユ潯鐮侀獙璇佹垚鍔燂紝浣嗘湭杩斿洖鐗╂枡淇℃伅");
+ } else {
+ const newItems = validateRes.data.map(item => ({
+ barcode: item.barcode || '',
+ materielCode: item.materielCode || '',
+ materielName: item.materielName || '',
+ batchNo: item.batchNo || '',
+ orderQuantity: item.orderQuantity || item.quantity || 0,
+ supplyCode: item.supplyCode || '',
+ purchaseOrderNo: purchaseOrderNo || ''
+ }));
+ scannedBarcodes.value.push(...newItems);
+ ElMessage.success(`鎵弿鎴愬姛锛屾柊澧� ${newItems.length} 鏉$墿鏂欎俊鎭紝绱 ${scannedBarcodes.value.length} 鏉);
+ }
formData.barcode = "";
} else {
ElMessage.error("鎵弿澶辫触锛�" + (validateRes.message || '鏉$爜楠岃瘉澶辫触'));
}
} catch (error) {
- // 鎹曡幏閲囪喘鍗曚笉涓�鑷寸瓑閿欒骞舵彁绀�
ElMessage.error(error.message);
- // 娓呯┖褰撳墠杈撳叆妗嗭紝鑱氱劍鏉$爜杈撳叆妗�
formData.barcode = "";
- nextTick(() => barcodeInputRef.value?.focus());
} finally {
loading.value = false;
- // 寮哄埗鑱氱劍鏉$爜杈撳叆妗嗭紝閬垮厤鐒︾偣璺冲埌寮圭獥澶�
+ // 鎵弿瀹屾垚鍚庡缁堣仛鐒︽潯鐮佽緭鍏ユ锛堟柟渚胯繛缁壂鎻忥級
nextTick(() => {
- if (barcodeInputRef.value) {
- barcodeInputRef.value.focus();
- // 娓呯┖杈撳叆妗嗛�変腑鐘舵�侊紙鎵爜鏋彲鑳芥畫鐣欓�変腑锛�
- if (barcodeInputRef.value.input) {
- barcodeInputRef.value.input.select = () => {};
- }
+ barcodeInputRef.value?.focus();
+ if (barcodeInputRef.value?.input) {
+ barcodeInputRef.value.input.select = () => {};
}
});
}
};
-// 甯﹂槻鎶栧拰浜嬩欢鎷︽埅鐨勬壂鎻忓鐞嗭紙閫傞厤鎵爜鏋級
+// 甯﹂槻鎶栫殑鎵弿澶勭悊
const debouncedHandleScan = debounce(async (e) => {
- // 闃绘浜嬩欢鍐掓场鍜岄粯璁よ涓�
e.stopPropagation();
e.preventDefault();
await handleScan();
}, 100);
-// 绉婚櫎鍗曟潯鎵弿璁板綍
+// 绉婚櫎鍗曟潯璁板綍
const removeItem = async (index, barcode) => {
try {
loading.value = true;
+ const currentItem = scannedBarcodes.value[index];
const res = await http.post("/api/OutboundPicking/DeleteBarcode", {
outOder: orderForm.outboundOrderNo,
- inOder: orderForm.purchaseOrderNo,
+ inOder: currentItem?.purchaseOrderNo || orderForm.purchaseOrderNo,
barCode: barcode
});
if (res.status === true) {
scannedBarcodes.value.splice(index, 1);
ElMessage.success("鍒犻櫎鎴愬姛");
- // 鑻ュ垹闄ゅ悗鏃犳潯鐮侊紝鑷姩閲嶇疆棣栨閲囪喘鍗曞彿鍜岄噰璐崟杈撳叆妗�
if (scannedBarcodes.value.length === 0) {
- firstPurchaseOrderNo.value = null;
orderForm.purchaseOrderNo = "";
}
} else {
@@ -355,6 +411,8 @@
ElMessage.error("鍒犻櫎鏉$爜寮傚父锛�" + error.message);
} finally {
loading.value = false;
+ // 鍒犻櫎鍚庝粛鑱氱劍鏉$爜杈撳叆妗�
+ nextTick(() => barcodeInputRef.value?.focus());
}
};
@@ -362,30 +420,33 @@
const submit = async () => {
if (scannedBarcodes.value.length === 0) {
ElMessage.warning("璇峰厛鎵弿鑷冲皯涓�鏉℃潯鐮�");
+ nextTick(() => barcodeInputRef.value?.focus()); // 鎻愪氦澶辫触鑱氱劍鏉$爜妗�
return;
}
const barcodes = scannedBarcodes.value.map(item => item.barcode);
+ const purchaseOrderNos = [...new Set(scannedBarcodes.value.map(item => item.purchaseOrderNo).filter(Boolean))];
try {
loading.value = true;
const res = await http.post("/api/OutboundPicking/NoStockOutSubmit", {
OutOderSubmit: orderForm.outboundOrderNo,
- InOderSubmit: orderForm.purchaseOrderNo,
+ InOderSubmit: purchaseOrderNos.join(',') || '',
BarCodeSubmit: barcodes
});
if (res.status === true) {
ElMessage.success("鍑哄簱鎻愪氦鎴愬姛");
showDetailBox.value = false;
- // 鎻愪氦鎴愬姛鍚庨噸缃姸鎬�
- firstPurchaseOrderNo.value = null;
scannedBarcodes.value = [];
+ orderForm.purchaseOrderNo = "";
} else {
ElMessage.error("鍑哄簱鎻愪氦澶辫触锛�" + (res.message || '鎻愪氦澶辫触'));
+ nextTick(() => barcodeInputRef.value?.focus()); // 鎻愪氦澶辫触鑱氱劍鏉$爜妗�
}
} catch (error) {
ElMessage.error("鍑哄簱鎻愪氦寮傚父锛�" + error.message);
+ nextTick(() => barcodeInputRef.value?.focus()); // 寮傚父鑱氱劍鏉$爜妗�
} finally {
loading.value = false;
}
@@ -411,7 +472,6 @@
opacity: 0;
transform: translateX(30px);
}
-/* 鍒犻櫎鍔ㄧ敾 */
.barcode-item-transition-move {
transition: transform 1s ease;
}
@@ -463,26 +523,47 @@
.barcode-item {
display: flex;
justify-content: space-between;
- align-items: center;
- padding: 10px 15px;
+ align-items: flex-start;
+ padding: 15px;
border-bottom: 1px solid #f7f7f7;
transition: background-color 0.2s ease;
}
.barcode-item:hover {
background-color: #fafafa;
}
-/* 涓哄鏁拌娣诲姞杞诲井鐨勮儗鏅壊 */
.barcode-item:nth-child(odd) {
background-color: #f9f9f9;
}
-.barcode-text {
+.barcode-detail {
flex: 1;
+ display: grid;
+ grid-template-columns: repeat(4, 1fr);
+ gap: 8px 15px;
font-size: 14px;
- color: #666;
- transition: color 0.2s;
}
-.barcode-item:hover .barcode-text {
- color: #409eff;
+@media (max-width: 1200px) {
+ .barcode-detail {
+ grid-template-columns: repeat(3, 1fr);
+ }
+}
+@media (max-width: 992px) {
+ .barcode-detail {
+ grid-template-columns: repeat(2, 1fr);
+ }
+}
+.detail-row {
+ display: flex;
+ align-items: center;
+}
+.label {
+ color: #999;
+ margin-right: 5px;
+ white-space: nowrap;
+}
+.value {
+ color: #666;
+ flex: 1;
+ word-break: break-all;
}
.delete-btn {
@@ -490,6 +571,8 @@
font-size: 16px;
transition: all 0.2s;
opacity: 0.7;
+ margin-left: 10px;
+ flex-shrink: 0;
}
.barcode-item:hover .delete-btn {
opacity: 1;
@@ -565,7 +648,6 @@
</style>
<style>
-/* 鍏ㄥ眬鏍峰紡閮ㄥ垎淇濇寔涓嶅彉 */
.text-button:hover {
background-color: #f0f9eb !important;
}
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_IOutboundService/IOutboundPickingService.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_IOutboundService/IOutboundPickingService.cs"
index cb38bdc..5a97c5b 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_IOutboundService/IOutboundPickingService.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_IOutboundService/IOutboundPickingService.cs"
@@ -31,7 +31,7 @@
/// </summary>
/// <returns></returns>
WebResponseContent GetAvailablePurchaseOrders();
- WebResponseContent GetAvailablePickingOrders();
+ WebResponseContent GetAvailablePickingOrders(string outOrder);
/// <summary>
/// 鎵爜楠岃瘉
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundPickingService.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundPickingService.cs"
index d244dd5..d796d5b 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundPickingService.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundPickingService.cs"
@@ -1,5 +1,8 @@
锘縰sing MailKit.Search;
using Microsoft.Extensions.Logging;
+using Microsoft.IdentityModel.Tokens;
+using Newtonsoft.Json.Serialization;
+using Newtonsoft.Json;
using SqlSugar;
using WIDESEA_BasicService;
using WIDESEA_Common.CommonEnum;
@@ -15,6 +18,7 @@
using WIDESEA_DTO.Basic;
using WIDESEA_DTO.Inbound;
using WIDESEA_DTO.Outbound;
+using WIDESEA_DTO.ReturnMES;
using WIDESEA_IAllocateService;
using WIDESEA_IBasicService;
using WIDESEA_ICheckService;
@@ -26,6 +30,10 @@
using WIDESEA_Model.Models.Basic;
using WIDESEA_Model.Models.Check;
using WIDESEA_Model.Models.Outbound;
+using Org.BouncyCastle.Asn1.Ocsp;
+using WIDESEA_BasicService.MESOperation;
+using WIDESEA_Core.Util;
+using WIDESEA_DTO.Allocate;
namespace WIDESEA_OutboundService
{
@@ -58,6 +66,10 @@
private readonly ITask_HtyService _task_HtyService;
private readonly ILogger<OutboundPickingService> _logger;
private readonly IRepository<Dt_InterfaceLog> _interfaceLog;
+ private readonly IInboundService _inboundService;
+ private readonly IFeedbackMesService _feedbackMesService;
+ private readonly HttpClientHelper _httpClientHelper;
+ private readonly IRepository<Dt_MesReturnRecord> _mesReturnRecord;
private Dictionary<string, string> stations = new Dictionary<string, string>
{
@@ -76,7 +88,7 @@
public OutboundPickingService(IRepository<Dt_PickingRecord> BaseDal, IUnitOfWorkManage unitOfWorkManage, IStockInfoService stockInfoService, IStockService stockService,
IOutStockLockInfoService outStockLockInfoService, IStockInfoDetailService stockInfoDetailService, ILocationInfoService locationInfoService,
IOutboundOrderDetailService outboundOrderDetailService, ISplitPackageService splitPackageService, IOutboundOrderService outboundOrderService,
- IRepository<Dt_Task> taskRepository, IESSApiService eSSApiService, ILogger<OutboundPickingService> logger, IInvokeMESService invokeMESService, IDailySequenceService dailySequenceService, IAllocateService allocateService, IRepository<Dt_InboundOrder> inboundOrderRepository, IInboundOrderDetailService inboundOrderDetailService, IRepository<Dt_WarehouseArea> warehouseAreaRepository, IReCheckOrderService reCheckOrderService, ITask_HtyService task_HtyService, IRepository<Dt_InterfaceLog> interfaceLog) : base(BaseDal)
+ IRepository<Dt_Task> taskRepository, IESSApiService eSSApiService, ILogger<OutboundPickingService> logger, IInvokeMESService invokeMESService, IDailySequenceService dailySequenceService, IAllocateService allocateService, IRepository<Dt_InboundOrder> inboundOrderRepository, IInboundOrderDetailService inboundOrderDetailService, IRepository<Dt_WarehouseArea> warehouseAreaRepository, IReCheckOrderService reCheckOrderService, ITask_HtyService task_HtyService, IRepository<Dt_InterfaceLog> interfaceLog, IInboundService inboundService, IFeedbackMesService feedbackMesService, HttpClientHelper httpClientHelper, IRepository<Dt_MesReturnRecord> mesReturnRecord) : base(BaseDal)
{
_unitOfWorkManage = unitOfWorkManage;
_stockInfoService = stockInfoService;
@@ -99,6 +111,11 @@
_reCheckOrderService = reCheckOrderService;
_task_HtyService = task_HtyService;
_interfaceLog = interfaceLog;
+ _inboundService = inboundService;
+ _feedbackMesService = feedbackMesService;
+ _httpClientHelper = httpClientHelper;
+ _mesReturnRecord = mesReturnRecord;
+
}
#endregion
@@ -2292,12 +2309,21 @@
return WebResponseContent.Instance.OK("鎴愬姛", data: InOderCodes);
}
- public WebResponseContent GetAvailablePickingOrders()
+ public WebResponseContent GetAvailablePickingOrders(string outOrder)
{
- List<Dt_OutboundOrder> outOders = _outboundOrderService.Db.Queryable<Dt_OutboundOrder>().Where(x => x.OrderStatus != OutOrderStatusEnum.鍑哄簱瀹屾垚.ObjToInt()).ToList();
-
- List<string> outOderCodes = outOders.Select(x => x.UpperOrderNo).ToList();
- return WebResponseContent.Instance.OK("鎴愬姛", data: outOderCodes);
+ Dt_OutboundOrder outboundOrder = Db.Queryable<Dt_OutboundOrder>().Where(x => x.UpperOrderNo == outOrder && x.OrderStatus != OutOrderStatusEnum.鍑哄簱瀹屾垚.ObjToInt()).Includes(x=>x.Details).First();
+ if(outboundOrder == null)
+ {
+ return WebResponseContent.Instance.Error("鏈壘鍒版弧瓒冲嚭搴撴潯浠剁殑鍑哄簱鍗�");
+ }
+ //鍏堟竻绌哄崟鎹櫄鎷熷嚭鍏ュ簱鏁伴噺杩涜璁$畻
+ foreach (var item in outboundOrder.Details)
+ {
+ item.NoStockOutQty = 0;
+ item.documentsNO = "";
+ }
+ _outboundOrderDetailService.UpdateData(outboundOrder.Details);
+ return WebResponseContent.Instance.OK("鎴愬姛");
}
public WebResponseContent BarcodeValidate(NoStockOutModel noStockOut)
@@ -2309,53 +2335,145 @@
{
return WebResponseContent.Instance.Error($"鏈壘鍒伴噰璐崟锛歿noStockOut.inOder}");
}
- var matchedDetail = inboundOrder.Details.FirstOrDefault(detail => detail.Barcode == noStockOut.barCode && detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt());
-
- if (matchedDetail == null)
- {
- return WebResponseContent.Instance.Error($"鍦ㄩ噰璐崟 {noStockOut.inOder} 涓湭鎵惧埌鏉$爜涓� {noStockOut.barCode} 鐨勬槑缁嗐��");
- }
- matchedDetail.NoStockOutQty = 0;
-
Dt_OutboundOrder outboundOrder = Db.Queryable<Dt_OutboundOrder>().Where(x => x.UpperOrderNo == noStockOut.outOder && x.OrderStatus != OutOrderStatusEnum.鍑哄簱瀹屾垚.ObjToInt()).Includes(x => x.Details).First();
if (outboundOrder == null)
{
return WebResponseContent.Instance.Error($"鏈壘鍒板嚭搴撳崟锛歿noStockOut.inOder}");
}
- var matchedCode = outboundOrder.Details.FirstOrDefault(detail => detail.MaterielCode == matchedDetail.MaterielCode && detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt());
- if (matchedCode == null)
- {
- return WebResponseContent.Instance.Error($"鍦ㄥ嚭搴撳崟鐨勭墿鏂欑紪鐮佷腑鏈壘鍒颁笌閲囪喘鍗曚腑鐨剓matchedDetail.MaterielCode} 瀵瑰簲鐨勭墿鏂欍��");
- }
- matchedCode.NoStockOutQty = 0;
+ //瀛樺偍鍏ュ簱鍗曟嵁鏄庣粏淇℃伅
+ var detailLists = new List<Dt_InboundOrderDetail>();
- //鍓╀綑鍏ュ簱鏁伴噺鍗宠櫄鎷熷嚭鍏ュ簱鍓╀綑鍙嚭鏁伴噺
- decimal outQuantity = matchedDetail.OrderQuantity - matchedDetail.ReceiptQuantity;
- if (outQuantity == 0)
- {
- return WebResponseContent.Instance.Error($"璇ラ噰璐崟涓殑鏉$爜瀵瑰簲鐨勫彲鍑烘暟閲忎负0");
- }
- if (matchedCode.OrderQuantity < outQuantity)
- {
- return WebResponseContent.Instance.Error($"璇ラ噰璐崟涓殑鏉$爜瀵瑰簲鐨勫彲鍑烘暟閲忚秴鍑哄嚭搴撳崟鍑哄簱鏁伴噺{matchedDetail.OrderQuantity - matchedCode.OrderQuantity},涓嶆弧瓒虫暣鍖呭嚭搴�");
- }
- //鍗曟嵁鍑哄簱閿佸畾鏁伴噺
- matchedDetail.NoStockOutQty += outQuantity;
- matchedCode.NoStockOutQty += outQuantity;
+ var matchedDetail = inboundOrder.Details.FirstOrDefault(detail =>
+ detail.Barcode == noStockOut.barCode &&
+ detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt());
- if ((matchedCode.LockQuantity + matchedCode.NoStockOutQty) > matchedCode.OrderQuantity)
+ if (matchedDetail == null)
{
- return WebResponseContent.Instance.Error($"鍑哄簱鍗曟槑缁嗘暟閲忔孩鍑簕matchedCode.LockQuantity - matchedCode.OrderQuantity}");
+ matchedDetail = inboundOrder.Details.FirstOrDefault(detail =>
+ detail.OutBoxbarcodes == noStockOut.barCode &&
+ detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt());
+
+ if (matchedDetail == null)
+ {
+ return WebResponseContent.Instance.Error($"鍦ㄩ噰璐崟 {noStockOut.inOder} 涓湭鎵惧埌鏉$爜涓� {noStockOut.barCode} 鐨勬槑缁嗐��");
+ }
+ else
+ {
+
+ // 娣诲姞鎵�鏈夐潪瀹屾垚鐘舵�佺殑鏄庣粏鏉$爜
+ foreach (var detail in inboundOrder.Details)
+ {
+ if (detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt() &&
+ !string.IsNullOrEmpty(detail.Barcode))
+ {
+ detailLists.Add(detail);
+ }
+ }
+ }
}
- matchedDetail.OrderDetailStatus = OrderDetailStatusEnum.Inbounding.ObjToInt();
- matchedCode.OrderDetailStatus = OrderDetailStatusEnum.AssignOver.ObjToInt();
+ else
+ {
+ if (!string.IsNullOrEmpty(noStockOut.barCode))
+ {
+ detailLists.Add(matchedDetail);
+ }
+ }
+
+ var outDetails = new List<Dt_OutboundOrderDetail>();
+
+ foreach (var item in detailLists)
+ {
+ item.NoStockOutQty = 0;
+
+ var matchedCode = outboundOrder.Details.FirstOrDefault(detail => detail.MaterielCode == item.MaterielCode && detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt() && (detail.OrderQuantity-detail.LockQuantity-detail.MoveQty-detail.NoStockOutQty)>0);
+
+ if (matchedCode == null)
+ {
+ return WebResponseContent.Instance.Error($"鍦ㄥ嚭搴撳崟鐨勭墿鏂欑紪鐮佷腑鏈壘鍒颁笌閲囪喘鍗曚腑鐨剓item.MaterielCode} 瀵瑰簲鐨勭墿鏂欍��");
+ }
+ if (!matchedCode.BatchNo.IsNullOrEmpty() && matchedCode.BatchNo != "")
+ {
+ var matcheBatch = outboundOrder.Details.FirstOrDefault(detail => detail.BatchNo == item.BatchNo);
+ if (matcheBatch == null)
+ {
+ return WebResponseContent.Instance.Error($"鍦ㄥ嚭搴撳崟鐨勭墿鏂欑紪鐮佷腑鏈壘鍒颁笌閲囪喘鍗曟壒娆′腑鐨剓item.BatchNo} 瀵瑰簲鐨勭墿鏂欍��");
+ }
+ }
+ if (!matchedCode.SupplyCode.IsNullOrEmpty() && matchedCode.SupplyCode != "")
+ {
+ var matcheBatch = outboundOrder.Details.FirstOrDefault(detail => detail.SupplyCode == item.SupplyCode);
+ if (matcheBatch == null)
+ {
+ return WebResponseContent.Instance.Error($"鍦ㄥ嚭搴撳崟鐨勭墿鏂欑紪鐮佷腑鏈壘鍒颁笌閲囪喘鍗曚緵搴斿晢涓殑{item.SupplyCode} 瀵瑰簲鐨勭墿鏂欍��");
+ }
+ }
+ if (!outboundOrder.FactoryArea.IsNullOrEmpty() && outboundOrder.FactoryArea != "" && !inboundOrder.FactoryArea.IsNullOrEmpty() && inboundOrder.FactoryArea != "")
+ {
+ if (inboundOrder.FactoryArea != outboundOrder.FactoryArea)
+ {
+ return WebResponseContent.Instance.Error($"璇ユ潯鐮亄item.Barcode}瀵瑰簲鐨勫崟鎹巶鍖轰笌鍑哄簱鍗曟嵁涓嶄竴鑷达紒涓嶅厑璁稿嚭搴撱��");
+ }
+ }
+ if (!matchedCode.WarehouseCode.IsNullOrEmpty() && matchedCode.WarehouseCode != "")
+ {
+ var matcheBatch = outboundOrder.Details.FirstOrDefault(detail => detail.WarehouseCode == item.WarehouseCode);
+ if (matcheBatch == null)
+ {
+ return WebResponseContent.Instance.Error($"浠撳簱涓嶄竴鑷达紒鍦ㄥ嚭搴撳崟鐨勭墿鏂欑紪鐮佷腑鏈壘鍒颁笌閲囪喘鍗曚粨搴撲腑鐨剓item.WarehouseCode} 瀵瑰簲鐨勭墿鏂欍��");
+ }
+ }
+
+ //鍓╀綑鍏ュ簱鏁伴噺鍗宠櫄鎷熷嚭鍏ュ簱鍓╀綑鍙嚭鏁伴噺
+ decimal outQuantity = item.OrderQuantity - item.ReceiptQuantity;
+ if (outQuantity == 0)
+ {
+ return WebResponseContent.Instance.Error($"璇ラ噰璐崟涓殑鏉$爜瀵瑰簲鐨勫彲鍑烘暟閲忎负0");
+ }
+ if (matchedCode.OrderQuantity - matchedCode.LockQuantity - matchedCode.MoveQty - matchedCode.NoStockOutQty < outQuantity)
+ {
+ return WebResponseContent.Instance.Error($"璇ラ噰璐崟涓殑鏉$爜瀵瑰簲鐨勫彲鍑烘暟閲忚秴鍑哄嚭搴撳崟鍑哄簱鏁伴噺{item.OrderQuantity - (matchedCode.OrderQuantity - matchedCode.LockQuantity - matchedCode.MoveQty)},涓嶆弧瓒虫暣鍖呭嚭搴�");
+ }
+ //鍗曟嵁鍑哄簱閿佸畾鏁伴噺
+ item.NoStockOutQty += outQuantity;
+ matchedCode.NoStockOutQty += outQuantity;
+
+ //鍥炰紶MES鍙傛暟
+ List<Barcodes> barcodesList = new List<Barcodes>();
+ Barcodes barcodes = new Barcodes
+ {
+ Barcode = item.Barcode,
+ Qty = item.BarcodeQty,
+ SupplyCode = item?.SupplyCode ?? "",
+ BatchNo = item?.BatchNo ?? "",
+ Unit = item?.Unit ?? ""
+ };
+ if (!string.IsNullOrEmpty(matchedCode.documentsNO))
+ {
+ barcodesList = JsonConvert.DeserializeObject<List<Barcodes>>(matchedCode.documentsNO) ?? new List<Barcodes>();
+ }
+ barcodesList.Add(barcodes);
+ JsonSerializerSettings settings = new JsonSerializerSettings
+ {
+ ContractResolver = new CamelCasePropertyNamesContractResolver()
+ };
+ matchedCode.documentsNO = JsonConvert.SerializeObject(barcodesList, settings);
+
+
+ if ((matchedCode.LockQuantity + matchedCode.NoStockOutQty+matchedCode.MoveQty) > matchedCode.OrderQuantity)
+ {
+ return WebResponseContent.Instance.Error($"鍑哄簱鍗曟槑缁嗘暟閲忔孩鍑簕matchedCode.OrderQuantity - matchedCode.LockQuantity-matchedCode.NoStockOutQty-matchedCode.MoveQty}");
+ }
+ item.OrderDetailStatus = OrderDetailStatusEnum.Inbounding.ObjToInt();
+
+ outDetails.Add(matchedCode);
+ }
_unitOfWorkManage.BeginTran();
- _inboundOrderDetailService.UpdateData(matchedDetail);
- _outboundOrderDetailService.UpdateData(matchedCode);
+ _inboundOrderDetailService.UpdateData(detailLists);
+ _outboundOrderDetailService.UpdateData(outDetails);
_unitOfWorkManage.CommitTran();
- return WebResponseContent.Instance.OK();
+ return WebResponseContent.Instance.OK("鎴愬姛",data:detailLists);
}
catch (Exception ex)
{
@@ -2392,13 +2510,42 @@
{
return WebResponseContent.Instance.Error($"鏈壘鍒板嚭搴撳崟锛歿noStockOut.inOder}");
}
- var matchedCode = outboundOrder.Details.FirstOrDefault(detail => detail.MaterielCode == matchedDetail.MaterielCode && detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt());
+
+ // 鎾ら攢鍥炰紶MES鍙傛暟
+ List<Barcodes> barcodesList = new List<Barcodes>();
+ Barcodes barcodes = new Barcodes
+ {
+ Barcode = matchedDetail.Barcode,
+ Qty = matchedDetail.BarcodeQty,
+ SupplyCode = matchedDetail?.SupplyCode ?? "",
+ BatchNo = matchedDetail?.BatchNo ?? "",
+ Unit = matchedDetail?.Unit ?? ""
+ };
+ var matchedCode = outboundOrder.Details.FirstOrDefault(detail =>
+ detail.documentsNO.Contains(barcodes.Barcode) &&
+ detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt()
+ );
if (matchedCode == null)
{
return WebResponseContent.Instance.Error($"鍦ㄥ嚭搴撳崟鐨勭墿鏂欑紪鐮佷腑鏈壘鍒颁笌閲囪喘鍗曚腑鐨剓matchedDetail.MaterielCode} 瀵瑰簲鐨勭墿鏂欍��");
}
- matchedCode.NoStockOutQty = 0;
+
+ if (!string.IsNullOrEmpty(matchedCode.documentsNO))
+ {
+ barcodesList = JsonConvert.DeserializeObject<List<Barcodes>>(matchedCode.documentsNO) ?? new List<Barcodes>();
+ }
+ barcodesList.RemoveAll(b =>
+ string.Equals(b.Barcode, barcodes.Barcode, StringComparison.OrdinalIgnoreCase)
+ );
+
+ JsonSerializerSettings settings = new JsonSerializerSettings
+ {
+ ContractResolver = new CamelCasePropertyNamesContractResolver()
+ };
+ matchedCode.documentsNO = JsonConvert.SerializeObject(barcodesList, settings);
+
+ matchedCode.NoStockOutQty -= matchedDetail.OrderQuantity;
if (matchedCode.LockQuantity == 0 && matchedCode.OverOutQuantity == 0)
{
matchedCode.OrderDetailStatus = OrderDetailStatusEnum.New.ObjToInt();
@@ -2421,256 +2568,154 @@
{
try
{
- Dt_InboundOrder inboundOrder = _inboundOrderRepository.Db.Queryable<Dt_InboundOrder>().Where(x => x.UpperOrderNo == noStockOutSubmit.InOderSubmit && x.OrderStatus != InOrderStatusEnum.鍏ュ簱瀹屾垚.ObjToInt()).Includes(x => x.Details).First();
- if (inboundOrder == null)
- {
- return WebResponseContent.Instance.Error($"鏈壘鍒伴噰璐崟锛歿noStockOutSubmit.InOderSubmit}");
- }
Dt_OutboundOrder outboundOrder = _inboundOrderRepository.Db.Queryable<Dt_OutboundOrder>().Where(x => x.UpperOrderNo == noStockOutSubmit.OutOderSubmit && x.OrderStatus != OutOrderStatusEnum.鍑哄簱瀹屾垚.ObjToInt()).Includes(x => x.Details).First();
if (outboundOrder == null)
{
return WebResponseContent.Instance.Error($"鏈壘鍒板嚭搴撳崟锛歿noStockOutSubmit.OutOderSubmit}");
}
- List<Dt_InboundOrderDetail> inboundOrderDetails = new List<Dt_InboundOrderDetail>();
+
List<Dt_OutboundOrderDetail> outboundOrderDetails = new List<Dt_OutboundOrderDetail>();
- foreach (var BarCode in noStockOutSubmit.BarCodeSubmit)
+
+ Dictionary<int, List<string>> orderIdBarCodeDict = new Dictionary<int, List<string>>();
+
+ List<Dt_InboundOrderDetail> updateInboundDetails = new List<Dt_InboundOrderDetail>();
+
+ Dictionary<int, Dt_InboundOrder> updateInboundOrders = new Dictionary<int, Dt_InboundOrder>();
+
+ _unitOfWorkManage.BeginTran();
+
+ List<Dt_InboundOrderDetail> allInboundDetails = _inboundOrderDetailService.Db
+ .Queryable<Dt_InboundOrderDetail>()
+ .Where(detail => noStockOutSubmit.BarCodeSubmit.Contains(detail.Barcode)
+ && detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt())
+ .ToList();
+
+ var detailGroupByOrderId = allInboundDetails.GroupBy(d => d.OrderId).ToList();
+ foreach (var group in detailGroupByOrderId)
{
- var inboundOrderDetail = inboundOrder.Details.FirstOrDefault(detail => detail.Barcode == BarCode && detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt());
+ int orderId = group.Key;
+ List<Dt_InboundOrderDetail> groupDetails = group.ToList();
+ List<string> groupBarCodes = groupDetails.Select(d => d.Barcode).ToList();
- if (inboundOrderDetail == null)
+
+ orderIdBarCodeDict[orderId] = groupBarCodes;
+
+ foreach (var detail in groupDetails)
{
- return WebResponseContent.Instance.Error($"鍦ㄩ噰璐崟 {noStockOutSubmit.InOderSubmit} 涓湭鎵惧埌鏉$爜涓� {BarCode} 鐨勬槑缁嗐��");
+ detail.ReceiptQuantity = detail.NoStockOutQty;
+ detail.OverInQuantity = detail.NoStockOutQty;
+
+ if (detail.OrderQuantity == detail.OverInQuantity)
+ {
+ detail.OrderDetailStatus = OrderDetailStatusEnum.Over.ObjToInt();
+ }
+ updateInboundDetails.Add(detail);
}
- var outboundOrderDetail = outboundOrder.Details.FirstOrDefault(detail => detail.MaterielCode == inboundOrderDetail.MaterielCode && detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt());
- if (outboundOrderDetail == null)
+ if (!updateInboundOrders.ContainsKey(orderId))
{
- return WebResponseContent.Instance.Error($"鍦ㄥ嚭搴撳崟鐨勭墿鏂欑紪鐮佷腑鏈壘鍒颁笌閲囪喘鍗曚腑鐨剓inboundOrderDetail.MaterielCode} 瀵瑰簲鐨勭墿鏂欍��");
+ Dt_InboundOrder inboundOrder = _inboundOrderRepository.Db
+ .Queryable<Dt_InboundOrder>()
+ .Where(x => x.Id == orderId)
+ .Includes(x => x.Details)
+ .First();
+
+ if (inboundOrder == null)
+ {
+ _unitOfWorkManage.RollbackTran();
+ return WebResponseContent.Instance.Error($"鏈壘鍒板叆搴撳崟ID涓� {orderId} 鐨勫崟鎹�");
+ }
+
+ // 鍒ゆ柇鏁村崟鏄惁鍏ㄩ儴瀹屾垚
+ int totalDetailCount = inboundOrder.Details.Count();
+ int beforeDetailCount = inboundOrder.Details.Where(x => x.OrderId == orderId && x.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt())
+ .Count();
+ int finishedDetailCount = updateInboundDetails
+ .Where(x => x.OrderId == orderId && x.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt())
+ .Count();
+
+ inboundOrder.OrderStatus = totalDetailCount == finishedDetailCount+beforeDetailCount
+ ? InOrderStatusEnum.鍏ュ簱瀹屾垚.ObjToInt()
+ : InOrderStatusEnum.鍏ュ簱涓�.ObjToInt();
+
+ updateInboundOrders[orderId] = inboundOrder;
}
- inboundOrderDetail.ReceiptQuantity += inboundOrderDetail.NoStockOutQty;
- inboundOrderDetail.OverInQuantity = inboundOrderDetail.ReceiptQuantity;
- inboundOrderDetail.OrderDetailStatus = OrderDetailStatusEnum.Over.ObjToInt();
- inboundOrderDetails.Add(inboundOrderDetail);
+ }
- outboundOrderDetail.LockQuantity += outboundOrderDetail.NoStockOutQty;
- outboundOrderDetail.OverOutQuantity = outboundOrderDetail.LockQuantity;
- if (outboundOrderDetail.OrderQuantity == outboundOrderDetail.OverOutQuantity)
- {
- outboundOrderDetail.OrderDetailStatus = OrderDetailStatusEnum.Over.ObjToInt();
+ // 6. 鎵归噺鏇存柊鏄庣粏鍜屼富鍗曪紙鎵归噺鎿嶄綔鎻愬崌鎬ц兘锛�
+ if (updateInboundDetails.Any())
+ {
+ foreach (var detail in updateInboundDetails)
+ {
+ _inboundOrderDetailService.UpdateData(detail);
}
- outboundOrderDetails.Add(outboundOrderDetail);
- var newLockInfo = new Dt_OutStockLockInfo
+ }
+ if (updateInboundOrders.Any())
+ {
+ foreach (var order in updateInboundOrders.Values)
{
- OrderNo = outboundOrder.UpperOrderNo,
- OrderDetailId = outboundOrderDetail.Id,
- OutboundBatchNo = outboundOrderDetail.BatchNo,
- MaterielCode = outboundOrderDetail.MaterielCode,
- MaterielName = outboundOrderDetail.MaterielName,
- StockId = 0,
- OrderQuantity = outboundOrderDetail.OrderQuantity,
- AssignQuantity = outboundOrderDetail.OverOutQuantity,
- PickedQty = outboundOrderDetail.NoStockOutQty,
- LocationCode = "绌�",
- PalletCode = "绌�",
- TaskNum = 0,
- Status = (int)OutLockStockStatusEnum.鎷i�夊畬鎴�,
- Unit = outboundOrderDetail.Unit,
- SupplyCode = outboundOrderDetail.SupplyCode ?? "鏃�",
- OrderType = outboundOrder.OrderType,
- CurrentBarcode = inboundOrderDetail.Barcode,
- IsSplitted = 1,
- Operator = App.User.UserName,
- lineNo = outboundOrderDetail.lineNo,
- WarehouseCode = outboundOrderDetail.WarehouseCode ?? "鏃�",
- BarcodeQty = outboundOrderDetail.BarcodeQty,
- BarcodeUnit = outboundOrderDetail.BarcodeUnit,
- BatchNo = outboundOrderDetail.BatchNo
+ _inboundOrderRepository.UpdateData(order);
+ }
+ }
+
+ // 7. 寰幆鍒嗙粍缁撴灉锛岃皟鐢∕ES鍥炰紶鏂规硶锛堟寜鍏ュ簱鍗曞垎缁勫洖浼狅級
+ foreach (var kvp in orderIdBarCodeDict)
+ {
+ int orderId = kvp.Key;
+ List<string> barCodeList = kvp.Value;
+ //鍏ュ簱鍥炰紶MES
+ NoStockOutBatchInOrderFeedbackToMes(orderId, barCodeList);
+
+ }
+
+ //鍙鍑哄簱鏉$爜鐨勫嚭搴撳崟鏄庣粏杩涜璁$畻鍥炰紶
+ List<Dt_OutboundOrderDetail> outboundOrderDetail = outboundOrder.Details
+ .Where(x => !string.IsNullOrWhiteSpace(x.documentsNO)
+ && noStockOutSubmit.BarCodeSubmit.Any(barcode =>
+ x.documentsNO.IndexOf(barcode, StringComparison.OrdinalIgnoreCase) >= 0))
+ .ToList();
+
+ foreach (var item in outboundOrderDetail)
+ {
+ item.LockQuantity = item.NoStockOutQty;
+ item.OverOutQuantity = item.NoStockOutQty;
+ //娣诲姞鍥炰紶MES鍙傛暟
+ List<Barcodes> barcodesList = new List<Barcodes>();
+ List<Barcodes> documentsNOList = new List<Barcodes>();
+ if (!string.IsNullOrEmpty(item.ReturnJsonData))
+ {
+ barcodesList = JsonConvert.DeserializeObject<List<Barcodes>>(item.documentsNO) ?? new List<Barcodes>();
+ }
+ if (!string.IsNullOrEmpty(item.documentsNO) && item.documentsNO!="")
+ {
+ documentsNOList = JsonConvert.DeserializeObject<List<Barcodes>>(item.documentsNO) ?? new List<Barcodes>();
+ }
+ foreach (var documentsNO in documentsNOList)
+ {
+ barcodesList.Add(documentsNO);
+ }
+ JsonSerializerSettings settings = new JsonSerializerSettings
+ {
+ ContractResolver = new CamelCasePropertyNamesContractResolver()
};
- _outStockLockInfoService.AddData(newLockInfo);
+ item.ReturnJsonData = JsonConvert.SerializeObject(barcodesList, settings);
+
+ outboundOrderDetails.Add(item);
}
- //鍒ゆ柇鍏ュ簱鍗曟嵁鏄庣粏鏄惁鍏ㄩ儴鏄畬鎴愮姸鎬�
- int e = inboundOrder.Details.Count();
- int w = inboundOrder.Details.Where(x => x.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()).Count();
- bool inoderOver = inboundOrder.Details.Count() == inboundOrder.Details.Where(x => x.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()).Count();
- if (inoderOver)
- {
- inboundOrder.OrderStatus = InOrderStatusEnum.鍏ュ簱瀹屾垚.ObjToInt();
- }
- else
- {
- inboundOrder.OrderStatus = InOrderStatusEnum.鍏ュ簱涓�.ObjToInt();
- }
- //鍒ゆ柇鍑哄簱鍗曟嵁鏄庣粏鏄惁鍏ㄩ儴鏄畬鎴愮姸鎬�
- bool outOderOver = outboundOrder.Details.Count() == outboundOrder.Details.Where(x => x.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()).Count();
- if (outOderOver)
+
+ _outboundOrderDetailService.UpdateData(outboundOrderDetails);
+
+ // 妫�鏌ュ嚭搴撳崟鏄惁瀹屾垚
+ if (CheckOutboundOrderCompleted(outboundOrder.OrderNo))
{
outboundOrder.OrderStatus = OutOrderStatusEnum.鍑哄簱瀹屾垚.ObjToInt();
+ _outboundOrderService.UpdateData(outboundOrder);
}
- else
- {
- outboundOrder.OrderStatus = OutOrderStatusEnum.鍑哄簱涓�.ObjToInt();
- }
- //鏁版嵁澶勭悊
- _unitOfWorkManage.BeginTran();
- _inboundOrderDetailService.UpdateData(inboundOrderDetails);
- _outboundOrderDetailService.UpdateData(outboundOrderDetails);
- _inboundOrderRepository.UpdateData(inboundOrder);
- _outboundOrderService.UpdateData(outboundOrder);
_unitOfWorkManage.CommitTran();
-
- //鍏ュ簱鍥炰紶MES
- var infeedmodel = new FeedbackInboundRequestModel
- {
- reqCode = Guid.NewGuid().ToString(),
- reqTime = DateTime.Now.ToString(),
- business_type = inboundOrder.BusinessType,
- factoryArea = inboundOrder.FactoryArea,
- operationType = 1,
- Operator = App.User.UserName,
- orderNo = inboundOrder.UpperOrderNo,
- status = inboundOrder.OrderStatus,
- details = new List<FeedbackInboundDetailsModel>()
-
- };
-
- var groupedData = inboundOrderDetails.GroupBy(item => new { item.MaterielCode, item.SupplyCode, item.BatchNo, item.lineNo, item.BarcodeUnit, item.WarehouseCode })
- .Select(group => new FeedbackInboundDetailsModel
- {
- materialCode = group.Key.MaterielCode,
- supplyCode = group.Key.SupplyCode,
- batchNo = group.Key.BatchNo,
- lineNo = group.Key.lineNo,
- warehouseCode = group.Key.WarehouseCode,
- qty = group.Sum(x => x.BarcodeQty),
- // warehouseCode= "1072",
- unit = group.Key.BarcodeUnit,
- barcodes = group.Select(row => new FeedbackBarcodesModel
- {
- barcode = row.Barcode,
- qty = row.BarcodeQty
- }).ToList()
- }).ToList();
- infeedmodel.details = groupedData;
-
- var result1 = await _invokeMESService.FeedbackInbound(infeedmodel);
- if (result1 != null && result1.code == 200)
- {
- var orderIds = inboundOrderDetails.Select(x => x.Id).Distinct().ToList();
- if (inboundOrder.OrderStatus == InOrderStatusEnum.鍏ュ簱瀹屾垚.ObjToInt())
- {
- _inboundOrderRepository.Db.Updateable<Dt_InboundOrder>().SetColumns(it => new Dt_InboundOrder { ReturnToMESStatus = 1, Remark = "" })
- .Where(it => it.Id == inboundOrder.Id).ExecuteCommand();
- }
- _inboundOrderDetailService.Db.Updateable<Dt_InboundOrderDetail>().SetColumns(it => new Dt_InboundOrderDetail { ReturnToMESStatus = 1 })
- .Where(it => orderIds.Contains(it.Id)).ExecuteCommand();
- }
- else
- {
- _inboundOrderRepository.Db.Updateable<Dt_InboundOrder>().SetColumns(it => new Dt_InboundOrder { ReturnToMESStatus = 2, Remark = result1.message })
- .Where(it => it.Id == inboundOrder.Id).ExecuteCommand();
- _inboundOrderDetailService.Db.Updateable<Dt_InboundOrderDetail>().SetColumns(it => new Dt_InboundOrderDetail { ReturnToMESStatus = 2 })
- .Where(it => it.OrderId == inboundOrder.Id).ExecuteCommand();
- }
//鍑哄簱鍥炰紶MES
+ _feedbackMesService.OutboundFeedback(outboundOrder.OrderNo);
- var documentNo = UniqueValueGenerator.Generate();
-
- var outfeedmodel = new FeedbackOutboundRequestModel
- {
- reqCode = Guid.NewGuid().ToString(),
- reqTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
- business_type = outboundOrder.BusinessType,
- factoryArea = outboundOrder.FactoryArea,
- operationType = 1,
- Operator = App.User.UserName,
- orderNo = outboundOrder.UpperOrderNo,
- documentsNO = documentNo,
- status = outboundOrder.OrderStatus,
- details = new List<FeedbackOutboundDetailsModel>()
- };
- foreach (var detail in outboundOrderDetails)
- {
- // 鑾峰彇璇ユ槑缁嗗搴旂殑鏉$爜淇℃伅锛堜粠閿佸畾璁板綍锛�
- var detailLocks = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
- .Where(x => x.OrderNo == outboundOrder.UpperOrderNo &&
- x.OrderDetailId == detail.Id &&
- (x.Status == (int)OutLockStockStatusEnum.鎷i�夊畬鎴� || x.Status == (int)OutLockStockStatusEnum.宸插洖搴�))
- .ToListAsync();
-
- var groupdata = detailLocks.GroupBy(item => new { item.MaterielCode, item.lineNo, item.BarcodeUnit, item.WarehouseCode })
- .Select(group => new FeedbackOutboundDetailsModel
- {
-
- materialCode = group.Key.MaterielCode,
- lineNo = group.Key.lineNo,
- warehouseCode = group.Key.WarehouseCode,
- qty = group.Sum(x => x.PickedQty),
- currentDeliveryQty = group.Sum(x => x.PickedQty),
- unit = group.Key.BarcodeUnit,
- barcodes = group.Select(lockInfo => new WIDESEA_DTO.Outbound.BarcodesModel
- {
- barcode = lockInfo.CurrentBarcode,
- supplyCode = lockInfo.SupplyCode,
- batchNo = lockInfo.BatchNo,
- unit = lockInfo.BarcodeUnit,
- qty = lockInfo.PickedQty
- }).ToList()
- }).ToList();
- outfeedmodel.details.AddRange(groupdata);
-
- _outStockLockInfoService.DeleteData(detailLocks);
- }
- //瀛樺偍鍥炰紶鍙傛暟锛屼繚璇佸紓甯告墜鍔ㄥ洖浼�
- Dt_InterfaceLog interfaceLog = new Dt_InterfaceLog
- {
- OrderNo = outboundOrder.UpperOrderNo,
- DocumentNo = documentNo,
- OrderType = "铏氭嫙鍑哄叆搴�",
- Content = outfeedmodel.ToJson(),
- ReturnToMESStatus = 0,
- IsDeleted = false
- };
- _interfaceLog.AddData(interfaceLog);
-
- var result = await _invokeMESService.FeedbackOutbound(outfeedmodel);
- if (result != null && result.code == 200)
- {
- var orderIds = outboundOrderDetails.Select(x => x.Id).Distinct().ToList();
- await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>()
- .SetColumns(x => x.ReturnToMESStatus == 1)
- .Where(x => orderIds.Contains(x.Id))
- .ExecuteCommandAsync();
-
-
- await _outboundOrderService.Db.Updateable<Dt_OutboundOrder>()
- .SetColumns(it => new Dt_OutboundOrder { ReturnToMESStatus = 1, Remark = "" })
- .Where(x => x.Id == outboundOrder.Id)
- .ExecuteCommandAsync();
-
- await _interfaceLog.Db.Updateable<Dt_InterfaceLog>()
- .SetColumns(x => x.ReturnToMESStatus == 1)
- .Where(x => x.DocumentNo == documentNo)
- .ExecuteCommandAsync();
- }
- else
- {
- var uporderIds = outboundOrderDetails.Select(x => x.Id).Distinct().ToList();
- await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>()
- .SetColumns(x => x.ReturnToMESStatus == 2)
- .Where(x => uporderIds.Contains(x.Id))
- .ExecuteCommandAsync();
-
- await _outboundOrderService.Db.Updateable<Dt_OutboundOrder>()
- .SetColumns(it => new Dt_OutboundOrder { ReturnToMESStatus = 2, Remark = result.message })
- .Where(x => x.Id == outboundOrder.Id)
- .ExecuteCommandAsync();
-
- await _interfaceLog.Db.Updateable<Dt_InterfaceLog>()
- .SetColumns(x => x.ReturnToMESStatus == 2)
- .Where(x => x.DocumentNo == documentNo)
- .ExecuteCommandAsync();
- }
return WebResponseContent.Instance.OK();
}
catch (Exception ex)
@@ -2680,6 +2725,221 @@
}
}
+
+ public WebResponseContent NoStockOutBatchInOrderFeedbackToMes(int id,List<string> barCodeList)
+ {
+ WebResponseContent content = new WebResponseContent();
+ try
+ {
+ var inboundOrder = _inboundOrderRepository.Db.Queryable<Dt_InboundOrder>()
+ .Where(x => x.Id == id)
+ .First();
+
+ List<Dt_MesReturnRecord> returnRecords = _mesReturnRecord.QueryData(x => x.OrderNo == inboundOrder.InboundOrderNo && x.OrderId == inboundOrder.Id && x.ReturnStatus == 2);
+ foreach (var item in returnRecords)
+ {
+ HttpResponseResult<MesResponseDTO> httpResponse = _httpClientHelper.Post<MesResponseDTO>(item.ApiUrl, item.RequestData);
+ item.ReturnCount += 1;
+ bool success = httpResponse.IsSuccess && httpResponse.Data.Code == "200";
+ item.ReturnStatus = success ? 1 : 2;
+ item.HttpStatusCode = httpResponse.StatusCode.ObjToInt();
+ item.LastReturnTime = DateTime.Now;
+ item.ResponseData = httpResponse.Content;
+ item.SuccessTime = httpResponse.IsSuccess ? DateTime.Now : null;
+
+ //List<Dt_InboundOrderDetail> details=new List<Dt_InboundOrderDetail>();
+ //foreach (var y in item.DetailsId.Split(','))
+ //{
+ // details.Add( _inboundOrderDetailRepository.QueryFirst(x => x.Id == Convert.ToInt32(y)));
+ //}
+ }
+ _mesReturnRecord.UpdateData(returnRecords);
+
+ var inboundOrderDetail = _inboundOrderRepository.Db.Queryable<Dt_InboundOrderDetail>()
+ .Where(x => x.OrderId == inboundOrder.Id && x.OrderDetailStatus == (int)OrderDetailStatusEnum.Over && x.ReturnToMESStatus == 0)
+ .ToList();
+
+ var detail = inboundOrderDetail.Where(x => barCodeList.Contains(x.Barcode)).ToList();
+
+ if (inboundOrder.OrderType == (int)InOrderTypeEnum.AllocatInbound)//璋冩嫧鍏ュ簱
+ {
+ var allocate = _inboundOrderRepository.Db.Queryable<Dt_AllocateOrder>().Where(x => x.OrderNo == inboundOrder.InboundOrderNo).First();
+ var allocatefeedmodel = new AllocateDto
+ {
+ ReqCode = Guid.NewGuid().ToString(),
+ ReqTime = DateTime.Now.ToString(),
+ BusinessType = "3",
+ FactoryArea = inboundOrder.FactoryArea,
+ OperationType = 1,
+ Operator = inboundOrder.Operator,
+ OrderNo = inboundOrder.UpperOrderNo,
+ fromWarehouse = allocate?.FromWarehouse ?? "",
+ toWarehouse = allocate?.ToWarehouse ?? "",
+ Details = NoStockOutGetAllocateDtoDetails(detail)
+ };
+
+ if (allocatefeedmodel.Details.Count <= 0)
+ {
+ throw new Exception("鏈壘鍒伴渶瑕佸洖浼犵殑鏁版嵁");
+ }
+
+ var response = NoStockOutresponseModel(inboundOrder, 3, null, allocatefeedmodel);
+
+ if (response != null && response.IsSuccess)
+ {
+ _inboundOrderRepository.Db.Updateable<Dt_InboundOrderDetail>().SetColumns(it => new Dt_InboundOrderDetail { ReturnToMESStatus = 1 });
+ }
+ else
+ {
+ _inboundOrderRepository.Db.Updateable<Dt_InboundOrderDetail>().SetColumns(it => new Dt_InboundOrderDetail { ReturnToMESStatus = 2 });
+ return content.Error("鍥炰紶MES澶辫触");
+ }
+ }
+ else
+ {
+ var feedmodel = new FeedbackInboundRequestModel
+ {
+ reqCode = Guid.NewGuid().ToString(),
+ reqTime = DateTime.Now.ToString(),
+ business_type = inboundOrder.BusinessType,
+ factoryArea = inboundOrder.FactoryArea,
+ operationType = 1,
+ Operator = inboundOrder.Operator,
+ orderNo = inboundOrder.UpperOrderNo,
+ status = inboundOrder.OrderStatus,
+ details = NoStockOutFeedbackInboundDetailsModelDto(detail)
+ };
+
+ if (feedmodel.details.Count <= 0)
+ {
+ throw new Exception("鏈壘鍒伴渶瑕佸洖浼犵殑鏁版嵁");
+ }
+ var response = NoStockOutresponseModel(inboundOrder, 3, feedmodel);
+
+ if (response != null && response.IsSuccess)
+ {
+ _inboundOrderRepository.Db.Updateable<Dt_InboundOrderDetail>().SetColumns(it => new Dt_InboundOrderDetail { ReturnToMESStatus = 1 });
+ }
+ else
+ {
+ _inboundOrderRepository.Db.Updateable<Dt_InboundOrderDetail>().SetColumns(it => new Dt_InboundOrderDetail { ReturnToMESStatus = 2 });
+ return content.Error("鍥炰紶MES澶辫触");
+ }
+ }
+
+ return content.OK("鍥炰紶MES鎴愬姛");
+ }
+ catch (Exception ex)
+ {
+ return content.Error(ex.Message);
+ }
+ }
+
+ public List<AllocateDtoDetail> NoStockOutGetAllocateDtoDetails(List<Dt_InboundOrderDetail> inboundOrderDetails)
+ {
+ var groupedData = inboundOrderDetails.GroupBy(item => new { item.MaterielCode, item.lineNo, item.BarcodeUnit, item.WarehouseCode })
+ .Select(group => new AllocateDtoDetail
+ {
+ MaterialCode = group.Key.MaterielCode,
+ LineNo = group.Key.lineNo,
+ WarehouseCode = group.Key.WarehouseCode,
+ Qty = group.Sum(x => x.BarcodeQty),
+ Unit = group.Key.BarcodeUnit,
+ Barcodes = group.Select(row => new BarcodeInfo
+ {
+ Barcode = row.Barcode,
+ Qty = row.BarcodeQty,
+ BatchNo = row.BatchNo,
+ SupplyCode = row.SupplyCode,
+ Unit = row.BarcodeUnit
+ }).ToList()
+ }).ToList();
+ return groupedData;
+ }
+ public List<FeedbackInboundDetailsModel> NoStockOutFeedbackInboundDetailsModelDto(List<Dt_InboundOrderDetail> inboundOrderDetails)
+ {
+ var groupedData = inboundOrderDetails.GroupBy(item => new { item.MaterielCode, item.lineNo, item.BarcodeUnit, item.WarehouseCode })
+ .Select(group => new FeedbackInboundDetailsModel
+ {
+ materialCode = group.Key.MaterielCode,
+ lineNo = group.Key.lineNo,
+ warehouseCode = group.Key.WarehouseCode,
+ qty = group.Sum(x => x.BarcodeQty),
+ unit = group.Key.BarcodeUnit,
+ barcodes = group.Select(row => new FeedbackBarcodesModel
+ {
+ barcode = row.Barcode,
+ qty = row.BarcodeQty
+ }).ToList()
+ }).ToList();
+ return groupedData;
+ }
+
+ public HttpResponseResult<MesResponseDTO> NoStockOutresponseModel(Dt_InboundOrder order, int InterfaceType, FeedbackInboundRequestModel model = null, AllocateDto allocateDto = null)
+ {
+ HttpResponseResult<MesResponseDTO> httpResponseResult = new HttpResponseResult<MesResponseDTO>();
+ string reqCode = Guid.NewGuid().ToString();
+ string reqTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
+ string requestData = string.Empty;
+ string apiUrl = string.Empty;
+ if (model != null)
+ {
+ apiUrl = AppSettings.GetValue("AldMaterialWarehousing");
+ httpResponseResult = _httpClientHelper.Post<MesResponseDTO>(apiUrl, model.Serialize());
+ requestData = model.Serialize();
+ }
+ else
+ {
+ apiUrl = AppSettings.GetValue("AldAllocationOperation");
+ httpResponseResult = _httpClientHelper.Post<MesResponseDTO>(apiUrl, allocateDto.Serialize());
+ requestData = allocateDto.Serialize();
+ }
+ httpResponseResult.ApiUrl = apiUrl;
+ bool isSuccess = httpResponseResult.IsSuccess && httpResponseResult.Data.Code == "200";
+ string message = "鎴愬姛";
+ if (!isSuccess)
+ {
+ if (!httpResponseResult.IsSuccess)
+ {
+ message = $"MES鎺ュ彛杩斿洖閿欒锛孒TTP浠g爜锛歿httpResponseResult.StatusCode}锛屼俊鎭細{httpResponseResult.ErrorMessage}";
+ }
+ else if (httpResponseResult?.Data?.Code != "200")
+ {
+ message = $"璋冪敤MES鎺ュ彛澶辫触锛屼唬鐮侊細{httpResponseResult?.Data?.Code}锛屼俊鎭細{httpResponseResult?.Data?.Message}";
+ }
+ }
+ Dt_MesReturnRecord mesReturnRecord = new Dt_MesReturnRecord()
+ {
+ ApiUrl = httpResponseResult.ApiUrl,
+ InterfaceType = InterfaceType,
+ OrderId = order.Id,
+ OrderNo = order.InboundOrderNo,
+ RequestCode = reqCode,
+ RequestData = requestData,
+ FailureReason = message,
+ LastReturnTime = DateTime.Now,
+ HttpStatusCode = httpResponseResult.StatusCode.ObjToInt(),
+ ResponseData = httpResponseResult.Content,
+ ReturnType = 0,
+ ReturnCount = 1,
+ ReturnStatus = httpResponseResult.IsSuccess ? 1 : 2,
+ SuccessTime = httpResponseResult.IsSuccess ? DateTime.Now : null
+ };
+ _unitOfWorkManage.Db.Insertable(mesReturnRecord).ExecuteCommand();
+
+ return httpResponseResult;
+ }
+ public bool CheckOutboundOrderCompleted(string orderNo)
+ {
+ Dt_OutboundOrder outboundOrder = _outboundOrderService.Db.Queryable<Dt_OutboundOrder>().Where(x => x.OrderNo == orderNo).First();
+ if (outboundOrder == null) return false;
+
+ List<Dt_OutboundOrderDetail> details = _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>().Where(x => x.OrderId == outboundOrder.Id).ToList();
+
+ // 妫�鏌ユ墍鏈夋槑缁嗙殑宸插嚭鏁伴噺鏄惁閮界瓑浜庡崟鎹暟閲�
+ return details.All(x => x.OverOutQuantity >= x.OrderQuantity - x.MoveQty);
+ }
+
public WebResponseContent GetPurchaseOrderByBarcode(string barcode)
{
try
@@ -2687,7 +2947,12 @@
Dt_InboundOrderDetail inboundOrderDetail = _stockInfoDetailService.Db.Queryable<Dt_InboundOrderDetail>().Where(x => x.Barcode == barcode && x.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt()).First();
if (inboundOrderDetail == null)
{
- return WebResponseContent.Instance.Error($"鏈壘鍒拌鏉$爜{barcode}鐨勫叆搴撴槑缁嗘垨鑰呮槑缁嗙姸鎬佸凡鍏ユ櫤浠撳畬鎴�");
+ inboundOrderDetail = _stockInfoDetailService.Db.Queryable<Dt_InboundOrderDetail>().Where(x => x.OutBoxbarcodes == barcode && x.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt()).First();
+
+ if(inboundOrderDetail == null)
+ {
+ return WebResponseContent.Instance.Error($"鏈壘鍒拌鏉$爜{barcode}鐨勫叆搴撴槑缁嗘垨鑰呮槑缁嗙姸鎬佸凡鍏ユ櫤浠撳畬鎴�");
+ }
}
Dt_InboundOrder inboundOrder = _inboundOrderRepository.QueryFirst(x => x.Id == inboundOrderDetail.OrderId && x.OrderStatus != InOrderStatusEnum.鍏ュ簱瀹屾垚.ObjToInt());
if (inboundOrder == null)
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Outbound/OutboundPickingController.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Outbound/OutboundPickingController.cs"
index d62ed14..4361809 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Outbound/OutboundPickingController.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Outbound/OutboundPickingController.cs"
@@ -123,9 +123,9 @@
}
[HttpPost, HttpGet, Route("GetAvailablePickingOrders"),AllowAnonymous]
- public WebResponseContent GetAvailablePickingOrders()
+ public WebResponseContent GetAvailablePickingOrders(string outOrder)
{
- return Service.GetAvailablePickingOrders();
+ return Service.GetAvailablePickingOrders(outOrder);
}
[HttpPost, HttpGet, Route("BarcodeValidate"), AllowAnonymous]
--
Gitblit v1.9.3