helongyang
11 小时以前 6f8fe2fc191fb466e3141a6e915d6aa63802c269
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/MesTaskService.cs
@@ -28,12 +28,17 @@
using System.Reflection.Metadata;
using WIDESEA_DTO.Task;
using WIDESEA_DTO.Stock;
using SqlSugar;
using OfficeOpenXml.FormulaParsing.Excel.Functions.RefAndLookup;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Math;
namespace WIDESEA_TaskInfoService
{
    public partial class TaskService
    {
        static object lock_out = new object();
        static object solderMask_out = new object();
        /// <summary>
        /// æµ‹è¯•架出仓
@@ -93,6 +98,13 @@
                        PalletType = stockInfo.PalletType,
                        WarehouseId = stockInfo.WarehouseId,
                    };
                    string MaterielCode = stockInfo.Details.Where(x => x.StockId == stockInfo.Id).FirstOrDefault()?.MaterielCode;
                    float Quantity = (float)stockInfo.Details.Where(x => x.StockId == stockInfo.Id).Sum(x => x.StockQuantity);
                    if (MaterielCode != null && Quantity != null)
                    {
                        taskOut.MaterielCode = MaterielCode;
                        taskOut.Quantity = Quantity;
                    }
                    stockInfo.StockStatus = (int)StockStatusEmun.出库锁定;
                    LocationStatusEnum locationStatus = (LocationStatusEnum)locationInfo.LocationStatus;
                    locationInfo.LocationStatus = (int)LocationStatusEnum.Lock;
@@ -109,6 +121,170 @@
                    _unitOfWorkManage.CommitTran();
                    //将任务推送到WCS
                    PushTasksToWCS(new List<Dt_Task>() { taskOut }, "AGV_CSJ");
                    responseContent.OK();
                }
                catch (Exception ex)
                {
                    _unitOfWorkManage.RollbackTran();
                    responseContent.Error(ex.Message);
                }
                return responseContent;
            }
        }
        public MesResponseContent SolderMaskOutNotice(SolderMaskOutNotice model)
        {
            lock (solderMask_out)
            {
                MesResponseContent responseContent = new MesResponseContent();
                try
                {
                    Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == WarehouseEnum.HA154.ToString());
                    //获取库存记录
                    List<Dt_StockInfo> stockInfos = _stockRepository.StockInfoRepository.Db.Queryable<Dt_StockInfo>().Where(x =>
                      x.WarehouseId == warehouse.WarehouseId &&
                      x.StockStatus == (int)StockStatusEmun.入库完成).Includes(x => x.Details).ToList();
                    Dt_StockInfo? stockInfo = stockInfos.FirstOrDefault(x => x.Details.Any(x => x.BatchNo == model.LotNo));
                    if (stockInfo == null)
                    {
                        return responseContent.Error($"防焊库:无{model.LotNo}可用库存");
                    }
                    Dt_Task exsit2 = Repository.QueryFirst(x => x.PalletCode == stockInfo.PalletCode);
                    if (exsit2 != null)
                    {
                        return responseContent.Error($"防焊任务{stockInfo.PalletCode}已存在");
                    }
                    Dt_LocationInfo locationInfo = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == stockInfo.LocationCode &&
                      x.WarehouseId == stockInfo.WarehouseId &&
                      x.LocationStatus == (int)LocationStatusEnum.InStock &&
                      (x.EnableStatus == (int)EnableStatusEnum.Normal || x.EnableStatus == (int)EnableStatusEnum.OnlyOut));
                    if (locationInfo == null)
                    {
                        return responseContent.Error($"防焊货位:{stockInfo.LocationCode}出库条件不满足");
                    }
                    //生成防焊出库任务 é”å®šåº“å­˜ æ›´æ”¹è´§ä½çŠ¶æ€
                    Dt_Task taskOut = new()
                    {
                        CurrentAddress = stockInfo.LocationCode,
                        Grade = 0,
                        PalletCode = stockInfo.PalletCode,
                        NextAddress = "",
                        Roadway = locationInfo.RoadwayNo,
                        SourceAddress = stockInfo.LocationCode,
                        TargetAddress = model.TargetAddressCode,
                        TaskStatus = (int)TaskStatusEnum.New,
                        TaskType = stockInfo.PalletType<2 ? (int)TaskTypeEnum.MaskOutNoticeSmall : (int)TaskTypeEnum.MaskOutNoticeLarge,
                        TaskNum = BaseDal.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)),
                        PalletType = stockInfo.PalletType,
                        WarehouseId = stockInfo.WarehouseId,
                    };
                    string MaterielCode = stockInfo.Details.Where(x => x.StockId == stockInfo.Id).FirstOrDefault()?.MaterielCode;
                    float Quantity = (float)stockInfo.Details.Where(x => x.StockId == stockInfo.Id).Sum(x => x.StockQuantity);
                    if (MaterielCode != null && Quantity != null)
                    {
                        taskOut.MaterielCode = MaterielCode;
                        taskOut.Quantity = Quantity;
                    }
                    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(taskOut);
                    //加入货位变动记录
                    _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfo, locationStatus, LocationStatusEnum.Lock, LocationChangeType.OutboundAssignLocation, stockInfo.Details.FirstOrDefault()?.OrderNo ?? "", taskOut.TaskNum);
                    _unitOfWorkManage.CommitTran();
                    //将任务推送到WCS
                    PushTasksToWCS(new List<Dt_Task>() { taskOut }, "AGV_ZH");
                    responseContent.OK();
                }
                catch (Exception ex)
                {
                    _unitOfWorkManage.RollbackTran();
                    responseContent.Error(ex.Message);
                }
                return responseContent;
            }
        }
        public MesResponseContent SolderMaskOut(SolderMaskOut model)
        {
            lock (solderMask_out)
            {
                MesResponseContent responseContent = new MesResponseContent();
                try
                {
                    Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == WarehouseEnum.HA154.ToString());
                    //获取库存记录
                    List<Dt_StockInfo> stockInfos = _stockRepository.StockInfoRepository.Db.Queryable<Dt_StockInfo>().Where(x =>
                      x.WarehouseId == warehouse.WarehouseId &&
                      x.StockStatus == (int)StockStatusEmun.入库完成).Includes(x => x.Details).ToList();
                    Dt_StockInfo? stockInfo = stockInfos.FirstOrDefault(x => x.Details.Any(x => x.BatchNo == model.LotNo));
                    if (stockInfo == null)
                    {
                        return responseContent.Error($"防焊库:无{model.LotNo}可用库存");
                    }
                    Dt_Task exsit2 = Repository.QueryFirst(x => x.PalletCode == stockInfo.PalletCode);
                    if (exsit2 != null)
                    {
                        return responseContent.Error($"防焊任务{stockInfo.PalletCode}已存在");
                    }
                    Dt_LocationInfo locationInfo = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == stockInfo.LocationCode &&
                      x.WarehouseId == stockInfo.WarehouseId &&
                      x.LocationStatus == (int)LocationStatusEnum.InStock &&
                      (x.EnableStatus == (int)EnableStatusEnum.Normal || x.EnableStatus == (int)EnableStatusEnum.OnlyOut));
                    if (locationInfo == null)
                    {
                        return responseContent.Error($"防焊货位:{stockInfo.LocationCode}出库条件不满足");
                    }
                    //生成防焊出库任务 é”å®šåº“å­˜ æ›´æ”¹è´§ä½çŠ¶æ€
                    Dt_Task taskOut = new()
                    {
                        CurrentAddress = stockInfo.LocationCode,
                        Grade = 0,
                        PalletCode = stockInfo.PalletCode,
                        NextAddress = "",
                        Roadway = locationInfo.RoadwayNo,
                        SourceAddress = stockInfo.LocationCode,
                        TargetAddress = model.TargetAddressCode,
                        TaskStatus = (int)TaskStatusEnum.New,
                        TaskType = stockInfo.PalletType < 2 ? (int)TaskTypeEnum.MaskOutSmall : (int)TaskTypeEnum.MaskOutLarge,
                        TaskNum = BaseDal.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)),
                        PalletType = stockInfo.PalletType,
                        WarehouseId = stockInfo.WarehouseId,
                    };
                    string MaterielCode = stockInfo.Details.Where(x => x.StockId == stockInfo.Id).FirstOrDefault()?.MaterielCode;
                    float Quantity = (float)stockInfo.Details.Where(x => x.StockId == stockInfo.Id).Sum(x => x.StockQuantity);
                    if (MaterielCode != null && Quantity != null)
                    {
                        taskOut.MaterielCode = MaterielCode;
                        taskOut.Quantity = Quantity;
                    }
                    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(taskOut);
                    //加入货位变动记录
                    _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfo, locationStatus, LocationStatusEnum.Lock, LocationChangeType.OutboundAssignLocation, stockInfo.Details.FirstOrDefault()?.OrderNo ?? "", taskOut.TaskNum);
                    _unitOfWorkManage.CommitTran();
                    //将任务推送到WCS
                    PushTasksToWCS(new List<Dt_Task>() { taskOut }, "AGV_ZH");
                    responseContent.OK();
                }
                catch (Exception ex)
