|
@@ -4148,7 +4148,7 @@ namespace wms.service.Service
|
|
|
/// 环形库申请货位
|
|
|
/// </summary>
|
|
|
/// <returns></returns>
|
|
|
- public SRes<FJApplyStockInLocResponse> RingApplyStockInLoc(FJApplyStockInLocRequest reqEntity)
|
|
|
+ public SRes<FJApplyStockInLocResponse> RingApplyStockInLoc1(FJApplyStockInLocRequest reqEntity)
|
|
|
{
|
|
|
var res = new SRes<FJApplyStockInLocResponse>
|
|
|
{
|
|
@@ -4665,6 +4665,548 @@ namespace wms.service.Service
|
|
|
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
|
|
|
|
|
|
//#region 环形库货位申请(三深)
|