| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 |
- namespace Admin.NET.Plugin.AiDOP.Service.S8;
- /// <summary>
- /// S8-RULE-GOVERNANCE-BATCH1:监控规则**运行参数**的部分更新载荷。
- ///
- /// <para><b>PATCH 语义(G1 的直接修复)</b>:每个字段都是可空的,
- /// <b>null / 未提供 = 保持原值</b>。旧的 <c>S8WatchRuleParamsPayload</c> 用的是
- /// "整块覆盖 + 缺字段即置 NULL",于是一次 <c>{"enabled":false}</c> 就把 params_json 抹成 NULL,
- /// 规则的全部业务配置随之消失(本地 Rule 01 已实测发生:13:34 还在正常命中,
- /// 13:40 一次关开关之后 params_json = NULL)。
- /// 这里绝不再依赖"前端每次把整块数据带回来"这种客户端自觉。</para>
- ///
- /// <para><b>本批不支持"清空"语义</b>:两个部门兜底字段传 null 表示"不改",
- /// 而不是"清空"。要清空需要能区分「没传」与「显式传 null」,
- /// 而 MVC 这里走的是 Newtonsoft 管线,可靠地做出这个区分需要额外的 Optional 包装 +
- /// 自定义转换器。本批不引入 —— 清空能力没有当前需求,为它加一层反序列化魔法
- /// 反而制造新的静默失败面。缺口已登记,需要时单独做。</para>
- ///
- /// <para><b>Definition 字段一律拒绝,而不是忽略</b>:见 <see cref="RejectedDefinitionFields"/>。
- /// 静默忽略会让调用方以为改成功了 —— 那是比报错更糟的失败形态。</para>
- /// </summary>
- public sealed class S8RuleParametersPayload
- {
- // ───────────────── 白名单:真正的运行策略 ─────────────────
- /// <summary>轮询间隔(秒)。取值域由该规则的 Definition 声明。</summary>
- public int? PollIntervalSeconds { get; set; }
- /// <summary>连续命中 N 次才建单。</summary>
- public int? TriggerCountRequired { get; set; }
- /// <summary>连续未命中 N 次才标 recovered。</summary>
- public int? RecoverCountRequired { get; set; }
- /// <summary>宽限分钟。</summary>
- public int? GraceMinutes { get; set; }
- /// <summary>严重度。必须在 Definition 的 AllowedSeverities 内。</summary>
- public string? Severity { get; set; }
- /// <summary>发生部门兜底。</summary>
- public long? DefaultOccurrenceDeptId { get; set; }
- /// <summary>责任部门兜底。</summary>
- public long? DefaultResponsibleDeptId { get; set; }
- // ───────────────── 毒丸:出现即拒绝 ─────────────────
- //
- // 这些属性存在的**唯一**目的是让旧客户端(或试图绕过治理的调用)得到明确的 400,
- // 而不是一个"成功但什么都没发生"的 200。
- //
- // 为什么用显式属性而不是依赖序列化器的 unknown-member 拒绝:
- // 本仓 MVC 走 AddNewtonsoftJson(Admin.NET.Web.Core/Startup.cs),
- // System.Text.Json 的 [JsonUnmappedMemberHandling] 在此不生效;
- // Newtonsoft 的 MissingMemberHandling 又是全局设置,改它会外溢到 S0–S7 所有接口。
- // 声明毒丸属性是唯一既精确、又不依赖序列化器配置的做法。
- /// <summary>已退役。params_json 不再由本接口整块写入。</summary>
- public string? ParamsJson { get; set; }
- /// <summary>已退役。启停走 /enable 与 /disable,见 <c>AdoS8ConfigWatchRulesController</c>。</summary>
- public bool? Enabled { get; set; }
- /// <summary>已退役:由代码定义。</summary>
- public string? DatasetCode { get; set; }
- /// <summary>已退役:由代码定义。</summary>
- public string? RuleType { get; set; }
- /// <summary>已退役:由代码定义。</summary>
- public string? SourceObjectType { get; set; }
- /// <summary>已退役:由代码定义。</summary>
- public string? ExceptionTypeCode { get; set; }
- /// <summary>已退役:由代码定义。</summary>
- public string? SceneCode { get; set; }
- /// <summary>已退役:由代码定义(原可经 /params 修改)。</summary>
- public string? StageCode { get; set; }
- /// <summary>已退役:由代码定义(原可经 /params 修改)。</summary>
- public string? OrderFlowCode { get; set; }
- /// <summary>已退役:由代码定义(原可经 /params 修改)。</summary>
- public string? RuleMechanism { get; set; }
- /// <summary>已退役:由代码定义。</summary>
- public string? DueAtField { get; set; }
- /// <summary>已退役:由代码定义。</summary>
- public string? StatusField { get; set; }
- /// <summary>已退役:由代码定义(它决定去重身份)。</summary>
- public string? ObjectIdField { get; set; }
- /// <summary>已退役:由代码定义。</summary>
- public string? ObjectCodeField { get; set; }
- /// <summary>已退役:由代码定义。</summary>
- public string[]? CompletedStates { get; set; }
- /// <summary>
- /// 本次请求中出现的、已退役的 Definition 字段名。为空表示载荷合法。
- /// </summary>
- public IReadOnlyList<string> RejectedDefinitionFields
- {
- get
- {
- var found = new List<string>();
- void Check(string name, bool present) { if (present) found.Add(name); }
- Check("paramsJson", ParamsJson != null);
- Check("enabled", Enabled.HasValue);
- Check("datasetCode", DatasetCode != null);
- Check("ruleType", RuleType != null);
- Check("sourceObjectType", SourceObjectType != null);
- Check("exceptionTypeCode", ExceptionTypeCode != null);
- Check("sceneCode", SceneCode != null);
- Check("stageCode", StageCode != null);
- Check("orderFlowCode", OrderFlowCode != null);
- Check("ruleMechanism", RuleMechanism != null);
- Check("dueAtField", DueAtField != null);
- Check("statusField", StatusField != null);
- Check("objectIdField", ObjectIdField != null);
- Check("objectCodeField", ObjectCodeField != null);
- Check("completedStates", CompletedStates != null);
- return found;
- }
- }
- }
- /// <summary>
- /// S8-SCHED-FRONTEND-1:调度参数安全更新载荷(保留兼容)。
- /// 三个字段现已并入 <see cref="S8RuleParametersPayload"/>,本类型仅供既有
- /// <c>PUT /{id}/schedule</c> 路由继续工作;服务端实现已委托到同一条参数写入路径。
- /// </summary>
- public sealed class S8WatchRuleSchedulePayload
- {
- public int PollIntervalSeconds { get; set; } = 300;
- public int TriggerCountRequired { get; set; } = 1;
- public int RecoverCountRequired { get; set; } = 1;
- }
|