89 lines
3.7 KiB
C#
89 lines
3.7 KiB
C#
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)]
|
|
/// <summary>
|
|
/// 周期扫描待执行的 AGV 任务,并向 RCS 下发任务。
|
|
/// 通过禁止并发执行,避免同一作业周期内重复领取待执行任务。
|
|
/// </summary>
|
|
public class AgvTaskJob : IJob
|
|
{
|
|
private static readonly IAGVTaskService AgvTaskService = GlobalServericeProvidor.GetService<IAGVTaskService>();
|
|
private static readonly IRcsService IRcsService = GlobalServericeProvidor.GetService<IRcsService>();
|
|
private static readonly IStorageRackService StorageRackService = GlobalServericeProvidor.GetService<IStorageRackService>();
|
|
|
|
/// <summary>
|
|
/// 获取未锁定的初始任务,成功下发后更新任务状态;RCS 失败时保留初始状态,
|
|
/// 由下一次调度继续尝试。
|
|
/// </summary>
|
|
/// <param name="context">Quartz 作业执行上下文。</param>
|
|
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<bool> 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}");
|
|
}
|
|
}
|
|
}
|
|
}
|