using AutoMapper; 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 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 任务下发 List UpnewTasks = new List(); var newTasks = _taskService.Db.Queryable().Where(x => x.TaskState == (int)TaskInStatusEnum.InNew).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.TaskState = TaskInStatusEnum.AGV_InSend.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 #region 任务更新 var Tasks = _taskService.Db.Queryable().Where(x => x.TaskState > (int)TaskInStatusEnum.InNew && x.TaskState < (int)TaskInStatusEnum.AGV_InFinish).ToList().OrderBy(x => x.Grade).ThenBy(x => x.CreateDate).ToList(); foreach (var Task in Tasks) { var ResultData = HttpHelper.PostAsync(AGVInterfaceAddress.taskResult + Task.TaskNum, null, 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 = TaskInStatusEnum.AGV_InExecuting.ObjToInt(); break; case "08": { Task.TaskState = (int)TaskInStatusEnum.AGV_InFinish; Task.CurrentAddress = Task.NextAddress; List routers = _routerService.QueryNextRoutes(Task.CurrentAddress, Task.TargetAddress); if (routers.Count > 0) { Task.NextAddress = routers.FirstOrDefault().ChildPosi; } } break; case "09": break; default: break; } } } Thread.Sleep(1000); } _taskService.Db.Updateable(Tasks).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; } } }