From 68628c6cc163cddfcc745c225a9f3f34767261ef Mon Sep 17 00:00:00 2001
From: 647556386 <647556386@qq.com>
Date: 星期六, 22 十一月 2025 20:44:40 +0800
Subject: [PATCH] Merge branch 'master' of http://115.159.85.185:8098/r/ZhongRui/ALDbanyunxiangmu

---
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Allocate/AllocateOrderController.cs          |   21 
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_DTO/Allocate/AllocateDto.cs                                        |    9 
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_OutboundService/OutStockLockInfoService.cs                         |   63 
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Inbound/InboundOrderController.cs            |    6 
 项目代码/WIDESEA_WMSClient/src/router/viewGird.js                                                             |   11 
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_IBasicService/IInvokeMESService.cs                                 |    2 
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_IOutboundService/IOutboundPickingService.cs                        |   15 
 项目代码/WMS无仓储版/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.878.3237/SemanticSymbols.db-shm |    0 
 项目代码/WIDESEA_WMSClient/src/views/inbound/allocateinboundOrder.vue                                         |  397 +++
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_Model/Models/Outbound/Dt_OutboundLockInfo.cs                       |    3 
 项目代码/WIDESEA_WMSClient/src/extension/outbound/extend/printView.vue                                        |  588 +++++
 项目代码/WIDESEA_WMSClient/src/views/outbound/allocateoutboundOrder.vue                                       |  443 ++++
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_InboundService/InboundOrderService.cs                              |   11 
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_IOutboundService/IOutStockLockInfoService.cs                       |    2 
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_IBasicService/IMaterielToMesService.cs                             |    3 
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs                                     |  127 +
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_Model/Models/Basic/Dt_MaterielToMes.cs                             |    2 
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_Common/StockEnum/StockStatusEmun.cs                                |    2 
 项目代码/WIDESEA_WMSClient/src/views/inbound/inboundOrder.vue                                                 |    4 
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Outbound/OutboundPickingController.cs        |   56 
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_BasicService/MaterielToMesService.cs                               |   53 
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_Outbound.cs                            |  203 ++
 项目代码/WIDESEA_WMSClient/src/views/outbound/PickingConfirm.vue                                              |   17 
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_Common/StockEnum/OutLockStockStatusEnum.cs                         |    2 
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundPickingService.cs                          | 2670 ++++++++++++++-----------
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_TaskInfoService/WIDESEA_TaskInfoService.csproj                     |    1 
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_DTO/Outbound/OutboundOrderGetDTO.cs                                |   38 
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_BasicService/LocationInfoService.cs                                |   14 
 项目代码/WMS无仓储版/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.878.3237/CodeChunks.db-shm      |    0 
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_IStockService/IStockInfoService.cs                                 |    2 
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/TaskInfo/TaskController.cs                   |   12 
 项目代码/WIDESEA_WMSClient/src/extension/inbound/inboundOrder.js                                              |    1 
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundOrderDetailService.cs                      |   72 
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_OutboundService/SplitPackageService.cs                             |  209 -
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoService.cs                                   |    6 
 项目代码/WIDESEA_WMSClient/src/extension/inbound/allocateinboundOrder.js                                      |  456 ++++
 项目代码/WIDESEA_WMSClient/src/extension/outbound/allocateoutboundOrder.js                                    |  374 +++
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_IOutboundService/IOutboundOrderDetailService.cs                    |    2 
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_ITaskInfoService/ITaskService.cs                                   |    5 
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_BasicService/InvokeMESService.cs                                   |   41 
 40 files changed, 4,448 insertions(+), 1,495 deletions(-)

diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/inbound/allocateinboundOrder.js" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/inbound/allocateinboundOrder.js"
new file mode 100644
index 0000000..0ec3d7d
--- /dev/null
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/inbound/allocateinboundOrder.js"
@@ -0,0 +1,456 @@
+
+//姝s鏂囦欢鏄敤鏉ヨ嚜瀹氫箟鎵╁睍涓氬姟浠g爜锛屽彲浠ユ墿灞曚竴浜涜嚜瀹氫箟椤甸潰鎴栬�呴噸鏂伴厤缃敓鎴愮殑浠g爜
+import http from '@/api/http.js'
+import { h,createVNode, render,reactive,ref  } from 'vue';
+import { ElDialog , ElForm, ElFormItem, ElInput, ElButton, ElMessage ,ElSelect ,ElOption } from 'element-plus'; // 寮曞叆ElMessage锛岃В鍐虫彁绀烘棤鍙嶅簲
+
+let extension = {
+    components: {
+      //鏌ヨ鐣岄潰鎵╁睍缁勪欢
+      gridHeader: '',
+      gridBody: '',
+      gridFooter: '',
+      //鏂板缓銆佺紪杈戝脊鍑烘鎵╁睍缁勪欢
+      modelHeader: '',
+      modelBody: '',
+      modelFooter: ''
+    },
+    tableAction: '', //鎸囧畾鏌愬紶琛ㄧ殑鏉冮檺(杩欓噷濉啓琛ㄥ悕,榛樿涓嶇敤濉啓)
+    buttons: { view: [
+       {
+        name: '缁勭洏',
+        type: 'primary',
+        value: '缁勭洏',
+        onClick: function () { // 淇1锛氱Щ闄ゆ棤鐢╮ow鍙傛暟锛屽姞鏃ュ織璋冭瘯
+          console.log('缁勭洏鎸夐挳琚偣鍑伙紝寮�濮嬫牎楠�');
+          const selectedRows = this.$refs.table.getSelected();
+
+          // 鏍¢獙1锛氭槸鍚﹂�変腑琛�
+          if (selectedRows.length === 0) {
+            console.log('鏍¢獙涓嶉�氳繃锛氭湭閫変腑浠讳綍鍗曟嵁');
+            ElMessage.warning('璇烽�夋嫨涓�鏉″崟鎹�');
+            return;
+          }
+          // 鏍¢獙2锛氭槸鍚﹂�変腑鍗曡
+          if (selectedRows.length > 1) {
+            console.log('鏍¢獙涓嶉�氳繃锛氶�変腑澶氳鍗曟嵁');
+            ElMessage.warning('鍙兘閫夋嫨涓�鏉″崟鎹�');
+            return;
+          }
+
+          const targetRow = selectedRows[0];
+     
+          this.$emit('openPalletDialog', targetRow.inboundOrderNo);
+        }
+      },
+      {
+                name: '鎾ら攢缁勭洏',
+                type: 'primary',
+                value: '鎾ら攢缁勭洏',
+                onClick: function () {
+                    console.log('鎾ら攢缁勭洏鎸夐挳琚偣鍑�');
+                    const mountNode = document.createElement('div');
+                    document.body.appendChild(mountNode);
+
+                    // 鍝嶅簲寮忚〃鍗曟暟鎹細鎵樼洏鍙凤紙蹇呭~锛�
+                    const formData = reactive({
+                        palletCode: '' // 鎵樼洏鍙疯緭鍏ユ
+                    });
+
+                    // 鎻愪氦琛ㄥ崟鐨勭粺涓�閫昏緫
+                    const submitForm = async () => {
+                        const formRef = vnode.component.refs.cancelPalletForm;
+                        try {
+                            // 鎵ц琛ㄥ崟鏍¢獙锛堟墭鐩樺彿蹇呭~锛�
+                            await formRef.validate();
+                        } catch (err) {
+                            ElMessage.warning('璇疯緭鍏ユ湁鏁堢殑鎵樼洏鍙�');
+                            return;
+                        }
+
+                        // 鍙戣捣鎾ら攢缁勭洏璇锋眰
+                        try {
+                            //console.log('鍙戣捣鎾ら攢缁勭洏璇锋眰锛屾墭鐩樺彿锛�', formData.palletCode.trim());
+                            const response = await http.post('/api/InboundOrder/CancelPalletGroup', {
+                                palletCode: formData.palletCode.trim()
+                            });
+
+                            const { status, message, data } = response;
+                            if (status) {
+                                ElMessage.success(`鎾ら攢缁勭洏鎴愬姛锛屾墭鐩樺彿锛�${formData.palletCode.trim()}`);
+                                this.refresh(); // 鎴愬姛鍚庡埛鏂板垪琛�
+                                // 鍏抽棴瀵硅瘽妗�
+                                render(null, mountNode);
+                                document.body.removeChild(mountNode);
+                            } else {
+                                console.log('鎾ら攢缁勭洏澶辫触锛屽悗绔彁绀猴細', message);
+                                ElMessage.error(message || data?.message || '鎾ら攢缁勭洏澶辫触');
+                                selectPalletCodeInput(); // 閫変腑杈撳叆妗嗘柟渚块噸鏂拌緭鍏�
+                            }
+                        } catch (error) {
+                            console.error('鎾ら攢缁勭洏璇锋眰寮傚父锛�', error);
+                            ElMessage.error('缃戠粶寮傚父鎴栨帴鍙i敊璇紝璇风◢鍚庨噸璇�');
+                            selectPalletCodeInput();
+                        }
+                    };
+
+                    // 閫変腑杈撳叆妗嗘枃鏈紙鏂逛究閲嶆柊杈撳叆锛�
+                    const selectPalletCodeInput = () => {
+                        setTimeout(() => {
+                            const inputRef = vnode.component.refs.palletCodeInput;
+                            if (inputRef) {
+                                const targetInput = inputRef.$el?.querySelector('input') || inputRef;
+                                targetInput?.focus();
+                                targetInput?.select();
+                            }
+                        }, 100);
+                    };
+
+                    // 鍒涘缓瀵硅瘽妗哣Node
+                    const vnode = createVNode(ElDialog, {
+                        title: '鎾ら攢缁勭洏',
+                        width: '400px',
+                        modelValue: true,
+                        appendToBody: true,
+                        onOpened: () => {
+                            // 瀵硅瘽妗嗘墦寮�鍚庤嚜鍔ㄨ仛鐒﹁緭鍏ユ
+                            setTimeout(() => {
+                                const inputRef = vnode.component.refs.palletCodeInput;
+                                inputRef?.focus();
+                            }, 100);
+                        },
+                        'onUpdate:modelValue': (isVisible) => {
+                            if (!isVisible) {
+                                render(null, mountNode);
+                                document.body.removeChild(mountNode);
+                            }
+                        }
+                    }, {
+                        default: () => h(ElForm, {
+                            model: formData,
+                            rules: {
+                                palletCode: [
+                                    { required: true, message: '璇疯緭鍏ユ墭鐩樺彿', trigger: ['blur', 'enter'] },
+                                    { min: 1, max: 50, message: '鎵樼洏鍙烽暱搴︿笉鑳借秴杩�50涓瓧绗�', trigger: ['blur', 'input'] }
+                                ]
+                            },
+                            ref: 'cancelPalletForm'
+                        }, [
+                            // 鎵樼洏鍙疯緭鍏ラ」
+                            h(ElFormItem, { label: '鎵樼洏鍙�', prop: 'palletCode', required: true }, [
+                                h(ElInput, {
+                                    type: 'text',
+                                    modelValue: formData.palletCode,
+                                    'onUpdate:modelValue': (val) => {
+                                        formData.palletCode = val;
+                                    },
+                                    ref: 'palletCodeInput',
+                                    placeholder: '鎵爜杈撳叆鎴栨墜鍔ㄨ緭鍏ユ墭鐩樺彿',
+                                    maxLength: 50,
+                                    // 鐩戝惉鍥炶溅浜嬩欢锛堟壂鐮佹灙榛樿浼氬彂閫佸洖杞︼級
+                                    onKeydown: (e) => {
+                                        if (e.key === 'Enter') {
+                                            e.preventDefault();
+                                            submitForm();
+                                        }
+                                    }
+                                })
+                            ]),
+                            // 搴曢儴鎸夐挳鍖�
+                            h('div', { style: { textAlign: 'right', marginTop: '16px' } }, [
+                                h(ElButton, {
+                                    type: 'text',
+                                    onClick: () => {
+                                        render(null, mountNode);
+                                        document.body.removeChild(mountNode);
+                                        ElMessage.info('鍙栨秷鎾ら攢缁勭洏');
+                                    }
+                                }, '鍙栨秷'),
+                                h(ElButton, {
+                                    type: 'primary',
+                                    onClick: submitForm.bind(this) // 缁戝畾this涓婁笅鏂�
+                                }, '纭鎾ら攢')
+                            ])
+                        ])
+                    });
+
+                    vnode.appContext = this.$.appContext;
+                    render(vnode, mountNode);
+                }
+            },
+      {
+  name: '鍒嗘壒鍏ュ簱',
+  type: 'primary',
+  value: '鍒嗘壒鍏ュ簱',
+  onClick: async function () { 
+    console.log('鍒嗘壒鍏ュ簱鎸夐挳琚偣鍑伙紝寮�濮嬫牎楠�');
+    const selectedRows = this.$refs.table.getSelected();
+
+    // 鏍¢獙1锛氭槸鍚﹂�変腑琛岋紙鑷冲皯閫夋嫨涓�鏉★級
+    if (selectedRows.length === 0) {
+      console.log('鏍¢獙涓嶉�氳繃锛氭湭閫変腑浠讳綍鍗曟嵁');
+      ElMessage.warning('璇烽�夋嫨鑷冲皯涓�鏉″崟鎹�');
+      return;
+    }
+
+    // 鏀堕泦鎵�鏈夐�変腑鍗曟嵁鐨勭紪鍙凤紙杩囨护鏃犲崟鎹彿鐨勫紓甯歌锛�
+    const inboundOrderNos = selectedRows
+      .filter(row => row.inboundOrderNo)
+      .map(row => row.inboundOrderNo);
+
+    // 鏍¢獙2锛氭槸鍚︽湁鏈夋晥鍗曟嵁鍙�
+    if (inboundOrderNos.length === 0) {
+      console.log('鏍¢獙涓嶉�氳繃锛氶�変腑鍗曟嵁鏃犳湁鏁堢紪鍙�');
+      ElMessage.warning('閫変腑鐨勫崟鎹腑鏃犳湁鏁堢紪鍙凤紝璇烽噸鏂伴�夋嫨');
+      return;
+    }
+
+    try {
+      console.log('鍙戣捣鍒嗘壒鍏ュ簱璇锋眰锛屽弬鏁帮細', { inboundOrderNos});
+      const response = await http.post('/api/InboundOrder/BatchOrderFeedbackToMes', {
+        orderNos: inboundOrderNos, 
+        inout:1
+      });
+
+      const { status, message, data } = response;
+      if (status) {
+        console.log('鍒嗘壒鍏ュ簱鎴愬姛锛屽悗绔繑鍥烇細', data);
+        ElMessage.success(`鍒嗘壒鍏ュ簱鎴愬姛锛佸叡澶勭悊${inboundOrderNos.length}鏉″崟鎹甡);
+        this.refresh(); // 鍏ュ簱鎴愬姛鍚庡埛鏂板垪琛紙澶嶇敤鍘熸湁閫昏緫锛�
+      } else {
+        console.log('鍒嗘壒鍏ュ簱澶辫触锛屽悗绔彁绀猴細', message);
+        ElMessage.error(message || data?.message || '鍒嗘壒鍏ュ簱澶辫触');
+      }
+    } catch (error) {
+      console.error('鍒嗘壒鍏ュ簱璇锋眰寮傚父锛�', error);
+      ElMessage.error('缃戠粶寮傚父鎴栨帴鍙i敊璇紝璇风◢鍚庨噸璇�');
+    }
+  }
+},
+     {
+  name: '绌烘墭鐩樺叆搴�',
+  type: 'primary',
+  value: '绌烘墭鐩樺叆搴�',
+  
+  onClick: function () {
+    const mountNode = document.createElement('div');
+    document.body.appendChild(mountNode);
+
+    // 鍝嶅簲寮忚〃鍗曟暟鎹細鏂欑鐮侊紙蹇呭~锛屾壂鐮佹灙/鎵嬪姩杈撳叆锛�
+    const formData = reactive({ 
+      boxCode: '',
+      warehouseCode:''
+    });
+
+    const warehouses = ref([]);
+    const isLoadingWarehouses = ref(false);
+
+    const getWarehouseList = async () => {
+      isLoadingWarehouses.value = true;
+      try {
+        const { data, status } = await http.post('/api/LocationInfo/GetLocationTypes'); 
+        if (status && Array.isArray(data)) {
+          // 鏍煎紡鍖栦粨搴撻�夐」锛氶�傞厤ElSelect鐨刲abel-value鏍煎紡
+          warehouses.value = data.map(item => ({
+            label: item.locationTypeDesc,
+            value: item.locationType  
+          }));
+        } else {
+          ElMessage.error('鑾峰彇鍖哄煙鍒楄〃澶辫触');
+          warehouses.value = [];
+        }
+      } catch (err) {
+        ElMessage.error('鍖哄煙鏁版嵁璇锋眰寮傚父锛岃绋嶅悗閲嶈瘯');
+        warehouses.value = [];
+      } finally {
+        isLoadingWarehouses.value = false;
+      }
+    };
+
+    // 鎻愪氦琛ㄥ崟鐨勭粺涓�閫昏緫锛堜緵鍥炶溅瑙﹀彂鍜屾寜閽偣鍑诲叡鐢級
+    const submitForm = async () => {
+      const formRef = vnode.component.refs.batchInForm;
+      try {
+        // 鎵ц琛ㄥ崟鏍¢獙锛堟枡绠辩爜蹇呭~锛�
+        await formRef.validate();
+      } catch (err) {
+        ElMessage.warning('璇疯緭鍏ユ湁鏁堢殑鏂欑鐮�');
+        return;
+      }
+
+      
+      http.post('/api/InboundOrder/EmptyMaterielGroup', {
+        palletCode: formData.boxCode.trim(),
+        warehouseCode:formData.warehouseCode
+      }).then(({ data, status, message }) => {
+        if (status) {
+          ElMessage.success(`鍏ュ簱鎴愬姛锛屾枡绠辩爜锛�${formData.boxCode.trim()}`);
+          this.refresh(); 
+          formData.boxCode = ''; 
+          
+          setTimeout(() => {
+            const inputRef = vnode.component.refs.boxCodeInput;
+            inputRef?.focus();
+          }, 100);
+        } else {
+          ElMessage.error(message || data?.message || '鍏ュ簱澶辫触');
+          selectBoxCodeInput();
+        }
+      }).catch(() => {
+        ElMessage.error('璇锋眰澶辫触锛岃绋嶅悗閲嶈瘯');
+        selectBoxCodeInput();
+      });
+    };
+
+    const selectBoxCodeInput = () => {
+      setTimeout(() => {
+        const inputRef = vnode.component.refs.boxCodeInput;
+        if (inputRef) {
+          const targetInput = inputRef.$el?.querySelector('input') || inputRef;
+          targetInput?.focus(); 
+          targetInput?.select(); 
+        }
+  }, 100);
+}
+    const vnode = createVNode(ElDialog, {
+      title: '绌烘墭鐩樺叆搴�',
+      width: '400px',
+      modelValue: true,
+      appendToBody: true,
+      
+      onOpened: async () => {
+        await getWarehouseList();
+        const inputRef = vnode.component.refs.boxCodeInput;
+        inputRef?.focus();
+      },
+      'onUpdate:modelValue': (isVisible) => {
+        if (!isVisible) {
+          render(null, mountNode);
+          document.body.removeChild(mountNode);
+        }
+      }
+    }, {
+      default: () => h(ElForm, {
+        model: formData,
+        rules: {
+          boxCode: [
+            { required: true, message: '璇疯緭鍏ユ枡绠辩爜', trigger: ['blur', 'enter'] }
+          ],
+          warehouseCode:[
+            { required: true, message: '璇烽�夋嫨鍖哄煙', trigger: ['change', 'blur'] }
+          ]
+        },
+        ref: 'batchInForm'
+      }, [
+        //浠撳簱鏁版嵁
+        h(ElFormItem, { label: '鍖哄煙', prop: 'warehouseCode', required: true }, [
+          h(ElSelect, {
+            modelValue: formData.warehouseCode,
+            'onUpdate:modelValue': (val) => {
+              formData.warehouseCode = val;
+            },
+            placeholder: '璇烽�夋嫨鍏ュ簱鍖哄煙',
+            filterable: true, // 鏀寔鎼滅储浠撳簱
+            loading: isLoadingWarehouses.value, // 鍔犺浇鐘舵��
+            style: { width: '100%' }
+          }, [
+            // 娓叉煋浠撳簱涓嬫媺閫夐」
+            warehouses.value.map(item => h(ElOption, {
+              label: item.label,
+              value: item.value
+            }))
+          ])
+        ]),
+        // 鏂欑鐮佽緭鍏ラ」锛堟敮鎸佽仛鐒︺�佸洖杞︽彁浜わ級
+        h(ElFormItem, { label: '鏂欑鐮�', prop: 'boxCode', required: true }, [
+          h(ElInput, {
+            type: 'text',
+            modelValue: formData.boxCode,
+            'onUpdate:modelValue': (val) => {
+              formData.boxCode = val;
+            },
+            ref: 'boxCodeInput', 
+            placeholder: '鎵爜杈撳叆鎴栨墜鍔ㄨ緭鍏ユ枡绠辩爜',
+            // 鐩戝惉鍥炶溅浜嬩欢锛堟壂鐮佹灙榛樿浼氬彂閫佸洖杞︼級
+            onKeydown: (e) => {
+              if (e.key === 'Enter') {
+                e.preventDefault(); 
+                submitForm(); 
+              }
+            }
+          })
+        ]),
+        // 搴曢儴鎸夐挳鍖�
+        h('div', { style: { textAlign: 'right', marginTop: '16px' } }, [
+          h(ElButton, {
+            type: 'text',
+            onClick: () => {
+              render(null, mountNode);
+              document.body.removeChild(mountNode);
+              ElMessage.info('鍙栨秷鍏ュ簱浠诲姟');
+            }
+          }, '鍙栨秷'),
+          h(ElButton, {
+            type: 'primary',
+            onClick: submitForm 
+          }, '纭畾')
+        ])
+      ])
+    });
+
+    vnode.appContext = this.$.appContext;
+    render(vnode, mountNode);
+  }
+}
+    ], box: [], detail: [] }, 
+    methods: {
+       //涓嬮潰杩欎簺鏂规硶鍙互淇濈暀涔熷彲浠ュ垹闄�
+      onInit() {  
+      },
+      onInited() {
+        
+        //妗嗘灦鍒濆鍖栭厤缃悗
+        //濡傛灉瑕侀厤缃槑缁嗚〃,鍦ㄦ鏂规硶鎿嶄綔
+        //this.detailOptions.columns.forEach(column=>{ });
+      },
+      searchBefore(param) {
+        //鐣岄潰鏌ヨ鍓�,鍙互缁檖aram.wheres娣诲姞鏌ヨ鍙傛暟
+        //杩斿洖false锛屽垯涓嶄細鎵ц鏌ヨ
+        let wheres = [{
+            'name': 'orderType',
+            'value': '115',
+            'displayType': 'text'}];
+   
+
+          param.wheres.push(...wheres);
+    //   this.searchFormFields.orderType=[115]
+        return true;
+      },
+      searchAfter(result) {
+        //鏌ヨ鍚庯紝result杩斿洖鐨勬煡璇㈡暟鎹�,鍙互鍦ㄦ樉绀哄埌琛ㄦ牸鍓嶅鐞嗚〃鏍肩殑鍊�
+        return true;
+      },
+      addBefore(formData) {
+        //鏂板缓淇濆瓨鍓峟ormData涓哄璞★紝鍖呮嫭鏄庣粏琛紝鍙互缁欑粰琛ㄥ崟璁剧疆鍊硷紝鑷繁杈撳嚭鐪媐ormData鐨勫��
+        return true;
+      },
+      updateBefore(formData) {
+        //缂栬緫淇濆瓨鍓峟ormData涓哄璞★紝鍖呮嫭鏄庣粏琛ㄣ�佸垹闄よ鐨処d
+        return true;
+      },
+      rowClick({ row, column, event }) {
+        //鏌ヨ鐣岄潰鐐瑰嚮琛屼簨浠�
+        this.$refs.table.$refs.table.toggleRowSelection(row); //鍗曞嚮琛屾椂閫変腑褰撳墠琛�;
+      },
+      modelOpenAfter(row) {
+        //鐐瑰嚮缂栬緫銆佹柊寤烘寜閽脊鍑烘鍚庯紝鍙互鍦ㄦ澶勫啓閫昏緫锛屽锛屼粠鍚庡彴鑾峰彇鏁版嵁
+        //(1)鍒ゆ柇鏄紪杈戣繕鏄柊寤烘搷浣滐細 this.currentAction=='Add';
+        //(2)缁欏脊鍑烘璁剧疆榛樿鍊�
+        //(3)this.editFormFields.瀛楁='xxx';
+        //濡傛灉闇�瑕佺粰涓嬫媺妗嗚缃粯璁ゅ�硷紝璇烽亶鍘唗his.editFormOptions鎵惧埌瀛楁閰嶇疆瀵瑰簲data灞炴�х殑key鍊�
+        //鐪嬩笉鎳傚氨鎶婅緭鍑虹湅锛歝onsole.log(this.editFormOptions)
+      }
+    }
+  };
+  export default extension;
+  
\ No newline at end of file
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/inbound/inboundOrder.js" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/inbound/inboundOrder.js"
index 19960e4..c6578d5 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/inbound/inboundOrder.js"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/inbound/inboundOrder.js"
@@ -416,6 +416,7 @@
       searchBefore(param) {
         //鐣岄潰鏌ヨ鍓�,鍙互缁檖aram.wheres娣诲姞鏌ヨ鍙傛暟
         //杩斿洖false锛屽垯涓嶄細鎵ц鏌ヨ
+       this.searchFormFields.orderType=[0]
         return true;
       },
       searchAfter(result) {
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/outbound/allocateoutboundOrder.js" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/outbound/allocateoutboundOrder.js"
new file mode 100644
index 0000000..487648b
--- /dev/null
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/outbound/allocateoutboundOrder.js"
@@ -0,0 +1,374 @@
+
+//姝s鏂囦欢鏄敤鏉ヨ嚜瀹氫箟鎵╁睍涓氬姟浠g爜锛屽彲浠ユ墿灞曚竴浜涜嚜瀹氫箟椤甸潰鎴栬�呴噸鏂伴厤缃敓鎴愮殑浠g爜
+import http from '@/api/http.js'
+import { h,createVNode, render,reactive ,ref } from 'vue';
+import { ElDialog , ElForm, ElFormItem, ElInput, ElButton, ElMessage ,ElSelect, ElOption} from 'element-plus';
+
+import gridBody from './extend/outOrderDetail.vue'
+let extension = {
+    components: {
+      //鏌ヨ鐣岄潰鎵╁睍缁勪欢
+      gridHeader: '',
+      gridBody: gridBody,
+      gridFooter: '',
+      //鏂板缓銆佺紪杈戝脊鍑烘鎵╁睍缁勪欢
+      modelHeader: '',
+      modelBody: '',
+      modelFooter: ''
+    },
+    tableAction: '', //鎸囧畾鏌愬紶琛ㄧ殑鏉冮檺(杩欓噷濉啓琛ㄥ悕,榛樿涓嶇敤濉啓)
+    buttons: { view: [
+       /* {
+        name: '鍑哄簱',
+        type: 'primary',
+        value: '鍑哄簱',
+        onClick: function () { // 淇锛氱敤ElMessage鏇夸唬this.$message
+          const selectedRows = this.$refs.table.getSelected();
+          if (selectedRows.length === 0) {
+            ElMessage.warning('璇峰厛閫夋嫨瑕佺敓鎴愪换鍔$殑琛�');
+            return;
+          }
+          if (selectedRows.length > 1) {
+            ElMessage.warning('鍙兘閫夋嫨涓�琛�');
+            return;
+          }
+    
+
+          // 鎵�鏈夋牎楠岄�氳繃锛岃Е鍙戜富缁勪欢鎵撳紑鍑哄簱寮圭獥
+          console.log('鎵�鏈夋牎楠岄�氳繃锛岃Е鍙憃penOutboundDialog浜嬩欢锛屽崟鎹暟鎹細', selectedRows[0]);
+         
+          this.$emit('openOutboundDialog', {
+            transNo: selectedRows[0].transNo,       // 鍑哄簱鍗曠紪鍙�
+            createDate: selectedRows[0].createDate || new Date().toLocaleDateString()  // 鍑哄簱鏃ユ湡
+          });
+        }
+      }, */
+      {
+  name: '绌烘墭鐩樺嚭搴�',
+  type: 'primary',
+  value: '绌烘墭鐩樺嚭搴�',
+  onClick: function () {
+    
+   
+    const platformOptions = Array.from({ length: 1 }, (_, i) => {
+      const num = 1;
+      return { label: `绔欏彴${num}`, value: `1-2` };
+    });
+
+    const quantityOptions = Array.from({ length: 6 }, (_, i) => ({
+      label: (i + 1).toString(), 
+      value: i + 1 
+    }));
+
+    const warehouseOptions = ref([]);
+    const isLoadingWarehouses = ref(false);
+
+    const getWarehouseList = async () => {
+      isLoadingWarehouses.value = true;
+      try {
+        const { data, status } = await http.post('/api/LocationInfo/GetLocationTypes'); 
+        if (status && Array.isArray(data)) {
+          // 鏍煎紡鍖栦粨搴撻�夐」锛氶�傞厤ElSelect鐨刲abel-value鏍煎紡
+          warehouseOptions.value = data.map(item => ({
+            label: item.locationTypeDesc,
+            value: item.locationType  
+          }));
+        } else {
+          ElMessage.error('鑾峰彇鍖哄煙鍒楄〃澶辫触');
+          warehouseOptions.value = [];
+        }
+      } catch (err) {
+        ElMessage.error('鍖哄煙鏁版嵁璇锋眰寮傚父锛岃绋嶅悗閲嶈瘯');
+        warehouseOptions.value = [];
+      } finally {
+        isLoadingWarehouses.value = false;
+      }
+    };
+
+    const mountNode = document.createElement('div');
+    document.body.appendChild(mountNode);
+
+    
+    const formData = reactive({
+      warehouseCode:'',
+      palletCode: '',
+      selectedPlatform: platformOptions[0].value,
+      quantity:1 
+    });
+
+    const vnode = createVNode(ElDialog, {
+      title: '绌烘墭鐩樺嚭搴�',
+      width: '500px', 
+      modelValue: true,
+      appendToBody: true,
+      onOpened: async () => {
+        await getWarehouseList();
+        const inputRef = vnode.component.refs.boxCodeInput;
+        inputRef?.focus();
+      },
+      'onUpdate:modelValue': (isVisible) => {
+        if (!isVisible) {
+          render(null, mountNode);
+          document.body.removeChild(mountNode);
+        }
+      },
+      style: {
+        padding: '20px 0', 
+        borderRadius: '8px' 
+      }
+    }, {
+      default: () => h(ElForm, {
+        model: formData,
+        rules: {
+          warehouseCode:[
+            { required: true, message: '璇烽�夋嫨鍖哄煙', trigger: ['change', 'blur'] }
+          ],
+          palletCode: [
+            { type: 'string', message: '鏂欑鍙峰繀椤讳负瀛楃涓�', trigger: 'blur' }
+          ],
+          selectedPlatform: [
+            { required: true, message: '璇烽�夋嫨鍑哄簱绔欏彴', trigger: 'change' }
+          ],
+          quantity:[
+            { required: true, message: '璇烽�夋嫨绌虹鏁伴噺', trigger: 'change'}
+          ]                       
+        },
+        ref: 'batchOutForm',
+        labelWidth: '100px', 
+        style: {
+          padding: '0 30px', 
+        }
+       }, 
+       [
+      //   h(ElFormItem, {
+      //     label: '浠撳簱鍖哄煙',
+      //     prop: 'warehouseCode',
+      //     style: {
+      //       marginBottom: '24px' 
+      //     }
+      //   }, [
+      //     h(ElSelect, {
+      //       placeholder: '璇烽�夋嫨浠撳簱鍖哄煙',
+      //       modelValue: formData.warehouseCode,
+      //       'onUpdate:modelValue': (val) => {
+      //         formData.warehouseCode = val;
+      //       },
+      //       style: {
+      //         width: '100%',
+      //         height: '40px', 
+      //         borderRadius: '4px',
+      //         borderColor: '#dcdfe6'
+      //       }
+      //     }, warehouseOptions.value.map(platform => 
+      //       h(ElOption, { label: platform.label, value: platform.value })
+      //     ))
+      //   ]),
+        h(ElFormItem, {
+          label: '鍑哄簱绔欏彴',
+          prop: 'selectedPlatform',
+          style: {
+            marginBottom: '24px' 
+          }
+        }, [
+          h(ElSelect, {
+            placeholder: '璇烽�夋嫨鍑哄簱绔欏彴',
+            modelValue: formData.selectedPlatform,
+            'onUpdate:modelValue': (val) => {
+              formData.selectedPlatform = val;
+            },
+            style: {
+              width: '100%',
+              height: '40px', 
+              borderRadius: '4px',
+              borderColor: '#dcdfe6'
+            }
+          }, platformOptions.map(platform => 
+            h(ElOption, { label: platform.label, value: platform.value })
+          ))
+        ]),
+      //   h(ElFormItem,{
+      //     label:'鍑哄簱鏁伴噺',
+      //     prop:'quantity',
+      //     style:{
+      //       marginBottom:'24px'
+      //     }
+      //   },[h(ElSelect,{
+      //     placeholder:'璇烽�夋嫨绌虹鏁伴噺',
+      //     modelValue:formData.quantity,
+      //     'onUpdate:modelValue':(val)=>{
+      //       formData.quantity=val;
+      //     },
+      //     style:{
+      //       width:'100%',
+      //       height:'40px',
+      //       borderRadius:'4px',
+      //       borderColor:'#dcdfe6'
+      //     },
+      //     filterable:false
+      //   },
+      //   quantityOptions.map(option=>
+      //     h(ElOption,{
+      //       label:option.label,
+      //       value:option.value
+      //     })
+      //   )
+      // )]),                                 
+        h(ElFormItem, {
+          label: '鏂欑鍙�',
+          prop: 'palletCode',
+          style: {
+            marginBottom: '16px' 
+          }
+        }, [
+          h(ElInput, {
+            type: 'text',
+            placeholder: '鍙�夎緭鍏ユ枡绠卞彿锛屼笉濉垯鑷姩鍒嗛厤绌烘枡绠�',
+            modelValue: formData.palletCode,
+            'onUpdate:modelValue': (val) => {
+              formData.palletCode = val;
+            },
+            style: {
+              width: '100%',
+              height: '40px', 
+              borderRadius: '4px',
+              borderColor: '#dcdfe6'
+            },
+            attrs: {
+              placeholderStyle: 'color: #909399;' 
+            }
+          })
+        ]),
+        
+        h('div', {
+          style: {
+            textAlign: 'right',
+            marginTop: '8px',
+            paddingRight: '4px' 
+          }
+        }, [
+          h(ElButton, {
+            type: 'text',
+            onClick: () => {
+              render(null, mountNode);
+              document.body.removeChild(mountNode);
+              ElMessage.info('鍙栨秷鍑哄簱鎿嶄綔');
+            },
+            style: {
+              marginRight: '8px',
+              color: '#606266' 
+            }
+          }, '鍙栨秷'),
+          h(ElButton, {
+            type: 'primary',
+            onClick: async () => {
+              const formRef = vnode.component.refs.batchOutForm;
+              try {
+                await formRef.validate();
+              } catch (err) {
+                return;
+              }
+
+              http.post('/api/Task/PalletOutboundTask?palletCode='+formData.palletCode+'&endStation='+formData.selectedPlatform, {
+                
+              }).then(({ data, status, message }) => {
+                if (status) {
+
+                  ElMessage.success(`鍑哄簱鎴愬姛`);
+                  this.refresh();
+                  render(null, mountNode);
+                  document.body.removeChild(mountNode);
+                } else {
+                  ElMessage.error(message || data?.message || '鍑哄簱澶辫触');
+                }
+              }).catch(() => {
+                ElMessage.error('璇锋眰澶辫触锛岃绋嶅悗閲嶈瘯');
+              });
+            },
+            style: {
+              borderRadius: '4px',
+              padding: '8px 20px' 
+            }
+          }, '纭畾')
+        ])
+      ])
+    });
+
+    vnode.appContext = this.$.appContext;
+    render(vnode, mountNode);
+  }
+}
+    ], box: [], detail: [] }, //鎵╁睍鐨勬寜閽�
+    methods: {
+       //涓嬮潰杩欎簺鏂规硶鍙互淇濈暀涔熷彲浠ュ垹闄�
+      onInit() {  
+        //鎵╁睍椤甸潰鍒濆鍖栨搷浣�
+        this.columns.push({
+          field: '鎿嶄綔',
+          title: '鎿嶄綔',
+          width: 90,
+          fixed: 'right',
+          align: 'center',
+          formatter: (row) => {
+              return (
+                  '<i style="cursor: pointer;color: #2d8cf0;"class="el-icon-view">鏌ョ湅鏄庣粏</i>'
+              );
+          },
+          click: (row) => {
+            const table = this.$refs.table.$refs.table;
+            if(table){
+              table.clearSelection();
+              table.toggleRowSelection(row,true);
+            }
+              const rowId =row.id;
+              console.log(rowId);
+              this.$refs.gridBody.open(row);
+          }
+      });
+      },
+      onInited() {
+        //妗嗘灦鍒濆鍖栭厤缃悗
+        //濡傛灉瑕侀厤缃槑缁嗚〃,鍦ㄦ鏂规硶鎿嶄綔
+        //this.detailOptions.columns.forEach(column=>{ });
+      },
+      searchBefore(param) {
+        //鐣岄潰鏌ヨ鍓�,鍙互缁檖aram.wheres娣诲姞鏌ヨ鍙傛暟
+        //杩斿洖false锛屽垯涓嶄細鎵ц鏌ヨ
+       //   this.searchFormFields.orderType=[215]
+
+        let wheres = [{
+            'name': 'orderType',
+            'value': '215',
+            'displayType': 'text'}];
+   
+
+          param.wheres.push(...wheres);
+        return true;
+      },
+      searchAfter(result) {
+        //鏌ヨ鍚庯紝result杩斿洖鐨勬煡璇㈡暟鎹�,鍙互鍦ㄦ樉绀哄埌琛ㄦ牸鍓嶅鐞嗚〃鏍肩殑鍊�
+        return true;
+      },
+      addBefore(formData) {
+        //鏂板缓淇濆瓨鍓峟ormData涓哄璞★紝鍖呮嫭鏄庣粏琛紝鍙互缁欑粰琛ㄥ崟璁剧疆鍊硷紝鑷繁杈撳嚭鐪媐ormData鐨勫��
+        return true;
+      },
+      updateBefore(formData) {
+        //缂栬緫淇濆瓨鍓峟ormData涓哄璞★紝鍖呮嫭鏄庣粏琛ㄣ�佸垹闄よ鐨処d
+        return true;
+      },
+      rowClick({ row, column, event }) {
+        //鏌ヨ鐣岄潰鐐瑰嚮琛屼簨浠�
+        this.$refs.table.$refs.table.toggleRowSelection(row); //鍗曞嚮琛屾椂閫変腑褰撳墠琛�;
+      },
+      modelOpenAfter(row) {
+        //鐐瑰嚮缂栬緫銆佹柊寤烘寜閽脊鍑烘鍚庯紝鍙互鍦ㄦ澶勫啓閫昏緫锛屽锛屼粠鍚庡彴鑾峰彇鏁版嵁
+        //(1)鍒ゆ柇鏄紪杈戣繕鏄柊寤烘搷浣滐細 this.currentAction=='Add';
+        //(2)缁欏脊鍑烘璁剧疆榛樿鍊�
+        //(3)this.editFormFields.瀛楁='xxx';
+        //濡傛灉闇�瑕佺粰涓嬫媺妗嗚缃粯璁ゅ�硷紝璇烽亶鍘唗his.editFormOptions鎵惧埌瀛楁閰嶇疆瀵瑰簲data灞炴�х殑key鍊�
+        //鐪嬩笉鎳傚氨鎶婅緭鍑虹湅锛歝onsole.log(this.editFormOptions)
+      }
+    }
+  };
+  export default extension;
+  
\ No newline at end of file
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"
new file mode 100644
index 0000000..055e360
--- /dev/null
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/outbound/extend/printView.vue"
@@ -0,0 +1,588 @@
+<template>
+  <div>
+    <vol-box v-model="showDetialBox" :lazy="true" width="500px" :padding="15" title="">
+      <!-- 鎵撳嵃涓撶敤瀹瑰櫒 -->
+      <div id="printContainer" style="position: absolute; left: -9999px;">
+        <div class="print-page" v-for="(item, index) in printData" :key="index">
+          <div class="material-card">
+            <!-- <div class="header">鍗撳姏鑳界墿鏂欐爣璇嗗崱(灏忓寘)</div> -->
+            <div class="dual-column preview-card-header-qrcode">
+              <div class="preview-card-header">鐗╂枡鍗� {{ idx + 1 }}</div>
+              <VueQrcode :value="generateQr(item)" :size="20" id="qrcode" />
+            </div>
+            <div class="content">
+              <!-- 浜岀淮鐮佹斁鍦ㄥ彸涓婅 -->
+              <!-- <div class="qr-section"> -->
+              <!-- <VueQrcode :value="generateQr(item)" id="qrcode" /> -->
+              <!-- </div> -->
+              <div class="row dual-column">
+                <div class="column">
+                  <span class="label">鏂欏彿</span>
+                  <span class="value code-value">{{ item.materialCode }}</span>
+                </div>
+                <div class="column">
+                  <span class="label">渚涘簲鍟嗙紪鐮�</span>
+                  <span class="value">{{ item.supplierCode }}</span>
+                </div>
+              </div>
+
+              <div class="row dual-column">
+                <div class="column">
+                  <span class="label">鍝佸悕</span>
+                  <span class="value">{{ item.materialName }}</span>
+                </div>
+                <div class="column">
+                  <span class="label">閲囪喘鍗曞彿</span>
+                  <span class="value">{{ item.purchaseOrderNo }}</span>
+                </div>
+              </div>
+
+              <div class="row dual-column">
+                <div class="column">
+                  <span class="label">瑙勬牸</span>
+                  <span class="value full-width">{{ item.specification }}</span>
+                </div>
+                <div class="column">
+                  <span class="label">鏁伴噺/鎬绘暟</span>
+                  <span class="value">{{ item.quantityTotal }}</span>
+                </div>
+              </div>
+
+              <div class="row dual-column">
+                <div class="column">
+                  <span class="label">鎵瑰彿</span>
+                  <span class="value">{{ item.batchNumber }}</span>
+                </div>
+                <div class="column">
+                  <span class="label">鎵规</span>
+                  <span class="value">{{ item.batch }}</span>
+                </div>
+              </div>
+
+              <div class="row dual-column">
+                <div class="column">
+                  <span class="label">鍘傚尯</span>
+                  <span class="value">{{ item.factory }}</span>
+                </div>
+                <div class="column">
+                  <span class="label">鏃ユ湡</span>
+                  <span class="value">{{ item.date }}</span>
+                </div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+
+      <!-- 棰勮鍖哄煙 -->
+      <div id="previewContent" class="preview-container">
+        <div class="preview-header">鍗撳姏鑳界墿鏂欐爣璇嗗崱(灏忓寘) - 棰勮 (鍏眥{ printData.length }}涓�)</div>
+        <div class="preview-scroll">
+          <div v-for="(item, idx) in printData" :key="idx" class="preview-card">
+            <div class="dual-column preview-card-header-qrcode">
+              <div class="preview-card-header">鐗╂枡鍗� {{ idx + 1 }}</div>
+              <VueQrcode :value="generateQr(item)" :size="20" id="qrcode" />
+            </div>
+            <div class="preview-wrapper">
+              <div class="content-preview">
+                <div class="row-preview dual-column">
+                  <div class="column-preview">
+                    <span class="label-preview">鏂欏彿</span>
+                    <span class="value-preview code-value">{{ item.materialCode }}</span>
+                  </div>
+                  <div class="column-preview">
+                    <span class="label-preview">渚涘簲鍟嗙紪鐮�</span>
+                    <span class="value-preview">{{ item.supplierCode }}</span>
+                  </div>
+                </div>
+
+                <div class="row-preview dual-column">
+                  <div class="column-preview">
+                    <span class="label-preview">鍝佸悕</span>
+                    <span class="value-preview">{{ item.materialName }}</span>
+                  </div>
+                  <div class="column-preview">
+                    <span class="label-preview">閲囪喘鍗曞彿</span>
+                    <span class="value-preview">{{ item.purchaseOrderNo }}</span>
+                  </div>
+                </div>
+
+                <div class="row-preview dual-column">
+                  <div class="column-preview">
+                    <span class="label-preview">瑙勬牸</span>
+                    <span class="value-preview full-width">{{ item.specification }}</span>
+                  </div>
+                  <div class="column-preview">
+                    <span class="label-preview">鏁伴噺/鎬绘暟</span>
+                    <span class="value-preview">{{ item.quantityTotal }}</span>
+                  </div>
+                </div>
+
+                <div class="row-preview dual-column">
+                  <div class="column-preview">
+                    <span class="label-preview">鎵瑰彿</span>
+                    <span class="value-preview">{{ item.batchNumber }}</span>
+                  </div>
+                  <div class="column-preview">
+                    <span class="label-preview">鎵规</span>
+                    <span class="value-preview">{{ item.batch }}</span>
+                  </div>
+                </div>
+
+                <div class="row-preview dual-column">
+                  <div class="column-preview">
+                    <span class="label-preview">鍘傚尯</span>
+                    <span class="value-preview">{{ item.factory }}</span>
+                  </div>
+                  <div class="column-preview">
+                    <span class="label-preview">鏃ユ湡</span>
+                    <span class="value-preview">{{ item.date }}</span>
+                  </div>
+                </div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+
+      <template #footer>
+        <div class="footer-actions">
+          <span class="print-count">鍏� {{ printData.length }} 涓墿鏂欏崱寰呮墦鍗�</span>
+          <div>
+            <el-button type="primary" size="small" @click="print">鎵撳嵃鍏ㄩ儴</el-button>
+            <el-button type="danger" size="small" @click="showDetialBox = false">鍏抽棴</el-button>
+          </div>
+        </div>
+      </template>
+    </vol-box>
+  </div>
+</template>
+
+<script>
+import VolBox from "@/components/basic/VolBox.vue";
+import VueQrcode from "vue-qrcode";
+
+export default {
+  components: { VolBox, VueQrcode },
+  data() {
+    return {
+      showDetialBox: false,
+      printData: [], // 瀛樺偍鎵撳嵃鏁版嵁闆嗗悎
+    };
+  },
+  methods: {
+    generateQr(item) {
+      return `${item.materialCode}_${item.supplierCode}_${item.purchaseOrderNo}_${item.materialName}_${item.batch}_${item.batchNumber}_${item.factory}_${item.date}`;
+    },
+
+    open(rows) {
+      this.showDetialBox = true;
+      this.printData = Array.isArray(rows) ? rows : [rows];
+      console.log('鎵撳嵃鏁版嵁:', this.printData);
+    },
+
+    async print() {
+      if (this.printData.length === 0) {
+        this.$message.warning('娌℃湁鍙墦鍗扮殑鏁版嵁');
+        return;
+      }
+
+      this.$nextTick(() => {
+        try {
+          const printContent = document.getElementById("printContainer").innerHTML;
+          const printWindow = window.open("", "_blank", "width=800,height=600,scrollbars=yes");
+
+          if (!printWindow) {
+            this.$message.error('鏃犳硶鎵撳紑鎵撳嵃绐楀彛锛岃妫�鏌ユ祻瑙堝櫒寮圭獥璁剧疆');
+            return;
+          }
+
+          printWindow.document.write(`
+            <!DOCTYPE html>
+            <html>
+            <head>
+              <meta charset="UTF-8">
+              <title>鐗╂枡鏍囪瘑鍗℃墦鍗� - 鍏�${this.printData.length}涓�</title>
+              <style>
+                /* 閲嶇疆鎵�鏈夋牱寮� */
+                * {
+                  margin: 0;
+                  padding: 0;
+                  box-sizing: border-box;
+                }
+                
+                body {
+                  font-family: SimSun, "瀹嬩綋", sans-serif;
+                  -webkit-print-color-adjust: exact !important;
+                  print-color-adjust: exact !important;
+                  color-adjust: exact !important;
+                }
+                #qrcode {
+                  width: 60px;
+                  height: 60px;
+                  display: block;
+                  margin: 0, 15px
+                }
+                @media print {
+                  @page {
+                    size: 80mm 60mm;
+                    margin: 0;
+                    padding: 0;
+                  }
+                  
+                  body {
+                    margin: 0 !important;
+                    padding: 0 !important;
+                    width: 80mm !important;
+                    background: white !important;
+                  }
+                  
+                  .print-page {
+                    width: 80mm !important;
+                    height: 60mm !important;
+                    page-break-after: always !important;
+                    break-after: page !important;
+                    margin: 0 !important;
+                    padding: 2mm !important;
+                    display: block !important;
+                  }
+                  
+                  .print-page:last-child {
+                    page-break-after: auto !important;
+                  }
+                  
+                  .material-card {
+                    width: 80mm !important;
+                    height: 56mm !important;
+                    border: 0.3mm solid #000 !important;
+                    padding: 1mm !important;
+                    box-sizing: border-box !important;
+                    position: relative !important;
+                    background: white !important;
+                  }
+                  
+                  .header {
+                    font-size: 3.5mm !important;
+                    font-weight: bold !important;
+                    text-align: center !important;
+                    margin-bottom: 1mm !important;
+                    padding-bottom: 0.5mm !important;
+                    border-bottom: 0.2mm solid #000 !important;
+                  }
+                  
+                  .content {
+                    height: calc(100% - 6mm) !important;
+                    position: relative !important;
+                  }
+                  
+                  .row {
+                    display: flex !important;
+                    margin-bottom: 0.8mm !important;
+                    min-height: 6mm !important;
+                  }
+                  
+                  .dual-column {
+                    display: flex !important;
+                    justify-content: space-between !important;
+                  }
+                  
+                  .column {
+                    flex: 1 !important;
+                    display: flex !important;
+                    align-items: center !important;
+                  }
+                  
+                  .column:first-child {
+                    margin-right: 2mm !important;
+                  }
+                  
+                  .label {
+                    font-weight: bold !important;
+                    flex: 0 0 15mm !important;
+                    white-space: nowrap !important;
+                    font-size: 2.2mm !important;
+                  }
+                  
+                  .value {
+                    flex: 1 !important;
+                    overflow: hidden !important;
+                    text-overflow: ellipsis !important;
+                    white-space: nowrap !important;
+                    border-bottom: 0.1mm dashed #666 !important;
+                    padding-bottom: 0.2mm !important;
+                    min-height: 2.5mm !important;
+                    font-size: 2.2mm !important;
+                  }
+                  
+                  .code-value {
+                    font-weight: bold !important;
+                  }
+                  
+                  .full-width {
+                    white-space: normal !important;
+                    word-break: break-all !important;
+                    line-height: 1.2 !important;
+                  }
+                  
+                  /* 浜岀淮鐮佹牱寮� */
+                  .qr-section {                 
+                    width: 10mm !important;
+                    height: 12mm !important;
+                    font-siz:10px;
+                  }
+                  
+                  .qr-section canvas {
+                    width: 10mm !important;
+                    height: 10mm !important;
+                    max-width: 100% !important;
+                    max-height: 100% !important;
+                  }
+                }
+                
+                /* 灞忓箷棰勮鏍峰紡 */
+                @media screen {
+                  body {
+                    background: #f5f5f5;
+                    padding: 10px;
+                    display: flex;
+                    flex-direction: column;
+                    align-items: center;
+                  }
+                  
+                  .print-page {
+                    width: 80mm;
+                    height: 60mm;
+                    margin: 10px 0;
+                    padding: 2mm;
+                    background: white;
+                    box-shadow: 0 2px 10px rgba(0,0,0,0.1);
+                    border: 1px dashed #ccc;
+                  }
+                  
+                  .material-card {
+                    width: 80mm;
+                    height: 60mm;
+                    border: 0.3mm solid #000;
+                    padding: 1.5mm;
+                    background: white;
+                    position: relative;
+                  }
+                  
+                  .qr-section {
+                    position: absolute;
+                    top: 4mm;
+                    right: 2mm;
+                    width: 12mm;
+                    height: 12mm;
+                    border: 0.2mm solid #ccc;
+                    padding: 0.5mm;
+                    background: white;
+                    display: flex;
+                    align-items: center;
+                    justify-content: center;
+                  }
+                  
+                  .qr-section canvas {
+                    width: 10mm !important;
+                    height: 10mm !important;
+                  }
+                }
+              </style>
+            </head>
+            <body>
+              ${printContent}
+              <script>
+                window.onload = function() {
+                  console.log('鎵撳嵃椤甸潰鍔犺浇瀹屾垚锛屽叡${this.printData.length}涓墿鏂欏崱');
+                  // 绛夊緟浜岀淮鐮佹覆鏌撳畬鎴�
+                  setTimeout(() => {
+                    // 寮哄埗璁剧疆浜岀淮鐮乧anvas灏哄
+                    const canvases = document.querySelectorAll('canvas');
+                    canvases.forEach(canvas => {
+                      canvas.style.width = '10mm !important';
+                      canvas.style.height = '10mm !important';
+                    });
+                    window.print();
+                  }, 800);
+                };
+                
+                window.onafterprint = function() {
+                  setTimeout(() => {
+                    window.close();
+                  }, 500);
+                };
+              <\/script>
+            </body>
+            </html>
+          `);
+
+          printWindow.document.close();
+
+        } catch (error) {
+          console.error('鎵撳嵃閿欒:', error);
+          this.$message.error('鎵撳嵃澶辫触: ' + error.message);
+        }
+      });
+    }
+  }
+};
+</script>
+
+<style scoped>
+#qrcode {
+  width: 60px;
+  height: 60px;
+  display: block;
+  margin: 0, 15px
+}
+
+.preview-container {
+  max-height: 500px;
+  overflow: hidden;
+  display: flex;
+  flex-direction: column;
+}
+
+.preview-header {
+  text-align: center;
+  font-size: 16px;
+  font-weight: bold;
+  margin-bottom: 10px;
+  padding: 8px;
+  background: #f0f0f0;
+  border-radius: 4px;
+}
+
+.preview-scroll {
+  max-height: 400px;
+  overflow-y: auto;
+  padding: 10px;
+  border: 1px solid #e0e0e0;
+  border-radius: 4px;
+  background: #f9f9f9;
+}
+
+.preview-card {
+  width: 320px;
+  height: 240px;
+  margin: 0 auto 15px auto;
+  padding: 8px;
+  border: 1px solid #ccc;
+  font-family: SimSun;
+  box-sizing: border-box;
+  border: 2px solid #000;
+  background: white;
+  box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
+  position: relative;
+}
+
+.preview-card:last-child {
+  margin-bottom: 0;
+}
+
+.preview-card-header {
+  text-align: center;
+  font-size: 14px;
+  /* font-weight: bold;
+  margin-bottom: 8px;
+  padding-bottom: 4px;
+  border-bottom: 1px solid #000;
+  background: #f5f5f5;
+  padding: 4px; */
+  height: 60px;
+  width: 60px;
+}
+
+.preview-wrapper {
+  position: relative;
+  height: calc(100% - 40px);
+}
+
+.content-preview {
+  width: 100%;
+  height: 100%;
+}
+
+.row-preview {
+  /* margin-bottom: px; */
+  min-height: 32px;
+}
+
+.dual-column {
+  display: flex;
+  justify-content: space-between;
+}
+
+.column-preview {
+  flex: 1;
+  display: flex;
+  align-items: center;
+}
+
+.column-preview:first-child {
+  margin-right: 10px;
+}
+
+.label-preview {
+  font-weight: bold;
+  flex: 0 0 60px;
+  white-space: nowrap;
+  font-size: 12px;
+}
+
+.value-preview {
+  flex: 1;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  font-size: 12px;
+  border-bottom: 1px dashed #666;
+  padding-bottom: 2px;
+}
+
+.code-value {
+  font-weight: bold;
+}
+
+.full-width {
+  display: block;
+  margin-top: 2px;
+  white-space: normal;
+  word-break: break-all;
+  line-height: 1.2;
+  font-size: 12px;
+}
+
+/* 棰勮鍖哄煙浜岀淮鐮佹牱寮� */
+.qr-section-preview {
+  position: absolute;
+  top: 10px;
+  right: 10px;
+  width: 150px;
+  height: 175px;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  border: 1px solid #ddd;
+  background: white;
+  padding: 2px;
+}
+
+.qr-section-preview canvas {
+  width: 56px !important;
+  height: 56px !important;
+}
+
+.footer-actions {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  width: 100%;
+}
+
+.print-count {
+  font-size: 14px;
+  color: #409EFF;
+  font-weight: bold;
+}
+</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/router/viewGird.js" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/router/viewGird.js"
index 854c4d1..5ee8694 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/router/viewGird.js"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/router/viewGird.js"
@@ -191,7 +191,16 @@
     path: '/materielToMes',
     name: 'Dt_MaterielToMes',
     component: () => import('@/views/inbound/Dt_MaterielToMes.vue')
-  }, 
+  }, {
+    path:'/allocateinboundOrder', 
+    name: 'allocateinboundOrder',
+    component: () => import('@/views/inbound/allocateinboundOrder.vue')
+
+  },{
+    path:'allocateoutboundOrder',
+    name: 'allocateoutboundOrder',
+    component: () => import('@/views/outbound/allocateoutboundOrder.vue') 
+  },
   {
     path: '/allocateOrder',
     name: 'Dt_AllocateOrder',
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/inbound/allocateinboundOrder.vue" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/inbound/allocateinboundOrder.vue"
new file mode 100644
index 0000000..8fbef36
--- /dev/null
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/inbound/allocateinboundOrder.vue"
@@ -0,0 +1,397 @@
+
+<template>
+  <view-grid
+    ref="grid"
+    @openPalletDialog="handleOpenPalletDialog"
+    :columns="columns"
+    :detail="detail"
+    :editFormFields="editFormFields"
+    :editFormOptions="editFormOptions"
+    :searchFormFields="searchFormFields"
+    :searchFormOptions="searchFormOptions"
+    :table="table"
+    :extend="extend"
+  >
+  </view-grid>
+      <!-- 2. 缁勭洏寮圭獥锛氱‘淇漰rops鍜屼簨浠剁粦瀹氭纭� -->
+    <PalletDialog
+      v-model:visible="palletVisible"  
+      :docNo="currentPalletDocNo"     
+      @back-success="handlePalletBackSuccess"  
+    ></PalletDialog>
+
+</template>
+    <script>
+import extend from "@/extension/inbound/allocateinboundOrder.js";
+import ViewGrid from '@/components/basic/ViewGrid/ViewGrid.vue'; 
+import { ref, defineComponent } from "vue";
+import PalletDialog from "@/extension/inbound/extend/Pallet.vue";
+export default defineComponent({
+   components: {
+    // 鍏抽敭淇2锛氱粍浠舵敞鍐屽悕涓庢ā鏉挎爣绛惧悕閫傞厤锛坘ebab-case瀵瑰簲view-grid锛�
+    viewGrid: ViewGrid,  // 娉ㄥ唽涓簁ebab-case锛屾ā鏉跨敤<view-grid>
+    PalletDialog      // 娉ㄥ唽缁勭洏寮圭獥
+ 
+  },
+  setup() {
+    const table = ref({
+      key: "id",
+      footer: "Foots",
+      cnName: "璋冩嫧鍗�(鏅轰粨璋冨閮ㄤ粨搴�)",
+      name: "inboundOrder",
+      url: "/InboundOrder/",
+      sortName: "id",
+    });
+    const editFormFields = ref({
+      orderType: "",
+      inboundOrderNo: "",
+      upperOrderNo: "",
+      remark: "",
+    });
+    const editFormOptions = ref([
+      [
+        {
+          title: "鍗曟嵁绫诲瀷",
+          required: true,
+          field: "orderType",
+          type: "select",
+          dataKey: "inOrderType",
+          data: [],
+        },
+        {
+          field: "inboundOrderNo",
+          title: "鍗曟嵁缂栧彿",
+          type: "string",
+        },
+        {
+          title: "涓婃父鍗曟嵁缂栧彿",
+          field: "upperOrderNo",
+          type: "string",
+        },
+        {
+          title: "澶囨敞",
+          field: "remark",
+          type: "textarea",
+        },
+      ],
+    ]);
+    const searchFormFields = ref({
+      inboundOrderNo: "",
+      upperOrderNo: "",
+      orderType: "115",
+      orderStatus: "",
+      createType: "",
+      creater: "",
+      createDate: "",
+    });
+    const searchFormOptions = ref([
+      [
+        { title: "鍗曟嵁缂栧彿", field: "inboundOrderNo", type: "like" },
+        { title: "涓婃父鍗曟嵁缂栧彿", field: "upperOrderNo", type: "like" },
+        {
+          title: "鍗曟嵁绫诲瀷",
+          field: "orderType",
+          type: "select",
+          dataKey: "inOrderType",
+          data: [],
+        },
+        {
+          title: "鍗曟嵁鐘舵��",
+          field: "orderStatus",
+          type: "select",
+          dataKey: "inboundState",
+          data: [],
+        },
+      ],
+      [
+        {
+          title: "鍒涘缓鏂瑰紡",
+          field: "createType",
+          type: "select",
+          dataKey: "createType",
+          data: [],
+        },
+        { title: "鍒涘缓鑰�", field: "creater", type: "like" },
+        { title: "鍒涘缓鏃堕棿", field: "createDate", type: "datetime" },
+      ],
+    ]);
+    const columns = ref([
+      {
+        field: "id",
+        title: "Id",
+        type: "int",
+        width: 90,
+        hidden: true,
+        readonly: true,
+        require: true,
+        align: "left",
+      },
+      {
+        field: "inboundOrderNo",
+        title: "鍗曟嵁缂栧彿",
+        type: "string",
+        width: 120,
+        align: "left",
+        link: true,
+      },
+      {
+        field: "upperOrderNo",
+        title: "涓婃父鍗曟嵁缂栧彿",
+        type: "string",
+        width: 150,
+        align: "left",
+      },
+      {
+        field: "orderType",
+        title: "鍗曟嵁绫诲瀷",
+        type: "string",
+        width: 150,
+        align: "left",
+        bind: { key: "inOrderType", data: [] },
+      },
+      {
+        field: "businessType",
+        title: "涓氬姟绫诲瀷",
+        type: "string",
+        width: 150,
+        align: "left",
+        bind: { key: "businessType", data: [] },
+      },
+      {
+        field: "orderStatus",
+        title: "鍗曟嵁鐘舵��",
+        type: "decimal",
+        width: 90,
+        align: "left",
+        bind: { key: "inboundState", data: [] },
+      },
+      {
+        field: "createType",
+        title: "鍒涘缓鏂瑰紡",
+        type: "string",
+        width: 120,
+        align: "left",
+        bind: { key: "createType", data: [] },
+      },
+      {
+        field: "factoryArea",
+        title: "鍘傚尯",
+        type: "string",
+        width: 120,
+        align: "left"
+      },
+      {
+        field: "creater",
+        title: "鍒涘缓浜�",
+        type: "string",
+        width: 90,
+        align: "left",
+      },
+      {
+        field: "createDate",
+        title: "鍒涘缓鏃堕棿",
+        type: "datetime",
+        width: 160,
+        align: "left",
+      },
+      {
+        field: "modifier",
+        title: "淇敼浜�",
+        type: "string",
+        width: 100,
+        align: "left",
+      },
+      {
+        field: "modifyDate",
+        title: "淇敼鏃堕棿",
+        type: "datetime",
+        width: 160,
+        align: "left",
+      },
+      {
+        field: "remark",
+        title: "澶囨敞",
+        type: "string",
+        width: 100,
+        align: "left",
+      },
+    ]);
+    const detail = ref({
+      cnName: "璋冩嫧鍗曟槑缁�",
+      table: "InboundOrderDetail",
+      columns: [
+        {
+          field: "id",
+          title: "Id",
+          type: "int",
+          width: 90,
+          hidden: true,
+          readonly: true,
+          require: true,
+          align: "left",
+        },
+        {
+          field: "orderId",
+          title: "璋冩嫧鍗曚富閿�",
+          type: "string",
+          width: 90,
+          align: "left",
+          hidden: true,
+        },
+        {
+          field: "materielCode",
+          title: "鐗╂枡缂栧彿",
+          type: "select",
+          width: 150,
+          align: "left",
+          edit: { type: "" },
+          required: true,
+        },
+        {
+          field: "materielCode",
+          title: "鐗╂枡鍚嶇О",
+          type: "string",
+          width: 100,
+          align: "left",
+          bind: { key: "MaterielNames", data: [] },
+        },
+        {
+          field: "batchNo",
+          title: "鎵规鍙�",
+          type: "decimal",
+          width: 90,
+          align: "left",
+          edit: { type: "" },
+          required: true,
+        },
+        {
+          field: "supplyCode",
+          title: "渚涘簲鍟嗙紪鍙�",
+          type: "decimal",
+          width: 90,
+          align: "left",
+          edit: { type: "" },
+          required: true,
+        },
+        {
+          field: "warehouseCode",
+          title: "浠撳簱鍙�",
+          type: "decimal",
+          width: 90,
+          align: "left",
+          required: true
+        },
+        {
+          field: "barcode",
+          title: "鏉$爜",
+          type: "decimal",
+          width: 90,
+          align: "left",
+          edit: { type: "" },
+          required: true,
+        },
+        {
+          field: "orderQuantity",
+          title: "鍗曟嵁鏁伴噺",
+          type: "decimal",
+          width: 90,
+          align: "left",
+          edit: { type: "number" },
+          required: true,
+        },
+        {
+          field: "receiptQuantity",
+          title: "缁勭洏鏁伴噺",
+          type: "int",
+          width: 120,
+          align: "left",
+        },
+        {
+          field: "overInQuantity",
+          title: "涓婃灦鏁伴噺",
+          type: "string",
+          width: 200,
+          align: "left",
+        },
+        {
+          field: "orderDetailStatus",
+          title: "璁㈠崟鏄庣粏鐘舵��",
+          type: "string",
+          width: 180,
+          align: "left",
+          bind: { key: "orderDetailStatusEnum", data: [] },
+        },
+        {
+          field: "creater",
+          title: "鍒涘缓浜�",
+          type: "string",
+          width: 90,
+          align: "left",
+        },
+        {
+          field: "createDate",
+          title: "鍒涘缓鏃堕棿",
+          type: "datetime",
+          width: 160,
+          align: "left",
+        },
+        {
+          field: "modifier",
+          title: "淇敼浜�",
+          type: "string",
+          width: 100,
+          align: "left",
+        },
+        {
+          field: "modifyDate",
+          title: "淇敼鏃堕棿",
+          type: "datetime",
+          width: 160,
+          align: "left",
+        },
+        {
+          field: "remark",
+          title: "澶囨敞",
+          type: "string",
+          width: 100,
+          align: "left",
+        },
+      ],
+      sortName: "id",
+      key: "id",
+    });
+     // 6. 缁勭洏寮圭獥鑱斿姩锛堟墍鏈夊彉閲忓繀椤昏繑鍥烇級
+    const palletVisible = ref(false);
+    const currentPalletDocNo = ref("");
+
+    const handleOpenPalletDialog = (docNo) => {
+      console.log('涓荤粍浠舵敹鍒扮粍鐩樹簨浠讹紝鍗曟嵁鍙凤細', docNo);
+      currentPalletDocNo.value = docNo;
+      palletVisible.value = true;
+    };
+
+    const handlePalletBackSuccess = () => {
+      console.log('缁勭洏鍥炰紶鎴愬姛锛屽埛鏂拌〃鏍�');
+      grid.value?.refresh();  // 姝ゆ椂gridRef宸叉寕杞斤紝鍙皟鐢ㄦ柟娉�
+    };
+
+    return {
+      table,
+      extend,
+      editFormFields,
+      editFormOptions,
+      searchFormFields,
+      searchFormOptions,
+      columns,
+      detail,
+       // 缁勭洏寮圭獥鐩稿叧
+      PalletDialog,    // 寮圭獥缁勪欢锛堟棤闇�杩斿洖锛屾敞鍐屽嵆鍙紝浣嗗彉閲忛渶杩斿洖锛�
+      palletVisible,
+      currentPalletDocNo,
+      handleOpenPalletDialog,
+      handlePalletBackSuccess
+    };
+  },
+});
+</script>
+    
\ 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/inbound/inboundOrder.vue" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/inbound/inboundOrder.vue"
index 8dfd2f1..e4defc7 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/inbound/inboundOrder.vue"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/inbound/inboundOrder.vue"
@@ -78,7 +78,7 @@
     const searchFormFields = ref({
       inboundOrderNo: "",
       upperOrderNo: "",
-      orderType: "",
+      orderType: "0",
       orderStatus: "",
       createType: "",
       creater: "",
@@ -93,7 +93,7 @@
           field: "orderType",
           type: "select",
           dataKey: "inOrderType",
-          data: [],
+          data: [0],
         },
         {
           title: "鍗曟嵁鐘舵��",
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/outbound/PickingConfirm.vue" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/outbound/PickingConfirm.vue"
index 6170a18..96cbf3e 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/outbound/PickingConfirm.vue"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/outbound/PickingConfirm.vue"
@@ -26,8 +26,8 @@
             @keyup.enter.native="onBarcodeScan">
           </el-input>
           <el-button type="success" @click="confirmPicking">纭鎷i��</el-button>
-          <el-button type="warning" @click="openSplitDialog">鎷嗗寘</el-button>
-          <el-button type="info" @click="openRevertSplitDialog">鎾ら攢鎷嗗寘</el-button>
+     <!--      <el-button type="warning" @click="openSplitDialog">鎷嗗寘</el-button>
+          <el-button type="info" @click="openRevertSplitDialog">鎾ら攢鎷嗗寘</el-button> -->
       
           <el-button type="primary" @click="openBatchReturnDialog">鍥炲簱</el-button>
           <!-- <el-button type="danger" @click="handleDirectOutbound">鐩存帴鍑哄簱</el-button>  -->
@@ -291,6 +291,7 @@
       </div>
     </div>
   </div>
+  <print-view ref="childs" @parentcall="parentcall"></print-view>
 </template>
 
 <script>
@@ -298,12 +299,11 @@
 import { ref, defineComponent } from "vue";
 import { ElMessage } from 'element-plus' 
 import { useRoute } from 'vue-router'
+import printView from "@/extension/outbound/extend/printView.vue"
 
 export default defineComponent({
   name: 'PickingConfirm',
-  components: {
-  
-  },
+  components: {printView},
   props: {
     orderNo: {
       type: String,
@@ -844,7 +844,12 @@
           this.$message.success('鎷i�夌‘璁ゆ垚鍔�');
           this.scanData.barcode = ''; // 娓呯┖鐗╂枡鏉$爜
           this.loadData();
-          
+          console.log(res.data.splitResults)
+          if(res.data && res.data.splitResults.length>0){
+            // 璋冪敤瀛愮粍浠舵墦鍗版柟娉�
+            this.$refs.childs.open(res.data.splitResults);
+            //this.$refs.childs.printSplitLabel(res.data.splitResults);
+          }
           // 鎴愬姛鍚庣户缁仛鐒﹀埌鐗╂枡鏉$爜杈撳叆妗嗭紝鍑嗗涓嬩竴涓壂鐮�
           this.$nextTick(() => {
             this.$refs.barcodeInput.focus();
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/outbound/allocateoutboundOrder.vue" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/outbound/allocateoutboundOrder.vue"
new file mode 100644
index 0000000..46ae5a5
--- /dev/null
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/outbound/allocateoutboundOrder.vue"
@@ -0,0 +1,443 @@
+
+<template>
+  <view-grid
+    ref="grid"
+        @openOutboundDialog="handleOpenOutboundDialog"  
+    :columns="columns"
+    :detail="detail"
+    :editFormFields="editFormFields"
+    :editFormOptions="editFormOptions"
+    :searchFormFields="searchFormFields"
+    :searchFormOptions="searchFormOptions"
+    :table="table"
+    :extend="extend"
+  >
+  </view-grid>
+      <!-- 鍑哄簱鎿嶄綔寮圭獥 -->
+    <OutboundDialog
+      v-model:visible="outboundVisible"  
+      :selected-document="selectedOutboundDocument"  
+      @outbound-success="handleOutboundSuccess"  
+    ></OutboundDialog>
+</template>
+    <script>
+import extend from "@/extension/outbound/allocateoutboundOrder.js";
+import ViewGrid from '@/components/basic/ViewGrid/ViewGrid.vue'; 
+import { ref, defineComponent } from "vue";
+import { ElMessage } from "element-plus";
+import OutboundDialog from "@/extension/outbound/extend/OutBound.vue";  // 寮曞叆鍑哄簱寮圭獥缁勪欢
+ 
+
+export default defineComponent({
+   components: {
+    // 鍏抽敭淇2锛氱粍浠舵敞鍐屽悕涓庢ā鏉挎爣绛惧悕閫傞厤锛坘ebab-case瀵瑰簲view-grid锛�
+    viewGrid: ViewGrid,  // 娉ㄥ唽涓簁ebab-case锛屾ā鏉跨敤<view-grid>
+    OutboundDialog  // 娉ㄥ唽鍑哄簱寮圭獥缁勪欢
+  },
+  setup() {
+    const table = ref({
+      key: "id",
+      footer: "Foots",
+      cnName: "璋冩嫧鍗�(澶栭儴浠撳簱璋冩櫤浠�)",
+      name: "outboundOrder",
+      url: "/OutboundOrder/",
+      sortName: "id",
+    });
+    const editFormFields = ref({
+      orderType: "",
+      orderNo:"",
+      upperOrderNo: "",
+      orderStatus: "",
+      remark: "",
+      warehouseId:""
+    });
+    const editFormOptions = ref([
+      [
+        {
+          title: "鍗曟嵁绫诲瀷",
+          required: true,
+          field: "orderType",
+          type: "select",
+          dataKey: "outOrderType",
+          data: [],
+        },
+        {
+        field: "orderNo",
+        title: "鍗曟嵁缂栧彿",
+        type: "string",
+        readonly:true
+      },
+        {
+          title: "涓婃父鍗曟嵁缂栧彿",
+          field: "upperOrderNo",
+          type: "string",
+        },
+        {
+          title: "鍗曟嵁鐘舵��",
+          field: "orderStatus",
+          type: "select",
+          dataKey: "inboundState",
+          data: [],
+          readonly: true,
+        },
+        {
+          title: "浠撳簱",
+          field: "warehouseId",
+          type: "select",
+          dataKey: "warehouses",
+          data: [],
+          required: true,
+        },
+        {
+          title: "澶囨敞",
+          field: "remark",
+          type: "textarea",
+        },
+      ],
+    ]);
+    const searchFormFields = ref({
+      orderNo: "",
+      upperOrderNo: "",
+      orderType: "215",
+      orderStatus: "",
+      createType: "",
+      creater: "",
+      createDate: "",
+    });
+    const searchFormOptions = ref([
+      [
+        { title: "鍗曟嵁缂栧彿", field: "orderNo", type: "like" },
+        { title: "涓婃父鍗曟嵁缂栧彿", field: "upperOrderNo", type: "like" },
+        {
+          title: "鍗曟嵁绫诲瀷",
+          field: "orderType",
+          type: "select",
+          dataKey: "outOrderType",
+          data: [],
+        },
+        {
+          title: "鍗曟嵁鐘舵��",
+          field: "orderStatus",
+          type: "select",
+          dataKey: "outboundStatusEnum",
+          data: [],
+        },
+      ],
+      [
+        {
+          title: "鍒涘缓鏂瑰紡",
+          field: "createType",
+          type: "select",
+          dataKey: "createType",
+          data: [],
+        },
+        { title: "鍒涘缓鑰�", field: "creater", type: "like" },
+        { title: "鍒涘缓鏃堕棿", field: "createDate", type: "datetime" },
+      ],
+    ]);
+    const columns = ref([
+      {
+        field: "id",
+        title: "Id",
+        type: "int",
+        width: 90,
+        hidden: true,
+        readonly: true,
+        require: true,
+        align: "left",
+      },
+      {
+        field: "orderNo",
+        title: "鍗曟嵁缂栧彿",
+        type: "string",
+        width: 160,
+        align: "left",
+        // link: true,
+      },
+      {
+        field: "upperOrderNo",
+        title: "涓婃父鍗曟嵁缂栧彿",
+        type: "string",
+        width: 160,
+        align: "left",
+      },
+      {
+        field: "orderType",
+        title: "鍗曟嵁绫诲瀷",
+        type: "string",
+        width: 150,
+        align: "left",
+        bind: { key: "outOrderType", data: [] },
+      },
+      {
+        field: "businessType",
+        title: "涓氬姟绫诲瀷",
+        type: "string",
+        width: 150,
+        align: "left",
+        bind: { key: "businessType", data: [] },
+      },
+      {
+        field: "orderStatus",
+        title: "鍗曟嵁鐘舵��",
+        type: "decimal",
+        width: 90,
+        align: "left",
+        bind: { key: "outboundStatusEnum", data: [] },
+      },
+      {
+        field: "createType",
+        title: "鍒涘缓鏂瑰紡",
+        type: "string",
+        width: 120,
+        align: "left",
+        bind: { key: "createType", data: [] },
+      },
+      {
+        field: "factoryArea",
+        title: "鍘傚尯",
+        type: "string",
+        width: 120,
+        align: "left"
+      },
+      {
+        field: "departmentCode",
+        title: "淇敼鏃堕棿",
+        type: "string",
+        width: 120,
+        align: "left",
+        hidden:true
+      },
+      {
+        field: "departmentName",
+        title: "閮ㄩ棬鍚嶇О",
+        type: "string",
+        width: 160,
+        align: "left",
+      },
+      {
+        field: "creater",
+        title: "鍒涘缓浜�",
+        type: "string",
+        width: 90,
+        align: "left",
+      },
+      {
+        field: "createDate",
+        title: "鍒涘缓鏃堕棿",
+        type: "datetime",
+        width: 160,
+        align: "left",
+      },
+      {
+        field: "modifier",
+        title: "淇敼浜�",
+        type: "string",
+        width: 100,
+        align: "left",
+      },
+      {
+        field: "modifyDate",
+        title: "淇敼鏃堕棿",
+        type: "datetime",
+        width: 160,
+        align: "left",
+      },
+      {
+        field: "remark",
+        title: "澶囨敞",
+        type: "string",
+        width: 100,
+        align: "left",
+      },
+    ]);
+    const detail = ref({
+      cnName: "璋冩嫧鏄庣粏鍗�",
+      table: "OnboundOrderDetail",
+      columns: [
+        {
+          field: "id",
+          title: "Id",
+          type: "int",
+          width: 90,
+          hidden: true,
+          readonly: true,
+          require: true,
+          align: "left",
+        },
+        {
+          field: "orderId",
+          title: "璋冩嫧鍗曚富閿�",
+          type: "string",
+          width: 90,
+          align: "left",
+          hidden: true,
+        },
+        {
+          field: "materielCode",
+          title: "鐗╂枡缂栧彿",
+          type: "string",
+          width: 150,
+          align: "left",
+          edit: { type: "string" },
+          required: true,
+        },
+        {
+          field: "materielName",
+          title: "鐗╂枡鍚嶇О",
+          type: "string",
+          width: 150,
+          align: "left",
+          edit: { type: "string" },
+        },
+        {
+          field: "batchNo",
+          title: "鎵规鍙�",
+          type: "decimal",
+          width: 90,
+          align: "left",
+          edit: { type: "string" },
+          required: true,
+        },
+        {
+          field: "supplyCode",
+          title: "渚涘簲鍟嗙紪鍙�",
+          type: "string",
+          width: 90,
+          align: "left",
+          edit: { type: "string" },
+          required: true,
+        },
+        {
+          field: "orderQuantity",
+          title: "鍗曟嵁鏁伴噺",
+          type: "string",
+          width: 90,
+          align: "left",
+          edit: { type: "number" },
+          required: true,
+        },
+        {
+          field: "rowNo",
+          title: "琛屽彿",
+          type: "string",
+          width: 90,
+          align: "left",
+          edit: { type: "number" },
+          required: true,
+        },
+        {
+          field: "lockQuantity",
+          title: "閿佸畾鏁伴噺",
+          type: "int",
+          width: 120,
+          align: "left",
+        },
+        {
+          field: "overOutQuantity",
+          title: "宸插嚭鏁伴噺",
+          type: "string",
+          width: 200,
+          align: "left",
+        },
+        {
+          field: "orderDetailStatus",
+          title: "璁㈠崟鏄庣粏鐘舵��",
+          type: "string",
+          width: 180,
+          align: "left",
+          bind: { key: "orderDetailStatusEnum", data: [] },
+        },
+        {
+          field: "creater",
+          title: "鍒涘缓浜�",
+          type: "string",
+          width: 90,
+          align: "left",
+        },
+        {
+          field: "createDate",
+          title: "鍒涘缓鏃堕棿",
+          type: "datetime",
+          width: 160,
+          align: "left",
+        },
+        {
+          field: "modifier",
+          title: "淇敼浜�",
+          type: "string",
+          width: 100,
+          align: "left",
+        },
+        {
+          field: "modifyDate",
+          title: "淇敼鏃堕棿",
+          type: "datetime",
+          width: 160,
+          align: "left",
+        },
+        {
+          field: "remark",
+          title: "澶囨敞",
+          type: "string",
+          width: 100,
+          align: "left",
+        },
+      ],
+      sortName: "id",
+      key: "id",
+    });
+      // 璋冩嫧寮圭獥鐩稿叧
+    const outboundVisible = ref(false);
+    const selectedOutboundDocument = ref({});  // 瀛樺偍閫変腑鐨勮皟鎷ㄥ崟鏁版嵁
+
+    // 鎵撳紑璋冩嫧寮圭獥锛堜粠鎵╁睍閰嶇疆鐨勬寜閽簨浠惰Е鍙戯級
+    const handleOpenOutboundDialog = (docData) => {
+      selectedOutboundDocument.value = docData;  // 淇濆瓨閫変腑鐨勫崟鎹暟鎹�
+      outboundVisible.value = true;  // 鏄剧ず寮圭獥
+    };
+
+    // 璋冩嫧鎴愬姛鍚庣殑鍥炶皟
+    const handleOutboundSuccess = (docNo) => {
+      ElMessage.success(`鍗曟嵁 ${docNo} 璋冩嫧鎴愬姛`);
+      gridRef.value?.refresh();  // 鍒锋柊琛ㄦ牸鏁版嵁
+    };
+
+    // 鍒濆鍖栨墿灞曢厤缃細涓鸿皟鎷ㄦ寜閽坊鍔犱簨浠惰Е鍙戦�昏緫
+    const initExtension = () => {
+      // 鎵惧埌"璋冩嫧"鎸夐挳骞剁粦瀹氭墦寮�寮圭獥鐨勯�昏緫
+      const outboundBtn = extend.buttons.view.find(btn => btn.name === '鍑哄簱');
+      if (outboundBtn) {
+        const originalOnClick = outboundBtn.onClick;
+        outboundBtn.onClick = function() {
+          // 鍏堟墽琛屽師鏈夋牎楠岄�昏緫
+          const selectedRows = this.$refs.table.getSelected();
+          if (selectedRows.length === 1) {
+            // 鏍¢獙閫氳繃鍚庯紝瑙﹀彂涓荤粍浠剁殑鍑哄簱寮圭獥浜嬩欢
+            this.$emit('openOutboundDialog', selectedRows[0]);
+          } else {
+            // 鍘熸湁閫昏緫宸插鐞嗘彁绀猴紝鏃犻渶閲嶅
+            originalOnClick.call(this);
+          }
+        };
+      }
+    };
+    return {
+      table,
+      extend,
+      editFormFields,
+      editFormOptions,
+      searchFormFields,
+      searchFormOptions,
+      columns,
+      detail,
+       // 鍑哄簱鐩稿叧
+      outboundVisible,
+      selectedOutboundDocument,
+      handleOpenOutboundDialog,
+      handleOutboundSuccess 
+    };
+  },
+});
+</script>
+    
\ 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.878.3237/CodeChunks.db-shm" "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.878.3237/CodeChunks.db-shm"
index 184b599..281e03c 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.878.3237/CodeChunks.db-shm"
+++ "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.878.3237/CodeChunks.db-shm"
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.878.3237/SemanticSymbols.db-shm" "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.878.3237/SemanticSymbols.db-shm"
index 890e021..5c3038d 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.878.3237/SemanticSymbols.db-shm"
+++ "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.878.3237/SemanticSymbols.db-shm"
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/InvokeMESService.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/InvokeMESService.cs"
index 328c761..9d98d85 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/InvokeMESService.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/InvokeMESService.cs"
@@ -12,6 +12,7 @@
 using System.Threading.Tasks;
 using WIDESEA_Core;
 using WIDESEA_Core.BaseRepository;
+using WIDESEA_DTO.Allocate;
 using WIDESEA_DTO.Basic;
 using WIDESEA_DTO.Inbound;
 using WIDESEA_DTO.Outbound;
@@ -41,6 +42,12 @@
             _inboundOrderRepository = inboundOrderRepository;
         }
 
+        /// <summary>
+        /// 鍏ュ簱鍙嶉
+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        /// <exception cref="HttpRequestException"></exception>
         public async Task<ResponseModel> FeedbackInbound(FeedbackInboundRequestModel model)
         {
             string json =JsonConvert.SerializeObject(model, new JsonSerializerSettings
@@ -63,7 +70,13 @@
 
             return JsonConvert.DeserializeObject<ResponseModel>(body);
         }
-
+             
+        /// <summary>
+        /// 鍑哄簱鍙嶉
+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        /// <exception cref="HttpRequestException"></exception>
         public async Task<ResponseModel> FeedbackOutbound(FeedbackOutboundRequestModel model)
         {
             string json = JsonConvert.SerializeObject(model, new JsonSerializerSettings
@@ -86,6 +99,29 @@
                 throw new HttpRequestException(body);
             }
 
+
+            return JsonConvert.DeserializeObject<ResponseModel>(body);
+        }
+
+        public async Task<ResponseModel> FeedbackAllocate(AllocateDto model)
+        {
+            string json = JsonConvert.SerializeObject(model, new JsonSerializerSettings
+            {
+                ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver()
+            });
+            var content = new StringContent(json, Encoding.UTF8, "application/json");
+            var _client = _httpClientFactory.CreateClient("MESUrl");
+            _client.DefaultRequestHeaders.Clear();
+            _client.DefaultRequestHeaders.Add("Accept", "application/json");
+            _logger.LogInformation("InvokeMESService  FeedbackAllocate :  " + json);
+            var response = await _client.PostAsync("AldAllocationOperation/AllocationOperation", content);
+            string body = await response.Content.ReadAsStringAsync();
+            _logger.LogInformation("InvokeMESService  FeedbackAllocate  body:  " + body);
+            if (!response.IsSuccessStatusCode)
+            {
+
+                throw new HttpRequestException(body);
+            }
 
             return JsonConvert.DeserializeObject<ResponseModel>(body);
         }
@@ -116,10 +152,11 @@
 
             var content = new StringContent(json, Encoding.UTF8, "application/json");
 
-            _logger.LogInformation("InvokeMESService  FeedbackInbound :  " + json);
+            _logger.LogInformation("InvokeMESService  NewMaterielToMes :  " + json);
 
             using var response = await client.PostAsync("AldBarcodeInformation/BarcodeInformation", content);
             var responseText = await response.Content.ReadAsStringAsync();
+            _logger.LogInformation("InvokeMESService  NewMaterielToMes  body:  " + responseText);
             if (!response.IsSuccessStatusCode)
             {
                 throw new HttpRequestException(responseText);
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/LocationInfoService.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/LocationInfoService.cs"
index 82bbeeb..48640ac 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/LocationInfoService.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/LocationInfoService.cs"
@@ -140,7 +140,7 @@
 
                 List<string> lockLocationCodes = locationCaches.Select(x => x.LocationCode).ToList();
 
-                Dictionary<string, OrderByType> orderBy = new Dictionary<string, OrderByType>()
+                Dictionary<string, SqlSugar.OrderByType> orderBy = new Dictionary<string, OrderByType>()
                 {
                     { nameof(Dt_LocationInfo.RoadwayNo),OrderByType.Asc },
                     { nameof(Dt_LocationInfo.Layer),OrderByType.Asc },
@@ -153,7 +153,11 @@
                 if (first != null)
                 {
                     locationCaches.Add(new LocationCache { LocationCode = first?.LocationCode, DateTime = DateTime.Now });
-                }
+                    Db.Updateable<Dt_LocationInfo>().SetColumns(x => new Dt_LocationInfo
+                    {
+                        LocationStatus = (int)LocationStatusEnum.InStockLock,
+                    }).Where(x => x.Id == first.Id).ExecuteCommand();
+                }        
 
                 return first;
             }
@@ -182,8 +186,10 @@
                 };
 
                 var first = BaseDal.QueryFirst(x => x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && x.EnableStatus != EnableStatusEnum.Disable.ObjToInt() && !lockLocationCodes.Contains(x.LocationCode), orderBy);//鏌ヨ绌鸿揣浣嶄俊鎭苟鎺掗櫎5鍒嗛挓鍐呭垎閰嶇殑璐т綅,鏍规嵁灞傘�佸垪銆佹繁搴︺�佽鎺掑簭
-
-                locationCaches.Add(new LocationCache { LocationCode = first.LocationCode, DateTime = DateTime.Now });
+                if (first != null)
+                {
+                    locationCaches.Add(new LocationCache { LocationCode = first.LocationCode, DateTime = DateTime.Now });
+                }
 
                 return first;
             }
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/MaterielToMesService.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/MaterielToMesService.cs"
index 9aa41ab..ea0a8d1 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/MaterielToMesService.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/MaterielToMesService.cs"
@@ -1,4 +1,6 @@
-锘縰sing Newtonsoft.Json;
+锘縰sing Dm.filter;
+using Microsoft.Extensions.Logging;
+using Newtonsoft.Json;
 using Newtonsoft.Json.Serialization;
 using System;
 using System.Collections.Generic;
@@ -9,6 +11,7 @@
 using WIDESEA_Core.BaseRepository;
 using WIDESEA_Core.BaseServices;
 using WIDESEA_Core.Helper;
+using WIDESEA_DTO.Basic;
 using WIDESEA_DTO.Outbound;
 using WIDESEA_IBasicService;
 using WIDESEA_Model.Models;
@@ -19,10 +22,11 @@
     internal class MaterielToMesService : ServiceBase<Dt_MaterielToMes, IRepository<Dt_MaterielToMes>>, IMaterielToMesService
     {
         private readonly IInvokeMESService _invokeMESService;
-
-        public MaterielToMesService(IRepository<Dt_MaterielToMes> BaseDal, IInvokeMESService invokeMESService) : base(BaseDal)
+        private readonly ILogger<MaterielToMesService> _logger;
+        public MaterielToMesService(IRepository<Dt_MaterielToMes> BaseDal, IInvokeMESService invokeMESService, ILogger<MaterielToMesService> logger) : base(BaseDal)
         {
             _invokeMESService = invokeMESService;
+            _logger = logger;
         }
         // 鍒涘缓涓�涓娇鐢ㄥ皬椹煎嘲鍛藉悕娉曠殑搴忓垪鍖栬缃�
         JsonSerializerSettings settings = new JsonSerializerSettings
@@ -31,29 +35,50 @@
         };
         public IRepository<Dt_MaterielToMes> Repository => BaseDal;
 
-        public override WebResponseContent AddData(Dt_MaterielToMes saveModel)
+        public async Task<WebResponseContent> AddMaterielToMes(Dt_MaterielToMes saveModel,int operationtype)
         {
-
-            WebResponseContent content = base.AddData(saveModel);
-            if (content.Status)
+            try
             {
- 
+                base.AddData(saveModel);
 
-                string request = JsonConvert.SerializeObject(saveModel, settings);
-             
+                MaterielToMesDTO dto = new MaterielToMesDTO
+                {
+                    batchNo = saveModel.BatchNo,
+                    factoryArea = saveModel.factoryArea,
+                    materialCode = saveModel.MaterielCode,
+                    newmaterialCode = saveModel.NewMaterialBarCode,
+                    oldmaterialCode = saveModel.OldMaterialBarCode,
+                    operationType = 1,
+                    qty = saveModel.Qty,
+                    supplyCode = saveModel.supplyCode,
+                    unit = saveModel.Unit,
+                    warehouseCode = saveModel.warehouseCode,
+                    reqCode = Guid.NewGuid().ToString(),
+                    reqTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
+                };
+
+                var result = await _invokeMESService.NewMaterielToMes(dto);
+
+                if (result != null && result.code == 200)
+                {
+                    await Db.Updateable<Dt_MaterielToMes>()
+                      .SetColumns(it => it.ReturnToMESStatus ==1)
+                      .Where(it => it.Id == saveModel.Id)
+                      .ExecuteCommandAsync();
+                }
 
                 return WebResponseContent.Instance.OK();
             }
-            else
+            catch (Exception ex)
             {
-                return content;
+                _logger.LogError("MaterielToMesService  add Dt_MaterielToMes:  " + ex.Message);
+                return WebResponseContent.Instance.Error(ex.Message);
             }
 
 
-            
         }
 
 
-       
+
     }
 }
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_Common/StockEnum/OutLockStockStatusEnum.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_Common/StockEnum/OutLockStockStatusEnum.cs"
index eca1209..2cc1115 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_Common/StockEnum/OutLockStockStatusEnum.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_Common/StockEnum/OutLockStockStatusEnum.cs"
@@ -21,7 +21,7 @@
         宸叉媶鍖� = 1,
         宸叉挙閿� = 2,
         宸叉嫞閫� = 3,
-        宸插洖搴� = 4
+        宸插洖搴� = 4,
     }
     public enum OutLockStockStatusEnum
     {
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_Common/StockEnum/StockStatusEmun.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_Common/StockEnum/StockStatusEmun.cs"
index 5321f46..d10b600 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_Common/StockEnum/StockStatusEmun.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_Common/StockEnum/StockStatusEmun.cs"
@@ -58,7 +58,7 @@
 
         [Description("鍏ュ簱纭")]
         鍏ュ簱纭 = 3,
-
+    
         [Description("鍏ュ簱瀹屾垚")]
         鍏ュ簱瀹屾垚 = 6,
 
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/Allocate/AllocateDto.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/Allocate/AllocateDto.cs"
index d81c4d1..e823023 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/Allocate/AllocateDto.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/Allocate/AllocateDto.cs"
@@ -25,7 +25,7 @@
         /// 璇锋眰鏃堕棿
         /// </summary>
         [JsonProperty("reqTime")]
-        public DateTime ReqTime { get; set; }
+        public string ReqTime { get; set; }
 
         /// <summary>
         /// 璁㈠崟缂栧彿
@@ -39,6 +39,10 @@
         [JsonProperty("business_type")]
         public string BusinessType { get; set; }
 
+        public string fromWarehouse { get; set; }
+
+        public string toWarehouse { get; set; }
+
         /// <summary>
         /// 鏄惁鍒嗘壒
         /// </summary>
@@ -51,6 +55,9 @@
         [JsonProperty("factoryArea")]
         public string FactoryArea { get; set; }
 
+        [JsonProperty("operator")]
+        public string Operator { get; set; }
+
         /// <summary>
         /// 鎿嶄綔绫诲瀷
         /// </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/Outbound/OutboundOrderGetDTO.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/Outbound/OutboundOrderGetDTO.cs"
index b39c856..8381ea6 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/Outbound/OutboundOrderGetDTO.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/Outbound/OutboundOrderGetDTO.cs"
@@ -52,7 +52,7 @@
     public class SummaryPickingDto
     {
 
-       public string PalletCode { get; set; }
+        public string PalletCode { get; set; }
         public string MaterielCode { get; set; }
         public int UnpickedCount { get; set; }
         public decimal UnpickedQuantity { get; set; }
@@ -180,7 +180,7 @@
         public string OrderNo { get; set; } = string.Empty; // 鍑哄簱鍗曞彿
     }
 
- 
+
 
     public class PickingConfirmReq
     {
@@ -189,7 +189,7 @@
         public string MaterielBarcode { get; set; } = string.Empty; // 鐗╂枡鏉$爜
     }
 
- 
+
 
     public class SplitPackageReq
     {
@@ -198,7 +198,7 @@
         public decimal SplitQty { get; set; } // 鏂版潯鐮佸垎閰嶆暟閲�
     }
 
- 
+
 
     public class StockReturnReq
     {
@@ -206,14 +206,14 @@
         public string TaskNum { get; set; } = string.Empty; // 浠诲姟鍙凤紙鍙�夛級
     }
 
- 
+
 
     public class OutStockLockDetailReq
     {
         public long OutStockLockId { get; set; } // 鍑哄簱璇︽儏ID
     }
 
- 
+
 
     public class MaterielBarcodeValidateResp
     {
@@ -222,7 +222,7 @@
         public decimal PackageQty { get; set; } // 鏁村寘鏁伴噺锛堝垎閰嶆暟閲忥級
         public string Message { get; set; } = string.Empty;
     }
- 
+
 
     public class OutStockLockDetailResp
     {
@@ -230,7 +230,7 @@
         public decimal AssignQuantity { get; set; }
     }
 
- 
+
 
     public class OutStockLockListResp
     {
@@ -244,7 +244,7 @@
         public bool IsSplitted { get; set; }
     }
 
- 
+
 
     public class PickedRecordListResp
     {
@@ -278,9 +278,21 @@
     // 鎷嗗寘缁撴灉绫�
     public class SplitResult
     {
-        public string OriginalBarcode { get; set; }
-        public string NewBarcode { get; set; }
-        public decimal SplitQuantity { get; set; }
-        public decimal RemainQuantity { get; set; }
+        public string materialCode { get; set; }
+        public string supplierCode { get; set; }
+
+        public string quantityTotal { get; set; }
+
+        public string batchNumber { get; set; }
+
+        public string  batch { get; set; }
+        public string factory { get; set; }
+
+        public string date { get; set; }
+
+       // public string OriginalBarcode { get; set; }
+       // public string NewBarcode { get; set; }
+        //public decimal SplitQuantity { get; set; }
+        //public decimal RemainQuantity { 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_IBasicService/IInvokeMESService.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/IInvokeMESService.cs"
index ddbb348..e52066e 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/IInvokeMESService.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/IInvokeMESService.cs"
@@ -4,6 +4,7 @@
 using System.Text;
 using System.Threading.Tasks;
 using WIDESEA_Core;
+using WIDESEA_DTO.Allocate;
 using WIDESEA_DTO.Basic;
 using WIDESEA_DTO.Inbound;
 using WIDESEA_DTO.Outbound;
@@ -16,6 +17,7 @@
 
         Task<ResponseModel> FeedbackOutbound(FeedbackOutboundRequestModel model);
 
+        Task<ResponseModel> FeedbackAllocate(AllocateDto model);
         Task<string> GetToken(String username, string password);
 
         Task<ResponseModel> NewMaterielToMes(MaterielToMesDTO model);
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/IMaterielToMesService.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/IMaterielToMesService.cs"
index d5aff9e..bc1e9f4 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/IMaterielToMesService.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/IMaterielToMesService.cs"
@@ -3,6 +3,7 @@
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
+using WIDESEA_Core;
 using WIDESEA_Core.BaseRepository;
 using WIDESEA_Core.BaseServices;
 using WIDESEA_Model.Models;
@@ -13,5 +14,7 @@
     public interface IMaterielToMesService : IService<Dt_MaterielToMes>
     {
         IRepository<Dt_MaterielToMes> Repository { get; }
+
+        Task<WebResponseContent> AddMaterielToMes(Dt_MaterielToMes saveModel, int operationtype);
     }
 }
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_IOutboundService/IOutStockLockInfoService.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_IOutboundService/IOutStockLockInfoService.cs"
index 2aa1ffd..a97e67f 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_IOutboundService/IOutStockLockInfoService.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_IOutboundService/IOutStockLockInfoService.cs"
@@ -27,6 +27,8 @@
 
         Task<LockInfoDetailDto> GetLockInfoDetail(int lockInfoId);
         Dt_OutStockLockInfo GetOutStockLockInfo(Dt_OutboundOrder outboundOrder,Dt_OutboundOrderDetail outboundOrderDetail,Dt_StockInfo outStock, decimal assignQuantity, string barcode = null);
+
+        List<Dt_OutStockLockInfo> GetOutStockLockInfos(Dt_OutboundOrder outboundOrder, Dt_OutboundOrderDetail outboundOrderDetail, List<Dt_StockInfo> outStocks, int? taskNum = null);
         Task<List<Dt_OutStockLockInfo>> GetPalletLockInfos(string palletCode);
         Task<WebResponseContent> UpdateLockInfoBarcode(int lockInfoId, string newBarcode);
     }
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_IOutboundService/IOutboundOrderDetailService.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_IOutboundService/IOutboundOrderDetailService.cs"
index 6ff92b0..3525497 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_IOutboundService/IOutboundOrderDetailService.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_IOutboundService/IOutboundOrderDetailService.cs"
@@ -21,7 +21,7 @@
         public (List<Dt_StockInfo>, List<Dt_OutboundOrderDetail>, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>) AssignStockOutbound(List<Dt_OutboundOrderDetail> outboundOrderDetails);
 
         WebResponseContent LockOutboundStockDataUpdate(List<Dt_StockInfo> stockInfos, List<Dt_OutboundOrderDetail> outboundOrderDetails, List<Dt_OutStockLockInfo> outStockLockInfos, List<Dt_LocationInfo> locationInfos, LocationStatusEnum locationStatus = LocationStatusEnum.Lock, List<Dt_Task>? tasks = null);
-
+        (List<Dt_StockInfo>, Dt_OutboundOrderDetail, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>) AssignStockOutbound(Dt_OutboundOrderDetail outboundOrderDetail, List<StockSelectViewDTO> stockSelectViews);
         //List<Dt_OutboundOrderDetail> GetOutboundStockDataById(int id);
 
     }
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_IOutboundService/IOutboundPickingService.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_IOutboundService/IOutboundPickingService.cs"
index affec24..860e955 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_IOutboundService/IOutboundPickingService.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_IOutboundService/IOutboundPickingService.cs"
@@ -15,17 +15,14 @@
     {
         IRepository<Dt_PickingRecord> Repository { get; }
 
-        Task<WebResponseContent> CancelPicking(string orderNo, string palletCode, string barcode);
-        Task<bool> CheckPalletNeedReturn(string orderNo, string palletCode);
-        Task<WebResponseContent> ConfirmPicking(string orderNo, string palletCode, string barcode);
-        Task<WebResponseContent> DirectOutbound(DirectOutboundRequest request);
-        Task<List<OutStockLockListResp>> GetOutStockLockListAsync(string orderNo);
-        Task<WebResponseContent> GetPalletOutboundStatus(string palletCode);
-        Task<List<Dt_OutStockLockInfo>> GetPickedList(string orderNo, string palletCode);
-        Task<List<Dt_PickingRecord>> GetPickingHistory(int orderId);
         Task<object> GetPickingSummary(ConfirmPickingDto dto);
+
         Task<List<Dt_OutStockLockInfo>> GetUnpickedList(string orderNo, string palletCode);
+
+        Task<List<Dt_OutStockLockInfo>> GetPickedList(string orderNo, string palletCode);
+
+        Task<WebResponseContent> CancelPicking(string orderNo, string palletCode, string barcode);
+        Task<WebResponseContent> ConfirmPicking(string orderNo, string palletCode, string barcode);
         Task<WebResponseContent> ReturnRemaining(string orderNo, string palletCode, string reason);
-        Task<WebResponseContent> ValidateBarcode(string barcode);
     }
 }
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_IStockService/IStockInfoService.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_IStockService/IStockInfoService.cs"
index 0af78c6..34899a9 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_IStockService/IStockInfoService.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_IStockService/IStockInfoService.cs"
@@ -9,7 +9,7 @@
     {
         IRepository<Dt_StockInfo> Repository { get; }
         Dt_StockInfo? GetStockByPalletCode(string palletCode);
-
+        List<Dt_StockInfo> GetStockInfosByPalletCodes(List<string> palletCodes);
         List<Dt_StockInfo> GetStockInfos(string materielCode, string lotNo, string supplyCode, List<string> locationCodes);
 
         List<Dt_StockInfo> GetUseableStocks(string materielCode, string batchNo,string supplyCode);
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_ITaskInfoService/ITaskService.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_ITaskInfoService/ITaskService.cs"
index 1d84bf7..43c9e48 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_ITaskInfoService/ITaskService.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_ITaskInfoService/ITaskService.cs"
@@ -45,6 +45,9 @@
         Task<WebResponseContent> TaskCompleted(string taskNum);
 
         Task<WebResponseContent> GenerateOutboundTasksAsync(int[] keys, string outStation);
- 
+
+        WebResponseContent GenerateOutboundTask(int orderDetailId, List<StockSelectViewDTO> stockSelectViews);
+
+
     }
 }
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_InboundService/InboundOrderService.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_InboundService/InboundOrderService.cs"
index c89c12a..0d63ad2 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_InboundService/InboundOrderService.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_InboundService/InboundOrderService.cs"
@@ -37,10 +37,11 @@
         private readonly IRepository<Dt_StockInfoDetail> _stockDetailRepository;
         private readonly IRepository<Dt_InboundOrder> _inboundOrderRepository;
         private readonly IRepository<Dt_WarehouseArea> _warehouseAreaRepository;
+        private readonly IRepository<Dt_LocationType> _locationTypeRepository;
         private readonly IRepository<Dt_StockInfo> _stockRepository;
         public IRepository<Dt_InboundOrder> Repository => BaseDal;
 
-        public InboundOrderService(IRepository<Dt_InboundOrder> BaseDal, IMapper mapper, IUnitOfWorkManage unitOfWorkManage, IRepository<Dt_InboundOrderDetail> inboundOrderDetailRepository, IRepository<Dt_Task> taskRepository, IStockService stockService, IInboundOrderDetailService inboundOrderDetailService, IMaterialUnitService materialUnitService, IRepository<Dt_StockInfoDetail> stockDetailRepository, IRepository<Dt_InboundOrder> inboundOrderRepository, IRepository<Dt_WarehouseArea> warehouseAreaRepository,IRepository<Dt_StockInfo> stockRepository) : base(BaseDal)
+        public InboundOrderService(IRepository<Dt_InboundOrder> BaseDal, IMapper mapper, IUnitOfWorkManage unitOfWorkManage, IRepository<Dt_InboundOrderDetail> inboundOrderDetailRepository, IRepository<Dt_Task> taskRepository, IStockService stockService, IInboundOrderDetailService inboundOrderDetailService, IMaterialUnitService materialUnitService, IRepository<Dt_StockInfoDetail> stockDetailRepository, IRepository<Dt_InboundOrder> inboundOrderRepository, IRepository<Dt_WarehouseArea> warehouseAreaRepository, IRepository<Dt_StockInfo> stockRepository, IRepository<Dt_LocationType> locationTypeRepository) : base(BaseDal)
         {
             _mapper = mapper;
             _unitOfWorkManage = unitOfWorkManage;
@@ -53,6 +54,7 @@
             _inboundOrderRepository = inboundOrderRepository;
             _warehouseAreaRepository = warehouseAreaRepository;
             _stockRepository = stockRepository;
+            _locationTypeRepository = locationTypeRepository;
         }
 
         public async Task<WebResponseContent> ReceiveInboundOrder(List<Dt_InboundOrder> models, int operateType)
@@ -431,10 +433,10 @@
                 (bool, string, object?) result2 = ModelValidate.ValidateModelData(materielGroupDTO);
                 if (!result2.Item1) return content = WebResponseContent.Instance.Error(result2.Item2);
 
-                bool code = _warehouseAreaRepository.Db.Queryable<Dt_WarehouseArea>().Where(x => x.Id == materielGroupDTO.WarehouseCode).Any();
+                bool code = _locationTypeRepository.Db.Queryable<Dt_LocationType>().Where(x => x.LocationType == materielGroupDTO.WarehouseCode).Any();
                 if (!code)
                 {
-                    return content = WebResponseContent.Instance.Error($"浠撳簱涓病鏈夎{materielGroupDTO.WarehouseCode}缂栧彿銆�");
+                    return content = WebResponseContent.Instance.Error($"鍖哄煙涓病鏈夎{materielGroupDTO.WarehouseCode}缂栧彿銆�");
                 }
 
                 if(_stockRepository.QueryFirst(x=>x.PalletCode == materielGroupDTO.PalletCode)!=null){
@@ -637,7 +639,7 @@
             {
                 return WebResponseContent.Instance.Error("鎵樼洏鍙蜂笉鑳戒负绌�");
             }
-           var stock= _stockRepository.Db.Queryable<Dt_StockInfo>().Includes(o=>o.Details).First(x => x.PalletCode == palletCode && x.StockStatus==3);
+           var stock= _stockRepository.Db.Queryable<Dt_StockInfo>().Includes(o=>o.Details).First(x => x.PalletCode == palletCode );
             if (stock == null)
             {
                 return WebResponseContent.Instance.Error($"鏈壘鍒版墭鐩樺彿{palletCode}瀵瑰簲鐨勫簱瀛樿褰�");
@@ -652,7 +654,6 @@
 
             var barcodes = stock.Details.Select(d => d.Barcode).ToList();
 
-            
                 // 鍖归厤搴撳瓨鏉$爜瀵瑰簲鐨勫叆搴撳崟鏄庣粏
                 var matchedInboundDetails = inboundOrders.Details
                     ?.Where(d => barcodes.Contains(d.Barcode))
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/Basic/Dt_MaterielToMes.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/Basic/Dt_MaterielToMes.cs"
index 1bc54da..3ea82c3 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/Basic/Dt_MaterielToMes.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/Basic/Dt_MaterielToMes.cs"
@@ -87,7 +87,7 @@
         public string MaterielCode { get; set; } = null!;
 
          
-
+        public int ReturnToMESStatus { 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_Model/Models/Outbound/Dt_OutboundLockInfo.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_OutboundLockInfo.cs"
index 29b6b66..02db493 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_OutboundLockInfo.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_OutboundLockInfo.cs"
@@ -128,6 +128,9 @@
 
         public int? ParentLockId { get; set; }
 
+        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "鎿嶄綔鑰�")]
+        public string Operator { get; set; }
+
         [Navigate(NavigateType.OneToOne, nameof(StockInfo))]//涓�瀵逛竴 SchoolId鏄疭tudentA绫婚噷闈㈢殑
         public Dt_StockInfo StockInfo { get; set; } //涓嶈兘璧嬪�煎彧鑳芥槸null
 
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_OutboundService/OutStockLockInfoService.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/OutStockLockInfoService.cs"
index 0e84c80..489eb5a 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/OutStockLockInfoService.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/OutStockLockInfoService.cs"
@@ -57,20 +57,22 @@
 
             // 纭畾鏉$爜
             string targetBarcode;
+            var  firstAvailableDetail=new Dt_StockInfoDetail();  
             if (!string.IsNullOrEmpty(barcode))
             {
                 // 楠岃瘉鎸囧畾鐨勬潯鐮佹槸鍚﹀瓨鍦�
-                var specifiedBarcodeDetail = stockDetails.FirstOrDefault(x => x.Barcode == barcode);
-                if (specifiedBarcodeDetail == null)
+                firstAvailableDetail = stockDetails.FirstOrDefault(x => x.Barcode == barcode);
+                if (firstAvailableDetail == null)
                 {
                     throw new Exception($"鎸囧畾鐨勬潯鐮乕{barcode}]鍦ㄥ簱瀛樹腑涓嶅瓨鍦�");
                 }
+
                 targetBarcode = barcode;
             }
             else
             {
                 // 浣跨敤绗竴涓彲鐢ㄦ潯鐮�
-                var firstAvailableDetail = stockDetails
+                  firstAvailableDetail = stockDetails
                     .Where(x => x.StockQuantity > x.OutboundQuantity)
                     .OrderBy(x => x.CreateDate)
                     .FirstOrDefault();
@@ -83,13 +85,9 @@
             }
 
             return new Dt_OutStockLockInfo()
-            {
-                lineNo= outboundOrderDetail.lineNo,
-               
+            {                      
                 PalletCode = outStock.PalletCode,
-                AssignQuantity = assignQuantity,
-                MaterielCode = outboundOrderDetail.MaterielCode,
-                BatchNo = outboundOrderDetail.BatchNo ?? outStock.Details.FirstOrDefault()?.BatchNo,
+                AssignQuantity = assignQuantity,              
                 LocationCode = outStock.LocationCode,
                 MaterielName = outboundOrderDetail.MaterielName,
                 OrderDetailId = outboundOrderDetail.Id,
@@ -99,18 +97,53 @@
                     .Where(x => x.MaterielCode == outboundOrderDetail.MaterielCode)
                     .Sum(x => x.StockQuantity),
                 Status = (int)OutLockStockStatusEnum.宸插垎閰�,
-                StockId = outStock.Id,
-                Unit = outboundOrderDetail.Unit,
-                FactoryArea = outboundOrder.FactoryArea,
+                StockId = outStock.Id,     
                 OrderType=outboundOrder.OrderType,
-                SupplyCode = outboundOrderDetail.SupplyCode,
-                WarehouseCode = outboundOrderDetail.WarehouseCode,
+                SupplyCode = firstAvailableDetail.SupplyCode,                
+                WarehouseCode = firstAvailableDetail.WarehouseCode,
                 // 鏂板瀛楁
                 CurrentBarcode = targetBarcode,
                 OriginalLockQuantity = assignQuantity,
-                IsSplitted = 0
+                IsSplitted = 0,
+                MaterielCode = outboundOrderDetail.MaterielCode,
+                BatchNo = firstAvailableDetail.BatchNo,
+                Unit = firstAvailableDetail.Unit,
+                FactoryArea = firstAvailableDetail.FactoryArea,
+                lineNo = outboundOrderDetail.lineNo,
             };
         }
+
+
+        public List<Dt_OutStockLockInfo> GetOutStockLockInfos(Dt_OutboundOrder outboundOrder, Dt_OutboundOrderDetail outboundOrderDetail, List<Dt_StockInfo> outStocks, int? taskNum = null)
+        {
+            List<Dt_OutStockLockInfo> outStockLockInfos = new List<Dt_OutStockLockInfo>();
+
+            foreach (var item in outStocks)
+            {
+                Dt_OutStockLockInfo outStockLockInfo = new Dt_OutStockLockInfo()
+                {
+                    PalletCode = item.PalletCode,
+                    AssignQuantity = item.Details.Where(x => x.MaterielCode == outboundOrderDetail.MaterielCode).Sum(x => x.OutboundQuantity),
+                    MaterielCode = outboundOrderDetail.MaterielCode,
+                    BatchNo = outboundOrderDetail.BatchNo,
+                    LocationCode = item.LocationCode,
+                    MaterielName = outboundOrderDetail.MaterielName,
+                    OrderDetailId = outboundOrderDetail.Id,
+                    OrderNo = outboundOrder.OrderNo,
+                    OrderType = outboundOrder.OrderType,
+                    OriginalQuantity = item.Details.Where(x => x.MaterielCode == outboundOrderDetail.MaterielCode).Sum(x => x.StockQuantity),
+                    Status = taskNum == null ? OutLockStockStatusEnum.宸插垎閰�.ObjToInt() : OutLockStockStatusEnum.鍑哄簱涓�.ObjToInt(),
+                    StockId = item.Id,
+                    TaskNum = taskNum,
+                  
+
+                };
+                outStockLockInfos.Add(outStockLockInfo);
+            }
+
+            return outStockLockInfos;
+        }
+
         /// <summary>
         /// 鏍规嵁璁㈠崟鏄庣粏ID鑾峰彇鍑哄簱閿佸畾淇℃伅
         /// </summary>
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_OutboundService/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 3fa61d7..954e8fc 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"
@@ -1,6 +1,7 @@
 锘縰sing Microsoft.Extensions.Logging;
 using SqlSugar;
 using WIDESEA_Common.LocationEnum;
+using WIDESEA_Common.OrderEnum;
 using WIDESEA_Common.StockEnum;
 using WIDESEA_Core;
 using WIDESEA_Core.BaseRepository;
@@ -22,6 +23,7 @@
 
    
         private readonly IStockService _stockService;
+     
         private readonly IOutStockLockInfoService _outStockLockInfoService;
         private readonly ILocationInfoService _locationInfoService;
         private readonly IBasicService _basicService;
@@ -40,6 +42,7 @@
             _locationStatusChangeRecordService = locationStatusChangeRecordService;
             _outboundOrderService = outboundOrderService;
             _logger = logger;
+
         }
 
 
@@ -153,7 +156,7 @@
                     if (remainingAllocate <= 0) break;
 
                     // 璁$畻杩欎釜鏄庣粏杩橀渶瑕佸垎閰嶇殑鏁伴噺
-                    var detailNeed = detail.OrderQuantity - detail.OverOutQuantity - detail.LockQuantity;
+                    var detailNeed = detail.OrderQuantity - detail.OverOutQuantity - detail.LockQuantity-detail.MoveQty;
                     if (detailNeed <= 0) continue;
 
                     // 鍒嗛厤鏁伴噺
@@ -289,5 +292,72 @@
             return new PageGridData<Dt_OutboundOrderDetail> ();
         }
 
+
+        public (List<Dt_StockInfo>, Dt_OutboundOrderDetail, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>) AssignStockOutbound(Dt_OutboundOrderDetail outboundOrderDetail, List<StockSelectViewDTO> stockSelectViews)
+        {
+            (bool, string) checkResult = CheckSelectStockDeital(outboundOrderDetail, stockSelectViews);
+            if (!checkResult.Item1) throw new Exception(checkResult.Item2);
+
+            Dt_OutboundOrder outboundOrder = _outboundOrderService.Repository.QueryFirst(x => x.Id == outboundOrderDetail.OrderId);
+            var originalNeedQuantity = outboundOrderDetail.OrderQuantity - outboundOrderDetail.LockQuantity;
+
+            var needQuantity = originalNeedQuantity;
+
+            List<Dt_StockInfo> outStocks = _stockService.StockInfoService.GetStockInfosByPalletCodes(stockSelectViews.Select(x => x.PalletCode).ToList());
+            var assignQuantity =0m;
+            outStocks.ForEach(x =>
+            {
+                x.Details.ForEach(v =>
+                {
+                    assignQuantity += v.StockQuantity - v.OutboundQuantity;
+                });
+            });
+
+            outboundOrderDetail.LockQuantity += assignQuantity;
+            outStocks.ForEach(x =>
+            {
+                x.Details.ForEach(v =>
+                {
+                    v.OutboundQuantity = v.StockQuantity;
+                });
+            });
+            needQuantity -= assignQuantity;
+            if (outboundOrderDetail.OrderQuantity > outboundOrderDetail.LockQuantity)
+            {
+                List<Dt_StockInfo> stockInfos = _stockService.StockInfoService.GetUseableStocks(outboundOrderDetail.MaterielCode, outboundOrderDetail.BatchNo,"");
+                stockInfos = stockInfos.Where(x => !stockSelectViews.Select(v => v.PalletCode).Contains(x.PalletCode)).ToList();
+                var (autoAssignStocks, stockAllocations)   = _stockService.StockInfoService.GetOutboundStocks(stockInfos, outboundOrderDetail.MaterielCode, needQuantity, out decimal residueQuantity);
+                outboundOrderDetail.LockQuantity += needQuantity - residueQuantity;
+                outStocks.AddRange(autoAssignStocks);
+                outboundOrderDetail.OrderDetailStatus = OrderDetailStatusEnum.AssignOver.ObjToInt();
+                if (residueQuantity > 0)
+                {
+                    outboundOrderDetail.OrderDetailStatus = OrderDetailStatusEnum.AssignOverPartial.ObjToInt();
+                }
+            }
+
+            List<Dt_OutStockLockInfo> outStockLockInfos = _outStockLockInfoService.GetOutStockLockInfos(outboundOrder, outboundOrderDetail, outStocks);
+
+            List<Dt_LocationInfo> locationInfos = _locationInfoService.GetLocationInfos(outStocks.Select(x => x.LocationCode).ToList());
+
+            return (outStocks, outboundOrderDetail, outStockLockInfos, locationInfos);
+        }
+        private (bool, string) CheckSelectStockDeital(Dt_OutboundOrderDetail outboundOrderDetail, List<StockSelectViewDTO> stockSelectViews)
+        {
+            if (outboundOrderDetail == null)
+            {
+                return (false, "鏈壘鍒板嚭搴撳崟鏄庣粏淇℃伅");
+            }
+            if (outboundOrderDetail.OrderDetailStatus != OrderDetailStatusEnum.New.ObjToInt() && outboundOrderDetail.OrderDetailStatus != OrderDetailStatusEnum.AssignOverPartial.ObjToInt())
+            {
+                return (false, "璇ユ槑缁嗕笉鍙搷浣�");
+            }
+            if (stockSelectViews.Sum(x => x.UseableQuantity) > outboundOrderDetail.OrderQuantity - outboundOrderDetail.LockQuantity)
+            {
+                return (false, "閫夋嫨鏁伴噺瓒呭嚭鍗曟嵁鏁伴噺");
+            }
+            return (true, "鎴愬姛");
+        }
+
     }
 }
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundPickingService.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundPickingService.cs"
index 6d672b9..eddd986 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundPickingService.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundPickingService.cs"
@@ -1,6 +1,7 @@
 锘縰sing Dm.filter;
 using MailKit.Search;
 using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
 using Microsoft.Extensions.Logging;
 using SqlSugar;
 using System;
@@ -84,1030 +85,6 @@
             _dailySequenceService = dailySequenceService;
         }
 
-
-        #region 鏌ヨ鍑哄簱璇︽儏鍒楄〃
-        public async Task<List<OutStockLockListResp>> GetOutStockLockListAsync(string orderNo)
-        {
-            var locks = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
-                .Where(t => t.OrderNo == orderNo)
-                .ToListAsync();
-
-            return locks.Select(t => new OutStockLockListResp
-            {
-                Id = t.Id,
-                // TaskNum = t.TaskNum,
-                PalletCode = t.PalletCode,
-                CurrentBarcode = t.CurrentBarcode,
-                AssignQuantity = t.AssignQuantity,
-                PickedQty = t.PickedQty,
-                Status = t.Status,
-                //  IsSplitted = t.IsSplitted
-            }).ToList();
-        }
-        #endregion
-        public async Task<WebResponseContent> ValidateBarcode(string barcode)
-        {
-            try
-            {
-                if (string.IsNullOrEmpty(barcode))
-                {
-                    return WebResponseContent.Instance.Error("鏉$爜涓嶈兘涓虹┖");
-                }
-
-                // 鏍规嵁鏉$爜鏌ヨ搴撳瓨鏄庣粏
-                var stockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
-                    .Includes(x => x.StockInfo)
-                    .Where(x => x.Barcode == barcode)
-                    .FirstAsync();
-
-                if (stockDetail == null)
-                {
-                    return WebResponseContent.Instance.Error("鏉$爜涓嶅瓨鍦�");
-                }
-
-
-
-                var result = new
-                {
-                    Barcode = barcode,
-                    MaterielCode = stockDetail.MaterielCode,
-
-                    BatchNo = stockDetail.BatchNo,
-                    AvailableQuantity = stockDetail.StockQuantity - stockDetail.OutboundQuantity,
-                    LocationCode = stockDetail.StockInfo?.LocationCode,
-                    PalletCode = stockDetail.StockInfo?.PalletCode
-                };
-
-                return WebResponseContent.Instance.OK(null, result);
-            }
-            catch (Exception ex)
-            {
-                return WebResponseContent.Instance.Error($"鏉$爜楠岃瘉澶辫触: {ex.Message}");
-            }
-        }
-
-        // 妫�鏌ュ苟鏇存柊璁㈠崟鐘舵��
-        private async Task CheckAndUpdateOrderStatus(string orderNo)
-        {
-
-            var orderDetails = _stockInfoDetailService.Db.Queryable<Dt_OutboundOrderDetail>()
-                      .LeftJoin<Dt_OutboundOrder>((o, item) => o.OrderId == item.Id) // 鍏宠仈鏉′欢锛氱埗琛� Id = 瀛愯〃 OrderId
-                      .Where((o, item) => item.OrderNo == orderNo) // 杩囨护鐖惰〃 OrderNo
-                      .Select((o, item) => o) // 鍙繑鍥炲瓙琛ㄦ暟鎹�
-                      .ToList();
-
-            //var orderDetails = await _stockInfoDetailService.Db.Queryable<Dt_OutboundOrderDetail>()
-            //    .Where(x => x.OrderId == orderNo.ObjToInt())
-            //    .ToListAsync();
-
-            bool allCompleted = true;
-            foreach (var detail in orderDetails)
-            {
-                if (detail.OverOutQuantity < detail.NeedOutQuantity)
-                {
-                    allCompleted = false;
-                    break;
-                }
-            }
-
-            if (allCompleted)
-            {
-                try
-                {
-                    await _outboundOrderService.Db.Updateable<Dt_OutboundOrder>()
-                        .SetColumns(x => x.OrderStatus == 2) // 宸插畬鎴�
-                        .Where(x => x.OrderNo == orderNo)
-                        .ExecuteCommandAsync();
-
-                    var outboundOrder = _stockInfoService.Db.Queryable<Dt_OutboundOrder>().First(x => x.OrderNo == orderNo);
-
-
-                    if (outboundOrder != null && outboundOrder.OrderStatus == OutOrderStatusEnum.鍑哄簱瀹屾垚.ObjToInt())
-                    {
-
-                        if (outboundOrder.OrderType == OutOrderTypeEnum.Allocate.ObjToInt().ObjToInt())//璋冩嫧鍑哄簱
-                        {
-
-                        }
-                        else if (outboundOrder.OrderType == OutOrderTypeEnum.ReCheck.ObjToInt()) //閲嶆鍑哄簱
-                        {
-
-                        }
-                        else
-                        {
-                            var feedmodel = new FeedbackOutboundRequestModel
-                            {
-                                reqCode = Guid.NewGuid().ToString(),
-                                reqTime = DateTime.Now.ToString(),
-                                business_type = outboundOrder.BusinessType,
-                                factoryArea = outboundOrder.FactoryArea,
-                                operationType = 1,
-                                Operator = outboundOrder.Operator,
-                                orderNo = outboundOrder.UpperOrderNo,
-                                status = outboundOrder.OrderStatus,
-                                details = new List<FeedbackOutboundDetailsModel>()
-
-                            };
-                            var lists = _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>().Where(x => x.OrderNo == orderNo).ToList();
-
-                            var groupedData = lists.GroupBy(item => new { item.MaterielCode, item.lineNo, item.Unit, item.WarehouseCode })
-                               .Select(group => new FeedbackOutboundDetailsModel
-                               {
-                                   materialCode = group.Key.MaterielCode,
-                                   lineNo = group.Key.lineNo,
-                                   warehouseCode = group.Key.WarehouseCode,
-                                   currentDeliveryQty = group.Sum(x => x.OrderQuantity),
-                                   // warehouseCode= "1072",
-                                   unit = group.Key.Unit,
-                                   barcodes = group.Select(row => new WIDESEA_DTO.Outbound.BarcodesModel
-                                   {
-                                       barcode = row.CurrentBarcode,
-                                       supplyCode = row.SupplyCode,
-                                       batchNo = row.BatchNo,
-                                       unit = row.Unit,
-                                       qty = row.AssignQuantity
-                                   }).ToList()
-                               }).ToList();
-                            feedmodel.details = groupedData;
-
-                            _invokeMESService.FeedbackOutbound(feedmodel);
-                        }
-                    }
-                }
-                catch (Exception ex)
-                {
-                    _logger.LogError(" OutboundPickingService  FeedbackOutbound : " + ex.Message);
-                }
-
-            }
-        }
-
-        public async Task<WebResponseContent> ConfirmPicking(string orderNo, string palletCode, string barcode)
-        {
-            try
-            {
-                _unitOfWorkManage.BeginTran();
-
-                // 1. 鏌ユ壘鍑哄簱閿佸畾淇℃伅
-                var lockInfo = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
-                    .Where(it => it.OrderNo == orderNo &&
-                               it.Status == (int)OutLockStockStatusEnum.鍑哄簱涓� &&
-                               it.PalletCode == palletCode &&
-                               it.CurrentBarcode == barcode)
-                    .FirstAsync();
-
-                if (lockInfo == null)
-                {
-                    lockInfo = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
-    .Where(it => it.CurrentBarcode == barcode &&
-               it.Status == (int)OutLockStockStatusEnum.鍑哄簱涓�)
-    .FirstAsync();
-
-                    if (lockInfo == null)
-                        throw new Exception($"鏉$爜{barcode}涓嶅睘浜庢墭鐩榹palletCode}鎴栦笉瀛樺湪寰呭垎鎷h褰�");
-                }
-
-                if (lockInfo.PalletCode != palletCode)
-                    throw new Exception($"鏉$爜{barcode}涓嶅睘浜庢墭鐩榹palletCode}");
-
-                var outorderdetail = _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>().First(x => x.Id == lockInfo.OrderDetailId);
-                if (outorderdetail != null && lockInfo.AssignQuantity > outorderdetail.OrderQuantity)
-                {
-                    throw new Exception($"鏉$爜{barcode}鐨勫嚭搴撴暟閲忓ぇ浜庤鍗曠殑鏁伴噺");
-                }
-
-                var stockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
-                        .Where(x => x.Barcode == barcode && x.StockId == lockInfo.StockId)
-                        .FirstAsync();
-
-                if (stockDetail == null)
-                    return WebResponseContent.Instance.Error("鏃犳晥鐨勬潯鐮佹垨鐗╂枡缂栫爜");
-
-                decimal actualQty = lockInfo.AssignQuantity - lockInfo.PickedQty;
-                decimal stockQuantity = stockDetail.StockQuantity;
-
-                List<SplitResult> splitResults = new List<SplitResult>();
-
-                if (actualQty < stockQuantity)
-                {
-                    // 鎯呭喌1: 鍒嗛厤鏁伴噺灏忎簬搴撳瓨鏁伴噺锛岄渶瑕佽嚜鍔ㄦ媶鍖�
-                    // 璁$畻鍓╀綑搴撳瓨鏁伴噺
-                    decimal remainingStockQty = stockQuantity - actualQty;
-
-                    // 鏇存柊鍘熸潯鐮佸簱瀛樹负鍓╀綑鏁伴噺
-                    stockDetail.StockQuantity = remainingStockQty;
-                    stockDetail.OutboundQuantity = remainingStockQty;
-                    await _stockInfoDetailService.Db.Updateable(stockDetail).ExecuteCommandAsync();
-
-                    // 鐢熸垚鏂版潯鐮佺敤浜庤褰曟嫞閫夋暟閲忥紙浣嗕笉鍒涘缓搴撳瓨璁板綍锛�
-                    var seq = await _dailySequenceService.GetNextSequenceAsync();
-                    string newBarcode = "WSLOT" + DateTime.Now.ToString("yyyyMMdd") + seq.ToString()?.PadLeft(5, '0');
-
-                    // 涓烘柊鏉$爜鍒涘缓鍑哄簱閿佸畾淇℃伅锛堢敤浜庤褰曟嫞閫夛級
-                    var newLockInfo = new Dt_OutStockLockInfo
-                    {
-                        OrderNo = lockInfo.OrderNo,
-                        OrderDetailId = lockInfo.OrderDetailId,
-                        BatchNo = lockInfo.BatchNo,
-                        MaterielCode = lockInfo.MaterielCode,
-                        MaterielName = lockInfo.MaterielName,
-                        StockId = lockInfo.StockId,
-                        OrderQuantity = actualQty,
-                        OriginalQuantity = actualQty,
-                        AssignQuantity = actualQty,
-                        PickedQty = actualQty,
-                        LocationCode = lockInfo.LocationCode,
-                        PalletCode = lockInfo.PalletCode,
-                        TaskNum = lockInfo.TaskNum,
-                        Status = (int)OutLockStockStatusEnum.鎷i�夊畬鎴�,
-                        Unit = lockInfo.Unit,
-                        SupplyCode = lockInfo.SupplyCode,
-                        OrderType = lockInfo.OrderType,
-                        CurrentBarcode = newBarcode,
-                        OriginalLockQuantity = actualQty,
-                        IsSplitted = 1,
-                        ParentLockId = lockInfo.Id
-                    };
-                    await _outStockLockInfoService.Db.Insertable(newLockInfo).ExecuteCommandAsync();
-
-                    // 璁板綍鎷嗗寘鍘嗗彶锛堢敤浜庤拷韪級
-                    var splitHistory = new Dt_SplitPackageRecord
-                    {
-                        FactoryArea = lockInfo.FactoryArea,
-                        TaskNum = lockInfo.TaskNum,
-                        OutStockLockInfoId = lockInfo.Id,
-                        StockId = stockDetail.StockId,
-                        Operator = App.User.UserName,
-                        IsReverted = false,
-                        OriginalBarcode = barcode,
-                        NewBarcode = newBarcode,
-                        SplitQty = actualQty,
-                        RemainQuantity = remainingStockQty,
-                        MaterielCode = lockInfo.MaterielCode,
-                        SplitTime = DateTime.Now,
-                        OrderNo = lockInfo.OrderNo,
-                        PalletCode = lockInfo.PalletCode,
-                        Status = (int)SplitPackageStatusEnum.宸叉嫞閫�
-                    };
-                    await _splitPackageService.Db.Insertable(splitHistory).ExecuteCommandAsync();
-
-                    // 鏇存柊鍘熼攣瀹氫俊鎭负鍓╀綑搴撳瓨鏁伴噺
-                    lockInfo.AssignQuantity = remainingStockQty;
-                    lockInfo.PickedQty = 0;  
-                                       
-                    await _outStockLockInfoService.Db.Updateable(lockInfo).ExecuteCommandAsync();
-
-                    splitResults.Add(new SplitResult
-                    {
-                        OriginalBarcode = barcode,
-                        NewBarcode = newBarcode,
-                        SplitQuantity = actualQty,
-                        RemainQuantity = remainingStockQty
-                    });
-
-                    // 鏇存柊鎷i�夎褰曚腑鐨勬潯鐮佷负鏂版潯鐮�
-                    barcode = newBarcode;
-                    lockInfo = newLockInfo;
-                }
-                else if (actualQty == stockQuantity)
-                {
-                    // 鎯呭喌2: 鍒嗛厤鏁伴噺绛変簬搴撳瓨鏁伴噺锛屾暣鍖呭嚭搴�
-                    stockDetail.StockQuantity = 0;
-                    stockDetail.OutboundQuantity = 0;
-                    await _stockInfoDetailService.Db.Updateable(stockDetail).ExecuteCommandAsync();
-
-                    lockInfo.PickedQty += actualQty;
-                    lockInfo.Status = (int)OutLockStockStatusEnum.鎷i�夊畬鎴�;
-                    await _outStockLockInfoService.Db.Updateable(lockInfo).ExecuteCommandAsync();
-                }
-                else
-                {
-                    // 鎯呭喌3: 鍒嗛厤鏁伴噺澶т簬搴撳瓨鏁伴噺锛屽簱瀛樻暣鍖呭嚭搴�
-                    // 鏁村寘鍑哄簱褰撳墠搴撳瓨
-                    decimal stockOutQty = stockQuantity;
-                    stockDetail.StockQuantity = 0;
-                    stockDetail.OutboundQuantity = 0;
-                    await _stockInfoDetailService.Db.Updateable(stockDetail).ExecuteCommandAsync();
-
-                    // 璁$畻鍓╀綑鍒嗛厤鏁伴噺
-                    decimal remainingAssignQty = actualQty - stockQuantity;
-
-                    // 鏇存柊閿佸畾淇℃伅锛堝彧瀹屾垚搴撳瓨閮ㄥ垎锛�
-                    lockInfo.PickedQty += stockOutQty;
-                    lockInfo.AssignQuantity = remainingAssignQty;
-
-                    await _outStockLockInfoService.Db.Updateable(lockInfo).ExecuteCommandAsync();
-
-                    var _relatedSplitRecords = await _splitPackageService.Db.Queryable<Dt_SplitPackageRecord>()
-        .Where(it => it.OriginalBarcode == barcode || it.NewBarcode == barcode)
-        .Where(it => !it.IsReverted)
-        .ToListAsync();
-
-                    foreach (var record in _relatedSplitRecords)
-                    {
-                        record.Status = (int)SplitPackageStatusEnum.宸叉嫞閫�;
-                        await _splitPackageService.Db.Updateable(record).ExecuteCommandAsync();
-                    }
-                }
-
-   
-
-                await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>()
-                    .SetColumns(it => it.PickedQty == it.PickedQty + actualQty)
-                    .Where(it => it.Id == lockInfo.OrderDetailId)
-                    .ExecuteCommandAsync();
-
-                await CheckAndUpdateOrderStatus(orderNo);
-
-                // 鏌ヨ浠诲姟琛� 
-                var task = _taskRepository.QueryData(x => x.OrderNo == orderNo && x.PalletCode == palletCode).FirstOrDefault();
-
-                // 璁板綍鎷i�夊巻鍙�
-                var pickingHistory = new Dt_PickingRecord
-                {
-                    FactoryArea = lockInfo.FactoryArea,
-                    TaskNo = task?.TaskNum ?? 0,
-                    LocationCode = task?.SourceAddress ?? "",
-                    StockId = stockDetail.Id,
-                    OrderNo = orderNo,
-                    OrderDetailId = lockInfo.OrderDetailId,
-                    PalletCode = palletCode,
-                    Barcode = barcode,
-                    MaterielCode = lockInfo.MaterielCode,
-                    PickQuantity = actualQty,
-                    PickTime = DateTime.Now,
-                    Operator = App.User.UserName,
-                    OutStockLockId = lockInfo.Id
-                };
-                await Db.Insertable(pickingHistory).ExecuteCommandAsync();
-
-                _unitOfWorkManage.CommitTran();
-
-                // 濡傛灉鏈夋媶鍖呯粨鏋滐紝杩斿洖鎷嗗寘淇℃伅
-                if (splitResults.Any())
-                {
-                    return WebResponseContent.Instance.OK("鎷i�夌‘璁ゆ垚鍔燂紝宸茶嚜鍔ㄦ媶鍖�", new { SplitResults = splitResults });
-                }
-
-                return WebResponseContent.Instance.OK("鎷i�夌‘璁ゆ垚鍔�");
-
-            }
-            catch (Exception ex)
-            {
-                _unitOfWorkManage.RollbackTran();
-                return WebResponseContent.Instance.Error($"鎷i�夌‘璁ゅけ璐ワ細{ex.Message}");
-            }
-        }
-        
-        /// <summary>
-        /// 鍥炲簱鎿嶄綔  
-        /// </summary>
-
-        public async Task<WebResponseContent> ReturnRemaining(string orderNo, string palletCode, string reason)
-        {
-            try
-            {
-                _unitOfWorkManage.BeginTran();
-
-                // 鑾峰彇鎵�鏈夋湭鍒嗘嫞鐨勫嚭搴撻攣瀹氳褰曪紝鍖呮嫭鎷嗗寘浜х敓鐨勮褰�
-                var remainingLocks = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
-                    .Where(it => it.OrderNo == orderNo && it.Status == (int)OutLockStockStatusEnum.鍑哄簱涓�)
-                    .ToListAsync();
-
-                var stockinfo = _stockInfoService.Db.Queryable<Dt_StockInfo>().First(x => x.PalletCode == palletCode);
-
-                var tasks = new List<Dt_Task>();
-
-                // 鏌ヨ浠诲姟琛�
-                var task = remainingLocks.Any()
-                    ? _taskRepository.QueryData(x => x.TaskNum == remainingLocks.First().TaskNum).FirstOrDefault()
-                    : _taskRepository.QueryData(x => x.PalletCode == palletCode).FirstOrDefault();
-
-                if (task == null)
-                {
-                    return WebResponseContent.Instance.Error("鏈壘鍒板搴旂殑浠诲姟淇℃伅");
-                }
-
-                // 妫�鏌ユ墭鐩樹笂鏄惁鏈夊叾浠栭潪鍑哄簱璐х墿锛堝簱瀛樿揣鐗╋級
-                var palletStockGoods = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
-                    .Where(it => it.StockId == stockinfo.Id &&
-                                (it.Status == StockStatusEmun.鍏ュ簱纭.ObjToInt() ||
-                                 it.Status == StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt() ||
-                                 it.Status == StockStatusEmun.鍑哄簱閿佸畾.ObjToInt()))
-                    .Where(it => it.OutboundQuantity == 0 || it.OutboundQuantity < it.StockQuantity) // 鏈畬鍏ㄥ嚭搴撶殑
-                    .ToListAsync();
-
-                // 妫�鏌ユ媶鍖呰褰曪紝鎵惧嚭闇�瑕佸洖搴撶殑鏉$爜
-                var splitRecords = await _splitPackageService.Db.Queryable<Dt_SplitPackageRecord>()
-                    .Where(it => it.OrderNo == orderNo && it.PalletCode == palletCode && !it.IsReverted)
-                    .ToListAsync();
-
-                // 璁$畻闇�瑕佸洖搴撶殑鎷嗗寘鏉$爜
-                var splitBarcodesToReturn = new List<string>();
-                foreach (var splitRecord in splitRecords)
-                {
-                    // 妫�鏌ュ師鏉$爜鏄惁杩樻湁搴撳瓨闇�瑕佸洖搴�
-                    var originalStock = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
-                        .Where(it => it.Barcode == splitRecord.OriginalBarcode && it.StockId == stockinfo.Id)
-                        .FirstAsync();
-
-                    if (originalStock != null && originalStock.StockQuantity > 0)
-                    {
-                        splitBarcodesToReturn.Add(splitRecord.OriginalBarcode);
-                    }
-
-                    // 妫�鏌ユ柊鏉$爜鏄惁杩樻湁搴撳瓨闇�瑕佸洖搴�
-                    var newStock = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
-                        .Where(it => it.Barcode == splitRecord.NewBarcode && it.StockId == stockinfo.Id)
-                        .FirstAsync();
-
-                    if (newStock != null && newStock.StockQuantity > 0)
-                    {
-                        splitBarcodesToReturn.Add(splitRecord.NewBarcode);
-                    }
-                }
-
-                // 濡傛灉娌℃湁闇�瑕佸洖搴撶殑璐х墿锛堟棦鏃犳湭鍒嗘嫞鍑哄簱璐х墿锛屼篃鏃犲叾浠栧簱瀛樿揣鐗╋紝涔熸棤鎷嗗寘鍓╀綑璐х墿锛�
-                if (!remainingLocks.Any() && !palletStockGoods.Any() && !splitBarcodesToReturn.Any())
-                {
-                    // 妫�鏌ユ槸鍚︽墍鏈夎揣鐗╅兘宸叉嫞閫夊畬鎴�
-                    var allPicked = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
-                        .Where(it => it.OrderNo == orderNo && it.PalletCode == palletCode)
-                        .AnyAsync(it => it.Status == (int)OutLockStockStatusEnum.鎷i�夊畬鎴�);
-
-                    if (allPicked)
-                    {
-                        return WebResponseContent.Instance.OK("鎵�鏈夎揣鐗╁凡鎷i�夊畬鎴愶紝鎵樼洏涓虹┖");
-                    }
-                    else
-                    {
-                        return WebResponseContent.Instance.Error("娌℃湁闇�瑕佸洖搴撶殑鍓╀綑璐х墿");
-                    }
-                }
-
-                var firstlocation = _locationInfoService.Db.Queryable<Dt_LocationInfo>().First(x => x.LocationCode == task.SourceAddress);
-                decimal totalReturnQty = 0;
-
-                // 鎯呭喌1锛氬鐞嗘湭鍒嗘嫞鐨勫嚭搴撻攣瀹氳褰�
-                if (remainingLocks.Any(x => x.PalletCode == palletCode))
-                {
-                    var palletLocks = remainingLocks.Where(x => x.PalletCode == palletCode).ToList();
-                    totalReturnQty = palletLocks.Sum(x => x.AssignQuantity - x.PickedQty);
-
-                    if (totalReturnQty > 0)
-                    {
-                        // 鍒嗛厤鏂拌揣浣�
-                        var newLocation = _locationInfoService.AssignLocation(firstlocation.LocationType);
-
-                        // 鏇存柊鍑哄簱閿佸畾璁板綍鐘舵��
-                        var lockIds = palletLocks.Select(x => x.Id).ToList();
-                        await _outStockLockInfoService.Db.Updateable<Dt_OutStockLockInfo>()
-                            .SetColumns(it => new Dt_OutStockLockInfo { Status = (int)OutLockStockStatusEnum.鍥炲簱涓� })
-                            .Where(it => lockIds.Contains(it.Id))
-                            .ExecuteCommandAsync();
-
-           
-
-                        // 澶勭悊搴撳瓨璁板綍
-                        foreach (var lockInfo in palletLocks)
-                        {
-                            decimal returnQty = lockInfo.AssignQuantity - lockInfo.PickedQty;
-
-                            // 妫�鏌ュ簱瀛樿褰曟槸鍚﹀瓨鍦�
-                            var existingStock = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
-                                .Where(it => it.Barcode == lockInfo.CurrentBarcode && it.StockId == lockInfo.StockId)
-                                .FirstAsync();
-
-                            if (existingStock != null)
-                            {
-                                // 搴撳瓨璁板綍瀛樺湪锛屾仮澶嶉攣瀹氭暟閲�
-                                existingStock.OutboundQuantity = 0;
-
-                                await _stockInfoDetailService.Db.Updateable(existingStock).ExecuteCommandAsync();
-                            }
-                            else
-                            {
-                                // 搴撳瓨璁板綍涓嶅瓨鍦紙鍙兘鏄媶鍖呬骇鐢熺殑鏂版潯鐮侊級锛屽垱寤烘柊鐨勫簱瀛樿褰�
-                                var newStockDetail = new Dt_StockInfoDetail
-                                {
-                                    StockId = lockInfo.StockId,
-                                    MaterielCode = lockInfo.MaterielCode,
-                                    MaterielName = lockInfo.MaterielName,
-                                    OrderNo = lockInfo.OrderNo,
-                                    BatchNo = lockInfo.BatchNo,
-                                    StockQuantity = returnQty,
-                                    OutboundQuantity = 0,
-                                    Barcode = lockInfo.CurrentBarcode,
-                                    InboundOrderRowNo = "",
-                                    Status = StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt(),
-                                    SupplyCode = lockInfo.SupplyCode,
-                                    WarehouseCode = lockInfo.WarehouseCode,
-                                    Unit = lockInfo.Unit
-                                };
-                                await _stockInfoDetailService.Db.Insertable(newStockDetail).ExecuteCommandAsync();
-                            }
-                        }
-
-                        // 鍒涘缓鍥炲簱浠诲姟
-                        CreateReturnTask(tasks, task, palletCode, newLocation);
-                    }
-                }
-
-                // 鎯呭喌2锛氬鐞嗘媶鍖呭墿浣欑殑搴撳瓨璐х墿
-                if (splitBarcodesToReturn.Any())
-                {
-                    decimal splitReturnQty = 0;
-
-                    foreach (var barcode in splitBarcodesToReturn)
-                    {
-                        var stockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
-                            .Where(it => it.Barcode == barcode && it.StockId == stockinfo.Id)
-                            .FirstAsync();
-
-                        if (stockDetail != null && stockDetail.StockQuantity > 0)
-                        {
-                            splitReturnQty += stockDetail.StockQuantity;
-
-                            // 鎭㈠搴撳瓨鐘舵�佷负鍏ュ簱瀹屾垚
-                            stockDetail.OutboundQuantity = 0;
-
-                            await _stockInfoDetailService.Db.Updateable(stockDetail).ExecuteCommandAsync();
-                        }
-                    }
-
-                    totalReturnQty += splitReturnQty;
-
-                    // 濡傛灉娌℃湁鍒涘缓浠诲姟锛屽垱寤哄洖搴撲换鍔�
-                    if (!tasks.Any())
-                    {
-                        var newLocation = _locationInfoService.AssignLocation(firstlocation.LocationType);
-                        CreateReturnTask(tasks, task, palletCode, newLocation);
-                    }
-                }
-
-                // 鎯呭喌3锛氬嚭搴撹揣鐗╁凡鍒嗘嫞瀹岋紝浣嗘墭鐩樹笂杩樻湁鍏朵粬搴撳瓨璐х墿闇�瑕佸洖搴�
-                if (palletStockGoods.Any() && !remainingLocks.Any(x => x.PalletCode == palletCode))
-                {
-                    decimal otherReturnQty = palletStockGoods.Sum(x => x.StockQuantity - x.OutboundQuantity);
-                    totalReturnQty += otherReturnQty;
-                    // 鏇存柊杩欎簺搴撳瓨璐х墿鐨勭姸鎬�
-                    foreach (var stockGood in palletStockGoods)
-                    {
-                        stockGood.OutboundQuantity = 0;
-
-                        await _stockInfoDetailService.Db.Updateable(stockGood).ExecuteCommandAsync();
-                    }
-                    // 濡傛灉娌℃湁鍒涘缓浠诲姟锛屽垱寤哄洖搴撲换鍔�
-                    if (!tasks.Any())
-                    {
-                        var newLocation = _locationInfoService.AssignLocation(firstlocation.LocationType);
-                        CreateReturnTask(tasks, task, palletCode, newLocation);
-                    }
-
-                 
-                }
-            
-                var allSplitRecords = await _splitPackageService.Db.Queryable<Dt_SplitPackageRecord>()
-                    .Where(it => it.OrderNo == orderNo && it.PalletCode == palletCode && !it.IsReverted)
-                    .ToListAsync();
-
-                foreach (var record in allSplitRecords)
-                {
-                    record.Status = (int)SplitPackageStatusEnum.宸插洖搴�;
-                    await _splitPackageService.Db.Updateable(record).ExecuteCommandAsync();
-                }
-                // 淇濆瓨浠诲姟 缁橢SS涓嬪彂浠诲姟
-                if (tasks.Any())
-                {
-                    try
-                    {
-                        await _taskRepository.Db.Insertable(tasks).ExecuteCommandAsync();
-                        var targetAddress = task.TargetAddress;
-                        _taskRepository.DeleteData(task);
-
-                        // 缁� ESS 娴佸姩淇″彿鍜屽垱寤轰换鍔�
-                        try
-                        {
-                            var result = await _eSSApiService.MoveContainerAsync(new WIDESEA_DTO.Basic.MoveContainerRequest
-                            {
-                                slotCode = movestations[targetAddress],
-                                containerCode = palletCode
-                            });
-
-                            if (result)
-                            {
-                                TaskModel esstask = new TaskModel()
-                                {
-                                    taskType = "putaway",
-                                    taskGroupCode = "",
-                                    groupPriority = 0,
-                                    tasks = new List<TasksType>
-                            {
-                                new()
-                                {
-                                    taskCode = tasks.First().TaskNum.ToString(),
-                                    taskPriority = 0,
-                                    taskDescribe = new TaskDescribeType {
-                                        containerCode = palletCode,
-                                        containerType = "CT_KUBOT_STANDARD",
-                                        fromLocationCode = stations.GetValueOrDefault(targetAddress) ?? "",
-                                        toStationCode = "",
-                                        toLocationCode = tasks.First().TargetAddress,
-                                        deadline = 0, storageTag = ""
-                                    }
-                                }
-                            }
-                                };
-
-                                var resulttask = await _eSSApiService.CreateTaskAsync(esstask);
-                                _logger.LogInformation("ReturnRemaining 鍒涘缓浠诲姟杩斿洖:  " + resulttask);
-                            }
-                        }
-                        catch (Exception ex)
-                        {
-                            _logger.LogInformation("ReturnRemaining 鍒涘缓浠诲姟杩斿洖 catch err:  " + ex.Message);
-                        }
-
-                        _unitOfWorkManage.CommitTran();
-                        return WebResponseContent.Instance.OK($"鍥炲簱鎿嶄綔鎴愬姛锛屽叡鍥炲簱鏁伴噺锛歿totalReturnQty}");
-                    }
-                    catch (Exception ex)
-                    {
-                        _unitOfWorkManage.RollbackTran();
-                        return WebResponseContent.Instance.Error($"鍒涘缓鍥炲簱浠诲姟澶辫触: {ex.Message}");
-                    }
-                }
-
-                _unitOfWorkManage.RollbackTran();
-                return WebResponseContent.Instance.Error("鏈垱寤轰换浣曞洖搴撲换鍔�");
-            }
-            catch (Exception ex)
-            {
-                _unitOfWorkManage.RollbackTran();
-                return WebResponseContent.Instance.Error($"鍥炲簱鎿嶄綔澶辫触: {ex.Message}");
-            }
-        }
-
-
-        /// <summary>
-        /// 鍒涘缓鍥炲簱浠诲姟
-        /// </summary>
-        private void CreateReturnTask(List<Dt_Task> tasks, Dt_Task originalTask, string palletCode, Dt_LocationInfo newLocation)
-        {
-            Dt_Task newTask = new()
-            {
-                CurrentAddress = stations[originalTask.TargetAddress],
-                Grade = 0,
-                PalletCode = palletCode,
-                NextAddress = "",
-                OrderNo = originalTask.OrderNo,
-                Roadway = newLocation.RoadwayNo,
-                SourceAddress = stations[originalTask.TargetAddress],
-                TargetAddress = newLocation.LocationCode,
-                TaskStatus = TaskStatusEnum.New.ObjToInt(),
-                TaskType = TaskTypeEnum.InPick.ObjToInt(),
-                PalletType = originalTask.PalletType,
-                WarehouseId = originalTask.WarehouseId,
-
-            };
-            tasks.Add(newTask);
-        }
-
-        /// <summary>
-        /// 妫�鏌ユ墭鐩樻槸鍚﹂渶瑕佸洖搴撶殑杈呭姪鏂规硶
-        /// </summary>
-        public async Task<bool> CheckPalletNeedReturn(string orderNo, string palletCode)
-        {
-            // 1. 妫�鏌ユ槸鍚︽湁鏈垎鎷g殑鍑哄簱璁板綍
-            var hasUnpickedLocks = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
-                .Where(it => it.OrderNo == orderNo && it.PalletCode == palletCode && it.Status == 1)
-                .AnyAsync();
-
-            if (hasUnpickedLocks)
-                return true;
-
-            // 2. 妫�鏌ュ嚭搴撴槸鍚﹀凡瀹屾垚浣嗘墭鐩樿繕鏈夊簱瀛樿揣鐗�
-            var outboundFinished = !await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
-                .Where(it => it.PalletCode == palletCode && it.Status == 1)
-                .AnyAsync();
-
-            var stockinfo = _stockInfoService.Db.Queryable<Dt_StockInfo>().First(x => x.PalletCode == palletCode);
-
-
-            var hasRemainingGoods = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
-                .Where(it => it.StockId == stockinfo.Id && it.Status == StockStatusEmun.鍏ュ簱纭.ObjToInt())
-                .Where(it => it.OutboundQuantity == 0 || it.OutboundQuantity < it.StockQuantity)
-                .AnyAsync();
-
-            return outboundFinished && hasRemainingGoods;
-        }
-
-        // 鍙栨秷鎷i�夊姛鑳�
-        public async Task<WebResponseContent> CancelPicking(string orderNo, string palletCode, string barcode)
-        {
-            try
-            {
-                _unitOfWorkManage.BeginTran();
-
-                //鏌ユ壘鎷i�夎褰�
-                var pickingRecord = await Db.Queryable<Dt_PickingRecord>()
-                    .Where(it => it.OrderNo == orderNo &&
-                               it.PalletCode == palletCode &&
-                               it.Barcode == barcode)
-                    .OrderByDescending(it => it.PickTime)
-                    .FirstAsync();
-
-                if (pickingRecord == null)
-                    return WebResponseContent.Instance.Error("鏈壘鍒板搴旂殑鎷i�夎褰�");
-
-                // 鏌ユ壘鍑哄簱閿佸畾淇℃伅
-                var lockInfo = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
-                    .Where(it => it.Id == pickingRecord.OutStockLockId)
-                    .FirstAsync();
-
-                if (lockInfo == null)
-                    return WebResponseContent.Instance.Error("鏈壘鍒板搴旂殑鍑哄簱閿佸畾淇℃伅");
-
-                //妫�鏌ユ槸鍚﹀彲浠ュ彇娑堬紙鐘舵�佸繀椤绘槸鎷i�夊畬鎴愶級
-                if (lockInfo.Status != (int)OutLockStockStatusEnum.鎷i�夊畬鎴�)
-                    return WebResponseContent.Instance.Error("褰撳墠鐘舵�佷笉鍏佽鍙栨秷鍒嗘嫞");
-
-                decimal cancelQty = pickingRecord.PickQuantity;
-
-                // 妫�鏌ユ媶鍖呴摼鍏崇郴
-                var splitChain = await GetSplitChain(barcode);
-
-                if (splitChain.Any())
-                {
-                    // 鎯呭喌A锛氬鐞嗘媶鍖呴摼鐨勫彇娑堬紙澶氭鎵嬪姩鎷嗗寘锛�
-                    await HandleSplitChainCancel(orderNo, palletCode, barcode, cancelQty, lockInfo, pickingRecord, splitChain);
-                }
-                else
-                {
-                    // 鎯呭喌B锛氬鐞嗘櫘閫氭潯鐮佺殑鍙栨秷
-                    await HandleNormalBarcodeCancel(orderNo, palletCode, barcode, cancelQty, lockInfo, pickingRecord);
-                }
-
-                _unitOfWorkManage.CommitTran();
-                return WebResponseContent.Instance.OK($"鍙栨秷鍒嗘嫞鎴愬姛锛屾仮澶嶆暟閲忥細{cancelQty}");
-            }
-            catch (Exception ex)
-            {
-                _unitOfWorkManage.RollbackTran();
-                return WebResponseContent.Instance.Error($"鍙栨秷鍒嗘嫞澶辫触锛歿ex.Message}");
-            }
-        }
-
-        /// <summary>
-        /// 鑾峰彇鎷嗗寘閾撅紙浠庡綋鍓嶆潯鐮佽拷婧埌鍘熷鏉$爜锛�
-        /// </summary>
-        // 鍦� GetSplitChain 鏂规硶涓坊鍔犳洿涓ユ牸鐨勯獙璇�
-        private async Task<List<SplitChainItem>> GetSplitChain(string currentBarcode)
-        {
-            var chain = new List<SplitChainItem>();
-            var visited = new HashSet<string>();
-
-            string current = currentBarcode;
-            int maxDepth = 10; // 闃叉鏃犻檺寰幆
-
-            while (!string.IsNullOrEmpty(current) && maxDepth > 0)
-            {
-                maxDepth--;
-
-                if (visited.Contains(current))
-                {
-                    _logger.LogWarning($"妫�娴嬪埌寰幆寮曠敤鍦ㄦ媶鍖呴摼涓�: {current}");
-                    break;
-                }
-
-                visited.Add(current);
-
-                var splitRecord = await _splitPackageService.Db.Queryable<Dt_SplitPackageRecord>()
-                    .Where(it => it.NewBarcode == current && !it.IsReverted)
-                    .FirstAsync();
-
-                if (splitRecord == null)
-                    break;
-
-                // 楠岃瘉鎷嗗寘璁板綍鐨勫畬鏁存��
-                if (string.IsNullOrEmpty(splitRecord.OriginalBarcode))
-                {
-                    _logger.LogError($"鎷嗗寘璁板綍 {splitRecord.Id} 缂哄皯鍘熷鏉$爜");
-                    break;
-                }
-
-                var item = new SplitChainItem
-                {
-                    SplitRecord = splitRecord,
-                    OriginalBarcode = splitRecord.OriginalBarcode,
-                    NewBarcode = splitRecord.NewBarcode,
-                    SplitQuantity = splitRecord.SplitQty
-                };
-
-                chain.Add(item);
-
-                current = splitRecord.OriginalBarcode;
-            }
-
-            if (maxDepth <= 0)
-            {
-                _logger.LogWarning($"鎷嗗寘閾捐拷婧揪鍒版渶澶ф繁搴�: {currentBarcode}");
-            }
-
-            chain.Reverse();
-            return chain;
-        }
-        /// <summary>
-        /// 澶勭悊鎷嗗寘閾剧殑鍙栨秷鍒嗘嫞
-        /// </summary>
-        private async Task HandleSplitChainCancel(string orderNo, string palletCode, string barcode,
-            decimal cancelQty, Dt_OutStockLockInfo lockInfo, Dt_PickingRecord pickingRecord, List<SplitChainItem> splitChain)
-        {
-            if (!splitChain.Any())
-                return;
-
-            //  鎵惧埌鍘熷鏉$爜锛堥摼鐨勭涓�涓級
-            var originalSplitItem = splitChain.First();
-            var originalBarcode = originalSplitItem.OriginalBarcode;
-
-            // 鏌ユ壘鍘熷鏉$爜鐨勯攣瀹氫俊鎭拰搴撳瓨
-            var originalLockInfo = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
-                .Where(it => it.CurrentBarcode == originalBarcode && it.Status == (int)OutLockStockStatusEnum.鍑哄簱涓�)
-                .FirstAsync();
-
-            var originalStockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
-                .Where(it => it.Barcode == originalBarcode && it.StockId == originalLockInfo.StockId)
-                .FirstAsync();
-
-            if (originalLockInfo == null || originalStockDetail == null)
-                throw new Exception("鏈壘鍒板師濮嬫潯鐮佺殑閿佸畾淇℃伅鎴栧簱瀛樹俊鎭�");
-
-            // 鎭㈠鍘熷鏉$爜搴撳瓨锛堝皢鍙栨秷鐨勬暟閲忓姞鍥炲幓锛�
-            originalStockDetail.StockQuantity += cancelQty;
-            originalStockDetail.OutboundQuantity += cancelQty;
-            await _stockInfoDetailService.Db.Updateable(originalStockDetail).ExecuteCommandAsync();
-
-            // 鎭㈠鍘熷鏉$爜閿佸畾淇℃伅
-            originalLockInfo.AssignQuantity += cancelQty;
-            await _outStockLockInfoService.Db.Updateable(originalLockInfo).ExecuteCommandAsync();
-
-            //  鍒犻櫎鎷嗗寘閾句腑鎵�鏈夋柊鏉$爜鐨勯攣瀹氫俊鎭拰搴撳瓨璁板綍
-            var allNewBarcodes = splitChain.Select(x => x.NewBarcode).ToList();
-
-            // 鍒犻櫎閿佸畾淇℃伅
-            await _outStockLockInfoService.Db.Deleteable<Dt_OutStockLockInfo>()
-                .Where(it => allNewBarcodes.Contains(it.CurrentBarcode))
-                .ExecuteCommandAsync();
-
-            // 鍒犻櫎搴撳瓨璁板綍锛堝彧鍒犻櫎鎷嗗寘浜х敓鐨勬柊鏉$爜搴撳瓨锛屼繚鐣欏師濮嬫潯鐮侊級
-            await _stockInfoDetailService.Db.Deleteable<Dt_StockInfoDetail>()
-                .Where(it => allNewBarcodes.Contains(it.Barcode) && it.Barcode != originalBarcode)
-                .ExecuteCommandAsync();
-
-            // 鏇存柊鎷嗗寘閾句腑鎵�鏈夋媶鍖呰褰曠姸鎬佷负宸叉媶鍖�
-            foreach (var chainItem in splitChain)
-            {
-                chainItem.SplitRecord.Status = (int)SplitPackageStatusEnum.宸叉媶鍖�;
-                await _splitPackageService.Db.Updateable(chainItem.SplitRecord).ExecuteCommandAsync();
-            }
-
-            //  鎭㈠璁㈠崟鏄庣粏鎷i�夋暟閲忥紙浣跨敤鍘熷閿佸畾淇℃伅鐨勮鍗曟槑缁咺D锛�
-            await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>()
-                .SetColumns(it => it.PickedQty == it.PickedQty - cancelQty)
-                .Where(it => it.Id == originalLockInfo.OrderDetailId)
-                .ExecuteCommandAsync();
-
-            //   鎭㈠璁㈠崟鐘舵��
-            await CheckAndRevertOrderStatus(orderNo);
-
-            //  鍒犻櫎鎷i�夎褰�
-            await Db.Deleteable<Dt_PickingRecord>()
-                .Where(it => it.Id == pickingRecord.Id)
-                .ExecuteCommandAsync();
-
-            ////  璁板綍鍙栨秷鎿嶄綔鍘嗗彶
-            //await RecordCancelHistory(orderNo, palletCode, barcode, cancelQty, pickingRecord.Id,
-            //    lockInfo.MaterielCode, "鍙栨秷鎷嗗寘閾惧垎鎷�");
-        }
-
-        /// <summary>
-        /// 澶勭悊鏅�氭潯鐮佺殑鍙栨秷鍒嗘嫞
-        /// </summary>
-        private async Task HandleNormalBarcodeCancel(string orderNo, string palletCode, string barcode,
-            decimal cancelQty, Dt_OutStockLockInfo lockInfo, Dt_PickingRecord pickingRecord)
-        {
-            // 1. 鏌ユ壘搴撳瓨淇℃伅
-            var stockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
-                .Where(it => it.Barcode == barcode && it.StockId == lockInfo.StockId)
-                .FirstAsync();
-
-            if (stockDetail == null)
-                throw new Exception("鏈壘鍒板搴旂殑搴撳瓨淇℃伅");
-
-            // 2. 鎭㈠搴撳瓨鏁伴噺
-            if (stockDetail.StockQuantity == 0)
-            {
-                // 鏁村寘鍑哄簱鐨勬儏鍐�
-                stockDetail.StockQuantity = cancelQty;
-                stockDetail.OutboundQuantity = cancelQty;
-            }
-            else
-            {
-                // 閮ㄥ垎鍑哄簱鐨勬儏鍐�
-                stockDetail.StockQuantity += cancelQty;
-                stockDetail.OutboundQuantity += cancelQty;
-            }
-            await _stockInfoDetailService.Db.Updateable(stockDetail).ExecuteCommandAsync();
-
-            // 3. 鎭㈠閿佸畾淇℃伅鐘舵��
-            lockInfo.AssignQuantity += cancelQty;
-            lockInfo.PickedQty -= cancelQty;
-
-            if (lockInfo.PickedQty == 0)
-            {
-                lockInfo.Status = (int)OutLockStockStatusEnum.鍑哄簱涓�;
-            }
-            await _outStockLockInfoService.Db.Updateable(lockInfo).ExecuteCommandAsync();
-
-            // 4. 澶勭悊鐩稿叧鐨勬媶鍖呰褰曠姸鎬佹仮澶�
-            var relatedSplitRecords = await _splitPackageService.Db.Queryable<Dt_SplitPackageRecord>()
-                .Where(it => it.OriginalBarcode == barcode &&
-                           it.Status == (int)SplitPackageStatusEnum.宸叉嫞閫�)
-                .ToListAsync();
-
-            foreach (var record in relatedSplitRecords)
-            {
-                record.Status = (int)SplitPackageStatusEnum.宸叉媶鍖�;
-                await _splitPackageService.Db.Updateable(record).ExecuteCommandAsync();
-            }
-
-            // 5. 鎭㈠璁㈠崟鏄庣粏鐨勬嫞閫夋暟閲�
-            await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>()
-                .SetColumns(it => it.PickedQty == it.PickedQty - cancelQty)
-                .Where(it => it.Id == lockInfo.OrderDetailId)
-                .ExecuteCommandAsync();
-
-            // 6. 鎭㈠璁㈠崟鐘舵��
-            await CheckAndRevertOrderStatus(orderNo);
-
-            // 7. 鍒犻櫎鎷i�夎褰�
-            await Db.Deleteable<Dt_PickingRecord>().Where(it => it.Id == pickingRecord.Id).ExecuteCommandAsync();
-
-            //// 8. 璁板綍鍙栨秷鎿嶄綔鍘嗗彶
-            //await RecordCancelHistory(orderNo, palletCode, barcode, cancelQty, pickingRecord.Id,
-            //    lockInfo.MaterielCode, "鍙栨秷鍒嗘嫞");
-        }
-
-        /// <summary>
-        /// 妫�鏌ュ苟鎭㈠璁㈠崟鐘舵��
-        /// </summary>
-        private async Task CheckAndRevertOrderStatus(string orderNo)
-        {
-            var order = await _outboundOrderService.Db.Queryable<Dt_OutboundOrder>()
-                .Where(x => x.OrderNo == orderNo)
-                .FirstAsync();
-
-            if (order != null && order.OrderStatus == OutOrderStatusEnum.鍑哄簱瀹屾垚.ObjToInt())
-            {
-                await _outboundOrderService.Db.Updateable<Dt_OutboundOrder>()
-                    .SetColumns(x => x.OrderStatus == OutOrderStatusEnum.鍑哄簱涓�.ObjToInt())
-                    .Where(x => x.OrderNo == orderNo)
-                    .ExecuteCommandAsync();
-            }
-        }
-
-        /// <summary>
-        /// 璁板綍鍙栨秷鎿嶄綔鍘嗗彶
-        /// </summary>
-        private async Task RecordCancelHistory(string orderNo, string palletCode, string barcode,
-            decimal cancelQty, int pickingRecordId, string materielCode, string reason)
-        {
-           
-            //var cancelHistory = new Dt_PickingCancelRecord
-            //{
-            //    OrderNo = orderNo,
-            //    PalletCode = palletCode,
-            //    Barcode = barcode,
-            //    CancelQuantity = cancelQty,
-            //    CancelTime = DateTime.Now,
-            //    Operator = App.User.UserName,
-            //    OriginalPickingRecordId = pickingRecordId,
-            //    MaterielCode = materielCode,
-            //    Reason = reason
-            //};
-            //await Db.Insertable(cancelHistory).ExecuteCommandAsync();
-        }
-
-        /// <summary>
-        /// 鎷嗗寘閾鹃」
-        /// </summary>
-        public class SplitChainItem
-        {
-            public Dt_SplitPackageRecord SplitRecord { get; set; }
-            public string OriginalBarcode { get; set; }
-            public string NewBarcode { get; set; }
-            public decimal SplitQuantity { get; set; }
-        }
         // 鑾峰彇鏈嫞閫夊垪琛�
         public async Task<List<Dt_OutStockLockInfo>> GetUnpickedList(string orderNo, string palletCode)
         {
@@ -1169,186 +146,1525 @@
 
             return summary;
         }
+
+        #region 鏍稿績涓氬姟娴佺▼
         /// <summary>
-        /// 鑾峰彇鎷i�夊巻鍙�
+        /// 鎷i��
         /// </summary>
-        public async Task<List<Dt_PickingRecord>> GetPickingHistory(int orderId)
+        /// <param name="orderNo"></param>
+        /// <param name="palletCode"></param>
+        /// <param name="barcode"></param>
+        /// <returns></returns>
+        public async Task<WebResponseContent> ConfirmPicking(string orderNo, string palletCode, string barcode)
         {
-            // 閫氳繃鍑哄簱鍗旾D鏌ヨ鐩稿叧鐨勬嫞閫夊巻鍙�
-            // 娉ㄦ剰锛欴t_PickingRecord 涓病鏈夌洿鎺ュ瓨鍌∣rderId锛岄渶瑕侀�氳繃鍑哄簱鍗曟槑缁嗗叧鑱�
-            var detailIds = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>()
-                .Where(d => d.OrderId == orderId)
-                .Select(d => d.Id)
-                .ToListAsync();
-
-            return await Db.Queryable<Dt_PickingRecord>()
-                .Where(p => detailIds.Contains(p.OrderDetailId))
-                .OrderByDescending(p => p.PickTime)
-                .ToListAsync();
-        }
-
-
-        /// <summary>
-        /// 鑾峰彇鎵樼洏鐨勫嚭搴撶姸鎬佷俊鎭�
-        /// </summary>
-        public async Task<WebResponseContent> GetPalletOutboundStatus(string palletCode)
-        {
-            // 鑾峰彇鎵樼洏鐨勯攣瀹氫俊鎭�
-            var lockInfos = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
-                .Where(x => x.PalletCode == palletCode)
-                .ToListAsync();
-
-            // 鑾峰彇鎵樼洏搴撳瓨淇℃伅
-            var stockInfo = await _stockInfoService.Db.Queryable<Dt_StockInfo>()
-                .Includes(x => x.Details)
-                .Where(x => x.PalletCode == palletCode)
-                .FirstAsync();
-
-            if (stockInfo == null)
-                return WebResponseContent.Instance.Error("鏈壘鍒版墭鐩樹俊鎭�");
-
-            // 璁$畻鍚勭鏁伴噺
-            var totalStockQuantity = stockInfo.Details.Sum(x => x.StockQuantity);
-            var totalOutboundQuantity = stockInfo.Details.Sum(x => x.OutboundQuantity);
-            var totalLockedQuantity = lockInfos.Where(x => x.Status == (int)OutLockStockStatusEnum.鍑哄簱涓�)
-                .Sum(x => x.AssignQuantity - x.PickedQty);
-            var totalPickedQuantity = lockInfos.Sum(x => x.PickedQty);
-
-            var result = new
+            try
             {
-                PalletCode = palletCode,
-                LocationCode = stockInfo.LocationCode,
-                StockStatus = stockInfo.StockStatus,
-                TotalStockQuantity = totalStockQuantity,
-                TotalOutboundQuantity = totalOutboundQuantity,
-                TotalLockedQuantity = totalLockedQuantity,
-                TotalPickedQuantity = totalPickedQuantity,
-                AvailableQuantity = totalStockQuantity - totalOutboundQuantity,
-                LockInfos = lockInfos.Select(x => new
-                {
-                    x.Id,
-                    x.MaterielCode,
-                    x.OrderDetailId,
-                    x.AssignQuantity,
-                    x.PickedQty,
-                    x.Status,
-                    x.CurrentBarcode,
-                    x.IsSplitted
-                }).ToList(),
-                StockDetails = stockInfo.Details.Select(x => new
-                {
-                    x.Barcode,
-                    x.MaterielCode,
-                    StockQuantity = x.StockQuantity,
-                    OutboundQuantity = x.OutboundQuantity,
-                    AvailableQuantity = x.StockQuantity - x.OutboundQuantity
-                }).ToList()
-            };
+                _unitOfWorkManage.BeginTran();
+  
+                var validationResult = await ValidatePickingRequest(orderNo, palletCode, barcode);
+                if (!validationResult.IsValid)
+                    return WebResponseContent.Instance.Error(validationResult.ErrorMessage);
 
-            return WebResponseContent.Instance.OK(null, result);
+                var (lockInfo, orderDetail, stockDetail) = validationResult.Data;
+
+                // 璁$畻瀹為檯鎷i�夋暟閲�
+                var quantityResult = await CalculateActualPickingQuantity(lockInfo, orderDetail, stockDetail);
+                if (!quantityResult.IsValid)
+                    return WebResponseContent.Instance.Error(quantityResult.ErrorMessage);
+
+                var (actualQty, adjustedReason) = quantityResult.Data;
+
+                var overPickingValidation = await ValidateOverPicking(orderDetail.Id, actualQty);
+                if (!overPickingValidation.IsValid)
+                {
+                    return WebResponseContent.Instance.Error(overPickingValidation.ErrorMessage);
+                }
+
+                //  鎵ц鍒嗘嫞閫昏緫
+                var pickingResult = await ExecutePickingLogic(lockInfo, orderDetail, stockDetail, orderNo, palletCode, barcode, actualQty);
+
+                // 鏇存柊鐩稿叧鏁版嵁
+                await UpdateOrderRelatedData(orderDetail.Id, pickingResult.ActualPickedQty, orderNo);
+
+                // 璁板綍鎿嶄綔鍘嗗彶
+                await RecordPickingHistory(pickingResult, orderNo, palletCode);
+
+                _unitOfWorkManage.CommitTran();
+
+                return CreatePickingResponse(pickingResult, adjustedReason);
+            }
+            catch (Exception ex)
+            {
+                _unitOfWorkManage.RollbackTran();
+                _logger.LogError($"ConfirmPicking澶辫触 - OrderNo: {orderNo}, PalletCode: {palletCode}, Barcode: {barcode}, Error: {ex.Message}");
+                return WebResponseContent.Instance.Error($"鎷i�夌‘璁ゅけ璐ワ細{ex.Message}");
+            }
         }
-
         /// <summary>
-        /// 鐩存帴鍑哄簱 - 鏁翠釜鎵樼洏鍑哄簱锛屾竻绌哄簱瀛�
+        /// 鍙栨秷鎷i��
         /// </summary>
-        public async Task<WebResponseContent> DirectOutbound(DirectOutboundRequest request)
+        /// <param name="orderNo"></param>
+        /// <param name="palletCode"></param>
+        /// <param name="barcode"></param>
+        /// <returns></returns>
+        public async Task<WebResponseContent> CancelPicking(string orderNo, string palletCode, string barcode)
+        {
+            try
+            {
+                if (await IsPalletReturned(palletCode))
+                {
+                    return WebResponseContent.Instance.Error($"鎵樼洏{palletCode}宸茬粡鍥炲簱锛屼笉鑳藉彇娑堝垎鎷�");
+                }
+                _unitOfWorkManage.BeginTran();
+
+                // 1. 鍓嶇疆楠岃瘉
+                var validationResult = await ValidateCancelRequest(orderNo, palletCode, barcode);
+                if (!validationResult.IsValid)
+                    return WebResponseContent.Instance.Error(validationResult.ErrorMessage);
+
+                var (pickingRecord, lockInfo, orderDetail) = validationResult.Data;
+
+                // 2. 鎵ц鍙栨秷閫昏緫
+                await ExecuteCancelLogic(lockInfo, pickingRecord, orderDetail, orderNo);
+
+                _unitOfWorkManage.CommitTran();
+
+                return WebResponseContent.Instance.OK($"鍙栨秷鍒嗘嫞鎴愬姛锛屾仮澶嶆暟閲忥細{pickingRecord.PickQuantity}");
+            }
+            catch (Exception ex)
+            {
+                _unitOfWorkManage.RollbackTran();
+                _logger.LogError($"CancelPicking澶辫触 - OrderNo: {orderNo}, PalletCode: {palletCode}, Barcode: {barcode}, Error: {ex.Message}");
+                return WebResponseContent.Instance.Error($"鍙栨秷鍒嗘嫞澶辫触锛歿ex.Message}");
+            }
+        }
+        /// <summary>
+        /// 鍥炲簱
+        /// </summary>
+        /// <param name="orderNo"></param>
+        /// <param name="palletCode"></param>
+        /// <param name="reason"></param>
+        /// <returns></returns>
+        public async Task<WebResponseContent> ReturnRemaining(string orderNo, string palletCode, string reason)
         {
             try
             {
                 _unitOfWorkManage.BeginTran();
 
-                var stockInfo = await _stockInfoService.Db.Queryable<Dt_StockInfo>()
-                    .Includes(x => x.Details)
-                    .Where(x => x.PalletCode == request.PalletCode).FirstAsync();
+                // 1. 鍩虹楠岃瘉
+                if (string.IsNullOrEmpty(orderNo) || string.IsNullOrEmpty(palletCode))
+                    return WebResponseContent.Instance.Error("璁㈠崟鍙峰拰鎵樼洏鐮佷笉鑳戒负绌�");
+
+                // 2. 鑾峰彇搴撳瓨鍜屼换鍔′俊鎭�
+                var stockInfo = await _stockInfoService.Db.Queryable<Dt_StockInfo>().FirstAsync(x => x.PalletCode == palletCode);
 
                 if (stockInfo == null)
-                    return WebResponseContent.Instance.Error("鏈壘鍒版墭鐩樺簱瀛樹俊鎭�");
+                    return WebResponseContent.Instance.Error($"鏈壘鍒版墭鐩� {palletCode} 瀵瑰簲鐨勫簱瀛樹俊鎭�");
 
+                var task = await GetCurrentTask(orderNo, palletCode);
+                if (task == null)
+                    return WebResponseContent.Instance.Error("鏈壘鍒板搴旂殑浠诲姟淇℃伅");
 
-                var lockInfos = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
-                    .Where(x => x.OrderNo == request.OrderNo && x.PalletCode == request.PalletCode)
-                    .ToListAsync();
+                // 3. 鍒嗘瀽闇�瑕佸洖搴撶殑璐х墿
+                var returnAnalysis = await AnalyzeReturnItems(orderNo, palletCode, stockInfo.Id);
+                if (!returnAnalysis.HasItemsToReturn)
+                    return await HandleNoReturnItems(orderNo, palletCode,task);
 
+                // 4. 鎵ц鍥炲簱鎿嶄綔
+                await ExecuteReturnOperations(orderNo, palletCode, stockInfo, task, returnAnalysis);
 
-                foreach (var lockInfo in lockInfos)
-                {
-                    if (lockInfo.Status == (int)OutLockStockStatusEnum.鍑哄簱涓�)
-                    {
-                        lockInfo.PickedQty = lockInfo.AssignQuantity;
-                    }
-                    lockInfo.Status = (int)OutLockStockStatusEnum.宸插嚭搴�;
-                    await _outStockLockInfoService.Db.Updateable(lockInfo).ExecuteCommandAsync();
-
-                    var orderDetail = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>()
-                    .Where(x => x.Id == lockInfo.OrderDetailId)
-                    .FirstAsync();
-                    if (orderDetail != null)
-                    {
-                        orderDetail.OverOutQuantity += lockInfo.PickedQty;
-                        orderDetail.LockQuantity -= lockInfo.PickedQty;
-                        orderDetail.OrderDetailStatus = (int)OrderDetailStatusEnum.Over;
-                        orderDetail.LockQuantity = 0;
-                        await _outboundOrderDetailService.Db.Updateable(orderDetail).ExecuteCommandAsync();
-                    }
-                }
-                var groupDetails = lockInfos.GroupBy(x => x.OrderDetailId).Select(x => new
-                {
-                    OrderDetailId = x.Key,
-                    TotalQuantity = x.Sum(o => o.PickedQty)
-                }).ToList();
-                foreach (var item in groupDetails)
-                {
-                    var orderDetail = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>().Where(x => x.Id == item.OrderDetailId).FirstAsync();
-                    if (orderDetail != null)
-                    {
-                        orderDetail.OverOutQuantity = item.TotalQuantity;
-                        orderDetail.LockQuantity = 0;
-                        orderDetail.OrderDetailStatus = (int)OrderDetailStatusEnum.Over;
-                        await _outboundOrderDetailService.Db.Updateable(orderDetail).ExecuteCommandAsync();
-                    }
-                }
-
-                await CheckAndUpdateOrderStatus(request.OrderNo);
-
-                var lockInfoIds = lockInfos.Select(x => x.Id).ToList();
-                var splitRecords = await _splitPackageService.Db.Queryable<Dt_SplitPackageRecord>()
-                    .Where(x => lockInfoIds.Contains(x.OutStockLockInfoId) &&
-                               x.Status == (int)SplitPackageStatusEnum.宸叉媶鍖�)
-                    .ToListAsync();
-
-                foreach (var record in splitRecords)
-                {
-                    record.Status = (int)SplitPackageStatusEnum.宸叉嫞閫�;
-                    await _splitPackageService.Db.Updateable(record).ExecuteCommandAsync();
-                }
-
-
-                var location = await _locationInfoService.Db.Queryable<Dt_LocationInfo>()
-                    .Where(x => x.LocationCode == stockInfo.LocationCode)
-                    .FirstAsync();
-                if (location != null)
-                {
-                    location.LocationStatus = (int)LocationStatusEnum.Free;
-                    await _locationInfoService.Db.Updateable(location).ExecuteCommandAsync();
-                }
-
-                foreach (var detail in stockInfo.Details)
-                {
-                    await _stockInfoDetailService.Db.Deleteable(detail).ExecuteCommandAsync();
-                }
-                await _stockInfoService.Db.Deleteable(stockInfo).ExecuteCommandAsync();
-
-
+                // 5. 鍒涘缓鍥炲簱浠诲姟
+                await CreateReturnTaskAndHandleESS(orderNo, palletCode, task, returnAnalysis);
 
                 _unitOfWorkManage.CommitTran();
-                return WebResponseContent.Instance.OK("鐩存帴鍑哄簱鎴愬姛");
+
+                // 6. 鏇存柊璁㈠崟鐘舵�侊紙涓嶈Е鍙慚ES鍥炰紶锛�
+                await UpdateOrderStatusForReturn(orderNo);
+
+                return WebResponseContent.Instance.OK($"鍥炲簱鎿嶄綔鎴愬姛锛屽叡鍥炲簱鏁伴噺锛歿returnAnalysis.TotalReturnQty}");
             }
             catch (Exception ex)
             {
                 _unitOfWorkManage.RollbackTran();
-                return WebResponseContent.Instance.Error($"鐩存帴鍑哄簱澶辫触: {ex.Message}");
+                _logger.LogError($"ReturnRemaining澶辫触 - OrderNo: {orderNo}, PalletCode: {palletCode}, Error: {ex.Message}");
+                return WebResponseContent.Instance.Error($"鍥炲簱鎿嶄綔澶辫触: {ex.Message}");
             }
+        }
+
+        #endregion
+
+        #region 鍒嗘嫞纭绉佹湁鏂规硶
+
+        private async Task<ValidationResult<(Dt_OutStockLockInfo, Dt_OutboundOrderDetail, Dt_StockInfoDetail)>> ValidatePickingRequest(string orderNo, string palletCode, string barcode)
+        {
+            // 1. 鍩虹鍙傛暟楠岃瘉
+            if (string.IsNullOrEmpty(orderNo) || string.IsNullOrEmpty(palletCode) || string.IsNullOrEmpty(barcode))
+                return ValidationResult<(Dt_OutStockLockInfo, Dt_OutboundOrderDetail, Dt_StockInfoDetail)>.Error("璁㈠崟鍙枫�佹墭鐩樼爜鍜屾潯鐮佷笉鑳戒负绌�");
+
+            // 2. 鏌ユ壘鏈夋晥鐨勯攣瀹氫俊鎭�
+            var lockInfo = await FindValidLockInfo(orderNo, palletCode, barcode);
+            if (lockInfo == null)
+                return ValidationResult<(Dt_OutStockLockInfo, Dt_OutboundOrderDetail, Dt_StockInfoDetail)>.Error($"鏈壘鍒版湁鏁堢殑閿佸畾淇℃伅");
+
+            // 3. 妫�鏌ヨ鍗曠姸鎬�
+            var order = await _outboundOrderService.Db.Queryable<Dt_OutboundOrder>()
+                .Where(x => x.OrderNo == orderNo)
+                .FirstAsync();
+
+            if (order?.OrderStatus == (int)OutOrderStatusEnum.鍑哄簱瀹屾垚)
+                return ValidationResult<(Dt_OutStockLockInfo, Dt_OutboundOrderDetail, Dt_StockInfoDetail)>.Error($"璁㈠崟{orderNo}宸插畬鎴愶紝涓嶈兘缁х画鍒嗘嫞");
+
+            // 4. 鑾峰彇璁㈠崟鏄庣粏
+            var orderDetail = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>()
+                .FirstAsync(x => x.Id == lockInfo.OrderDetailId);
+
+            if (orderDetail == null)
+                return ValidationResult<(Dt_OutStockLockInfo, Dt_OutboundOrderDetail, Dt_StockInfoDetail)>.Error($"鏈壘鍒拌鍗曟槑缁�");
+
+            // 5. 妫�鏌ヨ鍗曟槑缁嗘暟閲�
+            if (orderDetail.OverOutQuantity >= orderDetail.NeedOutQuantity)
+                return ValidationResult<(Dt_OutStockLockInfo, Dt_OutboundOrderDetail, Dt_StockInfoDetail)>.Error($"璁㈠崟鏄庣粏闇�姹傛暟閲忓凡婊¤冻");
+
+            // 6. 鑾峰彇搴撳瓨鏄庣粏
+            var stockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
+                .Where(x => x.Barcode == barcode && x.StockId == lockInfo.StockId &&
+                   x.Status != StockStatusEmun.鍏ュ簱纭.ObjToInt())
+                .FirstAsync();
+
+            if (stockDetail == null)
+                return ValidationResult<(Dt_OutStockLockInfo, Dt_OutboundOrderDetail, Dt_StockInfoDetail)>.Error($"鏃犳晥鐨勬潯鐮佹垨鐗╂枡缂栫爜");
+
+            // 7. 妫�鏌ュ簱瀛樼姸鎬佸拰鏁伴噺
+            if (stockDetail.StockQuantity <= 0)
+                return ValidationResult<(Dt_OutStockLockInfo, Dt_OutboundOrderDetail, Dt_StockInfoDetail)>.Error($"鏉$爜{barcode}搴撳瓨涓嶈冻");
+
+            if (stockDetail.Status != StockStatusEmun.鍑哄簱閿佸畾.ObjToInt())
+                return ValidationResult<(Dt_OutStockLockInfo, Dt_OutboundOrderDetail, Dt_StockInfoDetail)>.Error($"鏉$爜{barcode}鐘舵�佷笉姝g‘锛屾棤娉曞垎鎷�");
+
+            // 8. 妫�鏌ユ槸鍚﹂噸澶嶅垎鎷�
+            var existingPicking = await Db.Queryable<Dt_PickingRecord>()
+                .Where(x => x.Barcode == barcode && x.OrderNo == orderNo && x.PalletCode == palletCode && x.OutStockLockId == lockInfo.Id)
+                .FirstAsync();
+
+            if (existingPicking != null)
+                return ValidationResult<(Dt_OutStockLockInfo, Dt_OutboundOrderDetail, Dt_StockInfoDetail)>.Error($"鏉$爜{barcode}宸茬粡鍒嗘嫞杩�");
+
+            return ValidationResult<(Dt_OutStockLockInfo, Dt_OutboundOrderDetail, Dt_StockInfoDetail)>.Success((lockInfo, orderDetail, stockDetail));
+        }
+
+        private async Task<Dt_OutStockLockInfo> FindValidLockInfo(string orderNo, string palletCode, string barcode)
+        {
+            // 浼樺厛鏌ユ壘绮剧‘鍖归厤鐨勮褰�
+            var lockInfo = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
+                .Where(it => it.OrderNo == orderNo &&
+                           it.Status == (int)OutLockStockStatusEnum.鍑哄簱涓� &&
+                           it.PalletCode == palletCode &&
+                           it.CurrentBarcode == barcode &&
+                           it.AssignQuantity > it.PickedQty).FirstAsync();
+
+            if (lockInfo == null)
+            {
+                // 鏌ユ壘鍚屼竴璁㈠崟涓嬬殑璁板綍
+                lockInfo = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
+                    .Where(it => it.OrderNo == orderNo &&  it.CurrentBarcode == barcode && it.Status == (int)OutLockStockStatusEnum.鍑哄簱涓� && it.AssignQuantity > it.PickedQty).FirstAsync();
+
+                if (lockInfo == null)
+                {
+                    // 妫�鏌ユ槸鍚﹀凡缁忓畬鎴愬垎鎷�
+                    var completedLockInfo = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
+                        .Where(it => it.CurrentBarcode == barcode &&
+                                   (it.Status == (int)OutLockStockStatusEnum.鎷i�夊畬鎴� ||
+                                    it.PickedQty >= it.AssignQuantity)).FirstAsync();
+
+                    if (completedLockInfo != null)
+                        throw new Exception($"鏉$爜{barcode}宸茬粡瀹屾垚鍒嗘嫞锛屼笉鑳介噸澶嶅垎鎷�");
+                    else
+                        return null;
+                }
+            }
+
+            return lockInfo;
+        }
+
+        private async Task<ValidationResult<(decimal, string)>> CalculateActualPickingQuantity(
+            Dt_OutStockLockInfo lockInfo, Dt_OutboundOrderDetail orderDetail, Dt_StockInfoDetail stockDetail)
+        {
+            decimal plannedQty = lockInfo.AssignQuantity - lockInfo.PickedQty;
+            decimal remainingOrderQty = orderDetail.NeedOutQuantity - orderDetail.OverOutQuantity;
+            decimal stockQuantity = stockDetail.StockQuantity;
+
+            if (plannedQty <= 0)
+            {
+                return ValidationResult<(decimal, string)>.Error($"璁″垝鎷i�夋暟閲忓繀椤诲ぇ浜�0锛屽綋鍓�: {plannedQty}");
+            }
+
+            if (remainingOrderQty <= 0)
+            {
+                return ValidationResult<(decimal, string)>.Error($"璁㈠崟鍓╀綑闇�姹傛暟閲忓繀椤诲ぇ浜�0锛屽綋鍓�: {remainingOrderQty}");
+            }
+
+            if (stockQuantity <= 0)
+            {
+                return ValidationResult<(decimal, string)>.Error($"搴撳瓨鏁伴噺蹇呴』澶т簬0锛屽綋鍓�: {stockQuantity}");
+            }
+            // 涓夐噸妫�鏌ワ細鍙栨渶灏忓��
+            decimal actualQty = plannedQty;
+            string adjustedReason = null;
+
+            if (plannedQty > remainingOrderQty)
+            {
+                actualQty = remainingOrderQty;
+                adjustedReason = $"璁㈠崟鏁伴噺闄愬埗锛氫粠{plannedQty}璋冩暣涓簕actualQty}";
+            }
+            if (actualQty > stockQuantity)
+            {
+                actualQty = stockQuantity;
+                adjustedReason = adjustedReason != null
+                    ? $"{adjustedReason}锛屽簱瀛樻暟閲忛檺鍒讹細杩涗竴姝ヨ皟鏁翠负{actualQty}"
+                    : $"搴撳瓨鏁伴噺闄愬埗锛氫粠{plannedQty}璋冩暣涓簕actualQty}";
+            }
+            if (actualQty <= 0)
+            {
+                return ValidationResult<(decimal, string)>.Error($"鏃犳硶鍒嗘嫞锛氳绠楀悗鐨勫疄闄呮暟閲忎负{actualQty}");
+            }
+            decimal projectedOverOut = orderDetail.OverOutQuantity + actualQty;
+            if (projectedOverOut > orderDetail.NeedOutQuantity)
+            {
+                // 濡傛灉浼氳秴鎷o紝璋冩暣涓哄垰濂芥弧瓒抽渶姹傜殑鏁伴噺
+                actualQty = orderDetail.NeedOutQuantity - orderDetail.OverOutQuantity;
+                adjustedReason = adjustedReason != null
+                    ? $"{adjustedReason}锛岄槻瓒呮嫞闄愬埗锛氭渶缁堣皟鏁翠负{actualQty}"
+                    : $"闃茶秴鎷i檺鍒讹細浠巤plannedQty}璋冩暣涓簕actualQty}";
+            } 
+
+            if (adjustedReason != null)
+            {
+                _logger.LogWarning($"鍒嗘嫞鏁伴噺璋冩暣锛歿adjustedReason}锛岃鍗晎orderDetail.NeedOutQuantity}锛屽凡鍑哄簱{orderDetail.OverOutQuantity}锛屽簱瀛榹stockQuantity}");
+            }
+
+            return ValidationResult<(decimal, string)>.Success((actualQty, adjustedReason));
+        }
+
+        /// <summary>
+        /// 涓撻棬楠岃瘉鏄惁浼氬彂鐢熻秴鎷�
+        /// </summary>
+        private async Task<ValidationResult<bool>> ValidateOverPicking(int orderDetailId, decimal pickingQty)
+        {
+            var orderDetail = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>()
+                .FirstAsync(x => x.Id == orderDetailId);
+
+            if (orderDetail == null)
+                return ValidationResult<bool>.Error("鏈壘鍒拌鍗曟槑缁�");
+
+            decimal projectedOverOut = orderDetail.OverOutQuantity + pickingQty;
+
+            if (projectedOverOut > orderDetail.NeedOutQuantity)
+            {
+                return ValidationResult<bool>.Error(
+                    $"鍒嗘嫞鍚庡皢瀵艰嚧瓒呮嫞锛氬綋鍓嶅凡鍑哄簱{orderDetail.OverOutQuantity}锛屾湰娆″垎鎷pickingQty}锛屽悎璁projectedOverOut}锛岃秴杩囬渶姹倇orderDetail.NeedOutQuantity}");
+            }
+
+            return ValidationResult<bool>.Success(true);
+        }
+        private async Task<PickingResult> ExecutePickingLogic(
+            Dt_OutStockLockInfo lockInfo, Dt_OutboundOrderDetail orderDetail, Dt_StockInfoDetail stockDetail,
+            string orderNo, string palletCode, string barcode, decimal actualQty)
+        {
+            decimal stockQuantity = stockDetail.StockQuantity;
+            var result = new PickingResult
+            {
+                FinalLockInfo = lockInfo,
+                FinalBarcode = barcode,
+                FinalStockId = stockDetail.Id,
+                ActualPickedQty = actualQty
+            };
+
+            if (actualQty < stockQuantity)
+            {
+                await HandleSplitPacking(lockInfo, stockDetail, actualQty, stockQuantity, result);
+            }
+            else if (actualQty == stockQuantity)
+            {
+                await HandleFullPicking(lockInfo, stockDetail, actualQty, result);
+            }
+            else
+            {
+                await HandlePartialPicking(lockInfo, stockDetail, actualQty, stockQuantity, result);
+            }
+
+            return result;
+        }
+
+        private async Task HandleSplitPacking(Dt_OutStockLockInfo lockInfo, Dt_StockInfoDetail stockDetail,
+            decimal actualQty, decimal stockQuantity, PickingResult result)
+        {
+            decimal remainingStockQty = stockQuantity - actualQty;
+
+            // 1. 鏇存柊鍘熸潯鐮佸簱瀛�
+            stockDetail.StockQuantity = remainingStockQty;
+            stockDetail.OutboundQuantity = remainingStockQty;
+            await _stockInfoDetailService.Db.Updateable(stockDetail).ExecuteCommandAsync();
+
+            // 2. 鐢熸垚鏂版潯鐮�
+            string newBarcode = await GenerateNewBarcode();
+
+            // 3. 鍒涘缓鏂伴攣瀹氫俊鎭�
+            var newLockInfo = await CreateSplitLockInfo(lockInfo, actualQty, newBarcode);
+
+            // 4. 璁板綍鎷嗗寘鍘嗗彶
+            await RecordSplitHistory(lockInfo, stockDetail, actualQty, remainingStockQty, newBarcode);
+
+            // 5. 鏇存柊鍘熼攣瀹氫俊鎭�
+            lockInfo.AssignQuantity = remainingStockQty;
+            lockInfo.PickedQty = 0;
+            lockInfo.Operator = App.User.UserName;
+            await _outStockLockInfoService.Db.Updateable(lockInfo).ExecuteCommandAsync();
+
+            // 6. 璁剧疆缁撴灉
+            result.FinalLockInfo = newLockInfo;
+            result.FinalBarcode = newBarcode;
+            result.SplitResults.AddRange(CreateSplitResults(lockInfo, actualQty, remainingStockQty, newBarcode, stockDetail.Barcode));
+        }
+
+        private async Task HandleFullPicking(Dt_OutStockLockInfo lockInfo, Dt_StockInfoDetail stockDetail,
+            decimal actualQty, PickingResult result)
+        {
+            // 1. 鏇存柊搴撳瓨
+            stockDetail.StockQuantity = 0;
+            stockDetail.OutboundQuantity = 0;
+            stockDetail.Status = StockStatusEmun.鍑哄簱瀹屾垚.ObjToInt();
+            await _stockInfoDetailService.Db.Updateable(stockDetail).ExecuteCommandAsync();
+
+            // 2. 鏇存柊閿佸畾淇℃伅
+            lockInfo.PickedQty += actualQty;
+            lockInfo.Status = (int)OutLockStockStatusEnum.鎷i�夊畬鎴�;
+            lockInfo.Operator = App.User.UserName;
+            await _outStockLockInfoService.Db.Updateable(lockInfo).ExecuteCommandAsync();
+        }
+
+        private async Task HandlePartialPicking(Dt_OutStockLockInfo lockInfo, Dt_StockInfoDetail stockDetail,
+            decimal actualQty, decimal stockQuantity, PickingResult result)
+        {
+            decimal stockOutQty = stockQuantity;
+            decimal remainingAssignQty = actualQty - stockQuantity;
+
+            // 1. 鏇存柊搴撳瓨
+            stockDetail.StockQuantity = 0;
+            stockDetail.OutboundQuantity = 0;
+            stockDetail.Status = StockStatusEmun.鍑哄簱瀹屾垚.ObjToInt();
+            await _stockInfoDetailService.Db.Updateable(stockDetail).ExecuteCommandAsync();
+
+            // 2. 鏇存柊閿佸畾淇℃伅
+            lockInfo.PickedQty += stockOutQty;
+            lockInfo.AssignQuantity = remainingAssignQty;
+            lockInfo.Operator = App.User.UserName;
+            await _outStockLockInfoService.Db.Updateable(lockInfo).ExecuteCommandAsync();
+
+            // 3. 鏇存柊鎷嗗寘璁板綍鐘舵��
+            await UpdateSplitRecordsStatus(stockDetail.Barcode);
+
+            result.ActualPickedQty = stockOutQty;
+        }
+
+        private async Task UpdateOrderRelatedData(int orderDetailId, decimal pickedQty, string orderNo)
+        {
+            // 鑾峰彇鏈�鏂扮殑璁㈠崟鏄庣粏鏁版嵁
+            var currentOrderDetail = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>()
+                .FirstAsync(x => x.Id == orderDetailId);
+
+            decimal newOverOutQuantity = currentOrderDetail.OverOutQuantity + pickedQty;
+            decimal newPickedQty = currentOrderDetail.PickedQty + pickedQty;
+
+            if (newOverOutQuantity > currentOrderDetail.NeedOutQuantity)
+            {
+                
+                _logger.LogError($"闃茶秴鎷f鏌ュけ璐� - OrderDetailId: {orderDetailId}, 宸插嚭搴�: {newOverOutQuantity}, 闇�姹�: {currentOrderDetail.NeedOutQuantity}, 鏈鍒嗘嫞: {pickedQty}");
+
+                 
+                decimal adjustedQty = currentOrderDetail.NeedOutQuantity - currentOrderDetail.OverOutQuantity;
+
+                if (adjustedQty > 0)
+                {
+                    _logger.LogWarning($"鑷姩璋冩暣鍒嗘嫞鏁伴噺闃叉瓒呮嫞锛氫粠{pickedQty}璋冩暣涓簕adjustedQty}");
+                    newOverOutQuantity = currentOrderDetail.NeedOutQuantity;
+                    newPickedQty = currentOrderDetail.PickedQty + adjustedQty;
+                }
+                else
+                {
+                    throw new Exception($"鍒嗘嫞鍚庡皢瀵艰嚧宸插嚭搴撴暟閲�({newOverOutQuantity})瓒呰繃璁㈠崟闇�姹傛暟閲�({currentOrderDetail.NeedOutQuantity})锛屼笖鏃犳硶鑷姩璋冩暣");
+                }
+            }
+
+            // 鏇存柊璁㈠崟鏄庣粏
+            await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>()
+                .SetColumns(it => new Dt_OutboundOrderDetail
+                {
+                    PickedQty = newPickedQty,
+                    OverOutQuantity = newOverOutQuantity,
+                })
+                .Where(it => it.Id == orderDetailId)
+                .ExecuteCommandAsync();
+
+            // 妫�鏌ュ苟鏇存柊璁㈠崟鐘舵��
+            await CheckAndUpdateOrderStatus(orderNo);
+        }
+
+        private async Task RecordPickingHistory(PickingResult result, string orderNo, string palletCode)
+        {
+            var task = await _taskRepository.Db.Queryable<Dt_Task>()
+                .Where(x => x.OrderNo == orderNo && x.PalletCode == palletCode)
+                .FirstAsync();
+
+            if (result.FinalLockInfo.Id <= 0)
+            {
+                throw new Exception($"閿佸畾淇℃伅ID鏃犳晥: {result.FinalLockInfo.Id}锛屾棤娉曡褰曟嫞閫夊巻鍙�");
+            }
+
+            var pickingHistory = new Dt_PickingRecord
+            {
+                FactoryArea = result.FinalLockInfo.FactoryArea,
+                TaskNo = task?.TaskNum ?? 0,
+                LocationCode = task?.SourceAddress ?? "",
+                StockId = result.FinalStockId,
+                OrderNo = orderNo,
+                OrderDetailId = result.FinalLockInfo.OrderDetailId,
+                PalletCode = palletCode,
+                Barcode = result.FinalBarcode,
+                MaterielCode = result.FinalLockInfo.MaterielCode,
+                PickQuantity = result.ActualPickedQty,
+                PickTime = DateTime.Now,
+                Operator = App.User.UserName,
+                OutStockLockId = result.FinalLockInfo.Id
+            };
+
+            await Db.Insertable(pickingHistory).ExecuteCommandAsync();
+        }
+
+        #endregion
+
+        #region 鍙栨秷鍒嗘嫞绉佹湁鏂规硶
+
+        private async Task<ValidationResult<(Dt_PickingRecord, Dt_OutStockLockInfo, Dt_OutboundOrderDetail)>> ValidateCancelRequest(string orderNo, string palletCode, string barcode)
+        {
+            // 鍩虹鍙傛暟楠岃瘉
+            if (string.IsNullOrEmpty(orderNo) || string.IsNullOrEmpty(palletCode) || string.IsNullOrEmpty(barcode))
+                return ValidationResult<(Dt_PickingRecord, Dt_OutStockLockInfo, Dt_OutboundOrderDetail)>.Error("璁㈠崟鍙枫�佹墭鐩樼爜鍜屾潯鐮佷笉鑳戒负绌�");
+
+            // 鏌ユ壘鎷i�夎褰�
+            var pickingRecord = await Db.Queryable<Dt_PickingRecord>()
+                .Where(it => it.OrderNo == orderNo &&
+                           it.PalletCode == palletCode &&
+                           it.Barcode == barcode)
+                .OrderByDescending(it => it.PickTime)
+                .FirstAsync();
+
+            if (pickingRecord == null)
+                return ValidationResult<(Dt_PickingRecord, Dt_OutStockLockInfo, Dt_OutboundOrderDetail)>.Error("鏈壘鍒板搴旂殑鎷i�夎褰�");
+
+            if (pickingRecord.PickQuantity <= 0)
+            {
+                return ValidationResult<(Dt_PickingRecord, Dt_OutStockLockInfo, Dt_OutboundOrderDetail)>.Error($"鎷i�夎褰曟暟閲忔棤鏁�: {pickingRecord.PickQuantity}");
+            }
+            // 鏌ユ壘閿佸畾淇℃伅
+            var lockInfo = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
+                .Where(it => it.Id == pickingRecord.OutStockLockId)
+                .FirstAsync();
+
+            if (lockInfo == null)
+                return ValidationResult<(Dt_PickingRecord, Dt_OutStockLockInfo, Dt_OutboundOrderDetail)>.Error("鏈壘鍒板搴旂殑鍑哄簱閿佸畾淇℃伅");
+          
+            if (lockInfo.PickedQty < pickingRecord.PickQuantity)
+            {
+                return ValidationResult<(Dt_PickingRecord, Dt_OutStockLockInfo, Dt_OutboundOrderDetail)>.Error(
+                    $"鍙栨秷鏁伴噺({pickingRecord.PickQuantity})瓒呰繃閿佸畾淇℃伅鐨勫凡鎷i�夋暟閲�({lockInfo.PickedQty})");
+            }
+            // 妫�鏌ョ姸鎬佹槸鍚﹀厑璁稿彇娑�
+            if (lockInfo.Status != (int)OutLockStockStatusEnum.鎷i�夊畬鎴�)
+                return ValidationResult<(Dt_PickingRecord, Dt_OutStockLockInfo, Dt_OutboundOrderDetail)>.Error("褰撳墠鐘舵�佷笉鍏佽鍙栨秷鍒嗘嫞");
+
+            var order = await _outboundOrderService.Db.Queryable<Dt_OutboundOrder>().FirstAsync(x => x.OrderNo == orderNo);
+
+            if (order?.OrderStatus == (int)OutOrderStatusEnum.鍑哄簱瀹屾垚)
+                return ValidationResult<(Dt_PickingRecord, Dt_OutStockLockInfo, Dt_OutboundOrderDetail)>.Error("璁㈠崟宸插嚭搴撳畬鎴愶紝涓嶅厑璁稿彇娑堝垎鎷�");
+
+            var orderDetail = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>().FirstAsync(x => x.Id == pickingRecord.OrderDetailId);
+
+            if (orderDetail == null)
+                return ValidationResult<(Dt_PickingRecord, Dt_OutStockLockInfo, Dt_OutboundOrderDetail)>.Error($"鏈壘鍒拌鍗曟槑缁嗭紝ID: {pickingRecord.OrderDetailId}");
+
+            // 妫�鏌ヨ鍗曟槑缁嗙殑宸叉嫞閫夋暟閲忔槸鍚﹁冻澶熷彇娑�
+            if (orderDetail.PickedQty < pickingRecord.PickQuantity)
+            {
+                return ValidationResult<(Dt_PickingRecord, Dt_OutStockLockInfo, Dt_OutboundOrderDetail)>.Error($"鍙栨秷鏁伴噺({pickingRecord.PickQuantity})瓒呰繃璁㈠崟鏄庣粏鐨勫凡鎷i�夋暟閲�({orderDetail.PickedQty})");
+            }
+
+            // 妫�鏌ヨ鍗曟槑缁嗙殑宸插嚭搴撴暟閲忔槸鍚﹁冻澶熷彇娑�
+            if (orderDetail.OverOutQuantity < pickingRecord.PickQuantity)
+            {
+                return ValidationResult<(Dt_PickingRecord, Dt_OutStockLockInfo, Dt_OutboundOrderDetail)>.Error($"鍙栨秷鏁伴噺({pickingRecord.PickQuantity})瓒呰繃璁㈠崟鏄庣粏鐨勫凡鍑哄簱鏁伴噺({orderDetail.OverOutQuantity})");
+            }
+
+            var stockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>().FirstAsync(it => it.Barcode == barcode && it.StockId == pickingRecord.StockId);
+
+            if (stockDetail != null)
+            {
+                // 妫�鏌ュ簱瀛樼姸鎬� - 濡傛灉鐘舵�佹槸鍏ュ簱纭鎴栧叆搴撳畬鎴愶紝璇存槑宸茬粡鍥炲簱
+                if (stockDetail.Status == StockStatusEmun.鍏ュ簱纭.ObjToInt() ||
+                    stockDetail.Status == StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt())
+                {
+                    return ValidationResult<(Dt_PickingRecord, Dt_OutStockLockInfo, Dt_OutboundOrderDetail)>.Error($"鏉$爜{barcode}宸茬粡鍥炲簱锛屼笉鑳藉彇娑堝垎鎷�");
+                }
+            }       
+            
+            return ValidationResult<(Dt_PickingRecord, Dt_OutStockLockInfo, Dt_OutboundOrderDetail)>.Success((pickingRecord, lockInfo, orderDetail));
+        }
+        /// <summary>
+        /// 妫�鏌ユ潯鐮佹槸鍚﹀凡缁忓洖搴�
+        /// </summary>
+        private async Task<bool> IsBarcodeReturned(string barcode, int stockId)
+        {
+            var stockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
+                .Where(it => it.Barcode == barcode && it.StockId == stockId)
+                .FirstAsync();
+
+            if (stockDetail == null)
+                return false;
+
+            // 濡傛灉鐘舵�佹槸鍏ュ簱纭鎴栧叆搴撳畬鎴愶紝璇存槑宸茬粡鍥炲簱
+            return stockDetail.Status == StockStatusEmun.鍏ュ簱纭.ObjToInt() ||
+                   stockDetail.Status == StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt();
+        }
+
+        /// <summary>
+        /// 妫�鏌ラ攣瀹氫俊鎭搴旂殑鏉$爜鏄惁宸茬粡鍥炲簱
+        /// </summary>
+        private async Task<bool> IsLockInfoReturned(Dt_OutStockLockInfo lockInfo)
+        {
+            var stockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
+                .Where(it => it.Barcode == lockInfo.CurrentBarcode && it.StockId == lockInfo.StockId)
+                .FirstAsync();
+
+            if (stockDetail == null)
+                return false;
+
+            return stockDetail.Status == StockStatusEmun.鍏ュ簱纭.ObjToInt() ||
+                   stockDetail.Status == StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt();
+        }
+        private async Task ExecuteCancelLogic(Dt_OutStockLockInfo lockInfo, Dt_PickingRecord pickingRecord,
+            Dt_OutboundOrderDetail orderDetail, string orderNo)
+        {
+            decimal cancelQty = pickingRecord.PickQuantity;
+
+            var currentStockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
+        .Where(it => it.Barcode == pickingRecord.Barcode && it.StockId == pickingRecord.StockId)
+        .FirstAsync();
+
+            if (currentStockDetail != null &&
+                (currentStockDetail.Status == StockStatusEmun.鍏ュ簱纭.ObjToInt() ||
+                 currentStockDetail.Status == StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt()))
+            {
+                throw new Exception($"鏉$爜{pickingRecord.Barcode}宸茬粡鍥炲簱锛屾棤娉曞彇娑堝垎鎷�");
+            }
+            //   妫�鏌ュ彇娑堝悗鏁伴噺涓嶄細涓鸿礋鏁�
+            decimal newOverOutQuantity = orderDetail.OverOutQuantity - cancelQty;
+            decimal newPickedQty = orderDetail.PickedQty - cancelQty;
+
+            if (newOverOutQuantity < 0 || newPickedQty < 0)
+            {
+                throw new Exception($"鍙栨秷鍒嗘嫞灏嗗鑷存暟鎹紓甯革細宸插嚭搴搟newOverOutQuantity}锛屽凡鎷i�墈newPickedQty}");
+            }
+
+            //  澶勭悊涓嶅悓绫诲瀷鐨勫彇娑�
+            if (lockInfo.IsSplitted == 1 && lockInfo.ParentLockId.HasValue)
+            {
+                await HandleSplitBarcodeCancel(lockInfo, pickingRecord, cancelQty);
+            }
+            else
+            {
+                await HandleNormalBarcodeCancel(lockInfo, pickingRecord, cancelQty);
+            }
+
+            // 鏇存柊璁㈠崟鏄庣粏
+            await UpdateOrderDetailOnCancel(pickingRecord.OrderDetailId, cancelQty);
+
+            //  鍒犻櫎鎷i�夎褰�
+            await Db.Deleteable<Dt_PickingRecord>()
+                .Where(x => x.Id == pickingRecord.Id)
+                .ExecuteCommandAsync();
+
+            //  閲嶆柊妫�鏌ヨ鍗曠姸鎬�
+            await UpdateOrderStatusForReturn(orderNo);
+        }
+
+        private async Task HandleSplitBarcodeCancel(Dt_OutStockLockInfo lockInfo, Dt_PickingRecord pickingRecord, decimal cancelQty)
+        {
+            // 鏌ユ壘鐖堕攣瀹氫俊鎭�
+            var parentLockInfo = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
+                .Where(x => x.Id == lockInfo.ParentLockId.Value)
+                .FirstAsync();
+
+            if (parentLockInfo == null)
+                throw new Exception("鏈壘鍒扮埗閿佸畾淇℃伅锛屾棤娉曞彇娑堟媶鍖呭垎鎷�");
+
+            if (await IsLockInfoReturned(parentLockInfo))
+            {
+                throw new Exception($"鐖舵潯鐮亄parentLockInfo.CurrentBarcode}宸茬粡鍥炲簱锛屾棤娉曞彇娑堟媶鍖呭垎鎷�");
+            }
+            if (await IsLockInfoReturned(lockInfo))
+            {
+                throw new Exception($"鎷嗗寘鏉$爜{lockInfo.CurrentBarcode}宸茬粡鍥炲簱锛屾棤娉曞彇娑堟媶鍖呭垎鎷�");
+            }
+            // 鎭㈠鐖堕攣瀹氫俊鎭殑鍒嗛厤鏁伴噺
+            parentLockInfo.AssignQuantity += cancelQty;
+            await _outStockLockInfoService.Db.Updateable(parentLockInfo).ExecuteCommandAsync();
+
+            // 鎭㈠搴撳瓨
+            var stockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
+                .Where(x => x.Barcode == parentLockInfo.CurrentBarcode && x.StockId == parentLockInfo.StockId)
+                .FirstAsync();
+
+            if (stockDetail != null)
+            {
+                stockDetail.StockQuantity += cancelQty;
+                stockDetail.OutboundQuantity = stockDetail.StockQuantity;
+                stockDetail.Status = StockStatusEmun.鍑哄簱閿佸畾.ObjToInt();
+                await _stockInfoDetailService.Db.Updateable(stockDetail).ExecuteCommandAsync();
+            }
+
+            // 鏇存柊鎷嗗寘璁板綍鐘舵��
+            await _splitPackageService.Db.Updateable<Dt_SplitPackageRecord>()
+                .SetColumns(x => new Dt_SplitPackageRecord
+                {
+                    Status = (int)SplitPackageStatusEnum.宸叉挙閿�,
+                    IsReverted = true,
+                })
+                .Where(x => x.NewBarcode == lockInfo.CurrentBarcode && !x.IsReverted)
+                .ExecuteCommandAsync();
+
+            // 鍒犻櫎鎷嗗寘浜х敓鐨勯攣瀹氫俊鎭�
+            await _outStockLockInfoService.Db.Deleteable<Dt_OutStockLockInfo>()
+                .Where(x => x.Id == lockInfo.Id)
+                .ExecuteCommandAsync();
+        }
+
+        private async Task HandleNormalBarcodeCancel(Dt_OutStockLockInfo lockInfo, Dt_PickingRecord pickingRecord, decimal cancelQty)
+        {
+            if (await IsLockInfoReturned(lockInfo))
+            {
+                throw new Exception($"鏉$爜{lockInfo.CurrentBarcode}宸茬粡鍥炲簱锛屾棤娉曞彇娑堝垎鎷�");
+            }
+            // 鎭㈠閿佸畾淇℃伅
+            lockInfo.PickedQty -= cancelQty;
+            if (lockInfo.PickedQty < 0) lockInfo.PickedQty = 0;
+
+            lockInfo.Status = (int)OutLockStockStatusEnum.鍑哄簱涓�;
+            await _outStockLockInfoService.Db.Updateable(lockInfo).ExecuteCommandAsync();
+
+            // 鎭㈠搴撳瓨
+            var stockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
+                .Where(x => x.Barcode == pickingRecord.Barcode && x.StockId == pickingRecord.StockId)
+                .FirstAsync();
+
+            if (stockDetail != null)
+            {
+                stockDetail.StockQuantity += cancelQty;
+                stockDetail.OutboundQuantity = stockDetail.StockQuantity;
+                stockDetail.Status = StockStatusEmun.鍑哄簱閿佸畾.ObjToInt();
+                await _stockInfoDetailService.Db.Updateable(stockDetail).ExecuteCommandAsync();
+            }
+        }
+
+        private async Task UpdateOrderDetailOnCancel(int orderDetailId, decimal cancelQty)
+        {
+            // 鑾峰彇鏈�鏂扮殑璁㈠崟鏄庣粏鏁版嵁
+            var currentOrderDetail = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>()
+                .FirstAsync(x => x.Id == orderDetailId);
+
+            decimal newOverOutQuantity = currentOrderDetail.OverOutQuantity - cancelQty;
+            decimal newPickedQty = currentOrderDetail.PickedQty - cancelQty;
+
+            // 妫�鏌ュ彇娑堝悗鏁伴噺涓嶄細涓鸿礋鏁�
+            if (newOverOutQuantity < 0 || newPickedQty < 0)
+            {
+                throw new Exception($"鍙栨秷鍒嗘嫞灏嗗鑷村凡鍑哄簱鏁伴噺({newOverOutQuantity})鎴栧凡鎷i�夋暟閲�({newPickedQty})涓鸿礋鏁�");
+            }
+
+            await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>()
+                .SetColumns(it => new Dt_OutboundOrderDetail
+                {
+                    PickedQty = newPickedQty,
+                    OverOutQuantity = newOverOutQuantity,
+                })
+                .Where(it => it.Id == orderDetailId)
+                .ExecuteCommandAsync();
+        }
+
+        #endregion
+
+        #region 鍥炲簱鎿嶄綔绉佹湁鏂规硶
+
+        private async Task<Dt_StockInfo> GetStockInfo(string palletCode)
+        {
+            return await _stockInfoService.Db.Queryable<Dt_StockInfo>()
+                .FirstAsync(x => x.PalletCode == palletCode);
+        }
+        /// <summary>
+        /// 妫�鏌ユ暣涓墭鐩樻槸鍚﹀凡缁忓洖搴�
+        /// </summary>
+        private async Task<bool> IsPalletReturned(string palletCode)
+        {
+            var stockInfo = await _stockInfoService.Db.Queryable<Dt_StockInfo>()
+                .Where(x => x.PalletCode == palletCode)
+                .FirstAsync();
+
+            if (stockInfo == null)
+                return false;
+
+            // 濡傛灉鎵樼洏鐘舵�佹槸鍏ュ簱纭鎴栧叆搴撳畬鎴愶紝璇存槑宸茬粡鍥炲簱
+            return stockInfo.StockStatus == StockStatusEmun.鍏ュ簱纭.ObjToInt() ||
+                   stockInfo.StockStatus == StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt();
+        }
+        private async Task<Dt_Task> GetCurrentTask(string orderNo, string palletCode)
+        {
+            // 鍏堝皾璇曢�氳繃璁㈠崟鍙峰拰鎵樼洏鍙锋煡鎵句换鍔�
+            var task = await _taskRepository.Db.Queryable<Dt_Task>()
+                .Where(x => x.OrderNo == orderNo && x.PalletCode == palletCode)
+                .FirstAsync();
+
+            if (task == null)
+            {
+                // 濡傛灉鎵句笉鍒帮紝鍐嶉�氳繃鎵樼洏鍙锋煡鎵�
+                task = await _taskRepository.Db.Queryable<Dt_Task>()
+                    .Where(x => x.PalletCode == palletCode)
+                    .FirstAsync();
+            }
+
+            return task;
+        }
+
+        private async Task<ReturnAnalysisResult> AnalyzeReturnItems(string orderNo, string palletCode, int stockId)
+        {
+            var result = new ReturnAnalysisResult();
+
+            // 鎯呭喌1锛氳幏鍙栨湭鍒嗘嫞鐨勫嚭搴撻攣瀹氳褰�
+            var remainingLocks = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
+                .Where(it => it.OrderNo == orderNo &&
+                           it.PalletCode == palletCode &&
+                           it.Status == (int)OutLockStockStatusEnum.鍑哄簱涓�)
+                .ToListAsync();
+
+            if (remainingLocks.Any())
+            {
+                result.HasRemainingLocks = true;
+                result.RemainingLocks = remainingLocks;
+                result.RemainingLocksReturnQty = remainingLocks.Sum(x => x.AssignQuantity - x.PickedQty);
+            }
+
+            // 鎯呭喌2锛氭鏌ユ墭鐩樹笂鏄惁鏈夊叾浠栧簱瀛樿揣鐗�
+            var palletStockGoods = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
+                .Where(it => it.StockId == stockId &&
+                            (it.Status == StockStatusEmun.鍏ュ簱纭.ObjToInt() ||
+                             it.Status == StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt() ||
+                             it.Status == StockStatusEmun.鍑哄簱閿佸畾.ObjToInt()))
+                .Where(it => it.StockQuantity > 0)
+                .ToListAsync();
+
+            if (palletStockGoods.Any())
+            {
+                result.HasPalletStockGoods = true;
+                result.PalletStockGoods = palletStockGoods;
+                result.PalletStockReturnQty = palletStockGoods.Sum(x => x.StockQuantity);
+            }
+
+            // 鎯呭喌3锛氭鏌ユ媶鍖呰褰�
+            var splitRecords = await _splitPackageService.Db.Queryable<Dt_SplitPackageRecord>()
+                .Where(it => it.OrderNo == orderNo && it.PalletCode == palletCode && !it.IsReverted && it.Status != (int)SplitPackageStatusEnum.宸插洖搴�)
+                .ToListAsync();
+
+            if (splitRecords.Any())
+            {
+                result.HasSplitRecords = true;
+                result.SplitRecords = splitRecords;
+                result.SplitReturnQty = await CalculateSplitReturnQuantity(splitRecords, stockId);
+            }
+
+            result.TotalReturnQty = result.RemainingLocksReturnQty + result.PalletStockReturnQty + result.SplitReturnQty;
+            result.HasItemsToReturn = result.TotalReturnQty > 0;
+
+            return result;
+        }
+
+        private async Task<decimal> CalculateSplitReturnQuantity(List<Dt_SplitPackageRecord> splitRecords, int stockId)
+        {
+            decimal totalQty = 0;
+            var processedBarcodes = new HashSet<string>();
+
+            foreach (var splitRecord in splitRecords)
+            {
+                // 妫�鏌ュ師鏉$爜
+                if (!processedBarcodes.Contains(splitRecord.OriginalBarcode))
+                {
+                    var originalStock = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
+                        .Where(it => it.Barcode == splitRecord.OriginalBarcode && it.StockId == stockId)
+                        .FirstAsync();
+
+                    if (originalStock != null && originalStock.StockQuantity > 0)
+                    {
+                        totalQty += originalStock.StockQuantity;
+                        processedBarcodes.Add(splitRecord.OriginalBarcode);
+                    }
+                }
+
+                // 妫�鏌ユ柊鏉$爜
+                if (!processedBarcodes.Contains(splitRecord.NewBarcode))
+                {
+                    var newStock = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
+                        .Where(it => it.Barcode == splitRecord.NewBarcode && it.StockId == stockId)
+                        .FirstAsync();
+
+                    if (newStock != null && newStock.StockQuantity > 0)
+                    {
+                        totalQty += newStock.StockQuantity;
+                        processedBarcodes.Add(splitRecord.NewBarcode);
+                    }
+                }
+            }
+
+            return totalQty;
+        }
+
+        private async Task<WebResponseContent> HandleNoReturnItems(string orderNo, string palletCode,Dt_Task originalTask)
+        {
+            // 妫�鏌ユ槸鍚︽墍鏈夎揣鐗╅兘宸叉嫞閫夊畬鎴�
+            var allPicked = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
+                .Where(it => it.OrderNo == orderNo && it.PalletCode == palletCode)
+                .AnyAsync(it => it.Status == (int)OutLockStockStatusEnum.鎷i�夊畬鎴�);
+
+            if (allPicked)
+            {
+                // 鍒犻櫎鍘熷鍑哄簱浠诲姟
+                await _taskRepository.Db.Deleteable(originalTask).ExecuteCommandAsync();
+                return WebResponseContent.Instance.OK("鎵�鏈夎揣鐗╁凡鎷i�夊畬鎴愶紝鎵樼洏涓虹┖");
+            }
+            else
+            {
+                // 鍒犻櫎鍘熷鍑哄簱浠诲姟
+                await _taskRepository.Db.Deleteable(originalTask).ExecuteCommandAsync();
+                return WebResponseContent.Instance.Error("娌℃湁闇�瑕佸洖搴撶殑鍓╀綑璐х墿");
+            }
+            //绌烘墭鐩樺浣曞鐞�  杩樻湁涓�涓嚭搴撲换鍔¤澶勭悊銆�
+         
+        }
+
+        private async Task ExecuteReturnOperations(string orderNo, string palletCode, Dt_StockInfo stockInfo,
+            Dt_Task task, ReturnAnalysisResult analysis)
+        {
+            // 鎯呭喌1锛氬鐞嗘湭鍒嗘嫞鐨勫嚭搴撻攣瀹氳褰�
+            if (analysis.HasRemainingLocks)
+            {
+                await HandleRemainingLocksReturn(analysis.RemainingLocks, stockInfo.Id);
+
+                // 鍏抽敭锛氭洿鏂拌鍗曟槑缁嗙殑宸叉嫞閫夋暟閲�
+                await UpdateOrderDetailsOnReturn(analysis.RemainingLocks);
+            }
+
+            // 澶勭悊鎵樼洏涓婂叾浠栧簱瀛樿揣鐗�
+            if (analysis.HasPalletStockGoods)
+            {
+                await HandlePalletStockGoodsReturn(analysis.PalletStockGoods);
+            }
+
+            // 澶勭悊鎷嗗寘璁板綍
+            if (analysis.HasSplitRecords)
+            {
+                await HandleSplitRecordsReturn(analysis.SplitRecords, orderNo, palletCode);
+            }
+
+            // 鏇存柊搴撳瓨涓昏〃鐘舵��
+            await UpdateStockInfoStatus(stockInfo);
+        }
+
+        private async Task HandleRemainingLocksReturn(List<Dt_OutStockLockInfo> remainingLocks, int stockId)
+        {
+            var lockIds = remainingLocks.Select(x => x.Id).ToList();
+
+            // 鏇存柊鍑哄簱閿佸畾璁板綍鐘舵�佷负鍥炲簱涓�
+            await _outStockLockInfoService.Db.Updateable<Dt_OutStockLockInfo>()
+                .SetColumns(it => new Dt_OutStockLockInfo
+                {
+                    Status = (int)OutLockStockStatusEnum.鍥炲簱涓�,
+                })
+                .Where(it => lockIds.Contains(it.Id))
+                .ExecuteCommandAsync();
+
+            // 澶勭悊搴撳瓨璁板綍
+            foreach (var lockInfo in remainingLocks)
+            {
+                decimal returnQty = lockInfo.AssignQuantity - lockInfo.PickedQty;
+
+                // 鏌ユ壘瀵瑰簲鐨勫簱瀛樻槑缁�
+                var stockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
+                    .Where(it => it.Barcode == lockInfo.CurrentBarcode && it.StockId == lockInfo.StockId)
+                    .FirstAsync();
+
+                if (stockDetail != null)
+                {
+                    // 鎭㈠搴撳瓨鐘舵��
+                    stockDetail.OutboundQuantity = Math.Max(0, stockDetail.OutboundQuantity - returnQty);
+                    stockDetail.Status = StockStatusEmun.鍏ュ簱纭.ObjToInt();
+                    await _stockInfoDetailService.Db.Updateable(stockDetail).ExecuteCommandAsync();
+                }
+                else
+                {
+                    // 鍒涘缓鏂扮殑搴撳瓨璁板綍
+                    var newStockDetail = new Dt_StockInfoDetail
+                    {
+                        StockId = lockInfo.StockId,
+                        MaterielCode = lockInfo.MaterielCode,
+                        MaterielName = lockInfo.MaterielName,
+                        OrderNo = lockInfo.OrderNo,
+                        BatchNo = lockInfo.BatchNo,
+                        StockQuantity = returnQty,
+                        OutboundQuantity = 0,
+                        Barcode = lockInfo.CurrentBarcode,
+                        InboundOrderRowNo = "",
+                        Status = StockStatusEmun.鍏ュ簱纭.ObjToInt(),
+                        SupplyCode = lockInfo.SupplyCode,
+                        WarehouseCode = lockInfo.WarehouseCode,
+                        Unit = lockInfo.Unit,
+                    };
+                    await _stockInfoDetailService.Db.Insertable(newStockDetail).ExecuteCommandAsync();
+                }
+            }
+        }
+
+        private async Task UpdateOrderDetailsOnReturn(List<Dt_OutStockLockInfo> remainingLocks)
+        {
+            // 鎸夎鍗曟槑缁嗗垎缁�
+            var orderDetailGroups = remainingLocks.GroupBy(x => x.OrderDetailId);
+
+            foreach (var group in orderDetailGroups)
+            {
+                var orderDetailId = group.Key;
+                var totalReturnQty = group.Sum(x => x.AssignQuantity - x.PickedQty);
+
+                // 鑾峰彇褰撳墠璁㈠崟鏄庣粏
+                var orderDetail = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>()
+                    .FirstAsync(x => x.Id == orderDetailId);
+
+                if (orderDetail != null)
+                {
+                    // 璋冩暣宸叉嫞閫夋暟閲忓拰宸插嚭搴撴暟閲�
+                    decimal newPickedQty = Math.Max(0, orderDetail.PickedQty - totalReturnQty);
+                    decimal newOverOutQuantity = Math.Max(0, orderDetail.OverOutQuantity - totalReturnQty);
+
+                    await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>()
+                        .SetColumns(it => new Dt_OutboundOrderDetail
+                        {
+                            PickedQty = newPickedQty,
+                            OverOutQuantity = newOverOutQuantity,
+                        })
+                        .Where(it => it.Id == orderDetailId)
+                        .ExecuteCommandAsync();
+                }
+            }
+        }
+
+        private async Task HandlePalletStockGoodsReturn(List<Dt_StockInfoDetail> palletStockGoods)
+        {
+            _logger.LogInformation($"鍥炲簱鎿嶄綔锛氬彂鐜皗palletStockGoods.Count}涓簱瀛樻槑缁嗛渶瑕佸洖搴擄紝绛夊緟AGV鎼繍");
+            foreach (var stockGood in palletStockGoods)
+            {
+                _logger.LogInformation($"寰呭洖搴撹揣鐗� - 鏉$爜: {stockGood.Barcode}, 鏁伴噺: {stockGood.StockQuantity}, 褰撳墠鐘舵��: {stockGood.Status}");
+            
+            // 鎭㈠搴撳瓨鐘舵��
+            stockGood.OutboundQuantity = 0;
+                stockGood.Status = StockStatusEmun.鍏ュ簱纭.ObjToInt();
+
+                await _stockInfoDetailService.Db.Updateable(stockGood).ExecuteCommandAsync();
+            }
+        }
+
+        private async Task HandleSplitRecordsReturn(List<Dt_SplitPackageRecord> splitRecords, string orderNo, string palletCode)
+        {
+            // 鏇存柊鎷嗗寘璁板綍鐘舵��
+            await _splitPackageService.Db.Updateable<Dt_SplitPackageRecord>()
+                .SetColumns(x => new Dt_SplitPackageRecord
+                {
+                    Status = (int)SplitPackageStatusEnum.宸插洖搴�,
+                })
+                .Where(x => x.OrderNo == orderNo && x.PalletCode == palletCode && !x.IsReverted)
+                .ExecuteCommandAsync();
+        }
+
+        private async Task UpdateStockInfoStatus(Dt_StockInfo stockInfo)
+        {
+            _logger.LogInformation($"鍥炲簱鎿嶄綔锛氭墭鐩榹stockInfo.PalletCode}绛夊緟AGV鍥炲簱鎼繍");
+            // 鏇存柊搴撳瓨涓昏〃鐘舵��
+            stockInfo.StockStatus = StockStatusEmun.鍏ュ簱纭.ObjToInt();
+            await _stockInfoService.Db.Updateable(stockInfo).ExecuteCommandAsync();
+        }
+        /// <summary>
+        /// 鍒涘缓鍥炲簱浠诲姟
+        /// </summary>
+        /// <param name="orderNo"></param>
+        /// <param name="palletCode"></param>
+        /// <param name="originalTask"></param>
+        /// <param name="analysis"></param>
+        /// <returns></returns>
+        private async Task CreateReturnTaskAndHandleESS(string orderNo, string palletCode, Dt_Task originalTask, ReturnAnalysisResult analysis)
+        {
+            var firstLocation = await _locationInfoService.Db.Queryable<Dt_LocationInfo>()
+                .FirstAsync(x => x.LocationCode == originalTask.SourceAddress);
+
+            // 鍒嗛厤鏂拌揣浣�
+            var newLocation = _locationInfoService.AssignLocation(firstLocation.LocationType);
+
+            Dt_Task returnTask = new()
+            {
+                CurrentAddress = stations[originalTask.TargetAddress],
+                Grade = 0,
+                PalletCode = palletCode,
+                NextAddress = "",
+                OrderNo = originalTask.OrderNo,
+                Roadway = newLocation.RoadwayNo,
+                SourceAddress = stations[originalTask.TargetAddress],
+                TargetAddress = newLocation.LocationCode,
+                TaskStatus = TaskStatusEnum.New.ObjToInt(),
+                TaskType = TaskTypeEnum.InPick.ObjToInt(),
+                PalletType = originalTask.PalletType,
+                WarehouseId = originalTask.WarehouseId
+
+            };
+            // 淇濆瓨鍥炲簱浠诲姟
+            await _taskRepository.Db.Insertable(returnTask).ExecuteCommandAsync();
+            var targetAddress = originalTask.TargetAddress;        
+         
+            // 鍒犻櫎鍘熷鍑哄簱浠诲姟
+            await _taskRepository.Db.Deleteable(originalTask).ExecuteCommandAsync();
+
+            // 缁� ESS 鍙戦�佹祦鍔ㄤ俊鍙峰拰鍒涘缓浠诲姟
+            await SendESSCommands(palletCode, targetAddress, returnTask);
+        }
+        /// <summary>
+        /// 缁橢SS涓嬩换鍔�
+        /// </summary>
+        /// <param name="palletCode"></param>
+        /// <param name="targetAddress"></param>
+        /// <param name="returnTask"></param>
+        /// <returns></returns>
+        /// <exception cref="Exception"></exception>
+        private async Task SendESSCommands(string palletCode, string targetAddress, Dt_Task returnTask)
+        {
+            try
+            {
+                // 1. 鍙戦�佹祦鍔ㄤ俊鍙�
+                var moveResult = await _eSSApiService.MoveContainerAsync(new WIDESEA_DTO.Basic.MoveContainerRequest
+                {
+                    slotCode = movestations[targetAddress],
+                    containerCode = palletCode
+                });
+
+                if (moveResult)
+                {
+                    // 2. 鍒涘缓鍥炲簱浠诲姟
+                    var essTask = new TaskModel()
+                    {
+                        taskType = "putaway",
+                        taskGroupCode = "",
+                        groupPriority = 0,
+                        tasks = new List<TasksType>
+                    {
+                        new()
+                        {
+                            taskCode = returnTask.TaskNum.ToString(),
+                            taskPriority = 0,
+                            taskDescribe = new TaskDescribeType
+                            {
+                                containerCode = palletCode,
+                                containerType = "CT_KUBOT_STANDARD",
+                                fromLocationCode = stations.GetValueOrDefault(targetAddress) ?? "",
+                                toStationCode = "",
+                                toLocationCode = returnTask.TargetAddress,
+                                deadline = 0,
+                                storageTag = ""
+                            }
+                        }
+                    }
+                    };
+
+                    var resultTask = await _eSSApiService.CreateTaskAsync(essTask);
+                    _logger.LogInformation($"ReturnRemaining 鍒涘缓浠诲姟鎴愬姛: {resultTask}");
+                }
+            }
+            catch (Exception ex)
+            {
+                _logger.LogError($"ReturnRemaining ESS鍛戒护鍙戦�佸け璐�: {ex.Message}");
+                throw new Exception($"ESS绯荤粺閫氫俊澶辫触: {ex.Message}");
+            }
+        }
+
+        #endregion
+
+        #region 璁㈠崟鐘舵�佺鐞�
+
+        private async Task CheckAndUpdateOrderStatus(string orderNo)
+        {
+            try
+            {
+                var orderDetails = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>()
+                    .LeftJoin<Dt_OutboundOrder>((o, item) => o.OrderId == item.Id)
+                    .Where((o, item) => item.OrderNo == orderNo)
+                    .Select((o, item) => o)
+                    .ToListAsync();
+
+                bool allCompleted = true;
+                foreach (var detail in orderDetails)
+                {
+                    if (detail.OverOutQuantity < detail.NeedOutQuantity)
+                    {
+                        allCompleted = false;
+                        break;
+                    }
+                }
+
+                var outboundOrder = await _outboundOrderService.Db.Queryable<Dt_OutboundOrder>()
+                    .FirstAsync(x => x.OrderNo == orderNo);
+
+                if (outboundOrder == null) return;
+
+                int newStatus = allCompleted ? (int)OutOrderStatusEnum.鍑哄簱瀹屾垚 : (int)OutOrderStatusEnum.鍑哄簱涓�;
+
+                if (outboundOrder.OrderStatus != newStatus)
+                {
+                    await _outboundOrderService.Db.Updateable<Dt_OutboundOrder>()
+                        .SetColumns(x => x.OrderStatus == newStatus)
+                        .Where(x => x.OrderNo == orderNo)
+                        .ExecuteCommandAsync();
+
+                    // 鍙湁姝e父鍒嗘嫞瀹屾垚鏃舵墠鍚慚ES鍙嶉
+                    if (allCompleted && newStatus == (int)OutOrderStatusEnum.鍑哄簱瀹屾垚)
+                    {
+                        await HandleOrderCompletion(outboundOrder, orderNo);
+                    }
+                }
+            }
+            catch (Exception ex)
+            {
+                _logger.LogError($"CheckAndUpdateOrderStatus澶辫触 - OrderNo: {orderNo}, Error: {ex.Message}");
+            }
+        }
+
+        private async Task UpdateOrderStatusForReturn(string orderNo)
+        {
+            try
+            {
+                var orderDetails = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>()
+                    .LeftJoin<Dt_OutboundOrder>((o, item) => o.OrderId == item.Id)
+                    .Where((o, item) => item.OrderNo == orderNo)
+                    .Select((o, item) => o)
+                    .ToListAsync();
+
+                bool allCompleted = true;
+                foreach (var detail in orderDetails)
+                {
+                    if (detail.OverOutQuantity < detail.NeedOutQuantity)
+                    {
+                        allCompleted = false;
+                        break;
+                    }
+                }
+
+                var outboundOrder = await _outboundOrderService.Db.Queryable<Dt_OutboundOrder>()
+                    .FirstAsync(x => x.OrderNo == orderNo);
+
+                if (outboundOrder == null) return;
+
+                int newStatus = allCompleted ? (int)OutOrderStatusEnum.鍑哄簱瀹屾垚 : (int)OutOrderStatusEnum.鍑哄簱涓�;
+
+                if (outboundOrder.OrderStatus != newStatus)
+                {
+                    await _outboundOrderService.Db.Updateable<Dt_OutboundOrder>()
+                        .SetColumns(x => x.OrderStatus == newStatus)
+                        .Where(x => x.OrderNo == orderNo)
+                        .ExecuteCommandAsync();
+
+                    _logger.LogInformation($"鍥炲簱鎿嶄綔鏇存柊璁㈠崟鐘舵�� - OrderNo: {orderNo}, 鏂扮姸鎬�: {newStatus}");
+                }
+            }
+            catch (Exception ex)
+            {
+                _logger.LogError($"UpdateOrderStatusForReturn澶辫触 - OrderNo: {orderNo}, Error: {ex.Message}");
+            }
+        }
+
+        private async Task HandleOrderCompletion(Dt_OutboundOrder outboundOrder, string orderNo)
+        {
+            // 璋冩嫧鍑哄簱鍜岄噸妫�鍑哄簱涓嶉渶瑕佸弽棣圡ES
+            if (outboundOrder.OrderType == OutOrderTypeEnum.Allocate.ObjToInt() ||
+                outboundOrder.OrderType == OutOrderTypeEnum.ReCheck.ObjToInt())
+            {
+                return;
+            }
+
+            try
+            {
+                var feedmodel = new FeedbackOutboundRequestModel
+                {
+                    reqCode = Guid.NewGuid().ToString(),
+                    reqTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
+                    business_type = outboundOrder.BusinessType,
+                    factoryArea = outboundOrder.FactoryArea,
+                    operationType = 1,
+                    Operator = App.User.UserName,
+                    orderNo = outboundOrder.UpperOrderNo,
+                    status = outboundOrder.OrderStatus,
+                    details = new List<FeedbackOutboundDetailsModel>()
+                };
+
+                // 鍙幏鍙栧凡鎷i�夊畬鎴愮殑閿佸畾璁板綍
+                var lists = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
+                    .Where(x => x.OrderNo == orderNo && x.Status == (int)OutLockStockStatusEnum.鎷i�夊畬鎴�)
+                    .ToListAsync();
+
+                var groupedData = lists.GroupBy(item => new { item.MaterielCode, item.lineNo, item.Unit, item.WarehouseCode })
+                   .Select(group => new FeedbackOutboundDetailsModel
+                   {
+                       materialCode = group.Key.MaterielCode,
+                       lineNo = group.Key.lineNo,
+                       warehouseCode = group.Key.WarehouseCode,
+                       qty = group.Sum(x => x.PickedQty),
+                       currentDeliveryQty = group.Sum(x => x.PickedQty),
+                       unit = group.Key.Unit,
+                       barcodes = group.Select(row => new WIDESEA_DTO.Outbound.BarcodesModel
+                       {
+                           barcode = row.CurrentBarcode,
+                           supplyCode = row.SupplyCode,
+                           batchNo = row.BatchNo,
+                           unit = row.Unit,
+                           qty = row.PickedQty
+                       }).ToList()
+                   }).ToList();
+
+                feedmodel.details = groupedData;
+
+                var result = await _invokeMESService.FeedbackOutbound(feedmodel);
+                if (result != null && result.code == 200)
+                {
+                    await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>()
+                        .SetColumns(x => x.ReturnToMESStatus == 1)
+                        .Where(x => x.OrderId == outboundOrder.Id)
+                        .ExecuteCommandAsync();
+
+                    await _outboundOrderService.Db.Updateable<Dt_OutboundOrder>()
+                        .SetColumns(x => x.ReturnToMESStatus == 1)
+                        .Where(x => x.OrderNo == orderNo)
+                        .ExecuteCommandAsync();
+                }
+            }
+            catch (Exception ex)
+            {
+                _logger.LogError($"FeedbackOutbound澶辫触 - OrderNo: {orderNo}, Error: {ex.Message}");
+            }
+        }
+
+        #endregion
+
+        #region 杈呭姪鏂规硶
+
+        private async Task<string> GenerateNewBarcode()
+        {
+            var seq = await _dailySequenceService.GetNextSequenceAsync();
+            return "WSLOT" + DateTime.Now.ToString("yyyyMMdd") + seq.ToString()?.PadLeft(5, '0');
+        }
+
+        private async Task<Dt_OutStockLockInfo> CreateSplitLockInfo(Dt_OutStockLockInfo originalLock, decimal quantity, string newBarcode)
+        {
+            var newLockInfo = new Dt_OutStockLockInfo
+            {
+                OrderNo = originalLock.OrderNo,
+                OrderDetailId = originalLock.OrderDetailId,
+                BatchNo = originalLock.BatchNo,
+                MaterielCode = originalLock.MaterielCode,
+                MaterielName = originalLock.MaterielName,
+                StockId = originalLock.StockId,
+                OrderQuantity = quantity,
+                OriginalQuantity = quantity,
+                AssignQuantity = quantity,
+                PickedQty = quantity,
+                LocationCode = originalLock.LocationCode,
+                PalletCode = originalLock.PalletCode,
+                TaskNum = originalLock.TaskNum,
+                Status = (int)OutLockStockStatusEnum.鎷i�夊畬鎴�,
+                Unit = originalLock.Unit,
+                SupplyCode = originalLock.SupplyCode,
+                OrderType = originalLock.OrderType,
+                CurrentBarcode = newBarcode,
+                OriginalLockQuantity = quantity,
+                IsSplitted = 1,
+                ParentLockId = originalLock.Id,
+                Operator=  App.User.UserName,
+                FactoryArea=originalLock.FactoryArea,
+                lineNo=originalLock.lineNo,
+                WarehouseCode=originalLock.WarehouseCode,
+
+            };
+
+            var newLockId = await _outStockLockInfoService.Db.Insertable(newLockInfo).ExecuteReturnIdentityAsync();
+            newLockInfo.Id = newLockId;
+            return newLockInfo;
+        }
+
+        private async Task RecordSplitHistory(Dt_OutStockLockInfo lockInfo, Dt_StockInfoDetail stockDetail,
+            decimal splitQty, decimal remainQty, string newBarcode)
+        {
+            var splitHistory = new Dt_SplitPackageRecord
+            {
+                FactoryArea = lockInfo.FactoryArea,
+                TaskNum = lockInfo.TaskNum,
+                OutStockLockInfoId = lockInfo.Id,
+                StockId = stockDetail.StockId,
+                Operator = App.User.UserName,
+                IsReverted = false,
+                OriginalBarcode = stockDetail.Barcode,
+                NewBarcode = newBarcode,
+                SplitQty = splitQty,
+                RemainQuantity = remainQty,
+                MaterielCode = lockInfo.MaterielCode,
+                SplitTime = DateTime.Now,
+                OrderNo = lockInfo.OrderNo,
+                PalletCode = lockInfo.PalletCode,
+                Status = (int)SplitPackageStatusEnum.宸叉嫞閫�
+            };
+
+            await _splitPackageService.Db.Insertable(splitHistory).ExecuteCommandAsync();
+        }
+
+        private List<SplitResult> CreateSplitResults(Dt_OutStockLockInfo lockInfo, decimal splitQty, decimal remainQty, string newBarcode, string originalBarcode)
+        {
+            return new List<SplitResult>
+        {
+            new SplitResult
+            {
+                materialCode = lockInfo.MaterielCode,
+                supplierCode = lockInfo.SupplyCode,
+                quantityTotal = splitQty.ToString("F2"),
+                batchNumber = newBarcode,
+                batch = lockInfo.BatchNo,
+                factory = lockInfo.FactoryArea,
+                date = DateTime.Now.ToString("yyyy-MM-dd"),
+            },
+            new SplitResult
+            {
+                materialCode = lockInfo.MaterielCode,
+                supplierCode = lockInfo.SupplyCode,
+                quantityTotal = remainQty.ToString("F2"),
+                batchNumber = originalBarcode,
+                batch = lockInfo.BatchNo,
+                factory = lockInfo.FactoryArea,
+                date = DateTime.Now.ToString("yyyy-MM-dd"),
+            }
+        };
+        }
+
+        private async Task UpdateSplitRecordsStatus(string barcode)
+        {
+            var relatedSplitRecords = await _splitPackageService.Db.Queryable<Dt_SplitPackageRecord>()
+                .Where(it => it.OriginalBarcode == barcode || it.NewBarcode == barcode)
+                .Where(it => !it.IsReverted)
+                .ToListAsync();
+
+            foreach (var record in relatedSplitRecords)
+            {
+                record.Status = (int)SplitPackageStatusEnum.宸叉嫞閫�;
+                await _splitPackageService.Db.Updateable(record).ExecuteCommandAsync();
+            }
+        }
+
+        private async Task<int> GenerateTaskNumber()
+        {
+            return await _dailySequenceService.GetNextSequenceAsync();
+        }
+
+        private WebResponseContent CreatePickingResponse(PickingResult result, string adjustedReason)
+        {
+            //if (result.SplitResults.Any())
+            //{
+            //    var responseData = new { SplitResults = result.SplitResults, AdjustedReason = "" };
+            //    if (!string.IsNullOrEmpty(adjustedReason))
+            //    {
+            //        responseData = new { SplitResults = result.SplitResults, AdjustedReason = adjustedReason };
+            //    }
+            //    return WebResponseContent.Instance.OK("鎷i�夌‘璁ゆ垚鍔燂紝宸茶嚜鍔ㄦ媶鍖�", responseData);
+            //}
+
+            //if (!string.IsNullOrEmpty(adjustedReason))
+            //{
+            //    return WebResponseContent.Instance.OK($"鎷i�夌‘璁ゆ垚鍔燂紙{adjustedReason}锛�");
+            //}
+
+            //return WebResponseContent.Instance.OK("鎷i�夌‘璁ゆ垚鍔�");
+
+            if (result.SplitResults.Any())
+            {
+                return WebResponseContent.Instance.OK("鎷i�夌‘璁ゆ垚鍔燂紝宸茶嚜鍔ㄦ媶鍖�", new { SplitResults = result.SplitResults });
+            }
+            return WebResponseContent.Instance.OK("鎷i�夌‘璁ゆ垚鍔�", new { SplitResults = new List<SplitResult>() });
+        }
+ 
+        #endregion
+    }
+
+    #region 鏀寔绫诲畾涔�
+
+    public class ValidationResult<T>
+    {
+        public bool IsValid { get; set; }
+        public T Data { get; set; }
+        public string ErrorMessage { get; set; }
+
+        public static ValidationResult<T> Success(T data)
+        {
+            return new ValidationResult<T>
+            {
+                IsValid = true,
+                Data = data
+            };
+        }
+
+        public static ValidationResult<T> Error(string message)
+        {
+            return new ValidationResult<T>
+            {
+                IsValid = false,
+                ErrorMessage = message
+            };
         }
     }
 
+    public class PickingResult
+    {
+        public Dt_OutStockLockInfo FinalLockInfo { get; set; }
+        public string FinalBarcode { get; set; }
+        public int FinalStockId { get; set; }
+        public decimal ActualPickedQty { get; set; }
+        public List<SplitResult> SplitResults { get; set; } = new List<SplitResult>();
+    }
+
+    public class ReturnAnalysisResult
+    {
+        public bool HasItemsToReturn { get; set; }
+        public bool HasRemainingLocks { get; set; }
+        public bool HasPalletStockGoods { get; set; }
+        public bool HasSplitRecords { get; set; }
+        public decimal RemainingLocksReturnQty { get; set; }
+        public decimal PalletStockReturnQty { get; set; }
+        public decimal SplitReturnQty { get; set; }
+        public decimal TotalReturnQty { get; set; }
+        public List<Dt_OutStockLockInfo> RemainingLocks { get; set; } = new List<Dt_OutStockLockInfo>();
+        public List<Dt_StockInfoDetail> PalletStockGoods { get; set; } = new List<Dt_StockInfoDetail>();
+        public List<Dt_SplitPackageRecord> SplitRecords { get; set; } = new List<Dt_SplitPackageRecord>();
+    }
+
+    #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_OutboundService/SplitPackageService.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/SplitPackageService.cs"
index 34b8f2b..3c4b50b 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/SplitPackageService.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/SplitPackageService.cs"
@@ -17,6 +17,7 @@
 using WIDESEA_IOutboundService;
 using WIDESEA_IStockService;
 using WIDESEA_Model.Models;
+using WIDESEA_Model.Models.Basic;
 
 namespace WIDESEA_OutboundService
 {
@@ -30,9 +31,9 @@
         private readonly IOutStockLockInfoService _outStockLockInfoService;
         private readonly IDailySequenceService _dailySequenceService;
         private readonly IInvokeMESService _invokeMESService;
-
+        private readonly IMaterielToMesService _materielToMesService;
         private readonly ILogger<SplitPackageService> _logger;
-        public SplitPackageService(IRepository<Dt_SplitPackageRecord> BaseDal, IUnitOfWorkManage unitOfWorkManage, IStockInfoService stockInfoService, IOutStockLockInfoService outStockLockInfoService, IStockInfoDetailService stockInfoDetailService, IDailySequenceService dailySequenceService, IInvokeMESService invokeMESService, ILogger<SplitPackageService> logger) : base(BaseDal)
+        public SplitPackageService(IRepository<Dt_SplitPackageRecord> BaseDal, IUnitOfWorkManage unitOfWorkManage, IStockInfoService stockInfoService, IOutStockLockInfoService outStockLockInfoService, IStockInfoDetailService stockInfoDetailService, IDailySequenceService dailySequenceService, IInvokeMESService invokeMESService, ILogger<SplitPackageService> logger, IMaterielToMesService materielToMesService) : base(BaseDal)
         {
             _unitOfWorkManage = unitOfWorkManage;
             _stockInfoService = stockInfoService;
@@ -41,172 +42,8 @@
             _dailySequenceService = dailySequenceService;
             _invokeMESService = invokeMESService;
             _logger = logger;
+            _materielToMesService = materielToMesService;
         }
-
-        /// <summary>
-        /// 鎷嗗寘鎷嗙鎿嶄綔
-        /// </summary>
-        //public async Task<WebResponseContent> SplitPackage(SplitPackageDto request)
-        //{
-        //    try
-        //    {
-        //        _unitOfWorkManage.BeginTran();
-
-        //        // 1. 楠岃瘉鍑哄簱閿佸畾淇℃伅
-        //        var lockInfo = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
-        //                  .Where(x => x.OrderNo == request.OrderNo &&
-        //                   x.PalletCode == request.PalletCode &&
-        //                   x.CurrentBarcode == request.OriginalBarcode &&
-        //                   x.Status == 1)
-        //            .FirstAsync();
-
-        //        if (lockInfo == null)
-        //            return WebResponseContent.Instance.Error("鏈壘鍒版湁鏁堢殑鍑哄簱閿佸畾淇℃伅");
-
-        //        // 2. 妫�鏌ュ墿浣欓攣瀹氭暟閲�
-        //        decimal remainingLockQuantity = lockInfo.OriginalQuantity - lockInfo.PickedQty;
-        //        if (request.SplitQuantity > remainingLockQuantity)
-        //            return WebResponseContent.Instance.Error($"鎷嗗寘鏁伴噺涓嶈兘澶т簬鍓╀綑閿佸畾鏁伴噺锛屽墿浣欙細{remainingLockQuantity}");
-
-        //        var baseStockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
-        //       .Where(x => x.Barcode == request.OriginalBarcode && x.StockId == lockInfo.StockId)
-        //       .FirstAsync();
-        //        if (baseStockDetail == null)
-        //            throw new Exception($"鏈壘鍒版潯鐮亄request.OriginalBarcode}瀵瑰簲鐨勫簱瀛樿褰�");
-
-
-        //        // 4. 璁$畻鎷嗗垎鍚庣殑鏁伴噺
-        //        decimal remainingQty = baseStockDetail.StockQuantity - request.SplitQuantity;
-
-        //        // 鏇存柊鍩虹鏉$爜鐨勫簱瀛樻暟閲忎负鍓╀綑鏁伴噺
-        //        baseStockDetail.StockQuantity = remainingQty;
-        //        baseStockDetail.OutboundQuantity = remainingQty;
-        //        await _stockInfoDetailService.Db.Updateable(baseStockDetail).ExecuteCommandAsync();
-
-
-        //        var seq = await _dailySequenceService.GetNextSequenceAsync();
-        //        // 3. 鐢熸垚鏂版潯鐮�
-        //        string newBarcode = "WSLOT" + DateTime.Now.ToString("yyyyMMdd") + seq.ToString()?.PadLeft(5, '0');
-
-
-        //        // 涓烘媶鍖呬骇鐢熺殑鏂版潯鐮佸垱寤哄簱瀛樿褰�
-        //        var newStockDetail = new Dt_StockInfoDetail
-        //        {
-        //            SupplyCode = baseStockDetail.SupplyCode,
-        //            WarehouseCode = baseStockDetail.WarehouseCode,
-        //            BarcodeQty = baseStockDetail.BarcodeQty,
-        //            BarcodeUnit = baseStockDetail.BarcodeUnit,
-        //            BusinessType = baseStockDetail.BusinessType,
-        //            Unit = baseStockDetail.Unit,
-        //            StockId = lockInfo.StockId,
-        //            MaterielCode = baseStockDetail.MaterielCode,
-        //            OrderNo = baseStockDetail.OrderNo,
-        //            BatchNo = baseStockDetail.BatchNo,
-        //            StockQuantity = request.SplitQuantity, // 鏂版潯鐮佽幏寰楁媶鍒嗘暟閲�
-        //            OutboundQuantity = request.SplitQuantity,
-        //            Barcode = newBarcode,
-        //            InboundOrderRowNo = baseStockDetail.InboundOrderRowNo,
-
-        //        };
-        //        await _outStockLockInfoService.Db.Insertable(newStockDetail).ExecuteCommandAsync();
-
-        //        // 4. 鍒涘缓鏂扮殑鍑哄簱閿佸畾淇℃伅锛堟柊鏉$爜锛�
-        //        var newLockInfo = new Dt_OutStockLockInfo
-        //        {
-
-        //            OrderNo = lockInfo.OrderNo,
-        //            OrderDetailId = lockInfo.OrderDetailId,
-        //            BatchNo = lockInfo.BatchNo,
-        //            MaterielCode = lockInfo.MaterielCode,
-        //            MaterielName = lockInfo.MaterielName,
-        //            StockId = lockInfo.StockId,
-        //            OrderQuantity = request.SplitQuantity,
-        //            OriginalQuantity = request.SplitQuantity,
-        //            AssignQuantity = request.SplitQuantity, // 鏂版潯鐮佸垎閰嶆暟閲�
-        //            PickedQty = 0, // 鏂版潯鐮佹湭鎷i��
-        //            LocationCode = lockInfo.LocationCode,
-        //            PalletCode = lockInfo.PalletCode,
-        //            TaskNum = lockInfo.TaskNum,
-        //            Status = (int)OutLockStockStatusEnum.鍑哄簱涓�,
-        //            Unit = lockInfo.Unit,
-        //            SupplyCode = lockInfo.SupplyCode,
-        //            OrderType = lockInfo.OrderType,
-        //            CurrentBarcode = newBarcode, // 鏂版潯鐮�
-        //            OriginalLockQuantity = request.SplitQuantity,
-        //            IsSplitted = 1,
-        //            ParentLockId = lockInfo.Id // 璁板綍鐖剁骇閿佸畾ID
-        //        };
-        //        await _outStockLockInfoService.Db.Insertable(newLockInfo).ExecuteCommandAsync();
-
-        //        lockInfo.AssignQuantity = remainingQty;
-        //        lockInfo.IsSplitted = 1; // 鏍囪涓哄凡鎷嗗寘
-        //        await _outStockLockInfoService.Db.Updateable(lockInfo).ExecuteCommandAsync();
-
-        //        var previousSplitRecord = await Db.Queryable<Dt_SplitPackageRecord>()
-        //      .Where(x => x.OriginalBarcode == request.OriginalBarcode && !x.IsReverted)
-        //      .OrderByDescending(x => x.SplitTime)
-        //      .FirstAsync();
-
-        //        // 6. 璁板綍鎷嗗寘鍘嗗彶锛堢敤浜庤拷韪級
-        //        var splitHistory = new Dt_SplitPackageRecord
-        //        {
-        //            FactoryArea = lockInfo.FactoryArea,
-        //            TaskNum = lockInfo.TaskNum,
-        //            OutStockLockInfoId = lockInfo.Id,
-        //            StockId = baseStockDetail.StockId,
-        //            Operator = App.User.UserName,
-        //            IsReverted = false,
-        //            OriginalBarcode = request.OriginalBarcode,
-        //            NewBarcode = newBarcode,
-        //            SplitQty = request.SplitQuantity,
-        //            RemainQuantity = remainingQty, // 璁板綍鎷嗗垎鍚庣殑鍓╀綑鏁伴噺
-        //            MaterielCode = lockInfo.MaterielCode,
-        //            SplitTime = DateTime.Now,
-        //            OrderNo = request.OrderNo,
-        //            PalletCode = request.PalletCode,
-        //            Status = (int)SplitPackageStatusEnum.宸叉媶鍖�,
-        //            PreviousSplitRecordId = previousSplitRecord?.Id??0 // 璁板綍鍓嶄竴娆℃媶鍖匢D锛屽缓绔嬫媶鍖呴摼
-        //        };
-        //        await Db.Insertable(splitHistory).ExecuteCommandAsync();
-
-        //        _unitOfWorkManage.CommitTran();
-
-        //        try
-        //        {
-        //            MaterielToMesDTO dto = new MaterielToMesDTO
-        //            {
-        //                batchNo = baseStockDetail.BatchNo,
-        //                factoryArea = baseStockDetail.FactoryArea,
-        //                materialCode = baseStockDetail.MaterielCode,
-        //                newmaterialCode = newBarcode,
-        //                oldmaterialCode = request.OriginalBarcode,
-        //                operationType = 1,
-        //                qty = remainingQty,
-        //                supplyCode = baseStockDetail.SupplyCode,
-        //                unit = baseStockDetail.BarcodeUnit,
-        //                warehouseCode = baseStockDetail.WarehouseCode,
-        //                reqCode = Guid.NewGuid().ToString(),
-        //                reqTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
-        //            };
-        //            _invokeMESService.NewMaterielToMes(dto);
-        //        }
-        //        catch(Exception ex)
-        //        {
-        //            _logger.LogError("SplitPackage 鍥炰紶MES:  " + ex.Message);
-        //        }
-        //        return WebResponseContent.Instance.OK("鎷嗗寘鎴愬姛", new
-        //        {
-        //            NewBarcode = newBarcode,
-        //            NewLockInfoId = newLockInfo.Id
-        //        });
-        //    }
-        //    catch (Exception ex)
-        //    {
-        //        _unitOfWorkManage.RollbackTran();
-        //        return WebResponseContent.Instance.Error($"鎷嗗寘澶辫触: {ex.Message}");
-        //    }
-        //}
-        // 鑾峰彇鏉$爜鐨勬媶鍖呭巻鍙查摼
 
         public async Task<WebResponseContent> SplitPackage(SplitPackageDto request)
         {
@@ -297,7 +134,11 @@
                     CurrentBarcode = newBarcode,
                     OriginalLockQuantity = request.SplitQuantity,
                     IsSplitted = 1,
-                    ParentLockId = lockInfo.Id
+                    ParentLockId = lockInfo.Id,
+                     Operator = App.User.UserName,
+                    FactoryArea = lockInfo.FactoryArea,
+                    lineNo = lockInfo.lineNo,
+                    WarehouseCode = lockInfo.WarehouseCode,
                 };
                 await _outStockLockInfoService.Db.Insertable(newLockInfo).ExecuteCommandAsync();
 
@@ -330,6 +171,30 @@
                 await Db.Insertable(splitHistory).ExecuteCommandAsync();
 
                 _unitOfWorkManage.CommitTran();
+
+                try
+                {
+                   
+                    var dt_MaterielToMes = new Dt_MaterielToMes
+                    {
+                        OldMaterialBarCode = request.OriginalBarcode,
+                        NewMaterialBarCode = newBarcode,
+                        Unit = baseStockDetail.BarcodeUnit,
+                        factoryArea = baseStockDetail.FactoryArea,
+                        Qty = remainingQty,
+                        supplyCode = baseStockDetail.SupplyCode,
+                        warehouseCode = baseStockDetail.WarehouseCode,
+                        BatchNo = baseStockDetail.BatchNo,
+                        MaterielCode = baseStockDetail.MaterielCode,
+
+                    };
+                    _materielToMesService.AddData(dt_MaterielToMes);    
+              
+                }
+                catch (Exception ex)
+                {
+                    _logger.LogError("SplitPackage 鍥炰紶MES:  " + ex.Message);
+                }
 
                 return WebResponseContent.Instance.OK("鎷嗗寘鎴愬姛", new SplitPackageChainDto
                 {
@@ -418,7 +283,7 @@
                 {
                     record.IsReverted = true;
                     record.RevertTime = DateTime.Now;
-         
+
                     record.Status = (int)SplitPackageStatusEnum.宸叉挙閿�;
                 }
                 await Db.Updateable(splitRecords).ExecuteCommandAsync();
@@ -526,14 +391,14 @@
         // 鑾峰彇鍙挙閿�鐨勬媶鍖呰褰曞垪琛�
         public Dt_SplitPackageRecord GetRevertableSplitRecords(string originalBarcode)
         {
-            var revertableRecords =   Db.Queryable<Dt_SplitPackageRecord>()
+            var revertableRecords = Db.Queryable<Dt_SplitPackageRecord>()
                     .Where(x => x.OriginalBarcode == originalBarcode && !x.IsReverted)
                     .OrderBy(x => x.SplitTime)
                    .First();
 
-            return   revertableRecords ;
+            return revertableRecords;
         }
- 
+
         // 鑾峰彇鎷嗗寘淇℃伅
         public async Task<WebResponseContent> GetSplitPackageInfo(string orderNo, string palletCode, string barcode)
         {
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_StockService/StockInfoService.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_StockService/StockInfoService.cs"
index f5ce2dd..5ff38f2 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_StockService/StockInfoService.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_StockService/StockInfoService.cs"
@@ -225,6 +225,12 @@
             return Db.Queryable<Dt_StockInfo>().Where(x => x.StockStatus == StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt() && SqlFunc.Subqueryable<Dt_LocationInfo>().Where(v => v.LocationCode == x.LocationCode && v.LocationType == locationType && v.LocationStatus == LocationStatusEnum.Pallet.ObjToInt() && (v.EnableStatus == EnableStatusEnum.OnlyOut.ObjToInt() || EnableStatusEnum.Normal.ObjToInt() == v.EnableStatus)).Any()).OrderBy(x => x.ModifyDate).First();
         }
 
+        public List<Dt_StockInfo> GetStockInfosByPalletCodes(List<string> palletCodes)
+        {
+            return Db.Queryable<Dt_StockInfo>().Where(x => palletCodes.Contains(x.PalletCode)).Includes(x => x.Details).ToList();
+        }
+
+ 
         /// <summary>
         /// 
         /// </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_TaskInfoService/TaskService.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_TaskInfoService/TaskService.cs"
index c2f09f0..8682865 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_TaskInfoService/TaskService.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_TaskInfoService/TaskService.cs"
@@ -38,9 +38,11 @@
 using WIDESEA_Core.BaseServices;
 using WIDESEA_Core.Enums;
 using WIDESEA_Core.Helper;
+using WIDESEA_DTO.Allocate;
 using WIDESEA_DTO.Basic;
 using WIDESEA_DTO.Inbound;
 using WIDESEA_DTO.Task;
+using WIDESEA_IAllocateService;
 using WIDESEA_IBasicService;
 using WIDESEA_IInboundService;
 using WIDESEA_IOutboundService;
@@ -69,7 +71,7 @@
         private readonly IESSApiService _eSSApiService;
         private readonly IStockService _stockService;
         private readonly IRecordService _recordService;
-
+        private readonly IAllocateService _allocateService;
         private readonly IInvokeMESService _invokeMESService;
         public IRepository<Dt_Task> Repository => BaseDal;
 
@@ -90,7 +92,7 @@
 
         public List<int> TaskOutboundTypes => typeof(TaskTypeEnum).GetEnumIndexList();
 
-        public TaskService(IRepository<Dt_Task> BaseDal, IMapper mapper, IUnitOfWorkManage unitOfWorkManage, IRepository<Dt_StockInfo> stockRepository, ILocationInfoService locationInfoService, IInboundOrderService inboundOrderService, ILocationStatusChangeRecordService locationStatusChangeRecordService, IESSApiService eSSApiService, ILogger<TaskService> logger, IStockService stockService, IRecordService recordService, IInboundOrderDetailService inboundOrderDetailService, IOutboundOrderService outboundOrderService, IOutboundOrderDetailService outboundOrderDetailService, IInvokeMESService invokeMESService, IOutStockLockInfoService outStockLockInfoService) : base(BaseDal)
+        public TaskService(IRepository<Dt_Task> BaseDal, IMapper mapper, IUnitOfWorkManage unitOfWorkManage, IRepository<Dt_StockInfo> stockRepository, ILocationInfoService locationInfoService, IInboundOrderService inboundOrderService, ILocationStatusChangeRecordService locationStatusChangeRecordService, IESSApiService eSSApiService, ILogger<TaskService> logger, IStockService stockService, IRecordService recordService, IInboundOrderDetailService inboundOrderDetailService, IOutboundOrderService outboundOrderService, IOutboundOrderDetailService outboundOrderDetailService, IInvokeMESService invokeMESService, IOutStockLockInfoService outStockLockInfoService, IAllocateService allocateService) : base(BaseDal)
         {
             _mapper = mapper;
             _unitOfWorkManage = unitOfWorkManage;
@@ -107,6 +109,7 @@
             _outboundOrderDetailService = outboundOrderDetailService;
             _invokeMESService = invokeMESService;
             _outStockLockInfoService = outStockLockInfoService;
+            _allocateService = allocateService;
         }
 
 
@@ -250,7 +253,53 @@
                 {
                     if (inboundOrder.OrderType == InOrderTypeEnum.Allocat.ObjToInt())//璋冩嫧鍏ュ簱
                     {
+                        if (inboundOrder != null && inboundOrder.OrderStatus == InOrderStatusEnum.鍏ュ簱瀹屾垚.ObjToInt())
+                        {
+                            var allocate = _allocateService.Repository.QueryData(x => x.OrderNo == inboundOrder.InboundOrderNo).First();
+                            var feedmodel = new AllocateDto
+                            {
+                                ReqCode = Guid.NewGuid().ToString(),
+                                ReqTime = DateTime.Now.ToString(),
+                                BusinessType = "2",
+                                FactoryArea = inboundOrder.FactoryArea,
+                                OperationType = 1,
+                                Operator = inboundOrder.Operator,
+                                OrderNo = inboundOrder.UpperOrderNo,
+                                fromWarehouse = allocate?.FromWarehouse??"",
+                                toWarehouse = allocate?.ToWarehouse??"",
+                                Details = new List<AllocateDtoDetail>()
 
+                            };
+
+                            var groupedData = inboundOrder.Details.GroupBy(item => new { item.MaterielCode, item.SupplyCode, item.BatchNo, item.lineNo, item.BarcodeUnit, item.WarehouseCode })
+                               .Select(group => new AllocateDtoDetail
+                               {
+                                   MaterialCode = group.Key.MaterielCode,
+                                   LineNo = group.Key.lineNo,
+                                   WarehouseCode = group.Key.WarehouseCode,
+                                   Qty = group.Sum(x => x.BarcodeQty),
+                                   // warehouseCode= "1072",
+                                   Unit = group.Key.BarcodeUnit,
+                                   Barcodes = group.Select(row => new BarcodeInfo
+                                   {
+                                       Barcode = row.Barcode,
+                                       Qty = row.BarcodeQty,
+                                       BatchNo = row.BatchNo,
+                                       SupplyCode = row.SupplyCode,
+                                       Unit = row.Unit
+                                   }).ToList()
+                               }).ToList();
+                            feedmodel.Details = groupedData;
+
+                            var result = await _invokeMESService.FeedbackAllocate(feedmodel);
+                            if (result != null && result.code == 200)
+                            {
+                                _inboundOrderService.Db.Updateable<Dt_InboundOrder>().SetColumns(it => new Dt_InboundOrder { ReturnToMESStatus = 1 })
+                                .Where(it => it.Id == inboundOrder.Id).ExecuteCommand();
+                                _inboundOrderDetailService.Db.Updateable<Dt_InboundOrderDetail>().SetColumns(it => new Dt_InboundOrderDetail { ReturnToMESStatus = 1 })
+                                .Where(it => it.OrderId == inboundOrder.Id).ExecuteCommand();
+                            }
+                        }
                     }
                     else if (inboundOrder.OrderType == InOrderTypeEnum.ReCheck.ObjToInt()) //閲嶆鍏ュ簱
                     {
@@ -405,7 +454,7 @@
             }
         }
 
-        public WebResponseContent InPickTaskCompleted(Dt_Task task)
+        public async Task<WebResponseContent> InPickTaskCompleted(Dt_Task task)
         {
             _logger.LogInformation($"TaskService  InPickTaskCompleted: {task.TaskNum}");
             //鏌ュ簱瀛�
@@ -418,7 +467,12 @@
             {
                 return WebResponseContent.Instance.Error($"鏈壘鍒拌鎵樼洏搴撳瓨鏄庣粏淇℃伅");
             }
-
+            //鏌ヨ揣浣�
+            Dt_LocationInfo locationInfo = _locationInfoService.Repository.QueryFirst(x => x.LocationCode == task.TargetAddress);
+            if (locationInfo == null)
+            {
+                return WebResponseContent.Instance.Error($"鏈壘鍒板搴旂殑缁堢偣璐т綅淇℃伅");
+            }
             // 鑾峰彇鎵�鏈夊洖搴撲腑鐨勫嚭搴撻攣瀹氳褰�
             var returnLocks = _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
                 .Where(it => it.OrderNo == task.OrderNo && it.PalletCode == task.PalletCode && it.Status == (int)OutLockStockStatusEnum.鍥炲簱涓�)
@@ -430,12 +484,8 @@
             }
             _outStockLockInfoService.Db.Updateable(returnLocks).ExecuteCommand();
 
-            //鏌ヨ揣浣�
-            Dt_LocationInfo locationInfo = _locationInfoService.Repository.QueryFirst(x => x.LocationCode == task.TargetAddress);
-            if (locationInfo == null)
-            {
-                return WebResponseContent.Instance.Error($"鏈壘鍒板搴旂殑缁堢偣璐т綅淇℃伅");
-            }
+            await DeleteZeroQuantityStockDetails(stockInfo.Id);
+
             stockInfo.LocationCode = task.TargetAddress;
             stockInfo.StockStatus = StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt();
             stockInfo.Details.ForEach(x =>
@@ -444,6 +494,9 @@
             });
             _stockService.StockInfoService.Repository.UpdateData(stockInfo);
             _stockService.StockInfoDetailService.Repository.UpdateData(stockInfo.Details);
+            await ProcessStockDetailsForReturn(task, stockInfo.Id);
+
+    
 
             if (stockInfo.PalletType == PalletTypeEnum.Empty.ObjToInt())
             {
@@ -462,6 +515,60 @@
             return WebResponseContent.Instance.OK();
         }
 
+        /// <summary>
+        /// 鍒犻櫎搴撳瓨鏁颁负0鐨勫簱瀛樻槑缁嗚褰�
+        /// </summary>
+        private async Task DeleteZeroQuantityStockDetails(int stockId)
+        {
+            try
+            {
+                // 鍒犻櫎搴撳瓨鏁伴噺涓�0鐨勮褰�
+                var deleteCount = await _stockService.StockInfoDetailService.Db.Deleteable<Dt_StockInfoDetail>()
+                    .Where(x => x.StockId == stockId &&
+                               x.StockQuantity == 0 &&
+                               (x.Status==StockStatusEmun.鍑哄簱瀹屾垚.ObjToInt()|| x.Status==
+                                          StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt())) // 鍙垹闄ゅ凡瀹屾垚鐘舵�佺殑闆跺簱瀛�
+                    .ExecuteCommandAsync();
+
+                if (deleteCount > 0)
+                {
+                    _logger.LogInformation($"鍒犻櫎{deleteCount}鏉¢浂搴撳瓨鏄庣粏璁板綍 - StockId: {stockId}");
+                }
+            }
+            catch (Exception ex)
+            {
+                _logger.LogWarning($"鍒犻櫎闆跺簱瀛樿褰曞け璐� - StockId: {stockId}, Error: {ex.Message}");
+                // 娉ㄦ剰锛氬垹闄ゅけ璐ヤ笉搴旇褰卞搷涓绘祦绋嬶紝璁板綍鏃ュ織鍚庣户缁�
+            }
+        }
+        /// <summary>
+        /// 澶勭悊鍥炲簱鐩稿叧鐨勬墍鏈夊簱瀛樻槑缁嗙姸鎬佸彉鏇�
+        /// </summary>
+        private async Task ProcessStockDetailsForReturn(Dt_Task returnTask, int stockId)
+        {
+            // 鑾峰彇璇ユ墭鐩樹笅鎵�鏈夐渶瑕佸洖搴撶殑搴撳瓨鏄庣粏
+            var stockDetails = await _stockService.StockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
+                .Where(x => x.StockId == stockId &&
+                           x.StockQuantity > 0 &&
+                          ( x.Status == StockStatusEmun.鍑哄簱閿佸畾.ObjToInt()|| x.Status==
+                                      StockStatusEmun.鍏ュ簱纭.ObjToInt()))  // 鍖呮嫭鍑哄簱閿佸畾鍜屽叆搴撶‘璁ょ殑
+                .ToListAsync();
+
+            foreach (var detail in stockDetails)
+            {
+          
+                detail.Status = StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt();              
+                detail.OutboundQuantity = 0;  // 娓呯┖鍑哄簱鏁伴噺       
+
+                _logger.LogInformation($"鏇存柊搴撳瓨鏄庣粏鐘舵�� - 鏉$爜: {detail.Barcode}, 鏁伴噺: {detail.StockQuantity}");
+            }
+
+            if (stockDetails.Any())
+            {
+                await _stockService.StockInfoDetailService.Db.Updateable(stockDetails).ExecuteCommandAsync();
+                _logger.LogInformation($"鍏辨洿鏂皗stockDetails.Count}涓簱瀛樻槑缁嗙姸鎬佷负鍏ュ簱瀹屾垚");
+            }
+        }
         public async Task<WebResponseContent> OutEmptyTaskCompleted(Dt_Task task)
         {
             WebResponseContent content = new WebResponseContent();
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_TaskInfoService/TaskService_Outbound.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_TaskInfoService/TaskService_Outbound.cs"
index 58c97a7..c2f08d2 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_TaskInfoService/TaskService_Outbound.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_TaskInfoService/TaskService_Outbound.cs"
@@ -206,7 +206,7 @@
                 if (stockInfos != null && stockInfos.Count > 0 && outboundOrderDetails != null && outboundOrderDetails.Count > 0 && outStockLockInfos != null && outStockLockInfos.Count > 0 && locationInfos != null && locationInfos.Count > 0)
                 {
                     stockInfos.ForEach(x =>
-                    {
+                    {                        
                         x.StockStatus = StockStatusEmun.鍑哄簱閿佸畾.ObjToInt();
                     });
                     outboundOrderDetails.ForEach(x =>
@@ -218,6 +218,8 @@
                     {
                         _outboundOrderService.Repository.UpdateData(outboundOrder);
                     }
+                    outboundOrder.Operator = App.User.UserName;
+                    _outboundOrderService.Repository.UpdateData(outboundOrder);
                     WebResponseContent content = _outboundOrderDetailService.LockOutboundStockDataUpdate(stockInfos, outboundOrderDetails, outStockLockInfos, locationInfos, tasks: tasks);
 
                     if (!content.Status)
@@ -335,6 +337,51 @@
             return tasks;
         }
 
+        public List<Dt_Task> GetTasks(List<Dt_StockInfo> stockInfos, TaskTypeEnum taskType)
+        {
+            List<Dt_Task> tasks = new List<Dt_Task>();
+            List<Dt_LocationInfo> locationInfos = _locationInfoService.Repository.QueryData(x => stockInfos.Select(x => x.LocationCode).Contains(x.LocationCode));
+            for (int i = 0; i < stockInfos.Count; i++)
+            {
+                Dt_StockInfo stockInfo = stockInfos[i];
+
+                if (stockInfo != null)
+                {
+                    Dt_LocationInfo? locationInfo = locationInfos.FirstOrDefault(x => x.LocationCode == stockInfo.LocationCode);
+                    if (!tasks.Exists(x => x.PalletCode == stockInfo.PalletCode))
+                    {
+                        Dt_Task task = new()
+                        {
+                            CurrentAddress = stockInfo.LocationCode,
+                            Grade = 0,
+                            PalletCode = stockInfo.PalletCode,
+                            NextAddress = "",
+                            Roadway = locationInfo.RoadwayNo,
+                            SourceAddress = stockInfo.LocationCode,
+                            TargetAddress = "",
+                            TaskStatus = TaskStatusEnum.New.ObjToInt(),
+                            TaskType = taskType.ObjToInt(),
+                            //TaskNum = BaseDal.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)),
+                            PalletType = stockInfo.PalletType,
+                            WarehouseId = stockInfo.WarehouseId,
+
+                        };
+                        //if (taskType != TaskTypeEnum.OutEmpty)
+                        //{
+                        //    task.MaterielCode = stockInfo.Details?.Where(x => x.StockId == stockInfo.Id).FirstOrDefault()?.MaterielCode;
+                        //    task.Quantity = (float)stockInfo.Details?.Where(x => x.StockId == stockInfo.Id).Sum(x => x.StockQuantity);
+                        //    task.BatchNo = stockInfo.Details?.Where(x => x.StockId == stockInfo.Id).FirstOrDefault()?.BatchNo;
+                        //}
+                        //if (stockInfo.StockLength > 0)
+                        //{
+                        //    task.TaskLength = stockInfo.StockLength;
+                        //}
+                        tasks.Add(task);
+                    }
+                }
+            }
+            return tasks;
+        }
 
         /// <summary>
         /// 鐢熸垚鍑哄簱浠诲姟
@@ -385,5 +432,159 @@
         }
 
 
+        /// <summary>
+        /// 鐢熸垚鍑哄簱浠诲姟
+        /// </summary>
+        /// <param name="orderDetailId"></param>
+        /// <param name="stockSelectViews"></param>
+        /// <returns></returns>
+        public WebResponseContent GenerateOutboundTask(int orderDetailId, List<StockSelectViewDTO> stockSelectViews)
+        {
+            try
+            {
+                (List<Dt_Task>, List<Dt_StockInfo>?, List<Dt_OutboundOrderDetail>?, List<Dt_OutStockLockInfo>?, List<Dt_LocationInfo>?) result = OutboundTaskDataHandle(orderDetailId, stockSelectViews);
+
+                WebResponseContent content = GenerateOutboundTaskDataUpdate(result.Item1, result.Item2, result.Item3, result.Item4, result.Item5);
+
+                return content;
+            }
+            catch (Exception ex)
+            {
+                return WebResponseContent.Instance.Error(ex.Message);
+            }
+        }
+
+        /// <summary>
+        /// 鍑哄簱浠诲姟鏁版嵁澶勭悊
+        /// </summary>
+        /// <param name="orderDetailId"></param>
+        /// <param name="stockSelectViews"></param>
+        /// <returns></returns>
+        /// <exception cref="Exception"></exception>
+        public (List<Dt_Task>, List<Dt_StockInfo>?, List<Dt_OutboundOrderDetail>?, List<Dt_OutStockLockInfo>?, List<Dt_LocationInfo>?) OutboundTaskDataHandle(int orderDetailId, List<StockSelectViewDTO> stockSelectViews)
+        {
+            List<Dt_Task> tasks = new List<Dt_Task>();
+            Dt_OutboundOrderDetail outboundOrderDetail = _outboundOrderDetailService.Repository.QueryFirst(x => x.Id == orderDetailId);
+
+            if (outboundOrderDetail == null)
+            {
+                throw new Exception("鏈壘鍒板嚭搴撳崟鏄庣粏淇℃伅");
+            }
+
+            if (stockSelectViews.Sum(x => x.UseableQuantity) > outboundOrderDetail.OrderQuantity - outboundOrderDetail.LockQuantity)
+            {
+                throw new Exception("閫夋嫨鏁伴噺瓒呭嚭鍗曟嵁鏁伴噺");
+            }
+            List<Dt_StockInfo>? stockInfos = null;
+            Dt_OutboundOrderDetail? orderDetail = null;
+            List<Dt_OutStockLockInfo>? outStockLockInfos = null;
+            List<Dt_LocationInfo>? locationInfos = null;
+            if (outboundOrderDetail.OrderDetailStatus == OrderDetailStatusEnum.New.ObjToInt())
+            {
+                (List<Dt_StockInfo>, Dt_OutboundOrderDetail, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>) result = _outboundOrderDetailService.AssignStockOutbound(outboundOrderDetail, stockSelectViews);
+                if (result.Item1 != null && result.Item1.Count > 0)
+                {
+                    Dt_OutboundOrder outboundOrder = _outboundOrderService .Repository.QueryFirst(x => x.Id == outboundOrderDetail.OrderId);
+                    TaskTypeEnum typeEnum = outboundOrder.OrderType switch
+                    {
+                        (int)OutOrderTypeEnum.Issue => TaskTypeEnum.Outbound,
+                        (int)OutOrderTypeEnum.Allocate => TaskTypeEnum.OutAllocate,
+                        (int)OutOrderTypeEnum.Quality => TaskTypeEnum.OutQuality,
+                        _ => new TaskTypeEnum()
+                    };
+                    tasks = GetTasks(result.Item1, typeEnum);
+                    result.Item2.OrderDetailStatus = OrderDetailStatusEnum.Outbound.ObjToInt();
+                    result.Item3.ForEach(x =>
+                    {
+                        x.Status = OutLockStockStatusEnum.鍑哄簱涓�.ObjToInt();
+                    });
+
+                    stockInfos = result.Item1;
+                    orderDetail = result.Item2;
+                    outStockLockInfos = result.Item3;
+                    locationInfos = result.Item4;
+                }
+                else
+                {
+                    throw new Exception("鏃犲簱瀛�");
+                }
+            }
+            else
+            {
+                List<Dt_OutStockLockInfo> stockLockInfos = _outStockLockInfoService.GetByOrderDetailId(outboundOrderDetail.OrderId, OutLockStockStatusEnum.宸插垎閰�);
+                if (stockLockInfos != null && stockLockInfos.Count > 0)
+                {
+                    List<Dt_StockInfo> stocks = _stockService.StockInfoService.GetStockInfosByPalletCodes(stockLockInfos.Select(x => x.PalletCode).Distinct().ToList());
+                    tasks = GetTasks(stocks, TaskTypeEnum.Outbound);
+                }
+            }
+
+            return (tasks, stockInfos, orderDetail == null ? null : new List<Dt_OutboundOrderDetail> { orderDetail }, outStockLockInfos, locationInfos);
+        }
+
+        /// <summary>
+        /// 鐢熸垚鍑哄簱浠诲姟鍚庢暟鎹洿鏂板埌鏁版嵁搴�
+        /// </summary>
+        /// <param name="tasks"></param>
+        /// <param name="stockInfos"></param>
+        /// <param name="outboundOrderDetails"></param>
+        /// <param name="outStockLockInfos"></param>
+        /// <param name="locationInfos"></param>
+        /// <returns></returns>
+        public WebResponseContent GenerateOutboundTaskDataUpdate(List<Dt_Task> tasks, List<Dt_StockInfo>? stockInfos = null, List<Dt_OutboundOrderDetail>? outboundOrderDetails = null, List<Dt_OutStockLockInfo>? outStockLockInfos = null, List<Dt_LocationInfo>? locationInfos = null)
+        {
+            try
+            {
+                _unitOfWorkManage.BeginTran();
+
+                BaseDal.AddData(tasks);
+                if (stockInfos != null && stockInfos.Count > 0 && outboundOrderDetails != null && outboundOrderDetails.Count > 0 && outStockLockInfos != null && outStockLockInfos.Count > 0 && locationInfos != null && locationInfos.Count > 0)
+                {
+                    stockInfos.ForEach(x =>
+                    {
+                        x.StockStatus = StockStatusEmun.鍑哄簱閿佸畾.ObjToInt();
+                    });
+                    outboundOrderDetails.ForEach(x =>
+                    {
+                        x.OrderDetailStatus = OrderDetailStatusEnum.Outbound.ObjToInt();
+                    });
+                    Dt_OutboundOrder outboundOrder = _outboundOrderService.Repository.QueryFirst(x => x.Id == outboundOrderDetails.FirstOrDefault().OrderId);
+                    if (outboundOrder.OrderStatus != OutOrderStatusEnum.鍑哄簱涓�.ObjToInt())
+                    {
+                        _outboundOrderService.Repository.UpdateData(outboundOrder);
+                    }
+                    WebResponseContent content = _outboundOrderDetailService.LockOutboundStockDataUpdate(stockInfos, outboundOrderDetails, outStockLockInfos, locationInfos, tasks: tasks);
+
+                    if (!content.Status)
+                    {
+                        _unitOfWorkManage.RollbackTran();
+                        return content;
+                    }
+                }
+                else if (outboundOrderDetails != null && outboundOrderDetails.Count > 0)
+                {
+                    outboundOrderDetails.ForEach(x =>
+                    {
+                        x.OrderDetailStatus = OrderDetailStatusEnum.Outbound.ObjToInt();
+                    });
+                    Dt_OutboundOrder outboundOrder = _outboundOrderService.Repository.QueryFirst(x => x.Id == outboundOrderDetails.FirstOrDefault().OrderId);
+                    if (outboundOrder.OrderStatus != OutOrderStatusEnum.鍑哄簱涓�.ObjToInt())
+                    {
+                        _outboundOrderService.Repository.UpdateData(outboundOrder);
+                    }
+                    _outboundOrderDetailService.Repository.UpdateData(outboundOrderDetails);
+                }
+                _unitOfWorkManage.CommitTran();
+                //PushTasksToWCS(tasks);
+                return WebResponseContent.Instance.OK();
+            }
+            catch (Exception ex)
+            {
+                _unitOfWorkManage.RollbackTran();
+                return WebResponseContent.Instance.Error(ex.Message);
+            }
+
+        }
+
     }
 }
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_TaskInfoService/WIDESEA_TaskInfoService.csproj" "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_TaskInfoService/WIDESEA_TaskInfoService.csproj"
index 5272e9b..51b297d 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_TaskInfoService/WIDESEA_TaskInfoService.csproj"
+++ "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_TaskInfoService/WIDESEA_TaskInfoService.csproj"
@@ -7,6 +7,7 @@
   </PropertyGroup>
 
   <ItemGroup>
+    <ProjectReference Include="..\WIDESEA_IAllocateService\WIDESEA_IAllocateService.csproj" />
     <ProjectReference Include="..\WIDESEA_IBasicService\WIDESEA_IBasicService.csproj" />
     <ProjectReference Include="..\WIDESEA_IInboundService\WIDESEA_IInboundService.csproj" />
     <ProjectReference Include="..\WIDESEA_IOutboundService\WIDESEA_IOutboundService.csproj" />
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/Allocate/AllocateOrderController.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/Allocate/AllocateOrderController.cs"
index 3a4607a..31f6001 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/Allocate/AllocateOrderController.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/Allocate/AllocateOrderController.cs"
@@ -3,6 +3,7 @@
 using System.Data.Common;
 using System.Diagnostics.Eventing.Reader;
 using System.Threading.Tasks;
+using WIDESEA_Common.AllocateEnum;
 using WIDESEA_Core;
 using WIDESEA_Core.Attributes;
 using WIDESEA_Core.BaseController;
@@ -36,15 +37,23 @@
             {
                 OrderNo = model.OrderNo,
                 UpperOrderNo = model.OrderNo,
-                BusinessType=model.BusinessType,
-                FactoryArea=model.FactoryArea,
-                IsBatch=model.IsBatch,
+                BusinessType = model.BusinessType,
+                FactoryArea = model.FactoryArea,
+                IsBatch = model.IsBatch,
                 CreateType = model.OperationType,
-                Details = new List<Dt_AllocateOrderDetail>() 
+                FromWarehouse=model.fromWarehouse,
+                ToWarehouse=model.toWarehouse,                
+                Details = new List<Dt_AllocateOrderDetail>()
             };
+            Enum.TryParse<BusinessTypeEnum>(allocateOrder.BusinessType, out var businessType);
+
 
             foreach (var detailDto in model.Details)
             {
+                if (businessType == BusinessTypeEnum.鏅轰粨璋冨閮ㄤ粨搴� && (detailDto.Barcodes == null || !detailDto.Barcodes.Any()))
+                {
+                    return WebResponseContent.Instance.Error($"鏉$爜涓嶈兘涓虹┖");
+                }
                 if (detailDto.Barcodes != null && detailDto.Barcodes.Any())
                 {
                     foreach (var barcodeDto in detailDto.Barcodes)
@@ -55,7 +64,7 @@
                             MaterielCode = detailDto.MaterialCode,
                             LineNo = detailDto.LineNo,
                             OrderQuantity = detailDto.Qty,
-                            SupplyCode= barcodeDto.SupplyCode,
+                            SupplyCode = barcodeDto.SupplyCode,
                             Unit = detailDto.Unit,
                             Barcode = barcodeDto.Barcode,
                             BatchNo = barcodeDto.BatchNo,
@@ -79,7 +88,7 @@
                 }
                 allocateOrder.Details.AddRange(allocateOrder.Details);
             }
-            var content =await Service.ReceiveAllocateOrder(allocateOrder, model.OperationType);
+            var content = await Service.ReceiveAllocateOrder(allocateOrder, model.OperationType);
 
             if (content.Status) return WebResponseContent.Instance.OK(200);
             else return WebResponseContent.Instance.Error(content.Message);
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/Inbound/InboundOrderController.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/Inbound/InboundOrderController.cs"
index e98db31..3ba7403 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/Inbound/InboundOrderController.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/Inbound/InboundOrderController.cs"
@@ -181,6 +181,12 @@
             return content;
 
         }
+
+        [HttpPost, Route("UndoPalletGroup"), AllowAnonymous, MethodParamsValidate]
+        public WebResponseContent UndoPalletGroup(string palletCode)
+        {
+            return Service.UndoPalletGroup(palletCode);
+        }
         /// <summary>
         /// 
         /// </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_WMSServer/Controllers/Outbound/OutboundPickingController.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Outbound/OutboundPickingController.cs"
index 0acdabf..dd51866 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Outbound/OutboundPickingController.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Outbound/OutboundPickingController.cs"
@@ -21,14 +21,7 @@
             _splitPackageService = splitPackageService;
             _outStockLockInfoService = outStockLockInfoService;
         }
-        /// <summary>
-        /// 鑾峰彇鎵樼洏鐨勫嚭搴撶姸鎬�
-        /// </summary>
-        [HttpPost("GetPalletOutboundStatus")]
-        public async Task<WebResponseContent> GetPalletOutboundStatus(string palletCode)
-        {
-            return await Service.GetPalletOutboundStatus(palletCode);
-        }
+ 
 
         /// <summary>
         /// 鑾峰彇鎵樼洏鐨勯攣瀹氫俊鎭�
@@ -98,50 +91,13 @@
             return await Service.ReturnRemaining(dto.OrderNo, dto.PalletCode, "");
         }
 
-        [HttpPost("direct-outbound")]
-        public async Task<WebResponseContent> DirectOutbound([FromBody] DirectOutboundRequest dto)
-        {
-           return await Service.DirectOutbound(dto);
- 
-        }
-
-        ///// <summary>
-        ///// 鎷i�夌‘璁�
-        ///// </summary>
-        //[HttpPost("ConfirmPicking")]
-        //public async Task<WebResponseContent> ConfirmPicking([FromBody] PickingConfirmRequest request)
+        //[HttpPost("direct-outbound")]
+        //public async Task<WebResponseContent> DirectOutbound([FromBody] DirectOutboundRequest dto)
         //{
-        //    return await Service.ConfirmPicking(request);
-        //}
-        /// <summary>
-        /// 楠岃瘉鏉$爜骞惰幏鍙栫墿鏂欎俊鎭�
-        /// </summary>
-        [HttpGet("ValidateBarcode")]
-        public async Task<WebResponseContent> ValidateBarcode(string barcode)
-        {
-            return await Service.ValidateBarcode(barcode);
-        }
+        //   return await Service.DirectOutbound(dto);
  
-
-        ///// <summary>
-        ///// 鐩存帴鍑哄簱
-        ///// </summary>
-        //[HttpPost("DirectOutbound")]
-        //public async Task<WebResponseContent> DirectOutbound([FromBody] DirectOutboundRequest request)
-        //{
-        //    return await Service.DirectOutbound(request);
-        //}
-
-        /// <summary>
-        /// 鑾峰彇鎷i�夊巻鍙�
-        /// </summary>
-        [HttpGet("GetPickingHistory")]
-        public async Task<WebResponseContent> GetPickingHistory(int orderId)
-        {
-            var history = await Service.GetPickingHistory(orderId);
-            return WebResponseContent.Instance.OK(null, history);
-        }
-
+        //} 
+ 
         /// <summary>
         /// 鎾ら攢鎷i��
         /// </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_WMSServer/Controllers/TaskInfo/TaskController.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/TaskInfo/TaskController.cs"
index 4612fbc..adfa518 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/TaskInfo/TaskController.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/TaskInfo/TaskController.cs"
@@ -47,5 +47,17 @@
             return await Service.GenerateOutboundTasksAsync(data.taskIds,data.outboundPlatform);
         }
 
+        /// <summary>
+        /// 鐢熸垚鍑哄簱浠诲姟
+        /// </summary>
+        /// <param name="orderDetailId"></param>
+        /// <param name="stockSelectViews"></param>
+        /// <returns></returns>
+        [HttpPost, HttpGet, Route("GenerateOutboundTask"), AllowAnonymous]
+        public WebResponseContent GenerateOutboundTask(int orderDetailId, [FromBody] List<StockSelectViewDTO> stockSelectViews)
+        {
+            return Service.GenerateOutboundTask(orderDetailId, stockSelectViews);
+        }
+
     }
 }

--
Gitblit v1.9.3