@@ -155,6 +331,13 @@
                    PalletType = stockInfo.PalletType,
                    WarehouseId = stockInfo.WarehouseId,
                };
                string MaterielCode = stockInfo.Details.Where(x => x.StockId == stockInfo.Id).FirstOrDefault()?.MaterielCode;
                float Quantity = (float)stockInfo.Details.Where(x => x.StockId == stockInfo.Id).Sum(x => x.StockQuantity);
                if (MaterielCode != null && Quantity != null)
                {
                    taskIn.MaterielCode = MaterielCode;
                    taskIn.Quantity = Quantity;
                }
                //更改库存状态
                stockInfo.StockStatus = StockStatusEmun.退库.ObjToInt();
                BaseDal.AddData(taskIn);
@@ -292,7 +475,6 @@
            }
            return content;
        }
        /// <summary>
        /// 
        /// </summary>
@@ -401,6 +583,7 @@
                tasks.ForEach(x =>
                {
                    x.TargetAddress = model.Line;
                    x.OrderNo = mesOutboundOrder.TaskNo;
                });
                _unitOfWorkManage.BeginTran();
@@ -449,18 +632,25 @@
                }
                Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseId == palletTypeInfo.WarehouseId);
                //判断是否托盘库存是否已存在
                Dt_StockInfo stockInfoOld = _stockRepository.StockInfoRepository.QueryFirst(x => x.PalletCode == model.CarrierCode);
                if (stockInfoOld != null)
                {
                    return MesResponseContent.Instance.Error($"托盘号库存{model.CarrierCode}已存在");
                }
                Dt_StockInfo_Hty stockInfo_Hty = _stockRepository.StockInfo_HtyRepository.QueryData(x => x.PalletCode == model.CarrierCode).OrderByDescending(x => x.SourceId).First();
                Dt_StockInfoDetail_Hty stockInfoDetail_Hty = _stockRepository.StockInfoDetail_HtyRepository.QueryFirst(x => x.StockId == stockInfo_Hty.SourceId);
                Dt_StockInfoDetail stockInfoDetail = new Dt_StockInfoDetail()
                {
                    MaterielSpec = stockInfoDetail_Hty.MaterielSpec,
                    BatchNo = stockInfoDetail_Hty?.BatchNo ?? "",
                    EffectiveDate = model.ExpirationDate,
                    MaterielCode = model.MaterialCode,
                    InboundOrderRowNo = stockInfoDetail_Hty?.InboundOrderRowNo ?? 0,
                    MaterielName = model.MaterialCode,
                    MaterielName = stockInfoDetail_Hty.MaterielName,
                    ProductionDate = model.ProductionDate,
                    OrderNo = stockInfoDetail_Hty?.OrderNo ?? "",
                    OutboundQuantity = 0,
@@ -530,7 +720,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 +739,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 +752,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);
@@ -606,11 +803,14 @@
                //}
                #endregion
                _unitOfWorkManage.BeginTran();
                Db.InsertNav(mesOutboundOrder).Include(x => x.Details).ExecuteCommand();
                _unitOfWorkManage.CommitTran();
                return MesResponseContent.Instance.OK();
            }
            catch (Exception ex)
            {
                _unitOfWorkManage.RollbackTran();
                return MesResponseContent.Instance.Error(ex.Message);
            }
