IIdleRobotYieldService.cs 2.86 KB
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);

    /// <summary>
    /// 尝试继续下发让行分段路径。
    /// 返回 true 表示存在让行上下文并已处理(包含等待中),false 表示无让行上下文可处理。
    /// </summary>
    Task<bool> TryContinueYieldDispatchAsync(
        string robotManufacturer,
        string robotSerialNumber,
        CancellationToken ct = default);
}