using HH.WCS.Mobox3.AnGang.dispatch; using HH.WCS.Mobox3.AnGang.wms; using Newtonsoft.Json; using SqlSugar; using System.Collections.Generic; using System.Linq; using HH.WCS.Mobox3.AnGang.models; using System; using HH.WCS.Mobox3.AnGang.util; namespace HH.WCS.Mobox3.AnGang.process { internal class TaskProcess { #region 任务相关 //--------------------------------------------------任务相关-------------------------------------------------- /// /// 取货卸货完成,缓存位状态更新 /// /// /// internal static void CacheBitUpdate(TN_Task mst, bool load) { //var trayCarryCount = mst.N_CNTR_COUNT > 0 ? mst.N_CNTR_COUNT : 1; 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(TN_Task 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 OperateStatus(TN_Task mst, int state) { if (state == 4) { CacheBitUpdate(mst, true); } if (state == 6)//卸货完成 { CacheBitUpdate(mst, false); } if (state == 7) { CacheBitCancelUpdate(mst); } } /// /// 安全请求 /// /// /// /// /// internal static void OperateReq(string no, int state, string forkliftNo, string extData = "") { if (state == 1101) { //请求取货, } if (state == 1102) { //请求卸货, //根据终点判断,是cb02的入口,判断内存中状态(要状态时间),允许卸货,通知agv改参数 var dic = new Dictionary(); //< Req >< Order No = 'TN2302020002' ParamNo = '18' Param1 = '12' /> dic.Add("No", no); dic.Add("ParamNo", "8"); dic.Add("Param1", "1"); NDC.ChangeOrder(dic); //改完参数车子就会自己卸货 } if (state == 1103) { //大铁框叉走以后通知,我们要通知输送线 } } private static object locLocker = new object(); /// /// 推送任务 /// /// internal static bool SendTask(TN_Task mst) { var db = new SqlHelper().GetInstance(); var result = false; var start = "0"; var end = "0"; var taskType = mst.S_TYPE.Trim(); if (mst.N_B_STATE == 0) { // 原代码版本 //var code = GZRobot.CreateOrder(mst.S_CODE, mst.N_PRIORITY, JsonConvert.SerializeObject(new { src = mst.S_START_LOC, dst = mst.S_END_LOC }), "p2p"); // 尊重文档的版本 var startSite = LocationHelper.GetAgvSite(mst.S_START_LOC); var endSite = LocationHelper.GetAgvSite(mst.S_END_LOC); // 如果找不到会返回0,就是假终点 //var code = GZRobot.CreateOrder(mst.S_CODE, mst.N_PRIORITY, JsonConvert.SerializeObject(new { src = startSite, order_name = $"tet" }), "p2pdst2", "pgapi"); //var code = -1; var code = 0; if (taskType == TaskName.产品入库) { //code = GZRobot.CreateOrder(mst.S_CODE, mst.N_PRIORITY, JsonConvert.SerializeObject(new { src = startSite, order_name = $"{mst.S_CODE}" }), "p2pdst", "pgapi"); code = GZRobot.CreateOrder(mst.S_CODE, mst.N_PRIORITY, JsonConvert.SerializeObject(new { src = startSite, order_name = $"{mst.S_CODE}" }), "p2pdst2", "pgapi"); } else { code = GZRobot.CreateOrder(mst.S_CODE, mst.N_PRIORITY, JsonConvert.SerializeObject(new { src = startSite, dst = endSite }), "p2pcm", "pgapi"); } //LogHelper.Info($"eq_task_code={code}"); // car_type 默认为1 // src_ort 货架排号 // dst_orc 货架层数(后两个信息应该为国自AGV内部维护,以后面更改的结果为准) //var code = GZRobot.CreateOrder(mst.S_CODE, mst.N_PRIORITY, $"{{\"src\" = \"{startSite}\", \"dst\" = \"{endSite}\", \"car-type\": 1 }}", "p2pdst", "pgapi"); if (code > 0) { //更新任务状态 mst.N_B_STATE = 1; mst.S_B_STATE = TN_Task.GetStateStr(1); mst.S_EQ_TASK_CODE = code.ToString(); WCSHelper.UpdateStatus(mst); WCSHelper.UpdateEQNo(mst); LogHelper.Info($"国自推送任务成功 {mst.S_CODE};" + "start=" + mst.S_START_LOC + "end= " + mst.S_END_LOC); } else { LogHelper.Info($"国自推送任务失败 {mst.S_CODE};" + JsonConvert.SerializeObject(mst)); } } return result; } #endregion } }