1
pulg
2025-05-14 5a640911f7e7ef3a003775993f077e1a0e9ac130
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
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;
        }
    }
}