From 7086c88c6c080aa9ff15664c5c97aee7bbcdc55b Mon Sep 17 00:00:00 2001
From: wankeda <Administrator@DESKTOP-HAU3ST3>
Date: 星期三, 05 三月 2025 16:56:11 +0800
Subject: [PATCH] 阻焊仓堆垛机对接

---
 代码管理/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/MesPPOutboundOrderService.cs                              |  175 ++--
 代码管理/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/MesTaskService.cs                                         |  489 ++++++++++--
 代码管理/WMS/WIDESEA_WMSClient/src/extension/outbound/extend/PPStockSelect.vue                                   |  332 ++++++++
 代码管理/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoService.cs                                          |   88 ++
 代码管理/WMS/WIDESEA_WMSServer/WIDESEA_IBasicRepository/ILocationInfoRepository.cs                               |    2 
 代码管理/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/d7d7cdfe-7831-4766-872e-1bbd2ae71185.vsidx |    0 
 代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/PP仓/TSJConveyorLineJob_PP.cs                                     |    7 
 代码管理/WMS/WIDESEA_WMSClient/src/extension/outbound/mesPPOutboundOrderDetail.js                                |  119 +-
 代码管理/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundService.cs                                        |    8 
 代码管理/WMS/WIDESEA_WMSClient/src/views/outbound/mesPPCutOutboundOrder.vue                                      |    2 
 代码管理/WMS/WIDESEA_WMSServer/WIDESEA_IStockService/IStockInfoService.cs                                        |    7 
 项目资料/设备协议/干膜仓堆垛机通信协议.xlsx                                                                                    |    0 
 代码管理/WMS/WIDESEA_WMSClient/src/extension/outbound/extend/mesPPCutOutOrderDetail.vue                          |   16 
 代码管理/WMS/WIDESEA_WMSClient/src/extension/outbound/extend/mesPPoutOrderDetail.vue                             |    4 
 代码管理/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/c003f52c-46e5-4779-9a5b-7d482547a022.vsidx |    0 
 代码管理/WMS/WIDESEA_WMSServer/WIDESEA_IOutboundService/IMesPPOutboundOrderService.cs                            |    5 
 代码管理/WMS/WIDESEA_WMSServer/WIDESEA_ITaskInfoService/ITaskService.cs                                          |   32 
 代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs                                         |    7 
 代码管理/WMS/WIDESEA_WMSServer/WIDESEA_IOutboundService/IOutStockLockInfoService.cs                              |    2 
 代码管理/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/MES/MesController.cs                                |   48 +
 代码管理/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/1ffecc40-5215-4fbe-92a8-4f08c948917b.vsidx |    0 
 代码管理/WMS/WIDESEA_WMSServer/WIDESEA_BasicService/Service/LocationInfoService_Common.cs                        |    2 
 代码管理/WMS/WIDESEA_WMSServer/WIDESEA_IOutboundService/IMesPPOutboundOrderDetailService.cs                      |   10 
 代码管理/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/OutStockLockInfoService.cs                                |   45 
 代码管理/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Outbound/Dt_MesPPOutboundOrderDetail.cs                      |    4 
 代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/阻焊仓/GroundStationJob_ZH.cs                                       |  153 ++++
 代码管理/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/6573eb92-5634-4b4e-a7f1-96f2790803c7.vsidx |    0 
 代码管理/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs                                            |   29 
 代码管理/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/7fca402a-0c47-4aac-bdef-736d4f6e2f32.vsidx |    0 
 代码管理/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/MesPPOutboundOrderDetailService.cs                        |  190 +---
 代码管理/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/TaskInfo/TaskController.cs                          |   20 
 代码管理/WMS/WIDESEA_WMSServer/WIDESEA_OutboundRepository/OutboundRepository.cs                                  |    5 
 代码管理/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Outbound/MesPPOutboundOrderDetailController.cs      |   11 
 /dev/null                                                                                                    |    0 
 代码管理/WMS/WIDESEA_WMSServer/WIDESEA_IOutboundService/IMesPPCutOutboundOrderDetailService.cs                   |   20 
 代码管理/WMS/WIDESEA_WMSServer/WIDESEA_IOutboundRepository/IOutboundRepository.cs                                |    2 
 代码管理/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/5761a620-5bca-4675-84e1-2980dbca5573.vsidx |    0 
 代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/阻焊仓/StackerCraneJob_ZH.cs                                        |  165 ++-
 代码管理/WMS/WIDESEA_WMSServer/WIDESEA_BasicRepository/LocationInfoRepository.cs                                 |   10 
 代码管理/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/7465d6d9-8464-4852-a7e6-98848228a1cf.vsidx |    0 
 代码管理/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/MesPPCutOutboundOrderDetailService.cs                     |  188 ++++
 代码管理/WMS/WIDESEA_WMSServer/WIDESEA_DTO/Stock/PPStockSelectViewDTO.cs                                         |   24 
 代码管理/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Stock/StockInfoController.cs                        |   23 
 43 files changed, 1,767 insertions(+), 477 deletions(-)

diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/472a85b1-322e-46ee-835a-853cb266cbd8.vsidx" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/472a85b1-322e-46ee-835a-853cb266cbd8.vsidx"
deleted file mode 100644
index 4e42809..0000000
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/472a85b1-322e-46ee-835a-853cb266cbd8.vsidx"
+++ /dev/null
Binary files differ
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/5761a620-5bca-4675-84e1-2980dbca5573.vsidx" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/5761a620-5bca-4675-84e1-2980dbca5573.vsidx"
new file mode 100644
index 0000000..dbc4fec
--- /dev/null
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/5761a620-5bca-4675-84e1-2980dbca5573.vsidx"
Binary files differ
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/7fca402a-0c47-4aac-bdef-736d4f6e2f32.vsidx" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/7fca402a-0c47-4aac-bdef-736d4f6e2f32.vsidx"
new file mode 100644
index 0000000..0fe529e
--- /dev/null
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/7fca402a-0c47-4aac-bdef-736d4f6e2f32.vsidx"
Binary files differ
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/c3952f00-6f03-46e1-a8c4-0c2746ff48ae.vsidx" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/c3952f00-6f03-46e1-a8c4-0c2746ff48ae.vsidx"
deleted file mode 100644
index 4ccb739..0000000
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/c3952f00-6f03-46e1-a8c4-0c2746ff48ae.vsidx"
+++ /dev/null
Binary files differ
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/read.lock" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/read.lock"
deleted file mode 100644
index e69de29..0000000
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/read.lock"
+++ /dev/null
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs"
index 2d365d0..0197b6c 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs"
@@ -211,6 +211,12 @@
                                 task.DeviceCode = stationManger.StackerCraneCode;
                                 task.TaskState = TaskStatusEnum.SC_Execute.ObjToInt();
                             }
+                            else if (item.TaskType == TaskTypeEnum.MesOutbound.ObjToInt() && item.RoadWay.Contains("ZH"))
+                            {
+                                task.NextAddress = stationManger.StackerCraneStationCode;
+                                task.DeviceCode = stationManger.StackerCraneCode;
+                                task.TaskState = TaskStatusEnum.SC_Execute.ObjToInt();
+                            }
                             else
                             {
                                 task.NextAddress = taskTypeGroup == TaskTypeGroup.InboundGroup ? task.TargetAddress : router.NextPosi;
@@ -251,7 +257,6 @@
                                 return WebResponseContent.Instance.Error($"鏈壘鍒拌矾鐢遍厤缃俊鎭�");
                             }
                             router = routers.FirstOrDefault();
-
                             task.NextAddress = router?.StartPosi ?? "";
                             task.DeviceCode = item.RoadWay;
                             task.TaskState = TaskStatusEnum.SC_Execute.ObjToInt();
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/PP\344\273\223/TSJConveyorLineJob_PP.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/PP\344\273\223/TSJConveyorLineJob_PP.cs"
index d52dd9a..377fb7e 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/PP\344\273\223/TSJConveyorLineJob_PP.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/PP\344\273\223/TSJConveyorLineJob_PP.cs"
@@ -96,14 +96,17 @@
 
                         //}
                         #endregion
+                        //2016鍑哄簱绔欏彴浠诲姟瀹屾垚
                         if (item.StationType == StationTypeEnum.StationType_OnlyOutbound.ObjToInt())
                         {
                             if (conveyorLineSignalRead.STB)
                             {
                                 device.SetValue(W_ConveyorLineDB.ACK, true, item.StationCode);
+
+                                Thread.Sleep(500);
+                                device.SetValue(W_ConveyorLineDB.ACK, false, item.StationCode);
+                                _taskService.TaskCompleted(conveyorLineInfoRead.TaskNum);
                             }
-                            Thread.Sleep(500);
-                            device.SetValue(W_ConveyorLineDB.ACK, false, item.StationCode);
                         }
                         else if (item.StationType == StationTypeEnum.StationType_InboundAndOutbound.ObjToInt())
                         {
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/\351\230\273\347\204\212\344\273\223/GroundStationJob_ZH.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/\351\230\273\347\204\212\344\273\223/GroundStationJob_ZH.cs"
new file mode 100644
index 0000000..ed04228
--- /dev/null
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/\351\230\273\347\204\212\344\273\223/GroundStationJob_ZH.cs"
@@ -0,0 +1,153 @@
+锘縰sing Quartz;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Reflection;
+using System.Text;
+using System.Threading.Tasks;
+using WIDESEAWCS_Common;
+using WIDESEAWCS_Common.TaskEnum;
+using WIDESEAWCS_Core.Helper;
+using WIDESEAWCS_IBasicInfoRepository;
+using WIDESEAWCS_ITaskInfoRepository;
+using WIDESEAWCS_ITaskInfoService;
+using WIDESEAWCS_Model.Models;
+using WIDESEAWCS_QuartzJob;
+using WIDESEAWCS_Tasks.HoisterJob;
+
+namespace WIDESEAWCS_Tasks
+{
+    /// <summary>
+    /// 闃荤剨浠撳湴闈㈢珯
+    /// </summary>
+    [DisallowConcurrentExecution]
+    public class GroundStationJob_ZH : JobBase, IJob
+    {
+        private readonly ITaskService _taskService;
+        private readonly ITaskExecuteDetailService _taskExecuteDetailService;
+        private readonly ITaskRepository _taskRepository;
+        private readonly IStationMangerRepository _stationMangerRepository;
+
+        public GroundStationJob_ZH(ITaskService taskService, ITaskExecuteDetailService taskExecuteDetailService, ITaskRepository taskRepository, IStationMangerRepository stationMangerRepository)
+        {
+            _taskService = taskService;
+            _taskExecuteDetailService = taskExecuteDetailService;
+            _taskRepository = taskRepository;
+            _stationMangerRepository = stationMangerRepository;
+        }
+
+        public Task Execute(IJobExecutionContext context)
+        {
+            OtherDevice device = (OtherDevice)context.JobDetail.JobDataMap.Get("JobParams");
+            try
+            {
+                if (device == null)
+                {
+                    WriteError(nameof(GroundStationJob_CSJ), "璋冨害閿欒,璁惧瀵硅薄浼犲�间负null");
+                    return Task.CompletedTask;
+                }
+                List<string> deviceStations = device.DeviceProDTOs.Select(x => x.DeviceChildCode).ToList();
+                List<Dt_StationManger> stationMangers = _stationMangerRepository.QueryData(x => x.StationDeviceCode == device.DeviceCode);
+                foreach (var item in stationMangers.Where(x => deviceStations.Contains(x.StationCode)))
+                {
+                    try
+                    {
+                        short isTraytype = device.GetValue<GroundStationDBName, short>(GroundStationDBName.R_TakePalletType, item.StationCode);
+                        bool isCanPut = device.GetValue<GroundStationDBName, bool>(GroundStationDBName.R_IsCanPut, item.StationCode);
+                        bool isCanTake = device.GetValue<GroundStationDBName, bool>(GroundStationDBName.R_IsCanTake, item.StationCode);
+                        short takePalletType = device.GetValue<GroundStationDBName, short>(GroundStationDBName.W_PutPalletType, item.StationCode);
+                        bool putRequest = device.GetValue<GroundStationDBName, bool>(GroundStationDBName.W_PutRequest, item.StationCode);
+                        bool putFinish = device.GetValue<GroundStationDBName, bool>(GroundStationDBName.W_PutFinish, item.StationCode);
+                        bool takeRequest = device.GetValue<GroundStationDBName, bool>(GroundStationDBName.W_TakeRequest, item.StationCode);
+                        bool takeFinish = device.GetValue<GroundStationDBName, bool>(GroundStationDBName.W_TakeFinish, item.StationCode);
+
+                        if (item.StationType == StationTypeEnum.StationType_OnlyOutbound.ObjToInt())
+                        {
+
+                            //device.SetValue(GroundStationDBName.W_TakeRequest, true, item.StationCode);
+                            //device.SetValue(GroundStationDBName.W_PutPalletType, 1, item.StationCode);//task.PalletType
+
+
+                            //device.SetValue(GroundStationDBName.W_TakeFinish, true, item.StationCode);
+                            ////鍒ゆ柇AGV浠诲姟瀹屾垚锛屽悗鍐欑粰鍦伴潰绔欏彇璐у畬鎴�
+                            //device.SetValue(GroundStationDBName.W_TakeRequest, false, item.StationCode);
+                            //device.SetValue(GroundStationDBName.W_TakeFinish, false, item.StationCode);
+                            Dt_Task task = _taskRepository.QueryFirst(x => x.DeviceCode == item.StackerCraneCode && x.TaskState == TaskStatusEnum.SC_Execute.ObjToInt() && string.IsNullOrEmpty(x.NextAddress));
+                            if (task != null && isCanPut && !isCanTake && !putRequest && !putFinish && !takeRequest && !takeFinish)
+                            {
+                                _taskService.UpdateTask(task, TaskStatusEnum.SC_Execute, nextAddress: item.StationCode);
+                            }
+                        }
+                        if (item.StationType == StationTypeEnum.StationType_OnlyInbound.ObjToInt())
+                        {
+                            Dt_Task task = _taskRepository.QueryFirst(x => (x.TargetAddress == item.StackerCraneCode || string.IsNullOrEmpty(x.TargetAddress) || x.NextAddress == item.StackerCraneCode || string.IsNullOrEmpty(x.NextAddress)) && (x.TaskState == TaskStatusEnum.New.ObjToInt() || x.TaskState == TaskStatusEnum.AGV_Finish.ObjToInt()) && (x.SourceAddress == item.StationCode || x.CurrentAddress == item.AGVStationCode || x.CurrentAddress == item.StationCode));
+                            if (task != null)
+                            {
+                                if (isCanPut)
+                                {
+                                    device.SetValue(GroundStationDBName.W_PutRequest, true, item.StationCode);
+                                    device.SetValue(GroundStationDBName.W_PutPalletType, 1, item.StationCode);//task.PalletType
+                                }
+                                //鍒ゆ柇AGV浠诲姟瀹屾垚锛屽悗鍐欑粰鍦伴潰绔欐斁璐у畬鎴�
+                                device.SetValue(GroundStationDBName.W_PutFinish, true, item.StationCode);
+
+                                string oldAddress = task.NextAddress;
+                                int oldStatus = task.TaskState;
+                                Dt_StationManger? stationManger = stationMangers.FirstOrDefault(x => x.StationCode == item.StationCode);
+                                if (stationManger == null)
+                                {
+                                    WriteError(item.StationName, $"鏈壘鍒板搴旂珯鍙颁俊鎭�,璁惧缂栧彿:{item.StationCode},浠诲姟鍙�:{task.TaskNum}");
+                                    continue;
+                                }
+                                string? locationCode = _taskService.RequestAssignLocation(task.TaskNum, stationManger.StackerCraneCode);
+                                if (string.IsNullOrEmpty(locationCode))
+                                {
+                                    WriteError(item.StationName, $"璇锋眰鍒嗛厤璐т綅杩斿洖淇℃伅閿欒,璁惧缂栧彿:{item.StationCode},浠诲姟鍙�:{task.TaskNum}");
+                                    continue;
+                                }
+                                _taskService.UpdateTask(task, TaskStatusEnum.SC_Execute, currentAddress: stationManger.StackerCraneStationCode, targetAddress: locationCode, nextAddress: locationCode, deviceCode: stationManger.StackerCraneCode);
+                            }
+                        }
+                    }
+                    catch (Exception ex)
+                    {
+                        WriteError(device.DeviceCode, $"{item}浜や簰閿欒", ex);
+                    }
+                }
+
+                foreach (var item in stationMangers.Where(x => !deviceStations.Contains(x.StationCode)))
+                {
+                    try
+                    {
+                        Dt_Task task = _taskRepository.QueryFirst(x => x.TaskState == TaskStatusEnum.New.ObjToInt() && x.SourceAddress == item.StationCode && _taskService.TaskInboundTypes.Contains(x.TaskType));
+                        if (task != null)
+                        {
+                            Dt_StationManger? stationManger = stationMangers.FirstOrDefault(x => x.StationCode == item.StationCode);
+                            if (stationManger == null)
+                            {
+                                WriteError(item.StationName, $"鏈壘鍒板搴旂珯鍙颁俊鎭�,璁惧缂栧彿:{item.StationCode},浠诲姟鍙�:{task.TaskNum}");
+                                continue;
+                            }
+                            string? locationCode = _taskService.RequestAssignLocation(task.TaskNum, stationManger.StackerCraneCode);
+                            if (string.IsNullOrEmpty(locationCode))
+                            {
+                                WriteError(item.StationName, $"璇锋眰鍒嗛厤璐т綅杩斿洖淇℃伅閿欒,璁惧缂栧彿:{item.StationCode},浠诲姟鍙�:{task.TaskNum}");
+                                continue;
+                            }
+                            _taskService.UpdateTask(task, TaskStatusEnum.SC_Execute, currentAddress: stationManger.StackerCraneStationCode, targetAddress: locationCode, nextAddress: locationCode, deviceCode: stationManger.StackerCraneCode);
+                        }
+                    }
+                    catch (Exception ex)
+                    {
+
+                    }
+                }
+            }
+            catch (Exception ex)
+            {
+                WriteError(device.DeviceName, "", ex);
+            }
+            return Task.CompletedTask;
+        }
+    }
+}
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/\351\230\273\347\204\212\344\273\223/StackerCraneJob_ZH.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/\351\230\273\347\204\212\344\273\223/StackerCraneJob_ZH.cs"
index 4a8d339..537052a 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/\351\230\273\347\204\212\344\273\223/StackerCraneJob_ZH.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/\351\230\273\347\204\212\344\273\223/StackerCraneJob_ZH.cs"
@@ -20,6 +20,7 @@
 using WIDESEAWCS_Tasks.HoisterJob;
 using WIDESEAWCS_Tasks.StackerCraneJob;
 using WIDESEAWCS_Tasks;
+using WIDESEAWCS_Core;
 
 namespace WIDESEAWCS_Tasks
 {
@@ -69,7 +70,9 @@
                                     if (sendFlag)
                                     {
                                         commonStackerCrane.LastTaskType = task.TaskType;
-                                       // _taskService.UpdateTaskStatusToNext(task.TaskNum);
+                                        task.Dispatchertime = DateTime.Now;
+                                        task.ExceptionMessage = "";
+                                        _taskService.UpdateTask(task, TaskStatusEnum.SC_Executing);
                                     }
                                 }
                             }
@@ -97,9 +100,54 @@
                 if (commonStackerCrane.GetValue<StackerCraneDBName, short>(StackerCraneDBName.WorkType) != 5)
                 {
                     Console.Out.WriteLine("TaskCompleted" + e.TaskNum);
-                   // _taskService.StackCraneTaskCompleted(e.TaskNum);
+                    StackerCraneTaskCompleted(e.TaskNum, commonStackerCrane.DeviceCode);
                     commonStackerCrane.SetValue(StackerCraneDBName.WorkType, 5);
                 }
+            }
+        }
+
+        public WebResponseContent StackerCraneTaskCompleted(int taskNum, string deviceCode)
+        {
+            try
+            {
+                Dt_Task task = _taskRepository.QueryFirst(x => x.TaskNum == taskNum);
+                if (task != null)
+                {
+                    if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup)
+                    {
+                        Dt_StationManger stationManger = _stationMangerRepository.QueryFirst(x => x.StackerCraneStationCode == task.NextAddress);
+                        if (stationManger == null)
+                        {
+                            _taskExecuteDetailService.AddTaskExecuteDetail(taskNum, $"AGV绔欑偣鏈厤缃�,{task.NextAddress}");
+                            _taskService.UpdateTaskExceptionMessage(taskNum, $"AGV绔欑偣鏈厤缃�,{task.NextAddress}");
+                            return WebResponseContent.Instance.Error($"AGV绔欑偣鏈厤缃�,{task.NextAddress}");
+                        }
+
+                        _taskService.UpdateTask(task, TaskStatusEnum.AGV_Execute, deviceCode: "AGV_ZH", currentAddress: stationManger.AGVStationCode ?? throw new Exception($"agv绔欑偣閿欒"), nextAddress: task.TargetAddress);
+                    }
+                    else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.InboundGroup || task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.RelocationGroup)
+                    {
+                        _taskService.TaskCompleted(taskNum);
+                    }
+                    else
+                    {
+                        WriteError(deviceCode, $"鏈壘鍒拌浠诲姟绫诲瀷鍥炶皟WMS浠诲姟瀹屾垚鎺ュ彛,{task.TaskType}");
+                        _taskExecuteDetailService.AddTaskExecuteDetail(taskNum, $"鏈壘鍒拌浠诲姟绫诲瀷鍥炶皟WMS浠诲姟瀹屾垚鎺ュ彛,{task.TaskType}");
+                        _taskService.UpdateTaskExceptionMessage(taskNum, $"鏈壘鍒拌浠诲姟绫诲瀷鍥炶皟WMS浠诲姟瀹屾垚鎺ュ彛,{task.TaskType}");
+                    }
+                }
+                else
+                {
+                    WriteError(deviceCode, $"鏈壘鍒颁换鍔′俊鎭�,浠诲姟鍙�:{taskNum}");
+                    return WebResponseContent.Instance.Error($"鏈壘鍒颁换鍔′俊鎭�,浠诲姟鍙�:{taskNum}");
+                }
+
+                return WebResponseContent.Instance.OK();
+            }
+            catch (Exception ex)
+            {
+                WriteError(deviceCode, $"浠诲姟瀹屾垚閿欒", ex);
+                return WebResponseContent.Instance.Error(ex.Message);
             }
         }
 
