IVdaOrderGateService.cs 3.64 KB
using Rcs.Domain.Entities;

namespace Rcs.Application.Services.Protocol;

public enum VdaOrderChannel
{
    Normal = 0,
    Yield = 1
}

public enum VdaOrderSessionStatus
{
    Sending = 0,
    Sent = 1,
    Failed = 2,
    Completed = 3
}

public interface IVdaOrderGateLease : IAsyncDisposable
{
    Guid RobotId { get; }
    string GateKey { get; }
}

public sealed class VdaOrderGateSession
{
    public Guid RobotId { get; set; }
    public VdaOrderChannel Channel { get; set; }
    public string OrderId { get; set; } = string.Empty;
    public int OrderUpdateId { get; set; }
    public VdaOrderSessionStatus Status { get; set; }
    public DateTime UpdatedAt { get; set; }
    public string? PrecheckReason { get; set; }
}

public sealed class VdaOrderGateAcquireResult
{
    public bool Success { get; init; }
    public string Message { get; init; } = string.Empty;
    public string GateKey { get; init; } = string.Empty;
    public IVdaOrderGateLease? Lease { get; init; }
    public VdaOrderGateSession? CurrentSession { get; init; }
}

public sealed class VdaOrderUpdatePrecheckResult
{
    public bool Success { get; init; }
    public string Reason { get; init; } = string.Empty;
    public RobotStatus? RobotStatus { get; init; }
    public string? CurrentOrderId { get; init; }
    public uint? CurrentOrderUpdateId { get; init; }
    public DateTime? StateTimestampUtc { get; init; }
}

public interface IVdaOrderGateService
{
    Task<VdaOrderGateAcquireResult> TryAcquireAsync(
        Guid robotId,
        VdaOrderChannel channel,
        string orderId,
        int orderUpdateId,
        CancellationToken ct = default);

    Task MarkSessionSendingAsync(
        Guid robotId,
        VdaOrderChannel channel,
        string orderId,
        int orderUpdateId,
        string? precheckReason = null,
        CancellationToken ct = default);

    Task MarkSessionSentAsync(
        Guid robotId,
        VdaOrderChannel channel,
        string orderId,
        int orderUpdateId,
        CancellationToken ct = default);

    Task MarkSessionFailedAsync(
        Guid robotId,
        VdaOrderChannel channel,
        string orderId,
        int orderUpdateId,
        string? precheckReason = null,
        CancellationToken ct = default);

    Task MarkSessionCompletedAsync(
        Guid robotId,
        VdaOrderChannel channel,
        string orderId,
        int orderUpdateId,
        CancellationToken ct = default);

    Task<VdaOrderGateSession?> GetSessionAsync(Guid robotId, CancellationToken ct = default);

    Task<bool> HasActiveYieldSessionAsync(
        Guid robotId,
        string? currentOrderId,
        uint? currentOrderUpdateId,
        string? lastNodeCode,
        CancellationToken ct = default);

    Task<VdaOrderUpdatePrecheckResult> ValidateOrderUpdatePrecheckAsync(
        Guid robotId,
        VdaOrderChannel channel,
        string? manufacturer,
        string serialNumber,
        string orderId,
        int orderUpdateId,
        CancellationToken ct = default);

    Task<int> RegisterNormalPrecheckFailureAsync(
        Guid robotId,
        string? precheckReason,
        CancellationToken ct = default);

    Task ResetNormalPrecheckFailuresAsync(Guid robotId, CancellationToken ct = default);

    Task ClearSessionAsync(Guid robotId, CancellationToken ct = default);

    Task RecordOrderUpdateDowngradeAsync(
        Guid robotId,
        VdaOrderChannel channel,
        string orderId,
        int orderUpdateId,
        string? precheckReason,
        CancellationToken ct = default);

    Task RecordOrderRecoveryResetAsync(
        Guid robotId,
        string orderId,
        string? precheckReason,
        CancellationToken ct = default);
}