first commit
This commit is contained in:
@@ -0,0 +1,88 @@
|
||||
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}");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user