Prechádzať zdrojové kódy

重命名并实现新的环形库申请货位逻辑

将 `RingApplyStockInLoc` 方法重命名为 `RingApplyStockInLoc1`,并添加了一个新的 `RingApplyStockInLoc` 方法。新的方法实现了环形库申请货位的完整逻辑,包括验证任务信息、仓库信息和库存信息,获取码垛信息和可用货位,分配货位,更新缓存和历史表信息,处理异常并记录日志。
林豪 左 7 mesiacov pred
rodič
commit
6276e5813b
1 zmenil súbory, kde vykonal 543 pridanie a 1 odobranie
  1. 543 1
      wms.service/Service/FJService.cs

+ 543 - 1
wms.service/Service/FJService.cs

@@ -4148,7 +4148,7 @@ namespace wms.service.Service
         ///     环形库申请货位
         ///     环形库申请货位
         /// </summary>
         /// </summary>
         /// <returns></returns>
         /// <returns></returns>
-        public SRes<FJApplyStockInLocResponse> RingApplyStockInLoc(FJApplyStockInLocRequest reqEntity)
+        public SRes<FJApplyStockInLocResponse> RingApplyStockInLoc1(FJApplyStockInLocRequest reqEntity)
         {
         {
             var res = new SRes<FJApplyStockInLocResponse>
             var res = new SRes<FJApplyStockInLocResponse>
             {
             {
@@ -4665,6 +4665,548 @@ namespace wms.service.Service
             return res;
             return res;
         }
         }
 
 
+        /// <summary>
+        ///     环形库申请货位
+        /// </summary>
+        /// <returns></returns>
+        public SRes<FJApplyStockInLocResponse> RingApplyStockInLoc(FJApplyStockInLocRequest reqEntity)
+        {
+            var res = new SRes<FJApplyStockInLocResponse>
+            {
+                ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode(),
+                ResMsg = ResponseStatusCodeEnum.Sucess.GetDescription(),
+                ResData = new FJApplyStockInLocResponse()
+            };
+
+            try
+            {
+                #region 任务信息是否正常
+
+                var wcsTask = _wcstaskoldrepository.AsQueryable().With("WITH(READPAST,ROWLOCK)")
+                    .Where(p => p.Id == reqEntity.TaskNum).SplitTable(tabs => tabs.Take(2)).First();
+
+                ;
+                if (wcsTask == null)
+                {
+                    res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
+                    res.ResMsg = ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();
+                    return res;
+                }
+
+                if (wcsTask.Type == TaskType.OutDepot)
+                {
+                    res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
+                    res.ResMsg = "该任务是出库任务,不能分配货位;任务号" + wcsTask.Id;
+                    return res;
+                }
+
+                if (!string.IsNullOrEmpty(wcsTask.AddrTo) && wcsTask.AddrTo != "Robot") //如果目标地址不是机器人
+                {
+                    res.ResData.CellNo = wcsTask.AddrTo;
+                    res.ResData.Row = wcsTask.AddrTo.Split('-')[0] != null
+                        ? int.Parse(wcsTask.AddrTo.Split('-')[0])
+                        : 0;
+                    res.ResData.Colomn = wcsTask.AddrTo.Split('-')[1] != null
+                        ? int.Parse(wcsTask.AddrTo.Split('-')[1])
+                        : 0;
+                    res.ResData.Layer = wcsTask.AddrTo.Split('-')[2] != null
+                        ? int.Parse(wcsTask.AddrTo.Split('-')[2])
+                        : 0;
+                    return res;
+                }
+
+                #endregion 任务信息是否正常
+
+                //验证仓库信息
+                var wareHouse = _basewarehouserepository.GetFirst(p => p.Code == wcsTask.WarehouseCode);
+                if (wareHouse == null)
+                {
+                    res.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode();
+                    res.ResMsg = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription();
+                    return res;
+                }
+
+                //验证库存
+                var stock = _billInvnowrepository.GetFirst(p => p.HWBarCode == wcsTask.BarCode);
+                if (stock == null)
+                {
+                    //获取条码表相关信息
+                    var billInvinit = _billInvinitrepository.GetList(x => x.HWBarCode == wcsTask.BarCode)
+                        .OrderByDescending(x => x.AddTime).FirstOrDefault();
+                    if (billInvinit == null)
+                    {
+                        res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
+                        res.ResMsg = "无条码信息";
+                        return res;
+                    }
+
+                    //将条码表映射到库存表
+                    stock = _mapper.Map<BillInvnow>(billInvinit);
+                    stock.AddTime = DateTime.Now;
+                    stock.InvStateCode = InvState.InvEcecState_BuildUp.ToString();
+                    stock.Id = IdFactory.NewId();
+                    if (!_billInvnowrepository.Insert(stock))
+                    {
+                        res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();
+                        res.ResMsg = "满轮库存信息存储失败";
+                        return res;
+                    }
+                }
+
+                if (stock.InvStateCode != InvState.InvEcecState_BuildUp.ToString())
+                {
+                    res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
+                    res.ResMsg = $"工字轮{wcsTask.BarCode}库存状态异常,不是已组盘,请检查相关任务信息";
+                    return res;
+                }
+
+                //获取包含当前物料、计划个数大于已有个数、未出库
+                var ringPalletizingInfoList = _billRingPalletizingInfo.GetList(x =>
+                    x.WareHouseId == wareHouse.Id && x.BomCode.Contains(wcsTask.MatCode) && x.HWCountQty > x.HaveQty &&
+                    !x.Out).OrderBy(x => x.AddTime);
+                BillRingPalletizingInfo ringPalletizingInfo = null;
+                if (ringPalletizingInfoList.Any())
+                    foreach (var ringPalletizing in ringPalletizingInfoList)
+                    {
+                        if (ringPalletizingInfo != null) continue;
+                        //取当前任务SKU在货位中已有的信息
+                        var cells = _basewarecellrepository.Context.Queryable<BaseWarecell, BillInvnow>((loc, inv) =>
+                                new object[]
+                                {
+                                    JoinType.Inner, loc.ContGrpBarCode == inv.ContGrpBarCode
+                                }).Where((loc, inv) =>
+                                loc.GroupID == ringPalletizing.Id && (loc.StateNum == FjLocationState.Full ||
+                                                                      loc.StateNum == FjLocationState.StockIn))
+                            .Select((loc, inv) => new
+                            {
+                                loc.GroupID,
+                                inv.MatCode,
+                                loc.XYNO
+                            }).ToList().Where(x => x.MatCode == wcsTask.MatCode && x.GroupID == ringPalletizing.Id);
+                        var bomSetInfo = _billBomsetinfoRepository.GetList(x =>
+                            x.BomSetHdrId == ringPalletizing.BomSetGrpId && x.IsEmpty == 0 &&
+                            x.MatCode == wcsTask.MatCode).ToList();
+                        if (cells.Count() == bomSetInfo.Count)
+                        {
+                            res.Memo2 = $"[{ringPalletizing.Id}]-同规格产品已满足需求,任务[{wcsTask.Id}]创建了新的码垛信息";
+                            ringPalletizingInfo = null;
+                        }
+                        else
+                        {
+                            ringPalletizingInfo = ringPalletizing;
+                        }
+                    }
+
+                if (ringPalletizingInfo != null)
+                {
+                    //取当前任务SKU在货位中已有的信息
+                    var cells = _basewarecellrepository.Context.Queryable<BaseWarecell, BillInvnow>((loc, inv) =>
+                            new object[]
+                            {
+                                JoinType.Inner, loc.ContGrpBarCode == inv.ContGrpBarCode
+                            }).Where((loc, inv) =>
+                            loc.GroupID == ringPalletizingInfo.Id && (loc.StateNum == FjLocationState.Full ||
+                                                                      loc.StateNum == FjLocationState.StockIn))
+                        .Select((loc, inv) => new
+                        {
+                            loc.GroupID,
+                            inv.MatCode,
+                            loc.XYNO
+                        }).ToList().Where(x => x.MatCode == wcsTask.MatCode && x.GroupID == ringPalletizingInfo.Id);
+                    var bomSetInfo = _billBomsetinfoRepository.GetList(x =>
+                        x.BomSetHdrId == ringPalletizingInfo.BomSetGrpId && x.IsEmpty == 0 &&
+                        x.MatCode == wcsTask.MatCode).ToList();
+                    if (cells.Count() == bomSetInfo.Count)
+                    {
+                        res.Memo2 = $"[{ringPalletizingInfo.Id}]-同规格产品已满足需求,任务[{wcsTask.Id}]创建了新的码垛信息";
+                        ringPalletizingInfo = null;
+                    }
+                }
+
+                if (ringPalletizingInfo == null) //如果没有码垛信息
+                {
+                    var bomsetGrp =
+                        _billBomsetgrpRepository.GetFirst(x => x.IsStop == 0 && x.BomCode.Contains(wcsTask.MatCode));
+                    if (bomsetGrp == null)
+                    {
+                        res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
+                        res.ResMsg = "未找到对应垛型信息,请确认是否被禁用";
+                        return res;
+                    }
+                    var xyNo = _billBomsetinfoRepository.GetList(x => x.BomSetHdrId == bomsetGrp.Id && x.IsEmpty == 0)
+                        .ToList().Select(x => Convert.ToInt32(x.XYNo)).OrderByDescending(x => x).First();
+                    //跟据垛形信息生成
+                    ringPalletizingInfo = new BillRingPalletizingInfo
+                    {
+                        Id = IdFactory.NewId(),
+                        WareHouseId = wareHouse.Id,
+                        BomSetGrpId = bomsetGrp.Id,
+                        HWCountQty = bomsetGrp.HWCountQty,
+                        BomCode = bomsetGrp.BomCode,
+                        HaveQty = 0,
+                        Out = false,
+                        LastXYNO = wareHouse.Code.Contains("N") ? xyNo + 1 : 0
+                    };
+
+                    if (!_billRingPalletizingInfo.Insert(ringPalletizingInfo))
+                    {
+                        res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();
+                        res.ResMsg = "环形库满轮码垛信息存储失败";
+                        return res;
+                    }
+
+                    res.Memo3 = $"[{wcsTask.MatCode}],任务[{wcsTask.Id}]创建了新的码垛信息";
+                }
+
+                //获取所有可用货位
+                var emptyLocList = _basewarecellrepository.Context
+                    .Queryable<BaseWarecell, BillInvnow, BaseWarecell, BillInvnow, BaseWarecell, BillInvnow>(
+                        (loc1, inv1, loc2, inv2, loc3, inv3) => new object[]
+                        {
+                             JoinType.Left, loc1.ContGrpBarCode == inv1.ContGrpBarCode,
+                             JoinType.Left, loc2.Col == loc1.Col && loc2.Layer == loc1.Layer,
+                             JoinType.Left, loc2.ContGrpBarCode == inv2.ContGrpBarCode,
+                             JoinType.Left, loc3.Col == loc2.Col && loc3.Layer == loc2.Layer,
+                             JoinType.Left, loc3.ContGrpBarCode == inv3.ContGrpBarCode
+                        })
+                    .Where((loc1, inv1, loc2, inv2, loc3, inv3) => loc1.WarehouseId == wareHouse.Id && loc2.WarehouseId == wareHouse.Id && loc3.WarehouseId == wareHouse.Id) //保证三个深度都是同一个从仓库的
+                    .Where((loc1, inv1, loc2, inv2, loc3, inv3) => loc1.IsStop == 0 && loc2.IsStop == 0 && loc3.IsStop == 0)
+                    .Where((loc1, inv1, loc2, inv2, loc3, inv3) => loc2.Size == loc1.Size && loc3.Size == loc1.Size)
+                    .Where((loc1, inv1, loc2, inv2, loc3, inv3) => wcsTask.GoodsType == 34 || (wcsTask.GoodsType != 34 && loc1.Layer != 6))
+                    .Where((loc1, inv1, loc2, inv2, loc3, inv3) => loc1.Depth == 1 && loc2.Depth == 2 && loc3.Depth == 3) //保证三个深度与字段对应
+                    .Where((loc1, inv1, loc2, inv2, loc3, inv3) => loc3.GroupID == ringPalletizingInfo.Id) //三深货位的绑定ID是码垛缓存信息的ID
+                    .Where((loc1, inv1, loc2, inv2, loc3, inv3) =>
+                        (loc1.StateNum == FjLocationState.Empty && (loc2.StateNum == FjLocationState.Full || loc2.StateNum == FjLocationState.StockIn) && loc3.StateNum == FjLocationState.Full) //1空、2有/入锁、3有
+                        || (loc1.StateNum == FjLocationState.Empty && loc2.StateNum == FjLocationState.Empty && (loc3.StateNum == FjLocationState.Full || loc3.StateNum == FjLocationState.StockIn)) //1空、2空、3有/入锁
+                    || (loc1.StateNum == FjLocationState.Empty && loc2.StateNum == FjLocationState.Empty && loc3.StateNum == FjLocationState.Empty)
+                ) //1空、2空、3空
+                .Where((loc1, inv1, loc2, inv2, loc3, inv3) =>
+                        loc3.StateNum == FjLocationState.Empty || ((loc3.StateNum == FjLocationState.Full || loc3.StateNum == FjLocationState.StockIn) && inv3.MatCode == wcsTask.MatCode))
+                .Select((loc1, inv1, loc2, inv2, loc3, inv3) => new
+                {
+                    Loc1Code = loc1.Code,
+                    Loc1Id = loc1.Id,
+                    Loc1Row = loc1.Row,
+                    Loc1Col = loc1.Col,
+                    Loc1Layer = loc1.Layer,
+                    Loc1Depth = loc1.Depth,
+                    Loc1Size = loc1.Size,
+                    Loc1StateNum = loc1.StateNum,
+                    Loc1ContGrpBarCode = loc1.ContGrpBarCode,
+                    Inv1MatCode = inv1.MatCode,
+                    Loc2Code = loc2.Code,
+                    Loc2Id = loc2.Id,
+                    Loc2Row = loc2.Row,
+                    Loc2Col = loc2.Col,
+                    Loc2Layer = loc2.Layer,
+                    Loc2Depth = loc2.Depth,
+                    Loc2Size = loc2.Size,
+                    Loc2StateNum = loc2.StateNum,
+                    Loc2ContGrpBarCode = loc2.ContGrpBarCode,
+                    Inv2MatCode = inv2.MatCode,
+                    Loc3Code = loc3.Code,
+                    Loc3Id = loc3.Id,
+                    Loc3Row = loc3.Row,
+                    Loc3Col = loc3.Col,
+                    Loc3Layer = loc3.Layer,
+                    Loc3Depth = loc3.Depth,
+                    Loc3Size = loc3.Size,
+                    Loc3StateNum = loc3.StateNum,
+                    Loc3ContGrpBarCode = loc3.ContGrpBarCode,
+                    Inv3MatCode = inv3.MatCode,
+                }).ToList();
+
+                if (emptyLocList.Any()) //有货位
+                {
+                    var emptyLoc = emptyLocList.OrderByDescending(x => x.Loc3StateNum)
+                    .ThenByDescending(x => x.Loc2StateNum)
+                    .ThenByDescending(x => x.Loc1StateNum)
+                    .First();
+                    if (emptyLoc.Loc3StateNum == FjLocationState.Empty) //优先3
+                    {
+                        res.ResData.CellNo = emptyLoc.Loc3Code;
+                        res.ResData.Row = emptyLoc.Loc3Row;
+                        res.ResData.Colomn = emptyLoc.Loc3Col;
+                        res.ResData.Layer = emptyLoc.Loc3Layer;
+                        res.ResData.Depth = emptyLoc.Loc3Depth;
+                    }
+                    else if (emptyLoc.Loc2StateNum == FjLocationState.Empty) //次2
+                    {
+                        res.ResData.CellNo = emptyLoc.Loc2Code;
+                        res.ResData.Row = emptyLoc.Loc2Row;
+                        res.ResData.Colomn = emptyLoc.Loc2Col;
+                        res.ResData.Layer = emptyLoc.Loc2Layer;
+                        res.ResData.Depth = emptyLoc.Loc2Depth;
+                    }
+                    else if (emptyLoc.Loc1StateNum == FjLocationState.Empty) //再次1
+                    {
+                        res.ResData.CellNo = emptyLoc.Loc1Code;
+                        res.ResData.Row = emptyLoc.Loc1Row;
+                        res.ResData.Colomn = emptyLoc.Loc1Col;
+                        res.ResData.Layer = emptyLoc.Loc1Layer;
+                        res.ResData.Depth = emptyLoc.Loc1Depth;
+                    }
+                }
+                else //找不到对应货位当前缓存信息对应的货位,找到三个全是同一货位的信息
+                {
+                    var emptyLocList1 = _basewarecellrepository.Context
+                       .Queryable<BaseWarecell, BaseWarecell, BaseWarecell>(
+                           (loc1, loc2, loc3) => new object[]
+                           {
+                            JoinType.Left, loc2.Col == loc1.Col && loc2.Layer == loc1.Layer,
+                            JoinType.Left, loc3.Col == loc2.Col && loc3.Layer == loc2.Layer,
+                           })
+                       .Where((loc1, loc2, loc3) => loc1.WarehouseId == wareHouse.Id && loc2.WarehouseId == wareHouse.Id && loc3.WarehouseId == wareHouse.Id) //保证三个深度都是同一个从仓库的
+                       .Where((loc1, loc2, loc3) => loc1.IsStop == 0 && loc2.IsStop == 0 && loc3.IsStop == 0)
+                       .Where((loc1, loc2, loc3) => loc2.Size == loc1.Size && loc3.Size == loc1.Size)
+                       .Where((loc1, loc2, loc3) => wcsTask.GoodsType == 34 || (wcsTask.GoodsType != 34 && loc1.Layer != 6))
+                       .Where((loc1, loc2, loc3) => loc1.Depth == 1 && loc2.Depth == 2 && loc3.Depth == 3) //保证三个深度与字段对应
+                       .Where((loc1, loc2, loc3) => loc1.GroupID == 0 && loc2.GroupID == 0 && loc3.GroupID == 0) //获取三个货位都是没有绑定缓存信息的
+                       .Where((loc1, loc2, loc3) => loc1.StateNum == FjLocationState.Empty && loc2.StateNum == FjLocationState.Empty && loc3.StateNum == FjLocationState.Empty) //1空、2空、3空
+                       .Select((loc1, loc2, loc3) => new
+                       {
+                           Loc1Code = loc1.Code,
+                           Loc1Id = loc1.Id,
+                           Loc1Row = loc1.Row,
+                           Loc1Col = loc1.Col,
+                           Loc1Layer = loc1.Layer,
+                           Loc1Depth = loc1.Depth,
+                           Loc1Size = loc1.Size,
+                           Loc1StateNum = loc1.StateNum,
+                           Loc1ContGrpBarCode = loc1.ContGrpBarCode,
+                           Loc2Code = loc2.Code,
+                           Loc2Id = loc2.Id,
+                           Loc2Row = loc2.Row,
+                           Loc2Col = loc2.Col,
+                           Loc2Layer = loc2.Layer,
+                           Loc2Depth = loc2.Depth,
+                           Loc2Size = loc2.Size,
+                           Loc2StateNum = loc2.StateNum,
+                           Loc2ContGrpBarCode = loc2.ContGrpBarCode,
+                           Loc3Code = loc3.Code,
+                           Loc3Id = loc3.Id,
+                           Loc3Row = loc3.Row,
+                           Loc3Col = loc3.Col,
+                           Loc3Layer = loc3.Layer,
+                           Loc3Depth = loc3.Depth,
+                           Loc3Size = loc3.Size,
+                           Loc3StateNum = loc3.StateNum,
+                           Loc3ContGrpBarCode = loc3.ContGrpBarCode,
+                       }).ToList();
+
+                    if (emptyLocList1.Any())
+                    {
+                        var emptyLoc = emptyLocList1.OrderBy(x => x.Loc3Layer).ThenBy(x => x.Loc3Col).First();
+                        res.ResData.CellNo = emptyLoc.Loc3Code;
+                        res.ResData.Row = emptyLoc.Loc3Row;
+                        res.ResData.Colomn = emptyLoc.Loc3Col;
+                        res.ResData.Layer = emptyLoc.Loc3Layer;
+                        res.ResData.Depth = emptyLoc.Loc3Depth;
+                    }
+                }
+
+                if (string.IsNullOrEmpty(res.ResData.CellNo)) //没有分配货位
+                {
+                    res.ResCode = ResponseStatusCodeEnum.NotEnoughLocation.GetHashCode();
+                    res.ResMsg = "有空货位单无可用货位";
+                    return res;
+                }
+
+                List<BillBomsetinfo> bomSetInfos = new List<BillBomsetinfo>();
+
+                //分配当前轮子在垛形中的位置
+                if (wareHouse.Code.Contains("N")) //北侧由大到小,出的时候刚好可用反过来;
+                {
+                    //取当前任务SKU在货位中已有的信息
+                    var cells = _basewarecellrepository.Context.Queryable<BaseWarecell, BillInvnow>((loc, inv) =>
+                            new object[]
+                            {
+                                JoinType.Inner, loc.ContGrpBarCode == inv.ContGrpBarCode
+                            }).Where((loc, inv) =>
+                            loc.GroupID == ringPalletizingInfo.Id && (loc.StateNum == FjLocationState.Full ||
+                                                                      loc.StateNum == FjLocationState.StockIn))
+                        .Select((loc, inv) => new
+                        {
+                            loc.GroupID,
+                            inv.MatCode,
+                            loc.XYNO
+                        }).ToList();
+                    if (cells.Count != ringPalletizingInfo.HaveQty)
+                    {
+                        res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
+                        res.ResMsg =
+                            $"码垛信息组【{ringPalletizingInfo.Id}】记录已有【{ringPalletizingInfo.HaveQty}】个轮子,但对应的库存信息只有【{cells.Count}】,请在WMS检查对应的库存信息";
+                        return res;
+                    }
+
+                    var cellMatCodeList = cells.Where(x => x.MatCode == wcsTask.MatCode);
+                    //取当前SKU在垛形明细中所有的信息
+                    bomSetInfos = _billBomsetinfoRepository.GetList(x =>
+                        x.BomSetHdrId == ringPalletizingInfo.BomSetGrpId && x.IsEmpty == 0 &&
+                        x.MatCode == wcsTask.MatCode).ToList();
+                    //取当前SKU在垛形明细中最大的一个坐标号,初始化时默认取第一个
+                    var lastXYNO = Convert.ToInt32(bomSetInfos.Select(x => Convert.ToInt32(x.XYNo))
+                        .OrderByDescending(x => x).First());
+                    if (cellMatCodeList.Any()) //货位中已有当前SKU的产品,取最小数,最小数表示最近入库的
+                    {
+                        lastXYNO = cellMatCodeList.OrderBy(x => x.XYNO).First().XYNO;
+                        var xyNo = bomSetInfos.Select(x => Convert.ToInt32(x.XYNo)).Where(x => x < lastXYNO)
+                            .OrderByDescending(x => x).First();
+                        ringPalletizingInfo.LastXYNO = xyNo;
+                    }
+                    else
+                    {
+                        ringPalletizingInfo.LastXYNO = lastXYNO;
+                    }
+                }
+                else //南侧小到大,出的时候刚好可用反过来;
+                {
+                    //取当前任务SKU在货位中已有的信息
+                    var cells = _basewarecellrepository.Context.Queryable<BaseWarecell, BillInvnow>((loc, inv) =>
+                            new object[]
+                            {
+                                JoinType.Inner, loc.ContGrpBarCode == inv.ContGrpBarCode
+                            }).Where((loc, inv) =>
+                            loc.GroupID == ringPalletizingInfo.Id && (loc.StateNum == FjLocationState.Full ||
+                                                                      loc.StateNum == FjLocationState.StockIn))
+                        .Select((loc, inv) => new
+                        {
+                            loc.GroupID,
+                            inv.MatCode,
+                            loc.XYNO
+                        }).ToList();
+                    if (cells.Count != ringPalletizingInfo.HaveQty)
+                    {
+                        res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
+                        res.ResMsg =
+                            $"码垛信息组【{ringPalletizingInfo.Id}】记录已有【{ringPalletizingInfo.HaveQty}】个轮子,但对应的库存信息只有【{cells.Count}】,请在WMS检查对应的库存信息";
+                        return res;
+                    }
+
+                    var cellMatCodeList = cells.Where(x => x.MatCode == wcsTask.MatCode);
+                    //取当前SKU在垛形明细中所有的信息
+                    bomSetInfos = _billBomsetinfoRepository.GetList(x =>
+                        x.BomSetHdrId == ringPalletizingInfo.BomSetGrpId && x.IsEmpty == 0 &&
+                        x.MatCode == wcsTask.MatCode).ToList();
+                    //取当前SKU在垛形明细中最小的一个坐标号 ,初始化时默认取第一个
+                    var lastXYNO =
+                        Convert.ToInt32(bomSetInfos.Select(x => Convert.ToInt32(x.XYNo)).OrderBy(x => x).First());
+                    if (cellMatCodeList.Any()) //货位中已有当前SKU的产品,取最大数 最大数表示最近入库的
+                    {
+                        lastXYNO = cellMatCodeList.OrderByDescending(x => x.XYNO).First().XYNO;
+                        var xyNo = bomSetInfos.Select(x => Convert.ToInt32(x.XYNo)).Where(x => x > lastXYNO)
+                            .OrderBy(x => x).First();
+                        ringPalletizingInfo.LastXYNO = xyNo;
+                    }
+                    else
+                    {
+                        ringPalletizingInfo.LastXYNO = lastXYNO;
+                    }
+                }
+
+                if (_basewarecellrepository.AsQueryable().With(SqlWith.NoLock).Any(x =>
+                        x.GroupID == ringPalletizingInfo.Id && x.XYNO == ringPalletizingInfo.LastXYNO))
+                {
+                    res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
+                    res.ResMsg = $"当前位置已经被分配过了,请检查异常码垛信息{ringPalletizingInfo.Id}-{ringPalletizingInfo.LastXYNO}";
+                    return res;
+                }
+
+                try
+                {
+                    _db.BeginTran();
+                    var task = _wcstaskoldrepository.AsQueryable().With("WITH(READPAST,ROWLOCK)")
+                        .Where(p => p.Id == reqEntity.TaskNum)
+                        .SplitTable(x => x.Take(2)).First();
+                    if (task == null)
+                    {
+                        res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
+                        res.ResMsg = ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();
+                        return res;
+                    }
+
+                    if (task.Type == TaskType.OutDepot)
+                    {
+                        res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
+                        res.ResMsg = "该任务是出库任务,不能分配货位;任务号" + task.Id;
+                        return res;
+                    }
+
+                    var outTime = ringPalletizingInfo.AddTime;
+                    if (stock.ProductTime < ringPalletizingInfo.AddTime) outTime = stock.ProductTime;
+
+                    //更新目标缓存信息
+                    if (!_billRingPalletizingInfo.UpdateModelColumns(
+                            p => new BillRingPalletizingInfo
+                            {
+                                HaveQty = ringPalletizingInfo.HaveQty + 1,
+                                LastXYNO = ringPalletizingInfo.LastXYNO,
+                                AddTime = outTime
+                            }, p => p.Id == ringPalletizingInfo.Id))
+                    {
+                        _db.RollbackTran();
+                        res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
+                        res.ResMsg = $"货位{res.ResData.CellNo}被锁定";
+                        return res;
+                    }
+
+                    //更新目标货位
+                    if (!_basewarecellrepository.UpdateModelColumns(
+                            p => new BaseWarecell
+                            {
+                                StateNum = FjLocationState.StockIn,
+                                ContGrpBarCode = task.BarCode,
+                                ContGrpId = stock.ContGrpId,
+                                GroupID = ringPalletizingInfo.Id,
+                                EditTime = DateTime.Now,
+                                XYNO = ringPalletizingInfo.LastXYNO
+                            },
+                            p => p.WarehouseId == wareHouse.Id && p.Code == res.ResData.CellNo &&
+                                 p.StateNum == FjLocationState.Empty))
+                    {
+                        _db.RollbackTran();
+                        res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
+                        res.ResMsg = $"货位{res.ResData.CellNo}被锁定";
+                        return res;
+                    }
+
+                    //更新货位信息至历史表,防止WCS重复请求,导致信息异常
+                    if (!_wcstaskoldrepository.UpdateSplitTableModelColumns(x => new WCS_TaskOld
+                    {
+                        AddrTo = res.ResData.CellNo
+                    }, x => x.Id == wcsTask.Id && x.AddrTo == "Robot"))
+                    {
+                        _db.RollbackTran();
+                        res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
+                        res.ResMsg = $"货位{res.ResData.CellNo}更新货位至任务历史表失败";
+                        return res;
+                    }
+
+                    var bomSetInfo = bomSetInfos.First(x => x.XYNo == ringPalletizingInfo.LastXYNO.ToString());
+                    //更新库存货物大小信息
+                    _billInvnowrepository.UpdateModelColumns(
+                        x => new BillInvnow { Size = reqEntity.Height, SideNum = bomSetInfo.SideNum },
+                        x => x.Id == stock.Id);
+
+                    _db.CommitTran();
+                }
+                catch (Exception ex)
+                {
+                    _db.RollbackTran();
+                    _logger.LogInformation(ex.ToString());
+                    res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
+                    res.ResMsg = ex.Message;
+                }
+            }
+            catch (Exception ex)
+            {
+                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
+                res.ResMsg = ex.Message + ex.StackTrace;
+            }
+
+            return res;
+        }
+
         #endregion
         #endregion
 
 
         //#region 环形库货位申请(三深)
         //#region 环形库货位申请(三深)