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;
}
}
}