Files
2026-09-02 16:31:50 +08:00

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}");
}
}
}
}