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.OperateTaskStatus(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;
}
}
}