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 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($""); return sb.ToString(); } private static string GetReqStr2(int ts, Dictionary param, Dictionary 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($""); foreach (var p1 in param1) { sb.Append($""); } sb.Append(""); return sb.ToString(); } public static AGVResult AddNewOrder(int ts, Dictionary param) { //< Req >< Order TS = '1' Pri = '1' No = 'TN2302020001' Ext1 = '' Ext2 = '' N_CNTR_COUNT = '' >< Param Name = 'From' Value = '2' />< Param Name = 'To' Value = '1' /> 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 param, Dictionary param1) { //< Req >< Order TS = '1' Pri = '1' No = 'TN2302020001' Ext1 = '' Ext2 = '' N_CNTR_COUNT = '' >< Param Name = 'From' Value = '2' />< Param Name = 'To' Value = '1' /> 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 param) { //< Req >< Order No = 'TN2302020001' >< Param Name = 'IsForce' Value = '1' /> 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 param) { //lpn: //traccif: //lock: 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 param) { //< Req >< Order No = 'TN2302020002' ParamNo = '1' Param1 = '1' /> 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) { //011 XmlDocument xml = new XmlDocument(); xml.LoadXml(bufout); var json = JsonConvert.SerializeXmlNode(xml); return JsonConvert.DeserializeObject(json); } public class AGVResult { public Res Res { get; set; } } public class Res { public int ErrCode { get; set; } public string ErrInfo { get; set; } } /// /// 推送任务-NDC参数标准版 /// /// 任务数据 /// 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().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().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().Where(a => a.S_PLineNo == workNo).First(); //if (workInfo != null) //{ // // 获取下发TS物料层数数据(查询 物料表) // var itemInfo = db.Queryable().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(); var dic1 = new Dictionary(); 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; } } }