From 9ec715d2deb18a269dd49c48da91a36632d08c81 Mon Sep 17 00:00:00 2001
From: wangxinhui <wangxinhui@hnkhzn.com>
Date: 星期三, 18 六月 2025 00:56:26 +0800
Subject: [PATCH] 最新代码上传,优化功能等

---
 代码管理/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs |  725 ++++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 659 insertions(+), 66 deletions(-)

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 3edf979..4f51249 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"
@@ -32,6 +32,7 @@
 using WIDESEA_Core.BaseServices;
 using WIDESEA_Core.Enums;
 using WIDESEA_Core.Helper;
+using WIDESEA_DTO;
 using WIDESEA_DTO.Inbound;
 using WIDESEA_DTO.MES;
 using WIDESEA_DTO.Stock;
@@ -40,6 +41,7 @@
 using WIDESEA_External.Model;
 using WIDESEA_IBasicRepository;
 using WIDESEA_IBasicService;
+using WIDESEA_ICheckRepository;
 using WIDESEA_IInboundRepository;
 using WIDESEA_IInboundService;
 using WIDESEA_IOutboundRepository;
@@ -50,6 +52,7 @@
 using WIDESEA_ITaskInfoRepository;
 using WIDESEA_ITaskInfoService;
 using WIDESEA_Model.Models;
+using WIDESEA_OutboundRepository;
 using WIDESEA_TaskInfoRepository;
 
 namespace WIDESEA_TaskInfoService
@@ -69,7 +72,11 @@
         private readonly IInboundRepository _inboundRepository;
         private readonly IInboundOrderService _inboundOrderService;
         private readonly IPalletTypeInfoRepository _palletTypeInfoRepository;
-
+        private readonly IOutProStockInfoRepository _outProStockInfoRepository;
+        private readonly IOutboundRepository _outboundRepository;
+        private readonly IProInStatisticsRepository _proInStatisticsRepository;
+        private readonly IProInStatisticsService _proInStatisticsService;
+        private readonly ICheckOrderRepository _checkOrderRepository;
         public ITaskRepository Repository => BaseDal;
 
         private Dictionary<string, OrderByType> _taskOrderBy = new()
@@ -82,7 +89,7 @@
 
         public List<int> TaskOutboundTypes => typeof(TaskTypeEnum).GetEnumIndexList();
 
-        public TaskService(ITaskRepository BaseDal, IMapper mapper, IUnitOfWorkManage unitOfWorkManage, IStockRepository stockRepository, IBasicService basicService, IRecordService recordService, IOutboundService outboundService, IStockService stockService, IBasicRepository basicRepository, IApiInfoRepository apiInfoRepository, IInvokeERPService invokeERPService, IInboundRepository inboundRepository, IInboundOrderService inboundOrderService, IPalletTypeInfoRepository palletTypeInfoRepository) : base(BaseDal)
+        public TaskService(ITaskRepository BaseDal, IMapper mapper, IUnitOfWorkManage unitOfWorkManage, IStockRepository stockRepository, IBasicService basicService, IRecordService recordService, IOutboundService outboundService, IStockService stockService, IBasicRepository basicRepository, IApiInfoRepository apiInfoRepository, IInvokeERPService invokeERPService, IInboundRepository inboundRepository, IInboundOrderService inboundOrderService, IPalletTypeInfoRepository palletTypeInfoRepository, IOutProStockInfoRepository outProStockInfoRepository, IOutboundRepository outboundRepository, IProInStatisticsRepository proInStatisticsRepository, IProInStatisticsService proInStatisticsService, ICheckOrderRepository checkOrderRepository) : base(BaseDal)
         {
             _mapper = mapper;
             _unitOfWorkManage = unitOfWorkManage;
@@ -97,13 +104,18 @@
             _inboundRepository = inboundRepository;
             _inboundOrderService = inboundOrderService;
             _palletTypeInfoRepository = palletTypeInfoRepository;
+            _outProStockInfoRepository = outProStockInfoRepository;
+            _outboundRepository = outboundRepository;
+            _proInStatisticsRepository = proInStatisticsRepository;
+            _proInStatisticsService = proInStatisticsService;
+            _checkOrderRepository = checkOrderRepository;
         }
 
         /// <summary>
         /// 浠诲姟淇℃伅鎺ㄩ�佽嚦WCS
         /// </summary>
         /// <returns></returns>
-        public WebResponseContent PushTasksToWCS(List<Dt_Task> tasks, string agvDescription = "")
+        public WebResponseContent PushTasksToWCS(List<Dt_Task> tasks, string agvDescription = "",string agvtaskNum="")
         {
             try
             {
@@ -111,8 +123,14 @@
                 taskDTOs.ForEach(x =>
                 {
                     x.AGVArea = agvDescription;
+                    x.AGVTaskNum = agvtaskNum;
                 });
-                string response = HttpHelper.Post("http://127.0.0.1:9281/api/Task/ReceiveTask", taskDTOs.Serialize());
+                string url = AppSettings.Get("WCS");
+                if (string.IsNullOrEmpty(url))
+                {
+                    return WebResponseContent.Instance.Error($"鏈壘鍒癢CSApi鍦板潃,璇锋鏌ラ厤缃枃浠�");
+                }
+                string response = HttpHelper.Post($"{url}/api/Task/ReceiveTask", taskDTOs.Serialize());
 
                 return JsonConvert.DeserializeObject<WebResponseContent>(response) ?? WebResponseContent.Instance.Error("杩斿洖閿欒");
             }
@@ -126,16 +144,85 @@
         /// </summary>
         /// <param name="code"></param>
         /// <returns></returns>
-        public WebResponseContent PutFinish(string code)
+        public WebResponseContent PutFinish(string code, string barCode = "", string taskNum = "")
         {
             try
             {
-                string response = HttpHelper.Post("http://127.0.0.1:9281/api/CTU_AGV/PutFinish", code);
+                string url = AppSettings.Get("WCS");
+                if (string.IsNullOrEmpty(url))
+                {
+                    return WebResponseContent.Instance.Error($"鏈壘鍒癢CSAApi鍦板潃,璇锋鏌ラ厤缃枃浠�");
+                }
+                string response = HttpHelper.Post($"{url}/api/CTU_AGV/PutFinish?code={code}&barCode={barCode}&taskNum={taskNum}" );
 
                 return JsonConvert.DeserializeObject<WebResponseContent>(response) ?? WebResponseContent.Instance.Error("杩斿洖閿欒");
             }
             catch (Exception ex)
             {
+                return WebResponseContent.Instance.Error(ex.Message);
+            }
+        }
+
+        public WebResponseContent AGVTasks(SaveModel saveModel)
+        {
+            try
+            {
+                var palletCode = saveModel.MainData["barcode"].ToString();
+                var stationCode = saveModel.MainData["address"].ToString();
+                var warehouseId = saveModel.MainData["warehouseId"].ObjToInt();
+                Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseId == warehouseId);
+                if (warehouse == null)
+                {
+                    return WebResponseContent.Instance.Error("鏈壘鍒板簱鍖�");
+                }
+
+                Dt_Task task = Repository.QueryFirst(x => x.PalletCode == palletCode && x.WarehouseId == warehouseId);
+                if (task != null)
+                {
+                    return WebResponseContent.Instance.Error($"璇ユ墭鐩樺凡鐢熸垚浠诲姟");
+                }
+                if (Repository.QueryFirst(x => x.SourceAddress == stationCode && x.TaskStatus == TaskStatusEnum.New.ObjToInt()) != null && warehouse.WarehouseCode != WarehouseEnum.HA58.ToString())
+                {
+                    return WebResponseContent.Instance.Error($"璇ョ珯鐐瑰凡鏈夋湭鎵ц鐨勪换鍔�");
+                }
+                Dt_StockInfo stockInfo = _stockRepository.StockInfoRepository.Db.Queryable<Dt_StockInfo>().Where(x => x.PalletCode == palletCode).Includes(x => x.Details).First();
+                if (stockInfo == null)
+                {
+                    return WebResponseContent.Instance.Error($"鏈壘鍒扮粍鐩樹俊鎭�");
+                }
+                if (stockInfo.StockStatus != StockStatusEmun.鍑哄簱瀹屾垚.ObjToInt())
+                {
+                    return WebResponseContent.Instance.Error($"璇ユ墭鐩樼姸鎬佷笉姝g‘");
+                }
+                if (warehouseId != stockInfo.WarehouseId)
+                {
+                    return WebResponseContent.Instance.Error($"浠撳簱涓嶆纭�");
+                }
+                Dt_Task newTask = new Dt_Task()
+                {
+                    CurrentAddress = stationCode,
+                    Grade = 0,
+                    NextAddress = "",
+                    PalletCode = palletCode,
+                    Roadway = warehouse.Remark,//鏌ヨ瀵瑰簲绾胯竟浠撳湴鍧�宸烽亾鍙�
+                    SourceAddress = stationCode,
+                    TargetAddress = "",
+                    TaskType = TaskTypeEnum.OutAllocate.ObjToInt(),
+                    TaskStatus = TaskStatusEnum.New.ObjToInt(),
+                    WarehouseId = stockInfo.WarehouseId,
+                    PalletType = stockInfo.PalletType,
+                    MaterielCode = stockInfo.Details.Where(x => x.StockId == stockInfo.Id).FirstOrDefault()?.MaterielCode,
+                    Quantity = (float)stockInfo.Details.Where(x => x.StockId == stockInfo.Id).FirstOrDefault()?.StockQuantity,
+                };
+                _unitOfWorkManage.BeginTran();
+                BaseDal.AddData(newTask);
+                PushTasksToWCS(new List<Dt_Task> { newTask });
+                _unitOfWorkManage.CommitTran();
+                return WebResponseContent.Instance.OK();
+            }
+            catch (Exception ex)
+            {
+                _unitOfWorkManage.RollbackTran();
                 return WebResponseContent.Instance.Error(ex.Message);
             }
         }
