IIdleRobotYieldService.cs
2.5 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
using Rcs.Application.Services.PathFind.Realtime;
using Rcs.Application.Services.PathFind.Models;
using Rcs.Domain.Entities;
namespace Rcs.Application.Services;
/// <summary>
/// 空闲机器人让行服务接口。
/// 当执行任务的机器人路径被空闲机器人阻挡时,主动请求空闲机器人移开。
/// @author zzy
/// </summary>
public interface IIdleRobotYieldService
{
/// <summary>
/// 执行空闲机器人让行(直接下发临时订单,不创建任务记录)。
/// </summary>
/// <param name="request">让行请求</param>
/// <param name="ct">取消令牌</param>
/// <returns>让行结果</returns>
Task<IdleYieldResult> ExecuteYieldAsync(
IdleRobotYieldRequest request,
Robot requestingRobot,
VdaSegmentedPathCache requestingCache,
CancellationToken ct = default);
/// <summary>
/// 查找指定节点附近的可用让行目标节点。
/// 优先级:等待区节点 > 泊车位节点 > 侧向节点 > 相邻空闲节点
/// </summary>
/// <param name="mapId">地图ID</param>
/// <param name="mapCode">地图编码</param>
/// <param name="robot">待让行的空闲机器人</param>
/// <param name="blockingAnchorNodeCode">阻塞资源锚点节点编码</param>
/// <param name="idleCurrentNodeCode">空闲机器人当前位置节点编码</param>
/// <param name="idleCurrentTheta">空闲机器人当前位置朝向(弧度)</param>
/// <param name="excludeRobotId">排除的机器人ID(自身)</param>
/// <returns>目标节点编码,无可用节点时返回null</returns>
Task<string?> FindNearestYieldTargetAsync(
Guid mapId,
string mapCode,
Robot robot,
string blockingAnchorNodeCode,
string idleCurrentNodeCode,
double idleCurrentTheta,
Guid excludeRobotId,
Robot requestingRobot,
VdaSegmentedPathCache requestingCache,
CancellationToken ct = default);
/// <summary>
/// 检查机器人是否在让行冷却期内(避免频繁请求同一机器人让行)。
/// </summary>
/// <param name="robotId">机器人ID</param>
/// <returns>是否在冷却期内</returns>
Task<bool> IsInYieldCooldownAsync(Guid robotId);
/// <summary>
/// 设置机器人让行冷却期。
/// </summary>
/// <param name="robotId">机器人ID</param>
/// <param name="cooldownSeconds">冷却时长(秒)</param>
Task SetYieldCooldownAsync(Guid robotId, int cooldownSeconds);
}