using HH.WCS.Hexafluo;
|
using HH.WCS.Hexafluo.util;
|
using HH.WCS.Hexafluo.wms;
|
using Newtonsoft.Json;
|
using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using System.Text;
|
using System.Xml;
|
|
namespace HH.WCS.TempleteOver.DispatchService
|
{
|
public class NewNDC
|
{
|
private static HostToAGV callClient = null;
|
static NewNDC()
|
{
|
callClient = new HostToAGV();
|
//callClient.Url = "http://192.168.1.146:9988/HostToAGV.cgi";
|
callClient.Url = Settings.HostToAgvServerUrl;
|
}
|
|
private static string GetReqStr(int ts, Dictionary<string, string> param)
|
{
|
//< Order TS = '60' Pri = '" + mst.CN_N_PRIORITY.ToString() + "' From = '" + start.CN_N_AGV_LOCATION + "' To = '" + end.CN_N_AGV_LOCATION + "' No = '" + mst.S_TASK_NO + "_1' Ext1 = '1' Ext2 = '" + Constants.TN_MID_COMMANDEQ_CALLAGVOrderCommandType + "' N_CNTR_COUNT = '' FRow = '" + sFloor + "' TRow = '" + eFloor + "' />
|
var sb = new StringBuilder();
|
sb.Append($"<Req><Order ");
|
if (ts != 0)
|
{
|
sb.Append($"TS='{ts}'");
|
}
|
foreach (var kv in param)
|
{
|
sb.Append($" {kv.Key}='{kv.Value}'");
|
}
|
sb.Append("/></Req>");
|
return sb.ToString();
|
}
|
private static string GetReqStr2(int ts, Dictionary<string, string> param, Dictionary<string, string> param1)
|
{
|
//< Order TS = '60' Pri = '" + mst.CN_N_PRIORITY.ToString() + "' From = '" + start.CN_N_AGV_LOCATION + "' To = '" + end.CN_N_AGV_LOCATION + "' No = '" + mst.S_TASK_NO + "_1' Ext1 = '1' Ext2 = '" + Constants.TN_MID_COMMANDEQ_CALLAGVOrderCommandType + "' N_CNTR_COUNT = '' FRow = '" + sFloor + "' TRow = '" + eFloor + "' />
|
var sb = new StringBuilder();
|
sb.Append($"<Req><Order ");
|
if (ts != 0)
|
{
|
sb.Append($"TS='{ts}'");
|
}
|
foreach (var kv in param)
|
{
|
sb.Append($" {kv.Key}='{kv.Value}'");
|
}
|
sb.Append($" NoCallback='0' >");
|
foreach (var p1 in param1)
|
{
|
sb.Append($"<Param Name='{p1.Key}' Value='{p1.Value}' />");
|
}
|
sb.Append("</Order></Req>");
|
return sb.ToString();
|
}
|
public static AGVResult AddNewOrder(int ts, Dictionary<string, string> param)
|
{
|
//< Req >< Order TS = '1' Pri = '1' No = 'TN2302020001' Ext1 = '' Ext2 = '' N_CNTR_COUNT = '' >< Param Name = 'From' Value = '2' />< Param Name = 'To' Value = '1' /></ Order ></ Req >
|
|
var bufin = GetReqStr(ts, param);
|
|
try
|
{
|
|
var result = callClient.AddNewOrder(bufin);
|
LogHelper.Info("NDC", $"AddNewOrder req={bufin} res={result}");
|
//LogHelper.Info(result.bufout, "ts");
|
return GetResult(result);
|
}
|
catch (Exception e)
|
{
|
LogHelper.Info("NDC", $"AddNewOrder req={bufin} res={e.Message}");
|
return new AGVResult { Res = new Res { ErrCode = -1, ErrInfo = e.Message } };
|
}
|
}
|
|
public static AGVResult OrderAdd(int ts, Dictionary<string, string> param, Dictionary<string, string> param1)
|
{
|
//< Req >< Order TS = '1' Pri = '1' No = 'TN2302020001' Ext1 = '' Ext2 = '' N_CNTR_COUNT = '' >< Param Name = 'From' Value = '2' />< Param Name = 'To' Value = '1' /></ Order ></ Req >
|
|
var bufin = GetReqStr2(ts, param, param1);
|
|
try
|
{
|
var result = callClient.OrderAdd(bufin);
|
LogHelper.Info("NDC", $"OrderAdd req={bufin} res={result}");
|
//LogHelper.Info(result.bufout, "ts");
|
return GetResult(result);
|
}
|
catch (Exception e)
|
{
|
LogHelper.Info("NDC", $"OrderAdd req={bufin} res={e.Message}");
|
return new AGVResult { Res = new Res { ErrCode = -1, ErrInfo = e.Message } };
|
}
|
}
|
|
public static AGVResult CancelOrder(int ts, Dictionary<string, string> param)
|
{
|
//< Req >< Order No = 'TN2302020001' >< Param Name = 'IsForce' Value = '1' /></ Order ></ Req >
|
var bufin = GetReqStr(ts, param);
|
try
|
{
|
var result = callClient.CancelOrder(bufin);
|
LogHelper.Info("NDC", $"CancelOrder req={bufin} res={result}");
|
return GetResult(result);
|
}
|
catch (Exception e)
|
{
|
LogHelper.Info("NDC", $"CancelOrder req={bufin} res={e.Message}");
|
return new AGVResult
|
{
|
Res = new Res
|
{
|
ErrCode = -1,
|
ErrInfo = e.Message
|
}
|
};
|
}
|
}
|
public static AGVResult StartNewOrderWithQCmd(int ts, Dictionary<string, string> param)
|
{
|
//lpn: <Order TS='41' Pri='' ExtDeviceNo='{0}' CtrlVal='{1}' DispInfo='{2}' No='{3}' Ext1='' Ext2='' N_CNTR_COUNT='' />
|
//traccif: <Order TS='164' From='2' To='2' ExtDeviceNo='" + lockNo + "' No='" + DateTime.Now.Ticks.ToString() + "' />
|
//lock: <Order TS='170' CtrlVal='" + CtrlVal + "' ExtDeviceNo='" + roadway + "' No='" + DateTime.Now.Ticks.ToString() + "' />
|
var bufin = GetReqStr(ts, param);
|
try
|
{
|
var r = callClient.StartNewOrderWithQCmd(bufin);
|
LogHelper.Info("NDC", $"StartNewOrderWithQCmd req={bufin} res={r}");
|
return GetResult(r);
|
}
|
catch (Exception e)
|
{
|
LogHelper.Info("NDC", $"StartNewOrderWithQCmd req={bufin} res={e.Message}");
|
return new AGVResult
|
{
|
Res = new Res
|
{
|
ErrCode = -1,
|
ErrInfo = e.Message
|
}
|
};
|
}
|
}
|
public static AGVResult ChangeOrder(Dictionary<string, string> param)
|
{
|
//< Req >< Order No = 'TN2302020002' ParamNo = '1' Param1 = '1' /></ Req >
|
var bufin = GetReqStr(0, param);
|
try
|
{
|
var r = callClient.ChangeOrder(bufin);
|
LogHelper.Info("NDC", $"ChangeOrder req={bufin} res={r}");
|
return GetResult(r);
|
}
|
catch (Exception e)
|
{
|
LogHelper.Info("NDC", $"ChangeOrder req={bufin} res={e.Message}");
|
return new AGVResult
|
{
|
Res = new Res
|
{
|
ErrCode = -1,
|
ErrInfo = e.Message
|
}
|
};
|
}
|
}
|
private static AGVResult GetResult(string bufout)
|
{
|
//<Res><ErrCode>0</ErrCode><Result>11</Result></Res>
|
XmlDocument xml = new XmlDocument();
|
xml.LoadXml(bufout);
|
var json = JsonConvert.SerializeXmlNode(xml);
|
return JsonConvert.DeserializeObject<AGVResult>(json);
|
}
|
public class AGVResult
|
{
|
public Res Res { get; set; }
|
}
|
public class Res
|
{
|
public int ErrCode { get; set; }
|
public string ErrInfo { get; set; }
|
}
|
|
|
|
/// <summary>
|
/// 推送任务-NDC参数标准版
|
/// </summary>
|
/// <param name="mst">任务数据</param>
|
/// <returns></returns>
|
internal static bool SendTaskStandard(WMSTask mst)
|
{
|
var result = false;
|
try
|
{
|
int TsNo = 1;//下发任务类型:默认(坯盖)-1,成品任务-5
|
var Extend1 = 0;//取货站点
|
var Extend2 = 0;//卸货站点
|
string Extend3 = "";//功能码 16进制转10进制
|
string Extend4 = "";//坯盖:托盘类型 即产即用1,非即产即用2 不区分为1 成品:取卸货层数(先单独转换为16进制,再拼接转换为10进制)
|
string Extend5 = "";//物料高度(品相) 根据工单物料到物料表获取下发TS的物料高度
|
string Extend6 = "";//托盘版型 备注:集化板 1,大板 2,小板 3,超托 4 根据工单版型转换为对应的值
|
string Extend7 = "";//起点列
|
string Extend8 = "";//终点列
|
int startLayer = mst.N_START_LAYER;// 起点取货层数
|
int endLayer = mst.N_END_LAYER;// 终点卸货层数
|
string workNo = mst.S_SRC_NO;// 工单号
|
string trayType = mst.S_NOTE;//托盘类型-根据各自现场情况获取
|
var taskType = mst.S_TYPE;// 任务类型
|
var taskState = mst.S_B_STATE;// 任务状态
|
if (taskState == "未执行" || taskState == "待推送")
|
{
|
// var db = new SqlHelper<object>().GetInstance();
|
// 获取起终点的AGV站点 查询 扩展货位表 S_PICKUP_POINT-点位层数 S_LOC_CODE-货位编码 GetAgvSite-标准获取扩展货位表数据的方法
|
// Extend1 = LocationHelper.GetAgvSite(mst.S_START_LOC, startLayer.ToString());
|
// Extend2 = LocationHelper.GetAgvSite(mst.S_END_LOC, endLayer.ToString());
|
Extend1 = LocationHelper.GetAgvSite(mst.S_START_LOC);
|
Extend2 = LocationHelper.GetAgvSite(mst.S_END_LOC);
|
var location = SqlSugarHelper.Db.Queryable<Location>().Where(e => e.S_LOC_CODE == mst.S_END_LOC)?.First();
|
//二期成品任务类型(将 成品车间 任务类型加入到此数组中,即可根据 任务类型 区分车间,并获取对应的TS参数)
|
string[] ConveryTaskList = new string[] { };
|
|
if (ConveryTaskList.Contains(taskType))
|
{
|
// 成品任务下发参数获取
|
TsNo = 5;
|
// 其他功能码可以根据任务类型自行添加(此处仅示例 移库 功能码获取方式,如果有更好的方式,可以自行修改)
|
// if (taskType.Contains("移库")) Extend3 = Convert.ToInt32("20", 16).ToString();
|
|
// 获取 任务参数4 DATA 数据
|
string startLayerValue = Convert.ToString(startLayer, 16).ToUpper();
|
string endLayerValue = Convert.ToString(endLayer, 16).ToUpper();
|
//Extend4 = Convert.ToInt32(startLayerValue + endLayerValue, 16).ToString();
|
if (location?.S_LOC_TYPE == "接驳位")
|
{
|
Extend4 = "768";
|
}
|
else
|
{
|
Extend4 = "0";
|
}
|
//// 获取成品工单数据(查询 成品工单表)
|
//var workInfo = db.Queryable<ChunAnWorkOrder>().Where(a => a.S_PLineNo == workNo).First();
|
//if (workInfo != null)
|
//{
|
// // 获取下发TS物料层数数据(查询 物料表)
|
// var itemInfo = db.Queryable<ItemRel>().Where(a => a.S_ITEM_CODE == workInfo.SQL_ItemCode).First();
|
// if (itemInfo != null) Extend5 = itemInfo.S_ITEM_LAYER;
|
// // 根据工单中托盘类型转换为对应的下发TS参数数据
|
// Extend6 = trayType == "集化板" ? "1" : trayType == "大板" ? "2" : trayType == "小板" ? "3" : trayType == "超托" ? "4" : "";
|
//}
|
|
string isUsingFree = "0";// 1-使用自由线段 0-不使用 (有的项目如果没有上自由线段,可以通过此变量控制是否获取值)
|
if (isUsingFree == "1")
|
{
|
Extend7 = (startLayer - 1).ToString();
|
Extend8 = (endLayer - 1).ToString();
|
}
|
}
|
else
|
{
|
// 坯盖任务下发参数获取
|
// Extend4 = "1";
|
if (location?.S_LOC_TYPE == "接驳位")
|
{
|
Extend4 = "768";
|
}
|
else
|
{
|
Extend4 = "0";
|
}
|
}
|
|
Console.WriteLine($"[SendTask]:TaskNo={mst.S_TASK_NO.Trim()},start={Extend1},end={Extend2}");
|
var dic = new Dictionary<string, string>();
|
var dic1 = new Dictionary<string, string>();
|
dic.Add("Pri", mst.N_PRIORITY.ToString());
|
dic.Add("No", mst.S_TASK_NO.Trim());
|
dic1.Add("From", Extend1.ToString());
|
dic1.Add("To", Extend2.ToString());
|
dic1.Add("Func", "0");
|
dic1.Add("Data", Extend4);
|
|
if (ConveryTaskList.Contains(taskType))
|
{
|
dic1.Add("ItemHeight", Extend5);
|
dic1.Add("CntrType", Extend6);
|
dic1.Add("FromCol", Extend7);
|
dic1.Add("ToCol", Extend8);
|
}
|
|
var res = new AGVResult();
|
res = NewNDC.OrderAdd(TsNo, dic, dic1);
|
if (res != null && (res.Res.ErrCode == 0 || res.Res.ErrCode == 50009))
|
{
|
TaskHelper.UpdateStatus(mst, "已推送");
|
result = true;
|
}
|
}
|
else result = true;
|
}
|
catch (Exception ex)
|
{
|
LogHelper.Error($"SendTaskStandard Error:{ex.Message}", ex);
|
}
|
|
return result;
|
}
|
}
|
}
|