@@ -154,7 +241,11 @@
                 {
                     return WebResponseContent.Instance.Error($"鏈壘鍒拌浠诲姟淇℃伅");
                 }
-
+                Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseId == task.WarehouseId);
+                if (warehouse.WarehouseType==WarehouseTypEnum.鎴愬搧.ToString())
+                {
+                    return InProductCompleted(task);
+                }
                 Dt_StockInfo stockInfo = _stockRepository.StockInfoRepository.Db.Queryable<Dt_StockInfo>().Where(x => x.PalletCode == task.PalletCode && x.WarehouseId == task.WarehouseId).Includes(x => x.Details).First();
                 if (stockInfo == null)
                 {
@@ -170,7 +261,18 @@
                 {
                     return WebResponseContent.Instance.Error($"鏈壘鍒拌鎵樼洏搴撳瓨鏄庣粏淇℃伅");
                 }
-
+                #region 绌烘墭閫�搴�
+                if (task.TaskType == TaskTypeEnum.MesPalletLargeReturn.ObjToInt() || task.TaskType == TaskTypeEnum.MesPalletSmallReturn.ObjToInt())
+                {
+                    task.TaskStatus = TaskStatusEnum.Finish.ObjToInt();
+                    _unitOfWorkManage.BeginTran();
+                    BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId > 0 ? OperateTypeEnum.浜哄伐瀹屾垚 : OperateTypeEnum.鑷姩瀹屾垚);
+                    _stockService.StockInfoService.Repository.DeleteAndMoveIntoHty(stockInfo, App.User.UserId == 0 ? OperateTypeEnum.鑷姩瀹屾垚 : OperateTypeEnum.浜哄伐瀹屾垚);
+                    _stockService.StockInfoDetailService.Repository.DeleteAndMoveIntoHty(stockInfo.Details, App.User.UserId == 0 ? OperateTypeEnum.鑷姩瀹屾垚 : OperateTypeEnum.浜哄伐瀹屾垚);
+                    _unitOfWorkManage.CommitTran();
+                    return WebResponseContent.Instance.OK();
+                }
+                #endregion
                 Dt_LocationInfo locationInfo = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == task.TargetAddress);
                 if (locationInfo == null)
                 {
@@ -184,19 +286,22 @@
 
                 LocationStatusEnum lastStatus = (LocationStatusEnum)locationInfo.LocationStatus;
                 locationInfo.LocationStatus = LocationStatusEnum.InStock.ObjToInt();
-                Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseId == task.WarehouseId);
-
+                
                 stockInfo.LocationCode = locationInfo.LocationCode;
-
-                #region 绌虹鍏ュ簱
-                if (stockInfo.PalletType == PalletTypeEnum.Empty.ObjToInt())
+                #region 绌虹鍏ュ簱/鎷i�夊洖搴�/鐢熶骇閫�鏂�
+                if (task.TaskType == TaskTypeEnum.InEmpty.ObjToInt() || task.TaskType == TaskTypeEnum.InPick.ObjToInt() || (task.TaskType == TaskTypeEnum.ProductionReturn.ObjToInt() && warehouse.WarehouseCode == WarehouseEnum.HA64.ToString()))
                 {
                     stockInfo.StockStatus = StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt();
-                    task.TaskStatus = (int)TaskStatusEnum.Finish;
+                    task.TaskStatus = TaskStatusEnum.Finish.ObjToInt();
+                    stockInfo.Details.ForEach(x =>
+                    {
+                        x.Status = StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt();
+                    });
                     _unitOfWorkManage.BeginTran();
                     BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId > 0 ? OperateTypeEnum.浜哄伐瀹屾垚 : OperateTypeEnum.鑷姩瀹屾垚);
                     _basicService.LocationInfoService.UpdateLocationStatus(locationInfo, stockInfo.PalletType, LocationStatusEnum.InStock, stockInfo.WarehouseId);
                     _stockRepository.StockInfoRepository.UpdateData(stockInfo);
+                    _stockRepository.StockInfoDetailRepository.UpdateData(stockInfo.Details);
                     _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfo, lastStatus, LocationStatusEnum.InStock, LocationChangeType.InboundCompleted);
                     _unitOfWorkManage.CommitTran();
                     return WebResponseContent.Instance.OK();
@@ -204,61 +309,62 @@
                 #endregion
 
                 Dt_InboundOrder? inboundOrder = _inboundRepository.InboundOrderRepository.Db.Queryable<Dt_InboundOrder>().Where(x => x.InboundOrderNo == stockInfo.Details.FirstOrDefault().OrderNo).Includes(x => x.Details).First();
