liulijun
12 小时以前 5270308151082506e0e6df2c72d278d2976ec860
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
using HslCommunication.WebSocket;
using Microsoft.AspNetCore.Components.Routing;
using Newtonsoft.Json;
using Quartz;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection.Metadata;
using System.Text;
using System.Threading.Tasks;
using HslCommunication.WebSocket;
using WIDESEAWCS_Common;
using WIDESEAWCS_Common.TaskEnum;
using WIDESEAWCS_Communicator;
using WIDESEAWCS_Core;
using WIDESEAWCS_Core.Helper;
using WIDESEAWCS_DTO.TaskInfo;
using WIDESEAWCS_IBasicInfoRepository;
using WIDESEAWCS_ITaskInfoRepository;
using WIDESEAWCS_ITaskInfoService;
using WIDESEAWCS_Model.Models;
using WIDESEAWCS_QuartzJob;
using WIDESEAWCS_QuartzJob.DTO;
using WIDESEAWCS_QuartzJob.Models;
using WIDESEAWCS_QuartzJob.Repository;
using WIDESEAWCS_QuartzJob.Service;
using WIDESEAWCS_Tasks.ConveyorLineJob;
using ICacheService = WIDESEAWCS_Core.Caches.ICacheService;
 
namespace WIDESEAWCS_Tasks
{
    [DisallowConcurrentExecution]
    public class ConveyorLineJob_YL1ndFloor : JobBase, IJob
    {
        private readonly ICacheService _cacheService;
        private readonly ITaskService _taskService;
        private readonly ITaskExecuteDetailService _taskExecuteDetailService;
        private readonly ITaskRepository _taskRepository;
        private readonly IStationMangerRepository _stationMangerRepository;
        private readonly IRouterRepository _routerRepository;
        private readonly IRouterService _routerService;
        private readonly IRouterExtension _routerExtension;
        private readonly WebSocketServer _webSocketServer;
        private readonly List<Dt_WarehouseDevice> warehouseDevices;
 
        public ConveyorLineJob_YL1ndFloor(ICacheService cacheService, ITaskService taskService, ITaskExecuteDetailService taskExecuteDetailService, ITaskRepository taskRepository, IStationMangerRepository stationMangerRepository, IRouterRepository routerRepository, IRouterService routerService, IRouterExtension routerExtension, WebSocketServer webSocketServer)
        {
            _cacheService = cacheService;
            _taskService = taskService;
            _taskExecuteDetailService = taskExecuteDetailService;
            _taskRepository = taskRepository;
            _stationMangerRepository = stationMangerRepository;
            _routerRepository = routerRepository;
            _routerService = routerService;
            _routerExtension = routerExtension;
            _webSocketServer = webSocketServer;
 
            string? warehouseDevicesStr = _cacheService.Get<string>(nameof(Dt_WarehouseDevice));
            if (!string.IsNullOrEmpty(warehouseDevicesStr))
            {
                warehouseDevices = JsonConvert.DeserializeObject<List<Dt_WarehouseDevice>>(warehouseDevicesStr) ?? new List<Dt_WarehouseDevice>();
            }
            else
            {
                warehouseDevices = new List<Dt_WarehouseDevice>();
            }
        }
 
