using HH.WCS.Mobox3.DoubleCoin.core; using HH.WCS.Mobox3.DoubleCoin.dispatch; using HH.WCS.Mobox3.DoubleCoin.util; using HH.WCS.Mobox3.DoubleCoin.wms; using Newtonsoft.Json; using Opc.Ua; using SqlSugar; using System; using System.Collections.Generic; using System.Linq; using System.Security.Cryptography; using static HH.WCS.Mobox3.DoubleCoin.api.ApiModel; using Org.BouncyCastle.Crypto; using HH.WCS.Mobox3.DoubleCoin.device; using HH.WCS.Mobox3.DoubleCoin.models; namespace HH.WCS.Mobox3.DoubleCoin.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) { 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 { 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) { if (WCSHelper.CheckActionRecordExist(mst.S_CODE, 5)) { //根据客户现场要求,如果有5,开始卸货,在5之前人工处理,起点终点重置,5后终点绑定 //终点绑定 CacheBitUpdate(mst, false); WCSHelper.End(mst);//任务状态改成结束 } else {// 没有开始卸货 WCSHelper.Fail(mst);//任务状态改成错误 var db = new SqlHelper().GetInstance(); var cginfo = db.Queryable().First(a => a.S_CNTR_CODE == mst.S_CNTR_CODE); if (cginfo!= null) { db.Deleteable().Where(it => it.S_ID == cginfo.S_ID || it.RFID == mst.S_CNTR_CODE).ExecuteCommand(); } else { db.Deleteable().Where(it => it.RFID == mst.S_CNTR_CODE).ExecuteCommand(); } //LocationHelper.ErrorLocCntReset(new ErrorLocCntResetInfo() { locID = mst.S_START_LOC, reqCode = 1 }); } 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 result = false; var start = "0"; var end = "0"; var taskType = mst.S_TYPE.Trim(); if (mst.N_B_STATE == 0) { if (mst.N_SCHEDULE_TYPE == 1)//通过NDC,hosttoagv调度设备 { start = LocationHelper.GetAgvSite(mst.S_START_LOC); end = LocationHelper.GetAgvSite(mst.S_END_LOC); if (mst.S_TYPE == "空托下线堆叠") { end = LocationHelper.GetAgvSite(mst.S_END_LOC,true); } LogHelper.Info($"NDC推送任务 {mst.S_CODE};" + "start=" + start + "end= " + end); var startLoc = LocationHelper.GetLoc(mst.S_START_LOC); var endLoc = LocationHelper.GetLoc(mst.S_END_LOC); var dic = new List(); dic.Add(new param() { name = "IKey", value = "IKey" }); dic.Add(new param() { name = "From", value = start.ToString() }); dic.Add(new param() { name = "To", value = end.ToString() }); dic.Add(new param() { name = "FUNC", value = startLoc.N_LAYER.ToString() }); dic.Add(new param() { name = "Ctype", value = "0" }); if (mst.S_TYPE == "余料下线入库" || mst.S_TYPE == "人工拆盘入库") { dic.Add(new param() { name = "DATA", value = "1024" }); } else { dic.Add(new param() { name = "DATA", value = "0" }); } var res = NDCApi.AddOrderNew(1, 1, mst.S_CODE, dic);//添加新命令 if (res != null && (res.err_code == 0 || res.err_code == 50009)) { //推送成功,修改任务优先级 mst.N_B_STATE = 1; mst.S_B_STATE = TN_Task.GetStateStr(1); WCSHelper.UpdateStatus(mst);//更新任务状态 result = true; LogHelper.Info($"NDC推送任务成功 {mst.S_CODE}start= {mst.S_START_LOC} + end = {mst.S_END_LOC}"); } else { LogHelper.Info($"NDC推送任务失败 {mst.S_CODE};Res:" + JsonConvert.SerializeObject(res)); } } else if (mst.N_SCHEDULE_TYPE == 5)//通过杭奥调度设备 { //调第三方接口 var model = new HanAo.TaskInfoModel { requestPk = mst.S_CODE, frmPos = mst.S_START_LOC, toPos = mst.S_END_LOC, trkType = mst.S_OP_NAME == "入库" ? "1" : "2", contNo = mst.S_CNTR_CODE }; if (HanAo.CreateOrder(model)) { mst.N_B_STATE = 1; WCSHelper.UpdateStatus(mst); LogHelper.Info($"杭奥推送任务成功 {mst.S_CODE};" + "start=" + model.frmPos + "end= " + model.toPos); } else { LogHelper.Info($"杭奥推送任务失败 {mst.S_CODE};" + JsonConvert.SerializeObject(model)); } } else if (mst.N_SCHEDULE_TYPE == 3) //通过国自调度设备 { var code = GZRobot.CreateOrder(mst.S_CODE, mst.N_PRIORITY, JsonConvert.SerializeObject(new { src = mst.S_START_LOC, dst = mst.S_END_LOC }), "p2p"); if (code > 0) { //更新任务状态 mst.N_B_STATE = 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 } }