@@ -166,7 +214,7 @@
         /// <returns>濡傛灉鏈鍗犵敤锛岃繑鍥炰紶鍏ョ殑浠诲姟淇℃伅锛屽惁鍒欙紝杩斿洖null</returns>
         private Dt_Task? OutTaskStationIsOccupied([NotNull] Dt_Task task)
         {
-            Dt_StationManger? stationManger = _stationMangerRepository.QueryFirst(x => x.StationCode == task.TargetAddress && x.StackerCraneCode == task.DeviceCode);
+            Dt_StationManger? stationManger = _stationMangerRepository.QueryFirst(x => (x.StationCode == task.NextAddress || x.StackerCraneStationCode == task.NextAddress) && x.StackerCraneCode == task.DeviceCode);
             if (stationManger != null)
             {
                 IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == stationManger.StationDeviceCode);
@@ -175,21 +223,22 @@
                     OtherDevice client = (OtherDevice)device;
                     if (client.GetValue<GroundStationDBName, bool>(GroundStationDBName.R_IsCanPut, stationManger.StationCode))//鍑哄簱绔欏彴鏈鍗犵敤
                     {
-                        task.TargetAddress = stationManger.StackerCraneStationCode;
+                        task.NextAddress = stationManger.StackerCraneStationCode;
                         _taskRepository.UpdateData(task);
+                        client.SetValue(GroundStationDBName.R_IsCanPut, true, stationManger.StationCode);
                         return task;
                     }
                 }
                 else
                 {
+                    WriteError(task.DeviceCode, $"鏈壘鍒板嚭搴撶珯鍙般�恵stationManger.StationDeviceCode}銆戝搴旂殑閫氳瀵硅薄锛屾棤娉曞垽鏂嚭搴撶珯鍙版槸鍚﹁鍗犵敤");
                     _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"鏈壘鍒板嚭搴撶珯鍙般�恵stationManger.StationDeviceCode}銆戝搴旂殑閫氳瀵硅薄锛屾棤娉曞垽鏂嚭搴撶珯鍙版槸鍚﹁鍗犵敤");
-                    WriteInfo(nameof(StackerCraneJob_ZH), $"鏈壘鍒板嚭搴撶珯鍙般�恵stationManger.StationDeviceCode}銆戝搴旂殑閫氳瀵硅薄锛屾棤娉曞垽鏂嚭搴撶珯鍙版槸鍚﹁鍗犵敤");
                 }
             }
             else
             {
+                WriteError(task.DeviceCode, $"鏈壘鍒扮珯鍙般�恵task.NextAddress}銆戜俊鎭紝鏃犳硶鏍¢獙绔欏彴");
                 _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"鏈壘鍒扮珯鍙般�恵task.NextAddress}銆戜俊鎭紝鏃犳硶鏍¢獙绔欏彴");
-                WriteInfo(nameof(StackerCraneJob_ZH), $"鏈壘鍒扮珯鍙般�恵task.NextAddress}銆戜俊鎭紝鏃犳硶鏍¢獙绔欏彴");
             }
             return null;
         }
@@ -210,15 +259,35 @@
             stackerCraneTaskCommand.TrayType = 1;
             if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.InboundGroup)//鍒ゆ柇鏄惁鏄叆搴撲换鍔�
             {
-                //List<Dt_Router> routers = _routerService.QueryNextRoutes(task.CurrentAddress, task.Roadway);
-                //if (routers.Count > 0)
-                //{
+
                 string[] startCodes = task.CurrentAddress.Split("-");
-
-                stackerCraneTaskCommand.StartRow = Convert.ToInt16(startCodes[0]);
-                stackerCraneTaskCommand.StartColumn = Convert.ToInt16(startCodes[1]);
-                stackerCraneTaskCommand.StartLayer = Convert.ToInt16(startCodes[2]);
-
+                if (startCodes.Length == 3)
+                {
+                    stackerCraneTaskCommand.StartRow = Convert.ToInt16(startCodes[0]);
+                    stackerCraneTaskCommand.StartColumn = Convert.ToInt16(startCodes[1]);
+                    stackerCraneTaskCommand.StartLayer = Convert.ToInt16(startCodes[2]);
+                }
+                else
+                {
+                    _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"鍏ュ簱浠诲姟璧风偣閿欒锛岃捣鐐癸細銆恵task.CurrentAddress}銆�");
+                    return null;
+                }
+                string[] targetCodes = task.NextAddress.Split("-");
+                if (targetCodes.Length == 5)
+                {
+                    stackerCraneTaskCommand.EndRow = Convert.ToInt16(targetCodes[1]);
+                    stackerCraneTaskCommand.EndColumn = Convert.ToInt16(targetCodes[2]);
+                    stackerCraneTaskCommand.EndLayer = Convert.ToInt16(targetCodes[3]);
+                }
+                else
+                {
+                    //鏁版嵁閰嶇疆閿欒
+                    _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"鍏ュ簱浠诲姟缁堢偣閿欒锛岀粓鐐癸細銆恵task.NextAddress}銆�");
+                    return null;
+                }
+            }
+            else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup)
+            {
                 string[] targetCodes = task.NextAddress.Split("-");
                 if (targetCodes.Length == 3)
                 {
@@ -229,77 +298,49 @@
                 else
                 {
                     //鏁版嵁閰嶇疆閿欒
-                    _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"鍏ュ簱浠诲姟缁堢偣閿欒锛岃捣鐐癸細銆恵task.NextAddress}銆�");
+                    _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"鍑哄簱浠诲姟涓嬩竴鍦板潃鐐归敊璇紝璧风偣锛氥�恵task.NextAddress}銆�");
                     return null;
                 }
-                //}
-                //else
-                //{
-                //    _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"鏈壘鍒扮珯鍙般�恵task.NextAddress}銆戜俊鎭紝鏃犳硶鑾峰彇瀵瑰簲鐨勫爢鍨涙満鍙栬揣绔欏彴淇℃伅");
-                //    return null;
-                //}
-            }
-            else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup)
-            {
-                //List<Dt_Router> routers = _routerService.QueryNextRoutes(task.Roadway, task.TargetAddress);
-                //if (routers.Count > 0)
+                string[] sourceCodes = task.CurrentAddress.Split("-");
+                if (sourceCodes.Length == 5)
                 {
-                    string[] targetCodes = task.NextAddress.Split("-");
-
-                    stackerCraneTaskCommand.EndRow = Convert.ToInt16(targetCodes[0]);
-                    stackerCraneTaskCommand.EndColumn = Convert.ToInt16(targetCodes[1]);
-                    stackerCraneTaskCommand.EndLayer = Convert.ToInt16(targetCodes[2]);
-
-                    string[] sourceCodes = task.CurrentAddress.Split("-");
-                    if (sourceCodes.Length == 3)
-                    {
-                        stackerCraneTaskCommand.StartRow = Convert.ToInt16(sourceCodes[0]);
-                        stackerCraneTaskCommand.StartColumn = Convert.ToInt16(sourceCodes[1]);
-                        stackerCraneTaskCommand.StartLayer = Convert.ToInt16(sourceCodes[2]);
-                    }
-                    else
-                    {
-                        //鏁版嵁閰嶇疆閿欒
-                        _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"鍑哄簱浠诲姟璧风偣閿欒锛岃捣鐐癸細銆恵task.CurrentAddress}銆�");
-                        WriteInfo(nameof(StackerCraneJob_ZH), $"鍑哄簱浠诲姟璧风偣閿欒锛岃捣鐐癸細銆恵task.CurrentAddress}銆�");
-                        return null;
-                    }
+                    stackerCraneTaskCommand.StartRow = Convert.ToInt16(sourceCodes[1]);
+                    stackerCraneTaskCommand.StartColumn = Convert.ToInt16(sourceCodes[2]);
+                    stackerCraneTaskCommand.StartLayer = Convert.ToInt16(sourceCodes[3]);
                 }
-                //else
-                //{
-                //    _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"鏈壘鍒扮珯鍙般�恵task.NextAddress}銆戜俊鎭紝鏃犳硶鑾峰彇瀵瑰簲鐨勫爢鍨涙満鏀捐揣绔欏彴淇℃伅");
-                //    return null;
-                //}
+                else
+                {
+                    //鏁版嵁閰嶇疆閿欒
+                    _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"鍑哄簱浠诲姟璧风偣閿欒锛岃捣鐐癸細銆恵task.CurrentAddress}銆�");
+                    return null;
+                }
             }
             else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.RelocationGroup)
             {
                 string[] targetCodes = task.NextAddress.Split("-");
-                if (targetCodes.Length == 3)
+                if (targetCodes.Length == 5)
                 {
-                    stackerCraneTaskCommand.EndRow = Convert.ToInt16(targetCodes[0]);
-                    stackerCraneTaskCommand.EndColumn = Convert.ToInt16(targetCodes[1]);
-                    stackerCraneTaskCommand.EndLayer = Convert.ToInt16(targetCodes[2]);
+                    stackerCraneTaskCommand.EndRow = Convert.ToInt16(targetCodes[1]);
+                    stackerCraneTaskCommand.EndColumn = Convert.ToInt16(targetCodes[2]);
+                    stackerCraneTaskCommand.EndLayer = Convert.ToInt16(targetCodes[3]);
                 }
                 else
                 {
                     //鏁版嵁閰嶇疆閿欒
                     _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"绉诲簱浠诲姟缁堢偣閿欒锛岃捣鐐癸細銆恵task.NextAddress}銆�");
-                    WriteInfo(nameof(StackerCraneJob_ZH), $"绉诲簱浠诲姟缁堢偣閿欒锛岃捣鐐癸細銆恵task.NextAddress}銆�");
                     return null;
                 }
                 string[] sourceCodes = task.CurrentAddress.Split("-");
-                if (sourceCodes.Length == 3)
+                if (sourceCodes.Length == 5)
                 {
-                    stackerCraneTaskCommand.StartRow = Convert.ToInt16(sourceCodes[0]);
-                    stackerCraneTaskCommand.StartColumn = Convert.ToInt16(sourceCodes[1]);
-                    stackerCraneTaskCommand.StartLayer = Convert.ToInt16(sourceCodes[2]);
+                    stackerCraneTaskCommand.StartRow = Convert.ToInt16(sourceCodes[1]);
+                    stackerCraneTaskCommand.StartColumn = Convert.ToInt16(sourceCodes[2]);
+                    stackerCraneTaskCommand.StartLayer = Convert.ToInt16(sourceCodes[3]);
                 }
                 else
                 {
                     //鏁版嵁閰嶇疆閿欒
                     _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"绉诲簱浠诲姟璧风偣閿欒锛岃捣鐐癸細銆恵task.CurrentAddress}銆�");
-
-                    WriteInfo(nameof(StackerCraneJob_ZH), $"绉诲簱浠诲姟璧风偣閿欒锛岃捣鐐癸細銆恵task.CurrentAddress}銆�");
                     return null;
                 }
             }
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSClient/src/extension/outbound/extend/PPStockSelect.vue" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSClient/src/extension/outbound/extend/PPStockSelect.vue"
new file mode 100644
index 0000000..8dc77b0
--- /dev/null
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSClient/src/extension/outbound/extend/PPStockSelect.vue"
@@ -0,0 +1,332 @@
+<template>
+  <div>
+    <vol-box
+      v-model="showDetialBox"
+      :lazy="true"
+      width="60%"
+      :padding="15"
+      title="鎸囧畾搴撳瓨"
+    >
+      <div class="box-head">
+        <el-alert :closable="false" style="width: 100%">
+          <el-row>
+            <el-col :span="16">
+              <span class="less-style">鐗╂枡鍚嶇О锛� {{ row.materielName }} </span>
+              <el-divider direction="vertical"></el-divider>
+              <span class="less-style">鐗╂枡缂栧彿锛� {{ row.materielCode }} </span>
+              <el-divider direction="vertical"></el-divider>
+              <span class="less-style"
+                >闇�姹傛暟閲忥細 {{ row.orderQuantity }}
+              </span>
+              <el-divider direction="vertical"></el-divider>
+              <span :class="selectionClass"
+                >宸查�夋暟閲忥細 {{ selectionSum }}
+              </span>
+            </el-col>
+            <el-col :span="8">
+              <el-link
+                type="primary"
+                size="small"
+                style="float: right; height: 20px"
+                @click="getData(false)"
+                >{{ kcname }}</el-link
+              >
+              <el-link
+                type="primary"
+                size="small"
+                style="float: right; height: 20px; margin-right: 10px"
+                @click="getData"
+                >鍒锋柊</el-link
+              >
+              <el-link
+                type="primary"
+                size="small"
+                style="float: right; height: 20px; margin-right: 10px"
+                @click="revokeAssign"
+                >鎾ら攢鍒嗛厤</el-link
+              >
+            </el-col>
+          </el-row>
+        </el-alert>
+      </div>
+      <div class="box-table" style="margin-top: 1%">
+        <el-table
+          ref="singleTable"
+          :data="tableData"
+          style="width: 100%; height: 100%"
+          highlight-current-row
+          @row-click="handleRowClick"
+          height="500px"
+          @selection-change="handleSelectionChange"
+        >
+          >
+          <el-table-column type="selection" width="55"> </el-table-column>
+          <el-table-column
+            label="搴忓彿"
+            type="index"
+            fixed="left"
+            width="55"
+            align="center"
+          ></el-table-column>
+          <el-table-column
+            v-for="(item, index) in tableColumns.filter((x) => !x.hidden)"
+            :key="index"
+            :prop="item.prop"
+            :label="item.title"
+            :width="item.width"
+            align="center"
+          >
+            <template #default="scoped" v-if="item.type == 'icon'">
+              <el-tooltip
+                class="item"
+                effect="dark"
+                :content="item.title"
+                placement="bottom"
+                ><el-button
+                  type="text"
+                  @click="tableButtonClick(scoped.row, item)"
+                  ><i :class="item.icon" style="font-size: 22px"></i></el-button
+              ></el-tooltip>
+            </template>
+          </el-table-column>
+        </el-table>
+      </div>
+      <template #footer>
+        <el-button type="primary" size="small" @click="outbound"
+          >鐩存帴鍑哄簱</el-button
+        >
+        <el-button type="primary" size="small" @click="lockStock"
+          >閿佸畾搴撳瓨</el-button
+        >
+        <el-button type="danger" size="small" @click="showDetialBox = false"
+          >鍏抽棴</el-button
+        >
+      </template>
+    </vol-box>
+  </div>
+</template>
+<script>
+import VolBox from "@/components/basic/VolBox.vue";
+import { fa } from "element-plus/es/locales.mjs";
+export default {
+  components: { VolBox },
+  data() {
+    return {
+      row: null,
+      kcname: "",
+      pkcx: false,
+      showDetialBox: false,
+      tableData: [],
+      tableColumns: [
+        {
+          prop: "materielCode",
+          title: "鐗╂枡缂栧彿",
+          type: "string",
+          width: 150,
+        },
+        {
+          prop: "materielName",
+          title: "鐗╂枡鍚嶇О",
+          type: "string",
+          width: 150,
+        },
+        {
+          prop: "palletCode",
+          title: "鎵樼洏缂栧彿",
+          type: "string",
+          width: 150,
+        },
+        {
+          prop: "locationCode",
+          title: "璐т綅缂栧彿",
+          type: "string",
+          width: 180,
+        },
+        {
+          prop: "unit",
+          title: "鍗曚綅",
+          type: "string",
+          width: 90,
+        },
+        {
+          prop: "cutedWidth",
+          title: "瑁佸垏瀹�",
+          type: "string",
+          width: 100,
+          align: "left",
+        },
+        {
+          prop: "useableQuantity",
+          title: "鍙敤鏁伴噺",
+          type: "string",
+        },
+      ],
+      selection: [],
+      selectionSum: 0,
+      selectionClass: "less-style",
+      originalQuantity: 0,
+    };
+  },
+  methods: {
+    open(row) {
+      console.log(row);
+      this.row = row;
+      this.showDetialBox = true;
+      this.originalQuantity = this.row.lockQuantity;
+      this.selectionSum = this.row.lockQuantity;
+      this.getData();
+      if (this.selectionSum == this.row.orderQuantity) {
+        this.selectionClass = "equle-style";
+      } else if (this.selectionSum < this.row.orderQuantity) {
+        this.selectionClass = "less-style";
+      } else {
+        this.selectionClass = "more-style";
+      }
+    },
+    lockStock() {
+      this.http
+        .post(
+          "api/OutboundOrderDetail/LockOutboundStock?id=" + this.row.id,
+          this.selection,
+          "鏁版嵁澶勭悊涓�"
+        )
+        .then((x) => {
+          if (!x.status) return this.$message.error(x.message);
+          this.$message.success("鎿嶄綔鎴愬姛");
+          this.showDetialBox = false;
+          this.$emit("parentCall", ($vue) => {
+            $vue.getData();
+          });
+        });
+    },
+    outbound() {
+      if (this.selection.length <= 0) {
+        return this.$message.error("璇峰嬀閫�");
+      }
+      let url = this.pkcx
+        ? "api/Mes/PPGeneratePKOutboundTask?orderDetailId="
+        : "api/Mes/PPCutOutGenerateOutboundTasks?orderDetailId=";
+      this.http
+        .post(url + this.row.id, this.selection, "鏁版嵁澶勭悊涓�")
+        .then((x) => {
+          if (!x.status) return this.$message.error(x.message);
+          this.$message.success("鎿嶄綔鎴愬姛");
+          this.showDetialBox = false;
+          this.$emit("parentCall", ($vue) => {
+            $vue.getData();
+          });
+        });
+    },
+    getData(a) {
+      if (!a) this.pkcx = !this.pkcx;
+      let url = this.pkcx
+        ? "api/StockInfo/PPGetPKStockSelectViews?materielCode="
+        : "api/StockInfo/PPGetStockSelectViews?materielCode=";
+      this.kcname = this.pkcx ? "绔嬪簱搴撳瓨" : "骞冲簱搴撳瓨";
+      console.log(this.row.materielCode),
+        this.http
+          .post(
+            url + this.row.materielCode + "&orderId=" + this.row.orderId,
+            null,
+            "鏌ヨ涓�"
+          )
+          .then((x) => {
+            this.tableData = x;
+          });
+    },
+    revokeAssign() {
+      console.log(this.row);
+      this.http
+        .post(
+          "api/OutboundOrderDetail/RevokeLockOutboundStock?id=" + this.row.id,
+          null,
+          "鏁版嵁澶勭悊涓�"
+        )
+        .then((x) => {
+          if (!x.status) return this.$message.error(x.message);
+          this.$message.success("鎿嶄綔鎴愬姛");
+          this.showDetialBox = false;
+          this.$emit("parentCall", ($vue) => {
+            $vue.getData();
+          });
+        });
+    },
+    handleSelectionChange(val) {
+      this.selection = val;
+      this.selectionSum =
+        val.reduce(
+          (accumulator, currentValue) =>
+            accumulator + currentValue["useableQuantity"],
+          0
+        ) + this.originalQuantity;
+      if (this.selectionSum == this.row.orderQuantity) {
+        this.selectionClass = "equle-style";
+      } else if (this.selectionSum < this.row.orderQuantity) {
+        this.selectionClass = "less-style";
+      } else {
+        this.selectionClass = "more-style";
+      }
+    },
+    toggleSelection(rows) {
+      if (rows) {
+        rows.forEach((row) => {
+          this.$refs.singleTable.toggleRowSelection(row);
+        });
+      } else {
+        this.$refs.singleTable.clearSelection();
+      }
+    },
+    clearSelection() {
+      this.$refs.singleTable.clearSelection();
+    },
+    handleRowClick(row) {
+      this.$refs.singleTable.toggleRowSelection(row);
+    },
+  },
+};
+</script>
+<style scoped>
+.less-style {
+  color: black;
+}
+
+.equle-style {
+  color: green;
+}
+
+.more-style {
+  color: red;
+}
+</style>
+
+<style>
+.text-button:hover {
+  background-color: #f0f9eb !important;
+}
+
+.el-table .warning-row {
+  background: oldlace;
+}
+
+.box-table .el-table tbody tr:hover > td {
+  background-color: #d8e0d4 !important;
+  /* color: #ffffff; */
+}
+
+.box-table .el-table tbody tr.current-row > td {
+  background-color: #f0f9eb !important;
+  /* color: #ffffff; */
+}
+
+.el-table .success-row {
+  background: #f0f9eb;
+}
+
+.box-table .el-table {
+  border: 1px solid #ebeef5;
+}
+
+.box-head .el-alert__content {
+  width: 100%;
+}
+</style>
\ No newline at end of file
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSClient/src/extension/outbound/extend/mesPPCutOutOrderDetail.vue" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSClient/src/extension/outbound/extend/mesPPCutOutOrderDetail.vue"
index 0f908fa..9088654 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSClient/src/extension/outbound/extend/mesPPCutOutOrderDetail.vue"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSClient/src/extension/outbound/extend/mesPPCutOutOrderDetail.vue"
@@ -91,9 +91,9 @@
         </el-table>
       </div>
     </vol-box>
-    <stock-select ref="child" @parentCall="parentCall"></stock-select>
+    <pp-stock-select ref="childs" ></pp-stock-select>
     <selected-stock
-      ref="selectedStock"
+      ref="SelectedStock"
       @parentCall="parentCall"
     ></selected-stock>
   </div>
