INetActionExecutionService.cs 4.14 KB
using Rcs.Application.Common;
using Rcs.Application.Services.PathFind.Models;
using Rcs.Domain.Entities;

namespace Rcs.Application.Services.PathFind;

/// <summary>
/// 网络动作执行服务接口
/// 负责执行路径段终点的网络动作(HTTP请求),并管理执行状态
/// @author zzy
/// </summary>
public interface INetActionExecutionService
{
    /// <summary>
    /// 检查路径段是否需要执行网络动作
    /// @author zzy
    /// </summary>
    /// <param name="request">检查请求</param>
    /// <returns>检查结果</returns>
    Task<SegmentNetActionCheckResult> CheckSegmentNetActionsAsync(SegmentNetActionCheckRequest request);

    /// <summary>
    /// 执行网络动作
    /// @author zzy
    /// </summary>
    /// <param name="request">执行请求</param>
    /// <returns>执行结果</returns>
    Task<NetActionExecuteResult> ExecuteNetActionAsync(NetActionExecuteRequest request);

    /// <summary>
    /// 批量执行多个网络动作
    /// @author zzy
    /// </summary>
    /// <param name="requests">执行请求列表</param>
    /// <returns>执行结果</returns>
    Task<NetActionExecuteResult> ExecuteNetActionsAsync(List<NetActionExecuteRequest> requests);

    /// <summary>
    /// 获取网络动作执行上下文
    /// @author zzy
    /// </summary>
    /// <param name="contextId">上下文ID</param>
    /// <returns>执行上下文,不存在返回null</returns>
    Task<NetActionExecutionContext?> GetExecutionContextAsync(string contextId);

    /// <summary>
    /// 处理异步回调
    /// @author zzy
    /// </summary>
    /// <param name="request">回调请求</param>
    /// <returns>回调响应</returns>
    Task<NetActionCallbackResponse> HandleCallbackAsync(NetActionCallbackRequest request);

    /// <summary>
    /// 检查指定路径段是否有正在进行的网络动作
    /// @author zzy
    /// </summary>
    /// <param name="robotId">机器人ID</param>
    /// <param name="taskId">任务ID</param>
    /// <param name="subTaskId">子任务ID</param>
    /// <param name="junctionIndex">路口段索引</param>
    /// <param name="resourceIndex">资源段索引</param>
    /// <returns>是否有进行中的网络动作</returns>
    Task<bool> HasInProgressNetActionAsync(
        Guid robotId,
        Guid taskId,
        Guid subTaskId,
        int junctionIndex,
        int resourceIndex);

    /// <summary>
    /// 检查指定任务是否有等待异步响应的网络动作
    /// @author zzy
    /// </summary>
    /// <param name="robotId">机器人ID</param>
    /// <param name="taskId">任务ID</param>
    /// <param name="subTaskId">子任务ID</param>
    /// <returns>是否有等待异步响应的网络动作</returns>
    Task<bool> HasWaitingAsyncResponseAsync(Guid robotId, Guid taskId, Guid subTaskId);

    /// <summary>
    /// 尝试继续发送下一段(网络动作执行成功后调用)
    /// @author zzy
    /// </summary>
    /// <param name="contextId">上下文ID</param>
    /// <returns>操作结果</returns>
    Task<ApiResponse> TryContinueToNextSegmentAsync(string contextId);

    /// <summary>
    /// 取消指定任务的所有网络动作
    /// @author zzy
    /// </summary>
    /// <param name="robotId">机器人ID</param>
    /// <param name="taskId">任务ID</param>
    /// <param name="subTaskId">子任务ID</param>
    /// <returns>取消的数量</returns>
    Task<int> CancelTaskNetActionsAsync(Guid robotId, Guid taskId, Guid subTaskId);

    /// <summary>
    /// 清理过期的网络动作上下文
    /// @author zzy
    /// </summary>
    /// <returns>清理的数量</returns>
    Task<int> CleanExpiredContextsAsync();

    /// <summary>
    /// 检查并处理超时的异步网络动作
    /// @author zzy
    /// 2026-02-07 新增
    /// </summary>
    /// <returns>处理的超时动作数量</returns>
    Task<int> CheckAndHandleTimeoutActionsAsync();

    /// <summary>
    /// 重试失败的网络动作
    /// @author zzy
    /// 2026-02-07 新增
    /// </summary>
    /// <param name="contextId">上下文ID</param>
    /// <returns>重试结果</returns>
    Task<NetActionExecuteResult> RetryNetActionAsync(string contextId);
}