-                List<Dt_InboundOrderDetail> inboundOrderDetails = new List<Dt_InboundOrderDetail>();
-                List<ERPInboundDetailModel> detailModels = new List<ERPInboundDetailModel>();
-                if (stockInfo.StockStatus == StockStatusEmun.鍏ュ簱纭.ObjToInt())
+                Dt_InboundOrderDetail? inboundOrderDetail = null;
+                Dt_ReturnOrder? returnOrder = null;
+                //鏍囧噯鍏ュ簱娴佺▼鏌ユ壘鍏ュ簱鍗曟嵁
+                if (inboundOrder != null && stockInfo.StockStatus == StockStatusEmun.鍏ュ簱纭.ObjToInt())
                 {
-                    if (inboundOrder == null)
-                    {
-                        return WebResponseContent.Instance.Error($"瀵瑰簲鍏ュ簱鍗曚笉瀛樺湪");
-                    }
+                    //鏌ヨ鍘熷畬鎴愮殑鍏ュ簱鏄庣粏鏁伴噺
+                    int overCount = inboundOrder.Details.Where(x => x.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()).ToList().Count;
+                    inboundOrderDetail = inboundOrder.Details.FirstOrDefault(x => x.RowNo == stockInfo.Details.FirstOrDefault()?.InboundOrderRowNo);
                     foreach (var item in stockInfo.Details)
                     {
-                        Dt_InboundOrderDetail? inboundOrderDetail = inboundOrder.Details.FirstOrDefault(x => x.RowNo == item.InboundOrderRowNo);
                         if (inboundOrderDetail == null)
                         {
                             continue;
                         }
-                        ERPInboundDetailModel detailModel = new ERPInboundDetailModel()
-                        {
-                            ExpiryDate = item.EffectiveDate ?? "",
-                            LocationCode = warehouse.WarehouseCode,
-                            MaterialsCode = item.MaterielCode,
-                            MfgDate = item.ProductionDate ?? "",
-                            QtyCustoms = "0",
-                            Quantity = item.StockQuantity.ToString(),
-                            Rack = stockInfo.LocationCode,
-                            ReceiptCode = inboundOrder.UpperOrderNo,
-                            ReceiptSerNo = item.InboundOrderRowNo.ToString()
-                        };
-                        inboundOrderDetail.OverInQuantity += detailModel.Quantity.ObjToInt();
+                        inboundOrderDetail.OverInQuantity += item.StockQuantity;
                         if (inboundOrderDetail.OverInQuantity == inboundOrderDetail.OrderQuantity)
                         {
                             inboundOrderDetail.OrderDetailStatus = OrderDetailStatusEnum.Over.ObjToInt();
+                            overCount += 1;
                         }
-                        inboundOrderDetails.Add(inboundOrderDetail);
-                        detailModels.Add(detailModel);
+                        else if (inboundOrderDetail.OrderDetailStatus == OrderDetailStatusEnum.New.ObjToInt())
+                        {
+                            inboundOrderDetail.OrderDetailStatus = OrderDetailStatusEnum.Inbounding.ObjToInt();
+                        }
                     }
-
-                    //鍏ュ簱鏄庣粏鏂板瀹屾垚鏁伴噺
-                    int newCount = inboundOrderDetails.Select(x => x.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()).ToList().Count;
-                    //鍏ュ簱鏄庣粏鍘熷畬鎴愭暟閲�
-                    int oldCount = inboundOrder.Details.Select(x => x.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()).ToList().Count;
-                    if (inboundOrder.Details.Count == (newCount + oldCount))
+                    if (inboundOrder.Details.Count == overCount)
                     {
                         inboundOrder.OrderStatus = InOrderStatusEnum.鍏ュ簱瀹屾垚.ObjToInt();
+                        //鍒ゆ柇鏄惁涓洪��鏂欏叆搴撳崟
+                        if (inboundOrder.OrderType == InOrderTypeEnum.Return.ObjToInt())
+                        {
+                            returnOrder = _inboundRepository.ReturnOrderRepository.Db.Queryable<Dt_ReturnOrder>().Where(x => x.OrderNo == inboundOrder.UpperOrderNo).Includes(x => x.Details).First();
+                            returnOrder.ReturnOrderStatus = ReturnOrderStatusEnum.Returned.ObjToInt();
+                            foreach (var item in inboundOrder.Details)
+                            {
+                                Dt_ReturnOrderDetail returnOrderDetail = returnOrder.Details?.FirstOrDefault(x => x.MCode == item.MaterielCode);
+                                if (returnOrderDetail != null)
+                                {
+                                    returnOrderDetail.OverReturnQty = item.OverInQuantity;
+                                    returnOrderDetail.OrderDetailStatus = ReturnOrderStatusEnum.Returned.ObjToInt();
+                                }
+                            }
+                        }
                     }
-                    
+                    else if (inboundOrder.OrderStatus == InOrderStatusEnum.鏈紑濮�.ObjToInt())
+                    {
+                        inboundOrder.OrderStatus = InOrderStatusEnum.鍏ュ簱涓�.ObjToInt();
+                    }
                 }
-
                 if ((stockInfo.StockStatus == StockStatusEmun.鍏ュ簱纭.ObjToInt() || stockInfo.StockStatus == StockStatusEmun.鎵嬪姩缁勭洏鍏ュ簱纭.ObjToInt()) && warehouse.WarehouseCode == WarehouseEnum.HA64.ToString())
                 {
                     foreach (var model in stockInfo.Details)
                     {
-                        TestSynStock(new TestToolSynInfo() { ToolCode = model.BatchNo, /*MaterialName = model.MaterielName,*/ Life = int.TryParse(model.Remark, out int val) ? val : 1000 });
+                        TestSynStock(new TestToolSynInfo() { ToolCode = model.BatchNo, MaterialName = model.MaterielName, Life = int.TryParse(model.Remark, out int val) ? val : 1000 });
                     }
                 }
-
                 //娴嬭瘯鏋跺叆搴撳簱瀛樼姸鎬�
                 if (task.TaskType == TaskTypeEnum.Inbound.ObjToInt() && warehouse.WarehouseCode == WarehouseEnum.HA64.ToString() && stockInfo.StockStatus != StockStatusEmun.鎵嬪姩缁勭洏鍏ュ簱纭.ObjToInt())
                 {
@@ -267,14 +373,14 @@
                 else
                 {
                     stockInfo.StockStatus = StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt();
-
                 }
                 stockInfo.Details.ForEach(x =>
                 {
                     x.Status = StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt();
                 });
                 //鏇存柊浠诲姟鐘舵��
-                task.TaskStatus = (int)TaskStatusEnum.Finish;
+                task.TaskStatus = TaskStatusEnum.Finish.ObjToInt();
+                FeedBackWCSTaskCompleted(taskNum);
                 _unitOfWorkManage.BeginTran();
                 BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId > 0 ? OperateTypeEnum.浜哄伐瀹屾垚 : OperateTypeEnum.鑷姩瀹屾垚);
                 _basicService.LocationInfoService.UpdateLocationStatus(locationInfo, stockInfo.PalletType, LocationStatusEnum.InStock, stockInfo.WarehouseId);
