RobotTaskCancelledDomainEventHandler.cs 2.63 KB
using Microsoft.Extensions.Logging;
using Rcs.Application.Services.Protocol;
using Rcs.Domain.Entities.DomainEvents.Robot;
using Rcs.Domain.Extensions;
using Rcs.Domain.Repositories;

namespace Rcs.Infrastructure.MessageBus.Handlers.Events.Robot
{
    /// <summary>
    /// 机器人任务取消领域事件处理器
    /// 负责向机器人下发取消指令并更新任务状态
    /// 支持多协议类型(VDA5050、自定义协议等)
    /// @author zzy
    /// </summary>
    public class RobotTaskCancelledDomainEventHandler
    {
        private readonly ILogger<RobotTaskCancelledDomainEventHandler> _logger;
        private readonly IProtocolServiceFactory _protocolServiceFactory;
        private readonly IRobotRepository _robotRepository;
        private readonly IRobotTaskRepository _robotTaskRepository;

        public RobotTaskCancelledDomainEventHandler(
            ILogger<RobotTaskCancelledDomainEventHandler> logger,
            IProtocolServiceFactory protocolServiceFactory,
            IRobotRepository robotRepository,
            IRobotTaskRepository robotTaskRepository)
        {
            _logger = logger;
            _protocolServiceFactory = protocolServiceFactory;
            _robotRepository = robotRepository;
            _robotTaskRepository = robotTaskRepository;
        }

        public async System.Threading.Tasks.Task Handle(RobotTaskCancelledDomainEvent domainEvent)
        {
            _logger.LogInformation(
                "RobotTaskCancelledDomainEvent - 机器人ID: {RobotId}, 序列号: {RobotSerialNumber}",
                domainEvent.RobotId,
                domainEvent.RobotSerialNumber);

            // 获取机器人实体以确定协议类型
            var robot = await _robotRepository.GetByIdAsync(domainEvent.RobotId);
            if (robot == null)
            {
                _logger.LogError("机器人不存在: {RobotId}", domainEvent.RobotId);
                throw new BusinessException($"机器人不存在: {domainEvent.RobotId}");
            }

            // 根据协议类型获取对应的协议服务
            var protocolService = _protocolServiceFactory.GetService(robot);

            // 取消所有任务
            await protocolService.CancelRobotTasksAsync(robot);

            // 确认异常(仅自定义协议需要)
            await protocolService.ConfirmExceptionAsync(robot);

            // 取消该机器人执行中的任务
            var inProgressTasks = await _robotTaskRepository.GetnProgressByRobotIdAsync(domainEvent.RobotId);
            foreach (var task in inProgressTasks)
            {
                task.Cancel();
            }
        }
    }
}