@@ -101,10 +101,10 @@
 <script>
 import VolBox from "@/components/basic/VolBox.vue";
 import VolForm from "@/components/basic/VolForm.vue";
-import StockSelect from "./StockSelect.vue";
+import PPStockSelect from "./PPStockSelect.vue";
 import SelectedStock from "./SelectedStock.vue";
 export default {
-  components: { VolBox, VolForm, StockSelect, SelectedStock },
+  components: { VolBox, VolForm,"pp-stock-select":PPStockSelect, SelectedStock },
   data() {
     return {
       row: null,
@@ -297,10 +297,12 @@
     },
     tableButtonClick(row, column) {
       if (column.prop == "assignStock") {
-        this.$refs.child.open(row);
+        console.log(row);
+        console.log(this.$refs.childs);
+        this.$refs.childs.open(row);
       } else {
         //鐐瑰嚮鎵撳紑鍑哄簱璇︽儏
-        this.$refs.selectedStock.open(row);
+        this.$refs.SelectedStock.open(row);
       }
     },
     lockstocks() {
@@ -326,7 +328,7 @@
       var keys = this.selection.map((item) => item.id); // 鑾峰彇閫変腑琛岀殑id
 
       this.http
-        .post("api/Task/GenerateOutboundTasks", keys, "鏁版嵁澶勭悊涓�")
+        .post("api/Mes/PPCutOutGenerateOutboundTasks", keys, "鏁版嵁澶勭悊涓�")
         .then((x) => {
           if (!x.status) return this.$message.error(x.message);
           this.$message.success("鎿嶄綔鎴愬姛");
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSClient/src/extension/outbound/extend/mesPPoutOrderDetail.vue" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSClient/src/extension/outbound/extend/mesPPoutOrderDetail.vue"
index 04aa3e8..58cdc5b 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSClient/src/extension/outbound/extend/mesPPoutOrderDetail.vue"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSClient/src/extension/outbound/extend/mesPPoutOrderDetail.vue"
@@ -271,7 +271,7 @@
       this.http
         .post("api/MesPPOutboundOrderDetail/GetPageData", param, "鏌ヨ涓�")
         .then((x) => {
-            // console.log(x.rows);
+            console.log(x.rows);
           this.tableData = x.rows;
         });
     },
@@ -306,7 +306,7 @@
       var keys = this.selection.map((item) => item.id); // 鑾峰彇閫変腑琛岀殑id
 
       this.http
-        .post("api/Task/MESPPGenerateOutboundTasks", keys, "鏁版嵁澶勭悊涓�")
+        .post("api/Mes/MESPPGenerateOutboundTasks", keys, "鏁版嵁澶勭悊涓�")
         .then((x) => {
           if (!x.status) return this.$message.error(x.message);
           this.$message.success("鎿嶄綔鎴愬姛");
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSClient/src/extension/outbound/mesPPOutboundOrderDetail.js" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSClient/src/extension/outbound/mesPPOutboundOrderDetail.js"
index 6e33fa6..04c9401 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSClient/src/extension/outbound/mesPPOutboundOrderDetail.js"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSClient/src/extension/outbound/mesPPOutboundOrderDetail.js"
@@ -1,57 +1,72 @@
 
 //姝s鏂囦欢鏄敤鏉ヨ嚜瀹氫箟鎵╁睍涓氬姟浠g爜锛屽彲浠ユ墿灞曚竴浜涜嚜瀹氫箟椤甸潰鎴栬�呴噸鏂伴厤缃敓鎴愮殑浠g爜
 let extension = {
-    components: {
-      //鏌ヨ鐣岄潰鎵╁睍缁勪欢
-      gridHeader: '',
-      gridBody: gridBody,
-      gridFooter: '',
-      //鏂板缓銆佺紪杈戝脊鍑烘鎵╁睍缁勪欢
-      modelHeader: '',
-      modelBody: '',
-      modelFooter: ''
+  components: {
+    //鏌ヨ鐣岄潰鎵╁睍缁勪欢
+    gridHeader: '',
+    gridBody: gridBody,
+    gridFooter: '',
+    //鏂板缓銆佺紪杈戝脊鍑烘鎵╁睍缁勪欢
+    modelHeader: '',
+    modelBody: '',
+    modelFooter: ''
+  },
+  tableAction: '', //鎸囧畾鏌愬紶琛ㄧ殑鏉冮檺(杩欓噷濉啓琛ㄥ悕,榛樿涓嶇敤濉啓)
+  buttons: { view: [], 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) => {
+            this.$refs.gridBody.open(row);
+        }
+    });
     },
-    tableAction: '', //鎸囧畾鏌愬紶琛ㄧ殑鏉冮檺(杩欓噷濉啓琛ㄥ悕,榛樿涓嶇敤濉啓)
-    buttons: { view: [], box: [], detail: [] }, //鎵╁睍鐨勬寜閽�
-    methods: {
-       //涓嬮潰杩欎簺鏂规硶鍙互淇濈暀涔熷彲浠ュ垹闄�
-      onInit() {  
-      },
-      onInited() {
-        //妗嗘灦鍒濆鍖栭厤缃悗
-        //濡傛灉瑕侀厤缃槑缁嗚〃,鍦ㄦ鏂规硶鎿嶄綔
-        //this.detailOptions.columns.forEach(column=>{ });
-      },
-      searchBefore(param) {
-        //鐣岄潰鏌ヨ鍓�,鍙互缁檖aram.wheres娣诲姞鏌ヨ鍙傛暟
-        //杩斿洖false锛屽垯涓嶄細鎵ц鏌ヨ
-        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)
-      }
+    onInited() {
+      //妗嗘灦鍒濆鍖栭厤缃悗
+      //濡傛灉瑕侀厤缃槑缁嗚〃,鍦ㄦ鏂规硶鎿嶄綔
+      //this.detailOptions.columns.forEach(column=>{ });
+    },
+    searchBefore(param) {
+      //鐣岄潰鏌ヨ鍓�,鍙互缁檖aram.wheres娣诲姞鏌ヨ鍙傛暟
+      //杩斿洖false锛屽垯涓嶄細鎵ц鏌ヨ
+      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
+  }
+};
+export default extension;
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSClient/src/views/outbound/mesPPCutOutboundOrder.vue" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSClient/src/views/outbound/mesPPCutOutboundOrder.vue"
index a647ba0..f8a3c72 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSClient/src/views/outbound/mesPPCutOutboundOrder.vue"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSClient/src/views/outbound/mesPPCutOutboundOrder.vue"
@@ -194,7 +194,7 @@
     ]);
     const detail = ref({
       cnName: "鍑哄簱鏄庣粏鍗�",
-      table: "OnboundOrderDetail",
+      table: "mesPPCutOutOrderDetail",
       columns: [
         {
           field: "id",
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/16bda44f-cb60-43e3-8deb-16983a6c8720.vsidx" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/16bda44f-cb60-43e3-8deb-16983a6c8720.vsidx"
deleted file mode 100644
index fea932b..0000000
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/16bda44f-cb60-43e3-8deb-16983a6c8720.vsidx"
+++ /dev/null
Binary files differ
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/1ffecc40-5215-4fbe-92a8-4f08c948917b.vsidx" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/1ffecc40-5215-4fbe-92a8-4f08c948917b.vsidx"
new file mode 100644
index 0000000..d741db6
--- /dev/null
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/1ffecc40-5215-4fbe-92a8-4f08c948917b.vsidx"
Binary files differ
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/3a86d184-9f6a-4b52-8eb2-6a125517673d.vsidx" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/3a86d184-9f6a-4b52-8eb2-6a125517673d.vsidx"
deleted file mode 100644
index 30a74c3..0000000
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/3a86d184-9f6a-4b52-8eb2-6a125517673d.vsidx"
+++ /dev/null
Binary files differ
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/6573eb92-5634-4b4e-a7f1-96f2790803c7.vsidx" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/6573eb92-5634-4b4e-a7f1-96f2790803c7.vsidx"
new file mode 100644
index 0000000..e50119f
--- /dev/null
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/6573eb92-5634-4b4e-a7f1-96f2790803c7.vsidx"
Binary files differ
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/7465d6d9-8464-4852-a7e6-98848228a1cf.vsidx" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/7465d6d9-8464-4852-a7e6-98848228a1cf.vsidx"
new file mode 100644
index 0000000..a68c467
--- /dev/null
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/7465d6d9-8464-4852-a7e6-98848228a1cf.vsidx"
Binary files differ
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/bcaff427-9b5a-40c5-b7b6-df06507540f9.vsidx" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/bcaff427-9b5a-40c5-b7b6-df06507540f9.vsidx"
deleted file mode 100644
index 1abdbed..0000000
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/bcaff427-9b5a-40c5-b7b6-df06507540f9.vsidx"
+++ /dev/null
Binary files differ
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/c003f52c-46e5-4779-9a5b-7d482547a022.vsidx" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/c003f52c-46e5-4779-9a5b-7d482547a022.vsidx"
new file mode 100644
index 0000000..f7dd227
--- /dev/null
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/c003f52c-46e5-4779-9a5b-7d482547a022.vsidx"
Binary files differ
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/d7d7cdfe-7831-4766-872e-1bbd2ae71185.vsidx" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/d7d7cdfe-7831-4766-872e-1bbd2ae71185.vsidx"
new file mode 100644
index 0000000..6e7f4b4
--- /dev/null
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/d7d7cdfe-7831-4766-872e-1bbd2ae71185.vsidx"
Binary files differ
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/d988a5f8-54ef-40e6-acc3-7fcd73682004.vsidx" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/d988a5f8-54ef-40e6-acc3-7fcd73682004.vsidx"
deleted file mode 100644
index c2cf792..0000000
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/d988a5f8-54ef-40e6-acc3-7fcd73682004.vsidx"
+++ /dev/null
Binary files differ
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/fed89d2c-c26e-4f31-9fa3-8a0b7f92a8fd.vsidx" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/fed89d2c-c26e-4f31-9fa3-8a0b7f92a8fd.vsidx"
deleted file mode 100644
index 8f9e9fa..0000000
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/fed89d2c-c26e-4f31-9fa3-8a0b7f92a8fd.vsidx"
+++ /dev/null
Binary files differ
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_BasicRepository/LocationInfoRepository.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_BasicRepository/LocationInfoRepository.cs"
index 14a133d..0338b2f 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_BasicRepository/LocationInfoRepository.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_BasicRepository/LocationInfoRepository.cs"
@@ -86,6 +86,16 @@
         }
 
         /// <summary>
+        /// 鑾峰彇鍙嚭搴撹揣浣嶇紪鍙�
+        /// </summary>
+        /// <param name="warehouseId"></param>
+        /// <returns></returns>
+        public List<string> PPGetCanOutLocationCodes(int warehouseId)
+        {
+            return QueryData(x => x.LocationCode, x => x.WarehouseId == warehouseId && x.LocationType == LocationTypeEnum.Undefined.ObjToInt() && x.LocationStatus == LocationStatusEnum.InStock.ObjToInt() && (x.EnableStatus == EnableStatusEnum.OnlyOut.ObjToInt() || x.EnableStatus == EnableStatusEnum.Normal.ObjToInt())).Distinct().ToList();
+        }
+
+        /// <summary>
         /// 鑾峰彇MES鎸囧畾鍙嚭搴撹揣浣嶇紪鍙�
         /// </summary>
         /// <param name="warehouseId"></param>
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_BasicService/Service/LocationInfoService_Common.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_BasicService/Service/LocationInfoService_Common.cs"
index 3e875b8..d677aaf 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_BasicService/Service/LocationInfoService_Common.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_BasicService/Service/LocationInfoService_Common.cs"
@@ -55,7 +55,7 @@
                 "HA58" => AssignLocation_PP(roadwayNo, palletType, palletTypeInfo, beRelocationCode),
                 "HA152" => AssignLocation_GM(roadwayNo, palletType, palletTypeInfo, beRelocationCode),
                 "HA64" => AssignLocation_CSJ(roadwayNo, palletType, palletTypeInfo, beRelocationCode),
-                "闃荤剨浠�" => AssignLocation_ZH(roadwayNo, palletType, palletTypeInfo, beRelocationCode),
+                "HA154" => AssignLocation_ZH(roadwayNo, palletType, palletTypeInfo, beRelocationCode),
                 "HA153" => AssignLocation(roadwayNo),
                 "HA71" => AssignLocation(roadwayNo),
                 "HA60" => AssignLocation(roadwayNo),
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_DTO/Stock/PPStockSelectViewDTO.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_DTO/Stock/PPStockSelectViewDTO.cs"
new file mode 100644
index 0000000..e0f5b7b
--- /dev/null
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_DTO/Stock/PPStockSelectViewDTO.cs"
@@ -0,0 +1,24 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace WIDESEA_DTO.Stock
+{
+    public class PPStockSelectViewDTO
+    {
+        public string MaterielCode { get; set; }
+
+        public string MaterielName { get; set; }
+
+        public float UseableQuantity { get; set; }
+
+        public string PalletCode { get; set; }
+
+        public string LocationCode { get; set; }
+
+        public string Unit {  get; set; }
+        public float CutedWidth {  get; set; }
+    }
+}
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_IBasicRepository/ILocationInfoRepository.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_IBasicRepository/ILocationInfoRepository.cs"
index 0a0ca37..f29220d 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_IBasicRepository/ILocationInfoRepository.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_IBasicRepository/ILocationInfoRepository.cs"
@@ -53,6 +53,8 @@
         /// <returns></returns>
         List<string> GetCanOutLocationCodes(int warehouseId);
 
+        List<string> PPGetCanOutLocationCodes(int warehouseId);
+
         /// <summary>
         /// 鑾峰彇MES鎸囧畾鍙嚭搴撹揣浣嶇紪鍙�
         /// </summary>
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_IOutboundRepository/IOutboundRepository.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_IOutboundRepository/IOutboundRepository.cs"
index 4a7d1be..7ee6315 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_IOutboundRepository/IOutboundRepository.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_IOutboundRepository/IOutboundRepository.cs"
@@ -14,5 +14,7 @@
         IOutboundOrderRepository OutboundOrderRepository { get; }
 
         IOutStockLockInfoRepository OutboundStockLockInfoRepository { get; }
+
+        IMesPPCutOutboundOrderRepository MesPPCutOutboundOrderRepository { get; }
     }
 }
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_IOutboundService/IMesPPCutOutboundOrderDetailService.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_IOutboundService/IMesPPCutOutboundOrderDetailService.cs"
index 9eec4bb..d9c1538 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_IOutboundService/IMesPPCutOutboundOrderDetailService.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_IOutboundService/IMesPPCutOutboundOrderDetailService.cs"
@@ -3,12 +3,32 @@
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
+using WIDESEA_Common.LocationEnum;
+using WIDESEA_Core;
 using WIDESEA_Core.BaseServices;
+using WIDESEA_DTO.Stock;
+using WIDESEA_IOutboundRepository;
 using WIDESEA_Model.Models;
 
 namespace WIDESEA_IOutboundService
 {
     public interface IMesPPCutOutboundOrderDetailService : IService<Dt_MesPPCutOutboundOrderDetail>
     {
+        IMesPPCutOutboundOrderDetailRepository Repository { get; }
+
+        (List<Dt_StockInfo>, Dt_MesPPCutOutboundOrderDetail, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>) AssignStockOutbound(Dt_MesPPCutOutboundOrderDetail mesOutboundOrder,List<PPStockSelectViewDTO> stockSelectViewDTOs);
+
+        /// <summary>
+        /// 閿佸畾鍑哄簱搴撳瓨(淇敼鏁版嵁)
+        /// </summary>
+        /// <param name="stockInfos">搴撳瓨鏄庣粏闆嗗悎</param>
+        /// <param name="outboundOrderDetails">鍑哄簱鍗曟槑缁嗛泦鍚�</param>
+        /// <param name="outStockLockInfos">鍑哄簱閿佸畾鏄庣粏闆嗗悎</param>
+        /// <param name="locationInfos">璐т綅缁撳悎</param>
+        /// <param name="locationStatus">璐т綅鐘舵�佷慨鏀圭殑鍊�</param>
+        /// <param name="tasks">浠诲姟淇℃伅</param>
+        /// <returns></returns>
+        WebResponseContent LockOutboundStockDataUpdate(List<Dt_StockInfo> stockInfos, List<Dt_MesPPCutOutboundOrderDetail> outboundOrderDetails, List<Dt_OutStockLockInfo> outStockLockInfos, List<Dt_LocationInfo> locationInfos, LocationStatusEnum locationStatus = LocationStatusEnum.Lock, List<Dt_Task>? tasks = null);
+
     }
 }
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_IOutboundService/IMesPPOutboundOrderDetailService.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_IOutboundService/IMesPPOutboundOrderDetailService.cs"
index efe0a5d..1cf3fa1 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_IOutboundService/IMesPPOutboundOrderDetailService.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_IOutboundService/IMesPPOutboundOrderDetailService.cs"
@@ -3,7 +3,6 @@
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
-using Microsoft.AspNetCore.Hosting.Server;
 using WIDESEA_Common.LocationEnum;
 using WIDESEA_Core;
 using WIDESEA_Core.BaseServices;
@@ -16,11 +15,7 @@
     {
         IMesPPOutboundOrderDetailRepository Repository { get; }
 
-
-
-        //(List<Dt_StockInfo>, List<Dt_MesPPOutboundOrderDetail>, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>) AssignStockOutbound(List<Dt_MesPPOutboundOrderDetail> mesPPOutboundOrderDetails);
-
-        (List<Dt_StockInfo>, Dt_MesPPOutboundOrderDetail, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>) AssignStockOutbound(Dt_MesPPOutboundOrderDetail mesOutboundOrder);
+        (List<Dt_StockInfo>, List<Dt_MesPPOutboundOrderDetail>, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>, Dt_MesPPOutboundOrder mesPPOutboundOrder) AssignStockOutbound(List<Dt_MesPPOutboundOrderDetail> mesOutboundOrder);
 
         /// <summary>
         /// 閿佸畾鍑哄簱搴撳瓨(淇敼鏁版嵁)
@@ -32,7 +27,8 @@
         /// <param name="locationStatus">璐т綅鐘舵�佷慨鏀圭殑鍊�</param>
         /// <param name="tasks">浠诲姟淇℃伅</param>
         /// <returns></returns>
-        WebResponseContent LockOutboundStockDataUpdate(List<Dt_StockInfo> stockInfos, List<Dt_MesPPOutboundOrderDetail> outboundOrderDetails, List<Dt_OutStockLockInfo> outStockLockInfos, List<Dt_LocationInfo> locationInfos, LocationStatusEnum locationStatus = LocationStatusEnum.Lock, List<Dt_Task>? tasks = null);
+        WebResponseContent LockOutboundStockDataUpdate(Dt_MesPPOutboundOrder mesPPOutboundOrder,List<Dt_StockInfo> stockInfos, List<Dt_MesPPOutboundOrderDetail> outboundOrderDetails, List<Dt_OutStockLockInfo> outStockLockInfos, List<Dt_LocationInfo> locationInfos, LocationStatusEnum locationStatus = LocationStatusEnum.Lock, List<Dt_Task>? tasks = null);
+
 
     }
 }
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_IOutboundService/IMesPPOutboundOrderService.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_IOutboundService/IMesPPOutboundOrderService.cs"
index bda1704..6974ddd 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_IOutboundService/IMesPPOutboundOrderService.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_IOutboundService/IMesPPOutboundOrderService.cs"
@@ -13,8 +13,9 @@
     {
         IMesPPOutboundOrderRepository Repository { get; }
 
-        (List<Dt_StockInfo>, Dt_MesPPOutboundOrder, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>) AssignStockOutbound(Dt_MesPPOutboundOrder mesOutboundOrder);
+        //(List<Dt_StockInfo>, Dt_MesPPOutboundOrder, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>) AssignStockOutbound(Dt_MesPPOutboundOrder mesOutboundOrder);
 
-        (List<Dt_StockInfo>, Dt_MesPPCutOutboundOrderDetail, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>) AssignStockOutbound(Dt_MesPPCutOutboundOrder mesPPOutboundOrder, Dt_MesPPCutOutboundOrderDetail  mesPPCutOutboundOrderDetail);
+        //(List<Dt_StockInfo>, Dt_MesPPCutOutboundOrderDetail, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>) AssignStockOutbound(Dt_MesPPCutOutboundOrder mesPPOutboundOrder, Dt_MesPPCutOutboundOrderDetail  mesPPCutOutboundOrderDetail);
+  
     }
 }
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_IOutboundService/IOutStockLockInfoService.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_IOutboundService/IOutStockLockInfoService.cs"
index 21d60b7..4d49688 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_IOutboundService/IOutStockLockInfoService.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_IOutboundService/IOutStockLockInfoService.cs"
@@ -58,7 +58,7 @@
         /// <param name="assignQuantity"></param>
         /// <param name="taskNum"></param>
         /// <returns></returns>
-        Dt_OutStockLockInfo GetOutStockLockInfo(Dt_MesPPCutOutboundOrder mesPPCutOutboundOrder,Dt_MesPPCutOutboundOrderDetail  mesPPCutOutboundOrderDetail, Dt_StockInfo outStock, float assignQuantity, int? taskNum = null);
+        List<Dt_OutStockLockInfo> GetOutStockLockInfos(Dt_MesPPCutOutboundOrder mesPPCutOutboundOrder,Dt_MesPPCutOutboundOrderDetail  mesPPCutOutboundOrderDetail, List<Dt_StockInfo> outStock, int? taskNum = null);
 
         /// <summary>
         /// 
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_IStockService/IStockInfoService.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_IStockService/IStockInfoService.cs"
index 146ddb5..2533a8d 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_IStockService/IStockInfoService.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_IStockService/IStockInfoService.cs"
@@ -22,7 +22,12 @@
 
         List<Dt_StockInfo> GetUseableStocks(string materielCode, string batchNo, int warehoseId);
 
-        List<Dt_StockInfo> GetUseableStocks(string materielCode, string batchNo, string palletcode,int warehoseId);
+        //List<Dt_StockInfo> GetUseableStocks(string materielCode, string batchNo,,string , int warehoseId);
+
+        List<Dt_StockInfo> GetUseableStocks(string materielCode, string batchNo, string palletcode, int warehoseId);
         WebResponseContent StockQueryData(SaveModel saveModel);
+
+        List<PPStockSelectViewDTO> PPGetStockSelectViews(int orderId, string materielCode);
+        List<PPStockSelectViewDTO> PPGetPKStockSelectViews(int orderId, string materielCode);
     }
 }
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_ITaskInfoService/ITaskService.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_ITaskInfoService/ITaskService.cs"
index 9b7a64c..ce08778 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_ITaskInfoService/ITaskService.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_ITaskInfoService/ITaskService.cs"
@@ -160,12 +160,12 @@
         WebResponseContent GenerateOutboundTasks(int[] keys);
 
 
-        /// <summary>
-        /// 鐢熸垚MESPP澶у嵎鍑哄簱浠诲姟
-        /// </summary>
-        /// <param name="keys"></param>
-        /// <returns></returns>
-        WebResponseContent MESPPGenerateOutboundTasks(int[] keys);
+        ///// <summary>
+        ///// 鐢熸垚MESPP澶у嵎鍑哄簱浠诲姟
+        ///// </summary>
+        ///// <param name="keys"></param>
+        ///// <returns></returns>
+        //WebResponseContent MESPPGenerateOutboundTasks(int[] keys);
 
         /// <summary>
         /// 鍑哄簱浠诲姟瀹屾垚
@@ -327,5 +327,25 @@
         /// </summary>
         /// <returns></returns>
         MesResponseContent BagInfoSync(MesBagInfoModel bagInfoModel);
+
+        /// <summary>
+        /// 鐢熸垚MESPP澶у嵎鍑哄簱浠诲姟
+        /// </summary>
+        /// <param name="keys"></param>
+        /// <returns></returns>
+        WebResponseContent MESPPGenerateOutboundTasks(int[] keys);
+
+        /// <summary>
+        /// 鐢熸垚MESPP灏忓嵎鍑哄簱浠诲姟
+        /// </summary>
+        /// <param name="keys"></param>
+        /// <returns></returns>
+        //WebResponseContent PPCutOutGenerateOutboundTasks(int[] keys);
+
+        WebResponseContent PPCutOutGenerateOutboundTasks(int orderDetailId, List<PPStockSelectViewDTO> stockSelectViews);
+
+        WebResponseContent PPGeneratePKOutboundTask(int orderDetailId, List<PPStockSelectViewDTO> stockSelectViews);
+
+
     }
 }
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Outbound/Dt_MesPPOutboundOrderDetail.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Outbound/Dt_MesPPOutboundOrderDetail.cs"
index 982fadc..ceef524 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Outbound/Dt_MesPPOutboundOrderDetail.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Outbound/Dt_MesPPOutboundOrderDetail.cs"
@@ -11,7 +11,7 @@
     /// <summary>
     /// PP浠撳ぇ鍗稭ES鍑哄簱鍗曟槑缁�
     /// </summary>
-    [SugarTable(nameof(Dt_MesPPOutboundOrderDetail))]
+    [SugarTable(nameof(Dt_MesPPOutboundOrderDetail), "PP浠撳ぇ鍗稭ES鍑哄簱鍗曟槑缁�")]
     public class Dt_MesPPOutboundOrderDetail : BaseEntity
     {
         /// <summary>
@@ -40,7 +40,7 @@
         /// <summary>
         /// 璁㈠崟鏄庣粏鐘舵��
         /// </summary>
-        [SugarColumn(IsNullable = false,ColumnDescription = "璁㈠崟鏄庣粏鐘舵��")]
+        [SugarColumn(IsNullable = false, ColumnDescription = "璁㈠崟鏄庣粏鐘舵��")]
         public int OrderDetailStatus { get; set; }
     }
 }
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_OutboundRepository/OutboundRepository.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_OutboundRepository/OutboundRepository.cs"
index 8114089..7854934 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_OutboundRepository/OutboundRepository.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_OutboundRepository/OutboundRepository.cs"
@@ -15,11 +15,14 @@
 
         public IOutStockLockInfoRepository OutboundStockLockInfoRepository { get; }
 
-        public OutboundRepository(IOutboundOrderDetailRepository outboundOrderDetailRepository, IOutboundOrderRepository outboundOrderRepository, IOutStockLockInfoRepository outboundStockLockInfoRepository)
+        public IMesPPCutOutboundOrderRepository MesPPCutOutboundOrderRepository { get; }
+
+        public OutboundRepository(IOutboundOrderDetailRepository outboundOrderDetailRepository, IOutboundOrderRepository outboundOrderRepository, IOutStockLockInfoRepository outboundStockLockInfoRepository,IMesPPCutOutboundOrderRepository mesPPCutOutboundOrderRepository)
         {
             OutboundOrderDetailRepository = outboundOrderDetailRepository;
             OutboundOrderRepository = outboundOrderRepository;
             OutboundStockLockInfoRepository = outboundStockLockInfoRepository;
+            MesPPCutOutboundOrderRepository = mesPPCutOutboundOrderRepository;
         }
     }
 }
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/MesPPCutOutboundOrderDetailService.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/MesPPCutOutboundOrderDetailService.cs"
index 693de67..263ac9b 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/MesPPCutOutboundOrderDetailService.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/MesPPCutOutboundOrderDetailService.cs"
@@ -3,7 +3,12 @@
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
+using SqlSugar.Extensions;
+using WIDESEA_Common.LocationEnum;
+using WIDESEA_Common.OrderEnum;
+using WIDESEA_Core;
 using WIDESEA_Core.BaseServices;
+using WIDESEA_DTO.Stock;
 using WIDESEA_IBasicRepository;
 using WIDESEA_IBasicService;
 using WIDESEA_IOutboundRepository;
@@ -33,5 +38,188 @@
             _basicService = basicService;
             _recordService = recordService;
         }
+
+        public (List<Dt_StockInfo>, Dt_MesPPCutOutboundOrderDetail, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>) AssignStockOutbound(Dt_MesPPCutOutboundOrderDetail mesPPOutboundOrderDetails, List<PPStockSelectViewDTO> stockSelectViews)
+        {
+            #region
+            //Dt_MesPPCutOutboundOrder OutboundOrder = BaseDal.Db.Queryable<Dt_MesPPCutOutboundOrder>().Where(x => x.Id == mesPPOutboundOrderDetails.OrderId).First();
+            //List<Dt_StockInfo> outStocks = new List<Dt_StockInfo>();
+            //List<Dt_MesPPCutOutboundOrderDetail> groupDetails = mesPPOutboundOrderDetails.GroupBy(x => new { x.MaterielCode, x.BatchNo }).Select(x => new Dt_MesPPCutOutboundOrderDetail { OrderQuantity = x.Sum(v => v.OrderQuantity) - x.Sum(v => v.LockQuantity), MaterielCode = x.Key.MaterielCode, BatchNo = x.Key.BatchNo, }).ToList();
+
+            //List<Dt_OutStockLockInfo> outStockLockInfos = new List<Dt_OutStockLockInfo>();
+            //List<Dt_LocationInfo> locationInfos = new List<Dt_LocationInfo>();
+            //foreach (var item in groupDetails)
+            //{
+            //    float originalNeedQuantity = item.OrderQuantity;
+
+            //    float needQuantity = originalNeedQuantity;
+
+            //    List<Dt_StockInfo> stockInfos = _stockService.StockInfoService.GetUseableStocks(item.MaterielCode, item.BatchNo, OutboundOrder.WarehouseId);
+            //    if (!stockInfos.Any())
+            //    {
+            //        throw new Exception($"鏈壘鍒板彲鍒嗛厤搴撳瓨");
+            //    }
+            //    List<Dt_StockInfo> autoAssignStocks = _stockService.StockInfoService.GetOutboundStocks(stockInfos, item.MaterielCode, needQuantity, out float residueQuantity);
+            //    item.LockQuantity += needQuantity - residueQuantity;
+            //    outStocks.AddRange(autoAssignStocks);
+            //    float assignQuantity = needQuantity - residueQuantity;
+
+            //    List<Dt_MesPPCutOutboundOrderDetail> details = mesPPOutboundOrderDetails.Where(x => !string.IsNullOrEmpty(x.BatchNo) ? x.BatchNo == item.BatchNo : true && x.MaterielCode == item.MaterielCode).ToList();
+
+            //    for (int i = 0; i < details.Count; i++)
+            //    {
+            //        float orderQuantity = details[i].OrderQuantity;
+            //        for (int j = 0; j < autoAssignStocks.Count; j++)
+            //        {
+            //            float detailAssignQuantity = outStockLockInfos.Where(x => !string.IsNullOrEmpty(x.BatchNo) ? x.BatchNo == item.BatchNo : true && x.MaterielCode == item.MaterielCode && x.OrderDetailId == details[i].Id).Sum(x => x.AssignQuantity);//鍑哄簱璁㈠崟鏄庣粏宸插垎閰嶆暟閲�
+
+            //            float palletAssignQuantity = outStockLockInfos.Where(x => x.BatchNo == item.BatchNo && x.MaterielCode == item.MaterielCode && x.PalletCode == autoAssignStocks[j].PalletCode).Sum(x => x.AssignQuantity);//鍑哄簱璇︽儏宸插垎閰嶆暟閲�
+            //            if (string.IsNullOrEmpty(item.BatchNo))
+            //            {
+            //                palletAssignQuantity = outStockLockInfos.Where(x => x.MaterielCode == item.MaterielCode && x.PalletCode == autoAssignStocks[j].PalletCode).Sum(x => x.AssignQuantity);//鍑哄簱璇︽儏宸插垎閰嶆暟閲�
+            //            }
+            //            float palletOutboundQuantity = autoAssignStocks[j].Details.Sum(x => x.OutboundQuantity);
+            //            if (palletAssignQuantity < palletOutboundQuantity)//濡傛灉鍑哄簱璇︽儏宸插垎閰嶆暟閲忓皬浜庢墭鐩樺凡鍒嗛厤鏁伴噺锛屽垯鍙互缁х画娣诲姞璇ユ墭鐩樺嚭搴撲俊鎭�
+            //            {
+            //                float orderDetailNeedQuantity = details[i].OrderQuantity - detailAssignQuantity;
+            //                if (orderDetailNeedQuantity > autoAssignStocks[j].Details.Sum(x => x.OutboundQuantity) - palletAssignQuantity)
+            //                {
+            //                    details[i].LockQuantity += autoAssignStocks[j].Details.Sum(x => x.OutboundQuantity) - palletAssignQuantity;
+            //                    Dt_OutStockLockInfo outStockLockInfo = _outStockLockInfoService.GetOutStockLockInfo(OutboundOrder, details[i], autoAssignStocks[j], autoAssignStocks[j].Details.Sum(x => x.OutboundQuantity) - palletAssignQuantity);
+            //                    outStockLockInfos.Add(outStockLockInfo);
+            //                }
+            //                else
+            //                {
+            //                    Dt_OutStockLockInfo outStockLockInfo = _outStockLockInfoService.GetOutStockLockInfo(OutboundOrder, details[i], autoAssignStocks[j], details[i].OrderQuantity - details[i].LockQuantity);
+            //                    outStockLockInfos.Add(outStockLockInfo);
+            //                    details[i].LockQuantity = details[i].OrderQuantity;
+            //                    break;
+            //                }
+
+            //            }
+            //        }
+            //    }
+
+
+            //    locationInfos.AddRange(_basicService.LocationInfoService.Repository.GetLocationInfos(outStocks.Select(x => x.LocationCode).ToList()));
+
+            //}
+            #endregion
+            (bool, string) checkResult = CheckSelectStockDeital(mesPPOutboundOrderDetails, stockSelectViews);
+            if (!checkResult.Item1) throw new Exception(checkResult.Item2);
+            Dt_MesPPCutOutboundOrder OutboundOrder = BaseDal.Db.Queryable<Dt_MesPPCutOutboundOrder>().Where(x => x.Id == mesPPOutboundOrderDetails.OrderId).First();
+            float originalNeedQuantity = mesPPOutboundOrderDetails.OrderQuantity - mesPPOutboundOrderDetails.LockQuantity;
+
+            float needQuantity = originalNeedQuantity;
+
+            List<Dt_StockInfo> outStocks = _stockService.StockInfoService.Repository.GetStockInfosByPalletCodes(stockSelectViews.Select(x => x.PalletCode).ToList());
+            float assignQuantity = 0;
+            outStocks.ForEach(x =>
+                {
+                    x.Details.ForEach(v =>
+                    {
+                        assignQuantity += v.StockQuantity - v.OutboundQuantity;
+                    });
+                });
+
+            mesPPOutboundOrderDetails.LockQuantity += assignQuantity;
+            outStocks.ForEach(x =>
+            {
+                x.Details.ForEach(v =>
+                {
+                    v.OutboundQuantity = v.StockQuantity;
+                });
+            });
+            needQuantity -= assignQuantity;
+            if (mesPPOutboundOrderDetails.OrderQuantity > mesPPOutboundOrderDetails.LockQuantity)
+            {
+                List<Dt_StockInfo> stockInfos = _stockService.StockInfoService.GetUseableStocks(mesPPOutboundOrderDetails.MaterielCode, mesPPOutboundOrderDetails.BatchNo, OutboundOrder.WarehouseId);
+                stockInfos = stockInfos.Where(x => !stockSelectViews.Select(v => v.PalletCode).Contains(x.PalletCode)).ToList();
+                List<Dt_StockInfo> autoAssignStocks = _stockService.StockInfoService.GetOutboundStocks(stockInfos, mesPPOutboundOrderDetails.MaterielCode, needQuantity, out float residueQuantity);
+                mesPPOutboundOrderDetails.LockQuantity += needQuantity - residueQuantity;
+                outStocks.AddRange(autoAssignStocks);
+                mesPPOutboundOrderDetails.OrderDetailStatus = OrderDetailStatusEnum.AssignOver.ObjToInt();
+                if (residueQuantity > 0)
+                {
+                    mesPPOutboundOrderDetails.OrderDetailStatus = OrderDetailStatusEnum.AssignOverPartial.ObjToInt();
+                }
+            }
+
+            List<Dt_OutStockLockInfo> outStockLockInfos = _outStockLockInfoService.GetOutStockLockInfos(OutboundOrder, mesPPOutboundOrderDetails, outStocks);
+
+
+            List<Dt_LocationInfo> locationInfos = _basicService.LocationInfoService.Repository.GetLocationInfos(outStocks.Select(x => x.LocationCode).ToList());
+            return (outStocks, mesPPOutboundOrderDetails, outStockLockInfos, locationInfos);
+        }
+        private (bool, string) CheckSelectStockDeital(Dt_MesPPCutOutboundOrderDetail outboundOrderDetail, List<PPStockSelectViewDTO> 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, "鎴愬姛");
+        }
+
+
+        /// <summary>
+        /// 鍑哄簱搴撳瓨鍒嗛厤鍚庯紝鏇存柊鏁版嵁搴撴暟鎹�
+        /// </summary>
+        /// <param name="stockInfos"></param>
+        /// <param name="outboundOrderDetails"></param>
+        /// <param name="outStockLockInfos"></param>
+        /// <param name="locationInfos"></param>
+        /// <param name="locationStatus"></param>
+        /// <param name="tasks"></param>
+        /// <returns></returns>
+        public WebResponseContent LockOutboundStockDataUpdate(List<Dt_StockInfo> stockInfos, List<Dt_MesPPCutOutboundOrderDetail> outboundOrderDetails, List<Dt_OutStockLockInfo> outStockLockInfos, List<Dt_LocationInfo> locationInfos, LocationStatusEnum locationStatus = LocationStatusEnum.Lock, List<Dt_Task>? tasks = null)
+        {
+            try
+            {
+                _stockService.StockInfoService.Repository.UpdateData(stockInfos);
+                List<Dt_StockInfoDetail> stockInfoDetails = new List<Dt_StockInfoDetail>();
+                foreach (var item in stockInfos)
+                {
+                    stockInfoDetails.AddRange(item.Details);
+                }
+                _stockService.StockInfoDetailService.Repository.UpdateData(stockInfoDetails);
+                BaseDal.UpdateData(outboundOrderDetails);
+
+                List<Dt_OutStockLockInfo> addOutStockLockInfos = outStockLockInfos.Where(x => x.Id == 0).ToList();
+                if (addOutStockLockInfos != null && addOutStockLockInfos.Any())
+                {
+                    if (tasks != null)
+                    {
+                        addOutStockLockInfos.ForEach(x =>
+                        {
+                            x.TaskNum = tasks.FirstOrDefault(v => v.PalletCode == x.PalletCode)?.TaskNum;
+                        });
+                    }
+
+                    _outStockLockInfoService.Repository.AddData(addOutStockLockInfos);
+                }
+                List<Dt_OutStockLockInfo> updateOutStockLockInfos = outStockLockInfos.Where(x => x.Id > 0).ToList();
+                if (updateOutStockLockInfos != null && updateOutStockLockInfos.Any())
+                {
+                    _outStockLockInfoService.Repository.UpdateData(updateOutStockLockInfos);
+                }
+
+                _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfos, locationStatus, LocationChangeType.OutboundAssignLocation, "", tasks?.Select(x => x.TaskNum).ToList());
+                _basicService.LocationInfoService.Repository.UpdateLocationStatus(locationInfos, locationStatus);
+                return WebResponseContent.Instance.OK();
+            }
+            catch (Exception ex)
+            {
+                return WebResponseContent.Instance.Error(ex.Message);
+            }
+        }
+
     }
 }
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/MesPPOutboundOrderDetailService.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/MesPPOutboundOrderDetailService.cs"
index 2f8ea48..eb95355 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/MesPPOutboundOrderDetailService.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/MesPPOutboundOrderDetailService.cs"
@@ -24,18 +24,74 @@
         private readonly IOutStockLockInfoService _outStockLockInfoService;
         private readonly IBasicService _basicService;
         private readonly IRecordService _recordService;
-        private readonly IOutboundService _outboundService;
-
+        private readonly IMesPPOutboundOrderService _mesPPOutboundOrderService;
         public IMesPPOutboundOrderDetailRepository Repository => BaseDal;
 
-        public MesPPOutboundOrderDetailService(IMesPPOutboundOrderDetailRepository BaseDal, IBasicRepository basicRepository, IOutboundService outboundService, IStockService stockService, IOutStockLockInfoService outStockLockInfoService, IBasicService basicService, IRecordService recordService) : base(BaseDal)
+        public MesPPOutboundOrderDetailService(IMesPPOutboundOrderDetailRepository BaseDal,IMesPPOutboundOrderService mesPPOutboundOrderService ,IBasicRepository basicRepository, IStockService stockService, IOutStockLockInfoService outStockLockInfoService, IBasicService basicService, IRecordService recordService) : base(BaseDal)
         {
             _basicRepository = basicRepository;
             _stockService = stockService;
             _outStockLockInfoService = outStockLockInfoService;
             _basicService = basicService;
             _recordService = recordService;
-            _outboundService = outboundService;
+            _mesPPOutboundOrderService=mesPPOutboundOrderService;
+        }
+
+        public (List<Dt_StockInfo>, List<Dt_MesPPOutboundOrderDetail>, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>, Dt_MesPPOutboundOrder  mesPPOutboundOrder) AssignStockOutbound(List<Dt_MesPPOutboundOrderDetail> mesPPOutboundOrderDetails)
+        {
+            List<Dt_StockInfo> outStocks = new List<Dt_StockInfo>();
+
+            List<Dt_OutStockLockInfo> outStockLockInfos = new List<Dt_OutStockLockInfo>();
+            List<Dt_LocationInfo> locationInfos = new List<Dt_LocationInfo>();
+            Dt_MesPPOutboundOrder OutboundOrder = BaseDal.Db.Queryable<Dt_MesPPOutboundOrder>().Where(x => x.Id == mesPPOutboundOrderDetails.FirstOrDefault().OrderId).First();
+            float originalNeedQuantity = OutboundOrder.OrderQuantity;
+
+            float needQuantity = originalNeedQuantity;
+            //Dt_MesPPOutboundOrder outboundOrder = _outboundRepository.QueryFirst(x => x.Id == outboundOrderDetails.FirstOrDefault().OrderId);
+
+            List<Dt_StockInfo> stockInfos = _stockService.StockInfoService.GetUseableStocks(OutboundOrder.MaterialCode, "", mesPPOutboundOrderDetails.FirstOrDefault()?.CarrierCode ?? "", OutboundOrder.WarehouseId);
+            if (!stockInfos.Any())
+            {
+                throw new Exception($"鏈壘鍒板彲鍒嗛厤搴撳瓨");
+            }
+            List<Dt_StockInfo> autoAssignStocks = _stockService.StockInfoService.GetOutboundStocks(stockInfos, OutboundOrder.MaterialCode, needQuantity, out float residueQuantity);
+            OutboundOrder.LockQuantity += needQuantity - residueQuantity;
+            autoAssignStocks.OrderBy(x => x.Details.FirstOrDefault()?.StockQuantity).ToList();
+            outStocks.AddRange(autoAssignStocks);
+            float assignQuantity = needQuantity - residueQuantity;
+
+            float orderQuantity = OutboundOrder.OrderQuantity;
+
+            for (int j = 0; j < autoAssignStocks.Count; j++)
+            {
+                float detailAssignQuantity = outStockLockInfos.Where(x => x.MaterielCode == OutboundOrder.MaterialCode).Sum(x => x.AssignQuantity);//鍑哄簱璁㈠崟鏄庣粏宸插垎閰嶆暟閲�
+
+                float palletAssignQuantity = outStockLockInfos.Where(x => x.MaterielCode == OutboundOrder.MaterialCode && x.PalletCode == autoAssignStocks[j].PalletCode).Sum(x => x.AssignQuantity);//鍑哄簱璇︽儏宸插垎閰嶆暟閲�
+
+                float palletOutboundQuantity = autoAssignStocks[j].Details.Sum(x => x.OutboundQuantity);
+                if (palletAssignQuantity < palletOutboundQuantity)//濡傛灉鍑哄簱璇︽儏宸插垎閰嶆暟閲忓皬浜庢墭鐩樺凡鍒嗛厤鏁伴噺锛屽垯鍙互缁х画娣诲姞璇ユ墭鐩樺嚭搴撲俊鎭�
+                {
+                    float orderDetailNeedQuantity = OutboundOrder.OrderQuantity - detailAssignQuantity;
+                    if (orderDetailNeedQuantity > autoAssignStocks[j].Details.Sum(x => x.OutboundQuantity) - palletAssignQuantity)
+                    {
+                        OutboundOrder.LockQuantity += autoAssignStocks[j].Details.Sum(x => x.OutboundQuantity) - palletAssignQuantity;
+                        //Dt_OutStockLockInfo outStockLockInfo = _outStockLockInfoService.GetOutStockLockInfo(OutboundOrder, autoAssignStocks[j], autoAssignStocks[j].Details.Sum(x => x.OutboundQuantity) - palletAssignQuantity);
+                        Dt_OutStockLockInfo outStockLockInfo = _outStockLockInfoService.GetOutStockLockInfo(OutboundOrder, autoAssignStocks[j], assignQuantity);
+                        outStockLockInfos.Add(outStockLockInfo);
+                    }
+                    else
+                    {
+                        //Dt_OutStockLockInfo outStockLockInfo = _outStockLockInfoService.GetOutStockLockInfo(OutboundOrder, autoAssignStocks[j], OutboundOrder.OrderQuantity - OutboundOrder.LockQuantity);
+                        Dt_OutStockLockInfo outStockLockInfo = _outStockLockInfoService.GetOutStockLockInfo(OutboundOrder, autoAssignStocks[j], assignQuantity);
+                        outStockLockInfos.Add(outStockLockInfo);
+                        OutboundOrder.LockQuantity = OutboundOrder.OrderQuantity;
+                        break;
+                    }
+                }
+            }
+            locationInfos.AddRange(_basicService.LocationInfoService.Repository.GetLocationInfos(outStocks.Select(x => x.LocationCode).ToList()));
+
+            return (outStocks, mesPPOutboundOrderDetails, outStockLockInfos, locationInfos, OutboundOrder);
         }
 
         /// <summary>
@@ -48,7 +104,7 @@
         /// <param name="locationStatus"></param>
         /// <param name="tasks"></param>
         /// <returns></returns>
-        public WebResponseContent LockOutboundStockDataUpdate(List<Dt_StockInfo> stockInfos, List<Dt_MesPPOutboundOrderDetail> outboundOrderDetails, List<Dt_OutStockLockInfo> outStockLockInfos, List<Dt_LocationInfo> locationInfos, LocationStatusEnum locationStatus = LocationStatusEnum.Lock, List<Dt_Task>? tasks = null)
+        public WebResponseContent LockOutboundStockDataUpdate(Dt_MesPPOutboundOrder mesPPOutboundOrder, List<Dt_StockInfo> stockInfos, List<Dt_MesPPOutboundOrderDetail> outboundOrderDetails, List<Dt_OutStockLockInfo> outStockLockInfos, List<Dt_LocationInfo> locationInfos, LocationStatusEnum locationStatus = LocationStatusEnum.Lock, List<Dt_Task>? tasks = null)
         {
             try
             {
@@ -79,6 +135,10 @@
                 {
                     _outStockLockInfoService.Repository.UpdateData(updateOutStockLockInfos);
                 }
+                if (mesPPOutboundOrder != null)
+                {
+                 _mesPPOutboundOrderService.UpdateData(mesPPOutboundOrder);
+                }
 
                 _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfos, locationStatus, LocationChangeType.OutboundAssignLocation, "", tasks?.Select(x => x.TaskNum).ToList());
                 _basicService.LocationInfoService.Repository.UpdateLocationStatus(locationInfos, locationStatus);
@@ -90,125 +150,5 @@
             }
         }
 
-
-        /// <summary>
-        /// 
-        /// </summary>
-        /// <param name="outboundOrderDetails"></param>
-        /// <returns></returns>
-        public (List<Dt_StockInfo>, List<Dt_MesPPOutboundOrderDetail>, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>) AssignStockOutbound(List<Dt_MesPPOutboundOrderDetail> outboundOrderDetails)
-        {
-            if (!outboundOrderDetails.Any())
-            {
-                throw new Exception($"鏈壘鍒板嚭搴撳崟鏄庣粏淇℃伅");
-            }
-
-            if (outboundOrderDetails.GroupBy(x => x.OrderId).Count() > 1)
-            {
-                throw new Exception($"璇峰嬁鍚屾椂鎿嶄綔澶氫釜鍗曟嵁鏄庣粏");
-            }
-            Dt_MesPPOutboundOrder mesPPOutboundOrder = BaseDal.Db.Queryable<Dt_MesPPOutboundOrder>().Where(x => x.Id == outboundOrderDetails.FirstOrDefault().OrderId).First();
-            List<Dt_StockInfo> outStocks = new List<Dt_StockInfo>();
-
-            List<Dt_OutStockLockInfo> outStockLockInfos = new List<Dt_OutStockLockInfo>();
-            List<Dt_LocationInfo> locationInfos = new List<Dt_LocationInfo>();
-
-
-            List<Dt_StockInfo> stockInfos = _stockService.StockInfoService.GetUseableStocks(mesPPOutboundOrder.MaterialCode, "", outboundOrderDetails.FirstOrDefault()?.CarrierCode ?? "", mesPPOutboundOrder.WarehouseId);
-            if (!stockInfos.Any())
-            {
-                throw new Exception($"鏈壘鍒板彲鍒嗛厤搴撳瓨");
-            }
-            float originalNeedQuantity = mesPPOutboundOrder.OrderQuantity;
-
-            float needQuantity = originalNeedQuantity;
-            List<Dt_StockInfo> autoAssignStocks = _stockService.StockInfoService.GetOutboundStocks(stockInfos, mesPPOutboundOrder.MaterialCode, needQuantity, out float residueQuantity);
-            mesPPOutboundOrder.LockQuantity += needQuantity - residueQuantity;
-            outStocks.AddRange(autoAssignStocks);
-            float assignQuantity = needQuantity - residueQuantity;
-
-            float orderQuantity = mesPPOutboundOrder.OrderQuantity;
-            for (int j = 0; j < autoAssignStocks.Count; j++)
-            {
-                float detailAssignQuantity = outStockLockInfos.Where(x => x.MaterielCode == mesPPOutboundOrder.MaterialCode).Sum(x => x.AssignQuantity);//鍑哄簱璁㈠崟鏄庣粏宸插垎閰嶆暟閲�
-
-                float palletAssignQuantity = outStockLockInfos.Where(x => x.MaterielCode == mesPPOutboundOrder.MaterialCode && x.PalletCode == autoAssignStocks[j].PalletCode).Sum(x => x.AssignQuantity);//鍑哄簱璇︽儏宸插垎閰嶆暟閲�
-
-                float palletOutboundQuantity = autoAssignStocks[j].Details.Sum(x => x.OutboundQuantity);
-                if (palletAssignQuantity < palletOutboundQuantity)//濡傛灉鍑哄簱璇︽儏宸插垎閰嶆暟閲忓皬浜庢墭鐩樺凡鍒嗛厤鏁伴噺锛屽垯鍙互缁х画娣诲姞璇ユ墭鐩樺嚭搴撲俊鎭�
-                {
-                    float orderDetailNeedQuantity = mesPPOutboundOrder.OrderQuantity - detailAssignQuantity;
-                    if (orderDetailNeedQuantity > autoAssignStocks[j].Details.Sum(x => x.OutboundQuantity) - palletAssignQuantity)
-                    {
-                        mesPPOutboundOrder.LockQuantity += autoAssignStocks[j].Details.Sum(x => x.OutboundQuantity) - palletAssignQuantity;
-                        Dt_OutStockLockInfo outStockLockInfo = _outStockLockInfoService.GetOutStockLockInfo(mesPPOutboundOrder, autoAssignStocks[j], autoAssignStocks[j].Details.Sum(x => x.OutboundQuantity) - palletAssignQuantity);
-                        outStockLockInfos.Add(outStockLockInfo);
-                    }
-                    else
-                    {
-                        Dt_OutStockLockInfo outStockLockInfo = _outStockLockInfoService.GetOutStockLockInfo(mesPPOutboundOrder, autoAssignStocks[j], mesPPOutboundOrder.OrderQuantity - mesPPOutboundOrder.LockQuantity);
-                        outStockLockInfos.Add(outStockLockInfo);
-                        mesPPOutboundOrder.LockQuantity = mesPPOutboundOrder.OrderQuantity;
-                        break;
-                    }
-                }
-            }
-            locationInfos.AddRange(_basicService.LocationInfoService.Repository.GetLocationInfos(outStocks.Select(x => x.LocationCode).ToList()));
-
-            return (outStocks, outboundOrderDetails, outStockLockInfos, locationInfos);
-        }
-
-
-        public (List<Dt_StockInfo>, Dt_MesPPOutboundOrderDetail, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>) AssignStockOutbound(Dt_MesPPOutboundOrderDetail mesPPOutboundOrder)
-        {
-            List<Dt_StockInfo> outStocks = new List<Dt_StockInfo>();
-
-            List<Dt_OutStockLockInfo> outStockLockInfos = new List<Dt_OutStockLockInfo>();
-            List<Dt_LocationInfo> locationInfos = new List<Dt_LocationInfo>();
-
-            //float originalNeedQuantity = mesPPOutboundOrder.OrderQuantity;
-
-            //float needQuantity = originalNeedQuantity;
-
-            //List<Dt_StockInfo> stockInfos = _stockService.StockInfoService.GetUseableStocks(mesPPOutboundOrder.MaterialCode, "", mesPPOutboundOrder.Details.FirstOrDefault()?.CarrierCode ?? "", mesPPOutboundOrder.WarehouseId);
-            //if (!stockInfos.Any())
-            //{
-            //    throw new Exception($"鏈壘鍒板彲鍒嗛厤搴撳瓨");
-            //}
-            //List<Dt_StockInfo> autoAssignStocks = _stockService.StockInfoService.GetOutboundStocks(stockInfos, mesPPOutboundOrder.MaterialCode, needQuantity, out float residueQuantity);
-            //mesPPOutboundOrder.LockQuantity += needQuantity - residueQuantity;
-            //outStocks.AddRange(autoAssignStocks);
-            //float assignQuantity = needQuantity - residueQuantity;
-
-            //float orderQuantity = mesPPOutboundOrder.OrderQuantity;
-            //for (int j = 0; j < autoAssignStocks.Count; j++)
-            //{
-            //    float detailAssignQuantity = outStockLockInfos.Where(x => x.MaterielCode == mesPPOutboundOrder.MaterialCode).Sum(x => x.AssignQuantity);//鍑哄簱璁㈠崟鏄庣粏宸插垎閰嶆暟閲�
-
-            //    float palletAssignQuantity = outStockLockInfos.Where(x => x.MaterielCode == mesPPOutboundOrder.MaterialCode && x.PalletCode == autoAssignStocks[j].PalletCode).Sum(x => x.AssignQuantity);//鍑哄簱璇︽儏宸插垎閰嶆暟閲�
-
-            //    float palletOutboundQuantity = autoAssignStocks[j].Details.Sum(x => x.OutboundQuantity);
-            //    if (palletAssignQuantity < palletOutboundQuantity)//濡傛灉鍑哄簱璇︽儏宸插垎閰嶆暟閲忓皬浜庢墭鐩樺凡鍒嗛厤鏁伴噺锛屽垯鍙互缁х画娣诲姞璇ユ墭鐩樺嚭搴撲俊鎭�
-            //    {
-            //        float orderDetailNeedQuantity = mesPPOutboundOrder.OrderQuantity - detailAssignQuantity;
-            //        if (orderDetailNeedQuantity > autoAssignStocks[j].Details.Sum(x => x.OutboundQuantity) - palletAssignQuantity)
-            //        {
-            //            mesPPOutboundOrder.LockQuantity += autoAssignStocks[j].Details.Sum(x => x.OutboundQuantity) - palletAssignQuantity;
-            //            Dt_OutStockLockInfo outStockLockInfo = _outStockLockInfoService.GetOutStockLockInfo(mesPPOutboundOrder, autoAssignStocks[j], autoAssignStocks[j].Details.Sum(x => x.OutboundQuantity) - palletAssignQuantity);
-            //            outStockLockInfos.Add(outStockLockInfo);
-            //        }
-            //        else
-            //        {
-            //            Dt_OutStockLockInfo outStockLockInfo = _outStockLockInfoService.GetOutStockLockInfo(mesPPOutboundOrder, autoAssignStocks[j], mesPPOutboundOrder.OrderQuantity - mesPPOutboundOrder.LockQuantity);
-            //            outStockLockInfos.Add(outStockLockInfo);
-            //            mesPPOutboundOrder.LockQuantity = mesPPOutboundOrder.OrderQuantity;
-            //            break;
-            //        }
-            //    }
-            //}
-            //locationInfos.AddRange(_basicService.LocationInfoService.Repository.GetLocationInfos(outStocks.Select(x => x.LocationCode).ToList()));
-
-            return (outStocks, mesPPOutboundOrder, outStockLockInfos, locationInfos);
-        }
     }
 }
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/MesPPOutboundOrderService.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/MesPPOutboundOrderService.cs"
index 423d52c..31d97cd 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/MesPPOutboundOrderService.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/MesPPOutboundOrderService.cs"
@@ -34,109 +34,110 @@
             _recordService = recordService;
         }
 
-        public (List<Dt_StockInfo>, Dt_MesPPOutboundOrder, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>) AssignStockOutbound(Dt_MesPPOutboundOrder mesPPOutboundOrder)
-        {
-            List<Dt_StockInfo> outStocks = new List<Dt_StockInfo>();
+        //public (List<Dt_StockInfo>, Dt_MesPPOutboundOrder, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>) AssignStockOutbound(Dt_MesPPOutboundOrder mesPPOutboundOrder)
+        //{
+        //    List<Dt_StockInfo> outStocks = new List<Dt_StockInfo>();
 
-            List<Dt_OutStockLockInfo> outStockLockInfos = new List<Dt_OutStockLockInfo>();
-            List<Dt_LocationInfo> locationInfos = new List<Dt_LocationInfo>();
+        //    List<Dt_OutStockLockInfo> outStockLockInfos = new List<Dt_OutStockLockInfo>();
+        //    List<Dt_LocationInfo> locationInfos = new List<Dt_LocationInfo>();
 
-            float originalNeedQuantity = mesPPOutboundOrder.OrderQuantity;
+        //    float originalNeedQuantity = mesPPOutboundOrder.OrderQuantity;
 
-            float needQuantity = originalNeedQuantity;
+        //    float needQuantity = originalNeedQuantity;
 
-            List<Dt_StockInfo> stockInfos = _stockService.StockInfoService.GetUseableStocks(mesPPOutboundOrder.MaterialCode, "", mesPPOutboundOrder.Details.FirstOrDefault()?.CarrierCode ?? "",mesPPOutboundOrder.WarehouseId);
-            if (!stockInfos.Any())
-            {
-                throw new Exception($"鏈壘鍒板彲鍒嗛厤搴撳瓨");
-            }
-            List<Dt_StockInfo> autoAssignStocks = _stockService.StockInfoService.GetOutboundStocks(stockInfos, mesPPOutboundOrder.MaterialCode, needQuantity, out float residueQuantity);
-            mesPPOutboundOrder.LockQuantity += needQuantity - residueQuantity;
-            outStocks.AddRange(autoAssignStocks);
-            float assignQuantity = needQuantity - residueQuantity;
+        //    List<Dt_StockInfo> stockInfos = _stockService.StockInfoService.GetUseableStocks(mesPPOutboundOrder.MaterialCode, "", mesPPOutboundOrder.Details.FirstOrDefault()?.CarrierCode ?? "",mesPPOutboundOrder.WarehouseId);
+        //    if (!stockInfos.Any())
+        //    {
+        //        throw new Exception($"鏈壘鍒板彲鍒嗛厤搴撳瓨");
+        //    }
+        //    List<Dt_StockInfo> autoAssignStocks = _stockService.StockInfoService.GetOutboundStocks(stockInfos, mesPPOutboundOrder.MaterialCode, needQuantity, out float residueQuantity);
+        //    mesPPOutboundOrder.LockQuantity += needQuantity - residueQuantity;
+        //    outStocks.AddRange(autoAssignStocks);
+        //    float assignQuantity = needQuantity - residueQuantity;
 
-            float orderQuantity = mesPPOutboundOrder.OrderQuantity;
-            for (int j = 0; j < autoAssignStocks.Count; j++)
-            {
-                float detailAssignQuantity = outStockLockInfos.Where(x => x.MaterielCode == mesPPOutboundOrder.MaterialCode).Sum(x => x.AssignQuantity);//鍑哄簱璁㈠崟鏄庣粏宸插垎閰嶆暟閲�
+        //    float orderQuantity = mesPPOutboundOrder.OrderQuantity;
+        //    for (int j = 0; j < autoAssignStocks.Count; j++)
+        //    {
+        //        float detailAssignQuantity = outStockLockInfos.Where(x => x.MaterielCode == mesPPOutboundOrder.MaterialCode).Sum(x => x.AssignQuantity);//鍑哄簱璁㈠崟鏄庣粏宸插垎閰嶆暟閲�
 
-                float palletAssignQuantity = outStockLockInfos.Where(x => x.MaterielCode == mesPPOutboundOrder.MaterialCode && x.PalletCode == autoAssignStocks[j].PalletCode).Sum(x => x.AssignQuantity);//鍑哄簱璇︽儏宸插垎閰嶆暟閲�
+        //        float palletAssignQuantity = outStockLockInfos.Where(x => x.MaterielCode == mesPPOutboundOrder.MaterialCode && x.PalletCode == autoAssignStocks[j].PalletCode).Sum(x => x.AssignQuantity);//鍑哄簱璇︽儏宸插垎閰嶆暟閲�
 
-                float palletOutboundQuantity = autoAssignStocks[j].Details.Sum(x => x.OutboundQuantity);
-                if (palletAssignQuantity < palletOutboundQuantity)//濡傛灉鍑哄簱璇︽儏宸插垎閰嶆暟閲忓皬浜庢墭鐩樺凡鍒嗛厤鏁伴噺锛屽垯鍙互缁х画娣诲姞璇ユ墭鐩樺嚭搴撲俊鎭�
-                {
-                    float orderDetailNeedQuantity = mesPPOutboundOrder.OrderQuantity - detailAssignQuantity;
-                    if (orderDetailNeedQuantity > autoAssignStocks[j].Details.Sum(x => x.OutboundQuantity) - palletAssignQuantity)
-                    {
-                        mesPPOutboundOrder.LockQuantity += autoAssignStocks[j].Details.Sum(x => x.OutboundQuantity) - palletAssignQuantity;
-                        Dt_OutStockLockInfo outStockLockInfo = _outStockLockInfoService.GetOutStockLockInfo(mesPPOutboundOrder, autoAssignStocks[j], autoAssignStocks[j].Details.Sum(x => x.OutboundQuantity) - palletAssignQuantity);
-                        outStockLockInfos.Add(outStockLockInfo);
-                    }
-                    else
-                    {
-                        Dt_OutStockLockInfo outStockLockInfo = _outStockLockInfoService.GetOutStockLockInfo(mesPPOutboundOrder, autoAssignStocks[j], mesPPOutboundOrder.OrderQuantity - mesPPOutboundOrder.LockQuantity);
-                        outStockLockInfos.Add(outStockLockInfo);
-                        mesPPOutboundOrder.LockQuantity = mesPPOutboundOrder.OrderQuantity;
-                        break;
-                    }
-                }
-            }
-            locationInfos.AddRange(_basicService.LocationInfoService.Repository.GetLocationInfos(outStocks.Select(x => x.LocationCode).ToList()));
+        //        float palletOutboundQuantity = autoAssignStocks[j].Details.Sum(x => x.OutboundQuantity);
+        //        if (palletAssignQuantity < palletOutboundQuantity)//濡傛灉鍑哄簱璇︽儏宸插垎閰嶆暟閲忓皬浜庢墭鐩樺凡鍒嗛厤鏁伴噺锛屽垯鍙互缁х画娣诲姞璇ユ墭鐩樺嚭搴撲俊鎭�
+        //        {
+        //            float orderDetailNeedQuantity = mesPPOutboundOrder.OrderQuantity - detailAssignQuantity;
+        //            if (orderDetailNeedQuantity > autoAssignStocks[j].Details.Sum(x => x.OutboundQuantity) - palletAssignQuantity)
+        //            {
+        //                mesPPOutboundOrder.LockQuantity += autoAssignStocks[j].Details.Sum(x => x.OutboundQuantity) - palletAssignQuantity;
+        //                Dt_OutStockLockInfo outStockLockInfo = _outStockLockInfoService.GetOutStockLockInfo(mesPPOutboundOrder, autoAssignStocks[j], autoAssignStocks[j].Details.Sum(x => x.OutboundQuantity) - palletAssignQuantity);
+        //                outStockLockInfos.Add(outStockLockInfo);
+        //            }
+        //            else
+        //            {
+        //                Dt_OutStockLockInfo outStockLockInfo = _outStockLockInfoService.GetOutStockLockInfo(mesPPOutboundOrder, autoAssignStocks[j], mesPPOutboundOrder.OrderQuantity - mesPPOutboundOrder.LockQuantity);
+        //                outStockLockInfos.Add(outStockLockInfo);
+        //                mesPPOutboundOrder.LockQuantity = mesPPOutboundOrder.OrderQuantity;
+        //                break;
+        //            }
+        //        }
+        //    }
+        //    locationInfos.AddRange(_basicService.LocationInfoService.Repository.GetLocationInfos(outStocks.Select(x => x.LocationCode).ToList()));
 
-            return (outStocks, mesPPOutboundOrder, outStockLockInfos, locationInfos);
-        }
+        //    return (outStocks, mesPPOutboundOrder, outStockLockInfos, locationInfos);
+        //}
 
 
-        public (List<Dt_StockInfo>, Dt_MesPPCutOutboundOrderDetail, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>) AssignStockOutbound(Dt_MesPPCutOutboundOrder mesPPOutboundOrder, Dt_MesPPCutOutboundOrderDetail mesPPCutOutboundOrderDetail)
-        {
-            List<Dt_StockInfo> outStocks = new List<Dt_StockInfo>();
+        //public (List<Dt_StockInfo>, Dt_MesPPCutOutboundOrderDetail, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>) AssignStockOutbound(Dt_MesPPCutOutboundOrder mesPPOutboundOrder, Dt_MesPPCutOutboundOrderDetail mesPPCutOutboundOrderDetail)
+        //{
+        //    List<Dt_StockInfo> outStocks = new List<Dt_StockInfo>();
 
-            List<Dt_OutStockLockInfo> outStockLockInfos = new List<Dt_OutStockLockInfo>();
-            List<Dt_LocationInfo> locationInfos = new List<Dt_LocationInfo>();
-            //Dt_MesPPCutOutboundOrder outboundOrder = BaseDal.Db.Queryable<Dt_MesPPCutOutboundOrder>().Where(x=>x.Id==mesPPOutboundOrder.OrderId).First();
-            float originalNeedQuantity = mesPPCutOutboundOrderDetail.OrderQuantity;
+        //    List<Dt_OutStockLockInfo> outStockLockInfos = new List<Dt_OutStockLockInfo>();
+        //    List<Dt_LocationInfo> locationInfos = new List<Dt_LocationInfo>();
+        //    //Dt_MesPPCutOutboundOrder outboundOrder = BaseDal.Db.Queryable<Dt_MesPPCutOutboundOrder>().Where(x=>x.Id==mesPPOutboundOrder.OrderId).First();
+        //    float originalNeedQuantity = mesPPCutOutboundOrderDetail.OrderQuantity;
 
-            float needQuantity = originalNeedQuantity;
+        //    float needQuantity = originalNeedQuantity;
 
-            List<Dt_StockInfo> stockInfos = _stockService.StockInfoService.GetUseableStocks(mesPPCutOutboundOrderDetail.MaterielCode,  "", mesPPOutboundOrder.WarehouseId);
-            if (!stockInfos.Any())
-            {
-                throw new Exception($"鏈壘鍒板彲鍒嗛厤搴撳瓨");
-            }
-            List<Dt_StockInfo> autoAssignStocks = _stockService.StockInfoService.GetOutboundStocks(stockInfos, mesPPCutOutboundOrderDetail.MaterielCode, needQuantity, out float residueQuantity);
-            mesPPCutOutboundOrderDetail.LockQuantity += needQuantity - residueQuantity;
-            outStocks.AddRange(autoAssignStocks);
-            float assignQuantity = needQuantity - residueQuantity;
+        //    List<Dt_StockInfo> stockInfos = _stockService.StockInfoService.GetUseableStocks(mesPPCutOutboundOrderDetail.MaterielCode,  "", mesPPOutboundOrder.WarehouseId);
+        //    if (!stockInfos.Any())
+        //    {
+        //        throw new Exception($"鏈壘鍒板彲鍒嗛厤搴撳瓨");
+        //    }
+        //    List<Dt_StockInfo> autoAssignStocks = _stockService.StockInfoService.GetOutboundStocks(stockInfos, mesPPCutOutboundOrderDetail.MaterielCode, needQuantity, out float residueQuantity);
+        //    mesPPCutOutboundOrderDetail.LockQuantity += needQuantity - residueQuantity;
+        //    outStocks.AddRange(autoAssignStocks);
+        //    float assignQuantity = needQuantity - residueQuantity;
 
-            float orderQuantity = mesPPCutOutboundOrderDetail.OrderQuantity;
-            for (int j = 0; j < autoAssignStocks.Count; j++)
-            {
-                float detailAssignQuantity = outStockLockInfos.Where(x => x.MaterielCode == mesPPCutOutboundOrderDetail.MaterielCode).Sum(x => x.AssignQuantity);//鍑哄簱璁㈠崟鏄庣粏宸插垎閰嶆暟閲�
+        //    float orderQuantity = mesPPCutOutboundOrderDetail.OrderQuantity;
+        //    for (int j = 0; j < autoAssignStocks.Count; j++)
+        //    {
+        //        float detailAssignQuantity = outStockLockInfos.Where(x => x.MaterielCode == mesPPCutOutboundOrderDetail.MaterielCode).Sum(x => x.AssignQuantity);//鍑哄簱璁㈠崟鏄庣粏宸插垎閰嶆暟閲�
 
-                float palletAssignQuantity = outStockLockInfos.Where(x => x.MaterielCode == mesPPCutOutboundOrderDetail.MaterielCode && x.PalletCode == autoAssignStocks[j].PalletCode).Sum(x => x.AssignQuantity);//鍑哄簱璇︽儏宸插垎閰嶆暟閲�
+        //        float palletAssignQuantity = outStockLockInfos.Where(x => x.MaterielCode == mesPPCutOutboundOrderDetail.MaterielCode && x.PalletCode == autoAssignStocks[j].PalletCode).Sum(x => x.AssignQuantity);//鍑哄簱璇︽儏宸插垎閰嶆暟閲�
 
-                float palletOutboundQuantity = autoAssignStocks[j].Details.Sum(x => x.OutboundQuantity);
-                if (palletAssignQuantity < palletOutboundQuantity)//濡傛灉鍑哄簱璇︽儏宸插垎閰嶆暟閲忓皬浜庢墭鐩樺凡鍒嗛厤鏁伴噺锛屽垯鍙互缁х画娣诲姞璇ユ墭鐩樺嚭搴撲俊鎭�
-                {
-                    float orderDetailNeedQuantity = mesPPCutOutboundOrderDetail.OrderQuantity - detailAssignQuantity;
-                    if (orderDetailNeedQuantity > autoAssignStocks[j].Details.Sum(x => x.OutboundQuantity) - palletAssignQuantity)
-                    {
-                        mesPPCutOutboundOrderDetail.LockQuantity += autoAssignStocks[j].Details.Sum(x => x.OutboundQuantity) - palletAssignQuantity;
-                        Dt_OutStockLockInfo outStockLockInfo = _outStockLockInfoService.GetOutStockLockInfo(mesPPOutboundOrder, mesPPCutOutboundOrderDetail, autoAssignStocks[j], autoAssignStocks[j].Details.Sum(x => x.OutboundQuantity) - palletAssignQuantity);
-                        outStockLockInfos.Add(outStockLockInfo);
-                    }
-                    else
-                    {
-                        Dt_OutStockLockInfo outStockLockInfo = _outStockLockInfoService.GetOutStockLockInfo(mesPPOutboundOrder, mesPPCutOutboundOrderDetail, autoAssignStocks[j], mesPPCutOutboundOrderDetail.OrderQuantity - mesPPCutOutboundOrderDetail.LockQuantity);
-                        outStockLockInfos.Add(outStockLockInfo);
-                        mesPPCutOutboundOrderDetail.LockQuantity = mesPPCutOutboundOrderDetail.OrderQuantity;
-                        break;
-                    }
-                }
-            }
-            locationInfos.AddRange(_basicService.LocationInfoService.Repository.GetLocationInfos(outStocks.Select(x => x.LocationCode).ToList()));
+        //        float palletOutboundQuantity = autoAssignStocks[j].Details.Sum(x => x.OutboundQuantity);
+        //        if (palletAssignQuantity < palletOutboundQuantity)//濡傛灉鍑哄簱璇︽儏宸插垎閰嶆暟閲忓皬浜庢墭鐩樺凡鍒嗛厤鏁伴噺锛屽垯鍙互缁х画娣诲姞璇ユ墭鐩樺嚭搴撲俊鎭�
+        //        {
+        //            float orderDetailNeedQuantity = mesPPCutOutboundOrderDetail.OrderQuantity - detailAssignQuantity;
+        //            if (orderDetailNeedQuantity > autoAssignStocks[j].Details.Sum(x => x.OutboundQuantity) - palletAssignQuantity)
+        //            {
+        //                mesPPCutOutboundOrderDetail.LockQuantity += autoAssignStocks[j].Details.Sum(x => x.OutboundQuantity) - palletAssignQuantity;
+        //                Dt_OutStockLockInfo outStockLockInfo = _outStockLockInfoService.GetOutStockLockInfo(mesPPOutboundOrder, mesPPCutOutboundOrderDetail, autoAssignStocks[j], autoAssignStocks[j].Details.Sum(x => x.OutboundQuantity) - palletAssignQuantity);
+        //                outStockLockInfos.Add(outStockLockInfo);
+        //            }
+        //            else
+        //            {
+        //                Dt_OutStockLockInfo outStockLockInfo = _outStockLockInfoService.GetOutStockLockInfo(mesPPOutboundOrder, mesPPCutOutboundOrderDetail, autoAssignStocks[j], mesPPCutOutboundOrderDetail.OrderQuantity - mesPPCutOutboundOrderDetail.LockQuantity);
+        //                outStockLockInfos.Add(outStockLockInfo);
+        //                mesPPCutOutboundOrderDetail.LockQuantity = mesPPCutOutboundOrderDetail.OrderQuantity;
+        //                break;
+        //            }
+        //        }
+        //    }
+        //    locationInfos.AddRange(_basicService.LocationInfoService.Repository.GetLocationInfos(outStocks.Select(x => x.LocationCode).ToList()));
 
-            return (outStocks, mesPPCutOutboundOrderDetail, outStockLockInfos, locationInfos);
-        }
+        //    return (outStocks, mesPPCutOutboundOrderDetail, outStockLockInfos, locationInfos);
+        //}
+  
     }
 }
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/OutStockLockInfoService.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/OutStockLockInfoService.cs"
index f4820b9..2e84bab 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/OutStockLockInfoService.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/OutStockLockInfoService.cs"
@@ -124,32 +124,37 @@
         /// <param name="assignQuantity"></param>
         /// <param name="taskNum"></param>
         /// <returns></returns>
-        public Dt_OutStockLockInfo GetOutStockLockInfo(Dt_MesPPCutOutboundOrder mesPPCutOutboundOrder,Dt_MesPPCutOutboundOrderDetail  mesPPCutOutboundOrderDetail, Dt_StockInfo outStock, float assignQuantity, int? taskNum = null)
+        public List<Dt_OutStockLockInfo> GetOutStockLockInfos(Dt_MesPPCutOutboundOrder mesPPCutOutboundOrder, Dt_MesPPCutOutboundOrderDetail mesPPCutOutboundOrderDetail, List<Dt_StockInfo> outStock, int? taskNum = null)
         {
+            List<Dt_OutStockLockInfo> outStockLockInfos = new List<Dt_OutStockLockInfo>();
 
-            Dt_OutStockLockInfo outStockLockInfo = new Dt_OutStockLockInfo()
+            foreach (var item in outStock)
             {
-                PalletCode = outStock.PalletCode,
-                AssignQuantity = assignQuantity,
-                MaterielCode = mesPPCutOutboundOrderDetail.MaterielCode,
-                BatchNo = outStock.Details.FirstOrDefault()?.BatchNo ?? "",
-                LocationCode = outStock.LocationCode,
-                MaterielName = mesPPCutOutboundOrderDetail.MaterielName,
-                OrderDetailId = mesPPCutOutboundOrderDetail.Id,
-                OrderNo = mesPPCutOutboundOrder.OrderNo,
-                OrderType = mesPPCutOutboundOrder.OrderType,
-                OriginalQuantity = outStock.Details.Where(x => x.MaterielCode == mesPPCutOutboundOrderDetail.MaterielCode).Sum(x => x.StockQuantity),
-                Status = taskNum == null ? OutLockStockStatusEnum.宸插垎閰�.ObjToInt() : OutLockStockStatusEnum.鍑哄簱涓�.ObjToInt(),
-                StockId = outStock.Id,
-                TaskNum = taskNum,
-                OrderQuantity = mesPPCutOutboundOrderDetail.OrderQuantity,
-                Unit = mesPPCutOutboundOrderDetail.Unit
-            };
+                Dt_OutStockLockInfo outStockLockInfo = new Dt_OutStockLockInfo()
+                {
+                    PalletCode = item.PalletCode,
+                    AssignQuantity = item.Details.Where(x => x.MaterielCode == mesPPCutOutboundOrderDetail.MaterielCode).Sum(x => x.OutboundQuantity),
+                    MaterielCode = mesPPCutOutboundOrderDetail.MaterielCode,
+                    BatchNo = item.Details.FirstOrDefault().BatchNo,
+                    LocationCode = item.LocationCode,
+                    MaterielName = mesPPCutOutboundOrderDetail.MaterielName,
+                    OrderDetailId = mesPPCutOutboundOrderDetail.Id,
+                    OrderNo = mesPPCutOutboundOrder.OrderNo,
+                    OrderType = mesPPCutOutboundOrder.OrderType,
+                    OriginalQuantity = item.Details.Where(x => x.MaterielCode == mesPPCutOutboundOrderDetail.MaterielCode).Sum(x => x.StockQuantity),
+                    Status = taskNum == null ? OutLockStockStatusEnum.宸插垎閰�.ObjToInt() : OutLockStockStatusEnum.鍑哄簱涓�.ObjToInt(),
+                    StockId = item.Id,
+                    TaskNum = taskNum,
+                    OrderQuantity = mesPPCutOutboundOrderDetail.OrderQuantity,
+                    Unit = mesPPCutOutboundOrderDetail.Unit
+                };
+                outStockLockInfos.Add(outStockLockInfo);
+            }
 
-            return outStockLockInfo;
+            return outStockLockInfos;
         }
 
-        public Dt_OutStockLockInfo GetOutStockLockInfo(Dt_MesPPOutboundOrder  mesPPOutboundOrder, Dt_StockInfo outStock, float assignQuantity, int? taskNum = null)
+        public Dt_OutStockLockInfo GetOutStockLockInfo(Dt_MesPPOutboundOrder mesPPOutboundOrder, Dt_StockInfo outStock, float assignQuantity, int? taskNum = null)
         {
 
             Dt_OutStockLockInfo outStockLockInfo = new Dt_OutStockLockInfo()
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundService.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundService.cs"
index eaaf4d8..034efde 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundService.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundService.cs"
@@ -19,20 +19,22 @@
 
         public IMesPPOutboundOrderService MesPPOutboundOrderService { get; }
 
-        public IMesPPOutboundOrderDetailService MesPPOutboundOrderDetailService { get; }
+        public IMesPPOutboundOrderDetailService  MesPPOutboundOrderDetailService { get; }
 
         public IMesPPCutOutboundOrderService MesPPCutOutboundOrderService { get; }
 
         public IMesPPCutOutboundOrderDetailService MesPPCutOutboundOrderDetailService { get; }
 
-        public OutboundService(IOutboundOrderDetailService outboundOrderDetailService,IMesPPOutboundOrderService mesPPOutboundOrderService, IOutboundOrderService outboundOrderService, IOutStockLockInfoService outboundStockLockInfoService, IMesOutboundOrderService mesOutboundOrderService)
+        public OutboundService(IOutboundOrderDetailService outboundOrderDetailService, IMesPPOutboundOrderDetailService mesPPOutboundOrderDetailService, IMesPPCutOutboundOrderDetailService mesPPCutOutboundOrderDetailService, IMesPPCutOutboundOrderService mesPPCutOutboundOrderService, IMesPPOutboundOrderService mesPPOutboundOrderService, IOutboundOrderService outboundOrderService, IOutStockLockInfoService outboundStockLockInfoService, IMesOutboundOrderService mesOutboundOrderService)
         {
             OutboundOrderDetailService = outboundOrderDetailService;
             OutboundOrderService = outboundOrderService;
             OutboundStockLockInfoService = outboundStockLockInfoService;
             MesOutboundOrderService = mesOutboundOrderService;
             MesPPOutboundOrderService = mesPPOutboundOrderService;
-
+            MesPPCutOutboundOrderService = mesPPCutOutboundOrderService;
+            MesPPCutOutboundOrderDetailService = mesPPCutOutboundOrderDetailService;
+            MesPPOutboundOrderDetailService = mesPPOutboundOrderDetailService;
         }
     }
 }
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoService.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoService.cs"
index 0892689..2df00a5 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoService.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoService.cs"
@@ -55,7 +55,7 @@
                     throw new Exception($"鏈壘鍒板嚭搴撳崟淇℃伅");
                 }
 
-                List<string> locationCodes = _basicRepository.LocationInfoRepository.GetCanOutLocationCodes(outboundOrder.WarehouseId);
+                List<string> locationCodes = _basicRepository.LocationInfoRepository.PPGetCanOutLocationCodes(outboundOrder.WarehouseId);
 
                 return BaseDal.QueryTabs<Dt_StockInfo, Dt_StockInfoDetail, StockSelectViewDTO>((a, b) => a.Id == b.StockId, (a, b) => new StockSelectViewDTO
                 {
@@ -115,6 +115,92 @@
                 return null;
             }
         }
+        /// <summary>
+        /// 鏌ヨ璁㈠崟PP绔嬪簱搴撳瓨瑙嗗浘
+        /// </summary>
+        /// <param name="orderId"></param>
+        /// <param name="materielCode"></param>
+        /// <returns></returns>
+        public List<PPStockSelectViewDTO> PPGetStockSelectViews(int orderId, string materielCode)
+        {
+            try
+            {
+                Dt_MesPPCutOutboundOrder mesPPCutOutboundOrder = _outboundRepository.MesPPCutOutboundOrderRepository.QueryFirst(x => x.Id == orderId);
+                if (mesPPCutOutboundOrder == null)
+                {
+                    throw new Exception($"鏈壘鍒板嚭搴撳崟淇℃伅");
+                }
+                List<string> locationCodes = _basicRepository.LocationInfoRepository.PPGetCanOutLocationCodes(mesPPCutOutboundOrder.WarehouseId);
+
+                return BaseDal.QueryTabs<Dt_StockInfo, Dt_StockInfoDetail, PPStockSelectViewDTO>((a, b) => a.Id == b.StockId, (a, b) => new PPStockSelectViewDTO
+                {
+                    LocationCode = a.LocationCode,
+                    MaterielCode = b.MaterielCode,
+                    MaterielName = b.MaterielName,
+                    PalletCode = a.PalletCode,
+                    Unit = b.Unit,
+                    CutedWidth = b.CutedWidth,
+                    UseableQuantity = b.StockQuantity - b.OutboundQuantity
+                }, a => locationCodes.Contains(a.LocationCode), b => b.StockQuantity > b.OutboundQuantity && b.MaterielCode == materielCode, x => true).GroupBy(x => x.PalletCode).Select(x => new PPStockSelectViewDTO
+                {
+                    LocationCode = x.FirstOrDefault()?.LocationCode ?? "",
+                    MaterielCode = x.FirstOrDefault()?.MaterielCode ?? "",
+                    MaterielName = x.FirstOrDefault()?.MaterielName ?? "",
+                    Unit = x.FirstOrDefault()?.Unit ?? "",
+                    CutedWidth = x.Sum(x => x.CutedWidth),
+                    PalletCode = x.Key,
+                    UseableQuantity = x.Sum(x => x.UseableQuantity)
+                }).ToList();
+            }
+            catch (Exception ex)
+            {
+
+                return null;
+            }
+        }
+
+        /// <summary>
+        /// 鏌ヨ璁㈠崟PP骞冲簱搴撳瓨瑙嗗浘
+        /// </summary>
+        /// <param name="orderId"></param>
+        /// <param name="materielCode"></param>
+        /// <returns></returns>
+        public List<PPStockSelectViewDTO> PPGetPKStockSelectViews(int orderId, string materielCode)
+        {
+            try
+            {
+                Dt_MesPPCutOutboundOrder outboundOrder = _outboundRepository.MesPPCutOutboundOrderRepository.QueryFirst(x => x.Id == orderId);
+                if (outboundOrder == null)
+                {
+                    throw new Exception($"鏈壘鍒板嚭搴撳崟淇℃伅");
+                }
+                return BaseDal.QueryTabs<Dt_StockInfo, Dt_StockInfoDetail, PPStockSelectViewDTO>((a, b) => a.Id == b.StockId && a.WarehouseId == outboundOrder.WarehouseId, (a, b) => new PPStockSelectViewDTO
+                {
+                    LocationCode = a.LocationCode,
+                    MaterielCode = b.MaterielCode,
+                    MaterielName = b.MaterielName,
+                    PalletCode = a.PalletCode,
+                    Unit = b.Unit,
+                    CutedWidth = b.CutedWidth,
+                    UseableQuantity = b.StockQuantity - b.OutboundQuantity
+                }, a => a.LocationCode.Contains("AGV_PP"), b => b.StockQuantity > b.OutboundQuantity && b.MaterielCode == materielCode, x => true).GroupBy(x => x.PalletCode).Select(x => new PPStockSelectViewDTO
+                {
+                    LocationCode = x.FirstOrDefault()?.LocationCode ?? "",
+                    MaterielCode = x.FirstOrDefault()?.MaterielCode ?? "",
+                    MaterielName = x.FirstOrDefault()?.MaterielName ?? "",
+                    Unit = x.FirstOrDefault()?.Unit ?? "",
+                    CutedWidth = x.Sum(x => x.CutedWidth),
+                    PalletCode = x.Key,
+                    UseableQuantity = x.Sum(x => x.UseableQuantity)
+                }).ToList();
+            }
+            catch (Exception ex)
+            {
+                return null;
+            }
+        }
+
+
 
         public WebResponseContent StockQueryData(SaveModel saveModel)
         {
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/MesTaskService.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/MesTaskService.cs"
index 6ca6a41..9fce273 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/MesTaskService.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/MesTaskService.cs"
@@ -28,6 +28,7 @@
 using System.Reflection.Metadata;
 using WIDESEA_DTO.Task;
 using WIDESEA_DTO.Stock;
+using SqlSugar;
 
 namespace WIDESEA_TaskInfoService
 {
@@ -530,7 +531,14 @@
                 List<Dt_MesPPOutboundOrderDetail> mesPPOutboundOrderDetail = new List<Dt_MesPPOutboundOrderDetail>();
                 foreach (var item in model.Carriers)
                 {
-                    mesPPOutboundOrderDetail.Add(_mapper.Map<Dt_MesPPOutboundOrderDetail>(item));
+                    //mesPPOutboundOrderDetail.Add(_mapper.Map<Dt_MesPPOutboundOrderDetail>(item));
+                    Dt_MesPPOutboundOrderDetail dt_MesPPOutboundOrderDetail = new Dt_MesPPOutboundOrderDetail
+                    {
+                        CarrierCode = item.CarrierCode,
+                        Warehouse = item.Warehouse,
+                        OrderDetailStatus = OrderDetailStatusEnum.New.ObjToInt()
+                    };
+                    mesPPOutboundOrderDetail.Add(dt_MesPPOutboundOrderDetail);
                 }
                 Dt_MesPPOutboundOrder mesOutboundOrder = new Dt_MesPPOutboundOrder()
                 {
@@ -542,8 +550,8 @@
                     Unit = model.Unit,//PP闇�瑕佽浆鎹㈡垚绫�(闇�姹傚钩鏂�(PNL鏁�*闈㈢Н)/瀹藉害)
                     Width = model.Width,
                     TargetAddressCode = model.TargetAddressCode,
-                    OrderType = TaskTypeEnum.MesHandPickOutbound.ObjToInt(),
                     OrderStatus = OutOrderStatusEnum.鏈紑濮�.ObjToInt(),
+                    OrderType = OutOrderTypeEnum.Issue.ObjToInt(),
                     WarehouseId = warehouse.WarehouseId,
                     Details = mesPPOutboundOrderDetail
                 };
@@ -555,7 +563,7 @@
                 //    List<Dt_OutStockLockInfo>? outStockLockInfos = null;
                 //    List<Dt_LocationInfo>? locationInfos = null;
                 //    {
-                (List<Dt_StockInfo>, Dt_MesPPOutboundOrder, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>) result = _outboundService.MesPPOutboundOrderService.AssignStockOutbound(mesOutboundOrder);
+                //(List<Dt_StockInfo>, Dt_MesPPOutboundOrder, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>) result = _outboundService.MesPPOutboundOrderService.AssignStockOutbound(mesOutboundOrder);
                 //        if (result.Item1 != null && result.Item1.Count > 0)
                 //        {
                 //            tasks = GetTasks(result.Item1, TaskTypeEnum.MesOutbound);
@@ -645,12 +653,14 @@
                 {
                     CreateType = OrderCreateTypeEnum.UpperSystemPush.ObjToInt(),
                     TaskNo = model.TaskNo,
-                    OrderType = TaskTypeEnum.MesOutbound.ObjToInt(),
+                    OrderType = OutOrderTypeEnum.Issue.ObjToInt(),
                     OrderStatus = OutOrderStatusEnum.鏈紑濮�.ObjToInt(),
                     WarehouseId = warehouse.WarehouseId,
                     Details = mesPPCutOutboundOrderDetail,
                 };
+                _unitOfWorkManage.BeginTran();
                 Db.InsertNav(mesPPOutboundOrder).Include(x => x.Details).ExecuteCommand();
+                _unitOfWorkManage.CommitTran();
                 #region
                 //List<Dt_Task> tasks = new List<Dt_Task>();
 
@@ -710,7 +720,7 @@
             }
             catch (Exception ex)
             {
-
+                _unitOfWorkManage.RollbackTran();
                 return MesResponseContent.Instance.Error(ex.Message);
             }
         }
