| | |
| | | using System.Drawing.Drawing2D; |
| | | using Model.ModelDto.LogDto; |
| | | using AutoMapper.Internal; |
| | | using System.Diagnostics.Contracts; |
| | | |
| | | namespace WMS.BLL.BllSoServer |
| | | { |
| | |
| | | .AndIF(!string.IsNullOrWhiteSpace(model.BitPalletMark), m => m.BitPalletMark == model.BitPalletMark) |
| | | .And(m => !string.IsNullOrWhiteSpace(m.WareHouseNo)) |
| | | .And(a => a.Status == "0") |
| | | .And(a => a.WareHouseNo == "W02") |
| | | .And(a => a.WareHouseNo == "W01" || a.WareHouseNo == "W02") |
| | | .ToExpression(); |
| | | var data = await Db.Queryable<DataStockDetail>().Where(item).OrderBy(m => m.LocatNo).ToPageListAsync(model.Page, model.Limit, count); |
| | | //data.Select(m => m.Status == "0" && m.IsDel == "0"); |
| | |
| | | } |
| | | |
| | | return outDtoList; |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | Db.RollbackTran(); |
| | | throw new Exception(e.Message); |
| | | } |
| | | |
| | | |
| | | #endregion |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | throw new Exception(e.Message); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 托盘出库(密集库) |
| | | /// </summary> |
| | | /// <param name="palletNo"></param> |
| | | /// <param name="outMode"></param> |
| | | /// <param name="userId"></param> |
| | | /// <param name="url"></param> |
| | | /// <param name="str"></param> |
| | | /// <returns></returns> |
| | | /// <exception cref="Exception"></exception> |
| | | public List<OutCommandDto> IssuePalletNoOutMk(string palletNo, string outMode, int userId, string url, out string str) |
| | | { |
| | | try |
| | | { |
| | | //判断托盘号是否为空 |
| | | if (string.IsNullOrWhiteSpace(palletNo)) |
| | | { |
| | | throw new Exception($"托盘号不能为空,请核实"); |
| | | } |
| | | |
| | | str = ""; |
| | | var stockDetailList = Db.Queryable<DataStockDetail>().Where(m => m.PalletNo == palletNo && m.IsDel == "0").ToList(); |
| | | |
| | | if (stockDetailList.Count == 0) |
| | | { |
| | | throw new Exception($"未在库内查询到该托盘信息"); |
| | | } |
| | | var stocka = Db.Queryable<DataStock>().First(a => a.IsDel == "0" && a.SkuNo == stockDetailList[0].SkuNo); |
| | | |
| | | |
| | | //验证库存托盘状态 |
| | | if (stockDetailList[0].Status != "0") |
| | | { |
| | | throw new Exception($"当前托盘未处于待分配状态,请核实!"); |
| | | } |
| | | //判断托盘库存信息分组后是否大于1条 |
| | | var detailGroup = stockDetailList.GroupBy(m => new { m.SkuNo, m.PalletNo, m.WareHouseNo, m.LocatNo }).ToList(); |
| | | if (detailGroup.Count > 1) |
| | | { |
| | | throw new Exception($"未在库内查询到该托盘信息"); |
| | | } |
| | | |
| | | var locatStart = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.LocatNo == stockDetailList[0].LocatNo && w.Status == "1"); |
| | | if (locatStart == null) |
| | | { |
| | | throw new Exception($"起始储位不存在或非空闲,请检查"); |
| | | } |
| | | #region 集合 |
| | | |
| | | var outDto1 = new List<OutCommandDto>(); //先出库数据的集合(深度为1的储位) |
| | | var outDto2 = new List<OutCommandDto>(); //后出库数据的集合(深度为2的储位) |
| | | var moveDto = new List<OutCommandDto>(); //要移库数据的集合 |
| | | |
| | | #endregion |
| | | var com = new Common(); |
| | | var allot = new AllotLocation(); |
| | | |
| | | #region 集合 |
| | | |
| | | Db.BeginTran(); |
| | | try |
| | | { |
| | | List<LogTask> logTaskList = new List<LogTask>();//此次出库任务集合,为应对同托盘不同物料出库 |
| | | |
| | | var taskNoStr = ""; |
| | | |
| | | // 储位号 |
| | | var locateNo = locatStart.LocatNo; |
| | | List<string> locateListStrs = new List<string>(); |
| | | locateListStrs.Add(locateNo); |
| | | |
| | | var row1 = int.Parse(locatStart.LocatNo.Substring(2, 2)); |
| | | var row2 = int.Parse(locatStart.AisleOne.Substring(2, 2)); |
| | | //需要移库的信息 |
| | | var NeedMoveInfo = IsNeedMoveLocate(locatStart, locateListStrs, out int isOut); |
| | | if (isOut == 1) |
| | | { |
| | | //巷道组中有入库或移入的储位,或者是当前储位前有储位未下发成功的任务 |
| | | throw new Exception($"巷道组中有入库或移入的储位,请稍后再试"); |
| | | } |
| | | if (NeedMoveInfo.Count > 0)//需要移库 |
| | | { |
| | | //判断库内空储位是否够 |
| | | var okRoad = Db.Queryable<SysStorageRoadway>().Where(m => m.Status == "0" && m.IsDel == "0" && m.WareHouseNo == locatStart.WareHouseNo).Select(m => m.RoadwayNo).ToList(); |
| | | var nullSlotNum = Db.Queryable<SysStorageLocat>().Count(m => m.RoadwayNo != locatStart.RoadwayNo && okRoad.Contains(m.RoadwayNo) && m.Status == "0"); |
| | | //判断空储位的数量是否大于需要移库的数量 |
| | | if (nullSlotNum >= NeedMoveInfo.Count) |
| | | { |
| | | foreach (var s in NeedMoveInfo) |
| | | { |
| | | //储位列 |
| | | var rows = int.Parse(s.Substring(2, 2)); |
| | | |
| | | //获取移库储位 |
| | | var moveAddress = GetMiJiMoveAddress(s, locatStart.AisleOne); |
| | | var tary = Db.Queryable<DataStockDetail>().First(m => m.LocatNo == s); |
| | | if (string.IsNullOrWhiteSpace(moveAddress)) // 判断是否获取到移库的库位 |
| | | { |
| | | throw new Exception($"出库前有货物,需移库但未查询到空储位"); |
| | | } |
| | | else |
| | | { |
| | | var ykTaskNo = new Common().GetMaxNo("TK"); |
| | | var ykTask = new LogTask //出库任务 |
| | | { |
| | | TaskNo = ykTaskNo, |
| | | Sender = "WMS", |
| | | Receiver = "WCS", |
| | | IsSuccess = 0, //是否下发成功 0失败 1成功 |
| | | |
| | | StartLocat = s,//起始位置 |
| | | EndLocat = moveAddress,//outMode,//目标位置 |
| | | PalletNo = tary.PalletNo,//托盘码 |
| | | IsSend = 1,//是否可再次下发 |
| | | IsCancel = 1,//是否可取消 |
| | | IsFinish = 1,//是否可完成 |
| | | Type = "2",//任务类型 0 入库任务 1 出库任务 2 移库任务 |
| | | Status = "0",//任务状态0:等待执行1正在执行2执行完成 |
| | | OrderType = "1",//0 入库单 1 出库单 2 盘点单 3 移库单 |
| | | Msg = "从" + s + "到" + moveAddress + "的移库任务", //关键信息 |
| | | }; |
| | | Db.Insertable(ykTask).ExecuteCommand(); |
| | | logTaskList.Add(ykTask); |
| | | |
| | | outDto1.Add(new OutCommandDto() |
| | | { |
| | | PalletNo = ykTask.PalletNo,//托盘号 |
| | | StartLocate = ykTask.StartLocat, // 起始位置 |
| | | StartRoadway = locatStart.RoadwayNo,//其实巷道 |
| | | EndLocate = moveAddress,//outMode, // 目标位置 |
| | | TaskNo = ykTaskNo, // 任务号 |
| | | TaskType = "2",// 任务类型 (出库)0入 1出 2移 |
| | | Order = Math.Abs(row2 - rows), |
| | | Type = PLCTypeEnum.ShuttleCar |
| | | |
| | | }); |
| | | var slotChange = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == s); |
| | | var slotChange2 = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == moveAddress); |
| | | |
| | | slotChange.Status = "5"; //改变状态(正在出库) |
| | | slotChange2.Status = "4"; // 改变状态(正在移入) |
| | | Db.Updateable(slotChange).ExecuteCommand(); |
| | | Db.Updateable(slotChange2).ExecuteCommand(); |
| | | } |
| | | } |
| | | } |
| | | else |
| | | { |
| | | throw new Exception($"出库前有货物,需移库但空储位不够移库"); |
| | | } |
| | | } |
| | | #region 添加出库任务 |
| | | |
| | | var taskNo = new Common().GetMaxNo("TK"); |
| | | var exTask = new LogTask //出库任务 |
| | | { |
| | | TaskNo = taskNo, |
| | | Sender = "WMS", |
| | | Receiver = "WCS", |
| | | IsSuccess = 0, //是否下发成功 0失败 1成功 |
| | | |
| | | StartLocat = locatStart.LocatNo,//起始位置 |
| | | EndLocat = outMode,//outMode,//目标位置 |
| | | PalletNo = palletNo,//托盘码 |
| | | IsSend = 1,//是否可再次下发 |
| | | IsCancel = 1,//是否可取消 |
| | | IsFinish = 1,//是否可完成 |
| | | Type = "1",//任务类型 0 入库任务 1 出库任务 2 移库任务 |
| | | Status = "0",//任务状态0:等待执行1正在执行2执行完成 |
| | | OrderType = "1",//0 入库单 1 出库单 2 盘点单 3 移库单 |
| | | Msg = "从" + locatStart.LocatNo + "到" + outMode + "的出库任务", //关键信息 |
| | | }; |
| | | Db.Insertable(exTask).ExecuteCommand(); |
| | | logTaskList.Add(exTask); |
| | | var endroad = allot.RoadwayToStationNum(locatStart.RoadwayNo, outMode); |
| | | outDto1.Add(new OutCommandDto() |
| | | { |
| | | PalletNo = palletNo,//托盘号 |
| | | StartLocate = locatStart.LocatNo, // 起始位置 |
| | | StartRoadway = locatStart.RoadwayNo,//起始巷道 |
| | | EndLocate = outMode,//, // 目标位置 |
| | | EndRoadway = endroad, |
| | | TaskNo = exTask.TaskNo, // 任务号 |
| | | TaskType = "1",// 任务类型 (出库)0入 1出 2移 |
| | | OutMode = outMode, //出库口 |
| | | Order = Math.Abs(row2 - row1), |
| | | Type = PLCTypeEnum.ShuttleCar |
| | | |
| | | }); |
| | | taskNoStr = exTask.TaskNo; |
| | | |
| | | #endregion |
| | | |
| | | #region 改变数据 |
| | | |
| | | locatStart.Status = "3"; //要出库的储位改变状态 正在出库 |
| | | Db.Updateable(locatStart).ExecuteCommand(); |
| | | |
| | | #endregion |
| | | |
| | | |
| | | outDto1.AddRange(moveDto); |
| | | outDto1.AddRange(outDto2); |
| | | //添加操作日志记录 |
| | | new OperationSOServer().AddLogOperationSo("出库作业", "托盘出库", palletNo, "出库", $"点击出库按钮出库托盘为:{palletNo}", userId); |
| | | Db.CommitTran(); |
| | | |
| | | if (outDto1.Count > 0) |
| | | { |
| | | // 正式运行程序放开 |
| | | var list2 = outDto1.Select(m => m.TaskNo).ToList(); |
| | | var jsonData = JsonConvert.SerializeObject(outDto1); |
| | | string response = ""; |
| | | |
| | | try |
| | | { |
| | | var time1 = DateTime.Now;//发送时间 .ToString("yyyy-MM-dd HH:mm:ss") |
| | | response = HttpHelper.DoPost(url, jsonData, "下发给WCS出库命令", "WCS"); |
| | | var time2 = DateTime.Now;//返回时间 .ToString("yyyy-MM-dd HH:mm:ss") |
| | | |
| | | ////解析返回数据 |
| | | var wcsModel = JsonConvert.DeserializeObject<WcsModel2>(response); |
| | | if (wcsModel.code == 200) |
| | | { |
| | | //更改任务的发送返回时间// |
| | | new TaskServer().EditTaskIssueOk(list2, time1, time2); |
| | | str += "下发成功"; |
| | | } |
| | | else |
| | | { |
| | | new TaskServer().EditTaskIssueNo(list2, time1, time2, wcsModel.message); |
| | | throw new Exception(wcsModel.message); |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | throw new Exception(ex.Message); |
| | | } |
| | | |
| | | } |
| | | |
| | | return outDto1; |
| | | } |
| | | catch (Exception e) |
| | | { |
| | |
| | | } |
| | | |
| | | //判断储位 |
| | | var locate = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == locateNo && m.IsDel == "0");//当前出库的储位信息 |
| | | var locate = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == locateNo && m.IsDel == "0" && m.WareHouseNo == "W01");//当前出库的储位信息 |
| | | if (locate == null) |
| | | { |
| | | flagList.Add(2); |
| | |
| | | |
| | | outDto1.Add(new OutCommandDto() |
| | | { |
| | | PalletNo = item.PalletNo,//托盘号 |
| | | StartLocate = locate.LocatNo, // 起始位置 |
| | | PalletNo = ykTask.PalletNo,//托盘号 |
| | | StartLocate = ykTask.StartLocat, // 起始位置 |
| | | StartRoadway = locate.RoadwayNo,//其实巷道 |
| | | EndLocate = moveAddress,//outMode, // 目标位置 |
| | | TaskNo = ykTaskNo, // 任务号 |
| | |
| | | // 010101 派列层 |
| | | //var bol = String.CompareOrdinal(lcoate.LocatNo, lcoate.AisleOne); |
| | | |
| | | var sArray = lcoate.LocatNo.Substring(4,2); |
| | | var sArray = lcoate.LocatNo.Substring(2, 2); |
| | | var row = int.Parse(sArray);//储位列 |
| | | var sArray2 = lcoate.AisleOne.Substring(4, 2); |
| | | var sArray2 = lcoate.AisleOne.Substring(2, 2); |
| | | var row2 = int.Parse(sArray2); //通道口列 |
| | | |
| | | isOut = 0; |
| | |
| | | { |
| | | foreach (var item2 in item) |
| | | { |
| | | var okLan = Db.Queryable<SysStorageRoadway>().Where(m => m.Status == "0" && m.IsDel == "0").Select(m => m.RoadwayNo).ToList(); |
| | | var okLan = Db.Queryable<SysStorageRoadway>().Where(m => m.Status == "0" && m.IsDel == "0" && m.WareHouseNo == item2.WareHouseNo).Select(m => m.RoadwayNo).ToList(); |
| | | //当前托盘所在楼层 |
| | | if (oldSlot.Layer == 1) |
| | | { |
| | | okLan = okLan.Where(m => Convert.ToInt32(m.Replace("MR", "")) <= 56).ToList(); |
| | | } |
| | | else if (oldSlot.Layer == 2) |
| | | { |
| | | okLan = okLan.Where(m => Convert.ToInt32(m.Replace("MR", "")) > 56).ToList(); |
| | | } |
| | | else |
| | | { |
| | | throw new Exception("当前托盘所在楼层异常"); |
| | | } |
| | | |
| | | var tray2 = Db.Queryable<DataStockDetail>().Where(m => m.SkuNo == item2.SkuNo |
| | | && m.LotNo == item2.LotNo && !slotList.Contains(m.LocatNo) && m.PalletTags == item2.PalletTags && okLan.Contains(m.RoadwayNo)).ToList(); |
| | | foreach (var s in tray2) |
| | |
| | | location = ""; |
| | | |
| | | // 判断储位组是否有空储位 关联库存明细表可防止储位状态不准确避免造成满入异常//not in ('1','2','4','6','7','8') |
| | | sqlString = $"select LocatNo,Column,AisleOne from SysStorageLocat where RoadwayNo = {laneWayId} and Status in ('0') and LocatNo not in (select LocatNo from DataStockDetail where RoadwayNo = { laneWayId}) order by Row;"; |
| | | sqlString = $"select LocatNo,[Column],AisleOne from SysStorageLocat where IsDel=0 and WareHouseNo='W01' and RoadwayNo = '{laneWayId}' and Status in ('0') and LocatNo not in (select LocatNo from DataStockDetail where RoadwayNo = '{laneWayId}') order by Row;"; |
| | | var slotModel =Db.SqlQueryable<LocateInfo>(sqlString).ToList(); |
| | | if (slotModel.Count == 0) |
| | | { |