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