@@ -282,15 +388,28 @@
                 _stockRepository.StockInfoDetailRepository.UpdateData(stockInfo.Details);
                 _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfo, lastStatus, LocationStatusEnum.InStock, LocationChangeType.InboundCompleted);
                 _recordService.StockQuantityChangeRecordService.AddStockChangeRecord(stockInfo, stockInfo.Details, stockInfo.Details.Sum(x => x.StockQuantity), stockInfo.Details.Sum(x => x.StockQuantity), StockChangeTypeEnum.Inbound, taskNum);
-                if (inboundOrder != null)
+                if (inboundOrder != null && inboundOrderDetail != null)
                 {
-                    _inboundRepository.InboundOrderDetailRepository.UpdateData(inboundOrderDetails);
                     _inboundRepository.InboundOrderRepository.UpdateData(inboundOrder);
+                    _inboundRepository.InboundOrderDetailRepository.UpdateData(inboundOrderDetail);
+                }
+                if (returnOrder != null)
+                {
+                    _inboundRepository.ReturnOrderRepository.UpdateData(returnOrder);
+                    _inboundRepository.ReturnOrderDetailRepository.UpdateData(returnOrder.Details);
                 }
                 _unitOfWorkManage.CommitTran();
-                if (stockInfo.StockStatus == StockStatusEmun.鍏ュ簱纭.ObjToInt())
+                //瀛樺湪鍏ュ簱鍗曞苟鐘舵�佷负瀹屾垚鐘舵�佹帹閫佽嚦ERP
+                if (inboundOrder != null && inboundOrder.OrderStatus == InOrderStatusEnum.鍏ュ簱瀹屾垚.ObjToInt() && inboundOrder.OrderType != InOrderTypeEnum.Allocat.ObjToInt())
                 {
-                    _inboundOrderService.FeedbackInboundOrder(stockInfo, inboundOrder, detailModels);
+                    if (inboundOrder.OrderType == InOrderTypeEnum.Return.ObjToInt() && returnOrder!=null)
+                    {
+                        _inboundOrderService.FeedbackReturnOrder(inboundOrder, returnOrder);
+                    }
+                    else if(inboundOrderDetail != null)
+                    {
+                        _inboundOrderService.FeedbackInboundOrder(inboundOrder.Id);
+                    }
                 }
                 return WebResponseContent.Instance.OK();
             }
@@ -300,7 +419,183 @@
                 return WebResponseContent.Instance.Error(ex.Message);
             }
         }
+        /// <summary>
+        /// 鎴愬搧浠撳叆搴撲换鍔″畬鎴�
+        /// </summary>
+        public WebResponseContent InProductCompleted(Dt_Task task)
+        {
+            WebResponseContent content=new WebResponseContent();
+            try
+            {
+                switch (task.TaskType)
+                {
+                    case (int)TaskTypeEnum.EmptyProductBack:
+                        content = EmptyProBackCompleted(task);
+                        break;
+                    case (int)TaskTypeEnum.InProduct:
+                        content = InProCompleted(task);
+                        break;
+                    case (int)TaskTypeEnum.InProductBack:
+                        content = InProBackCompleted(task);
+                        break;
+                    default:
+                        content.Error("鏈煡浠诲姟绫诲瀷");
+                        break;
+                }
+            }
+            catch (Exception ex)
+            {
+                _unitOfWorkManage.RollbackTran();
+                content.Error(ex.Message);
+            }
+            return content;
+        }
+        public WebResponseContent EmptyProBackCompleted(Dt_Task task)
+        {
+            WebResponseContent content = new WebResponseContent();
+            try
+            {
+                //鏇存柊鍏ュ簱鐘舵��
+                task.TaskStatus = TaskStatusEnum.Finish.ObjToInt();
+                _unitOfWorkManage.BeginTran();
+                BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId > 0 ? OperateTypeEnum.浜哄伐瀹屾垚 : OperateTypeEnum.鑷姩瀹屾垚);
+                _unitOfWorkManage.CommitTran();
+                content.OK();
+            }
+            catch (Exception ex)
+            {
+                _unitOfWorkManage.RollbackTran();
+                content.Error(ex.Message);
+            }
+            return content;
+        }
+        /// <summary>
+        /// MES鍐呭寘鍏ュ簱浠诲姟瀹屾垚
+        /// </summary>
+        /// <param name="task"></param>
+        /// <returns></returns>
+        public WebResponseContent InProCompleted(Dt_Task task)
+        {
+            WebResponseContent content = new WebResponseContent();
+            try
+            {
+                //鑾峰彇缁勭洏淇℃伅
+                Dt_ProStockInfo proStockInfo = _stockRepository.ProStockInfoRepository.Db.Queryable<Dt_ProStockInfo>().Where(x => x.PalletCode == task.PalletCode).Includes(x => x.proStockInfoDetails).First();
+                if (proStockInfo == null)
+                {
+                    return content.Error($"鏈壘鍒拌兌妗嗕负{task.PalletCode}缁勭洏淇℃伅");
+                }
+                Dt_LocationInfo locationInfo = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == task.TargetAddress);
+                if (locationInfo == null)
+                {
+                    return WebResponseContent.Instance.Error($"鏈壘鍒扮洰鏍囪揣浣嶄俊鎭�");
+                }
+                if (locationInfo.LocationStatus == LocationStatusEnum.InStock.ObjToInt())
+                {
+                    return WebResponseContent.Instance.Error($"璐т綅鐘舵�佷笉姝g‘");
+                }
+                LocationStatusEnum lastStatus = (LocationStatusEnum)locationInfo.LocationStatus;
+                locationInfo.LocationStatus = LocationStatusEnum.InStock.ObjToInt();
+                proStockInfo.LocationCode = locationInfo.LocationCode;
+                //鑾峰彇MES鍏ュ簱鍗曟嵁
+                Dt_MesProInOrder mesProInOrder = _inboundRepository.MesProInOrderRepository.Db.Queryable<Dt_MesProInOrder>().Where(x => x.BatchNo == task.PalletCode && x.MesProStatus == InOrderStatusEnum.鍏ュ簱涓�.ObjToInt()).Includes(x => x.Details).OrderByDescending(x => x.Id).First();
+                if (mesProInOrder == null || mesProInOrder.Details == null || mesProInOrder.Details.Count <= 0)
+                {
+                    return content.Error("鏈壘鍒癕ES鍐呭寘鍗曟嵁淇℃伅");
+                }
+                //杩涜鍗曟嵁澶勭悊
+                mesProInOrder.MesProStatus = InOrderStatusEnum.鍏ュ簱瀹屾垚.ObjToInt();
+                mesProInOrder.Details.ForEach(x =>
+                {
+                    x.OverInQuantity = x.OKPCSQTY;
+                });
+                proStockInfo.StockStatus = StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt();
+                proStockInfo.proStockInfoDetails.ForEach(x =>
+                {
+                    x.ProOutDetailStatus = StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt();
+                });
 
+                #region todo:涓存椂鏇存柊鎵�鏈夌爺鍙戣浆鎴愬搧
+                proStockInfo.ProStockAttribute=ProStockAttributeEnum.鎴愬搧.ObjToInt();
+                proStockInfo.WarehouseId = locationInfo.WarehouseId;
+                #endregion
+                //鏇存柊鍏ュ簱鐘舵��
+                task.TaskStatus = TaskStatusEnum.Finish.ObjToInt();
+                _unitOfWorkManage.BeginTran();
+                BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId > 0 ? OperateTypeEnum.浜哄伐瀹屾垚 : OperateTypeEnum.鑷姩瀹屾垚);
+                _basicService.LocationInfoService.UpdateLocationStatus(locationInfo, proStockInfo.PalletType, LocationStatusEnum.InStock, locationInfo.WarehouseId);
+                _stockRepository.ProStockInfoRepository.UpdateData(proStockInfo);
+                _stockRepository.ProStockInfoDetailRepository.UpdateData(proStockInfo.proStockInfoDetails);
+                _inboundRepository.MesProInOrderRepository.UpdateData(mesProInOrder);
+                _inboundRepository.MesProInOrderDetailRepository.UpdateData(mesProInOrder.Details);
+                _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfo, lastStatus, LocationStatusEnum.InStock, LocationChangeType.InboundCompleted);
+                _unitOfWorkManage.CommitTran();
+                ////涓婁紶ERP
+                //_inboundOrderService.FeedbackProIn(mesProInOrder);
+                content.OK();
+            }
+            catch (Exception ex)
+            {
+                _unitOfWorkManage.RollbackTran();
+                content.Error(ex.Message);
+            }
+            return content;
+        }
+        /// <summary>
+        /// 鎴愬搧浣欐枡閫�搴撲换鍔″畬鎴�
+        /// </summary>
+        /// <param name="task"></param>
+        /// <returns></returns>
+        public WebResponseContent InProBackCompleted(Dt_Task task)
+        {
+            WebResponseContent content = new WebResponseContent();
+            try
+            {
+                //鑾峰彇缁勭洏淇℃伅
+                Dt_ProStockInfo proStockInfo = _stockRepository.ProStockInfoRepository.Db.Queryable<Dt_ProStockInfo>().Where(x => x.PalletCode == task.PalletCode).Includes(x => x.proStockInfoDetails).First();
+                if (proStockInfo == null)
+                {
+                    return content.Error($"鏈壘鍒拌兌妗嗕负{task.PalletCode}缁勭洏淇℃伅");
+                }
+                Dt_LocationInfo locationInfo = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == task.TargetAddress);
+                if (locationInfo == null)
+                {
+                    return content.Error($"鏈壘鍒扮洰鏍囪揣浣嶄俊鎭�");
+                }
+                if (locationInfo.LocationStatus == LocationStatusEnum.InStock.ObjToInt())
+                {
+                    return content.Error($"璐т綅鐘舵�佷笉姝g‘");
+                }
+                if (proStockInfo.StockStatus!=StockStatusEmun.鎴愬搧浣欐枡鍥炲簱.ObjToInt())
+                {
+                    return content.Error($"鑳舵{proStockInfo.PalletCode}搴撳瓨鐘舵�佷笉姝g‘");
+                }
+                LocationStatusEnum lastStatus = (LocationStatusEnum)locationInfo.LocationStatus;
+                locationInfo.LocationStatus = LocationStatusEnum.InStock.ObjToInt();
+                proStockInfo.LocationCode = locationInfo.LocationCode;
+                proStockInfo.StockStatus = StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt();
+                proStockInfo.proStockInfoDetails.ForEach(x =>
+                {
+                    x.ProOutDetailStatus = StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt();
+                });
+                //鏇存柊鍏ュ簱鐘舵��
+                task.TaskStatus = TaskStatusEnum.Finish.ObjToInt();
+                _unitOfWorkManage.BeginTran();
+                BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId > 0 ? OperateTypeEnum.浜哄伐瀹屾垚 : OperateTypeEnum.鑷姩瀹屾垚);
+                _basicService.LocationInfoService.UpdateLocationStatus(locationInfo, proStockInfo.PalletType, LocationStatusEnum.InStock, locationInfo.WarehouseId);
+                _stockRepository.ProStockInfoRepository.UpdateData(proStockInfo);
+                _stockRepository.ProStockInfoDetailRepository.UpdateData(proStockInfo.proStockInfoDetails);
+                _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfo, lastStatus, LocationStatusEnum.InStock, LocationChangeType.InboundCompleted);
+                _unitOfWorkManage.CommitTran();
+                content.OK();
+            }
+            catch (Exception ex)
+            {
+                _unitOfWorkManage.RollbackTran();
+                content.Error(ex.Message);
+            }
+            return content;
+        }
         /// <summary>
         /// 鍑哄簱浠诲姟瀹屾垚
         /// </summary>
