RobotTaskCancelledDomainEventHandler.cs
2.63 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
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();
}
}
}
}