using HH.WCS.JiaTong.api;
|
using HH.WCS.JiaTong.core;
|
using HH.WCS.JiaTong.device;
|
using HH.WCS.JiaTong.dispatch;
|
using HH.WCS.JiaTong.LISTA.models;
|
using HH.WCS.JiaTong.LISTA.process;
|
using HH.WCS.JiaTong.util;
|
using HH.WCS.JiaTong.wms;
|
using Microsoft.Owin.BuilderProperties;
|
using Newtonsoft.Json;
|
using Newtonsoft.Json.Linq;
|
using SqlSugar;
|
using System;
|
using System.Collections.Generic;
|
using System.Diagnostics.Eventing.Reader;
|
using System.IdentityModel.Protocols.WSTrust;
|
using System.Linq;
|
using System.Security.Cryptography;
|
using System.Threading;
|
using System.Threading.Tasks;
|
using static HH.WCS.JiaTong.api.ApiModel;
|
using static HH.WCS.JiaTong.LISTA.process.HttpModel;
|
|
namespace HH.WCS.JiaTong.process
|
{
|
internal class TaskProcess
|
{
|
#region 任务相关
|
//--------------------------------------------------任务相关--------------------------------------------------
|
/// <summary>
|
/// 取货卸货完成,缓存位状态更新
|
/// </summary>
|
/// <param name="mst"></param>
|
/// <param name="v"></param>
|
internal static void CacheBitUpdate(WCSTask mst, bool load)
|
{
|
var trayCarryCount = mst.N_CNTR_COUNT > 0 ? mst.N_CNTR_COUNT : 1;
|
if (load)
|
{
|
//Console.WriteLine($"任务{mst.S_CODE} 货位{mst.S_START_LOC}取货完成,起点解绑容器{mst.S_CNTR_CODE}");
|
|
if (!string.IsNullOrEmpty(mst.S_CNTR_CODE))
|
{
|
LogHelper.Info($"任务{mst.S_CODE} 货位{mst.S_START_LOC}取货完成,起点解绑容器{mst.S_CNTR_CODE}");
|
LocationHelper.UnBindingLoc(mst.S_START_LOC, mst.S_CNTR_CODE.Split(',').ToList());
|
}
|
else
|
{
|
LogHelper.Info($"任务{mst.S_CODE} 托盘为空 ,只解锁货位");
|
LocationHelper.UnlockLocDeleteCntrs(mst.S_START_LOC);
|
}
|
}
|
else
|
{
|
// Console.WriteLine($"任务{mst.S_CODE} 货位{mst.S_END_LOC}卸货完成,终点绑定容器{mst.S_CNTR_CODE}");
|
|
if (!string.IsNullOrEmpty(mst.S_CNTR_CODE))
|
{
|
LogHelper.Info($"任务{mst.S_CODE} 货位{mst.S_END_LOC}卸货完成,终点绑定容器{mst.S_CNTR_CODE}");
|
LocationHelper.BindingLoc(mst.S_END_LOC, mst.S_CNTR_CODE.Split(',').ToList());
|
}
|
else
|
{
|
LogHelper.Info($"任务{mst.S_CODE} 托盘为空 ,只解锁货位");
|
LocationHelper.UnlockLoc(mst.S_END_LOC);
|
}
|
}
|
|
}
|
|
/// <summary>
|
/// 任务取消,缓存位状态更新
|
/// </summary>
|
/// <param name="mst"></param>
|
internal static void CacheBitCancelUpdate(WCSTask mst)
|
{
|
//任务取消,取货完成前的,起点的loadingCount和终点unLoadingCount都清除,取货完成的只处理终点
|
if (WCSHelper.CheckActionRecordExist(mst.S_CODE, 4))
|
{
|
//根据客户现场要求,如果取货完成任务失败人工拉到终点,我们就当卸货完成处理;如果是人工拉走到其它区域,我们就解锁终点,删除托盘。
|
//终点绑定
|
CacheBitUpdate(mst, false);
|
LocationHelper.UnLockLoc(mst.S_END_LOC);
|
}
|
else
|
{
|
//起点终点解锁
|
LocationHelper.UnLockLoc(mst.S_START_LOC);
|
LocationHelper.UnLockLoc(mst.S_END_LOC);
|
}
|
}
|
|
/// <summary>
|
/// 安全请求
|
/// </summary>
|
/// <param name="model">请求参数</param>
|
/// <param name="url">地址</param>
|
/// <param name="TN_Task">任务</param>
|
internal static void OperateReq(AgvTaskState model, string url, WCSTask TN_Task)
|
{
|
try
|
{
|
LogHelper.Info($"-------开始安全请求------");
|
|
if (TN_Task != null)
|
{
|
int type = 0;
|
string loc = "";
|
if (model.state == 1101)
|
{
|
|
//请求取货,
|
type = 1;
|
loc = TN_Task.S_START_LOC;
|
if (TN_Task.S_TYPE.Contains("电梯2"))
|
{
|
var device = Settings.deviceInfos.Where(a => a.TN_Location == TN_Task.S_START_LOC).FirstOrDefault();
|
var EndLoc = LocationHelper.GetLocByLoc(TN_Task.S_END_LOC);
|
if (device == null)
|
{
|
LogHelper.Info($"根据任务起点:{TN_Task.S_START_LOC},未找到对应电梯配置文件");
|
}
|
if (EndLoc == null)
|
{
|
LogHelper.Info($"根据任务终点:{TN_Task.S_END_LOC},未找到对应货位");
|
}
|
var value = ModbusHelper.ReadHoldingRegisters(40005, 1, device.address, 1024);
|
var value2 = ModbusHelper.ReadHoldingRegisters(40101, 1, device.address, 1024);
|
if (value[0] == EndLoc.N_LAYER && value2[0] == 2)
|
{
|
NDCApi.ChangeOrderParam(TN_Task.S_CODE.Trim(), 6, "1");
|
}
|
else
|
{
|
int layerValue = 0;
|
if (EndLoc.N_LAYER == 1) layerValue = 1;
|
else if (EndLoc.N_LAYER == 2) layerValue = 3;
|
else if (EndLoc.N_LAYER == 3) layerValue = 5;
|
ModbusHelper.WriteSingleRegister(40089, layerValue, device.address, 1024);
|
ModbusHelper.WriteSingleRegister(40101, 2, device.address, 1024);
|
ModbusHelper.WriteSingleRegister(40003, 2, device.address, 1024);
|
ModbusHelper.WriteSingleRegister(40102, 1, device.address, 1024);
|
}
|
|
}
|
else if (TN_Task.Z_TYPE == 4)//原材料库国自安全交互
|
{
|
if (GZOperateReqByPost(url, TN_Task.S_EQ_NO, loc, type))
|
{
|
// NDCHelper.ChangeParam(TN_Task.S_CODE.Trim(), 1101, 18);
|
// NDCApi.ChangeOrderParam(TN_Task.S_CODE.Trim(), 6, "1");
|
}
|
}
|
else
|
{
|
//井松叠盘机安全交互
|
if (TN_Task.S_NOTE == "空托回库")
|
{
|
var Device = Settings.deviceInfos.Where(a => a.TN_Location == TN_Task.S_START_LOC).FirstOrDefault();
|
if (Device != null)
|
{
|
if (S7Helper.WriteDpj(Device.address, 1002, 1))
|
{
|
int value = S7Helper.ReadDpj(Device.address, 2004, S7.Net.VarType.Byte);
|
if (value == 1)
|
{
|
NDCApi.ChangeOrderParam(TN_Task.S_CODE.Trim(), 6, "1");
|
}
|
else
|
{
|
LogHelper.Info("叠盘机安全交互失败,读取VB2004的值为{2004}");
|
}
|
}
|
else
|
{
|
LogHelper.Info("叠盘机安全交互失败,写入VB1002值1失败");
|
}
|
}
|
else
|
{
|
LogHelper.Info($"叠盘机安全交互失败,根据任务起点{TN_Task.S_START_LOC},未找到叠盘机配置文件");
|
}
|
|
}
|
else
|
{
|
if (OperateReqByPost(url, TN_Task.S_EQ_NO, TN_Task.S_CODE, loc, type, model.state))
|
{
|
// NDCHelper.ChangeParam(TN_Task.S_CODE.Trim(), 1101, 18);
|
NDCApi.ChangeOrderParam(TN_Task.S_CODE.Trim(), 6, "1");
|
}
|
}
|
|
}
|
|
|
}
|
if (model.state == 1102)
|
{
|
type = 3;
|
if (TN_Task.Z_TYPE == 4)//原材料库国自安全交互
|
{
|
loc = TN_Task.S_START_LOC;
|
if (GZOperateReqByPost(url, TN_Task.S_EQ_NO, loc, type))
|
{
|
//NDCHelper.ChangeParam(TN_Task.S_CODE.Trim(), 1101, 18);
|
}
|
}
|
if (TN_Task.S_NOTE == "空托回库")
|
{
|
var Device = Settings.deviceInfos.Where(a => a.TN_Location == TN_Task.S_START_LOC).FirstOrDefault();
|
if (Device != null)
|
{
|
//写入失败重新写入
|
if (!S7Helper.WriteDpj(Device.address, 1001, 1))
|
{
|
Task.Run(() =>
|
{
|
while (!S7Helper.WriteDpj(Device.address, 1001, 1))
|
{
|
Thread.Sleep(1000);
|
}
|
});
|
}
|
if (!S7Helper.WriteDpj(Device.address, 1002, 0))
|
{
|
Task.Run(() =>
|
{
|
while (!S7Helper.WriteDpj(Device.address, 1002, 0))
|
{
|
Thread.Sleep(1000);
|
}
|
});
|
}
|
}
|
else
|
{
|
LogHelper.Info($"叠盘机安全交互失败,根据任务起点{TN_Task.S_START_LOC},未找到叠盘机配置文件");
|
}
|
}
|
}
|
if (model.state == 1103)
|
{
|
//请求卸货
|
type = 2;
|
loc = TN_Task.S_END_LOC;
|
if (TN_Task.S_TYPE.Contains("电梯1"))
|
{
|
var device = Settings.deviceInfos.Where(a => a.TN_Location == TN_Task.S_END_LOC).FirstOrDefault();
|
var startloc = LocationHelper.GetLocByLoc(TN_Task.S_START_LOC);
|
if (device == null)
|
{
|
LogHelper.Info($"根据任务终点:{TN_Task.S_END_LOC},未找到对应电梯配置文件");
|
}
|
if (startloc == null)
|
{
|
LogHelper.Info($"根据任务起点:{TN_Task.S_START_LOC},未找到对应货位");
|
}
|
var value = ModbusHelper.ReadHoldingRegisters(40005, 1, device.address, 1024);
|
var value2 = ModbusHelper.ReadHoldingRegisters(40101, 1, device.address, 1024);
|
if (value[0] == startloc.N_LAYER && value2[0] == 2)
|
{
|
NDCApi.ChangeOrderParam(TN_Task.S_CODE.Trim(), 6, "1");
|
}
|
else
|
{
|
int layerValue = 0;
|
if (startloc.N_LAYER == 1) layerValue = 1;
|
else if (startloc.N_LAYER == 2) layerValue = 3;
|
else if (startloc.N_LAYER == 3) layerValue = 5;
|
ModbusHelper.WriteSingleRegister(40101, 2, device.address, 1024);
|
ModbusHelper.WriteSingleRegister(40003, 2, device.address, 1024);
|
ModbusHelper.WriteSingleRegister(40089, layerValue, device.address, 1024);
|
ModbusHelper.WriteSingleRegister(40102, 1, device.address, 1024);
|
}
|
|
}
|
else if (TN_Task.Z_TYPE == 4)//原材料库国自安全交互
|
{
|
|
// loc = TN_Task.S_END_LOC;
|
if (GZOperateReqByPost(url, TN_Task.S_EQ_NO, loc, type))
|
{
|
// NDCHelper.ChangeParam(TN_Task.S_CODE.Trim(), 1103, 18);
|
// NDCApi.ChangeOrderParam(TN_Task.S_CODE.Trim(), 6, "1");
|
}
|
}
|
else
|
{
|
if (OperateReqByPost(url, TN_Task.S_EQ_NO, TN_Task.S_CODE, loc, type, model.state))
|
{
|
NDCApi.ChangeOrderParam(TN_Task.S_CODE.Trim(), 6, "1");
|
}
|
}
|
}
|
if (model.state == 1104)
|
{
|
type = 4;
|
if (TN_Task.S_TYPE.Contains("电梯1"))
|
{
|
var db = new SqlHelper<object>().GetInstance();
|
var device = Settings.deviceInfos.Where(a => a.TN_Location == TN_Task.S_END_LOC).FirstOrDefault();
|
var mstbyEqno = db.Queryable<WCSTask>().Where(a => a.S_EQ_NO == TN_Task.S_EQ_NO && a.S_TYPE.Contains("电梯2")).First();
|
if (mstbyEqno != null)
|
{
|
var Endloc = LocationHelper.GetLocByLoc(mstbyEqno.S_END_LOC);
|
// var startloc = LocationHelper.GetLocByLoc(TN_Task.S_START_LOC);
|
if (device == null)
|
{
|
LogHelper.Info($"根据任务终点:{TN_Task.S_END_LOC},未找到对应电梯配置文件");
|
}
|
if (Endloc == null)
|
{
|
LogHelper.Info($"根据任务终点:{mstbyEqno.S_END_LOC},未找到对应货位");
|
}
|
int value = 0;
|
if (Endloc.N_LAYER == 1) value = 1;
|
else if (Endloc.N_LAYER == 2) value = 3;
|
else if (Endloc.N_LAYER == 3) value = 5;
|
ModbusHelper.WriteSingleRegister(40089, value, device.address, 1024);
|
ModbusHelper.WriteSingleRegister(40102, 1, device.address, 1024);
|
|
}
|
else
|
{
|
LogHelper.Info($"根据任务来源:{TN_Task.S_EQ_NO},未找到电梯2任务");
|
}
|
|
}
|
else if (TN_Task.Z_TYPE == 4)//原材料库国自安全交互
|
{
|
loc = TN_Task.S_END_LOC;
|
if (GZOperateReqByPost(url, TN_Task.S_EQ_NO, loc, type))
|
{
|
// NDCHelper.ChangeParam(TN_Task.S_CODE.Trim(), 1101, 18);
|
}
|
}
|
}
|
}
|
|
}
|
catch (Exception ex)
|
{
|
|
LogHelper.Info($"OperateReq Error ==》{ex.ToString()}");
|
}
|
|
|
}
|
|
/// <summary>
|
/// 安全请求
|
/// </summary>
|
/// <param name="url"></param>
|
/// <param name="tasknum"></param>
|
/// <param name="ordernum"></param>
|
/// <param name="station"></param>
|
/// <param name="type"></param>
|
/// <param name="taskStatus"></param>
|
/// <returns></returns>
|
internal static bool OperateReqByPost(string url, string tasknum, string ordernum, string station, int type, int taskStatus)
|
{
|
bool permit = false;
|
try
|
{
|
//RequestList<TaskAccess> requestList = new RequestList<TaskAccess>();
|
TaskAccess taskAccess = new TaskAccess() { taskNum = tasknum, orderNum = ordernum, station = station, type = type, taskStatus = taskStatus };
|
// requestList.data.Add(taskAccess);
|
HttpHelper httpHelper = new HttpHelper();
|
Result result = new Result();
|
string date = JsonConvert.SerializeObject(taskAccess);
|
// string url = Settings.tableUrls.Find(a => a.id == 2).url;
|
LogHelper.Info($"安全请求:地址:{url},内容:{date}");
|
var r = httpHelper.WebPost(url, date);
|
result = JsonConvert.DeserializeObject<Result>(r);
|
if (result.code == "0")
|
{
|
permit = true;
|
LogHelper.Info($"安全请求成功");
|
}
|
else
|
{
|
LogHelper.Info($"安全请求失败=>msg:{result.msg}");
|
ApiHelper.AddErrorInfo("安全交互失败", result.msg, "", tasknum);
|
}
|
return permit;
|
}
|
catch (Exception)
|
{
|
|
return permit;
|
}
|
|
|
}
|
/// <summary>
|
/// 安全请求国资
|
/// </summary>
|
/// <param name="url"></param>
|
/// <param name="tasknum"></param>
|
/// <param name="ordernum"></param>
|
/// <param name="station"></param>
|
/// <param name="type"></param>
|
/// <param name="taskStatus"></param>
|
/// <returns></returns>
|
internal static bool GZOperateReqByPost(string url, string no, string station, int type)
|
{
|
bool permit = false;
|
try
|
{
|
LogHelper.Info($"国资安全请求");
|
//RequestList<TaskAccess> requestList = new RequestList<TaskAccess>();
|
//返回数据
|
Resultmobox<GzTaskAccess> resultmobox = new Resultmobox<GzTaskAccess>() { Name = "LocState", Source = "HostToAgv" };
|
|
GzTaskAccess taskAccess = new GzTaskAccess() { task_no = no, loc_code = station, type = type.ToString() };
|
resultmobox.data = taskAccess;
|
// requestList.data.Add(taskAccess);
|
HttpHelper httpHelper = new HttpHelper();
|
GzResult result = new GzResult();
|
string date = JsonConvert.SerializeObject(resultmobox);
|
// string url = Settings.tableUrls.Find(a => a.id == 2).url;
|
LogHelper.Info($"安全请求:地址:{url},内容:{date}");
|
var r = httpHelper.WebPostycl(url, date);
|
result = JsonConvert.DeserializeObject<GzResult>(r);
|
if (result.err_code == "0")
|
{
|
permit = true;
|
LogHelper.Info($"安全请求成功");
|
}
|
else
|
{
|
LogHelper.Info($"安全请求失败=>msg:{result.err_msg}");
|
ApiHelper.AddErrorInfo("安全交互失败", result.err_msg, "", no);
|
}
|
return permit;
|
}
|
catch (Exception)
|
{
|
|
return permit;
|
}
|
|
|
}
|
|
/// <summary>
|
/// 任务拦截
|
/// </summary>
|
/// <param name="task"></param>
|
/// <returns></returns>
|
internal static bool Intercept(WCSTask mst)
|
{
|
var result = true;
|
var db = new SqlHelper<object>().GetInstance();
|
//根据起点仓库编码判断是否可以推送
|
var taskLimit = db.Queryable<TASK_LIMIT>().Where(a => a.S_WH_CODE == mst.S_START_WH && a.OPEN == "1").First();
|
if (taskLimit != null)
|
{
|
Console.WriteLine($"任务:{mst.S_CODE},起点仓库:{mst.S_START_WH}已经禁用推送");
|
return false;
|
}
|
|
var mstbyEqno = db.Queryable<WCSTask>().Where(a => a.S_EQ_NO == mst.S_EQ_NO).ToList();
|
if (mstbyEqno.Count() == 1)
|
{
|
//预备库任务拦截
|
if (mst.Z_TYPE == 3)
|
{
|
var Ybkmst = db.Queryable<WCSTask>().Where(a => a.Z_TYPE == 3 && a.S_TYPE == "1" && a.S_B_STATE != "完成").First();
|
if (Ybkmst != null)
|
{
|
result = false;
|
}
|
}
|
|
return result;
|
}
|
else
|
{
|
//电梯分档任务拦截
|
if (mst.S_TYPE == "电梯1")
|
{
|
return result;
|
}
|
else if (mst.S_TYPE == "电梯2")
|
{
|
var mst2 = mstbyEqno.Where(a => a.S_TYPE == "电梯1").First();
|
if (mst2 == null)
|
{
|
return result;
|
}
|
else
|
{
|
if (mst2.S_B_STATE == "卸货完成" || mst2.S_B_STATE == "完成")
|
{
|
return result;
|
}
|
result = false;
|
}
|
}
|
|
}
|
return result;
|
}
|
|
/// <summary>
|
/// 任务状态更新处理
|
/// </summary>
|
/// <param name="mst"></param>
|
/// <param name="state"></param>
|
internal static void OperateStatus(WCSTask mst, int state)
|
{
|
if (state == 4)
|
{
|
CacheBitUpdate(mst, true);
|
}
|
if (state == 6)//卸货完成
|
{
|
CacheBitUpdate(mst, false);
|
}
|
if (state == 7)
|
{
|
CacheBitCancelUpdate(mst);
|
}
|
}
|
/// <summary>
|
/// 取消任务判断是不是分段任务,如果是第一段任务取消,取消后续任务
|
/// </summary>
|
/// <param name="mst"></param>
|
/// <returns></returns>
|
internal static void CancelTaskSection(WCSTask mst)
|
{
|
//取消任务判断是否存在分段任务,如果有分段任务第一段取消后续任务
|
var db = new SqlHelper<object>().GetInstance();
|
var mstbyEqno = db.Queryable<WCSTask>().Where(a => a.S_EQ_NO == mst.S_EQ_NO).ToList();
|
if (mstbyEqno.Count() >= 2)
|
{
|
if (mst.S_TYPE == "电梯1")
|
{
|
var mst2 = mstbyEqno.Where(a => a.S_TYPE == "电梯2").First();
|
if (mst2 != null)
|
{
|
OperateStatus(mst2, 7);
|
WCSHelper.Fail(mst2);
|
}
|
}
|
}
|
|
}
|
private static object locLocker = new object();
|
|
|
/// <summary>
|
/// 推送任务
|
/// </summary>
|
/// <param name="mst"></param>
|
internal static bool SendTask(WCSTask mst)
|
{
|
|
var db = new SqlHelper<object>().GetInstance();
|
var result = false;
|
var start = "0"; var end = "0";
|
var taskType = mst.S_TYPE.Trim();
|
var list = db.Queryable<Location>().ToList().Count;
|
|
// if (mst.N_B_STATE == 0) {
|
if (mst.N_SCHEDULE_TYPE == 1)
|
{
|
LogHelper.Info($"任务推送数据:{JsonConvert.SerializeObject(mst)}");
|
if (string.IsNullOrEmpty(mst.S_START_LOC) || string.IsNullOrEmpty(mst.S_END_LOC))
|
{
|
LogHelper.Info($"任务{mst.S_CODE},起点终点有空参数,不推送任务");
|
}
|
|
|
start = LocationHelper.GetAgvSite(mst.S_START_LOC);
|
end = LocationHelper.GetAgvSite(mst.S_END_LOC);
|
//if (mst.N_START_LAYER > 1)
|
//{
|
// start = LocationHelper.GetAgvSite(mst.S_START_LOC, mst.N_START_LAYER.ToString()).ToString();
|
//}
|
if (mst.N_END_LAYER > 1)
|
{
|
end = LocationHelper.GetAgvSite(mst.S_END_LOC, mst.N_END_LAYER.ToString()).ToString();
|
LogHelper.Info($"任务推送:终点层数为{mst.N_END_LAYER},推送站点为:{end}");
|
}
|
Console.WriteLine($"SendTask {mst.S_CODE}");
|
Console.WriteLine("start=" + start);
|
Console.WriteLine("end= " + end);
|
var dic = new List<param>();
|
dic.Add(new param() { name = "From", value = start.ToString() });
|
dic.Add(new param() { name = "To", value = end.ToString() });
|
dic.Add(new param() { name = "FUNC", value = "0" });
|
dic.Add(new param() { name = "DATA", value = "0" });
|
dic.Add(new param() { name = "Ctype", value = "0" });
|
|
|
var res = NDCApi.AddOrderNew(1, 1, mst.S_CODE, dic);//添加新命令
|
//dic.Add("Pri", mst.N_PRIORITY.ToString());
|
//dic.Add("From", start.ToString());
|
//dic.Add("To", end.ToString());
|
//dic.Add("task_no", mst.S_CODE.Trim());// dic.Add("Ext1", "1"); dic.Add("Ext2", "CALLADDAGV"); dic.Add("N_CNTR_COUNT", "");
|
//var res = NDC.AddNewOrder(1, dic);
|
|
|
|
if (res != null && (res.err_code == 0 || res.err_code == 50009))
|
{
|
//推送成功,修改任务优先级
|
mst.N_B_STATE = 1;
|
mst.S_B_STATE = WCSTask.GetStateStr(1);
|
WCSHelper.UpdateStatus(mst);//更新任务状态
|
result = true;
|
LogHelper.Info($"NDC推送任务成功 {mst.S_CODE}start= {mst.S_START_LOC} + end = {mst.S_END_LOC}");
|
if (mst.S_TYPE.Contains("电梯1"))
|
{
|
var device = Settings.deviceInfos.Where(a => a.TN_Location == mst.S_END_LOC).FirstOrDefault();
|
var loc = LocationHelper.GetLocByLoc(mst.S_START_LOC);
|
if (device == null)
|
{
|
LogHelper.Info($"根据任务终点:{mst.S_END_LOC},未找到对应电梯配置文件");
|
}
|
if (loc == null)
|
{
|
LogHelper.Info($"根据任务起点:{mst.S_START_LOC},未找到对应货位");
|
}
|
int value = 0;
|
if (loc.N_LAYER == 1) value = 1;
|
else if (loc.N_LAYER == 2) value = 3;
|
else if (loc.N_LAYER == 3) value = 5;
|
|
ModbusHelper.WriteSingleRegister(40089, value, device.address, 1024);
|
ModbusHelper.WriteSingleRegister(40102, 1, device.address, 1024);
|
|
|
}
|
}
|
else
|
{
|
LogHelper.Info($"NDC推送任务失败 {mst.S_CODE};Res:" + JsonConvert.SerializeObject(res));
|
}
|
}
|
//else if (mst.N_SCHEDULE_TYPE == 5) {
|
// //调第三方接口
|
// var model = new HanAo.TaskInfoModel
|
// {
|
// requestPk = mst.S_CODE,
|
// frmPos = mst.S_START_LOC,
|
// toPos = mst.S_END_LOC,
|
// trkType = mst.S_OP_NAME == "入库" ? "1" : "2",
|
// contNo = mst.S_CNTR_CODE
|
// };
|
// if (HanAo.CreateOrder(model)) {
|
// mst.N_B_STATE = 1;
|
// WCSHelper.UpdateStatus(mst);
|
// }
|
//}
|
//else if (mst.N_SCHEDULE_TYPE == 3) {
|
// var code = GZRobot.CreateOrder(mst.S_CODE, mst.N_PRIORITY, JsonConvert.SerializeObject(new { src = mst.S_START_LOC, dst = mst.S_END_LOC }), "p2p");
|
// if (code > 0) {
|
// //更新任务状态
|
// mst.N_B_STATE = 1;
|
// mst.S_EQ_TASK_CODE = code.ToString();
|
// WCSHelper.UpdateStatus(mst);
|
// WCSHelper.UpdateEQNo(mst);
|
|
// }
|
//}
|
|
// }
|
return result;
|
}
|
|
/// <summary>
|
/// 任务状态回报
|
/// </summary>
|
/// <param name="taskNum">任务号</param>
|
/// <param name="orderNum">单号</param>
|
/// <param name="taskStatus">任务状态</param>
|
/// <param name="url">上报接口</param>
|
public static void Reportback(string taskNum, string orderNum, int taskStatus, string url)
|
{
|
LogHelper.Info($"------------开始任务回报-----------");
|
try
|
{
|
//返回数据
|
// Result<Reportback> resultreportback = new Result<Reportback>();
|
Reportback reportback = new Reportback() { taskNum = taskNum, orderNum = orderNum, taskStatus = taskStatus };
|
// resultreportback.data.Add(reportback);
|
//调用接口
|
HttpHelper httpHelper = new HttpHelper();
|
Result result = new Result();
|
string date = JsonConvert.SerializeObject(reportback);
|
|
LogHelper.Info($"任务回报:地址:{url},内容:{date}");
|
|
string r = "";
|
|
r = httpHelper.WebPost(url, date);
|
|
|
result = JsonConvert.DeserializeObject<Result>(r);
|
if (result.code == "0")
|
{
|
LogHelper.Info($"任务回报成功");
|
}
|
else
|
{
|
LogHelper.Info($"任务回报失败=>msg:{result.msg}");
|
}
|
}
|
catch (Exception ex)
|
{
|
|
LogHelper.Info($"任务回报错误:error:{ex.ToString()}");
|
}
|
|
}
|
|
|
/// <summary>
|
/// 任务状态回报
|
/// </summary>
|
/// <param name="taskNum">任务号</param>
|
/// <param name="orderNum">单号</param>
|
/// <param name="taskStatus">任务状态</param>
|
/// <param name="url">上报接口</param>
|
public static void WmsReportback(string taskNum, string orderNum, int taskStatus, string url)
|
{
|
LogHelper.Info($"------------开始wms任务回报-----------");
|
try
|
{
|
int state = 2;
|
//返回数据
|
if (taskStatus == 7)
|
{
|
state = 1;
|
}
|
|
GTWMSData data = new GTWMSData() { task_no = orderNum, status = state };
|
GTWMS reportback = new GTWMS() { data = data };
|
// resultreportback.data.Add(reportback);
|
//调用接口
|
HttpHelper httpHelper = new HttpHelper();
|
WmsResult result = new WmsResult();
|
string date = JsonConvert.SerializeObject(reportback);
|
|
LogHelper.Info($"任务回报:地址:{url},内容:{date}");
|
|
string r = "";
|
|
r = httpHelper.WebPost(url, date);
|
|
|
result = JsonConvert.DeserializeObject<WmsResult>(r);
|
if (result.success)
|
{
|
LogHelper.Info($"任务回报成功");
|
}
|
else
|
{
|
LogHelper.Info($"任务回报失败=");
|
}
|
}
|
catch (Exception ex)
|
{
|
|
LogHelper.Info($"任务回报错误:error:{ex.ToString()}");
|
}
|
|
}
|
/// <summary>
|
/// 原材料任务状态回报
|
/// </summary>
|
/// <param name="taskNum">任务号</param>
|
/// <param name="orderNum">单号</param>
|
/// <param name="taskStatus">任务状态</param>
|
/// <param name="url">上报接口</param>
|
public static void Reportbackmobox(string taskNum, string orderNum, int taskStatus, string url)
|
{
|
LogHelper.Info($"------------开始任务回报(原材料任务回报)-----------");
|
try
|
{
|
//返回数据
|
Resultmobox<Reportback> resultmobox = new Resultmobox<Reportback>() { Name = "AGVTaskStatus", Source = "HostToAgv" };
|
Reportback reportback = new Reportback() { taskNum = taskNum, orderNum = orderNum, taskStatus = taskStatus };
|
resultmobox.data = reportback;
|
//调用接口
|
HttpHelper httpHelper = new HttpHelper();
|
Resultmobox result = new Resultmobox();
|
string date = JsonConvert.SerializeObject(resultmobox);
|
|
LogHelper.Info($"任务回报:地址:{url},内容:{date}");
|
|
string r = "";
|
|
r = httpHelper.WebPostycl(url, date);
|
|
|
result = JsonConvert.DeserializeObject<Resultmobox>(r);
|
if (result != null && result.err_code == "0")
|
{
|
LogHelper.Info($"任务回报成功");
|
}
|
else
|
{
|
LogHelper.Info($"任务回报失败=>msg:{result.err_msg}");
|
}
|
}
|
catch (Exception ex)
|
{
|
|
LogHelper.Info($"任务回报错误:error:{ex.ToString()}");
|
}
|
|
}
|
/// <summary>
|
/// MES任务状态回报
|
/// </summary>
|
/// <param name="taskNum"></param>
|
/// <param name="orderNum"></param>
|
/// <param name="taskStatus"></param>
|
public static void MESReportback(WCSTask mst, int status, string url)
|
{
|
LogHelper.Info($"------------开始MES任务回报-----------");
|
try
|
{
|
//回报数据获取
|
Request<StatusArrive> statusarrive = new Request<StatusArrive>();
|
//获取时间戳
|
var time = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
|
statusarrive.RequestId = "杭叉AGV" + time;
|
string info = "";
|
switch (status)
|
{
|
case 1:
|
info = "agv已接受原料库下发的任务";
|
break;
|
case 4:
|
info = "agv已取货完成";
|
break;
|
case 6:
|
info = "agv已卸货到指定位置";
|
break;
|
case 2:
|
info = "agv已完成送料任务";
|
break;
|
}
|
string message = "1";
|
if (status == 7) { message = "agv任务已取消"; }
|
int flag = 0;
|
if (mst.S_NOTE == "粉料")
|
{
|
flag = 1;
|
}
|
//List<StatusArrive> statusArrives = new List<StatusArrive>();
|
StatusArrive statusArrive = new StatusArrive();
|
statusarrive.UseToken = "iFQ5fExGrLYLXliHYWzs";
|
statusArrive.TaskNumber = mst.S_EQ_NO;
|
statusArrive.LocationNum = mst.S_END_LOC;
|
statusArrive.Time = DateTime.Now.ToString();
|
statusArrive.Status = status.ToString();
|
statusArrive.Rfid = mst.S_CNTR_CODE;
|
statusArrive.Flag = flag;
|
statusArrive.Info = info;
|
statusArrive.Message = message;
|
|
//statusArrives.Add(statusArrive);
|
statusarrive.data = statusArrive;
|
//开始回报
|
HttpHelper httpHelper = new HttpHelper();
|
MesResult result = new MesResult();
|
string date = JsonConvert.SerializeObject(statusarrive);
|
|
LogHelper.Info($"任务回报:地址:{url},内容:{date}");
|
var r = httpHelper.MesWebPost(url, date);
|
LogHelper.Info($"任务回报:返回内容:{r}");
|
result = JsonConvert.DeserializeObject<MesResult>(r);
|
if (result != null && result.icode == "200")
|
{
|
LogHelper.Info($"任务回报成功");
|
}
|
else
|
{
|
LogHelper.Info($"任务回报失败=>msg:{result.imsg}");
|
}
|
}
|
catch (Exception ex)
|
{
|
|
LogHelper.Info($"任务回报错误:error:{ex.Message},行号:{ex.StackTrace}");
|
}
|
|
}
|
|
/// <summary>
|
/// mes物料到位同步
|
/// </summary>
|
/// <param name="mst">任务</param>
|
/// <param name="url">地址</param>
|
public static void MESIteminfoback(WCSTask mst, string url)
|
{
|
LogHelper.Info($"------------开始物料信息回报-----------");
|
try
|
{
|
var cntritem = ContainerHelper.GetCntrItemRel(mst.S_CNTR_CODE).FirstOrDefault();
|
//回报数据
|
Request<MesItemBackModel> request = new Request<MesItemBackModel>();
|
List<MesItemBackInfoModel> list = new List<MesItemBackInfoModel>();
|
string MesNo = mst.S_EQ_NO;
|
if (!string.IsNullOrEmpty(mst.S_MES_NO))
|
{
|
MesNo = mst.S_MES_NO;
|
}
|
//粉料回库不需要回报
|
if (cntritem != null && mst.S_TYPE == "余料返回" && cntritem.S_ITEM_CODE.StartsWith("4X"))
|
{
|
return;
|
}
|
//获取时间戳
|
var time = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
|
//物料到位接口和状态反馈同时调IIOT,为了区分id,物料到位长度加一区分
|
request.RequestId = "杭叉AGV" + time + "1";
|
request.UseToken = "iFQ5fExGrLYLXliHYWzs";
|
|
MesItemBackModel mesItemBackModel = new MesItemBackModel();
|
|
mesItemBackModel.TaskNumber = MesNo;
|
mesItemBackModel.WmsTaskNumber = mst.S_WMS_NO;
|
mesItemBackModel.Rfid = mst.S_CNTR_CODE;
|
mesItemBackModel.LocationNum = mst.S_END_LOC;
|
mesItemBackModel.Result = "1";
|
mesItemBackModel.ArricalTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff");
|
|
if (cntritem != null)
|
{
|
string curBagNum = null;
|
string weightBag = null;
|
if (cntritem.F_QTY > 0)
|
{
|
curBagNum = cntritem.F_QTY.ToString();
|
}
|
if (!string.IsNullOrEmpty(cntritem.F_WEIGHT1) && int.Parse(cntritem.F_WEIGHT1) > 0)
|
{
|
weightBag = cntritem.F_WEIGHT1;
|
}
|
list.Add(new MesItemBackInfoModel()
|
{
|
|
LotNumber = cntritem.S_BATCH_NO,
|
PartNumber = cntritem.S_ITEM_CODE,
|
Subpool = cntritem.Subpool,
|
ReceiveLot = cntritem.ReceiveLot,
|
Supplier = cntritem.S_SUPPLIER_NO,
|
TyreType = cntritem.TyreType,
|
ProduceTime = cntritem.D_PRD_DATE,
|
Rfid = cntritem.S_CNTR_CODE,
|
Qty = cntritem.F_WEIGHT,
|
PartLevel = cntritem.LEV,
|
WmsLot = cntritem.WmsLot,
|
WeightBag = weightBag,
|
CurBagNum = curBagNum,
|
InitBagNum = cntritem.F_QTY1
|
});
|
|
|
}
|
|
mesItemBackModel.List = list;
|
request.data = mesItemBackModel;
|
|
//任务上报
|
HttpHelper httpHelper = new HttpHelper();
|
MesResult result = new MesResult();
|
string date = JsonConvert.SerializeObject(request);
|
|
LogHelper.Info($"物料到位回报:地址:{url},内容:{date}");
|
var r = httpHelper.MesWebPost(url, date);
|
LogHelper.Info($"物料到位回报:返回内容:{r}");
|
result = JsonConvert.DeserializeObject<MesResult>(r);
|
if (result != null && result.icode == "200")
|
{
|
LogHelper.Info($"物料到位回报成功");
|
}
|
else
|
{
|
LogHelper.Info($"物料到位回报失败=>msg:{result.imsg}");
|
}
|
}
|
catch (Exception ex)
|
{
|
|
LogHelper.Info($"物料到位回报错误:error:{ex.ToString()}");
|
}
|
|
}
|
|
|
/// <summary>
|
/// 创建搬运任务
|
/// </summary>
|
/// <param name="start"></param>
|
/// <param name="end"></param>
|
/// <param name="taskType"></param>
|
/// <param name="cntrs"></param>
|
/// <param name="startLayer"></param>
|
/// <param name="endLayer"></param>
|
/// <param name="trayCarryCount"></param>
|
/// <param name="priority"></param>
|
/// <returns></returns>
|
public static bool CreateTransport(string start, string end, string taskType, List<string> cntrs, int startLayer, int endLayer, int trayCarryCount = 1, int priority = 1)
|
{
|
var result = false;
|
//批次号存托盘号,1~3个托盘
|
var trayCodes = string.Join(",", cntrs);
|
var taskNo = DateTime.Now.Ticks.ToString();
|
|
|
var res = WCSHelper.CreateTask(taskNo, start.Trim(), end.Trim(), taskType, priority, trayCodes, trayCarryCount, startLayer, endLayer);
|
if (res)
|
{
|
result = true;
|
//任务创建成功,起点货位出库锁定,终点货位入库锁定
|
LocationHelper.LockLoc(start, 1);
|
LocationHelper.LockLoc(end, 2);
|
}
|
return result;
|
}
|
|
|
public static bool CreateTransport(string start, string end, string taskType, List<string> cntrs, int priority = 1)
|
{
|
var result = false;
|
//批次号存托盘号,1~3个托盘
|
var trayCodes = string.Join(",", cntrs);
|
var taskNo = DateTime.Now.Ticks.ToString();
|
|
|
var res = WCSHelper.CreateTask(taskNo, start.Trim(), end.Trim(), taskType, priority, trayCodes, 1, 1, 1);
|
if (res)
|
{
|
result = true;
|
LocationHelper.LockLoc(start, 2);
|
LocationHelper.LockLoc(end, 1);
|
|
}
|
return result;
|
}
|
#endregion
|
}
|
}
|