using System.Text.Json; namespace Admin.NET.Plugin.AiDOP.Service.S8.Rules; /// /// R2 TIMEOUT 类规则 params_json 解析结果。internal 可见,供测试覆盖。 /// 字段缺失或非法 JSON:调用方负责降级(evaluator 静默返空命中),不在此抛出业务异常。 /// internal sealed class S8TimeoutParams { public string? DueAtField { get; set; } public string? StatusField { get; set; } public List CompletedStates { get; } = new(); public string? ObjectCodeField { get; set; } public string? ObjectIdField { get; set; } public int GraceMinutes { get; set; } public string? ExceptionTypeCode { get; set; } /// 解析 params_json;非法 JSON 抛 ,由上游捕获。 public static S8TimeoutParams Parse(string json) { using var doc = JsonDocument.Parse(json); var root = doc.RootElement; var p = new S8TimeoutParams(); if (root.TryGetProperty("dueAtField", out var v1)) p.DueAtField = v1.GetString(); if (root.TryGetProperty("statusField", out var v2)) p.StatusField = v2.GetString(); if (root.TryGetProperty("objectCodeField", out var v3)) p.ObjectCodeField = v3.GetString(); if (root.TryGetProperty("objectIdField", out var v4)) p.ObjectIdField = v4.GetString(); if (root.TryGetProperty("graceMinutes", out var v5) && v5.ValueKind == JsonValueKind.Number) p.GraceMinutes = v5.GetInt32(); if (root.TryGetProperty("exceptionTypeCode", out var v6)) p.ExceptionTypeCode = v6.GetString(); if (root.TryGetProperty("completedStates", out var v7) && v7.ValueKind == JsonValueKind.Array) { foreach (var s in v7.EnumerateArray()) { var str = s.GetString(); if (!string.IsNullOrWhiteSpace(str)) p.CompletedStates.Add(str!); } } return p; } }