|
|
using Sln.Wcs.Model.Domain;
|
|
|
using Sln.Wcs.Repository.service;
|
|
|
using Sln.Wcs.Serilog;
|
|
|
|
|
|
namespace Sln.Wcs.Strategy;
|
|
|
|
|
|
public class MaterialStrategy
|
|
|
{
|
|
|
private readonly SerilogHelper _logger;
|
|
|
private readonly ILiveTaskQueueService _taskQueueService;
|
|
|
private readonly ILiveTaskDetailService _taskDetailService;
|
|
|
|
|
|
private CancellationTokenSource? _cts;
|
|
|
private bool _isRunning;
|
|
|
|
|
|
public MaterialStrategy(
|
|
|
SerilogHelper logger,
|
|
|
ILiveTaskQueueService taskQueueService,
|
|
|
ILiveTaskDetailService taskDetailService)
|
|
|
{
|
|
|
_logger = logger;
|
|
|
_taskQueueService = taskQueueService;
|
|
|
_taskDetailService = taskDetailService;
|
|
|
}
|
|
|
|
|
|
public void Run()
|
|
|
{
|
|
|
_logger.Info("包材任务调度就绪,输入 start 启动,stop 停止,quit 退出");
|
|
|
|
|
|
while (true)
|
|
|
{
|
|
|
var input = Console.ReadLine()?.Trim().ToLower();
|
|
|
|
|
|
switch (input)
|
|
|
{
|
|
|
case "start":
|
|
|
Start();
|
|
|
break;
|
|
|
case "stop":
|
|
|
Stop();
|
|
|
break;
|
|
|
case "quit":
|
|
|
Stop();
|
|
|
return;
|
|
|
default:
|
|
|
_logger.Info("未知指令,可用: start | stop | quit");
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
private void Start()
|
|
|
{
|
|
|
if (_isRunning)
|
|
|
{
|
|
|
_logger.Info("调度已在运行中");
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
_cts = new CancellationTokenSource();
|
|
|
_isRunning = true;
|
|
|
|
|
|
Task.Run(() => SchedulingLoop(_cts.Token));
|
|
|
|
|
|
_logger.Info("调度已启动");
|
|
|
}
|
|
|
|
|
|
private void Stop()
|
|
|
{
|
|
|
if (!_isRunning)
|
|
|
{
|
|
|
_logger.Info("调度未在运行");
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
_cts?.Cancel();
|
|
|
_isRunning = false;
|
|
|
_logger.Info("调度已停止");
|
|
|
}
|
|
|
|
|
|
private void SchedulingLoop(CancellationToken ct)
|
|
|
{
|
|
|
while (!ct.IsCancellationRequested)
|
|
|
{
|
|
|
var taskQueues = _taskQueueService.getLiveTaskQueues(x =>
|
|
|
x.taskCategory == 1 && x.taskStatus == 1);
|
|
|
|
|
|
_logger.Info($"查询待执行包材任务,共 {taskQueues.Count} 条");
|
|
|
|
|
|
if (taskQueues.Count > 0)
|
|
|
{
|
|
|
Parallel.ForEach(taskQueues, task =>
|
|
|
{
|
|
|
ProcessTask(task, ct);
|
|
|
});
|
|
|
}
|
|
|
|
|
|
Thread.Sleep(1000);
|
|
|
}
|
|
|
|
|
|
_logger.Info("调度循环已退出");
|
|
|
}
|
|
|
|
|
|
private void ProcessTask(LiveTaskQueue task, CancellationToken ct)
|
|
|
{
|
|
|
if (ct.IsCancellationRequested) return;
|
|
|
|
|
|
_logger.Info($"开始执行任务 {task.taskCode},子任务数 {task.taskDetails.Count}");
|
|
|
|
|
|
task.taskStatus = 2;
|
|
|
_taskQueueService.Update(task);
|
|
|
|
|
|
foreach (var detail in task.taskDetails.OrderBy(x => x.objId))
|
|
|
{
|
|
|
if (ct.IsCancellationRequested)
|
|
|
{
|
|
|
_logger.Info($"任务 {task.taskCode} 被中断,当前步骤 {detail.objId} 未执行");
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
_logger.Info($"子任务 {task.taskCode}-{detail.objId},设备类型 {detail.deviceType}");
|
|
|
|
|
|
if (detail.taskStatus == 2 || detail.taskStatus == 3)
|
|
|
{
|
|
|
_logger.Info($"子任务 {task.taskCode}-{detail.objId},已下发,不再重复下发");
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
var success = detail.deviceType switch
|
|
|
{
|
|
|
1 => DispatchToAgv(detail),
|
|
|
2 => DispatchToHoist(detail),
|
|
|
_ => true
|
|
|
};
|
|
|
|
|
|
if (success)
|
|
|
{
|
|
|
detail.taskStatus = 2;
|
|
|
_taskDetailService.Update(detail);
|
|
|
_logger.Info($"子任务 {task.taskCode}-{detail.objId} 下发成功");
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
_logger.Error($"子任务 {task.taskCode}-{detail.objId} 下发失败,中断后续步骤");
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if (ct.IsCancellationRequested) return;
|
|
|
|
|
|
task.taskStatus = 3;
|
|
|
_taskQueueService.Update(task);
|
|
|
_logger.Info($"任务 {task.taskCode} 执行完成");
|
|
|
}
|
|
|
|
|
|
private bool DispatchToAgv(LiveTaskDetail detail)
|
|
|
{
|
|
|
if (detail.taskCode == "2026051816004580")
|
|
|
{
|
|
|
Task.Delay(1000 * 3).Wait();
|
|
|
}
|
|
|
_logger.Info($"AGV 下发: {detail.taskCode}-{detail.objId},起点 {detail.startPoint} → 终点 {detail.endPoint}");
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
private bool DispatchToHoist(LiveTaskDetail detail)
|
|
|
{
|
|
|
if (detail.taskCode == "2026050700001")
|
|
|
{
|
|
|
Task.Delay(1000 * 3).Wait();
|
|
|
}
|
|
|
_logger.Info($"提升机下发: {detail.taskCode}-{detail.objId},起点 {detail.startPoint} → 终点 {detail.endPoint}");
|
|
|
return true;
|
|
|
}
|
|
|
}
|