@@ -895,7 +905,7 @@
                 {
                     content.Content = new
                     {
-                        MaterialCode= stock.MaterielCode,
+                        MaterialCode = stock.MaterielCode,
                         Quantity = stock.StockQuantity,
                         Unit = stock.Unit,
                         Warehouse = warehouse.WarehouseCode,
@@ -980,8 +990,11 @@
             return MesResponseContent.Instance.OK();
         }
 
+
+
+
         /// <summary>
-        /// 鐢熸垚鍑哄簱浠诲姟
+        /// 鐢熸垚PP澶у嵎鍑哄簱浠诲姟
         /// </summary>
         /// <param name="keys">鍑哄簱鍗曟槑缁嗕富閿�</param>
         /// <returns></returns>
@@ -996,7 +1009,7 @@
                 List<Dt_OutStockLockInfo> outStockLockInfos = new List<Dt_OutStockLockInfo>();
                 List<Dt_LocationInfo> locationInfos = new List<Dt_LocationInfo>();
 
-                (List<Dt_Task>, List<Dt_StockInfo>?, List<Dt_MesPPOutboundOrderDetail>?, List<Dt_OutStockLockInfo>?, List<Dt_LocationInfo>?) result = MESPPOutboundTaskDataHandle(keys);
+                (List<Dt_Task>, List<Dt_StockInfo>?, List<Dt_MesPPOutboundOrderDetail>?, List<Dt_OutStockLockInfo>?, List<Dt_LocationInfo>?, Dt_MesPPOutboundOrder mesPPOutboundOrder) result = MESPPOutboundTaskDataHandle(keys);
                 if (result.Item2 != null && result.Item2.Count > 0)
                 {
                     stockInfos.AddRange(result.Item2);
@@ -1017,13 +1030,131 @@
                 {
                     tasks.AddRange(result.Item1);
                 }
+                if (result.mesPPOutboundOrder != null)
+                {
 
-                WebResponseContent content = MESPPGenerateOutboundTaskDataUpdate(tasks, stockInfos, outboundOrderDetails, outStockLockInfos, locationInfos);
+                }
+
+                WebResponseContent content = MESPPGenerateOutboundTaskDataUpdate(tasks, stockInfos, outboundOrderDetails, outStockLockInfos, locationInfos, result.mesPPOutboundOrder);
                 return content;
             }
             catch (Exception ex)
             {
                 _unitOfWorkManage.RollbackTran();
+                return WebResponseContent.Instance.Error(ex.Message);
+            }
+        }
+
+        /// <summary>
+        /// PP澶у嵎鍑哄簱浠诲姟鏁版嵁澶勭悊
+        /// </summary>
+        /// <param name="orderDetailId"></param>
+        /// <param name="stockSelectViews"></param>
+        /// <returns></returns>
+        /// <exception cref="Exception"></exception>
+        public (List<Dt_Task>, List<Dt_StockInfo>?, List<Dt_MesPPOutboundOrderDetail>?, List<Dt_OutStockLockInfo>?, List<Dt_LocationInfo>?, Dt_MesPPOutboundOrder mesPPOutboundOrder) MESPPOutboundTaskDataHandle(int[] keys)
+        {
+            List<Dt_Task> tasks = new List<Dt_Task>();
+            List<Dt_MesPPOutboundOrderDetail> outboundOrderDetails = BaseDal.Db.Queryable<Dt_MesPPOutboundOrderDetail>().Where(x => keys.Contains(x.Id)).ToList();
+            if (outboundOrderDetails == null || outboundOrderDetails.Count == 0)
+            {
+                throw new Exception("鏈壘鍒板嚭搴撳崟鏄庣粏淇℃伅");
+            }
+            if (outboundOrderDetails.FirstOrDefault(x => x.OrderDetailStatus > OrderDetailStatusEnum.New.ObjToInt() && x.OrderDetailStatus != OrderDetailStatusEnum.AssignOverPartial.ObjToInt()) != null)
+            {
+                throw new Exception("鎵�閫夊嚭搴撳崟鏄庣粏瀛樺湪鍑哄簱涓垨宸插畬鎴�");
+            }
+            List<Dt_StockInfo>? stockInfos = null;
+            List<Dt_MesPPOutboundOrderDetail>? orderDetails = null;
+            List<Dt_OutStockLockInfo>? outStockLockInfos = null;
+            List<Dt_LocationInfo>? locationInfos = null;
+            Dt_MesPPOutboundOrder? mesPPOutboundOrders = null;
+            if (outboundOrderDetails.FirstOrDefault().OrderDetailStatus == OrderDetailStatusEnum.New.ObjToInt())
+            {
+                (List<Dt_StockInfo>, List<Dt_MesPPOutboundOrderDetail>, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>, Dt_MesPPOutboundOrder mesPPOutboundOrder) result = _outboundService.MesPPOutboundOrderDetailService.AssignStockOutbound(outboundOrderDetails);
+                if (result.Item1 != null && result.Item1.Count > 0)
+                {
+                    Dt_MesPPOutboundOrder outboundOrder = _outboundService.MesPPOutboundOrderService.Repository.QueryFirst(x => x.Id == outboundOrderDetails.FirstOrDefault().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.ForEach(x =>
+                    {
+                        x.OrderDetailStatus = OrderDetailStatusEnum.Outbound.ObjToInt();
+                    });
+                    result.Item3.ForEach(x =>
+                    {
+                        x.Status = OutLockStockStatusEnum.鍑哄簱涓�.ObjToInt();
+                    });
+
+                    stockInfos = result.Item1;
+                    orderDetails = result.Item2;
+                    outStockLockInfos = result.Item3;
+                    locationInfos = result.Item4;
+                    mesPPOutboundOrders = result.mesPPOutboundOrder;
+                }
+                else
+                {
+                    throw new Exception("鏃犲簱瀛�");
+                }
+            }
+            //else
+            //{
+            //    List<Dt_OutStockLockInfo> stockLockInfos = _outboundService.OutboundStockLockInfoService.GetByOrderDetailId(outboundOrderDetails.oi, OutLockStockStatusEnum.宸插垎閰�);
+            //    if (stockLockInfos != null && stockLockInfos.Count > 0)
+            //    {
+            //        List<Dt_StockInfo> stocks = _stockService.StockInfoService.Repository.GetStockInfosByPalletCodes(stockLockInfos.Select(x => x.PalletCode).Distinct().ToList());
+            //        tasks = GetTasks(stocks);
+            //    }
+            //}
+
+            return (tasks, stockInfos, orderDetails, outStockLockInfos, locationInfos, mesPPOutboundOrders);
+        }
+
+        /// <summary>
+        /// PP骞冲簱鐩存帴鍑哄簱
+        /// </summary>
+        /// <param name="orderDetailId"></param>
+        /// <param name="stockSelectViews"></param>
+        /// <returns></returns>
+        public WebResponseContent PPGeneratePKOutboundTask(int orderDetailId, List<PPStockSelectViewDTO> stockSelectViews)
+        {
+            try
+            {
+                (List<Dt_Task>, List<Dt_StockInfo>?, List<Dt_MesPPCutOutboundOrderDetail>?, List<Dt_OutStockLockInfo>?, List<Dt_LocationInfo>?) result = PPOutboundTaskDataHandle(orderDetailId, stockSelectViews);
+
+                WebResponseContent content = PPGenerateOutboundTaskDataUpdate(result.Item1, result.Item2, result.Item3, result.Item4, result.Item5);
+
+                return content;
+            }
+            catch (Exception ex)
+            {
+                return WebResponseContent.Instance.Error(ex.Message);
+            }
+        }
+        /// <summary>
+        /// PP绔嬪簱灏忓嵎鐩存帴鍑哄簱
+        /// </summary>
+        /// <param name="orderDetailId"></param>
+        /// <param name="stockSelectViews"></param>
+        /// <returns></returns>
+        public WebResponseContent PPCutOutGenerateOutboundTasks(int orderDetailId, List<PPStockSelectViewDTO> stockSelectViews)
+        {
+            try
+            {
+                (List<Dt_Task>, List<Dt_StockInfo>?, List<Dt_MesPPCutOutboundOrderDetail>?, List<Dt_OutStockLockInfo>?, List<Dt_LocationInfo>?) result = PPOutboundTaskDataHandle(orderDetailId, stockSelectViews);
+
+                WebResponseContent content = PPGenerateOutboundTaskDataUpdate(result.Item1, result.Item2, result.Item3, result.Item4, result.Item5);
+
+                return content;
+            }
+            catch (Exception ex)
+            {
                 return WebResponseContent.Instance.Error(ex.Message);
             }
         }
@@ -1035,85 +1166,68 @@
         /// <param name="stockSelectViews"></param>
         /// <returns></returns>
         /// <exception cref="Exception"></exception>
-        public (List<Dt_Task>, List<Dt_StockInfo>?, List<Dt_MesPPOutboundOrderDetail>?, List<Dt_OutStockLockInfo>?, List<Dt_LocationInfo>?) MESPPOutboundTaskDataHandle(int[] keys)
+        public (List<Dt_Task>, List<Dt_StockInfo>?, List<Dt_MesPPCutOutboundOrderDetail>?, List<Dt_OutStockLockInfo>?, List<Dt_LocationInfo>?) PPOutboundTaskDataHandle(int orderDetailId, List<PPStockSelectViewDTO> stockSelectViews)
         {
             List<Dt_Task> tasks = new List<Dt_Task>();
-            //List<Dt_MesPPOutboundOrderDetail> outboundOrderDetailss = _outboundService.MesPPOutboundOrderDetailService.Repository.QueryData(x => keys.Contains(x.Id));
+            Dt_MesPPCutOutboundOrderDetail outboundOrderDetail = _outboundService.MesPPCutOutboundOrderDetailService.Repository.QueryFirst(x => x.Id == orderDetailId);
 
-            //List<Dt_MesPPOutboundOrderDetail> outboundOrderDetails = BaseDal.Db.Queryable<Dt_MesPPOutboundOrderDetail>().Where(x => keys.Contains(x.Id)).ToList();
-            //List<Dt_MesPPOutboundOrder> mesPPOutboundOrder = BaseDal.Db.Queryable<Dt_MesPPOutboundOrder>().Where(x => keys.Contains(10)).ToList();
-            Dt_MesPPOutboundOrderDetail outboundOrderDetails = BaseDal.Db.Queryable<Dt_MesPPOutboundOrderDetail>().Where(x => keys.Contains(x.Id)).First();
-            Dt_MesPPOutboundOrder mesPPOutboundOrder = BaseDal.Db.Queryable<Dt_MesPPOutboundOrder>().Where(x => x.Id == 10).First();
-            //if (outboundOrderDetails == null || outboundOrderDetails.Count == 0)
-            //{
-            //    throw new Exception("鏈壘鍒板嚭搴撳崟鏄庣粏淇℃伅");
-            //}
-            //if (outboundOrderDetails.FirstOrDefault(x => x.OrderDetailStatus > OrderDetailStatusEnum.New.ObjToInt() && x.OrderDetailStatus != OrderDetailStatusEnum.AssignOverPartial.ObjToInt()) != null)
-            //{
-            //    throw new Exception("鎵�閫夊嚭搴撳崟鏄庣粏瀛樺湪鍑哄簱涓垨宸插畬鎴�");
-            //}
+            if (outboundOrderDetail == null)
+            {
+                throw new Exception("鏈壘鍒板嚭搴撳崟鏄庣粏淇℃伅");
+            }
+
+            if (stockSelectViews.Sum(x => x.UseableQuantity) > outboundOrderDetail.OrderQuantity - outboundOrderDetail.LockQuantity)
+            {
+                throw new Exception("閫夋嫨鏁伴噺瓒呭嚭鍗曟嵁鏁伴噺");
+            }
             List<Dt_StockInfo>? stockInfos = null;
-            List<Dt_MesPPOutboundOrderDetail>? orderDetails = null;
+            Dt_MesPPCutOutboundOrderDetail? orderDetail = null;
             List<Dt_OutStockLockInfo>? outStockLockInfos = null;
             List<Dt_LocationInfo>? locationInfos = null;
-            //if (outboundOrderDetails == OrderDetailStatusEnum.New.ObjToInt())
+            if (outboundOrderDetail.OrderDetailStatus == OrderDetailStatusEnum.New.ObjToInt())
             {
-                //(List<Dt_StockInfo>, Dt_MesPPOutboundOrder, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>) result = _outboundService.MesPPOutboundOrderService.AssignStockOutbound(mesPPOutboundOrder);
-                //(List<Dt_StockInfo>, List<Dt_MesPPOutboundOrderDetail>, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>) result = _outboundService.MesPPOutboundOrderDetailService.AssignStockOutbound(outboundOrderDetails);
-                (List<Dt_StockInfo>, Dt_MesPPOutboundOrderDetail, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>) result1 = _outboundService.MesPPOutboundOrderDetailService.AssignStockOutbound(outboundOrderDetails);
-                //if (result.Item1 != null && result.Item1.Count > 0)
-                //{
-                //    Dt_MesPPOutboundOrder outboundOrder = _outboundService.MesPPOutboundOrderService.Repository.QueryFirst(x => x.Id == outboundOrderDetails.FirstOrDefault().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.ForEach(x =>
-                //    {
-                //        x.OrderDetailStatus = OrderDetailStatusEnum.Outbound.ObjToInt();
-                //    });
-                //    result.Item3.ForEach(x =>
-                //    {
-                //        x.Status = OutLockStockStatusEnum.鍑哄簱涓�.ObjToInt();
-                //    });
+                (List<Dt_StockInfo>, Dt_MesPPCutOutboundOrderDetail, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>) result = _outboundService.MesPPCutOutboundOrderDetailService.AssignStockOutbound(outboundOrderDetail, stockSelectViews);
+                if (result.Item1 != null && result.Item1.Count > 0)
+                {
+                    Dt_MesPPCutOutboundOrder outboundOrder = _outboundService.MesPPCutOutboundOrderService.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, TaskTypeEnum.Outbound);
+                    result.Item2.OrderDetailStatus = OrderDetailStatusEnum.Outbound.ObjToInt();
+                    result.Item3.ForEach(x =>
+                    {
+                        x.Status = OutLockStockStatusEnum.鍑哄簱涓�.ObjToInt();
+                    });
 
-                //    stockInfos = result.Item1;
-                //    orderDetails = result.Item2;
-                //    outStockLockInfos = result.Item3;
-                //    locationInfos = result.Item4;
-                //}
-                //else
-                //{
-                //    throw new Exception("鏃犲簱瀛�");
-                //}
+                    stockInfos = result.Item1;
+                    orderDetail = result.Item2;
+                    outStockLockInfos = result.Item3;
+                    locationInfos = result.Item4;
+                }
+                else
+                {
+                    throw new Exception("鏃犲簱瀛�");
+                }
             }
-            //else
-            //{
-            //    List<Dt_OutStockLockInfo> stockLockInfos = _outboundService.OutboundStockLockInfoService.GetByOrderDetailId(outboundOrderDetail.OrderId, OutLockStockStatusEnum.宸插垎閰�);
-            //    if (stockLockInfos != null && stockLockInfos.Count > 0)
-            //    {
-            //        List<Dt_StockInfo> stocks = _stockService.StockInfoService.Repository.GetStockInfosByPalletCodes(stockLockInfos.Select(x => x.PalletCode).Distinct().ToList());
-            //        tasks = GetTasks(stocks);
-            //    }
-            //}
+            else
+            {
+                List<Dt_OutStockLockInfo> stockLockInfos = _outboundService.OutboundStockLockInfoService.GetByOrderDetailId(outboundOrderDetail.OrderId, OutLockStockStatusEnum.宸插垎閰�);
+                if (stockLockInfos != null && stockLockInfos.Count > 0)
+                {
+                    List<Dt_StockInfo> stocks = _stockService.StockInfoService.Repository.GetStockInfosByPalletCodes(stockLockInfos.Select(x => x.PalletCode).Distinct().ToList());
+                    tasks = GetTasks(stocks, TaskTypeEnum.Outbound);
+                }
+            }
 
-            return (tasks, stockInfos, orderDetails, outStockLockInfos, locationInfos);
+            return (tasks, stockInfos, orderDetail == null ? null : new List<Dt_MesPPCutOutboundOrderDetail> { 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 MESPPGenerateOutboundTaskDataUpdate(List<Dt_Task> tasks, List<Dt_StockInfo>? stockInfos = null, List<Dt_MesPPOutboundOrderDetail>? outboundOrderDetails = null, List<Dt_OutStockLockInfo>? outStockLockInfos = null, List<Dt_LocationInfo>? locationInfos = null)
+        public WebResponseContent PPGenerateOutboundTaskDataUpdate(List<Dt_Task> tasks, List<Dt_StockInfo>? stockInfos = null, List<Dt_MesPPCutOutboundOrderDetail>? outboundOrderDetails = null, List<Dt_OutStockLockInfo>? outStockLockInfos = null, List<Dt_LocationInfo>? locationInfos = null)
         {
             try
             {
@@ -1126,7 +1240,224 @@
                     {
                         x.StockStatus = StockStatusEmun.鍑哄簱閿佸畾.ObjToInt();
                     });
-                    WebResponseContent content = _outboundService.MesPPOutboundOrderDetailService.LockOutboundStockDataUpdate(stockInfos, outboundOrderDetails, outStockLockInfos, locationInfos, tasks: tasks);
+                    WebResponseContent content = _outboundService.MesPPCutOutboundOrderDetailService.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();
+                    });
+
+                    _outboundService.MesPPCutOutboundOrderDetailService.Repository.UpdateData(outboundOrderDetails);
+                }
+                _unitOfWorkManage.CommitTran();
+                PushTasksToWCS(tasks);
+                return WebResponseContent.Instance.OK();
+            }
+            catch (Exception ex)
+            {
+                _unitOfWorkManage.RollbackTran();
+                return WebResponseContent.Instance.Error(ex.Message);
+            }
+
+        }
+        #region
+        /// <summary>
+        /// 鐢熸垚PP灏忓嵎鍑哄簱浠诲姟
+        /// </summary>
+        /// <param name="keys">鍑哄簱鍗曟槑缁嗕富閿�</param>
+        /// <returns></returns>
+        //public WebResponseContent PPCutOutGenerateOutboundTasks(int[] keys)
+        //{
+        //    try
+        //    {
+        //        List<Dt_Task> tasks = new List<Dt_Task>();
+        //        List<StockSelectViewDTO> stockSelectViews = new List<StockSelectViewDTO>();
+        //        List<Dt_StockInfo> stockInfos = new List<Dt_StockInfo>();
+        //        List<Dt_MesPPCutOutboundOrderDetail> outboundOrderDetails = new List<Dt_MesPPCutOutboundOrderDetail>();
+        //        List<Dt_OutStockLockInfo> outStockLockInfos = new List<Dt_OutStockLockInfo>();
+        //        List<Dt_LocationInfo> locationInfos = new List<Dt_LocationInfo>();
+
+        //        (List<Dt_Task>, List<Dt_StockInfo>?, List<Dt_MesPPCutOutboundOrderDetail>?, List<Dt_OutStockLockInfo>?, List<Dt_LocationInfo>?) result = PPCutOutboundTaskDataHandle(keys);
+        //        if (result.Item2 != null && result.Item2.Count > 0)
+        //        {
+        //            stockInfos.AddRange(result.Item2);
+        //        }
+        //        if (result.Item3 != null && result.Item3.Count > 0)
+        //        {
+        //            outboundOrderDetails.AddRange(result.Item3);
+        //        }
+        //        if (result.Item4 != null && result.Item4.Count > 0)
+        //        {
+        //            outStockLockInfos.AddRange(result.Item4);
+        //        }
+        //        if (result.Item5 != null && result.Item5.Count > 0)
+        //        {
+        //            locationInfos.AddRange(result.Item5);
+        //        }
+        //        if (result.Item1 != null && result.Item1.Count > 0)
+        //        {
+        //            tasks.AddRange(result.Item1);
+        //        }
+
+        //        WebResponseContent content = PPCutOutGenerateOutboundTaskDataUpdate(tasks, stockInfos, outboundOrderDetails, outStockLockInfos, locationInfos);
+        //        return content;
+        //    }
+        //    catch (Exception ex)
+        //    {
+        //        _unitOfWorkManage.RollbackTran();
+        //        return WebResponseContent.Instance.Error(ex.Message);
+        //    }
+        //}
+
+        ///// <summary>
+        ///// PP灏忓嵎鍑哄簱浠诲姟鏁版嵁澶勭悊
+        ///// </summary>
+        ///// <param name="orderDetailId"></param>
+        ///// <param name="stockSelectViews"></param>
+        ///// <returns></returns>
+        ///// <exception cref="Exception"></exception>
+        //public (List<Dt_Task>, List<Dt_StockInfo>?, List<Dt_MesPPCutOutboundOrderDetail>?, List<Dt_OutStockLockInfo>?, List<Dt_LocationInfo>?) PPCutOutboundTaskDataHandle(int[] keys)
+        //{
+        //    List<Dt_Task> tasks = new List<Dt_Task>();
+        //    List<Dt_MesPPCutOutboundOrderDetail> outboundOrderDetails = BaseDal.Db.Queryable<Dt_MesPPCutOutboundOrderDetail>().Where(x => keys.Contains(x.Id)).ToList();
+        //    if (outboundOrderDetails == null || outboundOrderDetails.Count == 0)
+        //    {
+        //        throw new Exception("鏈壘鍒板嚭搴撳崟鏄庣粏淇℃伅");
+        //    }
+        //    if (outboundOrderDetails.FirstOrDefault(x => x.OrderDetailStatus > OrderDetailStatusEnum.New.ObjToInt() && x.OrderDetailStatus != OrderDetailStatusEnum.AssignOverPartial.ObjToInt()) != null)
+        //    {
+        //        throw new Exception("鎵�閫夊嚭搴撳崟鏄庣粏瀛樺湪鍑哄簱涓垨宸插畬鎴�");
+        //    }
+        //    List<Dt_StockInfo>? stockInfos = null;
+        //    List<Dt_MesPPCutOutboundOrderDetail>? orderDetails = null;
+        //    List<Dt_OutStockLockInfo>? outStockLockInfos = null;
+        //    List<Dt_LocationInfo>? locationInfos = null;
+        //    if (outboundOrderDetails.FirstOrDefault().OrderDetailStatus == OrderDetailStatusEnum.New.ObjToInt())
+        //    {
+        //        (List<Dt_StockInfo>, List<Dt_MesPPCutOutboundOrderDetail>, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>) result = _outboundService.MesPPCutOutboundOrderDetailService.AssignStockOutbound(outboundOrderDetails);
+        //        if (result.Item1 != null && result.Item1.Count > 0)
+        //        {
+        //            Dt_MesPPCutOutboundOrder outboundOrder = _outboundService.MesPPCutOutboundOrderService.Repository.QueryFirst(x => x.Id == outboundOrderDetails.FirstOrDefault().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, TaskTypeEnum.MesOutbound);
+        //            result.Item2.ForEach(x =>
+        //            {
+        //                x.OrderDetailStatus = OrderDetailStatusEnum.Outbound.ObjToInt();
+        //            });
+        //            result.Item3.ForEach(x =>
+        //            {
+        //                x.Status = OutLockStockStatusEnum.鍑哄簱涓�.ObjToInt();
+        //            });
+
+        //            stockInfos = result.Item1;
+        //            orderDetails = result.Item2;
+        //            outStockLockInfos = result.Item3;
+        //            locationInfos = result.Item4;
+        //        }
+        //        else
+        //        {
+        //            throw new Exception("鏃犲簱瀛�");
+        //        }
+        //    }
+        //    //else
+        //    //{
+        //    //    List<Dt_OutStockLockInfo> stockLockInfos = _outboundService.OutboundStockLockInfoService.GetByOrderDetailId(outboundOrderDetails.OrderId, OutLockStockStatusEnum.宸插垎閰�);
+        //    //    if (stockLockInfos != null && stockLockInfos.Count > 0)
+        //    //    {
+        //    //        List<Dt_StockInfo> stocks = _stockService.StockInfoService.Repository.GetStockInfosByPalletCodes(stockLockInfos.Select(x => x.PalletCode).Distinct().ToList());
+        //    //        tasks = GetTasks(stocks);
+        //    //    }
+        //    //}
+
+        //    return (tasks, stockInfos, orderDetails, outStockLockInfos, locationInfos);
+        //}
+
+        ///// <summary>
+        ///// 鐢熸垚PP灏忓嵎鍑哄簱浠诲姟鍚庢暟鎹洿鏂板埌鏁版嵁搴�
+        ///// </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 PPCutOutGenerateOutboundTaskDataUpdate(List<Dt_Task> tasks, List<Dt_StockInfo>? stockInfos = null, List<Dt_MesPPCutOutboundOrderDetail>? 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();
+        //            });
+        //            WebResponseContent content = _outboundService.MesPPCutOutboundOrderDetailService.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();
+        //            });
+
+        //            _outboundService.MesPPCutOutboundOrderDetailService.Repository.UpdateData(outboundOrderDetails);
+        //        }
+        //        _unitOfWorkManage.CommitTran();
+        //        PushTasksToWCS(tasks,"AGV_PP");
+        //        return WebResponseContent.Instance.OK();
+        //    }
+        //    catch (Exception ex)
+        //    {
+        //        _unitOfWorkManage.RollbackTran();
+        //        return WebResponseContent.Instance.Error(ex.Message);
+        //    }
+        //}
+        #endregion
+        /// <summary>
+        /// 鐢熸垚PP澶у嵎鍑哄簱浠诲姟鍚庢暟鎹洿鏂板埌鏁版嵁搴�
+        /// </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 MESPPGenerateOutboundTaskDataUpdate(List<Dt_Task> tasks, List<Dt_StockInfo>? stockInfos = null, List<Dt_MesPPOutboundOrderDetail>? outboundOrderDetails = null, List<Dt_OutStockLockInfo>? outStockLockInfos = null, List<Dt_LocationInfo>? locationInfos = null, Dt_MesPPOutboundOrder? mesPPOutboundOrder = 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();
+                    });
+                    WebResponseContent content = _outboundService.MesPPOutboundOrderDetailService.LockOutboundStockDataUpdate(mesPPOutboundOrder, stockInfos, outboundOrderDetails, outStockLockInfos, locationInfos, tasks: tasks);
 
                     if (!content.Status)
                     {
@@ -1152,8 +1483,10 @@
                 _unitOfWorkManage.RollbackTran();
                 return WebResponseContent.Instance.Error(ex.Message);
             }
