RobotStatusChangedDomainEventHandler.cs 3 KB
using Microsoft.Extensions.Logging;
using Rcs.Domain.Entities.DomainEvents;

namespace Rcs.Infrastructure.MessageBus.Handlers.Events
{
    /// <summary>
    /// 机器人状态变更领域事件处理器
    /// </summary>
    public class RobotStatusChangedDomainEventHandler
    {
        private readonly ILogger<RobotStatusChangedDomainEventHandler> _logger;

        public RobotStatusChangedDomainEventHandler(ILogger<RobotStatusChangedDomainEventHandler> logger)
        {
            _logger = logger;
        }

        public async Task Handle(RobotStatusChangedDomainEvent domainEvent)
        {
            _logger.LogInformation(
                "处理机器人状态变更领域事件 - 机器人ID: {RobotId}, 编码: {RobotCode}, 旧状态: {OldStatus}, 新状态: {NewStatus}, 在线状态: {OnlineStatus}",
                domainEvent.RobotId,
                domainEvent.RobotCode,
                domainEvent.OldStatus,
                domainEvent.NewStatus,
                domainEvent.OnlineStatus);

            try
            {
                // 在这里处理机器人状态变更事件
                // 例如:
                // 1. 监听电量变化
                // 2. 监听任务状态变化,根据状态触发相应的业务逻辑
                //
                // 位置、方向、错误信息等高苏同步信息直接更新缓存,而不更新数据库,有程序的定时同步同步到数据库。

                // 特殊处理:状态变为错误
                if (domainEvent.NewStatus == Domain.Entities.RobotStatus.Error)
                {
                    _logger.LogWarning(
                        "机器人进入错误状态 - 机器人ID: {RobotId}, 编码: {RobotCode}",
                        domainEvent.RobotId,
                        domainEvent.RobotCode);
                    // 触发告警流程
                }

                // 特殊处理:电量低
                if (domainEvent.BatteryLevel.HasValue && domainEvent.BatteryLevel.Value < 20)
                {
                    _logger.LogWarning(
                        "机器人电量过低 - 机器人ID: {RobotId}, 编码: {RobotCode}, 电量: {BatteryLevel}%",
                        domainEvent.RobotId,
                        domainEvent.RobotCode,
                        domainEvent.BatteryLevel.Value);
                    // 触发低电量处理流程
                }

                await Task.CompletedTask;

                _logger.LogInformation(
                    "机器人状态变更领域事件处理完成 - 机器人ID: {RobotId}, 编码: {RobotCode}",
                    domainEvent.RobotId,
                    domainEvent.RobotCode);
            }
            catch (Exception ex)
            {
                _logger.LogError(ex,
                    "处理机器人状态变更领域事件失败 - 机器人ID: {RobotId}, 编码: {RobotCode}",
                    domainEvent.RobotId,
                    domainEvent.RobotCode);
                throw;
            }
        }
    }
}