dengjunjie
6 天以前 f56f8d4bf3bf088579a169519ef2547d40586f76
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
using OfficeOpenXml.FormulaParsing.Excel.Functions.Math;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection.Emit;
using System.Reflection.Metadata;
using System.Text;
using System.Threading.Tasks;
using WIDESEAWCS_Common;
using WIDESEAWCS_Common.TaskEnum;
using WIDESEAWCS_Core;
using WIDESEAWCS_Core.Helper;
using WIDESEAWCS_DTO;
using WIDESEAWCS_DTO.AGV.HIKROBOT;
using WIDESEAWCS_DTO.RGV.FOURBOT;
using WIDESEAWCS_Model.Models;
 
namespace WIDESEAWCS_Tasks
{
    public partial class TaskJob
    {
        #region 处理海康AGV任务
        /// <summary>
        /// 处理海康不同类型的任务,进行不同的业务逻辑处理(配套任务:修改平库货位信息/换层任务记录小车信息(小车位置层);出入库任务处理库位信息)
        /// </summary>
        /// <param name="tasks"></param>
        public void HIKROBOTTask(List<Dt_Task> tasks)
        {
            foreach (var item in tasks)
            {
                var content = _taskService.SendHIKROBOTTask(item);
            }
        }
        #endregion
 
        #region 处理海康待继续执行任务
        public void SendAGVWaitToExecuteTask(List<Dt_Task> tasks)
        {
            foreach (var item in tasks)
            {
                var content = _taskService.SendHIKROBOTTask(item);
            }
 
        }
        #endregion
 
        #region 下发海康1-6楼的AGV任务
        public void SendAGVTask(List<Dt_Task> tasks)
        {
            foreach (var item in tasks)
            {
                // 出库任务处理 (从1楼出库到6楼)
                if (item.TaskType == (int)TaskTypeEnum.Q3CK || item.TaskType == (int)TaskTypeEnum.Q3RK)
                {
                    // 调用接口获取小车信息
                    var result = _agvcartInfoService.CheckTheCar("MR-Q3-600LE-D(M)(YWGP)");
                    if (result != null && result.Status)
                    {
                        var dataList = result.Data as List<HIKROBOTQueryData>;
                        if (dataList != null && dataList.Any())
                        {
                            // 出库任务:检查是否有在1楼(AA)的小车
                            // Q3CK 是AA→FF的跨楼层任务,只能使用专用小车
                            var code = item.TaskType == (int)TaskTypeEnum.Q3CK ? "AA" : "FF";
                            var specialCarInAA = dataList.FirstOrDefault(d => d.mapCode == code);
 
                            if (specialCarInAA != null)
                            {
                                // 有在1楼的小车,直接执行任务
                                var content = _taskService.SendHIKROBOTTask(item);
                                if (content.Status)
                                {
                                    item.TaskState = (int)TaskStatusEnum.Execut;
                                }
                            }
                            else
                            {
                                // 没有专用小车在1楼,需要呼叫专用小车来到1楼
                                var anySpecialCar = dataList.FirstOrDefault();
                                if (anySpecialCar != null)
                                {
                                    // 起点:小车当前所在楼层的点位,目标:1楼点位
                                    var callCarResult = AddAGVCartInfo(item, anySpecialCar.mapCode, code);
                                    if (callCarResult.Status)
                                    {
                                        // 原任务状态改为等待空车
                                        item.TaskState = (int)TaskStatusEnum.WaitingHkAGVMovePosition;
                                    }
                                }
                                else
                                {
                                    item.ExceptionMessage = "未找到可用AGV小车";
                                }
                            }
                        }
                    }
                    else
                    {
                        item.ExceptionMessage = "获取AGV小车信息失败";
                    }
                }
                else if (item.TaskType == (int)TaskTypeEnum.F01)
                {
                    // F01任务处理:根据目标地址判断需要哪个楼层的小车
                    var result = _agvcartInfoService.CheckTheCar("MR-Q3-600LE-D(M)");
 
                    if (result != null && result.Status)
                    {
                        var dataList = result.Data as List<HIKROBOTQueryData>;
                        if (dataList != null && dataList.Any())
                        {
                            // 从任务的起始地址中提取需要的楼层代码
                            string requiredMapCode = GetMapCodeFromAddress(item.SourceAddress);
                            if (string.IsNullOrEmpty(requiredMapCode))
                            {
                                item.ExceptionMessage = $"无法从目标地址 {item.SourceAddress} 中识别楼层信息";
                                _taskService.UpdateData(item);
                                continue;
                            }
 
                            // 检查是否有在目标楼层的小车
                            var hasRequiredCar = dataList.FirstOrDefault(d => d.mapCode == requiredMapCode);
 
                            if (hasRequiredCar != null)
                            {
                                // 有在目标楼层的小车,直接执行任务
                                var content = _taskService.SendHIKROBOTTask(item);
                                if (content.Status)
                                {
                                    item.TaskState = (int)TaskStatusEnum.Execut;
                                }
                            }
                            else
                            {
                                // 没有目标楼层的小车,需要呼叫空车从当前位置到目标楼层
                                var anySpecialCar = dataList.FirstOrDefault(d => d.CarType == "MR-Q3-600LE-D(M)");
 
                                if (anySpecialCar != null)
                                {
                                    var callCarResult = AddAGVCartInfo(item, anySpecialCar.mapCode, requiredMapCode);
                                    if (callCarResult.Status)
                                    {
                                        item.TaskState = (int)TaskStatusEnum.WaitingHkAGVMovePosition;
                                    }
                                }
                                else
                                {
                                    item.ExceptionMessage = "未找到可用AGV小车";
                                }
                            }
                        }
                    }
                }
                _taskService.UpdateData(item);
            }
        }
 
