From 68389acdc272b78f1cc4d80180d4650e6254edcf Mon Sep 17 00:00:00 2001
From: z8018 <1282578289@qq.com>
Date: 星期三, 17 十二月 2025 17:04:59 +0800
Subject: [PATCH] 1

---
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_BasicService/MESOperation/FeedbackMesService.cs                  |  205 ++++++
 项目代码/WMS无仓储版/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.1204.46620/SemanticSymbols.db |    0 
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_Core/Util/HttpResponseResult.cs                                  |    5 
 项目代码/WMS无仓储版/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.1204.46620/CodeChunks.db      |    0 
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_DTO/ReturnMES/AllocationReturnDTO.cs                             |   92 +++
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_DTO/ReturnMES/FeedbackMesResult.cs                               |   15 
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_Core/Util/HttpClientHelper.cs                                    |    3 
 项目代码/WIDESEA_WMSClient/src/extension/outbound/outboundOrder.js                                          |   33 
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_Model/Models/Outbound/Dt_OutboundOrderDetail.cs                  |   14 
 项目代码/WIDESEA_WMSClient/src/extension/basic/extend/printView.vue                                         |   94 +++
 项目代码/WIDESEA_WMSClient/src/views/outbound/outPicking.vue                                                |  277 +++++++++
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_BasicService/BasicService.cs                                     |    2 
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_DTO/Base/UnitConvertResultDTO.cs                                 |    2 
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_IBasicService/MESOperation/IFeedbackMesService.cs                |    2 
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundOrderDetailService.cs                    |    2 
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Outbound/OutboundController.cs             |   15 
 项目代码/WIDESEA_WMSClient/src/extension/outbound/extend/printView.vue                                      |   28 
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundQueryService.cs                          |   13 
 项目代码/WIDESEA_WMSClient/src/views/outbound/out copyPicking.vue                                           |  805 +++++++++++++++++++++++++++
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundService.cs                               |   42 +
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_Core/Seed/DBSeed.cs                                              |   54 
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_Core/Middlewares/ApiLogMiddleware.cs                             |    2 
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Basic/MesFeedbackController.cs             |   24 
 23 files changed, 1,622 insertions(+), 107 deletions(-)

diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/basic/extend/printView.vue" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/basic/extend/printView.vue"
index 5b7a400..b0c3c09 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/basic/extend/printView.vue"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/basic/extend/printView.vue"
@@ -59,13 +59,97 @@
     print() {
       let printContent = document.getElementById("printContent");
       let palletcode=document.getElementById("palletcode");
-      var printWindow = window.open("", "");
-      printWindow.document.write(printContent.innerHTML);
-      printWindow.document.write(palletcode.innerHTML);
+      var printWindow = window.open("", "", "width=400,height=400");
+
+      // 鍒涘缓瀹屾暣鐨凥TML缁撴瀯浠ラ伩鍏嶇┖鐧介〉
+      printWindow.document.write(`
+        <!DOCTYPE html>
+        <html>
+        <head>
+          <meta charset="UTF-8">
+          <title>鎵撳嵃</title>
+          <style>
+            @page {
+              size: auto;
+              margin: 0;
+            }
+
+            body {
+              margin: 0;
+              padding: 10px;
+              font-family: Arial, sans-serif;
+              background: white;
+            }
+
+            .print-container {
+              width: 100%;
+              height: 100vh;
+              display: flex;
+              flex-direction: column;
+              justify-content: center;
+              align-items: center;
+              page-break-after: avoid;
+            }
+
+            .qrcode-container {
+              display: flex;
+              justify-content: center;
+              align-items: center;
+              margin-bottom: 20px;
+            }
+
+            .pallet-code {
+              display: flex;
+              justify-content: center;
+              align-items: center;
+              font-size: 18px;
+              font-weight: bold;
+            }
+
+            canvas {
+              display: block !important;
+              margin: auto !important;
+            }
+
+            @media print {
+              body {
+                margin: 0;
+                padding: 5mm;
+              }
+
+              .print-container {
+                width: 100%;
+                height: 100vh;
+                page-break-after: avoid;
+                page-break-inside: avoid;
+              }
+            }
+          </style>
+        </head>
+        <body>
+          <div class="print-container">
+            <div class="qrcode-container">
+              ${printContent.innerHTML}
+            </div>
+            <div class="pallet-code">
+              ${palletcode.innerHTML}
+            </div>
+          </div>
+          <script>
+            window.onload = function() {
+              setTimeout(function() {
+                window.print();
+                window.close();
+              }, 500);
+            };
+          <\/script>
+        </body>
+        </html>
+      `);
+
       printWindow.document.close();
       printWindow.focus();
-      printWindow.print();
-      printWindow.close();
+
       this.http
             .post("api/palletCodeInfo/PrintStatusUp?printCode="+this.palletCode, null, "鏁版嵁澶勭悊涓�")
             .then((x) => {
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/outbound/extend/printView.vue" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/outbound/extend/printView.vue"
index c7c216f..dbed23a 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/outbound/extend/printView.vue"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/outbound/extend/printView.vue"
@@ -192,6 +192,7 @@
                         return
                     }
 
+  
                     printWindow.document.write(`
             <!DOCTYPE html>
             <html>
@@ -235,27 +236,40 @@
                     margin: 0 !important;
                     padding: 0 !important;
                   }
-                  
-                  body {
+
+                  html {
+                    height: auto !important;
                     width: 80mm !important;
-                    height: 60mm !important;
                     margin: 0 !important;
                     padding: 0 !important;
                     background: white !important;
                   }
-                  
+
+                  body {
+                    height: auto !important;
+                    width: 80mm !important;
+                    margin: 0 !important;
+                    padding: 0 !important;
+                    background: white !important;
+                    overflow: visible !important;
+                    min-height: 0 !important;
+                    max-height: none !important;
+                  }
+
                   .print-page {
                     width: 80mm !important;
                     height: 60mm !important;
-                    page-break-after: always !important;
                     margin: 0 !important;
                     padding: 1mm !important;
                     display: block !important;
                     background: white !important;
+                    page-break-inside: avoid !important;
+                    position: relative !important;
+                    page-break-after: always !important;
                   }
-                  
+
                   .print-page:last-child {
-                    page-break-after: avoid !important;
+                    page-break-after: auto !important;
                   }
                   
                   .material-card {
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/outbound/outboundOrder.js" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/outbound/outboundOrder.js"
index 8be26bc..f101fdc 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/outbound/outboundOrder.js"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/outbound/outboundOrder.js"
@@ -340,18 +340,21 @@
           if (!selectedRows || selectedRows.length === 0) {
             return _this.$Message.warning('璇峰厛閫夋嫨闇�瑕佸鐞嗙殑鍗曟嵁');
           }
-          const requestParams = {
-            orderNos: selectedRows.map(row => row.orderNo), 
-            inout: 2
-          };
+          if (selectedRows.length > 1) {
+            return _this.$Message.warning('璇烽�夋嫨涓�鏉℃暟鎹�');
+          }
+          // const requestParams = {
+          //   orderNos: selectedRows.map(row => row.orderNo), 
+          //   inout: 2
+          // };
           _this.http
-            .post("api/InboundOrder/BatchOrderFeedbackToMes", requestParams, "鏁版嵁澶勭悊涓�...")
+            .post(`api/MesFeedback/OutboundFeedback?orderNo=${selectedRows[0].orderNo}`, {}, "鏁版嵁澶勭悊涓�...")
             .then((x) => {
               if (x.status) {
                 _this.$Message.success('鍒嗘壒鍑哄簱鍥炶皟瀹屾垚');
                 _this.refresh();
               } else {
-                return _this.$Message.error( '鍒嗘壒鍑哄簱鍥炶皟澶辫触');
+                return _this.$Message.error('鍒嗘壒鍑哄簱鍥炶皟澶辫触');
               }
             })
             .catch((error) => {
@@ -367,14 +370,14 @@
         }
       }
 
-      
+
 
       var EmptyTrayOutboundBtn = this.buttons.find(x => x.value == "EmptyTrayOutbound");
-        if (EmptyTrayOutboundBtn != null) {
-          EmptyTrayOutboundBtn.onClick = () => {
-               this.$refs.gridFooter.open();
-            }
+      if (EmptyTrayOutboundBtn != null) {
+        EmptyTrayOutboundBtn.onClick = () => {
+          this.$refs.gridFooter.open();
         }
+      }
 
     },
     onInited() {
@@ -383,7 +386,7 @@
       //this.detailOptions.columns.forEach(column=>{ });
     },
     searchBefore(param) {
-      
+
       //鐣岄潰鏌ヨ鍓�,鍙互缁檖aram.wheres娣诲姞鏌ヨ鍙傛暟
       //杩斿洖false锛屽垯涓嶄細鎵ц鏌ヨ
       return true;
@@ -406,9 +409,9 @@
     },
     modelOpenAfter(row) {
       if (this.currentAction === 'Add') { // 鍒ゆ柇褰撳墠鏄柊寤烘搷浣�
-                const currentUser = this.$store.state.userInfo?.userTrueName || 'system';
-                this.editFormFields.operator = currentUser;
-            }
+        const currentUser = this.$store.state.userInfo?.userTrueName || 'system';
+        this.editFormFields.operator = currentUser;
+      }
       //鐐瑰嚮缂栬緫銆佹柊寤烘寜閽脊鍑烘鍚庯紝鍙互鍦ㄦ澶勫啓閫昏緫锛屽锛屼粠鍚庡彴鑾峰彇鏁版嵁
       //(1)鍒ゆ柇鏄紪杈戣繕鏄柊寤烘搷浣滐細 this.currentAction=='Add';
       //(2)缁欏脊鍑烘璁剧疆榛樿鍊�
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/outbound/out copyPicking.vue" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/outbound/out copyPicking.vue"
new file mode 100644
index 0000000..8a0384f
--- /dev/null
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/outbound/out copyPicking.vue"
@@ -0,0 +1,805 @@
+<template>
+    <div class="picking-container">
+        <!-- 椤堕儴璁㈠崟淇℃伅 -->
+        <el-card class="order-info-card" shadow="never">
+            <div class="order-header">
+                <div class="order-title">
+                    <i class="el-icon-document"></i>
+                    <span class="order-label">璁㈠崟鍙凤細</span>
+                    <span class="order-value">{{ orderNo }}</span>
+                </div>
+                <div class="order-status" v-if="orderInfo">
+                    <el-tag :type="getStatusType(orderInfo.status)" size="medium">
+                        {{ orderInfo.statusName || '杩涜涓�' }}
+                    </el-tag>
+                </div>
+            </div>
+        </el-card>
+
+        <!-- 鎵爜鎿嶄綔鍖哄煙 -->
+        <el-card class="scan-section-card" shadow="never">
+            <div class="scan-section">
+                <el-alert title="璇蜂娇鐢ㄦ壂鐮佹灙鎵弿锛屾敮鎸佸洖杞﹁嚜鍔ㄧ‘璁�" type="info" :closable="false" show-icon class="scan-alert">
+                    <template #default>
+                        <span>1. 璇峰厛鎵弿鎵樼洏鐮� 鈫� 2. 鍐嶆壂鎻忕墿鏂欐潯鐮�</span>
+                    </template>
+                </el-alert>
+
+                <el-form :model="scanForm" :rules="scanRules" ref="scanFormRef" class="scan-form">
+                    <el-row :gutter="20">
+                        <el-col :span="8">
+                            <el-form-item label="鎵樼洏鐮�" prop="palletCode">
+                                <el-input ref="palletInput" v-model="scanForm.palletCode" placeholder="璇锋壂鎻忔墭鐩樼爜"
+                                    size="large" clearable @keyup.enter="handlePalletScan">
+                                    <template #prefix>
+                                        <i class="el-icon-box"></i>
+                                    </template>
+                                </el-input>
+                            </el-form-item>
+                        </el-col>
+                        <el-col :span="8">
+                            <el-form-item label="鐗╂枡鏉$爜" prop="materialBarcode">
+                                <el-input ref="materialInput" v-model="scanForm.materialBarcode" placeholder="璇锋壂鎻忕墿鏂欐潯鐮�"
+                                    size="large" clearable :disabled="unpickedData.length <= 0"
+                                    @keyup.enter="handleMaterialScan">
+                                    <template #prefix>
+                                        <i class="el-icon-s-grid"></i>
+                                    </template>
+                                </el-input>
+                            </el-form-item>
+                        </el-col>
+                        <el-col :span="8">
+                            <el-form-item class="button-form-item">
+                                <div class="action-buttons">
+                                    <el-button type="primary" size="large" @click="handleConfirmPick"
+                                        :loading="confirmLoading" :disabled="!canConfirm">
+                                        <i class="el-icon-check"></i>
+                                        纭鎷i��
+                                    </el-button>
+                                    <el-button type="warning" size="large" @click="handleEmptyBox"
+                                        :disabled="!scanForm.palletCode">
+                                        <i class="el-icon-delete"></i>
+                                        鍙栫┖绠�
+                                    </el-button>
+                                    <el-button type="success" size="large" @click="handleReturnToWarehouse"
+                                        :disabled="!scanForm.palletCode">
+                                        <i class="el-icon-refresh-left"></i>
+                                        鍥炲簱
+                                    </el-button>
+                                </div>
+                            </el-form-item>
+                        </el-col>
+                    </el-row>
+                </el-form>
+            </div>
+        </el-card>
+
+        <!-- 鏁版嵁鍒楄〃鍖哄煙 -->
+        <div class="tables-section">
+            <el-row :gutter="20">
+                <!-- 鏈嫞閫夊垪琛� -->
+                <el-col :span="12">
+                    <el-card class="table-card" shadow="never">
+                        <template #header>
+                            <div class="card-header">
+                                <span class="card-title">
+                                    <i class="el-icon-time"></i>
+                                    鏈嫞閫夊垪琛�
+                                </span>
+                                <el-badge :value="unpickedCount" class="badge-item" type="warning">
+                                    <el-button size="small" @click="refreshUnpickedTable" icon="el-icon-refresh">
+                                        鍒锋柊
+                                    </el-button>
+                                </el-badge>
+                            </div>
+                        </template>
+
+                        <el-table ref="unpickedTable" :data="unpickedData" height="400" stripe highlight-current-row>
+                            <el-table-column type="index" label="搴忓彿" width="60" align="center" />
+                            <el-table-column prop="materielCode" label="鐗╂枡缂栫爜" width="120" show-overflow-tooltip />
+                            <el-table-column prop="materielName" label="鐗╂枡鍚嶇О" width="80" show-overflow-tooltip />
+                            <el-table-column prop="batchNo" label="鎵规鍙�" width="100" />
+                            <el-table-column prop="assignQuantity" label="鍒嗘嫞鏁伴噺" width="80" align="right">
+                                <template #default="scope">
+                                    <el-text type="danger">{{ scope.row.assignQuantity }}</el-text>
+                                </template>
+                            </el-table-column>
+                            <el-table-column prop="sortedQuantity" label="宸插垎鎷f暟閲�" width="120" align="right">
+                                <template #default="scope">
+                                    <el-text type="danger">{{ scope.row.sortedQuantity }}</el-text>
+                                </template>
+                            </el-table-column>
+                            <el-table-column prop="unit" label="鍗曚綅" width="60" />
+                            <el-table-column prop="locationCode" label="搴撲綅" />
+                            <!-- <el-table-column label="鎿嶄綔" width="80" align="center">
+                                <template #default="scope">
+                                    <el-button type="text" size="small" @click="quickPick(scope.row)"
+                                        :disabled="!scanForm.palletCode">
+                                        鎷i��
+                                    </el-button>
+                                </template>
+                            </el-table-column> -->
+                        </el-table>
+
+                        <div class="table-footer">
+                            <el-descriptions :column="2" size="small">
+                                <el-descriptions-item label="鎬绘潯鏁�">
+                                    <el-text type="info">{{ unpickedTotal }}</el-text>
+                                </el-descriptions-item>
+                                <el-descriptions-item label="鎬绘暟閲�">
+                                    <el-text type="warning">{{ unpickedQuantity }}</el-text>
+                                </el-descriptions-item>
+                            </el-descriptions>
+                        </div>
+                    </el-card>
+                </el-col>
+
+                <!-- 宸叉嫞閫夊垪琛� -->
+                <el-col :span="12">
+                    <el-card class="table-card" shadow="never">
+                        <template #header>
+                            <div class="card-header">
+                                <span class="card-title">
+                                    <i class="el-icon-circle-check"></i>
+                                    宸叉嫞閫夊垪琛�
+                                </span>
+                                <el-badge :value="pickedCount" class="badge-item" type="success">
+                                    <el-button size="small" @click="refreshPickedTable" icon="el-icon-refresh">
+                                        鍒锋柊
+                                    </el-button>
+                                </el-badge>
+                            </div>
+                        </template>
+
+                        <el-table ref="pickedTable" :data="pickedData" height="400" stripe>
+                            <el-table-column type="index" label="搴忓彿" width="60" align="center" />
+                            <el-table-column prop="materielCode" label="鐗╂枡缂栫爜" width="120" />
+                            <el-table-column prop="materielName" label="鐗╂枡鍚嶇О" show-overflow-tooltip />
+                            <el-table-column prop="batchNo" label="鎵规鍙�" width="100" />
+                            <el-table-column prop="changeQuantity" label="鎷i�夋暟閲�" width="80" align="right">
+                                <template #default="scope">
+                                    <el-text type="success">{{ 0 - scope.row.changeQuantity }}</el-text>
+                                </template>
+                            </el-table-column>
+                            <el-table-column prop="changeQuantity" label="鍘熷簱瀛橀噺" width="80" align="right">
+                                <template #default="scope">
+                                    <el-text type="success">{{ scope.row.beforeQuantity }}</el-text>
+                                </template>
+                            </el-table-column>
+                            <el-table-column prop="changeQuantity" label="鎷i�夊悗搴撳瓨閲�" width="80" align="right">
+                                <template #default="scope">
+                                    <el-text type="success">{{ scope.row.afterQuantity }}</el-text>
+                                </template>
+                            </el-table-column>
+                            <el-table-column prop="unit" label="鍗曚綅" width="60" />
+                            <el-table-column prop="palletCode" label="鎵樼洏鐮�" width="100" />
+                            <el-table-column prop="createDate" label="鎷i�夋椂闂�" width="160" />
+                            <el-table-column prop="originalBarcode" label="鍘熺墿鏂欑爜" width="160" />
+                            <el-table-column prop="newBarcode" label="鏂扮墿鏂欑爜" width="160" />
+                            <!-- <el-table-column label="鎿嶄綔" width="80" align="center">
+                                <template #default="scope">
+                                    <el-button type="text" size="small" @click="undoPick(scope.row)">
+                                        鎾ら攢
+                                    </el-button>
+                                </template>
+                            </el-table-column> -->
+                        </el-table>
+
+                        <div class="table-footer">
+                            <el-descriptions :column="2" size="small">
+                                <el-descriptions-item label="鎬绘潯鏁�">
+                                    <el-text type="info">{{ pickedTotal }}</el-text>
+                                </el-descriptions-item>
+                                <el-descriptions-item label="鎬绘暟閲�">
+                                    <el-text type="success">{{ pickedQuantity }}</el-text>
+                                </el-descriptions-item>
+                            </el-descriptions>
+                        </div>
+                    </el-card>
+                </el-col>
+            </el-row>
+        </div>
+
+        <print-view ref="printView" @parentcall="parentcall"></print-view>
+
+        <!-- 纭瀵硅瘽妗� -->
+        <el-dialog v-model="confirmDialogVisible" title="鎿嶄綔纭" width="400px" :before-close="handleDialogClose">
+            <div class="confirm-content">
+                <p>{{ confirmMessage }}</p>
+            </div>
+            <template #footer>
+                <span class="dialog-footer">
+                    <el-button @click="confirmDialogVisible = false">鍙栨秷</el-button>
+                    <el-button type="primary" @click="executeConfirm" :loading="executeLoading">
+                        纭畾
+                    </el-button>
+                </span>
+            </template>
+        </el-dialog>
+    </div>
+</template>
+
+<script>
+
+import printView from "@/extension/outbound/extend/printView.vue"
+export default {
+    components: { printView },
+    name: 'OutPicking',
+    data() {
+        return {
+            orderNo: '',
+            orderInfo: null,
+            scanForm: {
+                palletCode: '',
+                materialBarcode: ''
+            },
+            scanRules: {
+                palletCode: [
+                    { required: true, message: '璇锋壂鎻忔墭鐩樼爜', trigger: 'blur' }
+                ],
+                materialBarcode: [
+                    { required: true, message: '璇锋壂鎻忕墿鏂欐潯鐮�', trigger: 'blur' }
+                ]
+            },
+            unpickedData: [],
+            pickedData: [],
+            unpickedCount: 0,
+            unpickedTotal: 0,
+            unpickedQuantity: 0,
+            pickedCount: 0,
+            pickedTotal: 0,
+            pickedQuantity: 0,
+            confirmLoading: false,
+            confirmDialogVisible: false,
+            confirmMessage: '',
+            currentAction: null,
+            executeLoading: false
+        }
+    },
+    computed: {
+        canConfirm() {
+            return this.scanForm.palletCode && this.scanForm.materialBarcode
+        }
+    },
+    mounted() {
+        this.initPage()
+    },
+    methods: {
+        initPage() {
+            // 浠庤矾鐢卞弬鏁拌幏鍙栬鍗曞彿
+            this.orderNo = this.$route.query.orderNo || ''
+            if (!this.orderNo) {
+                this.$message.error('璁㈠崟鍙蜂笉鑳戒负绌�')
+                this.$router.back()
+                return
+            }
+            // 鑷姩鑱氱劍鍒版墭鐩樼爜杈撳叆妗�
+            this.$nextTick(() => {
+                if (this.$refs.palletInput) {
+                    this.$refs.palletInput.focus()
+                }
+            })
+        },
+
+        loadPalletData() {
+            if (!this.scanForm.palletCode) {
+                this.unpickedData = []
+                return
+            }
+
+            try {
+                this.loadUnpickedData();
+                this.loadPickedData();
+
+            } catch (error) {
+                console.error('鍔犺浇鎵樼洏鏁版嵁澶辫触:', error)
+                this.unpickedData = []
+            }
+        },
+        loadUnpickedData() {
+            try {
+                this.http.post(`/api/Outbound/QueryPickingTasks?orderNo=${this.orderNo}&palletCode=${this.scanForm.palletCode}`, {}).then(response => {
+                    if (response.status) {
+                        if (response.data.length > 0) {
+                            this.unpickedData = response.data
+                            this.calculateUnpickedStats()
+
+                            // 鑷姩鑱氱劍鍒扮墿鏂欐潯鐮佽緭鍏ユ
+                            this.$nextTick(() => {
+                                if (this.$refs.materialInput) {
+                                    this.$refs.materialInput.focus()
+                                }
+                            })
+                        } else {
+                            this.$message.warning('璇ユ墭鐩樻棤鏈嫞閫変换鍔�')
+                            this.unpickedData = []
+                        }
+                    } else {
+                        this.$message.error(response.message || '鑾峰彇鎵樼洏鏁版嵁澶辫触')
+                        this.unpickedData = []
+                    }
+                }
+                )
+
+            } catch (error) {
+                console.error('鍔犺浇鏈嫞閫夋暟鎹け璐�:', error)
+            }
+        },
+
+        loadPickedData() {
+            try {
+                this.http.post(`/api/Outbound/QueryPickedList?orderNo=${this.orderNo}&palletCode=${this.scanForm.palletCode}`, {}).then(response => {
+                    if (response.status) {
+                        if (response.data.length > 0) {
+                            this.pickedData = response.data
+                            this.calculatePickedStats()
+                        } else {
+                            this.pickedData = []
+                        }
+                    } else {
+                        this.$message.error(response.message || '鑾峰彇鎵樼洏鏁版嵁澶辫触')
+                        this.pickedData = []
+                    }
+                }
+                )
+
+            } catch (error) {
+                console.error('鍔犺浇宸叉嫞閫夋暟鎹け璐�:', error)
+            }
+        },
+
+        // 璁$畻鏈嫞閫�
+        calculateUnpickedStats() {
+            // 鏈嫞閫夋潯鐩暟閲�
+            this.unpickedCount = this.unpickedData.length
+
+            // 璁$畻鏈嫞閫夌殑鎬绘暟閲忥紙鍒嗘嫞鏁伴噺 - 宸插垎鎷f暟閲忥級
+            this.unpickedQuantity = this.unpickedData.reduce((sum, item) => {
+                const assignQty = item.assignQuantity || 0
+                const sortedQty = item.sortedQuantity || 0
+                const remainingQty = Math.max(0, assignQty - sortedQty)
+                return sum + remainingQty
+            }, 0)
+
+            // 鎬绘潯鐩暟锛堜笌鏉$洰鏁伴噺鐩稿悓锛岃繖閲屼繚鐣欏彉閲忎竴鑷存�э級
+            this.unpickedTotal = this.unpickedCount
+        },
+
+        // 璁$畻宸叉嫞閫�
+        calculatePickedStats() {
+            // 宸叉嫞閫夋潯鐩暟閲�
+            this.pickedCount = this.pickedData.length
+
+            // 璁$畻宸叉嫞閫夌殑鎬绘暟閲�
+            this.pickedQuantity = 0 - this.pickedData.reduce((sum, item) => {
+                return (sum + item.changeQuantity)
+            }, 0)
+
+            // 鎬绘潯鐩暟锛堜笌鏉$洰鏁伴噺鐩稿悓锛�
+            this.pickedTotal = this.pickedCount
+        },
+
+        handlePalletScan() {
+            if (this.scanForm.palletCode) {
+                // this.$message.success(`鎵樼洏鐮�: ${this.scanForm.palletCode}`)
+                this.loadPalletData()
+
+
+            }
+        },
+
+        handleMaterialScan() {
+            if (!this.scanForm.palletCode) {
+                this.$message.warning('璇峰厛鎵弿鎵樼洏鐮�')
+                this.$refs.palletInput.focus()
+                return
+            }
+
+            if (!this.scanForm.materialBarcode) {
+                this.$message.warning('璇锋壂鎻忕墿鏂欐潯鐮�')
+                return
+            }
+
+            // 鑷姩鎵ц纭鎷i��
+            this.handleConfirmPick()
+        },
+
+        handleConfirmPick() {
+            if (!this.scanForm.palletCode || !this.scanForm.materialBarcode) {
+                this.$message.warning('璇峰厛鎵弿鎵樼洏鐮佸拰鐗╂枡鏉$爜')
+                return
+            }
+
+            this.confirmLoading = true
+
+            try {
+                this.http.post('/api/Outbound/CompleteOutboundWithBarcode', {
+                    orderNo: this.orderNo,
+                    palletCode: this.scanForm.palletCode,
+                    barcode: this.scanForm.materialBarcode,
+                    operator: this.getUserName()
+                }).then(response => {
+                    if (response.status) {
+                        if (response.data.scannedDetail.isUnpacked && response.data.scannedDetail.materialCodes.length > 0) {
+                            this.$refs.printView.open(response.data.scannedDetail.materialCodes);
+                        }
+                        this.$message.success('鎷i�夌‘璁ゆ垚鍔�')
+                        this.resetMaterialBarcode()
+                        // this.loadUnpickedData()
+                        // this.loadPickedData()
+                        this.loadPalletData()
+                    } else {
+                        this.$message.error(response.message || '鎷i�夌‘璁ゅけ璐�')
+                    }
+                })
+            } catch (error) {
+                console.error('鎷i�夌‘璁ゅけ璐�:', error)
+                this.$message.error('鎷i�夌‘璁ゅけ璐�')
+            } finally {
+                this.confirmLoading = false
+            }
+        },
+
+        handleEmptyBox() {
+            if (!this.scanForm.palletCode) {
+                this.$message.warning('璇峰厛鎵弿鎵樼洏鐮�')
+                return
+            }
+
+            this.confirmMessage = `纭畾瑕佸彇绌烘墭鐩� ${this.scanForm.palletCode} 鍚楋紵`
+            this.currentAction = 'emptyBox'
+            this.confirmDialogVisible = true
+        },
+
+        handleReturnToWarehouse() {
+            if (!this.scanForm.palletCode) {
+                this.$message.warning('璇峰厛鎵弿鎵樼洏鐮�')
+                return
+            }
+
+            this.confirmMessage = `纭畾瑕佸皢鎵樼洏 ${this.scanForm.palletCode} 鍥炲簱鍚楋紵`
+            this.currentAction = 'returnToWarehouse'
+            this.confirmDialogVisible = true
+        },
+
+        executeConfirm() {
+            this.executeLoading = true
+
+            try {
+                let apiUrl = ''
+                let params = {
+                    orderNo: this.orderNo,
+                    palletCode: this.scanForm.palletCode
+                }
+
+                if (this.currentAction === 'emptyBox') {
+                    apiUrl = '/api/Outbound/EmptyBox'
+                } else if (this.currentAction === 'returnToWarehouse') {
+                    apiUrl = '/api/Outbound/ReturnToWarehouse'
+                }
+
+                this.http.post(apiUrl, params).then(response => {
+
+                    if (response.status) {
+                        this.$message.success('鎿嶄綔鎴愬姛')
+                        this.confirmDialogVisible = false
+                        this.resetForm()
+                        // this.loadUnpickedData()
+                        // this.loadPickedData()
+                    } else {
+                        this.$message.error(response.message || '鎿嶄綔澶辫触')
+                    }
+                })
+            } catch (error) {
+                console.error('鎿嶄綔澶辫触:', error)
+                this.$message.error('鎿嶄綔澶辫触')
+            } finally {
+                this.executeLoading = false
+            }
+        },
+
+        handleDialogClose() {
+            if (!this.executeLoading) {
+                this.confirmDialogVisible = false
+            }
+        },
+
+        quickPick(row) {
+            this.scanForm.materialBarcode = row.materielCode
+            this.handleConfirmPick()
+        },
+
+        undoPick(row) {
+            try {
+                this.$confirm('纭畾瑕佹挙閿�杩欐潯鎷i�夎褰曞悧锛�', '鎻愮ず', {
+                    type: 'warning'
+                })
+
+                const response = this.http.post('/api/Outbound/UndoPicking', {
+                    id: row.id
+                }).then(response => {
+                    if (response.status) {
+                        this.$message.success('鎾ら攢鎴愬姛')
+                        this.loadUnpickedData()
+                        this.loadPickedData()
+                    } else {
+                        this.$message.error(response.message || '鎾ら攢澶辫触')
+                    }
+                })
+            } catch (error) {
+                if (error !== 'cancel') {
+                    console.error('鎾ら攢澶辫触:', error)
+                    this.$message.error('鎾ら攢澶辫触')
+                }
+            }
+        },
+
+        // handleUnpickedRowClick(row) {
+        //     // 鐐瑰嚮鏈嫞閫夎鏃惰嚜鍔ㄥ~鍏呯墿鏂欐潯鐮�
+        //     this.scanForm.materialBarcode = row.materielCode
+        // },
+
+        refreshUnpickedTable() {
+            if (this.scanForm.palletCode) {
+                this.loadPalletData()
+            }
+        },
+
+        refreshPickedTable() {
+            this.loadPickedData()
+        },
+
+        resetMaterialBarcode() {
+            this.scanForm.materialBarcode = ''
+            this.$nextTick(() => {
+                if (this.$refs.materialInput) {
+                    this.$refs.materialInput.focus()
+                }
+            })
+        },
+
+        resetForm() {
+            this.scanForm.palletCode = ''
+            this.scanForm.materialBarcode = ''
+            this.unpickedData = []
+            this.$nextTick(() => {
+                if (this.$refs.palletInput) {
+                    this.$refs.palletInput.focus()
+                }
+            })
+        },
+
+        getUserName() {
+            // 灏濊瘯浠� Vuex store 鑾峰彇鐢ㄦ埛鍚�
+            if (this.$store && this.$store.state && this.$store.state.userInfo) {
+                return this.$store.state.userInfo.userName || this.$store.state.userInfo.username || '鏈櫥褰曠敤鎴�'
+            }
+
+            // 灏濊瘯浠� localStorage 鑾峰彇
+            try {
+                const userInfo = localStorage.getItem('user')
+                if (userInfo) {
+                    const user = JSON.parse(userInfo)
+                    return user.userName || user.username || '鏈櫥褰曠敤鎴�'
+                }
+            } catch (error) {
+                console.error('鑾峰彇鐢ㄦ埛淇℃伅澶辫触:', error)
+            }
+
+            return '鏈櫥褰曠敤鎴�'
+        },
+
+        getStatusType(status) {
+            const statusMap = {
+                0: 'info',    // 寰呭鐞�
+                10: 'warning', // 杩涜涓�
+                20: 'primary', // 鎷i�変腑
+                30: 'success', // 宸插畬鎴�
+                40: 'danger'   // 寮傚父
+            }
+            return statusMap[status] || 'info'
+        }
+    }
+}
+</script>
+
+<style scoped>
+.picking-container {
+    padding: 20px;
+    background-color: #f5f5f5;
+    min-height: 100vh;
+}
+
+/* 璁㈠崟淇℃伅鍗$墖 */
+.order-info-card {
+    margin-bottom: 20px;
+    background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+    color: white;
+}
+
+.order-header {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+}
+
+.order-title {
+    display: flex;
+    align-items: center;
+    font-size: 18px;
+    font-weight: bold;
+}
+
+.order-title i {
+    margin-right: 10px;
+    font-size: 24px;
+}
+
+.order-label {
+    margin-left: 10px;
+    opacity: 0.9;
+}
+
+.order-value {
+    font-size: 20px;
+    font-weight: bold;
+    letter-spacing: 1px;
+}
+
+/* 鎵爜鍖哄煙 */
+.scan-section-card {
+    margin-bottom: 20px;
+}
+
+.scan-section {
+    padding: 10px 0;
+}
+
+.scan-alert {
+    margin-bottom: 20px;
+}
+
+.scan-form {
+    margin-top: 20px;
+}
+
+.button-form-item {
+    margin-bottom: 0;
+}
+
+.button-form-item .el-form-item__content {
+    line-height: normal;
+}
+
+.action-buttons {
+    display: flex;
+    gap: 8px;
+    width: 100%;
+    height: 40px;
+}
+
+.action-buttons .el-button {
+    flex: 1;
+    height: 40px;
+    font-weight: bold;
+    border-radius: 6px;
+    margin: 0;
+}
+
+/* 琛ㄦ牸鍖哄煙 */
+.tables-section {
+    margin-top: 20px;
+}
+
+.table-card {
+    height: 600px;
+    display: flex;
+    flex-direction: column;
+}
+
+.card-header {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+}
+
+.card-title {
+    display: flex;
+    align-items: center;
+    font-weight: bold;
+    font-size: 16px;
+}
+
+.card-title i {
+    margin-right: 8px;
+    color: #409EFF;
+}
+
+.badge-item {
+    margin-left: 10px;
+}
+
+.table-footer {
+    margin-top: 10px;
+    padding-top: 10px;
+    border-top: 1px solid #ebeef5;
+}
+
+/* 琛ㄦ牸琛屾牱寮� */
+.el-table tbody tr:hover>td {
+    background-color: #f0f9ff !important;
+}
+
+.el-table tbody tr.current-row>td {
+    background-color: #e1f3ff !important;
+}
+
+/* 瀵硅瘽妗嗘牱寮� */
+.confirm-content {
+    padding: 20px 0;
+    text-align: center;
+}
+
+.confirm-content p {
+    font-size: 16px;
+    color: #606266;
+}
+
+.dialog-footer {
+    text-align: center;
+}
+
+/* 鍝嶅簲寮忚璁� */
+@media (max-width: 1200px) {
+    .action-buttons .el-button {
+        font-size: 14px;
+    }
+}
+
+/* Element UI 缁勪欢鏍峰紡瑕嗙洊 */
+::v-deep .el-card__header {
+    padding: 18px 20px;
+    border-bottom: 1px solid #ebeef5;
+}
+
+::v-deep .el-input__inner {
+    border-radius: 6px;
+}
+
+::v-deep .el-button--primary {
+    background: linear-gradient(135deg, #409EFF 0%, #3a8ee6 100%);
+    border: none;
+}
+
+::v-deep .el-button--warning {
+    background: linear-gradient(135deg, #E6A23C 0%, #d9971a 100%);
+    border: none;
+}
+
+::v-deep .el-button--success {
+    background: linear-gradient(135deg, #67C23A 0%, #5daf34 100%);
+    border: none;
+}
+
+/* 鍥炬爣鏍峰紡 */
+.el-icon-document,
+.el-icon-box,
+.el-icon-s-grid,
+.el-icon-check,
+.el-icon-delete,
+.el-icon-refresh-left,
+.el-icon-time,
+.el-icon-circle-check {
+    font-size: 18px;
+}
+
+/* 鎻忚堪鍒楄〃鏍峰紡 */
+::v-deep .el-descriptions__label {
+    font-weight: bold;
+    color: #909399;
+}
+
+::v-deep .el-descriptions__content {
+    color: #606266;
+}
+</style>
\ No newline at end of file
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/outbound/outPicking.vue" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/outbound/outPicking.vue"
index 8a0384f..16b62c5 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/outbound/outPicking.vue"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/outbound/outPicking.vue"
@@ -21,7 +21,13 @@
             <div class="scan-section">
                 <el-alert title="璇蜂娇鐢ㄦ壂鐮佹灙鎵弿锛屾敮鎸佸洖杞﹁嚜鍔ㄧ‘璁�" type="info" :closable="false" show-icon class="scan-alert">
                     <template #default>
-                        <span>1. 璇峰厛鎵弿鎵樼洏鐮� 鈫� 2. 鍐嶆壂鎻忕墿鏂欐潯鐮�</span>
+                        <div>
+                            <div>1. 璇峰厛鎵弿鎵樼洏鐮� 鈫� 2. 鍐嶆壂鎻忕墿鏂欐爣绛剧爜</div>
+                            <div style="margin-top: 8px; font-size: 13px; color: #666;">
+                                <i class="el-icon-info" style="color: #409EFF;"></i>
+                                鏀寔鎵墭鐩樼爜鏁寸鍑哄簱锛氭壂鎻忔墭鐩樼爜鍚庡彲鐩存帴杩涜鏁寸鐗╂枡鎷i�夛紝鏃犻渶鍐嶆壂鎻忕墿鏂欐爣绛剧爜銆�
+                            </div>
+                        </div>
                     </template>
                 </el-alert>
 
@@ -71,6 +77,41 @@
                         </el-col>
                     </el-row>
                 </el-form>
+
+                <!-- 鍒嗘嫞缁熻淇℃伅 -->
+                <div class="picking-stats" v-if="scanForm.palletCode && unpickedData.length > 0">
+                    <el-divider content-position="left">
+                        <span style="color: #409EFF; font-size: 14px;">
+                            <i class="el-icon-data-analysis"></i> 鎵樼洏鍒嗘嫞缁熻
+                        </span>
+                    </el-divider>
+                    <div class="stats-container">
+                        <div class="stat-item">
+                            <el-tag type="primary" size="medium" effect="dark">
+                                <i class="el-icon-s-order"></i>
+                                鍒嗘嫞鎬绘暟锛�<b>{{ calculateTotalAssignQuantity() }}</b>
+                            </el-tag>
+                        </div>
+                        <div class="stat-item">
+                            <el-tag type="success" size="medium" effect="dark">
+                                <i class="el-icon-circle-check"></i>
+                                宸插垎鎷o細<b>{{ calculateTotalSortedQuantity() }}</b>
+                            </el-tag>
+                        </div>
+                        <div class="stat-item">
+                            <el-tag type="warning" size="medium" effect="dark">
+                                <i class="el-icon-time"></i>
+                                鏈垎鎷o細<b>{{ calculateTotalUnsortedQuantity() }}</b>
+                            </el-tag>
+                        </div>
+                        <div class="stat-item">
+                            <el-tag type="success" size="medium" effect="dark">
+                                <i class="el-icon-box"></i>
+                                鏄惁鏁村嚭锛歿{ hasWholeOut() ? '鏄�' : '鍚�' }}
+                            </el-tag>
+                        </div>
+                    </div>
+                </div>
             </div>
         </el-card>
 
@@ -198,6 +239,53 @@
                     </el-card>
                 </el-col>
             </el-row>
+
+            <!-- 鎵樼洏鐗╂枡搴撳瓨淇℃伅 -->
+            <!-- <div class="pallet-inventory" v-if="scanForm.palletCode && unpickedData.length > 0">
+                <el-divider content-position="left">
+                    <span style="color: #67C23A; font-size: 14px;">
+                        <i class="el-icon-goods"></i> 鎵樼洏鐗╂枡搴撳瓨淇℃伅
+                    </span>
+                </el-divider>
+                <div class="inventory-container">
+                    <el-table :data="unpickedData" size="small" :show-header="true" :border="true" stripe
+                        highlight-current-row max-height="200" class="inventory-table">
+                        <el-table-column type="index" label="搴忓彿" width="50" align="center" />
+                        <el-table-column prop="materielCode" label="鐗╂枡缂栫爜" width="100" show-overflow-tooltip />
+                        <el-table-column prop="materielName" label="鐗╂枡鍚嶇О" width="120" show-overflow-tooltip />
+                        <el-table-column prop="batchNo" label="鎵规鍙�" width="90" />
+                        <el-table-column label="褰撳墠搴撳瓨" width="80" align="right">
+                            <template #default="scope">
+                                <el-text type="primary" tag="b">{{ scope.row.currentStock || 0 }}</el-text>
+                            </template>
+                        </el-table-column>
+                        <el-table-column label="鍒嗘嫞鏁伴噺" width="80" align="right">
+                            <template #default="scope">
+                                <el-text type="warning">{{ scope.row.assignQuantity }}</el-text>
+                            </template>
+                        </el-table-column>
+                        <el-table-column label="宸插垎鎷�" width="70" align="right">
+                            <template #default="scope">
+                                <el-text type="success">{{ scope.row.sortedQuantity || 0 }}</el-text>
+                            </template>
+                        </el-table-column>
+                        <el-table-column label="鍓╀綑搴撳瓨" width="80" align="right">
+                            <template #default="scope">
+                                <el-text type="info">{{ calculateRemainingStock(scope.row) }}</el-text>
+                            </template>
+                        </el-table-column>
+                        <el-table-column prop="unit" label="鍗曚綅" width="100" align="center" />
+                        <el-table-column prop="locationCode" label="搴撲綅" width="150" />
+                        <el-table-column label="鐘舵��" width="80" align="center">
+                            <template #default="scope">
+                                <el-tag :type="getStockStatusType(scope.row)" size="mini">
+                                    {{ getStockStatusText(scope.row) }}
+                                </el-tag>
+                            </template>
+                        </el-table-column>
+                    </el-table>
+                </div>
+            </div> -->
         </div>
 
         <print-view ref="printView" @parentcall="parentcall"></print-view>
@@ -253,7 +341,8 @@
             confirmDialogVisible: false,
             confirmMessage: '',
             currentAction: null,
-            executeLoading: false
+            executeLoading: false,
+            matMixed: true
         }
     },
     computed: {
@@ -300,8 +389,9 @@
             try {
                 this.http.post(`/api/Outbound/QueryPickingTasks?orderNo=${this.orderNo}&palletCode=${this.scanForm.palletCode}`, {}).then(response => {
                     if (response.status) {
-                        if (response.data.length > 0) {
-                            this.unpickedData = response.data
+                        if (response.data.outStockLockInfos.length > 0) {
+                            this.unpickedData = response.data.outStockLockInfos;
+                            this.matMixed = response.data.isMatMixed;
                             this.calculateUnpickedStats()
 
                             // 鑷姩鑱氱劍鍒扮墿鏂欐潯鐮佽緭鍏ユ
@@ -589,6 +679,71 @@
             return '鏈櫥褰曠敤鎴�'
         },
 
+        // 璁$畻鍒嗘嫞鎬绘暟
+        calculateTotalAssignQuantity() {
+            return this.unpickedData.reduce((sum, item) => {
+                return sum + (item.assignQuantity || 0)
+            }, 0)
+        },
+
+        // 璁$畻宸插垎鎷f�绘暟
+        calculateTotalSortedQuantity() {
+            return this.unpickedData.reduce((sum, item) => {
+                return sum + (item.sortedQuantity || 0)
+            }, 0)
+        },
+
+        // 璁$畻鏈垎鎷f�绘暟
+        calculateTotalUnsortedQuantity() {
+            return this.unpickedData.reduce((sum, item) => {
+                const assignQty = item.assignQuantity || 0
+                const sortedQty = item.sortedQuantity || 0
+                return sum + Math.max(0, assignQty - sortedQty)
+            }, 0)
+        },
+
+        // 妫�鏌ユ槸鍚﹀寘鍚暣鍑�
+        hasWholeOut() {
+            return this.unpickedData.some(item => item.assignQuantity === item.originalQuantity) && this.matMixed;
+        },
+
+        // 璁$畻鍓╀綑搴撳瓨
+        calculateRemainingStock(row) {
+            const currentStock = row.currentStock || 0
+            const assignQty = row.assignQuantity || 0
+            return Math.max(0, currentStock - assignQty)
+        },
+
+        // 鑾峰彇搴撳瓨鐘舵�佺被鍨�
+        getStockStatusType(row) {
+            const currentStock = row.currentStock || 0
+            const assignQty = row.assignQuantity || 0
+            const sortedQty = row.sortedQuantity || 0
+
+            if (sortedQty >= assignQty) {
+                return 'success' // 宸插畬鎴�
+            } else if (currentStock < assignQty) {
+                return 'danger' // 搴撳瓨涓嶈冻
+            } else {
+                return 'warning' // 杩涜涓�
+            }
+        },
+
+        // 鑾峰彇搴撳瓨鐘舵�佹枃鏈�
+        getStockStatusText(row) {
+            const currentStock = row.currentStock || 0
+            const assignQty = row.assignQuantity || 0
+            const sortedQty = row.sortedQuantity || 0
+
+            if (sortedQty >= assignQty) {
+                return '宸插畬鎴�'
+            } else if (currentStock < assignQty) {
+                return '搴撳瓨涓嶈冻'
+            } else {
+                return '鍒嗘嫞涓�'
+            }
+        },
+
         getStatusType(status) {
             const statusMap = {
                 0: 'info',    // 寰呭鐞�
@@ -802,4 +957,118 @@
 ::v-deep .el-descriptions__content {
     color: #606266;
 }
+
+/* 琛ㄦ牸澧炲己鏍峰紡 */
+::v-deep .el-table th {
+    background-color: #fafafa;
+    font-weight: 600;
+    color: #303133;
+}
+
+::v-deep .el-table .el-text {
+    font-weight: 500;
+}
+
+/* 鏍囩鏍峰紡澧炲己 */
+::v-deep .el-tag--small {
+    font-weight: 500;
+}
+
+/* 鎻愮ず淇℃伅鏍峰紡澧炲己 */
+.scan-alert ::v-deep .el-alert__content {
+    width: 100%;
+}
+
+.scan-alert ::v-deep .el-alert__description {
+    margin-top: 8px;
+}
+
+/* 鍒嗘嫞缁熻淇℃伅鏍峰紡 */
+.picking-stats {
+    margin-top: 20px;
+    padding: 0 10px;
+}
+
+.stats-container {
+    display: flex;
+    flex-wrap: wrap;
+    gap: 12px;
+    align-items: center;
+}
+
+.stat-item {
+    display: inline-flex;
+    align-items: center;
+}
+
+.stat-item .el-tag {
+    display: flex;
+    align-items: center;
+    padding: 6px 12px;
+    font-size: 13px;
+    border-radius: 20px;
+}
+
+.stat-item .el-tag i {
+    margin-right: 6px;
+    font-size: 14px;
+}
+
+.stat-item b {
+    margin-left: 4px;
+    font-size: 14px;
+}
+
+/* 鍒嗗壊绾挎牱寮� */
+::v-deep .el-divider__text {
+    background-color: #f5f5f5;
+    padding: 0 20px;
+}
+
+/* 鎵樼洏搴撳瓨淇℃伅鏍峰紡 */
+.pallet-inventory {
+    margin-top: 20px;
+    padding: 0 10px;
+}
+
+.inventory-container {
+    margin-top: 10px;
+}
+
+.inventory-table {
+    width: 100%;
+}
+
+.inventory-table ::v-deep .el-table__header {
+    background-color: #f0f9ff;
+}
+
+.inventory-table ::v-deep .el-table__header th {
+    background-color: #e1f3ff;
+    color: #1f2937;
+    font-weight: 600;
+    font-size: 12px;
+    padding: 8px 0;
+}
+
+.inventory-table ::v-deep .el-table__body td {
+    padding: 6px 0;
+    font-size: 12px;
+}
+
+.inventory-table ::v-deep .el-table__row {
+    cursor: pointer;
+}
+
+.inventory-table ::v-deep .el-table__row:hover {
+    background-color: #f0f9ff;
+}
+
+/* 搴撳瓨琛ㄦ牸涓殑鏍囩鏍峰紡 */
+.inventory-table ::v-deep .el-tag--mini {
+    font-size: 11px;
+    padding: 1px 6px;
+    height: 18px;
+    line-height: 16px;
+}
 </style>
\ No newline at end of file
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/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.1204.46620/CodeChunks.db" "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/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.1204.46620/CodeChunks.db"
index 2451278..f18394b 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/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.1204.46620/CodeChunks.db"
+++ "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/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.1204.46620/CodeChunks.db"
Binary files differ
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/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.1204.46620/SemanticSymbols.db" "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/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.1204.46620/SemanticSymbols.db"
index 62c47dc..4bceba3 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/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.1204.46620/SemanticSymbols.db"
+++ "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/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.1204.46620/SemanticSymbols.db"
Binary files differ
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_BasicService/BasicService.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_BasicService/BasicService.cs"
index d59f13f..269547c 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_BasicService/BasicService.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_BasicService/BasicService.cs"
@@ -109,7 +109,7 @@
                 throw new Exception($"杞崲鍚庡崟浣嶄笉鑳戒负绌�");
             }
 
-            decimal ratio = 0;
+            decimal ratio = 1;
 
             if (fromUnit.Trim().ToLower() == toUnit.Trim().ToLower())
             {
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_BasicService/MESOperation/FeedbackMesService.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_BasicService/MESOperation/FeedbackMesService.cs"
index c084617..412dba3 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_BasicService/MESOperation/FeedbackMesService.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_BasicService/MESOperation/FeedbackMesService.cs"
@@ -14,6 +14,7 @@
 using WIDESEA_DTO.ReturnMES;
 using WIDESEA_IBasicService;
 using WIDESEA_Model.Models;
+using static HslCommunication.Profinet.Knx.KnxCode;
 
 namespace WIDESEA_BasicService.MESOperation
 {
@@ -23,27 +24,189 @@
         private readonly HttpClientHelper _httpClientHelper;
         private readonly IRepository<Dt_OutboundOrder> _outboundOrderRepository;
         private readonly IBasicService _basicService;
+        private readonly IRepository<Dt_AllocateOrder> _allocateRepository;
 
-        public FeedbackMesService(IRepository<Dt_MesReturnRecord> BaseDal, IUnitOfWorkManage unitOfWorkManage, HttpClientHelper httpClientHelper, IRepository<Dt_OutboundOrder> outboundOrderRepository, IBasicService basicService) : base(BaseDal)
+        public FeedbackMesService(IRepository<Dt_MesReturnRecord> BaseDal, IUnitOfWorkManage unitOfWorkManage, HttpClientHelper httpClientHelper, IRepository<Dt_OutboundOrder> outboundOrderRepository, IBasicService basicService, IRepository<Dt_AllocateOrder> allocateRepository) : base(BaseDal)
         {
             _unitOfWorkManage = unitOfWorkManage;
             _httpClientHelper = httpClientHelper;
             _outboundOrderRepository = outboundOrderRepository;
             _basicService = basicService;
+            _allocateRepository = allocateRepository;
         }
 
-        public void MaterialOutboundFeedback(string orderNo)
+        public WebResponseContent OutboundFeedback(string orderNo)
         {
             try
             {
                 Dt_OutboundOrder outboundOrder = _outboundOrderRepository.Db.Queryable<Dt_OutboundOrder>().Where(x => x.OrderNo == orderNo).Includes(x => x.Details).First();
                 if (outboundOrder == null)
                 {
-                    // todo 璁板綍鏃ュ織锛氭湭鎵惧埌瀵瑰簲鐨勫嚭搴撳崟
-
-                    return;
+                    return WebResponseContent.Instance.Error($"鏈壘鍒板搴旂殑鍑哄簱鍗曚俊鎭�");
+                }
+                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;
+                List<string> lineNos = new List<string>();
+                if (outboundOrder.OrderType == 0)
+                {
+                    MaterialOutboundReturnDTO? returnDTO = BuildOutboundFeedbackData(outboundOrder);
+                    if (returnDTO == null)
+                    {
+                        return WebResponseContent.Instance.Error($"鏋勫缓鍥炶皟瀵硅薄澶辫触");
+                    }
+                    string apiUrl = "";
+                    returnDTO.ReqCode = reqCode;
+                    returnDTO.ReqTime = reqTime;
+                    requestData = returnDTO.Serialize();
+                    lineNos = returnDTO.Details.Select(x => x.LineNo).ToList();
+                    httpResponseResult = _httpClientHelper.Post<MesResponseDTO>(apiUrl, requestData);
+                    httpResponseResult.ApiUrl = apiUrl;
+                }
+                else
+                {
+                    Dt_AllocateOrder allocateOrder = _allocateRepository.QueryFirst(x => x.OrderNo == outboundOrder.OrderNo);
+                    if (allocateOrder == null)
+                    {
+                        return WebResponseContent.Instance.Error($"鏈壘鍒板搴旂殑璋冩嫧鍗�");
+                    }
+                    AllocationReturnDTO? returnDTO = BuildAllocationFeedbackData(outboundOrder, allocateOrder.FromWarehouse, allocateOrder.ToWarehouse);
+                    if (returnDTO == null)
+                    {
+                        return WebResponseContent.Instance.Error($"鏋勫缓鍥炶皟瀵硅薄澶辫触");
+                    }
+                    string apiUrl = "";
+                    returnDTO.ReqCode = reqCode;
+                    returnDTO.ReqTime = reqTime;
+                    requestData = returnDTO.Serialize();
+                    lineNos = returnDTO.Details.Select(x => x.LineNo).ToList();
+                    httpResponseResult = _httpClientHelper.Post<MesResponseDTO>(apiUrl, requestData);
+                    httpResponseResult.ApiUrl = apiUrl;
                 }
 
+                bool isSuccess = httpResponseResult.IsSuccess && httpResponseResult.Data != null && 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 = 1,
+                    OrderId = outboundOrder.Id,
+                    OrderNo = outboundOrder.OrderNo,
+                    OrderType = outboundOrder.OrderType,
+                    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.BeginTran();
+                _unitOfWorkManage.Db.Insertable(mesReturnRecord).ExecuteCommand();
+
+                if (isSuccess)
+                {
+                    List<Dt_OutboundOrderDetail> outboundOrderDetails = outboundOrder.Details.Where(x => lineNos.Contains(x.lineNo)).ToList();
+                    outboundOrderDetails.ForEach(x =>
+                    {
+                        if (x.OverOutQuantity == x.OrderQuantity - x.MoveQty)
+                        {
+                            x.ReturnToMESStatus = isSuccess ? 1 : 2;
+                        }
+                        else
+                        {
+                            x.ReturnToMESStatus = isSuccess ? 3 : 4;
+                        }
+                        x.CurrentDeliveryQty = 0;
+                        x.ReturnJsonData = "";
+                    });
+
+                    _outboundOrderRepository.Db.Updateable(outboundOrderDetails).ExecuteCommand();
+                }
+                
+                _unitOfWorkManage.CommitTran();
+
+                WebResponseContent responseContent = new WebResponseContent();
+                responseContent.Status = isSuccess;
+                responseContent.Message = message;
+                return responseContent;
+            }
+            catch(Exception ex)
+            {
+                return WebResponseContent.Instance.Error(ex.Message);
+            }
+        }
+
+        public AllocationReturnDTO? BuildAllocationFeedbackData(Dt_OutboundOrder outboundOrder, string fromWarehouse, string toWarehouse)
+        {
+            try
+            {
+                List<Dt_OutboundOrderDetail> details = outboundOrder.Details;
+
+                List<AllocationDetail> returnDetails = new List<AllocationDetail>();
+
+                foreach (var detail in details)
+                {
+                    List<Barcodes>? barcodes = JsonConvert.DeserializeObject<List<Barcodes>>(detail.ReturnJsonData);
+                    if (barcodes != null && barcodes.Any())
+                    {
+                        UnitConvertResultDTO currentResult = _basicService.UnitQuantityConvert(detail.MaterielCode, detail.Unit, detail.BarcodeUnit, detail.CurrentDeliveryQty);
+                        UnitConvertResultDTO totalResult = _basicService.UnitQuantityConvert(detail.MaterielCode, detail.Unit, detail.BarcodeUnit, detail.OrderQuantity);
+
+                        returnDetails.Add(new AllocationDetail
+                        {
+                            Barcodes = barcodes,
+                            BatchNo = detail.BatchNo,
+                            LineNo = detail.lineNo,
+                            MaterialCode = detail.MaterielCode,
+                            Qty = totalResult.ToQuantity,
+                            WarehouseCode = detail.WarehouseCode,
+                            Unit = detail.BarcodeUnit
+                        });
+                    }
+                }
+
+                AllocationReturnDTO outboundReturnDTO = new AllocationReturnDTO()
+                {
+                    Business_type = outboundOrder.BusinessType,
+                    Details = returnDetails,
+                    FactoryArea = outboundOrder.FactoryArea,
+                    OperationType = 1,
+                    OrderNo = outboundOrder.OrderNo,
+                    FromWarehouse = fromWarehouse,
+                    ToWarehouse = toWarehouse
+                };
+
+                return outboundReturnDTO;
+
+            }
+            catch (Exception ex)
+            {
+                return null;
+            }
+        }
+
+        public void MaterialOutboundFeedback(Dt_OutboundOrder outboundOrder)
+        {
+            try
+            {
                 MaterialOutboundReturnDTO? returnDTO = BuildOutboundFeedbackData(outboundOrder);
                 if (returnDTO != null)
                 {
@@ -112,7 +275,6 @@
             {
                 throw new Exception(ex.Message);
             }
-
         }
 
         public MaterialOutboundReturnDTO? BuildOutboundFeedbackData(Dt_OutboundOrder outboundOrder)
@@ -125,22 +287,25 @@
 
                 foreach (var detail in details)
                 {
-                    List<Barcodes>? barcodes = JsonConvert.DeserializeObject<List<Barcodes>>(detail.ReturnJsonData);
-                    if (barcodes != null && barcodes.Any())
+                    if (!string.IsNullOrWhiteSpace(detail.ReturnJsonData))
                     {
-                        UnitConvertResultDTO currentResult = _basicService.UnitQuantityConvert(detail.MaterielCode, detail.Unit, detail.BarcodeUnit, detail.CurrentDeliveryQty);
-                        UnitConvertResultDTO totalResult = _basicService.UnitQuantityConvert(detail.MaterielCode, detail.Unit, detail.BarcodeUnit, detail.OrderQuantity);
-
-                        returnDetails.Add(new MaterialOutboundDetail
+                        List<Barcodes>? barcodes = JsonConvert.DeserializeObject<List<Barcodes>>(detail.ReturnJsonData);
+                        if (barcodes != null && barcodes.Any())
                         {
-                            Barcodes = barcodes,
-                            CurrentDeliveryQty = currentResult.ToQuantity,
-                            LineNo = detail.lineNo,
-                            MaterialCode = detail.MaterielCode,
-                            Qty = totalResult.ToQuantity,
-                            WarehouseCode = detail.WarehouseCode,
-                            Unit = detail.BarcodeUnit
-                        });
+                            UnitConvertResultDTO currentResult = _basicService.UnitQuantityConvert(detail.MaterielCode, detail.Unit, detail.BarcodeUnit, detail.CurrentDeliveryQty);
+                            UnitConvertResultDTO totalResult = _basicService.UnitQuantityConvert(detail.MaterielCode, detail.Unit, detail.BarcodeUnit, detail.OrderQuantity);
+
+                            returnDetails.Add(new MaterialOutboundDetail
+                            {
+                                Barcodes = barcodes,
+                                CurrentDeliveryQty = currentResult.ToQuantity,
+                                LineNo = detail.lineNo,
+                                MaterialCode = detail.MaterielCode,
+                                Qty = totalResult.ToQuantity,
+                                WarehouseCode = detail.WarehouseCode,
+                                Unit = detail.BarcodeUnit
+                            });
+                        }
                     }
                 }
 
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_Core/Middlewares/ApiLogMiddleware.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_Core/Middlewares/ApiLogMiddleware.cs"
index d047780..921dfc3 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_Core/Middlewares/ApiLogMiddleware.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_Core/Middlewares/ApiLogMiddleware.cs"
@@ -93,7 +93,7 @@
                     ms.Position = 0;
                     await ms.CopyToAsync(originalBody);
 
-                    if (!ignoreUrls.Any(x => context.Request.Path.Value?.Contains(x) ?? false))
+                    if (!ignoreUrls.Any(x => context.Request.Path.Value?.ToLower().Contains(x.ToLower()) ?? false))
                     {
                         Logger.Add(requestParam, responseParam);
                     }
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_Core/Seed/DBSeed.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_Core/Seed/DBSeed.cs"
index 4a92f35..a4577ea 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_Core/Seed/DBSeed.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_Core/Seed/DBSeed.cs"
@@ -138,33 +138,33 @@
                         }
                         #endregion
                     }
-                    else
-                    {
-                        List<string> columnNames = dbContext.Db.DbMaintenance.GetColumnInfosByTableName(t.Name, false).Select(x => x.DbColumnName).ToList();
-                        if (t.GetProperties().FirstOrDefault(x => !columnNames.Contains(x.Name)) != null)
-                        {
-                            bool isChange = true;
-                            List<PropertyInfo> propertyInfos = t.GetProperties().Where(x => !columnNames.Contains(x.Name)).ToList();
-                            for (int i = 0; i < propertyInfos.Count; i++)
-                            {
-                                PropertyInfo propertyInfo = propertyInfos[i];
-                                SugarColumn? sugarColumn = propertyInfo.GetCustomAttribute<SugarColumn>();
-                                if (sugarColumn != null)
-                                {
-                                    if (!sugarColumn.IsIgnore)
-                                    {
-                                        if (!sugarColumn.IsNullable)
-                                        {
-                                            isChange = false;
-                                            break;
-                                        }
-                                    }
-                                }
-                            }
-                            if (isChange)
-                                dbContext.Db.CodeFirst.InitTables(t);
-                        }
-                    }
+                    //else
+                    //{
+                    //    List<string> columnNames = dbContext.Db.DbMaintenance.GetColumnInfosByTableName(t.Name, false).Select(x => x.DbColumnName).ToList();
+                    //    if (t.GetProperties().FirstOrDefault(x => !columnNames.Contains(x.Name)) != null)
+                    //    {
+                    //        bool isChange = true;
+                    //        List<PropertyInfo> propertyInfos = t.GetProperties().Where(x => !columnNames.Contains(x.Name)).ToList();
+                    //        for (int i = 0; i < propertyInfos.Count; i++)
+                    //        {
+                    //            PropertyInfo propertyInfo = propertyInfos[i];
+                    //            SugarColumn? sugarColumn = propertyInfo.GetCustomAttribute<SugarColumn>();
+                    //            if (sugarColumn != null)
+                    //            {
+                    //                if (!sugarColumn.IsIgnore)
+                    //                {
+                    //                    if (!sugarColumn.IsNullable)
+                    //                    {
+                    //                        isChange = false;
+                    //                        break;
+                    //                    }
+                    //                }
+                    //            }
+                    //        }
+                    //        if (isChange)
+                    //            dbContext.Db.CodeFirst.InitTables(t);
+                    //    }
+                    //}
                 });
                 ConsoleHelper.WriteSuccessLine($"Tables Created Successfully!");
                 Console.WriteLine();
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_Core/Util/HttpClientHelper.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_Core/Util/HttpClientHelper.cs"
index ad490ce..cd7019e 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_Core/Util/HttpClientHelper.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_Core/Util/HttpClientHelper.cs"
@@ -39,7 +39,7 @@
                 SetRequestHeaders(request, config?.Headers);
                 return await client.SendAsync(request);
             }, config, $"POST {url}").Result;
-
+            httpResponseResult.ApiUrl = url;
             return httpResponseResult;
         }
 
@@ -52,6 +52,7 @@
                 return await client.SendAsync(request);
             }, config, $"GET {url}").Result;
 
+            httpResponseResult.ApiUrl = url;
             return httpResponseResult;
         }
 
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_Core/Util/HttpResponseResult.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_Core/Util/HttpResponseResult.cs"
index c95db38..da3a920 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_Core/Util/HttpResponseResult.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_Core/Util/HttpResponseResult.cs"
@@ -46,6 +46,11 @@
         /// 寮傚父淇℃伅
         /// </summary>
         public Exception Exception { get; set; }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public string ApiUrl { get; set; }
     }
 
 
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_DTO/Base/UnitConvertResultDTO.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_DTO/Base/UnitConvertResultDTO.cs"
index b6d6873..ed738a7 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_DTO/Base/UnitConvertResultDTO.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_DTO/Base/UnitConvertResultDTO.cs"
@@ -39,7 +39,7 @@
         /// <summary>
         /// 
         /// </summary>
-        public decimal UnitRatio { get; set; }
+        public decimal UnitRatio { get; set; } = 1;
 
         /// <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_DTO/ReturnMES/AllocationReturnDTO.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_DTO/ReturnMES/AllocationReturnDTO.cs"
new file mode 100644
index 0000000..4e1f69b
--- /dev/null
+++ "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_DTO/ReturnMES/AllocationReturnDTO.cs"
@@ -0,0 +1,92 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace WIDESEA_DTO.ReturnMES
+{
+    /// <summary>
+    /// 
+    /// </summary>
+    public class AllocationReturnDTO : BaseReturnDTO
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        public string OrderNo { get; set; }
+
+        /// <summary>
+        /// 鍘傚尯
+        /// </summary>
+        public string FactoryArea { get; set; }
+
+        /// <summary>
+        /// 涓氬姟绫诲瀷
+        /// </summary>
+        public string Business_type { get; set; }
+
+        /// <summary>
+        /// 1鏂板2淇敼3鍒犻櫎
+        /// </summary>
+        public int OperationType { get; set; }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public string FromWarehouse { get; set; }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public string ToWarehouse { get; set; }
+
+        /// <summary>
+        /// 鏄庣粏
+        /// </summary>
+        public List<AllocationDetail> Details { get; set; }
+    }
+
+
+    /// <summary>
+    /// 鏄庣粏
+    /// </summary>
+    public class AllocationDetail
+    {
+        /// <summary>
+        /// 鐗╂枡缂栫爜
+        /// </summary>
+        public string MaterialCode { get; set; }
+
+        /// <summary>
+        /// 琛屽彿
+        /// </summary>
+        public string LineNo { get; set; }
+
+        /// <summary>
+        /// 鏁伴噺
+        /// </summary>
+        public decimal Qty { get; set; }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public string BatchNo { get; set; }
+
+        /// <summary>
+        /// 浠撳簱
+        /// </summary>
+        public string WarehouseCode { get; set; }
+
+        /// <summary>
+        /// 鍗曚綅
+        /// </summary>
+        public string Unit { get; set; }
+
+        /// <summary>
+        /// 鏉$爜淇℃伅
+        /// </summary>
+        public List<Barcodes> Barcodes { get; set; }
+    }
+
+}
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_DTO/ReturnMES/FeedbackMesResult.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_DTO/ReturnMES/FeedbackMesResult.cs"
new file mode 100644
index 0000000..9d333d5
--- /dev/null
+++ "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_DTO/ReturnMES/FeedbackMesResult.cs"
@@ -0,0 +1,15 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace WIDESEA_DTO.ReturnMES
+{
+    /// <summary>
+    /// 
+    /// </summary>
+    public class FeedbackMesResult
+    {
+    }
+}
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_IBasicService/MESOperation/IFeedbackMesService.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_IBasicService/MESOperation/IFeedbackMesService.cs"
index d25a817..bd0825b 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_IBasicService/MESOperation/IFeedbackMesService.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_IBasicService/MESOperation/IFeedbackMesService.cs"
@@ -9,6 +9,6 @@
 {
     public interface IFeedbackMesService : IDependency
     {
-        void MaterialOutboundFeedback(string orderNo);
+        WebResponseContent OutboundFeedback(string orderNo);
     }
 }
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_Model/Models/Outbound/Dt_OutboundOrderDetail.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_Model/Models/Outbound/Dt_OutboundOrderDetail.cs"
index 47e75c2..d38c497 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_Model/Models/Outbound/Dt_OutboundOrderDetail.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_Model/Models/Outbound/Dt_OutboundOrderDetail.cs"
@@ -90,28 +90,28 @@
         /// 鎸枡鏁伴噺
         /// 榛樿鍊�:
         ///</summary>
-        [SugarColumn(ColumnName = "MoveQty", ColumnDescription = "鎸枡鏁伴噺", IsNullable = true)]
+        [SugarColumn(ColumnDescription = "鎸枡鏁伴噺", IsNullable = true)]
         public decimal MoveQty { get; set; }
 
         /// <summary>
         /// 渚涘簲鍟嗙紪鍙�
         /// 榛樿鍊�:
         ///</summary>
-        [SugarColumn(ColumnName = "supplyCode", ColumnDescription = "渚涘簲鍟嗙紪鍙�", IsNullable = true)]
+        [SugarColumn(ColumnDescription = "渚涘簲鍟嗙紪鍙�", IsNullable = true)]
         public string? SupplyCode { get; set; }
 
         /// <summary>
         /// 鏁伴噺
         /// 榛樿鍊�:
         ///</summary>
-        [SugarColumn(ColumnName = "barcodeQty", ColumnDescription = "鏁伴噺", DefaultValue = "0", IsNullable = true)]
+        [SugarColumn(ColumnDescription = "鏁伴噺", DefaultValue = "0", IsNullable = true)]
         public decimal BarcodeQty { get; set; }
 
         /// <summary>
         /// 鍗曚綅
         /// 榛樿鍊�:
         ///</summary>
-        [SugarColumn(ColumnName = "barcodeUnit", ColumnDescription = "鍗曚綅", IsNullable = true)]
+        [SugarColumn(ColumnDescription = "鍗曚綅", IsNullable = true)]
         public string BarcodeUnit { get; set; } = null!;
 
 
@@ -119,13 +119,13 @@
         ///  
         /// 榛樿鍊�:
         ///</summary>
-        [SugarColumn(ColumnName = "barcodemoveQty", ColumnDescription = "鏁伴噺", DefaultValue = "0", IsNullable = true)]
+        [SugarColumn(ColumnDescription = "鏁伴噺", DefaultValue = "0", IsNullable = true)]
         public decimal BarcodeMoveQty { get; set; }
         /// <summary>
         /// 浠撳簱
         /// 榛樿鍊�:
         ///</summary>
-        [SugarColumn(ColumnName = "warehouseCode", ColumnDescription = "浠撳簱", IsNullable = true)]
+        [SugarColumn(ColumnDescription = "浠撳簱", IsNullable = true)]
         public string? WarehouseCode { get; set; }
 
         /// <summary>
@@ -142,7 +142,7 @@
         [SugarColumn(IsIgnore = true)]
         public decimal NeedOutQuantity => OrderQuantity - MoveQty;
 
-        [SugarColumn(IsNullable = true, ColumnDescription = "")]
+        [SugarColumn(IsNullable = true, ColumnDescription = "", IsIgnore = true)]
         public decimal PickedQty { get; set; }
 
         [SugarColumn(IsNullable = true, ColumnDescription = "")]
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/OutboundOrderDetailService.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/OutboundOrderDetailService.cs"
index 5acca1f..250becf 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/OutboundOrderDetailService.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/OutboundOrderDetailService.cs"
@@ -642,8 +642,6 @@
                             }
                         }
                     }
-
-
                 }
             }
             return new PageGridData<Dt_OutboundOrderDetail>();
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/OutboundQueryService.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/OutboundQueryService.cs"
index 1c71196..956e03f 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/OutboundQueryService.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/OutboundQueryService.cs"
@@ -18,8 +18,19 @@
         {
             try
             {
+                Dt_StockInfo stockInfo = _stockInfoRepository.Db.Queryable<Dt_StockInfo>().Where(x => x.PalletCode == palletCode).Includes(x => x.Details).First();
+
+                bool isMatMixed = stockInfo.Details.GroupBy(x => new
+                {
+                    x.MaterielCode,
+                    x.MaterielName,
+                    x.BatchNo,
+                    x.SupplyCode,
+                    x.WarehouseCode
+                }).Count() > 1;
+
                 List<Dt_OutStockLockInfo> outStockLockInfos = _outboundLockInfoRepository.QueryData(x => x.PalletCode == palletCode && x.OrderNo == orderNo);
-                return WebResponseContent.Instance.OK(data: outStockLockInfos);
+                return WebResponseContent.Instance.OK(data: new { outStockLockInfos, stockInfo, isMatMixed });
             }
             catch (Exception ex)
             {
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/OutboundService.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/OutboundService.cs"
index aa37561..5554dbb 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/OutboundService.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/OutboundService.cs"
@@ -138,14 +138,18 @@
 
                     pickedDetails.AddRange(materielPickedDetails.PickedDetails);
 
+                    decimal allallocatedQuantity = materielCalc.UnallocatedQuantity;
                     // 鏇存柊鍑哄簱鍗曟槑缁嗭紙澧炲姞閿佸畾鏁伴噺锛屼笉澧炲姞宸插嚭鏁伴噺锛�
                     foreach (var detail in materielCalc.Details)
                     {
+                        if (allallocatedQuantity <= 0) break;
+
                         decimal lockQuantity = (detail.OrderQuantity - detail.OverOutQuantity);
                         if (lockQuantity < materielCalc.UnallocatedQuantity)
                         {
                             detail.LockQuantity += lockQuantity; // 澧炲姞閿佸畾鏁伴噺 涓嶆洿鏂� OverOutQuantity 鍜� OrderDetailStatus锛屽洜涓鸿繕娌℃湁瀹為檯鍑哄簱
                             outboundOrderDetails.Add(detail);
+                            materielCalc.UnallocatedQuantity -= lockQuantity;
                         }
                         else
                         {
@@ -267,6 +271,18 @@
                         return result;
                     }
 
+                    decimal inputQuantity = request.OutboundQuantity.Value;
+                    List<Dt_OutboundOrderDetail> outboundOrderDetails = new List<Dt_OutboundOrderDetail>();
+                    foreach (var item in selectedDetails)
+                    {
+                        inputQuantity -= (item.OrderQuantity - item.MoveQty - item.LockQuantity);
+                        outboundOrderDetails.Add(item);
+                        if (inputQuantity <= 0)
+                        {
+                            break;
+                        }
+                    }
+
                     result.MaterielCalculations = new List<MaterielOutboundCalculationDTO>()
                     {
                         new MaterielOutboundCalculationDTO
@@ -281,9 +297,11 @@
                             AssignedQuantity = lockQuantity,
                             UnallocatedQuantity = request.OutboundQuantity.Value,
                             MovedQuantity = moveQuantity,
-                            Details = selectedDetails
+                            Details = outboundOrderDetails
                         }
                     };
+
+                    outboundOrder.Details = outboundOrderDetails;
                 }
 
                 result.CanOutbound = true;
@@ -790,7 +808,7 @@
         }
         #endregion
 
-
+        #region 鎷i��
         /// <summary>
         /// 鍑哄簱瀹屾垚澶勭悊锛堟壂鎻忔潯鐮佹墸鍑忓簱瀛橈級
         /// </summary>
@@ -885,12 +903,12 @@
                     return WebResponseContent.Instance.Error($"鏃犳硶鍑哄簱锛屾潯鐮侊細{request.Barcode}锛屽簱瀛橈細{stockDetail.StockQuantity}锛屽凡鍑哄簱锛歿totalAllocatedQuantity}锛屽垎閰嶉噺锛歿lockInfo.AssignQuantity}锛屾槑缁嗗墿浣欙細{detailRemainingQuantity}");
                 }
 
-                if (actualOutboundQuantity + lockInfo.SortedQuantity > lockInfo.AssignQuantity)
-                {
-                    response.Success = false;
-                    response.Message = $"鏃犳硶鍑哄簱锛屾潯鐮侊細{request.Barcode}锛屽簱瀛橈細{stockDetail.StockQuantity}锛屽嚭搴撻噺{actualOutboundQuantity + lockInfo.SortedQuantity}澶т簬鍒嗛厤閲弡lockInfo.AssignQuantity}";
-                    return WebResponseContent.Instance.Error($"鏃犳硶鍑哄簱锛屾潯鐮侊細{request.Barcode}锛屽簱瀛橈細{stockDetail.StockQuantity}锛屽嚭搴撻噺{actualOutboundQuantity + lockInfo.SortedQuantity}澶т簬鍒嗛厤閲弡lockInfo.AssignQuantity}");
-                }
+                //if (actualOutboundQuantity + lockInfo.SortedQuantity > lockInfo.AssignQuantity)
+                //{
+                //    response.Success = false;
+                //    response.Message = $"鏃犳硶鍑哄簱锛屾潯鐮侊細{request.Barcode}锛屽簱瀛橈細{stockDetail.StockQuantity}锛屽嚭搴撻噺{actualOutboundQuantity + lockInfo.SortedQuantity}澶т簬鍒嗛厤閲弡lockInfo.AssignQuantity}";
+                //    return WebResponseContent.Instance.Error($"鏃犳硶鍑哄簱锛屾潯鐮侊細{request.Barcode}锛屽簱瀛橈細{stockDetail.StockQuantity}锛屽嚭搴撻噺{actualOutboundQuantity + lockInfo.SortedQuantity}澶т簬鍒嗛厤閲弡lockInfo.AssignQuantity}");
+                //}
 
                 // 8. 鍒ゆ柇鏄惁闇�瑕佹媶鍖咃紙褰撳嚭搴撴暟閲忓皬浜庡簱瀛樻暟閲忔椂闇�瑕佹媶鍖咃級
                 bool isUnpacked = actualOutboundQuantity < stockDetail.StockQuantity;
@@ -930,6 +948,8 @@
                         //    item.OverOutQuantity = item.OrderQuantity - item.MoveQty;
                         //}
 
+                        decimal barcodeQuantity = allocatedQuantity;
+
                         if (item.LockQuantity - item.OverOutQuantity >= allocatedQuantity)
                         {
                             item.OverOutQuantity += allocatedQuantity;
@@ -938,6 +958,7 @@
                         }
                         else
                         {
+                            barcodeQuantity = item.LockQuantity - item.OverOutQuantity;
                             allocatedQuantity -= (item.LockQuantity - item.OverOutQuantity);
                             item.OverOutQuantity = item.LockQuantity;
                             item.CurrentDeliveryQty = item.LockQuantity;
@@ -949,7 +970,7 @@
                         Barcodes barcodes = new Barcodes
                         {
                             Barcode = request.Barcode,
-                            Qty = actualOutboundQuantity,
+                            Qty = barcodeQuantity,
                             SupplyCode = stockDetail?.SupplyCode ?? "",
                             BatchNo = stockDetail?.BatchNo ?? "",
                             Unit = stockDetail?.Unit ?? ""
@@ -1012,6 +1033,7 @@
                     if (CheckOutboundOrderCompleted(request.OrderNo))
                     {
                         UpdateOutboundOrderStatus(request.OrderNo, OutOrderStatusEnum.鍑哄簱瀹屾垚.ObjToInt());
+
 
                         //todo: 鍥炰紶MES
                     }
@@ -1325,5 +1347,7 @@
             // 妫�鏌ユ墍鏈夋槑缁嗙殑宸插嚭鏁伴噺鏄惁閮界瓑浜庡崟鎹暟閲�
             return details.All(x => x.OverOutQuantity >= x.OrderQuantity - x.MoveQty);
         }
+
+        #endregion
     }
 }
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/Basic/MesFeedbackController.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/Basic/MesFeedbackController.cs"
new file mode 100644
index 0000000..68826cb
--- /dev/null
+++ "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/Basic/MesFeedbackController.cs"
@@ -0,0 +1,24 @@
+锘縰sing Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
+using WIDESEA_Core;
+using WIDESEA_IBasicService;
+
+namespace WIDESEA_WMSServer.Controllers.Basic
+{
+    [Route("api/[controller]")]
+    [ApiController]
+    public class MesFeedbackController : ControllerBase
+    {
+        private readonly IFeedbackMesService _feedbackMesService;
+        public MesFeedbackController(IFeedbackMesService feedbackMesService)
+        {
+            _feedbackMesService = feedbackMesService;
+        }
+
+        [HttpPost, HttpGet, Route("OutboundFeedback")]
+        public WebResponseContent OutboundFeedback(string orderNo)
+        {
+            return _feedbackMesService.OutboundFeedback(orderNo);
+        }
+    }
+}
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/OutboundController.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/OutboundController.cs"
index dab5a3a..8535a25 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/OutboundController.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/OutboundController.cs"
@@ -40,17 +40,22 @@
             }
         }
 
+        object lockObj = new object();
+
         [HttpPost, Route("CompleteOutboundWithBarcode"), AllowAnonymous]
         public WebResponseContent CompleteOutboundWithBarcode([FromBody] OutboundCompleteRequestDTO request)
         {
             try
             {
-                if (!ModelState.IsValid)
-                    return WebResponseContent.Instance.Error(string.Join("; ", ModelState.Values
-                        .SelectMany(v => v.Errors)
-                        .Select(e => e.ErrorMessage)));
+                lock (lockObj)
+                {
+                    if (!ModelState.IsValid)
+                        return WebResponseContent.Instance.Error(string.Join("; ", ModelState.Values
+                            .SelectMany(v => v.Errors)
+                            .Select(e => e.ErrorMessage)));
 
-                return _outboundService.CompleteOutboundWithBarcode(request);
+                    return _outboundService.CompleteOutboundWithBarcode(request);
+                }
             }
             catch (Exception ex)
             {

--
Gitblit v1.9.3