using HanHe.Message; using HH.WCS.Hexafluo.core; using HH.WCS.Hexafluo.process; using HH.WCS.Hexafluo.util; using HH.WCS.Hexafluo.wms; using HH.WCS.SJML.api; using HH.WCS.SJML.Bll; using HH.WCS.SJML.dispatch; using HH.WCS.SJML.Dto; using HH.WCS.SJML.Entitys; using HH.WCS.SJML.util; using HH.WCS.ZCQTJ.Entitys; using Newtonsoft.Json; using SqlSugar; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using System.Web.Http; using static HH.WCS.SJML.api.ApiModel; namespace HH.WCS.Hexafluo.api { /// /// hosttoagv上报 /// //[RoutePrefix("agv")] public class AgvController : System.Web.Http.ApiController { private static object locko1 = new object(); /// /// hosttoagv上报 /// /// /// [HttpPost] //[Route("AGVCallbackState")] public ReturnResult AGVCallbackState(AgvTaskState model) { LogHelper.Info("HosttoagvTask", "AGVCallbackState Request:" + JsonConvert.SerializeObject(model)); var logPara = LogType.LogPara("完工回报"); LogHelper.TaskDetail(logPara, "agv完工回报参数:" + JsonConvert.SerializeObject(model)); Task.Run(() => { var chi = new SqlHelper().GetInstance(); var newDb = chi.CopyNew(); try { var transportTask = newDb.Queryable().Where(e => e.S_TASK_NO == model.No)?.First(); if (transportTask == null) { LogHelper.TaskDetail(logPara, $"完工回报 任务号{model.No} 返回给AGV信息{JsonConvert.SerializeObject(new ReturnResult())}"); throw new Exception("未查询到该任务"); } if (transportTask.S_B_STATE == "取消" || transportTask.S_B_STATE == "完成") { LogHelper.TaskDetail(logPara, $"完工回报 任务号{model.No} 返回给AGV信息{JsonConvert.SerializeObject(new ReturnResult())}"); return new ReturnResult(); } if ((model.State == 3 && model.ForkliftNo != "0") || (string.IsNullOrEmpty(transportTask.S_EQ_NO) && model.ForkliftNo != "0")) { TaskHelper.AddActionRecord(model.No, model.State, model.ForkliftNo, model.ExtData, transportTask, model.ForkliftNo); } else { TaskHelper.AddActionRecord(model.No, model.State, model.ForkliftNo, model.ExtData, transportTask); } if (model.State <= 7) { var SataeLis = TaskCore.SataeList[model.State]; if (SataeLis == "完成") { //AGV异步完成 deadlockRollEntitys Deck = new deadlockRollEntitys(); Deck.S_INTER_STATE = "22"; Deck.S_VALUE_JSON = model.No; try { newDb.BeginTran(); var I = newDb.Insertable(Deck).ExecuteCommand(); if (I == 0) { newDb.RollbackTran(); } newDb.CommitTran(); } catch (Exception ex) { newDb.RollbackTran(); } LogHelper.TaskDetail(logPara, $"完工回报 任务号{model.No} 返回给AGV信息{JsonConvert.SerializeObject(new ReturnResult())}"); return new ReturnResult(); } if (SataeLis == "取消") { //AGV异步取消 deadlockRollEntitys Deck = new deadlockRollEntitys(); Deck.S_INTER_STATE = "7"; Deck.S_VALUE_JSON = model.No; try { newDb.BeginTran(); var I = newDb.Insertable(Deck).ExecuteCommand(); if (I == 0) { newDb.RollbackTran(); } newDb.CommitTran(); } catch (Exception ex) { newDb.RollbackTran(); } LogHelper.TaskDetail(logPara, $"完工回报 任务号{model.No} 返回给AGV信息{JsonConvert.SerializeObject(new ReturnResult())}"); return new ReturnResult(); } var ta = BLLCreator.Create().ExecuteState(model.No, SataeLis, logPara, transportTask); LogHelper.TaskDetail(logPara, $"完工回报返回:任务号为:{model.No}" + JsonConvert.SerializeObject(ta)); TaskProcess.OperateReq(model.No, model.State, model.ForkliftNo, model.ExtData, transportTask); if (transportTask.S_NOTE.Equals("agv任务") && model.State == 7 && ta.Success) { if (transportTask.S_TASK_NO.IndexOf('_') > 0 && transportTask.S_TYPE == "入库") { BLLCreator.Create().AgvStateWcsIn(transportTask, logPara); } else if (transportTask.S_TASK_NO.IndexOf('_') > 0 && transportTask.S_TYPE == "出库") { var tac = newDb.Queryable().Where(a => a.S_TASK_NO == transportTask.S_TASK_NO && a.S_ACTION_CODE == "1101")?.First(); if (tac != null) { LogHelper.TaskDetail(logPara, "完工回报 调用安全请求取消:"); var Wcs = BLLCreator.Create().WcsCallback(transportTask, 7, transportTask.S_EQ_NO); } } } } else { TaskProcess.OperateReq(model.No, model.State, model.ForkliftNo, model.ExtData, transportTask); } LogHelper.TaskDetail(logPara, $"完工回报 任务号{model.No} 返回给AGV信息{JsonConvert.SerializeObject(new ReturnResult())}"); return new ReturnResult(); } catch (Exception ex) { LogHelper.TaskDetail(logPara, "完工回报报错:" + JsonConvert.SerializeObject(ex)); LogHelper.TaskDetail(logPara, $"完工回报 任务号{model.No} 返回给AGV信息{JsonConvert.SerializeObject(new ReturnResult())}"); return new ReturnResult(); } }); LogHelper.TaskDetail(logPara, $"完工回报 任务号{model.No} 返回给AGV信息{JsonConvert.SerializeObject(new ReturnResult())}"); return new ReturnResult(); } [HttpPost] //[Route("AGVCallbackEvent")] public ReturnResult AGVCallbackEvent(AgvEventInfo model) { LogHelper.Info("HosttoagvTask", "AGVCallbackEvent Request:" + JsonConvert.SerializeObject(model)); return new ReturnResult(); } /// /// 车体错误缓存 /// public static Dictionary percentage = new Dictionary(); /// /// 车体错误 /// /// 十进制转二进制 小车发十进制 错误文档则是16进制 /// [HttpPost] //[Route("AGVDeviceReceive")] public ReturnResult AGVDeviceReceive(List models) { // LogHelper.Info("HosttoagvCar", "AGVDeviceReceive Request:" + JsonConvert.SerializeObject(models)); var chi = new SqlHelper().GetInstance(); var newDb = chi.CopyNew(); Task.Run(() => { try { var Alone = newDb.Queryable().Where(e => e.S_IS_OPEN == "Y").ToList(); List Conditions = new List(); foreach (var item in models) { if (item.errCode != "0" || item.errCode2 != "0" || item.faildCode != "0") { LogHelper.DanInfo("HosttoagvCar", $"errCode: {item.errCode} errCode2: {item.errCode2}"); //1: //if (percentage.ContainsKey(item.forkliftNo)) //{ // var Model = percentage[item.forkliftNo]; // double differenceInMinutes = (Model.Operattime - item.Operattime).TotalMinutes; // if (differenceInMinutes > 5) // { // LogHelper.DanInfo("HosttoagvCar", $" 车体错误缓存 {JsonConvert.SerializeObject(Model)}"); // if (Model.errCode != item.errCode || Model.errCode2 != item.errCode2 || Model.faildCode != item.faildCode) // { // if (Model.errCode != item.errCode && item.errCode != "0") // { // if (differenceInMinutes > 5) // { // AgvCa(item, item.errCode, Alone, "1"); // } // } // if (Model.errCode2 != item.errCode2 && item.errCode2 != "0") // { // if (differenceInMinutes > 5) // { // AgvCa(item, item.errCode2, Alone, "2"); // } // } // if (Model.faildCode != item.faildCode && item.faildCode != "0") // { // if (differenceInMinutes > 5) // { // AgvCa(item, item.faildCode, Alone, "3"); // } // } // if (differenceInMinutes > 5) // { // percentage[item.forkliftNo] = item; // } // } // } //} //else //{ // percentage.Add(item.forkliftNo, item); // if (item.errCode != "0") // { // AgvCa(item, item.errCode, Alone, "1"); // } // if (item.errCode2 != "0") // { // AgvCa(item, item.errCode2, Alone, "2"); // } // if (item.faildCode != "0") // { // AgvCa(item, item.faildCode, Alone, "3"); // } //} // 2: //if (item.errCode != "0") //{ // AgvCa(item, item.errCode, Alone, "1"); //} //if (item.errCode2 != "0") //{ // AgvCa(item, item.errCode2, Alone, "2"); //} //if (item.faildCode != "0") //{ // AgvCa(item, item.faildCode, Alone, "3"); //} //3: if (percentage.ContainsKey(item.forkliftNo)) { var ggh = percentage[item.forkliftNo]; if (ggh.errCode != item.errCode || ggh.errCode2 != item.errCode2 || ggh.faildCode != item.faildCode) { var Model = percentage[item.forkliftNo]; LogHelper.DanInfo("HosttoagvCar", $" 车体错误缓存 {JsonConvert.SerializeObject(Model)}"); if (item.errCode != "0" && ggh.errCode != item.errCode) { AgvCa(item, item.errCode, Alone, "1"); } if (item.errCode2 != "0" && ggh.errCode2 != item.errCode2) { AgvCa(item, item.errCode2, Alone, "2"); } if (item.faildCode != "0" && ggh.faildCode != item.faildCode) { AgvCa(item, item.faildCode, Alone, "3"); } } percentage[item.forkliftNo] = item; } else { percentage.Add(item.forkliftNo, item); if (item.errCode != "0") { AgvCa(item, item.errCode, Alone, "1"); } if (item.errCode2 != "0") { AgvCa(item, item.errCode2, Alone, "2"); } if (item.faildCode != "0") { AgvCa(item, item.faildCode, Alone, "3"); } } } else { if (percentage.ContainsKey(item.forkliftNo)) { percentage[item.forkliftNo] = item; } else { percentage.Add(item.forkliftNo, item); } } S_AGV_CONDITIONEntitys cond = new S_AGV_CONDITIONEntitys(); //车号 cond.forkliftNo = item.forkliftNo; //电池 string[] battery = item.battery.Split(','); cond.Battery_Soc = battery[0]; cond.Battery_V = battery[1]; cond.Battery_Amp = battery[2]; cond.Battery_Temp = battery[3]; cond.Battery_Prop = battery[4]; //里程 string[] mileage = item.mileage.Split(','); cond.Mileage_Km = mileage[0]; cond.Mileage_m = mileage[1]; //电机信息 string[] motor = item.motor.Split(','); cond.Motor_Amp = motor[0]; cond.Motor_Temp = motor[1]; cond.Motor_Y_Amp = motor[2]; cond.Motor_Y_Temp = motor[3]; //交通管制信息 string[] traffic = item.traffic.Split(','); cond.Traffic_Pt = traffic[0]; cond.Traffic_Sec = traffic[1]; cond.Traffic_Wire = traffic[2]; cond.Traffic_Unit = traffic[3]; cond.Traffic_Io = traffic[4]; //开机时间 string[] time = item.time.Split(','); cond.Time_D = time[0]; cond.time_H = time[1]; //举升次数 string[] lifts = item.lifts.Split(','); cond.Lifts_Kc = lifts[0]; cond.Lifts_c = lifts[1]; //其他信息 string[] pos = item.pos.Split(','); cond.Pos_X = pos[0]; cond.Pos_Y = pos[1]; cond.Pos_Z = pos[2]; //转向角度 cond.Angle_Deg = item.angle; switch (item.agvstate) { case "0": cond.Agvstate_s = "空闲"; break; case "1": cond.Agvstate_s = "行动中"; break; case "2": cond.Agvstate_s = "充电机中"; break; } // cond.Agvstate_s = item.agvstate; Conditions.Add(cond); } //车体信息插入 UpdateAgvState(Conditions); } catch (Exception ex) { LogHelper.DanInfo("HosttoagvCar", "AGVDeviceReceive 报错:" + ex.Message); } }); return new ReturnResult(); } /// /// 车体信息插入数据库 /// /// /// public OperateResult UpdateAgvState(List Conds) { var chi = new SqlHelper().GetInstance(); var newDb = chi.CopyNew(); try { //先查 在修改 当查询不到时添加数据 var agv = newDb.Queryable().Where(e => Conds.Select(c => c.forkliftNo).ToList().Contains(e.forkliftNo)).ToList(); newDb.BeginTran(); //修改 foreach (var item in Conds) { var Up = agv.Find(e => e.forkliftNo == item.forkliftNo); if (Up != null) { var ffd = newDb.Updateable(item).UpdateColumns(it => new { it.Battery_Soc, it.Battery_V, it.Battery_Amp, it.Battery_Temp, it.Battery_Prop, it.Motor_Amp, it.Motor_Temp, it.Motor_Y_Amp, it.Motor_Y_Temp, it.Traffic_Pt, it.Traffic_Sec, it.Traffic_Wire, it.Traffic_Unit, it.Traffic_Io, it.Time_D, it.time_H, it.Mileage_Km, it.Mileage_m, it.Lifts_Kc, it.Lifts_c, it.Pos_X, it.Pos_Y, it.Pos_Z, it.Angle_Deg, it.Agvstate_s }).Where(a => a.forkliftNo == item.forkliftNo).ExecuteCommand(); } else { newDb.Insertable(item).ExecuteCommand(); } } newDb.CommitTran(); return OperateResult.Succeed(); } catch (Exception ex) { newDb.RollbackTran(); LogHelper.DanInfo("HosttoagvCar", "UpdateAgvState 报错:" + ex.Message); return OperateResult.Error(ex.Message); } } /// /// /// /// /// /// public void AgvCa(AgvDeviceStatus item, string reeCode, List Alone, string ii) { try { var chi = new SqlHelper().GetInstance(); var newDb = chi.CopyNew(); var transportTask = newDb.Queryable().Where(e => e.S_B_STATE != "取消" && e.S_B_STATE != "完成" && e.S_NOTE == "agv任务" && e.S_EQ_NO == item.forkliftNo)?.First(); List AgbError = new List(); string MistakeNumber = Convert.ToString(int.Parse(reeCode), 2);//小车错误二进制 LogHelper.DanInfo("HosttoagvCar", $" 小车错误二进制 {MistakeNumber}"); int[] MistakeArray = new int[MistakeNumber.Length]; // 创建一个长度等于二进制数位数的数组 for (int i = 0; i < MistakeNumber.Length; i++) { MistakeArray[i] = int.Parse(MistakeNumber[i].ToString()); // 将二进制数的每一位存储到数组中 } Array.Reverse(MistakeArray);//数组反转 var indexes = Enumerable.Range(0, MistakeArray.Length).Where(i => MistakeArray[i] == 1);//获取数组中1所在的索引 LogHelper.DanInfo("HosttoagvCar", $" 获取数组中1所在的索引 {JsonConvert.SerializeObject(indexes)}"); foreach (var Inde in indexes) { //匹配错误 并且调用钉钉 var ffgh = ""; var ggf = Alone.Find(e => e.S_AGV_TYPE == ii && e.N_CODE_1 == Inde + 1); if (ggf != null) { if (transportTask.S_TYPE == "入库") { ffgh = $"任务号: {transportTask.S_TASK_NO.Substring(transportTask.S_TASK_NO.Length - 4)} 库区:{transportTask.S_END_LAREA} 车号:{item.forkliftNo} 错误:{ggf?.S_AGV_NOTE} 时间:{DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss")}"; LogHelper.DanInfo("HosttoagvCar", $"任务号: {transportTask.S_TASK_NO.Substring(transportTask.S_TASK_NO.Length - 4)} 库区:{transportTask.S_END_LAREA} 车号:{item.forkliftNo} 错误:{ggf?.S_AGV_NOTE} 时间:{DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss")}"); } else { ffgh = $"任务号: {transportTask.S_TASK_NO.Substring(transportTask.S_TASK_NO.Length - 4)} 库区:{transportTask.S_START_LAREA} 车号:{item.forkliftNo} 错误:{ggf?.S_AGV_NOTE} 时间:{DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss")}"; LogHelper.DanInfo("HosttoagvCar", $"任务号: {transportTask.S_TASK_NO.Substring(transportTask.S_TASK_NO.Length - 4)} 库区:{transportTask.S_START_LAREA} 车号:{item.forkliftNo} 错误:{ggf?.S_AGV_NOTE} 时间:{DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss")}"); } } //else //{ // ffgh = $"任务号: 库区: 车号:{item.forkliftNo} 错误:{ggf?.S_AGV_NOTE} 时间:{DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss")}"; // LogHelper.DanInfo("HosttoagvCar", $"任务号: 库区: 车号:{item.forkliftNo} 错误:{ggf?.S_AGV_NOTE} 时间:{DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss")}"); //} if (!string.IsNullOrEmpty(ffgh)) { BLLCreator.CreateSingleton().button1_Click(ffgh); //设备报警数统计表 AgbError.Add(new AgvErrorReportEntitys { AgvLicense = item.forkliftNo, AgvErrorMsg = ggf?.S_AGV_NOTE }); } } //添加到表 if (AgbError.Count() > 0) { try { newDb.BeginTran(); var B = newDb.Insertable(AgbError).ExecuteCommand(); newDb.CommitTran(); } catch (Exception) { newDb.RollbackTran(); } } } catch (Exception ex) { LogHelper.DanInfo("HosttoagvCar", "AgvCa 报错:" + ex.Message); } } [HttpPost] //[Route("CameraInfo")] public SimpleResult CameraInfo(List models) { LogHelper.Info("CameraInfo Request:" + JsonConvert.SerializeObject(models)); return ApiHelper.OperateCameraInfo(models); } [HttpPost] public SimpleResult InWorkArea(InWorkAreaEntitys inWorkArea) { List ac = new List(); SimpleResult result = new SimpleResult(); var tr = TaskProcess.CreateTransport(inWorkArea.StaBit, inWorkArea.EndBit, "移送", ac, 1, 1); if (tr) { result.resultCode = 0; } else { result.resultCode = -1; result.resultMsg = "失败"; } return result; } } }