@@ -315,7 +610,12 @@
                 {
                     return WebResponseContent.Instance.Error($"鏈壘鍒颁换鍔′俊鎭�");
                 }
-
+                Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseId == task.WarehouseId);
+                //鎴愬搧鍑哄簱浠诲姟瀹屾垚
+                if (warehouse.WarehouseType==WarehouseTypEnum.鎴愬搧.ToString())
+                {
+                    return OutProCompleted(task);
+                }
                 Dt_StockInfo stockInfo = _stockService.StockInfoService.Repository.GetStockInfo(task.PalletCode);
 
                 Dt_LocationInfo locationInfo = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == task.SourceAddress);
@@ -327,12 +627,13 @@
                 {
                     return WebResponseContent.Instance.Error($"鏈壘鍒拌揣浣嶄俊鎭�");
                 }
-                Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseId == task.WarehouseId);
                 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>();
-
-                if ((outStockLockInfos == null || outStockLockInfos.Count == 0) && warehouse.WarehouseCode != WarehouseEnum.HA64.ToString())
+                List<Dt_MesPPOutboundOrder> mesPPOutboundOrders = new List<Dt_MesPPOutboundOrder>();
+                Dt_CheckOrder? checkOrder = null;
+                Dt_OutboundOrder? outboundOrder = null;
+                if ((outStockLockInfos == null || outStockLockInfos.Count == 0) && warehouse.WarehouseCode != WarehouseEnum.HA64.ToString() && warehouse.WarehouseCode != WarehouseEnum.HA154.ToString() && (task.TaskType != TaskTypeEnum.OutEmpty.ObjToInt()))
                 {
                     return WebResponseContent.Instance.Error($"鏈壘鍒板嚭搴撹鎯呬俊鎭�");
                 }
