using HanHe.Message; using HH.WCS.ZhongCeJinTan.core; using HH.WCS.ZhongCeJinTan.dispatch; using HH.WCS.ZhongCeJinTan.process; using HH.WCS.ZhongCeJinTan.util; using HH.WCS.ZhongCeJinTan.wms; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Web.Http; using static HH.WCS.ZhongCeJinTan.api.ApiModel; namespace HH.WCS.ZhongCeJinTan.api { //[RoutePrefix("Agv")] public class AgvController : System.Web.Http.ApiController { [HttpPost] public ReturnResult AGVCallbackState(AgvTaskState model) { LogHelper.Info("AGVCallbackState Request:" + JsonConvert.SerializeObject(model), "HosttoagvTask"); try { TaskCore.addAgvActionState(model); return new ReturnResult(); } catch (Exception) { return new ReturnResult(); } } /// /// 车体错误缓存 /// public static Dictionary percentage = new Dictionary(); /// /// 车体错误 /// /// 十进制转二进制 小车发十进制 错误文档则是16进制 /// [HttpPost] public ReturnResult AGVDeviceReceive(List models) { LogHelper.Info("AGVDeviceReceive 参数信息:" + JsonConvert.SerializeObject(models),"HosttoagvCar"); try { var chi = new SqlHelper().GetInstance(); var newDb = chi.CopyNew(); 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.Info($"errCode {item.errCode} errCode2 {item.errCode}","HosttoagvCar"); if (percentage.ContainsKey(item.forkliftNo)) { var Model = percentage[item.forkliftNo]; double differenceInMinutes = (Model.Operattime - item.Operattime).TotalMinutes; if (differenceInMinutes > 5) { LogHelper.Info($" 车体错误缓存 {JsonConvert.SerializeObject(Model)}", "HosttoagvCar"); 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"); } } } 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.Info("AGVDeviceReceive 异常:" + ex.Message, "HosttoagvCar"); } return new ReturnResult(); } /// /// 车体信息插入数据库 /// /// /// public void UpdateAgvState(List Conds) { var chi = new SqlHelper().GetInstance(); var newDb = chi.CopyNew(); try { //先查 在修改 当查询不到时添加数据 var agv = chi.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(); } catch (Exception ex) { newDb.RollbackTran(); LogHelper.Info("UpdateAgvState 异常:" + ex.Message, "HosttoagvCar"); } } 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_SCHEDULE_TYPE == "agv" && e.S_EQ_NO == item.forkliftNo)?.First(); List AgbError = new List(); string MistakeNumber = Convert.ToString(int.Parse(reeCode), 2);//小车错误二进制 LogHelper.Info( $" 小车错误二进制 {MistakeNumber}","HosttoagvCar"); 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.Info($" 获取数组中1所在的索引 {JsonConvert.SerializeObject(indexes)}", "HosttoagvCar"); 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.Contains("入库")) { ffgh = $"任务号: {transportTask.S_CODE} \n 库区:{transportTask.S_END_AREA} \n 车号:{item.forkliftNo} \n 错误:{ggf?.S_AGV_NOTE} 时间:{DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss")}"; LogHelper.Info($"任务号: {transportTask.S_CODE}库区:{transportTask.S_END_AREA} 车号:{item.forkliftNo} 错误:{ggf?.S_AGV_NOTE} 时间:{DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss")}", "HosttoagvCar"); } else { ffgh = $"任务号: {transportTask.S_CODE} \n 库区:{transportTask.S_START_AREA} \n 车号:{item.forkliftNo}\n 错误:{ggf?.S_AGV_NOTE} 时间:{DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss")}"; LogHelper.Info($"任务号: {transportTask.S_CODE} 库区:{transportTask.S_START_AREA} 车号:{item.forkliftNo} 错误:{ggf?.S_AGV_NOTE} 时间:{DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss")}", "HosttoagvCar"); } } else { ffgh = $"任务号: 库区: 车号:{item.forkliftNo} 错误:{ggf?.S_AGV_NOTE} 时间:{DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss")}"; LogHelper.Info($"任务号: 库区: 车号:{item.forkliftNo} 错误:{ggf?.S_AGV_NOTE} 时间:{DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss")}", "HosttoagvCar"); } if (!string.IsNullOrEmpty(ffgh)) { var dd = new DingDingHelper(); dd.button1_Click(ffgh); } AgbError.Add(new AgvErrorReportEntitys { AgvLicense = item.forkliftNo, AgvErrorMsg = ggf?.S_AGV_NOTE }); //设备报警数统计表 } //添加到表 try { newDb.BeginTran(); var B = newDb.Insertable(AgbError).ExecuteCommand(); newDb.CommitTran(); } catch (Exception) { newDb.RollbackTran(); } } catch (Exception ex) { LogHelper.Info("AGVDeviceReceive 异常:" + ex.Message, "HosttoagvCar"); } } /// /// 修改任务优先级 /// /// /// [HttpPost] public zcResult Task(taskParme model) { LogHelper.Info("task 参数:" + JsonConvert.SerializeObject(model), "API"); var res = TaskProcess.task1(model); LogHelper.Info("task 返回:" + JsonConvert.SerializeObject(res), "API"); return res; } /// /// 强制完成任务信息 /// [HttpPost] public Result CompleteTask(cancleTaskParme model) { LogHelper.Info("CompleteTask 参数:" + JsonConvert.SerializeObject(model), "API"); var res = TaskProcess.completeTask1(model); LogHelper.Info("CompleteTask 返回:" + JsonConvert.SerializeObject(res), "API"); return res; } } }