| | |
| | | .AndIF(!string.IsNullOrWhiteSpace(model.PalletNo), it => it.PalletNo.Contains(model.PalletNo.Trim())) |
| | | .AndIF(!string.IsNullOrWhiteSpace(model.LocatNo), it => it.LocatNo.Contains(model.LocatNo.Trim())) |
| | | .AndIF(!string.IsNullOrEmpty(model.RoadwayNo), a => a.RoadwayNo == model.RoadwayNo) |
| | | .AndIF(!string.IsNullOrEmpty(model.WareHouseNo), a => a.RoadwayNo == model.WareHouseNo) |
| | | .AndIF(strList.Count>0, it => strList.Contains((int)it.ASNDetailNo)) |
| | | .AndIF(!string.IsNullOrEmpty(model.WareHouseNo), a => a.WareHouseNo == model.WareHouseNo) |
| | | .AndIF(strList.Count > 0, it => strList.Contains((int)it.ASNDetailNo)) |
| | | .AndIF(!string.IsNullOrWhiteSpace(model.LotNo), it => it.LotNo.Contains(model.LotNo.Trim())) |
| | | .AndIF(!string.IsNullOrWhiteSpace(model.LotText), it => it.LotText.Contains(model.LotText.Trim())) |
| | | .AndIF(!string.IsNullOrWhiteSpace(model.StartTime), it => it.CreateTime >= Convert.ToDateTime(model.StartTime)) |
| | |
| | | }) |
| | | .OrderBy(a => a.Status).OrderByDescending(a => a.CreateTime) |
| | | .ToOffsetPage(model.Page, model.Limit, ref total); |
| | | |
| | | |
| | | count = data.Count; |
| | | return data; |
| | | |
| | |
| | | { |
| | | try |
| | | { |
| | | Expression<Func<BllBoxInfo, bool>> item1 = Expressionable.Create<BllBoxInfo>() |
| | | .AndIF(!string.IsNullOrWhiteSpace(model.ASNNo), it => it.ASNNo.Contains(model.ASNNo.Trim())) |
| | | .AndIF(!string.IsNullOrWhiteSpace(model.PalletNo), it => it.PalletNo.Contains(model.PalletNo.Trim())) |
| | | .AndIF(!string.IsNullOrWhiteSpace(model.LotNo), it => it.LotNo.Contains(model.LotNo.Trim())) |
| | | .AndIF(!string.IsNullOrWhiteSpace(model.SkuNo), it => it.SkuNo.Contains(model.SkuNo.Trim())) |
| | | .AndIF(!string.IsNullOrWhiteSpace(model.SkuName), it => it.SkuName.Contains(model.SkuName.Trim())) |
| | | .AndIF((model.BindNo != 0 && !string.IsNullOrWhiteSpace(model.BindNo.ToString())),it=>it.BindNo == model.BindNo) |
| | | .And(m => m.IsDel == "0") |
| | | .ToExpression(); |
| | | |
| | | var total = 0; |
| | | var data = Db.Queryable<BllBoxInfo>().Where(m => m.IsDel =="0" && m.BindNo == model.BindNo) |
| | | DbHelper<BllBoxInfo> helper = new DbHelper<BllBoxInfo>(Db); |
| | | var data = helper.GetAllWhereAsync(item1).Where(m => m.IsDel == "0") |
| | | .LeftJoin<BllPalletBind>((a, b) => a.BindNo == b.Id) |
| | | .GroupBy((a, b) => new |
| | | { |
| | |
| | | { |
| | | try |
| | | { |
| | | |
| | | //获取托盘绑定信息 |
| | | var bind = Db.Queryable<BllPalletBind>().First(m => m.IsDel == "0" && m.Id == id); |
| | | if (bind == null) |
| | | { |
| | |
| | | { |
| | | throw new Exception("该托盘绑定信息的状态不是等待入库,不能删除"); |
| | | } |
| | | //获取除删除绑定信息外是否存在该托盘且同单据其它绑定信息 |
| | | var bindid = Db.Queryable<BllPalletBind>().Where(m => m.IsDel == "0" && m.PalletNo == bind.PalletNo && m.Id != id && m.ASNNo == bind.ASNNo).ToList(); |
| | | //获取托盘信息 |
| | | var pallet = Db.Queryable<SysPallets>().First(a => a.IsDel == "0" && a.PalletNo == bind.PalletNo && a.Status == "1"); |
| | | if (pallet == null) |
| | |
| | | b.UpdateTime = time; |
| | | b.UpdateUser = userId; |
| | | var i = Db.Updateable(b).ExecuteCommand(); |
| | | if (i!=1) |
| | | if (i != 1) |
| | | { |
| | | throw new Exception($"{b.BoxNo}箱码、{b.BoxNo3}支码删除失败"); |
| | | } |
| | |
| | | { |
| | | noticeDetail.Status = "0"; |
| | | //获取状态不是等待执行的明细信息 |
| | | var count = Db.Queryable<BllArrivalNoticeDetail>().Count(m => m.IsDel == "0" && m.Id != noticeDetail.Id && m.ASNNo == bind.ASNNo && m.Status !="0"); |
| | | if (count==0) |
| | | var count = Db.Queryable<BllArrivalNoticeDetail>().Count(m => m.IsDel == "0" && m.Id != noticeDetail.Id && m.ASNNo == bind.ASNNo && m.Status != "0"); |
| | | if (count == 0) |
| | | { |
| | | //修改入库单信息 |
| | | var notice = Db.Queryable<BllArrivalNotice>().First(m => m.IsDel == "0" && m.ASNNo == bind.ASNNo); |
| | |
| | | Db.Updateable(noticeDetail).ExecuteCommand(); |
| | | } |
| | | |
| | | pallet.Status = "0"; |
| | | pallet.UpdateUser = userId; |
| | | pallet.UpdateTime = DateTime.Now; |
| | | Db.Updateable(pallet).ExecuteCommand(); |
| | | if (bindid.Count == 0) |
| | | { |
| | | pallet.Status = "0"; |
| | | pallet.UpdateUser = userId; |
| | | pallet.UpdateTime = DateTime.Now; |
| | | Db.Updateable(pallet).ExecuteCommand(); |
| | | } |
| | | |
| | | new OperationASNServer().AddLogOperationAsn("入库作业", "托盘绑定", bind.PalletNo, "删除", $"删除了入库单:{bind.ASNNo}、托盘码:{bind.PalletNo}的信息", userId); |
| | | Db.CommitTran(); |
| | |
| | | { |
| | | item.ASNNo = ""; |
| | | item.ASNDetailNo = null; |
| | | } |
| | | } |
| | | item.BindNo = null; |
| | | item.PalletNo = ""; |
| | | item.Status = "0"; |
| | |
| | | Db.Updateable(boxInfos).ExecuteCommand(); |
| | | |
| | | //修改托盘绑定信息 |
| | | bind.Qty -= qty; |
| | | bind.Qty -= qty; // 数量变更 |
| | | bind.BitPalletMark = "1"; // 零托标记变更 |
| | | |
| | | if (bind.Qty ==0) |
| | | if (bind.Qty == 0) |
| | | { |
| | | //判断是否有指定储位 |
| | | if (!string.IsNullOrWhiteSpace(bind.LocatNo)) |
| | |
| | | } |
| | | |
| | | var info = boxInfo.First(m => m.BindNo == bind.Id); |
| | | //入库单明细 |
| | | var noticeDetail = Db.Queryable<BllArrivalNoticeDetail>().First(m => m.IsDel == "0" && m.Id == bind.ASNDetailNo); |
| | | if (noticeDetail == null && info.SkuNo != "100099") |
| | | { |
| | | throw new Exception("未查询到托盘绑定的入库单明细信息"); |
| | | } |
| | | var log = new BllAuditLog() |
| | | { |
| | | OrderNo = notice.ASNNo, |
| | | PalletNo = bind.PalletNo, |
| | | Msg = $"物料:{info.SkuNo}、批次:{info.LotNo};", |
| | | Msg = info == null ? $"物料:{noticeDetail.SkuNo}、批次:{noticeDetail.LotNo};" : $"物料:{info.SkuNo}、批次:{info.LotNo};", |
| | | Reason = reason, |
| | | Status = "0", |
| | | Opinion = "", |
| | |
| | | |
| | | #region 指定储位 |
| | | //指定储位数据源(正常的空储位) |
| | | public List<LocatDto> GetLocateList(string houseNo, string roadwayNo, string row, string column, string layer, string locateNo, int page, int limit, out int count) |
| | | public List<LocatDto> GetLocateList(string houseNo, string roadwayNo, string row, string column, string layer, string locateNo, string BindId, int page, int limit, out int count) |
| | | { |
| | | try |
| | | { |
| | | //获取托盘绑定 |
| | | var bindASNDetailNo = Db.Queryable<BllPalletBind>().Where(a => a.IsDel == "0" && a.Status == "0" && a.Id == int.Parse(BindId)).Select(a => a.ASNDetailNo).First(); |
| | | //获取单据明细 |
| | | var noticeDetailSkuNo = Db.Queryable<BllArrivalNoticeDetail>().Where(a => a.Id == bindASNDetailNo && a.IsDel == "0").Select(a => a.SkuNo).First(); |
| | | //获取物料 |
| | | var skuCategoryNo = Db.Queryable<SysMaterials>().Where(a => a.IsDel == "0" && a.SkuNo == noticeDetailSkuNo).Select(a => a.CategoryNo).First(); |
| | | //获取物料对应区域 |
| | | var categoryAreaNo = Db.Queryable<SysMaterialCategory>().Where(a => a.IsDel == "0" && a.CategoryNo == skuCategoryNo).Select(a => a.AreaNo).First(); |
| | | |
| | | Expression<Func<SysStorageLocat, bool>> item = Expressionable.Create<SysStorageLocat>() |
| | | .AndIF(!string.IsNullOrWhiteSpace(roadwayNo), m => m.RoadwayNo == roadwayNo) |
| | | .AndIF(!string.IsNullOrWhiteSpace(row), m => m.Row == int.Parse(row)) |
| | | .AndIF(!string.IsNullOrWhiteSpace(column), m => m.Column == int.Parse(column)) |
| | | .AndIF(!string.IsNullOrWhiteSpace(layer), m => m.Layer == int.Parse(layer)) |
| | | .AndIF(!string.IsNullOrWhiteSpace(locateNo), m => m.LocatNo.Contains(locateNo)) |
| | | .And(m => m.IsDel == "0" && m.Status=="0" && m.Flag == "0" && m.WareHouseNo == houseNo) |
| | | .And(m => m.IsDel == "0" && m.Status == "0" && m.Flag == "0" && m.WareHouseNo == houseNo) |
| | | .And(m => m.AreaNo.Contains(categoryAreaNo)) |
| | | .ToExpression();//注意 这一句 不能少 |
| | | var total = 0; |
| | | var list = Db.Queryable<SysStorageLocat>().Where(item) |
| | |
| | | { |
| | | throw new Exception("该储位状态不是空储位或标志不是正常的"); |
| | | } |
| | | |
| | | |
| | | |
| | | //判断当前托盘是否存在绑定信息 |
| | | if (bind.LocatNo != null) |
| | | { |
| | | //分割已绑储位与新储位 |
| | | //已绑储位 |
| | | var bindRow = bind.LocatNo.Substring(0, 2); |
| | | var bindColumn = bind.LocatNo.Substring(2, 2); |
| | | var bindLayer = bind.LocatNo.Substring(4, 2); |
| | | var bindDepth = bind.LocatNo.Substring(6, 2); |
| | | //新储位 |
| | | var Row = locate.LocatNo.Substring(0, 2); |
| | | var Column = locate.LocatNo.Substring(2, 2); |
| | | var Layer = locate.LocatNo.Substring(4, 2); |
| | | var Depth = locate.LocatNo.Substring(6, 2); |
| | | |
| | | if (bindDepth == "02") |
| | | { |
| | | //判断排列层是否相同 |
| | | if (bindRow == Row && bindColumn == Column && bindLayer == Layer) |
| | | { |
| | | throw new Exception("同储位深度2不可向深度1切换!"); |
| | | } |
| | | } |
| | | } |
| | | else |
| | | { |
| | | //若是深度1的 则判断深度2是否为空储位 |
| | | if (locate.Depth == "01") |
| | | { |
| | | var locateDepth = Db.Queryable<SysStorageLocat>().First(a => a.IsDel == "0" && a.Row == locate.Row && a.Column == locate.Column && a.Layer == locate.Layer && a.Depth == "02"); |
| | | if (locateDepth != null) |
| | | { |
| | | if (locateDepth.Status != "1") |
| | | { |
| | | throw new Exception("该储位深度2不是有物品,不可绑定"); |
| | | } |
| | | } |
| | | } |
| | | //判断是否为深度2的 若为深度2 则获取深度1储位 判断是否为空储位 |
| | | if (locate.Depth == "02") |
| | | { |
| | | var locateDepth = Db.Queryable<SysStorageLocat>().First(a => a.IsDel == "0" && a.Row == locate.Row && a.Column == locate.Column && a.Layer == locate.Layer && a.Depth == "01"); |
| | | if (locateDepth.Status != "0" || locateDepth.Flag == "2") |
| | | { |
| | | throw new Exception("该储位深度1不是空储位或标志不是正常的"); |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | var bindIdList = Db.Queryable<BllPalletBind>().Where(m => m.IsDel == "0" && m.PalletNo == bind.PalletNo && m.Status != "2").Select(m => m.Id).ToList(); |
| | | //判断是否有零箱 |
| | | foreach (var item in bindIdList) |
| | |
| | | //获取同托盘的托盘绑定信息 |
| | | var bindList = Db.Queryable<BllPalletBind>() |
| | | .Where(m => m.IsDel == "0" && m.PalletNo == bind.PalletNo && m.Status == "0").ToList(); |
| | | if (bindList.Count>0) |
| | | if (bindList.Count > 0) |
| | | { |
| | | foreach (var b in bindList) |
| | | { |
| | |
| | | } |
| | | #endregion |
| | | |
| | | // 申请巷道 |
| | | public OutCommandDto RequestRoadWay(string palletNo, string houseNo) |
| | | { |
| | | try |
| | | { |
| | | //验证托盘条码是否为空 |
| | | if (string.IsNullOrEmpty(palletNo)) |
| | | { |
| | | throw new Exception("请输入要申请的托盘条码"); |
| | | } |
| | | //验证所属仓库是否为空 |
| | | if (string.IsNullOrEmpty(houseNo)) |
| | | { |
| | | throw new Exception("请选择所属仓库"); |
| | | } |
| | | //验证是否为平库入库 |
| | | if (houseNo == "W02") |
| | | { |
| | | throw new Exception("平库请使用PDA手持进行平库入库"); |
| | | } |
| | | |
| | | OutCommandDto comDto;//返回wcs的入库命令 |
| | | var isHaveLocateNo = false; //托盘绑定信息中是否已有指定储位 |
| | | |
| | | var stock = Db.Queryable<SysPallets>().First(a => a.PalletNo == palletNo);//托盘信息 |
| | | |
| | | //判断托盘条码是否有效 |
| | | if (stock == null) |
| | | { |
| | | throw new Exception("托盘条码不受WMS管理,不可入库!"); |
| | | } |
| | | |
| | | #region |
| | | |
| | | //查询托盘绑定信息(状态为等待入库的) |
| | | var palletBindList = Db.Queryable<BllPalletBind>().Where(m => m.IsDel == "0" && m.PalletNo == palletNo && m.Status != "2").ToList(); |
| | | var haveLocate = palletBindList.FirstOrDefault(m => !string.IsNullOrWhiteSpace(m.LocatNo)); |
| | | |
| | | var skuList = Db.Queryable<SysMaterials>().Where(m => m.IsDel == "0").ToList(); |
| | | //物料类别信息 |
| | | var skuCategoryList = Db.Queryable<SysMaterialCategory>().Where(m => m.IsDel == "0").ToList(); |
| | | |
| | | var skuNo = ""; //入库物料 |
| | | |
| | | if (palletBindList.Count >= 1) //正常入库 |
| | | { |
| | | var palletBind = palletBindList.FirstOrDefault(m => m.Status == "1");//查询是否有正在执行的托盘绑定 |
| | | if (palletBind != null) |
| | | { |
| | | var beingTask = Db.Queryable<LogTask>().First(m => m.IsDel == "0" && m.TaskNo == palletBind.TaskNo); |
| | | if (beingTask == null) |
| | | { |
| | | throw new Exception("该托盘正在入库,但未查询到任务信息"); |
| | | } |
| | | comDto = new OutCommandDto() |
| | | { |
| | | PalletNo = palletNo,//托盘号 |
| | | StartRoadway = beingTask.StartRoadway, // 起始巷道 |
| | | StartLocate = "", // 起始位置 |
| | | EndLocate = beingTask.EndLocat, // 目标位置 |
| | | EndRoadway = beingTask.EndRoadway, // 目标巷道 |
| | | TaskNo = beingTask.TaskNo, // 任务号 |
| | | TaskType = "0",// 任务类型 (出库) |
| | | OutMode = "", //目标地址 |
| | | Order = 1 |
| | | }; |
| | | return comDto; |
| | | } |
| | | if (haveLocate != null) |
| | | { |
| | | isHaveLocateNo = true; //已有指定储位 |
| | | } |
| | | |
| | | if (palletBindList.First().Type == "0") //物料托入库 |
| | | { |
| | | //判断是否绑定单据及单据状态是否正常 |
| | | foreach (var item in palletBindList) |
| | | { |
| | | var notice = Db.Queryable<BllArrivalNotice>().First(m => m.IsDel == "0" && m.ASNNo == item.ASNNo); |
| | | if (notice == null) |
| | | { |
| | | throw new Exception("托盘存在物料未绑定入库单,不可入库!"); |
| | | } |
| | | if (notice.Status == "3") |
| | | { |
| | | throw new Exception($"入库单{item.ASNNo}已关闭,不可入库!"); |
| | | } |
| | | } |
| | | |
| | | //获取物料存放区域 |
| | | var noticeDetail = Db.Queryable<BllArrivalNoticeDetail>().First(m => |
| | | m.IsDel == "0" && m.Id == palletBindList.First().ASNDetailNo); |
| | | if (noticeDetail == null) |
| | | { |
| | | throw new Exception("托盘存在物料未绑定入库单明细,不可入库"); |
| | | } |
| | | |
| | | skuNo = noticeDetail.SkuNo; |
| | | |
| | | } |
| | | else if (palletBindList.First().Type == "1")//空托盘 |
| | | { |
| | | skuNo = "100099"; |
| | | } |
| | | } |
| | | else //回流入库 |
| | | { |
| | | var stockDetail = Db.Queryable<DataStockDetail>().Where(m => m.PalletNo == palletNo).ToList(); |
| | | if (stockDetail.Count == 0) |
| | | { |
| | | throw new Exception($"{palletNo}托盘条码不具有箱码信息,不可入库!"); |
| | | } |
| | | skuNo = stockDetail.First().SkuNo; |
| | | |
| | | //获取对应回库规则 |
| | | var function = Db.Queryable<SysFunSetting>().First(a => a.IsDel == "0" && a.FunSetName == "托盘回库验证" && a.IsEnable == "NO"); |
| | | #region 托盘回库规则 |
| | | |
| | | if (function != null) |
| | | { |
| | | //拣货完成后允许托盘回库 |
| | | if (function.SetValue == "CompletePick") |
| | | { |
| | | var allot = Db.Queryable<BllExportAllot>().First(a => a.IsDel == "0" && a.LotNo == stockDetail[0].LotNo && a.PalletNo == palletNo && a.SkuNo == stockDetail[0].SkuNo); |
| | | |
| | | //验证拣货明细是否存在 |
| | | if (allot != null) |
| | | { |
| | | //验证当前托盘拣货信息是否已完成 |
| | | if (allot.Status != "5") |
| | | { |
| | | throw new Exception("当前托盘拣货信息未完成,请完成后回库!"); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | #endregion |
| | | } |
| | | |
| | | var allotLocate = new AllotLocation(); |
| | | |
| | | SysStorageLocat locate; |
| | | |
| | | var sku = skuList.FirstOrDefault(m => m.SkuNo == skuNo); |
| | | if (sku == null) |
| | | { |
| | | throw new Exception("物料信息中未查询到入库单明细包含的物料信息,不可入库"); |
| | | } |
| | | //判断物料是否含有类别信息 |
| | | if (string.IsNullOrWhiteSpace(sku.CategoryNo)) |
| | | { |
| | | throw new Exception($"物料:{sku.SkuNo}未查询到类别信息"); |
| | | } |
| | | |
| | | var skuCategory = skuCategoryList.FirstOrDefault(m => m.CategoryNo == sku.CategoryNo); |
| | | if (skuCategory == null) |
| | | { |
| | | throw new Exception($"未在类别信息中查询到物料:{sku.SkuNo}包含的类别"); |
| | | } |
| | | |
| | | var areaStr = skuCategory.AreaNo.Split(","); |
| | | var areaList = new List<string>(); |
| | | foreach (var item in areaStr) |
| | | { |
| | | areaList.Add(item); |
| | | } |
| | | |
| | | var laneAllot = 0; //储位跳巷分配 0:跳着分配(一个一个分配)1:巷道按照优先级分配,同优先级顺序分配(一个巷道满了再分配下一个的巷道储位) |
| | | var funSet3 = Db.Queryable<SysFunSetting>().First(m => m.IsDel == "0" && m.FunSetName == "储位跳巷分配" && m.IsEnable == "NO"); |
| | | if (funSet3 != null) |
| | | { |
| | | switch (funSet3.SetValue) |
| | | { |
| | | case "JumpLaneAllot": |
| | | laneAllot = 0;//立库储位分配 巷道同优先级巷道跳着分配(一个一个分配) |
| | | break; |
| | | case "RankLaneAllot": |
| | | laneAllot = 1;//立库储位分配 巷道按照优先级分配,同优先级顺序分配(一个巷道满了再分配下一个的巷道储位) |
| | | break; |
| | | default: |
| | | laneAllot = 1;// 默认 跳着分配 |
| | | break; |
| | | } |
| | | } |
| | | var roadList = Db.Queryable<SysStorageLocat>().Where(m => m.WareHouseNo == houseNo && areaList.Contains(m.AreaNo)) |
| | | .GroupBy(m => m.RoadwayNo).OrderBy(m => m.RoadwayNo).Select(m => m.RoadwayNo).ToList(); |
| | | |
| | | SysRoadwayUseLog useLog = Db.Queryable<SysRoadwayUseLog>().Where(m => m.IsDel == "0" && roadList.Contains(m.RoadwayNo)).OrderByDescending(l => l.Id).First(); //巷道最后一次使用记录 |
| | | |
| | | #region 确定巷道排序 |
| | | |
| | | List<string> roadList2 = new List<string>(); |
| | | List<string> roadSmall = new List<string>(); |
| | | List<string> roadLarge = new List<string>(); |
| | | if (useLog != null) |
| | | { |
| | | roadList2.Add(useLog.RoadwayNo); |
| | | foreach (var r in roadList) |
| | | { |
| | | if (r == useLog.RoadwayNo) |
| | | { |
| | | continue; |
| | | } |
| | | //如果结果为0,则说明两个字符串相等; |
| | | //如果结果小于0,则说明第一个字符串小于第二个字符串; |
| | | //如果结果大于0,则说明第一个字符串大于第二个字符串。 |
| | | var bol = String.CompareOrdinal(r, useLog.RoadwayNo); |
| | | if (bol < 0) |
| | | { |
| | | roadSmall.Add(r); |
| | | } |
| | | if (bol > 0) |
| | | { |
| | | roadLarge.Add(r); |
| | | } |
| | | } |
| | | roadList2.AddRange(roadLarge); |
| | | roadList2.AddRange(roadSmall); |
| | | } |
| | | |
| | | roadList = roadList2; |
| | | #endregion |
| | | |
| | | |
| | | var roadNo = ""; |
| | | if (laneAllot == 0)//跳巷道平均分配 |
| | | { |
| | | //取各巷道所有排第一个合适位 |
| | | foreach (var l in roadList) |
| | | { |
| | | //如果上次是当前巷道则跳出 |
| | | if (useLog != null && l == useLog.RoadwayNo) |
| | | { |
| | | continue; |
| | | } |
| | | |
| | | var locateCount = Db.Queryable<SysStorageLocat>() |
| | | .Where(m => m.Status == "0" && m.Flag == "0" && areaList.Contains(m.AreaNo) && m.RoadwayNo == l).Count(); |
| | | |
| | | var bindNum = Db.Queryable<BllPalletBind>() |
| | | .Where(m => m.IsDel == "0" && m.Status == "0" && m.RoadwayNo == l) |
| | | .GroupBy(m => m.PalletNo).Select(m => m.PalletNo).Count(); |
| | | if (locateCount - bindNum > 0) |
| | | { |
| | | roadNo = l; |
| | | } |
| | | //当前巷有位置则退出 |
| | | if (roadNo != null) |
| | | { |
| | | break; |
| | | } |
| | | } |
| | | //如果跳巷道并且未找到合适空储位,则跳到最后一次使用的巷道查询 |
| | | |
| | | if (roadNo == null) |
| | | { |
| | | if (useLog != null) |
| | | { |
| | | var locateCount = Db.Queryable<SysStorageLocat>() |
| | | .Where(m => m.Status == "0" && m.Flag == "0" && areaList.Contains(m.AreaNo) && m.RoadwayNo == useLog.RoadwayNo).Count(); |
| | | |
| | | var bindNum = Db.Queryable<BllPalletBind>() |
| | | .Where(m => m.IsDel == "0" && m.Status == "0" && m.RoadwayNo == useLog.RoadwayNo) |
| | | .GroupBy(m => m.PalletNo).Select(m => m.PalletNo).Count(); |
| | | if (locateCount - bindNum > 0) |
| | | { |
| | | roadNo = useLog.RoadwayNo; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | else//按照巷道优先级分配 |
| | | { |
| | | foreach (var item in roadList) |
| | | { |
| | | var locateCount = Db.Queryable<SysStorageLocat>() |
| | | .Where(m => m.Status == "0" && m.Flag == "0" && areaList.Contains(m.AreaNo) && m.RoadwayNo == item).Count(); |
| | | |
| | | var bindNum = Db.Queryable<BllPalletBind>() |
| | | .Where(m => m.IsDel == "0" && m.Status == "0" && m.RoadwayNo == item) |
| | | .GroupBy(m => m.PalletNo).Select(m => m.PalletNo).Count(); |
| | | |
| | | if (locateCount - bindNum > 0) |
| | | { |
| | | roadNo = item; |
| | | } |
| | | //当前巷有位置则退出 |
| | | if (roadNo != null) |
| | | { |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | |
| | | if (string.IsNullOrWhiteSpace(roadNo)) |
| | | { |
| | | throw new Exception("未查询到空储位巷道"); |
| | | } |
| | | |
| | | Db.BeginTran(); |
| | | try |
| | | { |
| | | if (roadNo != null) |
| | | { |
| | | //添加巷道使用记录 |
| | | var log = new SysRoadwayUseLog |
| | | { |
| | | RoadwayNo = roadNo, |
| | | WareHouseNo = houseNo, |
| | | Row = 0, |
| | | Column = 0, |
| | | Layer = 0, |
| | | }; |
| | | Db.Insertable(log).ExecuteCommand(); |
| | | } |
| | | |
| | | if (palletBindList.Count >= 1) |
| | | { |
| | | foreach (var item in palletBindList) |
| | | { |
| | | item.WareHouseNo = houseNo; |
| | | item.RoadwayNo = roadNo; |
| | | item.TaskNo = ""; |
| | | } |
| | | Db.Updateable(palletBindList).ExecuteCommand(); |
| | | } |
| | | Db.CommitTran(); |
| | | comDto = new OutCommandDto() |
| | | { |
| | | PalletNo = palletNo,//托盘号 |
| | | StartRoadway = "", |
| | | StartLocate = "", // 起始位置 |
| | | EndLocate = "", // 目标位置 |
| | | EndRoadway = roadNo, // 目标巷道 |
| | | TaskNo = "", // 任务号 |
| | | TaskType = "0",// 任务类型 (出库) |
| | | OutMode = "", //目标地址 |
| | | Order = 1 |
| | | }; |
| | | |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | Db.RollbackTran(); |
| | | throw new Exception(ex.Message); |
| | | } |
| | | #endregion |
| | | |
| | | return comDto; |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | throw new Exception(e.Message); |
| | | } |
| | | } |
| | | |
| | | //申请储位 |
| | | public OutCommandDto RequestLocation(string palletNo, string houseNo, string roadwayNo) |
| | | { |
| | |
| | | //验证是否为平库入库 |
| | | if (houseNo == "W02") |
| | | { |
| | | throw new Exception("零箱库请使用PDA手持进行平库入库"); |
| | | throw new Exception("平库请使用PDA手持进行平库入库"); |
| | | } |
| | | |
| | | OutCommandDto comDto;//返回wcs的入库命令 |
| | |
| | | //查询托盘绑定信息(状态为等待入库的) |
| | | var palletBindList = Db.Queryable<BllPalletBind>().Where(m => m.IsDel == "0" && m.PalletNo == palletNo && m.Status != "2").ToList(); |
| | | var haveLocate = palletBindList.FirstOrDefault(m => !string.IsNullOrWhiteSpace(m.LocatNo)); |
| | | |
| | | |
| | | var skuList = Db.Queryable<SysMaterials>().Where(m => m.IsDel == "0").ToList(); |
| | | //物料类别信息 |
| | | var skuCategoryList = Db.Queryable<SysMaterialCategory>().Where(m => m.IsDel == "0").ToList(); |
| | | |
| | | |
| | | var skuNo = ""; //入库物料 |
| | | |
| | | if (palletBindList.Count >= 1) //正常入库 |
| | |
| | | } |
| | | |
| | | skuNo = noticeDetail.SkuNo; |
| | | |
| | | |
| | | } |
| | | else if(palletBindList.First().Type == "1")//空托盘 |
| | | else if (palletBindList.First().Type == "1")//空托盘 |
| | | { |
| | | skuNo = "100099"; |
| | | skuNo = "100099"; |
| | | } |
| | | } |
| | | else //回流入库 |
| | | { |
| | | var stockDetail = Db.Queryable<DataStockDetail>().Where(m => m.PalletNo == palletNo).ToList(); |
| | | if (stockDetail.Count==0) |
| | | if (stockDetail.Count == 0) |
| | | { |
| | | throw new Exception($"{palletNo}托盘条码不具有箱码信息,不可入库!"); |
| | | } |
| | | skuNo = stockDetail.First().SkuNo; |
| | | //else |
| | | //{ |
| | | // //判断是否有零箱 |
| | | // var detailIdList = stockDetail.Select(m => m.Id).ToList(); |
| | | // var dataBoxInfo = Db.Queryable<DataBoxInfo>().Where(m => detailIdList.Contains(m.StockDetailId)).ToList(); |
| | | // if (dataBoxInfo.Count(m => m.BitBoxMark == "1")>0) |
| | | // { |
| | | // throw new Exception($"{palletNo}托盘上有零箱,不可入库!"); |
| | | // } |
| | | if (!string.IsNullOrWhiteSpace(stockDetail.First().WareHouseNo)) |
| | | { |
| | | if (stockDetail.First().WareHouseNo == "W01")//立库 |
| | | { |
| | | throw new Exception($"{palletNo}托盘上在立库中有库存储位信息,请核实!"); |
| | | } |
| | | |
| | | //} |
| | | if (stockDetail.First().WareHouseNo == "W02")//平库 |
| | | { |
| | | var locatePingKu = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == stockDetail.First().LocatNo); |
| | | if (locatePingKu != null) |
| | | { |
| | | locatePingKu.Status = "0"; |
| | | Db.Updateable(locatePingKu).ExecuteCommand(); |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | //获取对应回库规则 |
| | | var function = Db.Queryable<SysFunSetting>().First(a => a.IsDel == "0" && a.FunSetName == "托盘回库验证" && a.IsEnable == "NO"); |
| | | var function = Db.Queryable<SysFunSetting>().First(a => a.IsDel == "0" && a.FunSetName == "托盘回库验证" && a.IsEnable == "NO"); |
| | | #region 托盘回库规则 |
| | | |
| | | if (function != null) |
| | |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | #endregion |
| | | } |
| | |
| | | } |
| | | |
| | | locate = allotLocate.GetSuiTableLocate(houseNo, areaList, roadwayNo); |
| | | } |
| | | } |
| | | Db.BeginTran(); |
| | | try |
| | | { |
| | | if (locate != null) |
| | | { |
| | | //添加巷道使用记录 |
| | | var log = new SysRoadwayUseLog |
| | | { |
| | | RoadwayNo = locate.RoadwayNo, |
| | | LocateNo = locate.LocatNo, |
| | | WareHouseNo = locate.WareHouseNo, |
| | | Row = locate.Row, |
| | | Column = locate.Column, |
| | | Layer = locate.Layer, |
| | | Depth = locate.Depth |
| | | }; |
| | | Db.Insertable(log).ExecuteCommand(); |
| | | } |
| | | //if (locate != null) |
| | | //{ |
| | | // //添加巷道使用记录 |
| | | // var log = new SysRoadwayUseLog |
| | | // { |
| | | // RoadwayNo = locate.RoadwayNo, |
| | | // LocateNo = locate.LocatNo, |
| | | // WareHouseNo = locate.WareHouseNo, |
| | | // Row = locate.Row, |
| | | // Column = locate.Column, |
| | | // Layer = locate.Layer, |
| | | // Depth = locate.Depth |
| | | // }; |
| | | // Db.Insertable(log).ExecuteCommand(); |
| | | //} |
| | | |
| | | var taskNo = new Common().GetMaxNo("TK"); |
| | | var exTask = new LogTask //入库任务 |
| | |
| | | IsSuccess = 1, //是否下发成功 0失败 1成功 |
| | | SendDate = DateTime.Now, //发送时间 |
| | | BackDate = DateTime.Now, //返回时间 |
| | | StartRoadway="", // 起始巷道 |
| | | StartRoadway = "", // 起始巷道 |
| | | StartLocat = "",//起始位置 |
| | | EndLocat = locate.LocatNo,//目标位置 |
| | | EndRoadway = locate.RoadwayNo, // 目标巷道 |
| | |
| | | var stockDetail = Db.Queryable<DataStockDetail>().Where(m => m.PalletNo == task.PalletNo).ToList(); |
| | | //当前任务中的储位信息 |
| | | var locate = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == task.EndLocat); |
| | | if (locate==null) |
| | | if (locate == null) |
| | | { |
| | | throw new Exception($"未查询到任务中的储位信息"); |
| | | } |
| | |
| | | return; |
| | | } |
| | | //正常入库 |
| | | var bindList = Db.Queryable<BllPalletBind>().Where(m => m.IsDel =="0" && m.TaskNo == taskNo && m.Status =="1").ToList(); |
| | | var bindList = Db.Queryable<BllPalletBind>().Where(m => m.IsDel == "0" && m.TaskNo == taskNo && m.Status == "1").ToList(); |
| | | if (bindList.Count == 0) |
| | | { |
| | | throw new Exception($"{taskNo}该任务没有对应的流水信息"); |
| | |
| | | { |
| | | throw new Exception("未查询到托盘绑定的入库单明细信息"); |
| | | } |
| | | var notice = Db.Queryable<BllArrivalNotice>().First(m => m.IsDel == "0" && m.ASNNo == noticeDetail.ASNNo); |
| | | if (notice == null) |
| | | { |
| | | throw new Exception("未查询到托盘绑定的入库单信息"); |
| | | } |
| | | string ownerNo = notice.CustomerNo;//货主编码 |
| | | string ownerName = notice.CustomerName;//货主名称 |
| | | |
| | | var sku1 = Db.Queryable<SysMaterials>().First(m => m.IsDel == "0" && m.SkuNo == noticeDetail.SkuNo); |
| | | string isinspect = "0"; |
| | |
| | | #region 库存明细 |
| | | var sd = new DataStockDetail() |
| | | { |
| | | LotNo = noticeDetail.LotNo, |
| | | LotNo = item.LotNo, |
| | | LotText = noticeDetail.LotText, |
| | | SupplierLot = noticeDetail.SupplierLot, |
| | | SkuNo = noticeDetail.SkuNo, |
| | |
| | | PackagNo = noticeDetail.PackagNo, |
| | | IsBale = item.IsBale, |
| | | IsBelt = item.IsBelt, |
| | | Demo = item.Demo, |
| | | |
| | | OwnerNo = ownerNo, |
| | | OwnerName = ownerName, |
| | | |
| | | IsDel = "0", |
| | | CreateUser = 0, |
| | |
| | | |
| | | #region 库存 |
| | | var dataStock = Db.Queryable<DataStock>().First(m => |
| | | m.IsDel == "0" && m.SkuNo == noticeDetail.SkuNo && m.LotNo == noticeDetail.LotNo); |
| | | m.IsDel == "0" && m.SkuNo == noticeDetail.SkuNo && m.LotNo == item.LotNo); |
| | | if (dataStock != null) |
| | | { |
| | | dataStock.Qty += item.Qty; |
| | |
| | | SkuNo = noticeDetail.SkuNo, |
| | | SkuName = noticeDetail.SkuName, |
| | | Standard = noticeDetail.Standard, |
| | | LotNo = noticeDetail.LotNo, |
| | | LotNo = item.LotNo, |
| | | LotText = noticeDetail.LotText, |
| | | Qty = item.Qty, |
| | | LockQty = 0, |
| | | FrozenQty = 0, |
| | | |
| | | OwnerNo = ownerNo, |
| | | OwnerName = ownerName, |
| | | |
| | | IsDel = "0", |
| | | CreateUser = userId, |
| | |
| | | .Count(m => m.IsDel == "0" && m.ASNNo == noticeDetail.ASNNo && m.Status != "2"); |
| | | if (asnDetailNum == 0) |
| | | { |
| | | var notice = Db.Queryable<BllArrivalNotice>().First(m => m.IsDel == "0" && m.ASNNo == noticeDetail.ASNNo); |
| | | notice.Status = "2"; |
| | | notice.CompleteTime = comTime; |
| | | Db.Updateable(notice).ExecuteCommand(); |
| | |
| | | skuNo = stockDetail.First().SkuNo; |
| | | } |
| | | |
| | | var sku = Db.Queryable<SysMaterials>().First(m =>m.IsDel =="0" && m.SkuNo == skuNo); |
| | | var sku = Db.Queryable<SysMaterials>().First(m => m.IsDel == "0" && m.SkuNo == skuNo); |
| | | if (sku == null) |
| | | { |
| | | throw new Exception("物料信息中未查询到入库单明细包含的物料信息,不可入库"); |
| | |
| | | throw new Exception($"物料:{sku.SkuNo}未查询到类别信息"); |
| | | } |
| | | |
| | | var skuCategory = Db.Queryable<SysMaterialCategory>().First(m =>m.IsDel=="0" && m.CategoryNo == sku.CategoryNo); |
| | | var skuCategory = Db.Queryable<SysMaterialCategory>().First(m => m.IsDel == "0" && m.CategoryNo == sku.CategoryNo); |
| | | if (skuCategory == null) |
| | | { |
| | | throw new Exception($"未在类别信息中查询到物料:{sku.SkuNo}包含的类别"); |
| | |
| | | //} |
| | | //catch (Exception ex) |
| | | //{ |
| | | // 整个仓库都没有找到托盘 |
| | | if (asnNo != "回流托盘") |
| | | { |
| | | palletBindModel.Status = "0"; // 等待执行 |
| | | palletBindModel.LocatNo = ""; // 储位地址 |
| | | Db.Updateable(palletBindModel).ExecuteCommand(); |
| | | Db.CommitTran(); |
| | | } |
| | | // 整个仓库都没有找到托盘 |
| | | if (asnNo != "回流托盘") |
| | | { |
| | | palletBindModel.Status = "0"; // 等待执行 |
| | | palletBindModel.LocatNo = ""; // 储位地址 |
| | | Db.Updateable(palletBindModel).ExecuteCommand(); |
| | | Db.CommitTran(); |
| | | } |
| | | |
| | | return null; |
| | | //throw ex; |
| | | //} |
| | | return null; |
| | | //throw ex; |
| | | //} |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | // 生成入库任务 |
| | | var taskNo = new Common().GetMaxNo("TK"); // 获取任务编号 |
| | |
| | | Type = "0", //任务类型 0 入库任务 1 出库任务 2 移库任务 |
| | | Status = "1", //任务状态0:等待执行1正在执行2执行完成 |
| | | OrderType = "0", //0 入库单 1 出库单 2 盘点单 3 移库单 |
| | | Msg = taskModel.EndLocat+">>>>" + locate.LocatNo + "的入库任务", //关键信息 |
| | | Msg = taskModel.EndLocat + ">>>>" + locate.LocatNo + "的入库任务", //关键信息 |
| | | }; |
| | | Db.Insertable(exTask).ExecuteCommand(); |
| | | locate.Status = "2"; |
| | |
| | | |
| | | //托盘绑定信息 |
| | | var bind = Db.Queryable<BllPalletBind>().Where(m => m.IsDel == "0" && m.TaskNo == taskNo).ToList(); |
| | | if (bind.Count >0) |
| | | if (bind.Count > 0) |
| | | { |
| | | foreach (var item in bind) |
| | | { |