| | |
| | | using Microsoft.Extensions.Logging; |
| | | using Quartz; |
| | | using System.Net; |
| | | using WIDESEA_Core; |
| | | using WIDESEAWCS_Common; |
| | | using WIDESEAWCS_Core.Caches; |
| | | using WIDESEAWCS_Core.Helper; |
| | | using WIDESEAWCS_Core.LogHelper; |
| | |
| | | [DisallowConcurrentExecution] |
| | | public class RobotJob : IJob |
| | | { |
| | | /// <summary> |
| | | /// 任务总数上限 |
| | | /// </summary> |
| | | /// <remarks> |
| | | /// 当机器人处理的货物数量达到此上限时,不再下发新任务。 |
| | | /// 防止机器人过度劳累或系统过载。 |
| | | /// </remarks> |
| | | private const int MaxTaskTotalNum = 48; |
| | | |
| | | /// <summary> |
| | | /// 消息事件订阅标志 |
| | | /// </summary> |
| | |
| | | ITaskService taskService, |
| | | ICacheService cache, |
| | | HttpClientHelper httpClientHelper, |
| | | ILogger<RobotJob> logger) |
| | | ILogger<RobotJob> logger, |
| | | IFakeBatteryPositionService fakeBatteryPositionService) |
| | | { |
| | | // 初始化状态管理器,传入缓存服务 |
| | | _stateManager = new RobotStateManager(cache); |
| | | _stateManager = new RobotStateManager(cache, _logger); |
| | | _logger = logger; |
| | | |
| | | // 创建 Socket 网关,封装 TcpSocketServer 的访问 |
| | |
| | | ISocketClientGateway socketGateway = new SocketClientGateway(tcpSocket); |
| | | |
| | | // 初始化任务处理器 |
| | | _taskProcessor = new RobotTaskProcessor(socketGateway, _stateManager, robotTaskService, taskService, httpClientHelper); |
| | | _taskProcessor = new RobotTaskProcessor(socketGateway, _stateManager, robotTaskService, taskService, httpClientHelper, _logger, fakeBatteryPositionService); |
| | | |
| | | // 初始化客户端管理器 |
| | | _clientManager = new RobotClientManager(tcpSocket, _stateManager); |
| | | _clientManager = new RobotClientManager(tcpSocket, _stateManager, _logger); |
| | | |
| | | // 初始化命令处理器 |
| | | // 简单命令处理器:处理状态更新等简单命令 |
| | | var simpleCommandHandler = new RobotSimpleCommandHandler(_taskProcessor); |
| | | var simpleCommandHandler = new RobotSimpleCommandHandler(_taskProcessor, socketGateway); |
| | | // 前缀命令处理器:处理 pickfinished、putfinished 等带参数的命令 |
| | | var prefixCommandHandler = new RobotPrefixCommandHandler(robotTaskService, _taskProcessor, _stateManager, socketGateway); |
| | | |
| | |
| | | _messageRouter = new RobotMessageHandler(socketGateway, _stateManager, cache, simpleCommandHandler, prefixCommandHandler, logger); |
| | | |
| | | // 初始化工作流编排器 |
| | | _workflowOrchestrator = new RobotWorkflowOrchestrator(_stateManager, _clientManager, _taskProcessor, robotTaskService); |
| | | _workflowOrchestrator = new RobotWorkflowOrchestrator(_stateManager, _clientManager, _taskProcessor, robotTaskService, _logger); |
| | | |
| | | // 订阅客户端断开连接事件 |
| | | _clientManager.OnClientDisconnected += OnClientDisconnected; |
| | |
| | | return; |
| | | } |
| | | |
| | | if (state.CurrentAction == "Picking" || state.CurrentAction == "Puting") |
| | | { |
| | | return; |
| | | } |
| | | |
| | | // 轮询获取该设备的待处理任务 |
| | | var task = _taskProcessor.GetTask(robotCrane); |
| | | |
| | | // 如果没有获取到待处理任务,且RobotArmObject为1(有物料),则获取该设备执行中的任务 |
| | | if (task == null && state.RobotArmObject == 1) |
| | | { |
| | | task = _taskProcessor.GetExecutingTask(robotCrane); |
| | | } |
| | | |
| | | // 如果有待处理任务 |
| | | if (task != null) |
| | |
| | | } |
| | | |
| | | // 检查任务总数是否未达到上限 |
| | | if (latestState.RobotTaskTotalNum < MaxTaskTotalNum) |
| | | if (latestState.RobotTaskTotalNum < RobotConst.MaxTaskTotalNum) |
| | | { |
| | | // 调用工作流编排器执行任务 |
| | | // 编排器会根据当前状态决定下一步动作 |
| | |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |