using HH.WCS.JiaTong.api; using HH.WCS.JiaTong.core; using HH.WCS.JiaTong.device; using HH.WCS.JiaTong.dispatch; using HH.WCS.JiaTong.LISTA.models; using HH.WCS.JiaTong.LISTA.process; using HH.WCS.JiaTong.util; using HH.WCS.JiaTong.wms; using Microsoft.Owin.BuilderProperties; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using SqlSugar; using System; using System.Collections.Generic; using System.Diagnostics.Eventing.Reader; using System.IdentityModel.Protocols.WSTrust; using System.Linq; using System.Net.NetworkInformation; using System.Security.Cryptography; using System.Threading; using System.Threading.Tasks; using static HH.WCS.JiaTong.api.ApiModel; using static HH.WCS.JiaTong.LISTA.process.HttpModel; namespace HH.WCS.JiaTong.process { internal class TaskProcess { #region 任务相关 //--------------------------------------------------任务相关-------------------------------------------------- /// /// 取货卸货完成,缓存位状态更新 /// /// /// internal static void CacheBitUpdate(WCSTask 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}"); if (!string.IsNullOrEmpty(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 { LogHelper.Info($"任务{mst.S_CODE} 托盘为空 ,只解锁货位"); LocationHelper.UnlockLocDeleteCntrs(mst.S_START_LOC); } } else { // Console.WriteLine($"任务{mst.S_CODE} 货位{mst.S_END_LOC}卸货完成,终点绑定容器{mst.S_CNTR_CODE}"); if (!string.IsNullOrEmpty(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()); } else { LogHelper.Info($"任务{mst.S_CODE} 托盘为空 ,只解锁货位"); LocationHelper.UnlockLoc(mst.S_END_LOC); } } } /// /// 任务取消,缓存位状态更新 /// /// 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(AgvTaskState model, string url, WCSTask TN_Task, string name) { try { LogHelper.Info($"-------开始安全请求------"); if (TN_Task != null) { int type = 0; string loc = ""; if (model.state == 1101) { //请求取货, type = 1; loc = TN_Task.S_START_LOC; if (TN_Task.S_TYPE.Contains("电梯2")) { var device = Settings.deviceInfos.Where(a => a.TN_Location == TN_Task.S_START_LOC).FirstOrDefault(); var EndLoc = LocationHelper.GetLocByLoc(TN_Task.S_END_LOC); if (device == null) { LogHelper.Info($"根据任务起点:{TN_Task.S_START_LOC},未找到对应电梯配置文件"); } if (EndLoc == null) { LogHelper.Info($"根据任务终点:{TN_Task.S_END_LOC},未找到对应货位"); } var value = ModbusHelper.ReadHoldingRegisters(40005, 1, device.address, 1024); var value2 = ModbusHelper.ReadHoldingRegisters(40101, 1, device.address, 1024); if (value[0] == EndLoc.N_LAYER && value2[0] == 2) { NDCApi.ChangeOrderParam(TN_Task.S_CODE.Trim(), 6, "1"); } else { int layerValue = 0; if (EndLoc.N_LAYER == 1) layerValue = 1; else if (EndLoc.N_LAYER == 2) layerValue = 3; else if (EndLoc.N_LAYER == 3) layerValue = 5; ModbusHelper.WriteSingleRegister(40089, layerValue, device.address, 1024); ModbusHelper.WriteSingleRegister(40101, 2, device.address, 1024); ModbusHelper.WriteSingleRegister(40003, 2, device.address, 1024); ModbusHelper.WriteSingleRegister(40102, 1, device.address, 1024); } } else if (TN_Task.Z_TYPE == 4)//原材料库国自安全交互 { if (GZOperateReqByPost(url, TN_Task.S_EQ_NO, loc, type)) { // NDCHelper.ChangeParam(TN_Task.S_CODE.Trim(), 1101, 18); // NDCApi.ChangeOrderParam(TN_Task.S_CODE.Trim(), 6, "1"); } } else { //井松叠盘机安全交互 if (TN_Task.S_NOTE == "空托回库") { var Device = Settings.deviceInfos.Where(a => a.TN_Location == TN_Task.S_START_LOC).FirstOrDefault(); if (Device != null) { if (S7Helper.WriteDpj(Device.address, 1002, 1)) { int value = S7Helper.ReadDpj(Device.address, 2004, S7.Net.VarType.Byte); if (value == 1) { NDCApi.ChangeOrderParam(TN_Task.S_CODE.Trim(), 6, "1"); } else { LogHelper.Info("叠盘机安全交互失败,读取VB2004的值为{2004}"); } } else { LogHelper.Info("叠盘机安全交互失败,写入VB1002值1失败"); } } else { LogHelper.Info($"叠盘机安全交互失败,根据任务起点{TN_Task.S_START_LOC},未找到叠盘机配置文件"); } } else { if (OperateReqByPost(url, TN_Task.S_EQ_NO, TN_Task.S_CODE, loc, type, model.state, name)) { // NDCHelper.ChangeParam(TN_Task.S_CODE.Trim(), 1101, 18); NDCApi.ChangeOrderParam(TN_Task.S_CODE.Trim(), 6, "1"); } } } } if (model.state == 1102) { type = 3; if (TN_Task.Z_TYPE == 4)//原材料库国自安全交互 { loc = TN_Task.S_START_LOC; if (GZOperateReqByPost(url, TN_Task.S_EQ_NO, loc, type)) { //NDCHelper.ChangeParam(TN_Task.S_CODE.Trim(), 1101, 18); } } if (TN_Task.S_NOTE == "空托回库") { var Device = Settings.deviceInfos.Where(a => a.TN_Location == TN_Task.S_START_LOC).FirstOrDefault(); if (Device != null) { //写入失败重新写入 if (!S7Helper.WriteDpj(Device.address, 1001, 1)) { Task.Run(() => { while (!S7Helper.WriteDpj(Device.address, 1001, 1)) { Thread.Sleep(1000); } }); } if (!S7Helper.WriteDpj(Device.address, 1002, 0)) { Task.Run(() => { while (!S7Helper.WriteDpj(Device.address, 1002, 0)) { Thread.Sleep(1000); } }); } } else { LogHelper.Info($"叠盘机安全交互失败,根据任务起点{TN_Task.S_START_LOC},未找到叠盘机配置文件"); } } } if (model.state == 1103) { //请求卸货 type = 2; loc = TN_Task.S_END_LOC; if (TN_Task.S_TYPE.Contains("电梯1")) { var device = Settings.deviceInfos.Where(a => a.TN_Location == TN_Task.S_END_LOC).FirstOrDefault(); var startloc = LocationHelper.GetLocByLoc(TN_Task.S_START_LOC); if (device == null) { LogHelper.Info($"根据任务终点:{TN_Task.S_END_LOC},未找到对应电梯配置文件"); } if (startloc == null) { LogHelper.Info($"根据任务起点:{TN_Task.S_START_LOC},未找到对应货位"); } var value = ModbusHelper.ReadHoldingRegisters(40005, 1, device.address, 1024); var value2 = ModbusHelper.ReadHoldingRegisters(40101, 1, device.address, 1024); if (value[0] == startloc.N_LAYER && value2[0] == 2) { NDCApi.ChangeOrderParam(TN_Task.S_CODE.Trim(), 6, "1"); } else { int layerValue = 0; if (startloc.N_LAYER == 1) layerValue = 1; else if (startloc.N_LAYER == 2) layerValue = 3; else if (startloc.N_LAYER == 3) layerValue = 5; ModbusHelper.WriteSingleRegister(40101, 2, device.address, 1024); ModbusHelper.WriteSingleRegister(40003, 2, device.address, 1024); ModbusHelper.WriteSingleRegister(40089, layerValue, device.address, 1024); ModbusHelper.WriteSingleRegister(40102, 1, device.address, 1024); } } else if (TN_Task.Z_TYPE == 4)//原材料库国自安全交互 { // loc = TN_Task.S_END_LOC; if (GZOperateReqByPost(url, TN_Task.S_EQ_NO, loc, type)) { // NDCHelper.ChangeParam(TN_Task.S_CODE.Trim(), 1103, 18); // NDCApi.ChangeOrderParam(TN_Task.S_CODE.Trim(), 6, "1"); } } else { if (OperateReqByPost(url, TN_Task.S_EQ_NO, TN_Task.S_CODE, loc, type, model.state, name)) { NDCApi.ChangeOrderParam(TN_Task.S_CODE.Trim(), 6, "1"); } } } if (model.state == 1104) { type = 4; if (TN_Task.S_TYPE.Contains("电梯1")) { var db = new SqlHelper().GetInstance(); var device = Settings.deviceInfos.Where(a => a.TN_Location == TN_Task.S_END_LOC).FirstOrDefault(); var mstbyEqno = db.Queryable().Where(a => a.S_EQ_NO == TN_Task.S_EQ_NO && a.S_TYPE.Contains("电梯2")).First(); if (mstbyEqno != null) { var Endloc = LocationHelper.GetLocByLoc(mstbyEqno.S_END_LOC); // var startloc = LocationHelper.GetLocByLoc(TN_Task.S_START_LOC); if (device == null) { LogHelper.Info($"根据任务终点:{TN_Task.S_END_LOC},未找到对应电梯配置文件"); } if (Endloc == null) { LogHelper.Info($"根据任务终点:{mstbyEqno.S_END_LOC},未找到对应货位"); } int value = 0; if (Endloc.N_LAYER == 1) value = 1; else if (Endloc.N_LAYER == 2) value = 3; else if (Endloc.N_LAYER == 3) value = 5; ModbusHelper.WriteSingleRegister(40089, value, device.address, 1024); ModbusHelper.WriteSingleRegister(40102, 1, device.address, 1024); } else { LogHelper.Info($"根据任务来源:{TN_Task.S_EQ_NO},未找到电梯2任务"); } } else if (TN_Task.Z_TYPE == 4)//原材料库国自安全交互 { loc = TN_Task.S_END_LOC; if (GZOperateReqByPost(url, TN_Task.S_EQ_NO, loc, type)) { // NDCHelper.ChangeParam(TN_Task.S_CODE.Trim(), 1101, 18); } } } } } catch (Exception ex) { LogHelper.Info($"OperateReq Error ==》{ex.ToString()}"); } } /// /// 安全请求 /// /// /// /// /// /// /// /// internal static bool OperateReqByPost(string url, string tasknum, string ordernum, string station, int type, int taskStatus, string name) { bool permit = false; try { //RequestList requestList = new RequestList(); TaskAccess taskAccess = new TaskAccess() { taskNum = tasknum, orderNum = ordernum, station = station, type = type, taskStatus = taskStatus }; // requestList.data.Add(taskAccess); HttpHelper httpHelper = new HttpHelper(); Result result = new Result(); string date = JsonConvert.SerializeObject(taskAccess); // string url = Settings.tableUrls.Find(a => a.id == 2).url; LogHelper.Info($"安全请求:地址:{url},内容:{date}"); var r = httpHelper.WebPost(url, date); result = JsonConvert.DeserializeObject(r); if (result.code == "0") { permit = true; LogHelper.Info($"安全请求成功"); } else { LogHelper.Info($"安全请求失败=>msg:{result.msg}"); ApiHelper.AddErrorInfo("安全交互失败", result.msg, "", tasknum); } ApiHelper.AddInfo(name, "安全请求", date, JsonConvert.SerializeObject(result), "Post", url); return permit; } catch (Exception) { return permit; } } /// /// 安全请求国资 /// /// /// /// /// /// /// /// internal static bool GZOperateReqByPost(string url, string no, string station, int type) { bool permit = false; try { LogHelper.Info($"国资安全请求"); //RequestList requestList = new RequestList(); //返回数据 Resultmobox resultmobox = new Resultmobox() { Name = "LocState", Source = "HostToAgv" }; GzTaskAccess taskAccess = new GzTaskAccess() { task_no = no, loc_code = station, type = type.ToString() }; resultmobox.data = taskAccess; // requestList.data.Add(taskAccess); HttpHelper httpHelper = new HttpHelper(); GzResult result = new GzResult(); string date = JsonConvert.SerializeObject(resultmobox); // string url = Settings.tableUrls.Find(a => a.id == 2).url; LogHelper.Info($"安全请求:地址:{url},内容:{date}"); var r = httpHelper.WebPostycl(url, date); result = JsonConvert.DeserializeObject(r); if (result.err_code == "0") { permit = true; LogHelper.Info($"安全请求成功"); } else { LogHelper.Info($"安全请求失败=>msg:{result.err_msg}"); ApiHelper.AddErrorInfo("安全交互失败", result.err_msg, "", no); } ApiHelper.AddInfo("YCL", "安全请求", date, JsonConvert.SerializeObject(result), "Post", url); return permit; } catch (Exception) { return permit; } } /// /// 任务拦截 /// /// /// internal static bool Intercept(WCSTask mst) { var result = true; var db = new SqlHelper().GetInstance(); //根据起点仓库编码判断是否可以推送 var taskLimit = db.Queryable().Where(a => a.S_WH_CODE == mst.S_START_WH && a.OPEN == "1").First(); if (taskLimit != null) { Console.WriteLine($"任务:{mst.S_CODE},起点仓库:{mst.S_START_WH}已经禁用推送"); return false; } var mstbyEqno = db.Queryable().Where(a => a.S_EQ_NO == mst.S_EQ_NO).ToList(); if (mstbyEqno.Count() == 1) { //预备库任务拦截 if (mst.Z_TYPE == 3) { var Ybkmst = db.Queryable().Where(a => a.Z_TYPE == 3 && a.S_TYPE == "1" && a.S_B_STATE != "完成").First(); if (Ybkmst != null) { result = false; } } return result; } else { //电梯分档任务拦截 if (mst.S_TYPE == "电梯1") { return result; } else if (mst.S_TYPE == "电梯2") { var mst2 = mstbyEqno.Where(a => a.S_TYPE == "电梯1").First(); if (mst2 == null) { return result; } else { if (mst2.S_B_STATE == "卸货完成" || mst2.S_B_STATE == "完成") { return result; } result = false; } } } 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); } } /// /// 取消任务判断是不是分段任务,如果是第一段任务取消,取消后续任务 /// /// /// internal static void CancelTaskSection(WCSTask mst) { //取消任务判断是否存在分段任务,如果有分段任务第一段取消后续任务 var db = new SqlHelper().GetInstance(); var mstbyEqno = db.Queryable().Where(a => a.S_EQ_NO == mst.S_EQ_NO).ToList(); if (mstbyEqno.Count() >= 2) { if (mst.S_TYPE == "电梯1") { var mst2 = mstbyEqno.Where(a => a.S_TYPE == "电梯2").First(); if (mst2 != null) { OperateStatus(mst2, 7); WCSHelper.Fail(mst2); } } } } private static object locLocker = new object(); /// /// 推送任务 /// /// internal static bool SendTask(WCSTask mst) { var db = new SqlHelper().GetInstance(); var result = false; var start = "0"; var end = "0"; var taskType = mst.S_TYPE.Trim(); var list = db.Queryable().ToList().Count; // if (mst.N_B_STATE == 0) { if (mst.N_SCHEDULE_TYPE == 1) { LogHelper.Info($"任务推送数据:{JsonConvert.SerializeObject(mst)}"); if (string.IsNullOrEmpty(mst.S_START_LOC) || string.IsNullOrEmpty(mst.S_END_LOC)) { LogHelper.Info($"任务{mst.S_CODE},起点终点有空参数,不推送任务"); } start = LocationHelper.GetAgvSite(mst.S_START_LOC); end = LocationHelper.GetAgvSite(mst.S_END_LOC); //if (mst.N_START_LAYER > 1) //{ // start = LocationHelper.GetAgvSite(mst.S_START_LOC, mst.N_START_LAYER.ToString()).ToString(); //} if (mst.N_END_LAYER > 1) { end = LocationHelper.GetAgvSite(mst.S_END_LOC, mst.N_END_LAYER.ToString()).ToString(); LogHelper.Info($"任务推送:终点层数为{mst.N_END_LAYER},推送站点为:{end}"); } Console.WriteLine($"SendTask {mst.S_CODE}"); Console.WriteLine("start=" + start); Console.WriteLine("end= " + end); var dic = new List(); 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 = "0" }); dic.Add(new param() { name = "DATA", value = "0" }); dic.Add(new param() { name = "Ctype", value = "0" }); var res = NDCApi.AddOrderNew(1, 1, mst.S_CODE, dic);//添加新命令 //dic.Add("Pri", mst.N_PRIORITY.ToString()); //dic.Add("From", start.ToString()); //dic.Add("To", end.ToString()); //dic.Add("task_no", mst.S_CODE.Trim());// dic.Add("Ext1", "1"); dic.Add("Ext2", "CALLADDAGV"); dic.Add("N_CNTR_COUNT", ""); //var res = NDC.AddNewOrder(1, dic); if (res != null && (res.err_code == 0 || res.err_code == 50009)) { //推送成功,修改任务优先级 mst.N_B_STATE = 1; mst.S_B_STATE = WCSTask.GetStateStr(1); WCSHelper.UpdateStatus(mst);//更新任务状态 result = true; LogHelper.Info($"NDC推送任务成功 {mst.S_CODE}start= {mst.S_START_LOC} + end = {mst.S_END_LOC}"); if (mst.S_TYPE.Contains("电梯1")) { var device = Settings.deviceInfos.Where(a => a.TN_Location == mst.S_END_LOC).FirstOrDefault(); var loc = LocationHelper.GetLocByLoc(mst.S_START_LOC); if (device == null) { LogHelper.Info($"根据任务终点:{mst.S_END_LOC},未找到对应电梯配置文件"); } if (loc == null) { LogHelper.Info($"根据任务起点:{mst.S_START_LOC},未找到对应货位"); } int value = 0; if (loc.N_LAYER == 1) value = 1; else if (loc.N_LAYER == 2) value = 3; else if (loc.N_LAYER == 3) value = 5; ModbusHelper.WriteSingleRegister(40089, value, device.address, 1024); ModbusHelper.WriteSingleRegister(40102, 1, device.address, 1024); } } 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); // } //} //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); // } //} // } return result; } /// /// 空托等待任务 超时5分组直接推送 /// /// /// internal static void WaitSend(WCSTask mst) { // 计算与当前时间的差值 TimeSpan timeDifference = DateTime.Now - mst.T_CREATE; if (timeDifference.TotalMinutes > 5) { var db = new SqlHelper().GetInstance(); mst.S_B_STATE = "等待"; db.Updateable(mst).UpdateColumns(it => new { it.S_B_STATE }).ExecuteCommand(); } } /// /// 任务状态回报 /// /// 任务号 /// 单号 /// 任务状态 /// 上报接口 public static void Reportback(string taskNum, string orderNum, int taskStatus, string url, string ly) { LogHelper.Info($"------------开始任务回报-----------"); try { //返回数据 // Result resultreportback = new Result(); Reportback reportback = new Reportback() { taskNum = taskNum, orderNum = orderNum, taskStatus = taskStatus }; // resultreportback.data.Add(reportback); //调用接口 HttpHelper httpHelper = new HttpHelper(); Result result = new Result(); string date = JsonConvert.SerializeObject(reportback); LogHelper.Info($"任务回报:地址:{url},内容:{date}"); string r = ""; r = httpHelper.WebPost(url, date); result = JsonConvert.DeserializeObject(r); if (result.code == "0") { LogHelper.Info($"任务回报成功"); } else { LogHelper.Info($"任务回报失败=>msg:{result.msg}"); } ApiHelper.AddInfo(ly, "任务状态回报", date, JsonConvert.SerializeObject(result), "Post", url); } catch (Exception ex) { LogHelper.Info($"任务回报错误:error:{ex.ToString()}"); } } /// /// 任务状态回报 /// /// 任务号 /// 单号 /// 任务状态 /// 上报接口 public static void WmsReportback(string taskNum, string orderNum, int taskStatus, string url) { LogHelper.Info($"------------开始wms任务回报-----------"); try { int state = 2; //返回数据 if (taskStatus == 7) { state = 1; } GTWMSData data = new GTWMSData() { task_no = orderNum, status = state }; GTWMS reportback = new GTWMS() { data = data }; // resultreportback.data.Add(reportback); //调用接口 HttpHelper httpHelper = new HttpHelper(); WmsResult result = new WmsResult(); string date = JsonConvert.SerializeObject(reportback); LogHelper.Info($"任务回报:地址:{url},内容:{date}"); string r = ""; r = httpHelper.WebPost(url, date); result = JsonConvert.DeserializeObject(r); if (result.success) { LogHelper.Info($"任务回报成功"); } else { LogHelper.Info($"任务回报失败="); } ApiHelper.AddInfo("Wms", "任务状态回报", date, JsonConvert.SerializeObject(result), "Post", url); } catch (Exception ex) { LogHelper.Info($"任务回报错误:error:{ex.ToString()}"); } } /// /// 原材料任务状态回报 /// /// 任务号 /// 单号 /// 任务状态 /// 上报接口 public static void Reportbackmobox(string taskNum, string orderNum, int taskStatus, string url) { LogHelper.Info($"------------开始任务回报(原材料任务回报)-----------"); try { //返回数据 Resultmobox resultmobox = new Resultmobox() { Name = "AGVTaskStatus", Source = "HostToAgv" }; Reportback reportback = new Reportback() { taskNum = taskNum, orderNum = orderNum, taskStatus = taskStatus }; resultmobox.data = reportback; //调用接口 HttpHelper httpHelper = new HttpHelper(); Resultmobox result = new Resultmobox(); string date = JsonConvert.SerializeObject(resultmobox); LogHelper.Info($"任务回报:地址:{url},内容:{date}"); string r = ""; r = httpHelper.WebPostycl(url, date); result = JsonConvert.DeserializeObject(r); if (result != null && result.err_code == "0") { LogHelper.Info($"任务回报成功"); } else { LogHelper.Info($"任务回报失败=>msg:{result.err_msg}"); } ApiHelper.AddInfo("YCL", "任务状态回报", date, JsonConvert.SerializeObject(result), "Post", url); } catch (Exception ex) { LogHelper.Info($"任务回报错误:error:{ex.ToString()}"); } } /// /// MES任务状态回报 /// /// /// /// public static void MESReportback(WCSTask mst, int status, string url) { LogHelper.Info($"------------开始MES任务回报-----------"); try { //回报数据获取 Request statusarrive = new Request(); //获取时间戳 var time = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); statusarrive.RequestId = "杭叉AGV" + time; string info = ""; switch (status) { case 1: info = "agv已接受原料库下发的任务"; break; case 4: info = "agv已取货完成"; break; case 6: info = "agv已卸货到指定位置"; break; case 2: info = "agv已完成送料任务"; break; } string message = "1"; if (status == 7) { message = "agv任务已取消"; } int flag = 0; if (mst.S_NOTE == "粉料") { flag = 1; } //List statusArrives = new List(); StatusArrive statusArrive = new StatusArrive(); statusarrive.UseToken = "iFQ5fExGrLYLXliHYWzs"; statusArrive.TaskNumber = mst.S_EQ_NO; statusArrive.LocationNum = mst.S_END_LOC; statusArrive.Time = DateTime.Now.ToString(); statusArrive.Status = status.ToString(); statusArrive.Rfid = mst.S_CNTR_CODE; statusArrive.Flag = flag; statusArrive.Info = info; statusArrive.Message = message; //statusArrives.Add(statusArrive); statusarrive.data = statusArrive; //开始回报 HttpHelper httpHelper = new HttpHelper(); MesResult result = new MesResult(); string date = JsonConvert.SerializeObject(statusarrive); LogHelper.Info($"任务回报:地址:{url},内容:{date}"); var r = httpHelper.MesWebPost(url, date); LogHelper.Info($"任务回报:返回内容:{r}"); result = JsonConvert.DeserializeObject(r); if (result != null && result.icode == "200") { LogHelper.Info($"任务回报成功"); } else { LogHelper.Info($"任务回报失败=>msg:{result.imsg}"); } ApiHelper.AddInfo("Mes", "任务状态回报", date, JsonConvert.SerializeObject(result), "Post", url); } catch (Exception ex) { LogHelper.Info($"任务回报错误:error:{ex.Message},行号:{ex.StackTrace}"); } } /// /// mes物料到位同步 /// /// 任务 /// 地址 public static void MESIteminfoback(WCSTask mst, string url) { LogHelper.Info($"------------开始物料信息回报-----------"); try { var cntritem = ContainerHelper.GetCntrItemRel(mst.S_CNTR_CODE).FirstOrDefault(); //回报数据 Request request = new Request(); List list = new List(); string MesNo = mst.S_EQ_NO; if (!string.IsNullOrEmpty(mst.S_MES_NO)) { MesNo = mst.S_MES_NO; } //粉料回库不需要回报 if (cntritem != null && mst.S_TYPE == "余料返回" && cntritem.S_ITEM_CODE.StartsWith("4X")) { LogHelper.Info("粉料回库不需要到位发送物料到位"); return; } //获取时间戳 var time = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); //物料到位接口和状态反馈同时调IIOT,为了区分id,物料到位长度加一区分 request.RequestId = "杭叉AGV" + time + "1"; request.UseToken = "iFQ5fExGrLYLXliHYWzs"; MesItemBackModel mesItemBackModel = new MesItemBackModel(); mesItemBackModel.TaskNumber = MesNo; mesItemBackModel.WmsTaskNumber = mst.S_WMS_NO; mesItemBackModel.Rfid = mst.S_CNTR_CODE; mesItemBackModel.LocationNum = mst.S_END_LOC; mesItemBackModel.Result = "1"; mesItemBackModel.ArricalTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); if (cntritem != null) { string curBagNum = null; string weightBag = null; string initBagNum = null; if ((int)cntritem.F_QTY > 0) { curBagNum = cntritem.F_QTY.ToString(); } if (!string.IsNullOrEmpty(cntritem.F_WEIGHT1) && int.Parse(cntritem.F_WEIGHT1) > 0) { weightBag = cntritem.F_WEIGHT1; } if (!string.IsNullOrEmpty(cntritem.F_QTY1) && int.Parse(cntritem.F_QTY1) > 0) { initBagNum = cntritem.F_QTY1; } list.Add(new MesItemBackInfoModel() { LotNumber = cntritem.S_BATCH_NO, PartNumber = cntritem.S_ITEM_CODE, Subpool = cntritem.Subpool, ReceiveLot = cntritem.ReceiveLot, Supplier = cntritem.S_SUPPLIER_NO, TyreType = cntritem.TyreType, ProduceTime = cntritem.D_PRD_DATE, Rfid = cntritem.S_CNTR_CODE, Qty = cntritem.F_WEIGHT, PartLevel = cntritem.LEV, WmsLot = cntritem.WmsLot, WeightBag = weightBag, CurBagNum = curBagNum, InitBagNum = initBagNum }); } mesItemBackModel.List = list; request.data = mesItemBackModel; //任务上报 HttpHelper httpHelper = new HttpHelper(); MesResult result = new MesResult(); string date = JsonConvert.SerializeObject(request); LogHelper.Info($"物料到位回报:地址:{url},内容:{date}"); var r = httpHelper.MesWebPost(url, date); LogHelper.Info($"物料到位回报:返回内容:{r}"); result = JsonConvert.DeserializeObject(r); if (result != null && result.icode == "200") { LogHelper.Info($"物料到位回报成功"); } else { LogHelper.Info($"物料到位回报失败=>msg:{result.imsg}"); } ApiHelper.AddInfo("Mes", "物料到位回报", date, JsonConvert.SerializeObject(result), "Post", url); } catch (Exception ex) { LogHelper.Info($"物料到位回报错误:error:{ex.ToString()}"); } } /// /// 创建搬运任务 /// /// /// /// /// /// /// /// /// /// public static bool CreateTransport(string start, string end, string taskType, List cntrs, int startLayer, int endLayer, int trayCarryCount = 1, int priority = 1) { var result = false; //批次号存托盘号,1~3个托盘 var trayCodes = string.Join(",", cntrs); var taskNo = DateTime.Now.Ticks.ToString(); var res = WCSHelper.CreateTask(taskNo, start.Trim(), end.Trim(), taskType, priority, trayCodes, trayCarryCount, startLayer, endLayer); if (res) { result = true; //任务创建成功,起点货位出库锁定,终点货位入库锁定 LocationHelper.LockLoc(start, 1); LocationHelper.LockLoc(end, 2); } return result; } public static bool CreateTransport(string start, string end, string taskType, List cntrs, int priority = 1) { var result = false; //批次号存托盘号,1~3个托盘 var trayCodes = string.Join(",", cntrs); var taskNo = DateTime.Now.Ticks.ToString(); var res = WCSHelper.CreateTask(taskNo, start.Trim(), end.Trim(), taskType, priority, trayCodes, 1, 1, 1); if (res) { result = true; LocationHelper.LockLoc(start, 2); LocationHelper.LockLoc(end, 1); } return result; } #endregion } }