using JSMachine.WMS.App.Dto; using JSMachine.WMS.App.Dto.Enum; using JSMachine.WMS.App.IService; using JSMachine.WMS.Infrastructure; using JSMachine.WMS.Infrastructure.Helper; using JSMachine.WMS.Job.Enum; using JSMachine.WMS.Job.JobAttributes; using JSMachine.WMS.RPC.ErpRPC.Dto.Out; using JSMachine.WMS.RPC.RcsRPC.Dto.In; using JSMachine.WMS.RPC.RcsRPC.IService; using Quartz; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace JSMachine.WMS.Job.Job { [DisallowConcurrentExecution] [PersistJobDataAfterExecution] [Job(Name = nameof(AgvTaskJob) , Group = nameof(AgvTaskJob) + "_Group" , Description = "Agv任务作业" , ScheduleType = ScheduleType.Simple , IntervalMilliSeconds = 1000 , RepeatCount = 0 , StartTimeStr = null)] /// /// 周期扫描待执行的 AGV 任务,并向 RCS 下发任务。 /// 通过禁止并发执行,避免同一作业周期内重复领取待执行任务。 /// public class AgvTaskJob : IJob { private static readonly IAGVTaskService AgvTaskService = GlobalServericeProvidor.GetService(); private static readonly IRcsService IRcsService = GlobalServericeProvidor.GetService(); private static readonly IStorageRackService StorageRackService = GlobalServericeProvidor.GetService(); /// /// 获取未锁定的初始任务,成功下发后更新任务状态;RCS 失败时保留初始状态, /// 由下一次调度继续尝试。 /// /// Quartz 作业执行上下文。 public async Task Execute(IJobExecutionContext context) { AGVTaskDto agvTask = await AgvTaskService.GetSingalByExpression(p => (p.TaskStatus == TaskStatusEnum.Initial) && !p.IsLock); if (agvTask == null) return; StorageRackDto startWareHouse = await StorageRackService.GetByStorageRackNo(agvTask.StartPositionCode); CreateTaskParam createTaskParam = new() { //从提升机出口取货和搬运要使用不同的模板 modelProcessCode = startWareHouse.Transport == TransportEnum.Elevator ? "RK" : "cattleCarry4", orderId = agvTask.Id.ToString(), taskOrderDetail = new TaskOrderDetailDto { taskPath = $"{agvTask.StartPositionCode},{agvTask.EndPositionCode}" } }; // 只有 RCS 返回成功后才推进本地状态,防止本地记录与外部执行状态不一致。 ApiReturnResult apiRet = await IRcsService.CreateTask(createTaskParam); if (apiRet.ResultCode == "200") { LogHelper.Info($"向Rcs下发Agv任务 {agvTask.Id} 成功,起点 {agvTask.StartPositionCode} 终点 {agvTask.EndPositionCode}"); agvTask.TaskStatus = TaskStatusEnum.InExecution; bool bRet = await AgvTaskService.EditSingal(agvTask); if (!bRet) { LogHelper.Error($"更新AgvTask {agvTask.Id} 状态失败,稍后将重试一次"); await AgvTaskService.EditSingal(agvTask); } } else { LogHelper.Error($"向Rcs下发Agv任务 {agvTask.Id} 失败,起点 {agvTask.StartPositionCode} 终点 {agvTask.EndPositionCode},原因 {apiRet.ErrorMsg}"); } } } }