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();
|
}
|
}
|
|
|
/// <summary>
|
/// 车体错误缓存
|
/// </summary>
|
public static Dictionary<string, AgvDeviceStatus> percentage = new Dictionary<string, AgvDeviceStatus>();
|
/// <summary>
|
/// 车体错误
|
/// </summary>
|
/// <param name="models"></param>十进制转二进制 小车发十进制 错误文档则是16进制
|
/// <returns></returns>
|
[HttpPost]
|
public ReturnResult AGVDeviceReceive(List<AgvDeviceStatus> models)
|
{
|
LogHelper.Info("AGVDeviceReceive 参数信息:" + JsonConvert.SerializeObject(models),"HosttoagvCar");
|
try
|
{
|
var chi = new SqlHelper<object>().GetInstance();
|
var newDb = chi.CopyNew();
|
var Alone = newDb.Queryable<S_AGV_TYPEEntitys>().Where(e => e.S_IS_OPEN == "Y").ToList();
|
List<S_AGV_CONDITIONEntitys> Conditions = new List<S_AGV_CONDITIONEntitys>();
|
|
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();
|
}
|
|
|
|
|
|
|
/// <summary>
|
/// 车体信息插入数据库
|
/// </summary>
|
/// <param name="Conds"></param>
|
/// <returns></returns>
|
public void UpdateAgvState(List<S_AGV_CONDITIONEntitys> Conds)
|
{
|
var chi = new SqlHelper<object>().GetInstance();
|
var newDb = chi.CopyNew();
|
try
|
{
|
//先查 在修改 当查询不到时添加数据
|
var agv = chi.Queryable<S_AGV_CONDITIONEntitys>().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<S_AGV_TYPEEntitys> Alone, string ii)
|
{
|
try
|
{
|
var chi = new SqlHelper<object>().GetInstance();
|
var newDb = chi.CopyNew();
|
var transportTask = newDb.Queryable<WMSTask>().Where(e => e.S_B_STATE != "取消" && e.S_B_STATE != "完成" && e.S_SCHEDULE_TYPE == "agv" && e.S_EQ_NO == item.forkliftNo)?.First();
|
List<AgvErrorReportEntitys> AgbError = new List<AgvErrorReportEntitys>();
|
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");
|
}
|
}
|
|
/// <summary>
|
/// 修改任务优先级
|
/// </summary>
|
/// <param name="model"></param>
|
/// <returns></returns>
|
[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;
|
}
|
|
|
|
|
/// <summary>
|
/// 强制完成任务信息
|
/// </summary>
|
[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;
|
}
|
|
}
|
}
|