        #endregion
 
 
        #region 处理海康agv搬运任务
        /// <summary>
        /// 创建空车呼叫任务:根据小车当前位置和目标楼层,设置任务的起点、当前位置和目标点,并下发给海康接口
        /// </summary>
        /// <param name="task"></param>
        /// <param name="currentMapCode">当前位置</param>
        /// <param name="targetMapCode">目标地址</param>
        /// <returns></returns>
        public WebResponseContent AddAGVCartInfo(Dt_Task task, string currentMapCode, string targetMapCode)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                // 获取起点楼层信息
                if (!FloorMapping.FloorMap.ContainsKey(currentMapCode))
                {
                    content.Error($"无效的起点楼层代码:{currentMapCode}");
                    return content;
                }
 
                // 获取目标楼层信息
                if (!FloorMapping.FloorMap.ContainsKey(targetMapCode))
                {
                    content.Error($"无效的目标楼层代码:{targetMapCode}");
                    return content;
                }
 
                var currentFloorInfo = FloorMapping.FloorMap[currentMapCode];
                var targetFloorInfo = FloorMapping.FloorMap[targetMapCode];
 
                // 设置任务信息
                //task.SourceAddress = currentFloorInfo.PointCode;  // 起点:小车当前位置的点位
                //task.CurrentAddress = currentFloorInfo.PointCode; // 当前位置:小车当前位置的点位
                //task.TargetAddress = targetFloorInfo.PointCode;   // 目标点:目标楼层点位
                //task.NextAddress = targetFloorInfo.PointCode; // 记录目标楼层代码
 
                Dt_Task newTask = new Dt_Task
                {
                    WMSTaskNum = "HK_" + task.WMSTaskNum, // 生成唯一的WMS任务号
                    TaskNum = _taskService.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)),
                    SourceAddress = currentFloorInfo.PointCode,
                    CurrentAddress = currentFloorInfo.PointCode,
                    TargetAddress = targetFloorInfo.PointCode,
                    NextAddress = targetFloorInfo.PointCode,
                    TaskType = (int)TaskTypeEnum.MOVE,
                    Grade = task.Grade,
                    PalletCode = "",
                    TaskState = (int)TaskStatusEnum.CallingHKtransportation,
                    // 复制其他必要字段
                    CreateDate = DateTime.Now,
                    Creater = "System"
                };
                var result = _taskService.SendHIKROBOTTask(newTask);
                if (result.Status)
                {
                    _taskService.AddData(newTask);  // 添加新任务
                    content.OK("空车呼叫任务创建成功", newTask);
                }
                else
                {
                    content.Error("空车呼叫任务下发失败");
                }
                return content;
            }
            catch (Exception ex)
            {
                content.Error($"创建空车呼叫任务失败:{ex.Message}");
            }
            return content;
        }
        #endregion
 
        #region 处理agv待空车搬运任务
        public void SendHKWaitTask(List<Dt_Task> Tasks)
        {
            try
            {
                List<Dt_Task> Uptasks = new List<Dt_Task>();
                foreach (var item in Tasks)
                {
                    var content = _taskService.SendHIKROBOTTask(item);
                    if (content.Status)
                    {
                        item.TaskState = (int)TaskStatusEnum.Execut;
                        Uptasks.Add(item);
                    }
                }
                _taskService.UpdateData(Uptasks);
 
            }
            catch (Exception ex)
            {
                WriteError(nameof(TaskJob), ex.Message, ex);
            }
        }
        #endregion
 
        /// <summary>
        /// 从地址中提取楼层代码(AA、BB、CC、DD、EE、FF)
        /// </summary>
        /// <param name="address">点位地址</param>
        /// <returns>楼层代码</returns>
        private string GetMapCodeFromAddress(string address)
        {
            if (string.IsNullOrEmpty(address))
                return null;
 
            // 地址格式示例 :AA 对应 0339050AA0309145
            // keys 是 AA、BB、CC、DD、EE、FF,vule是对应的点位信息
            foreach (var floorCode in FloorMapping.FloorMap.Keys)
            {
                if (address.Contains(floorCode))
                {
                    return floorCode;//返回的就是AA、BB、CC、DD、EE、FF中的一个,代表对应的楼层
                }
            }
            return null;
        }
 
 
    }
}