New file |
| | |
| | | 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; |
| | | |
| | | namespace HH.WCS.Mobox3.FJJT.process { |
| | | internal class TaskProcess { |
| | | #region 任务相关 |
| | | //--------------------------------------------------任务相关-------------------------------------------------- |
| | | /// <summary> |
| | | /// 取货卸货完成,缓存位状态更新 |
| | | /// </summary> |
| | | /// <param name="mst"></param> |
| | | /// <param name="load"></param> |
| | | 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}"); |
| | | // 终点为直连缓存位,不绑定 |
| | | var loc = WMSHelper.GetTransfeRelevance(mst.S_END_LOC); |
| | | if (loc != null && loc.N_PROPERTY == 1) |
| | | { |
| | | LocationHelper.UnLockLoc(mst.S_END_LOC); |
| | | return; |
| | | } |
| | | LocationHelper.BindingLoc(mst.S_END_LOC, mst.S_CNTR_CODE.Split(',').ToList()); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 任务取消,缓存位状态更新 |
| | | /// </summary> |
| | | /// <param name="mst"></param> |
| | | 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); |
| | | } |
| | | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 安全请求 |
| | | /// </summary> |
| | | /// <param name="no"></param> |
| | | /// <param name="state"></param> |
| | | /// <param name="forkliftNo"></param> |
| | | /// <param name="extData"></param> |
| | | internal static void OperateReq(string no, int state, string forkliftNo, string extData) { |
| | | LogHelper.Info($"开始安全请求,任务号:{no},请求码:{state}", "HosttoagvTask"); |
| | | var cst = WCSHelper.GetTask(no); |
| | | 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) |
| | | { |
| | | result = WCSDispatch.safetyInteraction(cst.S_CODE ,cst.S_START_LOC, "1"); //请求取货, |
| | | } |
| | | if (state == 1102) |
| | | { |
| | | result = WCSDispatch.safetyInteraction(cst.S_CODE, cst.S_START_LOC, "2"); //请求返货 |
| | | } |
| | | if (state == 1103) |
| | | { |
| | | result = WCSDispatch.safetyInteraction(cst.S_CODE, cst.S_START_LOC, "3"); //取货完成允许离开 |
| | | } |
| | | if (state == 1104) |
| | | { |
| | | result = WCSDispatch.safetyInteraction(cst.S_CODE, cst.S_START_LOC, "4"); //放货完成允许离开 |
| | | } |
| | | |
| | | // 安全请求发送成功,添加任务动作记录 |
| | | if (result) |
| | | { |
| | | WCSHelper.AddActionRecord(no, state, forkliftNo, extData); |
| | | LogHelper.Info($"首次进行安全请求成功", "HosttoagvTask"); |
| | | } |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 任务拦截 |
| | | /// </summary> |
| | | /// <param name="task"></param> |
| | | /// <returns></returns> |
| | | internal static bool Intercept(WCSTask mst) { |
| | | var result = false; |
| | | //出库任务是批量生成的,初始终点我们先给一个虚拟点,不推送。有单独的现场去判断出库缓存区光电,空了再给出库任务分配终点 |
| | | if (mst.S_END_LOC.Trim() == "出库虚拟点") { |
| | | result = true; |
| | | } |
| | | return result; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 任务状态更新处理 |
| | | /// </summary> |
| | | /// <param name="mst"></param> |
| | | /// <param name="state"></param> |
| | | 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(); |
| | | |
| | | |
| | | /// <summary> |
| | | /// 推送任务 |
| | | /// </summary> |
| | | /// <param name="mst"></param> |
| | | internal static bool SendTask(WCSTask mst) { |
| | | var result = false; |
| | | var start = "0"; var end = "0"; |
| | | if (mst.N_B_STATE == 0) { |
| | | if (mst.S_SCHEDULE_TYPE == "NDC") |
| | | { |
| | | start = LocationHelper.GetAgvSite(mst.S_START_LOC); |
| | | end = LocationHelper.GetAgvSite(mst.S_END_LOC); |
| | | |
| | | var dic = new List<param>(); |
| | | dic.Add( new param() { name = "No" , value = ""}); |
| | | dic.Add( new param() { name = "From", value = ""}); |
| | | dic.Add( new param() { name = "To", value = ""}); |
| | | 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 |
| | | } |
| | | } |