@@ -645,12 +845,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 +912,7 @@
            }
            catch (Exception ex)
            {
                _unitOfWorkManage.RollbackTran();
                return MesResponseContent.Instance.Error(ex.Message);
            }
        }
@@ -724,6 +926,7 @@
        {
            try
            {
                //一次只发一卷物料入库明细
                foreach (var item in model.MaterialLotInfo)
                {
                    //获取物料信息
@@ -850,8 +1053,15 @@
                    TaskType = TaskTypeEnum.Inbound.ObjToInt(),
                    TaskStatus = TaskStatusEnum.New.ObjToInt(),
                    WarehouseId = stockInfo.WarehouseId,
                    PalletType = stockInfo.PalletType
                    PalletType = stockInfo.PalletType,
                };
                string MaterielCode = stockInfo.Details.Where(x => x.StockId == stockInfo.Id).FirstOrDefault()?.MaterielCode;
                float Quantity = (float)stockInfo.Details.Where(x => x.StockId == stockInfo.Id).Sum(x => x.StockQuantity);
                if (MaterielCode != null && Quantity != null)
                {
                    newTask.MaterielCode = MaterielCode;
                    newTask.Quantity = Quantity;
                }
                LocationStatusEnum lastStatus = (LocationStatusEnum)locationInfo.LocationStatus;
                _unitOfWorkManage.BeginTran();
                _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfo, lastStatus, LocationStatusEnum.Lock, LocationChangeType.InboundAssignLocation);
@@ -895,7 +1105,7 @@
                {
                    content.Content = new
                    {
                        MaterialCode= stock.MaterielCode,
                        MaterialCode = stock.MaterielCode,
                        Quantity = stock.StockQuantity,
                        Unit = stock.Unit,
                        Warehouse = warehouse.WarehouseCode,
@@ -912,80 +1122,11 @@
                return MesResponseContent.Instance.Error(ex.Message);
            }
        }
        /// <summary>
        /// MES成品入库单接收
        /// </summary>
        /// <returns></returns>
        public MesResponseContent BagInfoSync(MesBagInfoModel bagInfoModel)
        {
            MesResponseContent content = new MesResponseContent();
            try
            {
                Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == bagInfoModel.WarehouseCode);
                if (warehouse == null)
                {
                    return content.Error("未找到仓库信息");
                }
                List<Dt_MesProInOrderDetail> mesProInOrderDetails = new List<Dt_MesProInOrderDetail>();
                foreach (var item in bagInfoModel.BagDetails)
                {
                    mesProInOrderDetails.Add(_mapper.Map<Dt_MesProInOrderDetail>(item));
                }
                mesProInOrderDetails.ForEach(x =>
                {
                    x.OverInQuantity = 0;
                });
                Dt_MesProInOrder mesProInOrder = new Dt_MesProInOrder()
                {
                    WarehouseId = warehouse.WarehouseId,
                    BatchNo = bagInfoModel.BatchNo,
                    MesProStatus = InOrderStatusEnum.未开始.ObjToInt(),
                    UnPackStock = bagInfoModel.UnPackStock,
                    Details = mesProInOrderDetails
                };
                Db.InsertNav(mesProInOrder).Include(x => x.Details).ExecuteCommand();
                return content.OK("接收成功");
            }
            catch (Exception ex)
            {
                content.Error(ex.Message);
            }
            return content;
        }
        /// <summary>
        /// æˆå“è¿”工提库
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public MesResponseContent RworkTask(RworkTaskModel model)
        {
            try
            {
                Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == WarehouseEnum.HA72.ToString());
                //获取库存记录
                List<Dt_StockInfo> stockInfos = _stockRepository.StockInfoRepository.Db.Queryable<Dt_StockInfo>().Where(x =>
                  x.WarehouseId == warehouse.WarehouseId &&
                  x.StockStatus == (int)StockStatusEmun.入库完成).Includes(x => x.Details).ToList();
                Dt_StockInfo? stockInfo = stockInfos.FirstOrDefault(x => x.Details.Any(x => x.BatchNo == model.ProductVersion));
                if (stockInfo == null)
                {
                    return MesResponseContent.Instance.Error($"尾数仓:{model.ProductVersion}无可用库存");
                }
                Dt_Task exsit2 = Repository.QueryFirst(x => x.PalletCode == stockInfo.PalletCode);
            }
            catch (Exception ex)
            {
                throw;
            }
            return MesResponseContent.Instance.OK();
        }
        /// <summary>
        /// ç”Ÿæˆå‡ºåº“任务
        /// ç”ŸæˆPP大卷出库任务
        /// </summary>
        /// <param name="keys">出库单明细主键</param>
        /// <returns></returns>