@@ -342,10 +643,10 @@
                     {
                         if (task.TaskType == TaskTypeEnum.MesOutbound.ObjToInt())
                         {
-                            Dt_MesOutboundOrder mesOutboundOrder = _outboundService.MesOutboundOrderService.Repository.QueryFirst(x => x.Id == item.OrderDetailId);
+                            Dt_MesOutboundOrder mesOutboundOrder = _outboundService.MesOutboundOrderService.Repository.QueryFirst(x => x.TaskNo == item.OrderNo);
                             if (mesOutboundOrder != null)
                             {
-                                mesOutboundOrder.OverOutQuantity = item.AssignQuantity;
+                                mesOutboundOrder.OverOutQuantity += item.AssignQuantity;
                                 if (mesOutboundOrder.OverOutQuantity == mesOutboundOrder.OrderQuantity)
                                 {
                                     mesOutboundOrder.OrderStatus = OrderDetailStatusEnum.Over.ObjToInt();
@@ -353,40 +654,119 @@
                                 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
                         {
+                            //鑾峰彇鍑哄簱鍗曟槑缁�
                             Dt_OutboundOrderDetail outboundOrderDetail = _outboundService.OutboundOrderDetailService.Repository.QueryFirst(x => x.Id == item.OrderDetailId);
                             if (outboundOrderDetail != null)
                             {
-                                outboundOrderDetail.OverOutQuantity = item.AssignQuantity;
+                                outboundOrderDetail.OverOutQuantity += item.AssignQuantity;
                                 if (outboundOrderDetail.OverOutQuantity == outboundOrderDetail.OrderQuantity)
                                 {
                                     outboundOrderDetail.OrderDetailStatus = OrderDetailStatusEnum.Over.ObjToInt();
                                 }
                                 outboundOrderDetails.Add(outboundOrderDetail);
+                                //鑾峰彇鍑哄簱鍗�
+                                outboundOrder = _outboundRepository.OutboundOrderRepository.Db.Queryable<Dt_OutboundOrder>().Where(x => x.Id == outboundOrderDetail.OrderId).Includes(x => x.Details).First() ?? throw new Exception("鏈壘鍒板嚭搴撳崟");
+                                if (task.TaskType == TaskTypeEnum.OutQuality.ObjToInt())
+                                {
+                                    Dt_MaterielInfo materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x=>x.MaterielCode== outboundOrderDetail.MaterielCode);
+                                    
+                                    checkOrder = new Dt_CheckOrder
+                                    {
+                                        ReceivedQuantity = item.OriginalQuantity,
+                                        OrderType = CheckTypeEnum.InspectCheck.ObjToInt(),
+                                        ReceiveOrderNo = outboundOrder.OrderNo,
+                                        LotNo= item.BatchNo,
+                                        Result = CheckAcceptEnum.NotCheckAccept.ToString(),
+                                        QualifiedQuantity = 0,
+                                        ReceiveDetailRowNo = item.Id,
+                                        WarehouseId = outboundOrder.WarehouseId,
+                                        ScrappedQuantity = 0,
+                                        MaterielCode=materielInfo.MaterielCode,
+                                        MaterielSpec = materielInfo.MaterielSpec,
+                                        Unit = materielInfo.MaterielUnit,
+                                        ReturnQuantity = 0,
+                                        DefectedQuantity = 0
+                                    };
+                                }
                             }
+                            
                         }
                         item.Status = OutLockStockStatusEnum.鍑哄簱瀹屾垚.ObjToInt();
                     }
                 }
 
                 task.TaskStatus = TaskStatusEnum.Finish.ObjToInt();
+                FeedBackWCSTaskCompleted(taskNum);
                 _unitOfWorkManage.BeginTran();
 
-                if (task.TaskType == TaskTypeEnum.Outbound.ObjToInt())
+                if (task.TaskType == TaskTypeEnum.Outbound.ObjToInt() || task.TaskType == TaskTypeEnum.OutQuality.ObjToInt() || task.TaskType == TaskTypeEnum.OutAllocate.ObjToInt() || task.TaskType == TaskTypeEnum.MesHandPickOutbound.ObjToInt() || task.TaskType == TaskTypeEnum.MesHandOutbound.ObjToInt())
                 {
+                    //澶勭悊鍑哄簱璇︽儏浠ュ強搴撳瓨鐘舵��
                     if (outboundOrderDetails.Count > 0)
                     {
                         _outboundService.OutboundOrderDetailService.Repository.UpdateData(outboundOrderDetails);
+                        //鏇存柊鍑哄簱鍗曠姸鎬�
+                        if (task.TaskType == TaskTypeEnum.OutQuality.ObjToInt() || task.TaskType == TaskTypeEnum.OutAllocate.ObjToInt())
+                        {
+                            int detailCount = outboundOrderDetails.Where(x => x.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()).ToList().Count;
+                            if ((outboundOrder.Details.Where(x => x.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()).ToList().Count + detailCount) == outboundOrder.Details.Count)
+                            {
+                                outboundOrder.OrderStatus = OutOrderStatusEnum.鍑哄簱瀹屾垚.ObjToInt();
+                                _outboundRepository.OutboundOrderRepository.UpdateData(outboundOrder);
+                            }
+                        }
                     }
-
                     stockInfo.LocationCode = "";
                     stockInfo.StockStatus = StockStatusEmun.鍑哄簱瀹屾垚.ObjToInt();
-                    _stockService.StockInfoService.Repository.UpdateData(stockInfo);
+                    stockInfo.Details.ForEach(x =>
+                    {
+                        x.Status = StockStatusEmun.鍑哄簱瀹屾垚.ObjToInt();
+                    });
+                    if (stockInfo.StockLength>0)
+                    {
+                        stockInfo.StockLength = 0;
+                    }
+                    if (checkOrder!=null)
+                    {
+                        stockInfo.StockStatus = StockStatusEmun.閫佹瀹屾垚.ObjToInt();
+                        stockInfo.Details.ForEach(x =>
+                        {
+                            x.Status = StockStatusEmun.閫佹瀹屾垚.ObjToInt();
+                        });
+                        _checkOrderRepository.AddData(checkOrder);
+                    }
+                    _stockRepository.StockInfoRepository.UpdateData(stockInfo);
+                    _stockRepository.StockInfoDetailRepository.UpdateData(stockInfo.Details);
                 }
-                else if (task.TaskType == TaskTypeEnum.MesOutbound.ObjToInt())
+                else if (task.TaskType == TaskTypeEnum.OutEmpty.ObjToInt())//杈呮枡绌虹鍑哄簱瀹屾垚
+                {
+                    _basicService.LocationInfoService.UpdateLocationStatus(locationInfo, stockInfo.PalletType, LocationStatusEnum.Free, stockInfo.WarehouseId);
+                    _stockService.StockInfoService.Repository.DeleteAndMoveIntoHty(stockInfo, App.User.UserId == 0 ? OperateTypeEnum.鑷姩瀹屾垚 : OperateTypeEnum.浜哄伐瀹屾垚);
+                }
+                else if (task.TaskType == TaskTypeEnum.MesOutbound.ObjToInt())//鏉挎枡Mes鍑哄簱瀹屾垚閫昏緫
                 {
                     _outboundService.MesOutboundOrderService.Repository.UpdateData(mesOutboundOrders);
+                    _stockService.StockInfoService.Repository.DeleteAndMoveIntoHty(stockInfo, App.User.UserId == 0 ? OperateTypeEnum.鑷姩瀹屾垚 : OperateTypeEnum.浜哄伐瀹屾垚);
+                    _stockService.StockInfoDetailService.Repository.DeleteAndMoveIntoHty(stockInfo.Details, App.User.UserId == 0 ? OperateTypeEnum.鑷姩瀹屾垚 : OperateTypeEnum.浜哄伐瀹屾垚);
+                }
+                else if (warehouse.WarehouseCode == WarehouseEnum.HA154.ToString())
+                {
                     _stockService.StockInfoService.Repository.DeleteAndMoveIntoHty(stockInfo, App.User.UserId == 0 ? OperateTypeEnum.鑷姩瀹屾垚 : OperateTypeEnum.浜哄伐瀹屾垚);
                     _stockService.StockInfoDetailService.Repository.DeleteAndMoveIntoHty(stockInfo.Details, App.User.UserId == 0 ? OperateTypeEnum.鑷姩瀹屾垚 : OperateTypeEnum.浜哄伐瀹屾垚);
                 }
@@ -395,19 +775,27 @@
                 int beforeStatus = locationInfo.LocationStatus;
                 locationInfo.LocationStatus = LocationStatusEnum.Free.ObjToInt();
                 _basicService.LocationInfoService.UpdateLocationStatus(locationInfo, stockInfo.PalletType, LocationStatusEnum.Free, stockInfo.WarehouseId);
-
                 BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId == 0 ? OperateTypeEnum.鑷姩瀹屾垚 : OperateTypeEnum.浜哄伐瀹屾垚);
 
                 _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);
                 }
                 if (task.TaskType == TaskTypeEnum.MesOutbound.ObjToInt())
                 {
-                    MesMaterialLotaAceptModel model = GetMesMaterialLotaAceptModel(stockInfo, stockInfo.Details.FirstOrDefault(), mesOutboundOrders.FirstOrDefault().TaskNo, warehouse.WarehouseCode, mesOutboundOrders.FirstOrDefault().OrderQuantity);
+                    MesMaterialLotaAceptModel model = GetMesMaterialLotaAceptModel(stockInfo, stockInfo.Details.FirstOrDefault(), mesOutboundOrders.FirstOrDefault().TaskNo, warehouse.WarehouseCode, stockInfo.Details.Where(x => x.MaterielCode == mesOutboundOrders.FirstOrDefault().MaterialCode).Sum(x => x.StockQuantity));
                     UploadMesMaterialLotaAcept(model);
                 }
                 return WebResponseContent.Instance.OK();
