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<Dt_Task>().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<string, string>());
|
if (ResultData.Result != null)
|
{
|
var content = JsonConvert.DeserializeObject<AGVReturnInfo>(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<Dt_Router> 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<WMSTaskDTO>(Task);
|
HttpHelper.PostAsync(WMSInterfaceAddress.UpdateTaskStatus, WMStask.ToJson(), headers: new Dictionary<string, string>());
|
#endregion
|
}
|
}
|
break;
|
case "09":
|
break;
|
default:
|
break;
|
}
|
}
|
}
|
Thread.Sleep(1000);
|
}
|
_taskService.Db.Updateable(Tasks).ExecuteCommand();
|
#endregion
|
|
#region 任务下发
|
List<Dt_Task> UpnewTasks = new List<Dt_Task>();
|
var newTasks = _taskService.Db.Queryable<Dt_Task>().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<string, string>());
|
if (ResultData.Result == null) throw new Exception($"AGV任务下发接口请求超时");
|
var content = JsonConvert.DeserializeObject<AGVReturnInfo>(ResultData.Result);
|
if (content.code == "20000")
|
{
|
var task = newTasks.Where(x => x.TaskNum == agvTaskDTO.outID.ObjToInt()).First();
|
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<AGVTaskDTO> GetAGVTaskDTOs(List<Dt_Task> newTasks)
|
{
|
List<AGVTaskDTO> agvTaskDTOs = new List<AGVTaskDTO>();
|
foreach (var task in newTasks)
|
{
|
AGVTaskDTO aGVTaskDTO = new AGVTaskDTO()
|
{
|
type = "01",
|
level = "2",
|
outID = task.TaskNum.ToString(),
|
points = new List<point>()
|
};
|
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;
|
}
|
}
|
}
|