@@ -1000,7 +1141,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);
@@ -1021,13 +1162,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);
            }
        }
@@ -1039,85 +1298,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
            {
@@ -1130,7 +1372,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)
                    {
@@ -1156,8 +1615,47 @@
                _unitOfWorkManage.RollbackTran();
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
        /// <summary>
        /// èŽ·å–MES阻焊批次信息
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public WebResponseContent GetZHMesMaterialLot(string materialLot)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                Dt_ApiInfo apiInfo = _apiInfoRepository.QueryFirst(x => x.ApiCode == APIEnum.WMS_MES_GetProductByLot.ToString());
                object obj = new { LotNo = materialLot };
                MESRoot<object> root = new MESRoot<object>()
                {
                    From = "WMS",
                    DateTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
                    Content = obj
                };
                JsonSerializerSettings settings = new JsonSerializerSettings
                {
                    ContractResolver = new CamelCasePropertyNamesContractResolver()
                };
                string request = JsonConvert.SerializeObject(root, settings);
                string response = HttpMesHelper.Post(apiInfo.ApiAddress, request);
                MesResponseContent mesResponseContent = response.DeserializeObject<MesResponseContent>();
                //调用接口
                if (mesResponseContent.BSucc == true)
                {
                    content.OK(mesResponseContent.StrMsg, mesResponseContent.Content);
                }
                else
                {
                    content.Error(mesResponseContent.StrMsg);
                }
            }
            catch (Exception ex)
            {
                content.Error(ex.Message);
            }
            return content;
        }
    }
}