using AutoMapper; using Newtonsoft.Json; using Quartz; using System; using System.Collections.Generic; using System.Linq; using System.Reflection.Metadata; using System.Security.Cryptography; using System.Text; using System.Threading.Tasks; using WIDESEAWCS_Common.TaskEnum; using WIDESEAWCS_Core; using WIDESEAWCS_Core.Helper; using WIDESEAWCS_DTO.TaskInfo; using WIDESEAWCS_DTO.WMSInfo; using WIDESEAWCS_ITaskInfoService; using WIDESEAWCS_Model.Models; using WIDESEAWCS_QuartzJob; using WIDESEAWCS_QuartzJob.Models; using WIDESEAWCS_QuartzJob.Service; namespace WIDESEAWCS_Tasks { [DisallowConcurrentExecution] public class AGVJob : JobBase, IJob { public readonly ITaskService _taskService; private readonly ITaskExecuteDetailService _taskExecuteDetailService; private readonly IRouterService _routerService; private readonly IMapper _mapper; public AGVJob(ITaskService taskService, ITaskExecuteDetailService taskExecuteDetailService, IRouterService routerService, IMapper mapper) { _taskService = taskService; _taskExecuteDetailService = taskExecuteDetailService; _routerService = routerService; _mapper = mapper; } public Task Execute(IJobExecutionContext context) { try { #region 任务更新 var Tasks = _taskService.Db.Queryable().Where(x => x.TaskState > (int)TaskInStatusEnum.InNew && x.TaskState < (int)TaskInStatusEnum.AGV_InFinish || x.TaskState > (int)TaskOutStatusEnum.Line_OutFinish && x.TaskState < (int)TaskOutStatusEnum.AGV_OutFinish).ToList().OrderBy(x => x.Grade).ThenBy(x => x.CreateDate).ToList(); foreach (var Task in Tasks) { var obj = new { outID = Task.TaskNum.ToString() }; var ResultData = HttpHelper.PostAsync(AGVInterfaceAddress.taskResult, obj.ToJson(), headers: new Dictionary()); if (ResultData.Result != null) { var content = JsonConvert.DeserializeObject(ResultData.Result); if (content.code == "20000") { switch (content.status) { case "01": break; case "02": Task.TaskState = _taskService.TaskInboundTypes.Contains(Task.TaskType) ? TaskInStatusEnum.AGV_InExecuting.ObjToInt() : TaskOutStatusEnum.AGV_OutExecuting.ObjToInt(); break; case "08": { Task.TaskState = _taskService.TaskInboundTypes.Contains(Task.TaskType) ? (int)TaskInStatusEnum.AGV_InFinish : TaskOutStatusEnum.AGV_OutFinish.ObjToInt(); Task.CurrentAddress = Task.NextAddress; Task.NextAddress = ""; List routers = _routerService.QueryNextRoutes(Task.CurrentAddress, Task.TargetAddress); if (routers.Count > 0) { Task.NextAddress = routers.FirstOrDefault()?.ChildPosi ?? ""; } if (Task.TaskState == TaskOutStatusEnum.AGV_OutFinish.ObjToInt()) { #region 向WMS反馈堆垛机任务完成 WMSTaskDTO WMStask = _mapper.Map(Task); HttpHelper.PostAsync(WMSInterfaceAddress.UpdateTaskStatus, WMStask.ToJson(), headers: new Dictionary()); #endregion } } break; case "09": break; default: break; } } } Thread.Sleep(5000); } _taskService.Db.Updateable(Tasks).ExecuteCommand(); #endregion #region 任务下发 List UpnewTasks = new List(); var newTasks = _taskService.Db.Queryable().Where(x => x.TaskState == TaskInStatusEnum.InNew.ObjToInt() || x.TaskState == TaskOutStatusEnum.Line_OutFinish.ObjToInt()).ToList().OrderBy(x => x.Grade).ThenBy(x => x.CreateDate).ToList(); foreach (var agvTaskDTO in GetAGVTaskDTOs(newTasks)) { var ResultData = HttpHelper.PostAsync(AGVInterfaceAddress.taskSent, agvTaskDTO.ToJson(), headers: new Dictionary()); if (ResultData.Result == null) throw new Exception($"AGV任务下发接口请求超时"); var content = JsonConvert.DeserializeObject(ResultData.Result); if (content.code == "20000") { var task = newTasks.Where(x => x.TaskNum == agvTaskDTO.outID.ObjToInt()).First(); task.Dispatchertime = DateTime.Now; task.TaskState = _taskService.TaskInboundTypes.Contains(task.TaskType) ? TaskInStatusEnum.AGV_InSend.ObjToInt() : TaskOutStatusEnum.AGV_OutSend.ObjToInt(); UpnewTasks.Add(task); } else { var task = newTasks.Where(x => x.TaskNum == agvTaskDTO.outID.ObjToInt()).First(); task.ExceptionMessage = content.message; UpnewTasks.Add(task); } Thread.Sleep(1000); } if (UpnewTasks.Count > 0) _taskService.Db.Updateable(UpnewTasks).ExecuteCommand(); #endregion } catch (Exception ex) { Console.Out.WriteLine(nameof(AGVJob) + ":" + ex.Message); } return Task.CompletedTask; } public List GetAGVTaskDTOs(List newTasks) { List agvTaskDTOs = new List(); foreach (var task in newTasks) { AGVTaskDTO aGVTaskDTO = new AGVTaskDTO() { type = "01", level = "2", outID = task.TaskNum.ToString(), points = new List() }; point point1 = new point() { sn = "01", pointCode = task.CurrentAddress, pointType = "02" }; aGVTaskDTO.points.Add(point1); point point2 = new point() { sn = "02", pointCode = task.NextAddress, pointType = "04", matCode = task.PalletCode }; aGVTaskDTO.points.Add(point2); agvTaskDTOs.Add(aGVTaskDTO); } return agvTaskDTOs; } } }