        public Task Execute(IJobExecutionContext context)
        {
            bool flag = context.JobDetail.JobDataMap.TryGetValue("JobParams", out object? value);
            if (flag && value != null)
            {
                OtherDevice device = (OtherDevice)value;
                //获取所有协议的输送线站台
                List<string> deviceStations = device.DeviceProDTOs.Select(x => x.DeviceChildCode).ToList();
                List<Dt_StationManger> stationMangers = _stationMangerRepository.QueryData(x => x.StationDeviceCode == device.DeviceCode);
 
                // 创建输送线数据对象,用于WebSocket发送
                var conveyorLineCPData = new Dictionary<string, object>();
                conveyorLineCPData["设备编号"] = device.DeviceCode;
                conveyorLineCPData["设备名称"] = "原料库一楼输送线";
                conveyorLineCPData["ConveyorLineInfo"] = new Dictionary<string, Dictionary<string, object>>();
                foreach (var item in stationMangers.Where(x => deviceStations.Contains(x.StationCode)))
                {
                    DeviceProDTO? deviceProRead = device.DeviceProDTOs.Where(x => x.DeviceChildCode == item.StationCode && x.DeviceProParamType == nameof(WR_CLineYLDB)).OrderBy(x => x.DeviceProOffset).FirstOrDefault();
                    DeviceProDTO? deviceErrRead = device.DeviceProDTOs.Where(x => x.DeviceChildCode == item.StationCode && x.DeviceProParamType == nameof(R_ErrorYLDB)).OrderBy(x => x.DeviceProOffset).FirstOrDefault();
                    R_ConveyorLineYLInfo conveyorLineInfoRead = new R_ConveyorLineYLInfo();
                    R_ErrorYLDB errorYLDB = new R_ErrorYLDB();
                    var simplifiedInfo = new Dictionary<string, object>();
                    if (deviceProRead != null)
                    {
                         conveyorLineInfoRead = device.Communicator.ReadCustomer<R_ConveyorLineYLInfo>(deviceProRead.DeviceProAddress);
 
                        if (conveyorLineInfoRead != null && item.StationType == StationTypeEnum.StationType_InStartAndOutEnd.ObjToInt() && conveyorLineInfoRead.WR_ToHode <= 0 && conveyorLineInfoRead.WR_Request == 86 && !string.IsNullOrEmpty(conveyorLineInfoRead.WR_TMID)) //一楼来料称重站台允许入库申请
                        {
                            WebResponseContent content = _taskService.YLPurchaseBoxing(conveyorLineInfoRead.WR_TMID, weight: conveyorLineInfoRead.WR_Weight, thickness: conveyorLineInfoRead.WR_Height, wide: conveyorLineInfoRead.WR_Width);
                            if (content.Status)
                            {
                                device.SetValue(WR_CLineYLDB.WR_Reresult, 86, item.StationCode);
                                WriteInfo(item.StationCode, $"请求入库条码:{conveyorLineInfoRead.WR_TMID}");
                            }
                            else
                            {
                                WriteError(item.StationCode, $"请求入库失败:{content.Message}");
                            }
                            
                        }
                        else if (conveyorLineInfoRead != null && item.StationType == StationTypeEnum.StationType_InboundAndOutbound.ObjToInt() && conveyorLineInfoRead.WR_ToHode <= 0 && conveyorLineInfoRead.WR_Request == 86 && conveyorLineInfoRead.WR_Task <= 0 && !string.IsNullOrEmpty(conveyorLineInfoRead.WR_TMID)) //一楼分配站台入库分配目标点(平台)
                        {
                            Dt_Task task = _taskRepository.QueryFirst(x => x.RfidCode == conveyorLineInfoRead.WR_TMID && x.CurrentAddress == item.StationCode && _taskService.TaskInboundTypes.Contains(x.TaskType) && x.TaskState == TaskStatusEnum.New.ObjToInt() && x.DeviceCode == device.DeviceCode);
                            if (task == null)
                            {
                                WebResponseContent content = _taskService.RequestYLWMSTaskSimple(conveyorLineInfoRead.WR_TMID, item.StationCode);
                                if (!content.Status)
                                {
                                    WriteError(item.StationCode, $"请求入库失败:{content.Message}");
                                }
                            }
                            else //发送任务
                            {
                                device.SetValue(WR_CLineYLDB.WR_Task, task.TaskNum, item.StationCode);
                                device.SetValue(WR_CLineYLDB.WR_ToHode, task.NextAddress, item.StationCode);
                                device.SetValue(WR_CLineYLDB.WR_Width, task.TaskLength, item.StationCode);
                                device.SetValue(WR_CLineYLDB.WR_Reresult, 86, item.StationCode);
                                _taskService.UpdateTask(task, TaskStatusEnum.Line_Executing);
                                WriteInfo(item.StationCode, $"{conveyorLineInfoRead.Serialize()}");
                            }
                        }
                        else if (conveyorLineInfoRead != null && item.StationType == StationTypeEnum.StationType_InboundAndOutbound.ObjToInt() && conveyorLineInfoRead.WR_ToHode <= 0 && conveyorLineInfoRead.WR_Request == 86 && conveyorLineInfoRead.WR_Task > 0) //一楼分配站台入库分配目标点(库内)
                        {
                            Dt_Task task = _taskRepository.QueryFirst(x => x.TaskNum == conveyorLineInfoRead.WR_Task && x.CurrentAddress == item.StationCode && _taskService.TaskInboundTypes.Contains(x.TaskType) && x.TaskState == TaskStatusEnum.AGV_Finish.ObjToInt() && x.DeviceCode == device.DeviceCode);
                            //发送任务
                            if (task != null)
                            {
                                if (string.IsNullOrEmpty(task.Roadway) && string.IsNullOrEmpty(task.NextAddress))
                                {
                                    WebResponseContent content = _taskService.AssignYLRoadwayNo(task.PalletCode,weight: conveyorLineInfoRead.WR_Weight, thickness: conveyorLineInfoRead.WR_Height, wide: conveyorLineInfoRead.WR_Width);
                                    if (content.Status)
                                    {
                                        string roadWay = content.Data.ToString();
                                        //获取路由配置
                                        List<Dt_Router> routers = _routerRepository.QueryData(x => x.InOutType == task.TaskType && task.CurrentAddress == x.StartPosi && x.ChildPosiDeviceCode == roadWay);
                                        Dt_Router router = routers.FirstOrDefault();
                                        if (router == null)
                                        {
                                            WriteError(item.StationName, $"任务号:{task.TaskNum}未找到路由配置信息");
                                            return Task.CompletedTask;
                                        }
                                        task.Roadway = roadWay;
                                        task.NextAddress = router.NextPosi;
                                        _taskService.UpdateTask(task, TaskStatusEnum.AGV_Finish);
                                    }
                                    else
                                    {
                                        WriteError(item.StationCode, $"请求入库失败:{content.Message}");
                                    }
                                    
                                }
                                else
                                {
                                    device.SetValue(WR_CLineYLDB.WR_Task, task.TaskNum, item.StationCode);
                                    device.SetValue(WR_CLineYLDB.WR_ToHode, task.NextAddress, item.StationCode);
                                    device.SetValue(WR_CLineYLDB.WR_Width, task.TaskLength, item.StationCode);
                                    device.SetValue(WR_CLineYLDB.WR_TMID, task.PalletCode, item.StationCode);
                                    device.SetValue(WR_CLineYLDB.WR_Reresult, 86, item.StationCode);
                                    _taskService.UpdateTask(task, TaskStatusEnum.Line_Executing);
                                    WriteInfo(item.StationCode, $"请求入库成功:{conveyorLineInfoRead.Serialize()}");
                                }
                            }
                        }
                        else if (conveyorLineInfoRead != null && item.StationType == StationTypeEnum.StationType_OnlyInbound.ObjToInt() && conveyorLineInfoRead.WR_ToHode > 0 && conveyorLineInfoRead.WR_Request == 86 && !string.IsNullOrEmpty(conveyorLineInfoRead.WR_TMID) && conveyorLineInfoRead.WR_Task>0) //入库站台申请
                        {
                            Dt_Task task = _taskRepository.QueryFirst(x => x.TaskNum == conveyorLineInfoRead.WR_Task && x.NextAddress == item.StationCode && _taskService.TaskInboundTypes.Contains(x.TaskType) && x.TaskState == TaskStatusEnum.Line_Executing.ObjToInt() && x.DeviceCode == device.DeviceCode);
                            if (task != null)
                            {
                                //分配货位
                                string? local = _taskService.RequestAssignLocation(task.TaskNum, task.Roadway);
                                if (!string.IsNullOrEmpty(local))
                                {
                                    device.SetValue(WR_CLineYLDB.WR_Reresult, 86, item.StationCode);
                                    task.CurrentAddress = item.StackerCraneStationCode;
                                    task.TargetAddress = local;
                                    task.NextAddress = local;
                                    task.DeviceCode = item.StackerCraneCode;
                                    _taskService.UpdateTask(task, TaskStatusEnum.SC_Execute);
                                    WriteInfo(item.StationName, $"任务号:{task.TaskNum}进行堆垛机入库");
                                }
                                else
                                {
                                    WriteError(item.StationCode, $"请求入库货位失败");
                                }
                                
                            }
                        }
                        else if (conveyorLineInfoRead != null && item.StationType == StationTypeEnum.StationType_OnlyOutbound.ObjToInt() && conveyorLineInfoRead.WR_ToHode <= 0 && conveyorLineInfoRead.WR_Request == 99 && conveyorLineInfoRead.WR_Task > 0) //出站台分配目标点
                        {
                            Dt_Task task = _taskRepository.QueryFirst(x => x.CurrentAddress == item.StationCode && x.TaskNum == conveyorLineInfoRead.WR_Task && _taskService.TaskOutboundTypes.Contains(x.TaskType) && x.TaskState == TaskStatusEnum.Line_Execute.ObjToInt() && x.DeviceCode == device.DeviceCode);
                            if (task != null)
                            {
                                //发送目标点
                                device.SetValue(WR_CLineYLDB.WR_Task, task.TaskNum, item.StationCode);
                                device.SetValue(WR_CLineYLDB.WR_Width, task.TaskLength, item.StationCode);
                                device.SetValue(WR_CLineYLDB.WR_TMID, task.PalletCode, item.StationCode);
                                device.SetValue(WR_CLineYLDB.WR_ToHode, task.NextAddress, item.StationCode);
                                device.SetValue(WR_CLineYLDB.WR_Reresult, 86, item.StationCode);
                                if (task.TaskType==TaskTypeEnum.OutPick.ObjToInt())
                                {
                                    task.Roadway = task.TargetAddress;
                                    task.TargetAddress = "";
                                    task.TaskType=TaskTypeEnum.InPick.ObjToInt();
                                }
                                _taskService.UpdateTask(task,TaskStatusEnum.Line_Executing);
                                WriteInfo(item.StationCode, $"任务号:{task.TaskNum}出库至{task.NextAddress}");
                            }
                        }
                        else if (conveyorLineInfoRead != null && item.StationType == StationTypeEnum.StationType_InboundAndOutbound.ObjToInt() && conveyorLineInfoRead.WR_Task > 0 && conveyorLineInfoRead.WR_Request == 98) //一楼老厂出库口完成
                        {
                            Dt_Task task = _taskRepository.QueryFirst(x => x.TaskNum == conveyorLineInfoRead.WR_Task &&  _taskService.TaskOutboundTypes.Contains(x.TaskType) && x.TaskState == TaskStatusEnum.Line_Executing.ObjToInt() && x.DeviceCode == device.DeviceCode);
                            if (task != null)
                            {
                                //任务回复
                                device.SetValue(WR_CLineYLDB.WR_Reresult, 98, item.StationCode);
                                _taskService.UpdateTask(task, TaskStatusEnum.Line_Executing, deviceCode: "CL3_YL");
                                WriteInfo(item.StationCode, $"任务号:{task.TaskNum},RIFD{task.RfidCode}一楼出库至老厂房完成");
                            }
                        }
                        else if (conveyorLineInfoRead != null && item.StationType == StationTypeEnum.StationType_InboundAndOutbound.ObjToInt() && conveyorLineInfoRead.WR_Task <= 0 && !string.IsNullOrEmpty(conveyorLineInfoRead.WR_TMID) && conveyorLineInfoRead.WR_Request == 98) //一楼老厂出库口完成
                        {
                            Dt_Task task = _taskRepository.QueryFirst(x => (x.RfidCode == conveyorLineInfoRead.WR_TMID || x.PalletCode== conveyorLineInfoRead.WR_TMID) && _taskService.TaskOutboundTypes.Contains(x.TaskType) && x.TaskState == TaskStatusEnum.Line_Executing.ObjToInt() && x.DeviceCode == device.DeviceCode);
                            if (task != null)
                            {
                                //任务回复
                                device.SetValue(WR_CLineYLDB.WR_Reresult, 98, item.StationCode);
                                _taskService.UpdateTask(task, TaskStatusEnum.Line_Executing, deviceCode: "CL3_YL");
                                WriteInfo(item.StationCode, $"任务号:{task.TaskNum},RIFD{task.RfidCode}一楼出库至老厂房完成");
                            }
                        }
                        // 将当前站台的输送线信息添加到数据对象,只包含需要的字段
                        if (conveyorLineInfoRead != null)
                        {
                            simplifiedInfo["LineCode"] = device.DeviceCode;
                            simplifiedInfo["TaskNum"] = conveyorLineInfoRead.WR_Task; // 任务号
                            simplifiedInfo["RFID"] = conveyorLineInfoRead.WR_TMID;//RFID
                            simplifiedInfo["Width"] = conveyorLineInfoRead.WR_Width;//纸卷幅宽
                            simplifiedInfo["Request"] = conveyorLineInfoRead.WR_Request;//申请
                            simplifiedInfo["Reresult"] = conveyorLineInfoRead.WR_Reresult;//申请反馈
                            simplifiedInfo["HasGoods"] = conveyorLineInfoRead.WR_ToHode > 0; // 是否有货
                            ((Dictionary<string, Dictionary<string, object>>)conveyorLineCPData["ConveyorLineInfo"])[item.StationCode] = simplifiedInfo;
                        }
                    }
                    else if (deviceErrRead!=null)
                    {
 
                        errorYLDB = device.Communicator.ReadCustomer<R_ErrorYLDB>(deviceErrRead.DeviceProAddress);
                        if (errorYLDB != null && errorYLDB.R_Error==2)
                        {
                            ErrorDeviceInfo? errorDeviceInfo = RoadwayError.Roadways.FirstOrDefault(x=>x.Code==item.StationCode);
                            if (errorDeviceInfo==null)
                            {
                                RoadwayError.Roadways.Add(new ErrorDeviceInfo() { Code = item.StationCode, Roadway = item.StackerCraneCode });
                            }
                        }
                        else if(errorYLDB != null && errorYLDB.R_Error == 1)
                        {
                            ErrorDeviceInfo? deviceInfo = RoadwayError.Roadways.FirstOrDefault(x => x.Code == item.StationCode);
                            if (deviceInfo != null)
                            {
                                RoadwayError.Roadways.Remove(deviceInfo);
                            }
                        }
                        if (errorYLDB != null)
                        {
                            simplifiedInfo["Error"] = errorYLDB.R_Error;
                            ((Dictionary<string, Dictionary<string, object>>)conveyorLineCPData["ConveyorLineInfo"])[item.StationCode] = simplifiedInfo;
                        }
                    }
                    else
                    {
                        WriteError(item.StationName, $"未找到设备子编号{item.StationCode}的协议信息");
                    }
                }
                
                // 通过WebSocket发送输送线数据到前端
                // 序列化数据
                string jsonData = JsonConvert.SerializeObject(conveyorLineCPData);
                // 发送数据到所有客户端
                _webSocketServer.PublishAllClientPayload(jsonData);
                // 记录发送日志
                WriteInfo(device.DeviceCode, $"WebSocket发送输送线数据:{jsonData}");
            }
            return Task.CompletedTask;
        }
    }
}