using NX_CommonClassLibrary; using NX_JsonClassLibrary; using NX_ModelClassLibrary.BaseModel; using NX_ModelClassLibrary.Common; using NX_ModelClassLibrary.CrnModel; using NX_ModelClassLibrary.CustomEnum; using NX_ModelClassLibrary.TranModel; using NX_ModelClassLibrary.WcsDispatch; using NX_ModelClassLibrary.WmsTask; using NX_WcsBiz.CommonBusiness; using NX_WcsDal.WcsDispatch; using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Text; using System.Threading.Tasks; namespace NX_WcsBiz.WcsDispatch { /// /// 任务请求调度类 /// public class TaskRequest_Disp { #region 单例模式 /// /// 单例模式对象 /// private static TaskRequest_Disp _instance = null; private static readonly object lockObj = new object(); /// /// 单例模式方法 /// public static TaskRequest_Disp Instance { get { if (_instance == null) { lock (lockObj) { if (_instance == null) { _instance = new TaskRequest_Disp(); } } } return _instance; } } #endregion /// /// 任务请求调度入口函数 /// /// 任务请求传入参数对象 /// public DispUntilityReturnMd TaskRequestHandleFunc(TaskRequestMd taskRequestMd) { try { if (taskRequestMd == null) { return new DispUntilityReturnMd { IsSuccess = false, RetMsg = $"任务请求调度函数传入参数为空!!" }; } DispUntilityReturnMd retMd; switch (taskRequestMd.TaskHandleType) { case DispatchRequestHandleTypeEnum.托盘申请上线: retMd = PalletApplyOnLine(taskRequestMd); break; case DispatchRequestHandleTypeEnum.自动拆解MWS大任务: retMd = AutoDisassembleWmsTask(); break; default: retMd = new DispUntilityReturnMd { IsSuccess = false, RetMsg = $"未定义任务请求处理枚举,任务请求调度无法识别此类型!!" }; break; } return retMd; } catch (Exception ex) { return new DispUntilityReturnMd { IsSuccess = false, RetMsg = $"任务请求调度函数发生异常:【{ex.Message}】。" }; } } private DispUntilityReturnMd PalletApplyOnLine(TaskRequestMd taskRequestMd) { BasWcsLocMd taskRequestLoc = BasCommon_Biz.Instance.allWcsLocList.FirstOrDefault(x => x.LocCode == taskRequestMd.CurrentLocNo && (x.LocTypeCode == "OnLineLoc" || x.LocTypeCode == "OnLineAndGeneralLoc")); if (taskRequestLoc == null) { return new DispUntilityReturnMd { IsSuccess = false, RetMsg = $"托盘上线处理的请求参数验证错误,传入站台不是系统配置好的站台号,不允许上线!{GetRetMsg(taskRequestMd)}" }; } WmsTskTaskMd wmsTskTaskMd = TaskRequest_Dal.Instance.GetUnfinishWmsTaskOfPalletCode(taskRequestMd.PalletCode); if (wmsTskTaskMd != null) { return new DispUntilityReturnMd { IsSuccess = false, RetMsg = $"托盘上线处理的请求参数验证错误,传入托盘号已经存在未完成的WMS大任务数据,不允许再次上线!{GetRetMsg(taskRequestMd)}" }; } WcsCrnCmdMd wcsCrnCmdMd = TaskRequest_Dal.Instance.GetUnfinishWcsCrnCmdOfPalletCode(taskRequestMd.PalletCode); if (wcsCrnCmdMd != null) { return new DispUntilityReturnMd { IsSuccess = false, RetMsg = $"托盘上线处理的请求参数验证错误,传入托盘号已经存在未完成的堆垛机指令数据,不允许再次上线!{GetRetMsg(taskRequestMd)}" }; } WcsTranCmdMd wcsTranCmdMd = TaskRequest_Dal.Instance.GetUnfinishWcsTranCmdOfPalletCode(taskRequestMd.PalletCode); if (wcsTranCmdMd != null) { return new DispUntilityReturnMd { IsSuccess = false, RetMsg = $"托盘上线处理的请求参数验证错误,传入托盘号已经存在未完成的输送线指令数据,不允许再次上线!{GetRetMsg(taskRequestMd)}" }; } string trayCode = string.Empty; if (!TaskRequest_Dal.Instance.VerifyTrayMsgAndBalanceMsg(taskRequestMd.PalletCode, out trayCode)) { return new DispUntilityReturnMd { IsSuccess = false, RetMsg = $"托盘上线处理的请求参数验证错误,校验传入托盘号的库存和组盘信息错误,不允许上线!{GetRetMsg(taskRequestMd)}" }; } //目前只有一个库区,后续增加多库区分配和负载均衡配置 TODO:孙亚龙 BasWcsLocMd eLocNo = BasCommon_Biz.Instance.allWcsLocList.FirstOrDefault(x => x.LocTypeCode == "RegionLoc"); BasNextLocRouteMd basNextLocRouteMd = TaskRequest_Dal.Instance.GetRouteMsg(taskRequestLoc, eLocNo); if (basNextLocRouteMd == null) { return new DispUntilityReturnMd { IsSuccess = false, RetMsg = $"托盘上线处理的请求参数验证错误,获取起点:【{taskRequestLoc.LocCode}】到终点:【{eLocNo.LocCode}】的路线信息发生错误,不允许上线!{GetRetMsg(taskRequestMd)}" }; } BasRegionMd regionMd = TaskRequest_Dal.Instance.GetRegionMd(eLocNo.RegionCode); //生成WMS大任务信息。 int row = TaskRequest_Dal.Instance.InsertWmsTaskData(taskRequestMd, eLocNo, trayCode, basNextLocRouteMd, regionMd); if (row > 0) { return new DispUntilityReturnMd { IsSuccess = true, RetMsg = "托盘上线处理成功!" }; } else { return new DispUntilityReturnMd { IsSuccess = false, RetMsg = "托盘上线处理失败!生成WMS大任务数据错误!!" }; } } private DispUntilityReturnMd AutoDisassembleWmsTask() { try { WmsTskTaskMd wmsTskTaskMd = TaskRequest_Dal.Instance.GetWmsTaskOriginalState(AppConfigHelper.Get("CurrWcsControlRegionCode")); if (wmsTskTaskMd != null) { BasWcsLocMd sLocMd = BasCommon_Biz.Instance.allWcsLocList.FirstOrDefault(x => x.LocCode == wmsTskTaskMd.SlocCode); BasWcsLocMd eLocMd = BasCommon_Biz.Instance.allWcsLocList.FirstOrDefault(x => x.LocCode == wmsTskTaskMd.ElocCode); if (sLocMd.LocCode == eLocMd.LocCode && sLocMd.LocTypeCode == "RegionLoc" && eLocMd.LocTypeCode == "RegionLoc" && wmsTskTaskMd.TaskType == WmsTaskTypeEnum.内伸货位移库任务) { BasBinMd sBinMd = TaskRequest_Dal.Instance.GetBinMdOfCode(wmsTskTaskMd.SbinCode); BasBinMd eBin = TaskRequest_Dal.Instance.GetBinMdOfCode(wmsTskTaskMd.EbinCode); BasWcsDevMd DevMd = TaskRequest_Dal.Instance.GetCrnDevMsg(sBinMd.ShelfCode); WmsTskTaskMd retWmsTaskMd = TaskRequest_Dal.Instance.InsertCrnCmdAndUpdateWmsTask(wmsTskTaskMd, sBinMd, eBin, DevMd); if (retWmsTaskMd != null) { return new DispUntilityReturnMd { IsSuccess = true, RetMsg = $"WMS大任务拆解为堆垛机指令成功。【{JsonHelper.ToJson(retWmsTaskMd)}】" }; } else { return new DispUntilityReturnMd { IsSuccess = false, RetMsg = $"WMS大任务拆解为堆垛机指令失败。【{JsonHelper.ToJson(wmsTskTaskMd)}】" }; } } BasNextLocRouteMd basNextLocRouteMd = TaskRequest_Dal.Instance.GetRouteMsg(sLocMd, eLocMd); BasWcsDevMd devMd = BasCommon_Biz.Instance.basWcsDevMdList.FirstOrDefault(x => x.DevCode == basNextLocRouteMd.DevNo); eLocMd = BasCommon_Biz.Instance.allWcsLocList.FirstOrDefault(x => x.LocCode == basNextLocRouteMd.NextLocNo); if (basNextLocRouteMd == null) { return new DispUntilityReturnMd { IsSuccess = false, RetMsg = $"WMS大任务验证错误,无法进行拆解。获取起点:【{sLocMd.LocCode}】到终点:【{eLocMd.LocCode}】的路线信息发生错误!【{JsonHelper.ToJson(wmsTskTaskMd)}】" }; } //拆解为输送线指令 if (devMd.DevTypeCode == "TranType") { //ToDo: 增加正在作业任务数量的限制,获取参数表入库作业的最大任务数量。 int WmsInstockTaskLimitNum = TaskRequest_Dal.Instance.GetLimitWmsTaskNum("InStockTaskMaxNum"); int runingWmsInstockTaskNum = TaskRequest_Dal.Instance.GetRuningWmsInstockTaskNum(); if (runingWmsInstockTaskNum >= WmsInstockTaskLimitNum) { return new DispUntilityReturnMd { IsSuccess = false, RetMsg = $"WMS正在作业的入库大任务数量已经超过入库最大的限制任务数量,请等待前面的入库任务做完。【{JsonHelper.ToJson(wmsTskTaskMd)}】" }; } WmsTskTaskMd retWmsTaskMd = TaskRequest_Dal.Instance.InsertTranCmdAndUpdateWmsTask(wmsTskTaskMd,sLocMd,eLocMd, basNextLocRouteMd); if (retWmsTaskMd != null) { return new DispUntilityReturnMd { IsSuccess = true, RetMsg = $"WMS大任务拆解为输送线指令成功。【{JsonHelper.ToJson(retWmsTaskMd)}】" }; } else { return new DispUntilityReturnMd { IsSuccess = false, RetMsg = $"WMS大任务拆解为输送线指令失败。【{JsonHelper.ToJson(wmsTskTaskMd)}】" }; } } //拆解为堆垛机指令 if (devMd.DevTypeCode == "CrnType") { //ToDo: 增加正在作业任务数量的限制,获取参数表入库作业的最大任务数量。 int WmsOutstockTaskLimitNum = TaskRequest_Dal.Instance.GetLimitWmsTaskNum("OutStockTaskMaxNum"); int runingWmsOutstockTaskNum = TaskRequest_Dal.Instance.GetRuningWmsOutstockTaskNum(); if (runingWmsOutstockTaskNum >= WmsOutstockTaskLimitNum) { return new DispUntilityReturnMd { IsSuccess = false, RetMsg = $"WMS正在作业的出库大任务数量已经超过出库最大的限制任务数量,请等待前面的出库任务做完。【{JsonHelper.ToJson(wmsTskTaskMd)}】" }; } BasBinMd sBin = TaskRequest_Dal.Instance.GetBinMdOfCode(wmsTskTaskMd.SbinCode); BasBinMd eBin = TaskRequest_Dal.Instance.GetBinMdOfCode(wmsTskTaskMd.EbinCode); WmsTskTaskMd retWmsTaskMd = TaskRequest_Dal.Instance.InsertCrnCmdAndUpdateWmsTask(wmsTskTaskMd, sBin, eBin, basNextLocRouteMd); if (retWmsTaskMd != null) { return new DispUntilityReturnMd { IsSuccess = true, RetMsg = $"WMS大任务拆解为堆垛机指令成功。【{JsonHelper.ToJson(retWmsTaskMd)}】" }; } else { return new DispUntilityReturnMd { IsSuccess = false, RetMsg = $"WMS大任务拆解为堆垛机指令失败。【{JsonHelper.ToJson(wmsTskTaskMd)}】" }; } } } return null; } catch (Exception ex) { return new DispUntilityReturnMd { IsSuccess = false, RetMsg = $"自动拆解WMS大任务函数发生异常:【{ex.Message}】。" }; } } private string GetRetMsg(TaskRequestMd taskRequestMd) { return $"请求参数 --- 托盘号:【{taskRequestMd.PalletCode}】,请求站台号:【{taskRequestMd.CurrentLocNo}】,请求处理类型:【{taskRequestMd.TaskHandleType}】"; } } }