@@ -418,6 +806,211 @@
                 return WebResponseContent.Instance.Error(ex.Message);
             }
         }
+        //鎴愬搧鍑哄簱浠诲姟瀹屾垚
+        public WebResponseContent OutProCompleted(Dt_Task task)
+        {
+            WebResponseContent content = new WebResponseContent();
+            try
+            {
+                switch (task.TaskType)
+                {
+                    case (int)TaskTypeEnum.OutProduct:
+                        content = OutProductCompleted(task);
+                        break;
+                    case (int)TaskTypeEnum.OutMesRworkProduct:
+                        content = OutMesRworkCompleted(task);
+                        break;
+                    default:
+                        content.Error("鏈煡浠诲姟绫诲瀷");
+                        break;
+                }
+            }
+            catch (Exception ex)
+            {
+                content.Error(ex.Message);
+            }
+            return content;
+        }
+        //鎴愬搧璁㈠崟鍑哄簱浠诲姟瀹屾垚
+        public WebResponseContent OutProductCompleted(Dt_Task task)
+        {
+            WebResponseContent content = new WebResponseContent();
+            try
+            {
+                //鑾峰彇璐т綅
+                Dt_LocationInfo locationInfo = _basicRepository.LocationInfoRepository.QueryFirst(x => x.LocationCode == task.SourceAddress);
+                if (locationInfo == null)
+                {
+                    return content.Error("鏈壘鍒拌揣浣嶄俊鎭�");
+                }
+                //鏍规嵁浠诲姟鑾峰彇鎴愬搧鍑哄簱璇︽儏浠诲姟鍙婄墿鏂欎俊鎭�
+                Dt_OutProStockInfo outProStockInfo = _outProStockInfoRepository.QueryFirst(x => x.TaskNum == task.TaskNum);
+                if (outProStockInfo == null)
+                {
+                    return content.Error("鏈壘鍒版垚鍝佸嚭搴撹鎯�");
+                }
+                //鑾峰彇鎴愬搧鍑哄簱璁㈠崟
+                Dt_ProOutOrder proOutOrder = _outboundService.ProOutOrderService.Repository.Db.Queryable<Dt_ProOutOrder>().Where(x => x.ProOutOrderNo == outProStockInfo.OrderNo).Includes(x => x.Details).First();
 
+                if (proOutOrder == null)
+                {
+                    return content.Error("鏈壘鍒版垚鍝佸嚭搴撹鍗�");
+                }
+                //鑾峰彇鎴愬搧搴撳瓨
+                Dt_ProStockInfo proStockInfo = _stockRepository.ProStockInfoRepository.Db.Queryable<Dt_ProStockInfo>().Where(x => x.PalletCode == task.PalletCode).Includes(x => x.proStockInfoDetails).First();
+                if (proStockInfo == null)
+                {
+                    return content.Error($"鏈壘鍒皗task.PalletCode}鎴愬搧搴撳瓨淇℃伅");
+                }
+                List<Dt_ProStockInfoDetail> proStockInfoDetails = proStockInfo.proStockInfoDetails;
+                if (proStockInfoDetails.Count <= 0)
+                {
+                    return content.Error($"{proStockInfo.PalletCode}鎴愬搧搴撳瓨鏄庣粏涓虹┖");
+                }
+                proStockInfoDetails.ForEach(x =>
+                {
+                    x.ProOutDetailStatus = StockStatusEmun.鍑哄簱瀹屾垚.ObjToInt();
+                });
+                //澶勭悊搴撳瓨鏁版嵁
+                //List<Dt_ProStockInfoDetail>? deleteStockDetails = null;
+                //List<Dt_ProStockInfoDetail>? updateStockDetails = null;
+                //(List<Dt_ProStockInfoDetail>?, List<Dt_ProStockInfoDetail>?) result = _stockService.ProStockInfoService.HandleOutProStock(proStockInfo);
+                //if (result.Item1!=null && result.Item1.Count>0)
+                //{
+                //    deleteStockDetails.AddRange(result.Item1);
+                //}
+                //if (result.Item1 != null && result.Item1.Count > 0)
+                //{
+                //    updateStockDetails.AddRange(updateStockDetails);
+                //}
+                //鑾峰彇鎴愬搧鍑哄簱鍗曟槑缁�
+                Dt_ProOutOrderDetail? proOutOrderDetail = proOutOrder.Details.FirstOrDefault(x => x.Id == outProStockInfo.OrderDetailId);
+                if (proOutOrderDetail == null)
+                {
+                    return content.Error("鏈壘鍒板搴斾换鍔℃垚鍝佽鍗曟槑缁�");
+                }
+                //if (deleteStockDetails?.Sum(x=>x.StockPcsQty)== proStockInfo.proStockInfoDetails.Sum(x=>x.StockPcsQty))
+                //{
+                proStockInfo.StockStatus = StockStatusEmun.鍑哄簱瀹屾垚.ObjToInt();
+                //鑾峰彇鎴愬搧骞冲簱
+                Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == WarehouseEnum.HA101.ToString());
+                proStockInfo.WarehouseId = warehouse.WarehouseId;
+                proStockInfo.LocationCode = "鎴愬搧鍖呰鎷h揣鍖�";
+                //}
+                task.TaskStatus = TaskStatusEnum.Finish.ObjToInt();
+                outProStockInfo.Status = OutLockStockStatusEnum.鍑哄簱瀹屾垚.ObjToInt();
+                _unitOfWorkManage.BeginTran();
+                //璐т綅鍙樺姩璁板綍
+                int beforeStatus = locationInfo.LocationStatus;
+                locationInfo.LocationStatus = LocationStatusEnum.Free.ObjToInt();
+                _basicService.LocationInfoService.UpdateLocationStatus(locationInfo, proStockInfo.PalletType, LocationStatusEnum.Free, locationInfo.WarehouseId);
+                _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfo, (LocationStatusEnum)beforeStatus, LocationStatusEnum.Free, LocationChangeType.OutboundCompleted, proOutOrder?.ProOutOrderNo ?? "", task.TaskNum);
+
+                //if (deleteStockDetails!=null && deleteStockDetails.Count>0)
+                //{
+                //    _stockRepository.ProStockInfoDetailRepository.DeleteAndMoveIntoHty(deleteStockDetails, OperateTypeEnum.鑷姩瀹屾垚);
+                //}
+                //if (updateStockDetails!=null && updateStockDetails.Count>0)
+                //{
+                _stockRepository.ProStockInfoRepository.UpdateData(proStockInfo);
+                _stockRepository.ProStockInfoDetailRepository.UpdateData(proStockInfoDetails);
+                _outProStockInfoRepository.UpdateData(outProStockInfo);
+                //}
+                //else
+                //{
+                //_stockRepository.ProStockInfoRepository.DeleteAndMoveIntoHty(proStockInfo, OperateTypeEnum.鑷姩瀹屾垚);
+                //}
+                BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId == 0 ? OperateTypeEnum.鑷姩瀹屾垚 : OperateTypeEnum.浜哄伐瀹屾垚);
+                _unitOfWorkManage.CommitTran();
+                //MES鎴愬搧鍑哄簱鍚屾
+                ShipmentOrderSync(MesOutSync(outProStockInfo, proOutOrderDetail, proStockInfoDetails));
+                content.OK();
+            }
+            catch (Exception ex)
+            {
+                _unitOfWorkManage.RollbackTran();
+                content.Error(ex.Message);
+            }
+            return content;
+        }
+        /// <summary>
+        /// 鎴愬搧MES鎻愬簱浠诲姟瀹屾垚
+        /// </summary>
+        public WebResponseContent OutMesRworkCompleted(Dt_Task task)
+        {
+            WebResponseContent content=new WebResponseContent();
+            try
+            {
+                //鑾峰彇璐т綅
+                Dt_LocationInfo locationInfo = _basicRepository.LocationInfoRepository.QueryFirst(x => x.LocationCode == task.SourceAddress);
+                if (locationInfo == null)
+                {
+                    return content.Error("鏈壘鍒拌揣浣嶄俊鎭�");
+                }
+                //鏍规嵁浠诲姟鑾峰彇鎴愬搧鍑哄簱璇︽儏浠诲姟鍙婄墿鏂欎俊鎭�
+                Dt_OutProStockInfo outProStockInfo = _outProStockInfoRepository.QueryFirst(x => x.TaskNum == task.TaskNum);
+                if (outProStockInfo == null)
+                {
+                    return content.Error("鏈壘鍒版垚鍝佸嚭搴撹鎯�");
+                }
+                //鑾峰彇MES鎻愬簱鍗�
+                Dt_MesRworkOutboundOrder mesRworkOutboundOrder = _outboundRepository.RworkOutboundOrderRepository.QueryFirst(x=>x.TaskNo==task.OrderNo);
+                if (mesRworkOutboundOrder==null)
+                {
+                    return content.Error("鏈壘鍒癕ES鎴愬搧鎻愬簱鍗�");
+                }
+                if (mesRworkOutboundOrder.OrderStatus==OutOrderStatusEnum.鍑哄簱瀹屾垚.ObjToInt())
+                {
+                    return content.Error($"MES鎴愬搧鎻愬簱鍗晎mesRworkOutboundOrder.TaskNo}宸插畬鎴�");
+                }
+                //鑾峰彇褰撳墠搴撳瓨
+                Dt_ProStockInfo proStockInfo = _stockRepository.ProStockInfoRepository.Db.Queryable<Dt_ProStockInfo>().Where(x => x.PalletCode ==task.PalletCode).Includes(x=>x.proStockInfoDetails).First();
+                if (proStockInfo==null)
+                {
+                    return content.Error($"鏈壘鍒皗task.PalletCode}搴撳瓨淇℃伅");
+                }
+                List<Dt_ProStockInfoDetail> proStockInfoDetails = proStockInfo.proStockInfoDetails;
+                if (proStockInfoDetails.Count <= 0)
+                {
+                    return content.Error("鎴愬搧搴撳瓨鏄庣粏涓虹┖");
+                }
+                proStockInfoDetails.ForEach(x =>
+                {
+                    x.OutboundQuantity = 0;
+                    x.ProOutDetailStatus = StockStatusEmun.鍑哄簱瀹屾垚.ObjToInt();
+                });
+                proStockInfo.StockStatus = StockStatusEmun.鍑哄簱瀹屾垚.ObjToInt();
+                //鑾峰彇鎴愬搧骞冲簱
+                Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == WarehouseEnum.HA101.ToString());
+                proStockInfo.WarehouseId = warehouse.WarehouseId;
+                proStockInfo.LocationCode = "鎴愬搧鍖呰鎷h揣鍖�";
+                task.TaskStatus = TaskStatusEnum.Finish.ObjToInt();
+                outProStockInfo.Status = OutLockStockStatusEnum.鍑哄簱瀹屾垚.ObjToInt();
+                _unitOfWorkManage.BeginTran();
+                //璐т綅鍙樺姩璁板綍
+                int beforeStatus = locationInfo.LocationStatus;
+                locationInfo.LocationStatus = LocationStatusEnum.Free.ObjToInt();
+                _basicService.LocationInfoService.UpdateLocationStatus(locationInfo, proStockInfo.PalletType, LocationStatusEnum.Free, locationInfo.WarehouseId);
+                _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfo, (LocationStatusEnum)beforeStatus, LocationStatusEnum.Free, LocationChangeType.OutboundCompleted, mesRworkOutboundOrder?.TaskNo ?? "", task.TaskNum);
+                _stockRepository.ProStockInfoRepository.UpdateData(proStockInfo);
+                _stockRepository.ProStockInfoDetailRepository.UpdateData(proStockInfoDetails);
+                _outProStockInfoRepository.UpdateData(outProStockInfo);
+                BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId == 0 ? OperateTypeEnum.鑷姩瀹屾垚 : OperateTypeEnum.浜哄伐瀹屾垚);
+                //MES鎴愬搧搴撳瓨鏉垮嚭搴撳悓姝�
+                //WebResponseContent responseContent = ProductOutBoundSync(MesProOutBound(mesRworkOutboundOrder, proStockInfoDetails));
+                //if (!responseContent.Status)
+                //{
+                //    throw new Exception("鍚屾MES搴撳瓨鏉垮嚭搴撳け璐�,閿欒:"+ responseContent.Message);
+                //}
+                _unitOfWorkManage.CommitTran();
+                content.OK();
+            }
+            catch (Exception ex)
+            {
+                _unitOfWorkManage.RollbackTran();
+                content.Error(ex.Message);
+            }
+            return content;
+        }
     }
 }

--
Gitblit v1.9.3