VdaStateSessionGuardEvaluator.cs 1.81 KB
using Rcs.Application.Services.Protocol;

namespace Rcs.Infrastructure.Services.Protocol;

/// <summary>
/// VDA State 与最新 Normal 下发会话的强一致判定器。
/// </summary>
internal static class VdaStateSessionGuardEvaluator
{
    /// <summary>
    /// 判断当前 State 是否覆盖最近一次 Normal 通道下发会话。
    /// 返回 true 表示可放行;false 表示必须阻断。
    /// </summary>
    public static bool IsStateCoveringLatestNormalSession(
        VdaOrderGateSession? session,
        string? stateOrderId,
        uint? stateOrderUpdateId,
        out string reason)
    {
        if (session == null)
        {
            reason = "no_active_normal_session";
            return true;
        }

        if (session.Channel != VdaOrderChannel.Normal)
        {
            reason = "non_normal_session";
            return true;
        }

        if (session.Status is VdaOrderSessionStatus.Failed or VdaOrderSessionStatus.Completed)
        {
            reason = "normal_session_inactive";
            return true;
        }

        if (session.Status is not (VdaOrderSessionStatus.Sending or VdaOrderSessionStatus.Sent))
        {
            reason = "normal_session_unchecked_status";
            return true;
        }

        if (!string.Equals(stateOrderId ?? string.Empty, session.OrderId ?? string.Empty, StringComparison.OrdinalIgnoreCase))
        {
            reason = "state_order_id_mismatch";
            return false;
        }

        var expectedOrderUpdateId = (uint)Math.Max(0, session.OrderUpdateId);
        var currentOrderUpdateId = stateOrderUpdateId ?? 0u;
        if (currentOrderUpdateId < expectedOrderUpdateId)
        {
            reason = "state_order_update_not_caught_up";
            return false;
        }

        reason = "ok";
        return true;
    }
}