|   | 
| using System; | 
| using System.Collections.Generic; | 
| using System.Linq; | 
| using System.Text; | 
| using System.Threading.Tasks; | 
| using WIDESEA_Core.Enums; | 
| using WIDESEA_Core; | 
| using WIDESEA_DTO.Stock; | 
| using WIDESEA_Model.Models; | 
| using WIDESEA_Core.Helper; | 
| using WIDESEA_Common.OtherEnum; | 
| using WIDESEA_Common.TaskEnum; | 
| using WIDESEA_Common.OrderEnum; | 
| using WIDESEA_Common.StockEnum; | 
| using WIDESEA_Common.CommonEnum; | 
| using WIDESEA_Common.LocationEnum; | 
| using MailKit.Search; | 
| using WIDESEA_External.Model; | 
| using WIDESEA_Core.CodeConfigEnum; | 
|   | 
| namespace WIDESEA_TaskInfoService | 
| { | 
|     public partial class TaskService | 
|     { | 
|         /// <summary> | 
|         /// 选择库存生成出库任务 | 
|         /// </summary> | 
|         /// <param name="id"></param> | 
|         /// <returns></returns> | 
|         public WebResponseContent Outbound(int id) | 
|         { | 
|             WebResponseContent content = new WebResponseContent(); | 
|             try | 
|             { | 
|                 Dt_StockInfo stockInfo = _stockRepository.StockInfoRepository.Db.Queryable<Dt_StockInfo>().Where(x => x.Id == id).Includes(x => x.Details).First(); | 
|                 if (stockInfo == null) | 
|                 { | 
|                     return content.Error($"未找到库存"); | 
|                 } | 
|                 Dt_LocationInfo locationInfo = _basicRepository.LocationInfoRepository.QueryFirst(x => x.LocationCode == stockInfo.LocationCode); | 
|                 if (locationInfo != null && (locationInfo.EnableStatus == EnableStatusEnum.OnlyOut.ObjToInt() || locationInfo.EnableStatus == EnableStatusEnum.Normal.ObjToInt()) && locationInfo.LocationStatus == LocationStatusEnum.InStock.ObjToInt() && stockInfo.StockStatus == StockStatusEmun.入库完成.ObjToInt()) | 
|                 { | 
|                     List<Dt_Task> tasks = GetTasks(new List<Dt_StockInfo>() { stockInfo }, TaskTypeEnum.Outbound); | 
|                     if (tasks == null || tasks.Count <= 0) | 
|                     { | 
|                         return content.Error($"生成任务失败"); | 
|                     } | 
|                     //处理库存数据 | 
|                     stockInfo.StockStatus = (int)StockStatusEmun.出库锁定; | 
|                     LocationStatusEnum locationStatus = (LocationStatusEnum)locationInfo.LocationStatus; | 
|                     locationInfo.LocationStatus = (int)LocationStatusEnum.Lock; | 
|                     //判断是否有出库单信息 | 
|                     _unitOfWorkManage.BeginTran(); | 
|                     //更新库存状态 | 
|                     _stockRepository.StockInfoRepository.UpdateData(stockInfo); | 
|                     //更新货位状态 | 
|                     _basicService.LocationInfoService.UpdateLocationStatus(locationInfo, stockInfo.PalletType, LocationStatusEnum.Lock, stockInfo.WarehouseId); | 
|                     //新建任务 | 
|                     BaseDal.AddData(tasks); | 
|                     //加入货位变动记录 | 
|                     _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfo, locationStatus, LocationStatusEnum.Lock, LocationChangeType.OutboundAssignLocation, stockInfo.Details.FirstOrDefault()?.OrderNo ?? "", tasks[0].TaskNum); | 
|                     _unitOfWorkManage.CommitTran(); | 
|                     PushTasksToWCS(tasks); | 
|                     content.OK(); | 
|                 } | 
|                 else | 
|                 { | 
|                     content.Error($"货位出库条件不满足"); | 
|                 } | 
|             } | 
|             catch (Exception ex) | 
|             { | 
|                 content.Error(ex.Message); | 
|             } | 
|             return content; | 
|         } | 
|         /// <summary> | 
|         /// 库存数据转出库任务 | 
|         /// </summary> | 
|         /// <param name="stockInfos"></param> | 
|         /// <returns></returns> | 
|         public List<Dt_Task> GetTasks(List<Dt_StockInfo> stockInfos, TaskTypeEnum taskType) | 
|         { | 
|             List<Dt_Task> tasks = new List<Dt_Task>(); | 
|             for (int i = 0; i < stockInfos.Count; i++) | 
|             { | 
|                 Dt_StockInfo stockInfo = stockInfos[i]; | 
|   | 
|                 if (stockInfo != null) | 
|                 { | 
|                     Dt_LocationInfo locationInfo = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == stockInfo.LocationCode); | 
|                     if (!tasks.Exists(x => x.PalletCode == stockInfo.PalletCode)) | 
|                     { | 
|                         Dt_Task task = new() | 
|                         { | 
|                             CurrentAddress = stockInfo.LocationCode, | 
|                             Grade = 0, | 
|                             PalletCode = stockInfo.PalletCode, | 
|                             NextAddress = "", | 
|                             Roadway = locationInfo.RoadwayNo, | 
|                             SourceAddress = stockInfo.LocationCode, | 
|                             TargetAddress = "", | 
|                             TaskStatus = TaskStatusEnum.New.ObjToInt(), | 
|                             TaskType = taskType.ObjToInt(), | 
|                             TaskNum = BaseDal.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)), | 
|                             PalletType = stockInfo.PalletType, | 
|                             WarehouseId = stockInfo.WarehouseId, | 
|                         }; | 
|                         tasks.Add(task); | 
|                     } | 
|                 } | 
|             } | 
|             return tasks; | 
|         } | 
|   | 
|         /// <summary> | 
|         /// 出库任务数据处理 | 
|         /// </summary> | 
|         /// <param name="orderDetailId"></param> | 
|         /// <param name="stockSelectViews"></param> | 
|         /// <returns></returns> | 
|         /// <exception cref="Exception"></exception> | 
|         public (List<Dt_Task>, List<Dt_StockInfo>?, List<Dt_OutboundOrderDetail>?, List<Dt_OutStockLockInfo>?, List<Dt_LocationInfo>?) OutboundTaskDataHandle(int orderDetailId, List<StockSelectViewDTO> stockSelectViews) | 
|         { | 
|             List<Dt_Task> tasks = new List<Dt_Task>(); | 
|             Dt_OutboundOrderDetail outboundOrderDetail = _outboundService.OutboundOrderDetailService.Repository.QueryFirst(x => x.Id == orderDetailId); | 
|   | 
|             if (outboundOrderDetail == null) | 
|             { | 
|                 throw new Exception("未找到出库单明细信息"); | 
|             } | 
|   | 
|             if (stockSelectViews.Sum(x => x.UseableQuantity) > outboundOrderDetail.OrderQuantity - outboundOrderDetail.LockQuantity) | 
|             { | 
|                 throw new Exception("选择数量超出单据数量"); | 
|             } | 
|             List<Dt_StockInfo>? stockInfos = null; | 
|             Dt_OutboundOrderDetail? orderDetail = null; | 
|             List<Dt_OutStockLockInfo>? outStockLockInfos = null; | 
|             List<Dt_LocationInfo>? locationInfos = null; | 
|             if (outboundOrderDetail.OrderDetailStatus == OrderDetailStatusEnum.New.ObjToInt()) | 
|             { | 
|                 (List<Dt_StockInfo>, Dt_OutboundOrderDetail, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>) result = _outboundService.OutboundOrderDetailService.AssignStockOutbound(outboundOrderDetail, stockSelectViews); | 
|                 if (result.Item1 != null && result.Item1.Count > 0) | 
|                 { | 
|                     tasks = GetTasks(result.Item1, TaskTypeEnum.Outbound); | 
|                     result.Item2.OrderDetailStatus = OrderDetailStatusEnum.Outbound.ObjToInt(); | 
|                     result.Item3.ForEach(x => | 
|                     { | 
|                         x.Status = OutLockStockStatusEnum.出库中.ObjToInt(); | 
|                     }); | 
|   | 
|                     stockInfos = result.Item1; | 
|                     orderDetail = result.Item2; | 
|                     outStockLockInfos = result.Item3; | 
|                     locationInfos = result.Item4; | 
|                 } | 
|                 else | 
|                 { | 
|                     throw new Exception("无库存"); | 
|                 } | 
|             } | 
|             else | 
|             { | 
|                 List<Dt_OutStockLockInfo> stockLockInfos = _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, orderDetail == null ? null : new List<Dt_OutboundOrderDetail> { orderDetail }, outStockLockInfos, locationInfos); | 
|         } | 
|   | 
|         /// <summary> | 
|         /// 出库任务数据处理 | 
|         /// </summary> | 
|         /// <param name="orderDetailId"></param> | 
|         /// <param name="stockSelectViews"></param> | 
|         /// <returns></returns> | 
|         /// <exception cref="Exception"></exception> | 
|         public (List<Dt_Task>, List<Dt_StockInfo>?, List<Dt_OutboundOrderDetail>?, List<Dt_OutStockLockInfo>?, List<Dt_LocationInfo>?) OutboundTaskDataHandle(int[] keys) | 
|         { | 
|             List<Dt_Task> tasks = new List<Dt_Task>(); | 
|             List<Dt_OutboundOrderDetail> outboundOrderDetails = _outboundService.OutboundOrderDetailService.Repository.QueryData(x => keys.Contains(x.Id)); | 
|   | 
|             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_OutboundOrderDetail>? orderDetails = null; | 
|             List<Dt_OutStockLockInfo>? outStockLockInfos = null; | 
|             List<Dt_LocationInfo>? locationInfos = null; | 
|             //if (outboundOrderDetail.OrderDetailStatus == OrderDetailStatusEnum.New.ObjToInt()) | 
|             { | 
|                 (List<Dt_StockInfo>, List<Dt_OutboundOrderDetail>, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>) result = _outboundService.OutboundOrderDetailService.AssignStockOutbound(outboundOrderDetails); | 
|                 if (result.Item1 != null && result.Item1.Count > 0) | 
|                 { | 
|                     tasks = GetTasks(result.Item1, TaskTypeEnum.Outbound); | 
|                     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(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); | 
|             //    } | 
|             //} | 
|   | 
|             return (tasks, stockInfos, orderDetails, outStockLockInfos, locationInfos); | 
|         } | 
|   | 
|         /// <summary> | 
|         /// 生成出库任务 | 
|         /// </summary> | 
|         /// <param name="orderDetailId"></param> | 
|         /// <param name="stockSelectViews"></param> | 
|         /// <returns></returns> | 
|         public WebResponseContent GenerateOutboundTask(int orderDetailId, List<StockSelectViewDTO> stockSelectViews) | 
|         { | 
|             try | 
|             { | 
|                 (List<Dt_Task>, List<Dt_StockInfo>?, List<Dt_OutboundOrderDetail>?, List<Dt_OutStockLockInfo>?, List<Dt_LocationInfo>?) result = OutboundTaskDataHandle(orderDetailId, stockSelectViews); | 
|   | 
|                 WebResponseContent content = GenerateOutboundTaskDataUpdate(result.Item1, result.Item2, result.Item3, result.Item4, result.Item5); | 
|   | 
|                 return content; | 
|             } | 
|             catch (Exception ex) | 
|             { | 
|                 return WebResponseContent.Instance.Error(ex.Message); | 
|             } | 
|         } | 
|   | 
|         /// <summary> | 
|         /// 平库直接出库 | 
|         /// </summary> | 
|         /// <param name="orderDetailId"></param> | 
|         /// <param name="stockSelectViews"></param> | 
|         /// <returns></returns> | 
|         public WebResponseContent GeneratePKOutboundTask(int orderDetailId, List<StockSelectViewDTO> stockSelectViews) | 
|         { | 
|             try | 
|             { | 
|                 #region MyRegion | 
|                 Dt_OutboundOrderDetail OrderDetail = _outboundService.OutboundOrderDetailService.Repository.QueryFirst(x => x.Id == orderDetailId); | 
|   | 
|                 if (OrderDetail == null) | 
|                 { | 
|                     throw new Exception("未找到出库单明细信息"); | 
|                 } | 
|                 if (OrderDetail.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()) | 
|                     throw new Exception("出库单已完成"); | 
|                 Dt_OutboundOrder outboundOrder = BaseDal.Db.Queryable<Dt_OutboundOrder>().Where(x => x.Id == OrderDetail.OrderId).Includes(x => x.Details).First(); | 
|                 if (outboundOrder == null) | 
|                 { | 
|                     return WebResponseContent.Instance.Error($"未找到出库单信息"); | 
|                 } | 
|                 Dt_Warehouse warehouse = _basicService.WarehouseService.Repository.QueryFirst(x => x.WarehouseId == outboundOrder.WarehouseId); | 
|                 List<Dt_StockInfo> outStocks = _stockService.StockInfoService.Repository.GetStockInfosByPalletCodes(stockSelectViews.Select(x => x.PalletCode).ToList()); | 
|                 if (outStocks.Count < 1) return WebResponseContent.Instance.Error($"库存不足"); | 
|                 List<Dt_OutStockLockInfo> outStockLockInfos = new List<Dt_OutStockLockInfo>(); | 
|                 List<Dt_StockInfo> upStocks = new List<Dt_StockInfo>(); | 
|                 List<Dt_StockInfo> deStocks = new List<Dt_StockInfo>(); | 
|                 List<Dt_StockInfoDetail> upstockDetails = new List<Dt_StockInfoDetail>(); | 
|                 List<Dt_StockInfoDetail> destockDetails = new List<Dt_StockInfoDetail>(); | 
|                 outStocks.ForEach(x => | 
|                 { | 
|                     x.Details.Where(x => x.MaterielCode == OrderDetail.MaterielCode).ToList().ForEach(v => | 
|                     { | 
|                         float OriginalQuantity = v.StockQuantity; | 
|                         float assignQuantity = 0;//分配数量 | 
|                         float assignAmount = OrderDetail.OrderQuantity - OrderDetail.OverOutQuantity;//待出数量 | 
|                         if (assignAmount > 0) | 
|                         { | 
|                             if (v.StockQuantity >= assignAmount) | 
|                             { | 
|                                 assignQuantity = assignAmount; | 
|                                 v.StockQuantity -= assignAmount; | 
|                                 OrderDetail.OverOutQuantity += assignAmount; | 
|                                 OrderDetail.LockQuantity += assignAmount; | 
|                                 upstockDetails.Add(v); | 
|                             } | 
|                             else | 
|                             { | 
|                                 assignQuantity = v.StockQuantity; | 
|                                 OrderDetail.OverOutQuantity += v.StockQuantity; | 
|                                 OrderDetail.LockQuantity += v.StockQuantity; | 
|                                 v.StockQuantity = 0; | 
|                                 destockDetails.Add(v); | 
|                             } | 
|                             Dt_OutStockLockInfo outStockLockInfo = new Dt_OutStockLockInfo() | 
|                             { | 
|                                 PalletCode = x.PalletCode, | 
|                                 AssignQuantity = assignQuantity, | 
|                                 MaterielCode = OrderDetail.MaterielCode, | 
|                                 BatchNo = v.BatchNo, | 
|                                 LocationCode = x.LocationCode, | 
|                                 MaterielName = v.MaterielName, | 
|                                 OrderDetailId = OrderDetail.Id, | 
|                                 OrderNo = outboundOrder.OrderNo, | 
|                                 OrderType = outboundOrder.OrderType, | 
|                                 OriginalQuantity = OriginalQuantity, | 
|                                 Status = OutLockStockStatusEnum.出库完成.ObjToInt(), | 
|                                 StockId = x.Id, | 
|                                 TaskNum = 0, | 
|                                 OrderQuantity = OrderDetail.OrderQuantity, | 
|                                 Unit = OrderDetail.Unit | 
|                             }; | 
|                             outStockLockInfos.Add(outStockLockInfo); | 
|                         } | 
|                     }); | 
|                     int overCount = x.Details.Where(x => x.StockQuantity == 0).Count(); | 
|                     if (overCount == x.Details.Count) deStocks.Add(x); | 
|                     else upStocks.Add(x); | 
|                 }); | 
|                 outboundOrder.OrderStatus = OutOrderStatusEnum.出库中.ObjToInt(); | 
|                 OrderDetail.OrderDetailStatus = OrderDetail.OrderQuantity > OrderDetail.OverOutQuantity ? OrderDetailStatusEnum.AssignOverPartial.ObjToInt() : OrderDetailStatusEnum.Over.ObjToInt(); | 
|                 if (OrderDetail.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()) | 
|                 { | 
|                     int overCount = outboundOrder.Details.Where(x => x.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()).Count(); | 
|                     if (outboundOrder.Details.Count - 1 == overCount) | 
|                         outboundOrder.OrderStatus = OutOrderStatusEnum.出库完成.ObjToInt(); | 
|                 } | 
|                 _unitOfWorkManage.BeginTran(); | 
|                 _outboundService.OutboundStockLockInfoService.AddData(outStockLockInfos); | 
|                 _outboundService.OutboundOrderService.UpdateData(outboundOrder); | 
|                 _outboundService.OutboundOrderDetailService.UpdateData(OrderDetail); | 
|                 _stockRepository.StockInfoRepository.UpdateData(upStocks); | 
|                 _stockRepository.StockInfoRepository.DeleteData(deStocks); | 
|                 _stockRepository.StockInfoDetailRepository.UpdateData(upstockDetails); | 
|                 _stockRepository.StockInfoDetailRepository.DeleteData(destockDetails); | 
|                 _unitOfWorkManage.CommitTran(); | 
|                 #endregion | 
|   | 
|                 #region 上报ERP | 
|                 List<ERPPickModel> eRPPickModels = new List<ERPPickModel>(); | 
|                 outStockLockInfos.ForEach(x => | 
|                 { | 
|                     ERPPickItemModel pickItemModel = new ERPPickItemModel() | 
|                     { | 
|                         Lotno = x.BatchNo, | 
|                         Qty = x.AssignQuantity.ToString(), | 
|                         Location = warehouse.WarehouseCode | 
|                     }; | 
|                     ERPPickModel pickModel = new ERPPickModel() | 
|                     { | 
|                         Rowindex = OrderDetail.RowNo, | 
|                         Material = OrderDetail.MaterielCode, | 
|                         Qty = pickItemModel.Qty, | 
|                         Dataitem = new List<ERPPickItemModel> { pickItemModel } | 
|                     }; | 
|                     eRPPickModels.Add(pickModel); | 
|                 }); | 
|                 ERPIssueItemModel issueItemModel = new ERPIssueItemModel() | 
|                 { | 
|                     Pickcode = outboundOrder.UpperOrderNo, | 
|                     PickList = eRPPickModels | 
|                 }; | 
|                 ERPIssueModel issueModel = new ERPIssueModel() | 
|                 { | 
|                     UniqueTag = outboundOrder.Id.ToString(), | 
|                     Code =_outboundService.OutboundOrderService.CreateCodeByRule(nameof(RuleCodeEnum.FLCodeRule)), | 
|                     WarehouseCode = warehouse.WarehouseCode, | 
|                     Docremark = "", | 
|                     Deptno = outboundOrder.DepartmentCode, | 
|                     Deptname = outboundOrder.DepartmentName, | 
|                     Createtime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), | 
|                     Createuser = App.User.UserName, | 
|                     Issitem = new List<ERPIssueItemModel>() { issueItemModel } | 
|                 }; | 
|                 _invokeERPService.InvokeOutStandardsApi(issueModel); | 
|                 #endregion | 
|   | 
|                 return WebResponseContent.Instance.OK(); | 
|             } | 
|             catch (Exception ex) | 
|             { | 
|                 return WebResponseContent.Instance.Error(ex.Message); | 
|             } | 
|         } | 
|   | 
|         /// <summary> | 
|         /// 生成出库任务后数据更新到数据库 | 
|         /// </summary> | 
|         /// <param name="tasks"></param> | 
|         /// <param name="stockInfos"></param> | 
|         /// <param name="outboundOrderDetails"></param> | 
|         /// <param name="outStockLockInfos"></param> | 
|         /// <param name="locationInfos"></param> | 
|         /// <returns></returns> | 
|         public WebResponseContent GenerateOutboundTaskDataUpdate(List<Dt_Task> tasks, List<Dt_StockInfo>? stockInfos = null, List<Dt_OutboundOrderDetail>? outboundOrderDetails = null, List<Dt_OutStockLockInfo>? outStockLockInfos = null, List<Dt_LocationInfo>? locationInfos = null) | 
|         { | 
|             try | 
|             { | 
|                 _unitOfWorkManage.BeginTran(); | 
|   | 
|                 BaseDal.AddData(tasks); | 
|                 if (stockInfos != null && stockInfos.Count > 0 && outboundOrderDetails != null && outboundOrderDetails.Count > 0 && outStockLockInfos != null && outStockLockInfos.Count > 0 && locationInfos != null && locationInfos.Count > 0) | 
|                 { | 
|                     WebResponseContent content = _outboundService.OutboundOrderDetailService.LockOutboundStockDataUpdate(stockInfos, outboundOrderDetails, outStockLockInfos, locationInfos, tasks: tasks); | 
|   | 
|                     if (!content.Status) | 
|                     { | 
|                         _unitOfWorkManage.RollbackTran(); | 
|                         return content; | 
|                     } | 
|                 } | 
|                 else if (outboundOrderDetails != null && outboundOrderDetails.Count > 0) | 
|                 { | 
|                     outboundOrderDetails.ForEach(x => | 
|                     { | 
|                         x.OrderDetailStatus = OrderDetailStatusEnum.Outbound.ObjToInt(); | 
|                     }); | 
|   | 
|                     _outboundService.OutboundOrderDetailService.Repository.UpdateData(outboundOrderDetails); | 
|                 } | 
|                 _unitOfWorkManage.CommitTran(); | 
|                 PushTasksToWCS(tasks); | 
|                 return WebResponseContent.Instance.OK(); | 
|             } | 
|             catch (Exception ex) | 
|             { | 
|                 _unitOfWorkManage.RollbackTran(); | 
|                 return WebResponseContent.Instance.Error(ex.Message); | 
|             } | 
|   | 
|         } | 
|   | 
|         /// <summary> | 
|         /// 生成出库任务 | 
|         /// </summary> | 
|         /// <param name="keys">出库单明细主键</param> | 
|         /// <returns></returns> | 
|         public WebResponseContent GenerateOutboundTask(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_OutboundOrderDetail> outboundOrderDetails = new List<Dt_OutboundOrderDetail>(); | 
|                 List<Dt_OutStockLockInfo> outStockLockInfos = new List<Dt_OutStockLockInfo>(); | 
|                 List<Dt_LocationInfo> locationInfos = new List<Dt_LocationInfo>(); | 
|   | 
|                 (List<Dt_Task>, List<Dt_StockInfo>?, List<Dt_OutboundOrderDetail>?, List<Dt_OutStockLockInfo>?, List<Dt_LocationInfo>?) result = OutboundTaskDataHandle(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 = GenerateOutboundTaskDataUpdate(tasks, stockInfos, outboundOrderDetails, outStockLockInfos, locationInfos); | 
|                 return content; | 
|             } | 
|             catch (Exception ex) | 
|             { | 
|                 _unitOfWorkManage.RollbackTran(); | 
|                 return WebResponseContent.Instance.Error(ex.Message); | 
|             } | 
|         } | 
|   | 
|         /// <summary> | 
|         /// 生成出库任务 | 
|         /// </summary> | 
|         /// <param name="outboundId">出库单主键</param> | 
|         /// <returns></returns> | 
|         public WebResponseContent GenerateOutboundTaskByHeadId(int outboundId) | 
|         { | 
|             try | 
|             { | 
|                 List<int> keys = _outboundService.OutboundOrderDetailService.Repository.QueryData(x => x.Id, x => x.OrderId == outboundId); | 
|   | 
|                 return GenerateOutboundTask(keys.ToArray()); | 
|             } | 
|             catch (Exception ex) | 
|             { | 
|                 _unitOfWorkManage.RollbackTran(); | 
|                 return WebResponseContent.Instance.Error(ex.Message); | 
|             } | 
|         } | 
|     } | 
| } |