-
         }
 
+
+
+
     }
 }
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs"
index b53fad2..0c76b61 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs"
@@ -189,7 +189,7 @@
                 {
                     CurrentAddress = stationCode,
                     Grade = 0,
-                    NextAddress ="",
+                    NextAddress = "",
                     PalletCode = palletCode,
                     Roadway = warehouse.Remark,//鏌ヨ瀵瑰簲绾胯竟浠撳湴鍧�宸烽亾鍙�
                     SourceAddress = stationCode,
@@ -201,7 +201,7 @@
                 };
                 _unitOfWorkManage.BeginTran();
                 BaseDal.AddData(newTask);
-                PushTasksToWCS(new List<Dt_Task> { newTask});
+                PushTasksToWCS(new List<Dt_Task> { newTask });
                 _unitOfWorkManage.CommitTran();
                 return WebResponseContent.Instance.OK();
             }
@@ -431,7 +431,7 @@
                 List<Dt_OutStockLockInfo> outStockLockInfos = _outboundService.OutboundStockLockInfoService.Repository.QueryData(x => x.TaskNum == taskNum);
                 List<Dt_OutboundOrderDetail> outboundOrderDetails = new List<Dt_OutboundOrderDetail>();
                 List<Dt_MesOutboundOrder> mesOutboundOrders = new List<Dt_MesOutboundOrder>();
-
+                List<Dt_MesPPOutboundOrder> mesPPOutboundOrders = new List<Dt_MesPPOutboundOrder>();
                 if ((outStockLockInfos == null || outStockLockInfos.Count == 0) && warehouse.WarehouseCode != WarehouseEnum.HA64.ToString() && (task.TaskType != TaskTypeEnum.OutEmpty.ObjToInt()))
                 {
                     return WebResponseContent.Instance.Error($"鏈壘鍒板嚭搴撹鎯呬俊鎭�");
@@ -451,6 +451,20 @@
                                     mesOutboundOrder.OrderStatus = OrderDetailStatusEnum.Over.ObjToInt();
                                 }
                                 mesOutboundOrders.Add(mesOutboundOrder);
+                            }
+                        }
+                        //PP鍑哄簱浠诲姟瀹屾垚鍒ゆ柇銆傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘��
+                        else if (task.TaskType == TaskTypeEnum.Outbound.ObjToInt() && warehouse.WarehouseCode == WarehouseEnum.HA58.ToString())
+                        {
+                            Dt_MesPPOutboundOrder mesPPOutboundOrder = _outboundService.MesPPOutboundOrderService.Repository.QueryFirst(x => x.OrderNo == item.OrderNo);
+                            if (mesPPOutboundOrder != null)
+                            {
+                                mesPPOutboundOrder.OverOutQuantity = item.AssignQuantity;
+                                if (mesPPOutboundOrder.OverOutQuantity == mesPPOutboundOrder.OrderQuantity)
+                                {
+                                    mesPPOutboundOrder.OrderStatus = OrderDetailStatusEnum.Over.ObjToInt();
+                                }
+                                mesPPOutboundOrders.Add(mesPPOutboundOrder);
                             }
                         }
                         else
@@ -506,6 +520,15 @@
                 _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfo, (LocationStatusEnum)beforeStatus, LocationStatusEnum.Free, LocationChangeType.OutboundCompleted, stockInfo.Details.FirstOrDefault()?.OrderNo ?? "", task.TaskNum);
                 _unitOfWorkManage.CommitTran();
 
+                //PP鍑哄簱浠诲姟瀹屾垚鍒ゆ柇銆傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘�傘��
+                if (warehouse.WarehouseCode == WarehouseEnum.HA58.ToString() && task.TaskType == TaskTypeEnum.Outbound.ObjToInt())
+                {
+                    _outboundService.MesPPOutboundOrderService.Repository.UpdateData(mesPPOutboundOrders);
+                    MesMaterialLotaAceptModel model = GetMesMaterialLotaAceptModel(stockInfo, stockInfo.Details.FirstOrDefault(), mesPPOutboundOrders.FirstOrDefault().TaskNo, warehouse.WarehouseCode, stockInfo.Details.Where(x => x.MaterielCode == mesPPOutboundOrders.FirstOrDefault().MaterialCode).Sum(x => x.StockQuantity));
+                    UploadMesMaterialLotaAcept(model);
+                    _stockService.StockInfoService.Repository.DeleteAndMoveIntoHty(stockInfo, App.User.UserId == 0 ? OperateTypeEnum.鑷姩瀹屾垚 : OperateTypeEnum.浜哄伐瀹屾垚);
+                    _stockService.StockInfoDetailService.Repository.DeleteAndMoveIntoHty(stockInfo.Details, App.User.UserId == 0 ? OperateTypeEnum.鑷姩瀹屾垚 : OperateTypeEnum.浜哄伐瀹屾垚);
+                }
                 if (warehouse.WarehouseCode != WarehouseEnum.HA64.ToString() && task.TaskType == TaskTypeEnum.Outbound.ObjToInt())
                 {
                     _outboundService.OutboundOrderService.TestOutUpload(outboundOrderDetails.FirstOrDefault().OrderId, outStockLockInfos);
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/MES/MesController.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/MES/MesController.cs"
index 7082f41..18d085b 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/MES/MesController.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/MES/MesController.cs"
@@ -12,6 +12,8 @@
 using WIDESEA_DTO.ERP;
 using WIDESEA_DTO.MES;
 using WIDESEA_Core.Helper;
+using Autofac.Core;
+using WIDESEA_DTO.Stock;
 
 namespace WIDESEA_WMSServer.Controllers.MES
 {
@@ -169,5 +171,51 @@
         {
             return _taskService.BagInfoSync(model.Content);
         }
+        /// <summary>
+        /// 鐢熸垚MESPP浠撳ぇ鍗峰嚭搴撲换鍔�
+        /// </summary>
+        /// <param name="keys"></param>
+        /// <returns></returns>
+        [HttpPost, HttpGet, Route("MESPPGenerateOutboundTasks"), AllowAnonymous]
+        public WebResponseContent MESPPGenerateOutboundTasks([FromBody] int[] keys)
+        {
+            return _taskService.MESPPGenerateOutboundTasks(keys);
+        }
+
+        /// <summary>
+        /// 鐢熸垚MESPP浠撳皬鍗峰嚭搴撲换鍔�
+        /// </summary>
+        /// <param name="keys"></param>
+        /// <returns></returns>
+        //[HttpPost, HttpGet, Route("PPCutOutGenerateOutboundTasks"), AllowAnonymous]
+        //public WebResponseContent PPCutOutGenerateOutboundTasks([FromBody] int[] keys)
+        //{
+        //    return _taskService.PPCutOutGenerateOutboundTasks(keys);
+        //}
+
+        /// <summary>
+        /// 鐢熸垚鍑哄簱浠诲姟
+        /// </summary>
+        /// <param name="orderDetailId"></param>
+        /// <param name="stockSelectViews"></param>
+        /// <returns></returns>
+        [HttpPost, HttpGet, Route("PPCutOutGenerateOutboundTasks"), AllowAnonymous]
+        public WebResponseContent PPCutOutGenerateOutboundTasks(int orderDetailId, [FromBody] List<PPStockSelectViewDTO> stockSelectViews)
+        {
+            return _taskService.PPCutOutGenerateOutboundTasks(orderDetailId, stockSelectViews);
+        }
+
+        /// <summary>
+        /// PP骞冲簱鐩存帴鍑哄簱
+        /// </summary>
+        /// <param name="orderDetailId"></param>
+        /// <param name="stockSelectViews"></param>
+        /// <returns></returns>
+        [HttpPost, HttpGet, Route("PPGeneratePKOutboundTask"), AllowAnonymous]
+        public WebResponseContent PPGeneratePKOutboundTask(int orderDetailId, [FromBody] List<PPStockSelectViewDTO> stockSelectViews)
+        {
+            return _taskService.PPGeneratePKOutboundTask(orderDetailId, stockSelectViews);
+        }
+
     }
 }
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Outbound/MesPPOutboundOrderDetailController.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Outbound/MesPPOutboundOrderDetailController.cs"
index 16d16df..b603c4e 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Outbound/MesPPOutboundOrderDetailController.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Outbound/MesPPOutboundOrderDetailController.cs"
@@ -1,12 +1,19 @@
-锘縰sing Microsoft.AspNetCore.Mvc;
+锘縰sing Autofac.Core;
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
+using WIDESEA_Core;
 using WIDESEA_Core.BaseController;
+using WIDESEA_DTO.Inbound;
+using WIDESEA_DTO.MES;
+using WIDESEA_DTO.Outbound;
 using WIDESEA_IOutboundService;
 using WIDESEA_Model.Models;
 
 namespace WIDESEA_WMSServer.Controllers.Outbound
 {
     /// <summary>
-    /// MES鍑哄簱鍗�
+    /// PP浠撳ぇ鍗稭ES鍑哄簱鍗�
     /// </summary>
     [Route("api/mesPPOutboundOrderDetail")]
     [ApiController]
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Stock/StockInfoController.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Stock/StockInfoController.cs"
index a06defd..d4db578 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Stock/StockInfoController.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Stock/StockInfoController.cs"
@@ -47,6 +47,29 @@
         }
 
         /// <summary>
+        /// 鏌ヨPP绔嬪簱搴撳瓨瑙嗗浘
+        /// </summary>
+        /// <param name="orderId"></param>
+        /// <param name="materlCode"></param>
+        /// <returns></returns>
+        [HttpPost, HttpGet, Route("PPGetStockSelectViews")]
+        public List<PPStockSelectViewDTO> PPGetStockSelectViews(int orderId, string materielCode)
+        {
+            return Service.PPGetStockSelectViews(orderId, materielCode);
+        }
+
+        /// <summary>
+        /// 鏌ヨ璁㈠崟PP骞冲簱搴撳瓨瑙嗗浘
+        /// </summary>
+        /// <param name="orderId"></param>
+        /// <param name="materielCode"></param>
+        /// <returns></returns>
+        [HttpPost, HttpGet, Route("PPGetPKStockSelectViews")]
+        public List<PPStockSelectViewDTO> PPGetPKStockSelectViews(int orderId, string materielCode)
+        {
+            return Service.PPGetPKStockSelectViews(orderId, materielCode);
+        }
+        /// <summary>
         /// 鏍规嵁鎵樼洏鍜屽簱鍖烘煡璇㈠簱瀛樹俊鎭�
         /// </summary>
         /// <param name="saveModel"></param>
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/TaskInfo/TaskController.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/TaskInfo/TaskController.cs"
index 8116ffe..f814880 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/TaskInfo/TaskController.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/TaskInfo/TaskController.cs"
@@ -176,16 +176,16 @@
         {
             return Service.GenerateOutboundTasks(keys);
         }
-        /// <summary>
-        /// 鐢熸垚MESPP浠撳ぇ鍗峰嚭搴撲换鍔�
-        /// </summary>
-        /// <param name="keys"></param>
-        /// <returns></returns>
-        [HttpPost, HttpGet, Route("MESPPGenerateOutboundTasks"), AllowAnonymous]
-        public WebResponseContent MESPPGenerateOutboundTasks([FromBody] int[] keys)
-        {
-            return Service.MESPPGenerateOutboundTasks(keys);
-        }
+        ///// <summary>
+        ///// 鐢熸垚MESPP浠撳ぇ鍗峰嚭搴撲换鍔�
+        ///// </summary>
+        ///// <param name="keys"></param>
+        ///// <returns></returns>
+        //[HttpPost, HttpGet, Route("MESPPGenerateOutboundTasks"), AllowAnonymous]
+        //public WebResponseContent MESPPGenerateOutboundTasks([FromBody] int[] keys)
+        //{
+        //    return Service.MESPPGenerateOutboundTasks(keys);
+        //}
         /// <summary>
         /// 鍑哄簱浠诲姟瀹屾垚
         /// </summary>
diff --git "a/\351\241\271\347\233\256\350\265\204\346\226\231/\350\256\276\345\244\207\345\215\217\350\256\256/\345\271\262\350\206\234\344\273\223\345\240\206\345\236\233\346\234\272\351\200\232\344\277\241\345\215\217\350\256\256.xlsx" "b/\351\241\271\347\233\256\350\265\204\346\226\231/\350\256\276\345\244\207\345\215\217\350\256\256/\345\271\262\350\206\234\344\273\223\345\240\206\345\236\233\346\234\272\351\200\232\344\277\241\345\215\217\350\256\256.xlsx"
index 20cf897..7cb5643 100644
--- "a/\351\241\271\347\233\256\350\265\204\346\226\231/\350\256\276\345\244\207\345\215\217\350\256\256/\345\271\262\350\206\234\344\273\223\345\240\206\345\236\233\346\234\272\351\200\232\344\277\241\345\215\217\350\256\256.xlsx"
+++ "b/\351\241\271\347\233\256\350\265\204\346\226\231/\350\256\276\345\244\207\345\215\217\350\256\256/\345\271\262\350\206\234\344\273\223\345\240\206\345\236\233\346\234\272\351\200\232\344\277\241\345\215\217\350\256\256.xlsx"
Binary files differ

--
Gitblit v1.9.3