using HH.WCS.Mobox3.FJJT.api; using HH.WCS.Mobox3.FJJT.core; using HH.WCS.Mobox3.FJJT.dispatch; using HH.WCS.Mobox3.FJJT.util; using HH.WCS.Mobox3.FJJT.wms; using Newtonsoft.Json; using SqlSugar; using System; using System.Collections.Generic; using System.Linq; using System.Security.Cryptography; using static HH.WCS.Mobox3.FJJT.dispatch.XcDispatch; namespace HH.WCS.Mobox3.FJJT.process { internal class TaskProcess { #region 任务相关 //--------------------------------------------------任务相关-------------------------------------------------- /// /// 取货卸货完成,缓存位状态更新 /// /// /// internal static void CacheBitUpdate(WCSTask mst, bool load) { if (load) { Console.WriteLine($"任务{mst.S_CODE} 货位{mst.S_START_LOC}取货完成,起点解绑容器{mst.S_CNTR_CODE}"); LogHelper.Info($"任务{mst.S_CODE} 货位{mst.S_START_LOC}取货完成,起点解绑容器{mst.S_CNTR_CODE}"); LocationHelper.UnBindingLoc(mst.S_START_LOC, mst.S_CNTR_CODE.Split(',').ToList()); } else { Console.WriteLine($"任务{mst.S_CODE} 货位{mst.S_END_LOC}卸货完成,终点绑定容器{mst.S_CNTR_CODE}"); LogHelper.Info($"任务{mst.S_CODE} 货位{mst.S_END_LOC}卸货完成,起点解绑容器{mst.S_CNTR_CODE}"); LocationHelper.BindingLoc(mst.S_END_LOC, mst.S_CNTR_CODE.Split(',').ToList()); } } /// /// 任务取消,缓存位状态更新 /// /// internal static void CacheBitCancelUpdate(WCSTask mst) { //任务取消,取货完成前的,起点的loadingCount和终点unLoadingCount都清除,取货完成的只处理终点 if (WCSHelper.CheckActionRecordExist(mst.S_CODE, 4)) { //根据客户现场要求,如果取货完成任务失败人工拉到终点,我们就当卸货完成处理;如果是人工拉走到其它区域,我们就解锁终点,删除托盘。 //终点绑定 CacheBitUpdate(mst, false); LocationHelper.UnLockLoc(mst.S_END_LOC); } else { //起点终点解锁 LocationHelper.UnLockLoc(mst.S_START_LOC); LocationHelper.UnLockLoc(mst.S_END_LOC); } } /// /// 安全请求 /// /// /// /// /// internal static void OperateReq(string no, int state, string forkliftNo, string extData) { LogHelper.Info($"开始安全请求,任务号:{no},请求码:{state}", "HosttoagvTask"); var cst = WCSHelper.GetTask(no); if (cst != null) { var taskAction = WCSHelper.getActionRecord(no, state); if (taskAction != null) { LogHelper.Info($"再次安全请求,查询设备是否反馈", "HosttoagvTask"); if (taskAction.N_S_STATUS == 1) { LogHelper.Info($"再次安全请求,设备已反馈", "HosttoagvTask"); NDCApi.ChangeOrderParam(no, 8, "1"); } } else { LogHelper.Info($"首次进行安全请求,任务号:{no},请求码:{state}", "HosttoagvTask"); bool result = false; if (state == 1101) { if (cst.S_START_AREA == "") { result = XcDispatch.CanOut(new SafetyRequest() { stnNo = cst.S_START_LOC, taskNo = cst.S_CODE }); if (result) { NDCApi.ChangeOrderParam(no, 8, "1"); } } else { result = WCSDispatch.safetyInteraction(cst.S_CODE, cst.S_START_LOC, "1"); //请求取货, } } if (state == 1102) { if (cst.S_START_AREA == "") { result = XcDispatch.CanIn(new SafetyRequest() { stnNo = cst.S_END_LOC, taskNo = cst.S_CODE }); if (result) { NDCApi.ChangeOrderParam(no, 8, "1"); } } else { result = WCSDispatch.safetyInteraction(cst.S_CODE, cst.S_END_LOC, "2"); //请求放货 } } if (state == 1103) { if (cst.S_START_AREA == "") { result = XcDispatch.loadComplete(new SafetyRequest() { stnNo = cst.S_END_LOC, taskNo = cst.S_CODE }); if (result) { NDCApi.ChangeOrderParam(no, 8, "1"); } } else { result = WCSDispatch.safetyInteraction(cst.S_CODE, cst.S_START_LOC, "3"); //取货完成允许离开 } } if (state == 1104) { if (cst.S_START_AREA == "") { result = XcDispatch.putComplete(new SafetyRequest() { stnNo = cst.S_END_LOC, taskNo = cst.S_CODE }); if (result) { NDCApi.ChangeOrderParam(no, 8, "1"); } } else { result = WCSDispatch.safetyInteraction(cst.S_CODE, cst.S_END_LOC, "4"); //放货完成允许离开 } } // 安全请求发送成功,添加任务动作记录 if (result) { WCSHelper.AddActionRecord(no, state, forkliftNo, extData); LogHelper.Info($"首次进行安全请求成功", "HosttoagvTask"); } } } } /// /// 任务拦截 /// /// /// internal static bool Intercept(WCSTask mst) { var result = false; //出库任务是批量生成的,初始终点我们先给一个虚拟点,不推送。有单独的现场去判断出库缓存区光电,空了再给出库任务分配终点 if (mst.S_END_LOC.Trim() == "出库虚拟点") { result = true; } return result; } /// /// 任务状态更新处理 /// /// /// internal static void OperateStatus(WCSTask mst, int state) { if (state == 4) { CacheBitUpdate(mst, true); } if (state == 6)//卸货完成 { CacheBitUpdate(mst, false); } if (state == 7) { CacheBitCancelUpdate(mst); } } private static object locLocker = new object(); /// /// 推送任务 /// /// internal static bool SendTask(WCSTask mst) { var result = false; if (mst.N_B_STATE == 0) { if (mst.S_SCHEDULE_TYPE == "NDC") { var startLoc = LocationHelper.GetLoc(mst.S_START_LOC); var endLoc = LocationHelper.GetLoc(mst.S_END_LOC); if (startLoc != null && endLoc != null) { var dic = new List(); dic.Add(new param() { name = "No", value = mst.S_CODE }); dic.Add(new param() { name = "From", value = mst.S_START_LOC }); dic.Add(new param() { name = "To", value = mst.S_END_LOC }); dic.Add(new param() { name = "3", value = "4" }); dic.Add(new param() { name = "4", value = "512" }); dic.Add(new param() { name = "5", value = "0" }); var res = NDCApi.AddOrderNew(1, mst.N_PRIORITY, mst.S_CODE, dic); if (res != null && res.err_code == 0) { //推送成功,修改任务优先级 mst.N_B_STATE = 1; WCSHelper.UpdateStatus(mst); result = true; } } } else if (mst.S_SCHEDULE_TYPE == "WCS") { mst.N_B_STATE = 1; WCSHelper.UpdateStatus(mst); } else if (mst.S_SCHEDULE_TYPE == "AGV") { mst.N_B_STATE = 1; WCSHelper.UpdateStatus(mst); } } return result; } #endregion } }