using Microsoft.IdentityModel.Tokens; using OfficeOpenXml.FormulaParsing.Excel.Functions.RefAndLookup; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using WIDESEA_DTO.Agv; using WIDESEAWCS_Common.APIEnum; using WIDESEAWCS_Common.TaskEnum; using WIDESEAWCS_Core; using WIDESEAWCS_Core.Helper; using WIDESEAWCS_DTO.Agv; using WIDESEAWCS_Model.Models; using WIDESEAWCS_QuartzJob; namespace WIDESEAWCS_Tasks { public partial class AGVJob { public void SendAGVTask() { try { var newTasksOut = _taskService.Db.Queryable().Where(x => (x.TaskState == TaskStatusEnum.AGV_Execute.ObjToInt()) && x.TaskType==TaskTypeEnum.Outbound.ObjToInt() && x.DeviceCode == "AGV").ToList().OrderBy(x => x.Grade).ThenBy(x => x.CreateDate).ToList(); var newTasksIn = _taskService.Db.Queryable().Where(x => (x.TaskState == TaskStatusEnum.AGV_Execute.ObjToInt()) && x.TaskType == TaskTypeEnum.Inbound.ObjToInt() && x.DeviceCode == "AGV").ToList().OrderBy(x => x.Grade).ThenBy(x => x.CreateDate).ToList(); #region 出库任务下发 if (newTasksOut.Count>0) { List GroupIds = newTasksOut.GroupBy(x => x.GroupId).Select(x => x.Key).ToList(); foreach (var GroupId in GroupIds) { var tasks = newTasksOut.Where(x => x.GroupId == GroupId).ToList(); try { AgvTaskSendDTO agvTaskSend = new AgvTaskSendDTO() { MissionData = new List() }; foreach (var task in tasks) { //获取目标点货位 Dt_LocationInfo locationInfoStart = _locationInfoRepository.QueryFirst(x => x.LocationCode == task.CurrentAddress); //获取拣选出库站台 Dt_StationManger stationMangerEnd = _stationMangerRepository.QueryFirst(x => x.PickStationCode == task.NextAddress); if (locationInfoStart == null || stationMangerEnd == null) throw new Exception($"未找到任务号${task.TaskNum}起始点{task.CurrentAddress}或目标点{task.NextAddress}位置信息"); agvTaskSend.RequestId = GroupId; agvTaskSend.MissionCode = GroupId; if (task.Grade == 0) { agvTaskSend.Priority = 99; } else { agvTaskSend.Priority = 99 - task.Grade; } //料箱子搬运任务 MissionDataItem missionDataItem = new MissionDataItem() { Sequence = task.TaskNum, BinCode = task.PalletCode, StartPosition = locationInfoStart.AgvPoint, StartSlotCode = locationInfoStart.LocationCode, EndPosition = stationMangerEnd.StationCode, EndSlotCode = stationMangerEnd.CraneStationCode, TakeActionConfirm = false, TakeActionInform = false, PutActionConfirm = true, PutActionInform = true, }; agvTaskSend.MissionData.Add(missionDataItem); } //发送AGV任务 WebResponseContent content = _taskService.AgvSendTask(agvTaskSend, APIEnum.AgvSendTask); if (!content.Status) throw new Exception(content.Message); tasks.ForEach(x => { x.Dispatchertime = DateTime.Now; x.TaskState = TaskStatusEnum.AGV_Executing.ObjToInt(); }); _taskService.UpdateData(tasks); Thread.Sleep(500); } catch (Exception ex) { tasks.ForEach(x => { x.TaskState = TaskStatusEnum.Exception.ObjToInt(); x.ExceptionMessage = ex.Message; }); _taskService.UpdateData(tasks); } } } #endregion #region 入库任务下发 if (newTasksIn.Count > 0) { foreach (var task in newTasksIn) { try { AgvTaskSendDTO agvTaskSend = new AgvTaskSendDTO() { MissionData = new List() }; //获取目标点货位 Dt_LocationInfo locationInfoEnd = _locationInfoRepository.QueryFirst(x => x.LocationCode == task.NextAddress); //获取线体入库站台 Dt_StationManger stationMangerStart = _stationMangerRepository.QueryFirst(x => x.PickStationCode == task.CurrentAddress); if (locationInfoEnd == null || stationMangerStart == null) throw new Exception($"未找到任务号${task.TaskNum}起始点{task.CurrentAddress}或目标点{task.NextAddress}位置信息"); agvTaskSend.RequestId = Guid.NewGuid().ToString().Replace("-", ""); agvTaskSend.MissionCode = task.TaskNum.ToString(); if (task.Grade == 0) { agvTaskSend.Priority = 99; } else { agvTaskSend.Priority = 99 - task.Grade; } //料箱子搬运任务 MissionDataItem missionDataItem = new MissionDataItem() { Sequence = task.TaskNum, BinCode = task.PalletCode, StartPosition = stationMangerStart.StationCode, StartSlotCode = stationMangerStart.CraneStationCode, EndPosition = locationInfoEnd.AgvPoint, EndSlotCode = locationInfoEnd.LocationCode, TakeActionConfirm = false, TakeActionInform = false, PutActionConfirm = true, PutActionInform = true, }; agvTaskSend.MissionData.Add(missionDataItem); //发送AGV任务 WebResponseContent content = _taskService.AgvSendTask(agvTaskSend, APIEnum.AgvSendTask); if (!content.Status) throw new Exception(content.Message); task.Dispatchertime = DateTime.Now; task.TaskState = TaskStatusEnum.AGV_Executing.ObjToInt(); _taskService.UpdateData(task); Thread.Sleep(500); } catch (Exception ex) { task.TaskState = TaskStatusEnum.Exception.ObjToInt(); task.ExceptionMessage = ex.Message; _taskService.UpdateData(task); } } } #endregion } catch (Exception ex) { WriteError(nameof(AGVJob), ex.Message, ex); } } } }