| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- namespace Admin.NET.Plugin.AiDOP.Const.S8;
- /// <summary>
- /// S8-NOTIFY-RECIPIENT-1:通知事件码。
- ///
- /// <para><b>每一条都对应一个真实存在的派发点</b>(见 <c>TriggerHint</c>)。
- /// 刻意不造没有业务入口的事件 —— 配了却永远不触发的通知,比没有通知更难排查。</para>
- /// </summary>
- public static class S8NotifyEventCode
- {
- /// <summary>规则命中建单 / 人工提报建单。</summary>
- public const string ExceptionCreated = "EXCEPTION_CREATED";
- /// <summary>被认领。</summary>
- public const string ExceptionClaimed = "EXCEPTION_CLAIMED";
- /// <summary>被转派。</summary>
- public const string ExceptionTransferred = "EXCEPTION_TRANSFERRED";
- /// <summary>提交复核(等待审核)。</summary>
- public const string VerificationSubmitted = "VERIFICATION_SUBMITTED";
- /// <summary>超时自动升级。</summary>
- public const string EscalationTriggered = "ESCALATION_TRIGGERED";
- /// <summary>检测到恢复。</summary>
- public const string ExceptionRecovered = "EXCEPTION_RECOVERED";
- /// <summary>超时关闭(闭环及时性回顾)。</summary>
- public const string ExceptionOverdueClosed = "EXCEPTION_OVERDUE_CLOSED";
- }
- /// <summary>
- /// 收件人类型。<b>第一版只有四类,全部能真实解析出 SysUserId</b>。
- ///
- /// <para><b>Supervisor 刻意缺席</b>:系统里不存在组织主管关系
- /// (<c>SysOrg.DirectorId</c> 与 <c>SysUser.ManagerUserId</c> 实测填充率均为 0)。
- /// 给一个永远解析为空的选项,等于让管理员配一条永远发不出去的通知。</para>
- /// </summary>
- public static class S8RecipientType
- {
- /// <summary>该规则的处理账号池(复用 P1-C 的 Rule Handler Pool,不复制第二份人员配置)。</summary>
- public const string HandlerPool = "HANDLER_POOL";
- /// <summary>当前处理人(<c>assignee_user_id</c>)。</summary>
- public const string Assignee = "ASSIGNEE";
- /// <summary>
- /// 当前实际审核人。
- /// <para><b>不是新建的 Reviewer Pool</b> —— 它解析的是<b>当前事实</b>:
- /// 优先取单据上的 <c>verifier_user_id</c>(提交复核时手选、真正能点通过/退回的人);
- /// 尚未提交复核时回落到审批流节点解析出的审批人。</para>
- /// </summary>
- public const string Reviewer = "REVIEWER";
- /// <summary>指定账号(多选 SysUser)。</summary>
- public const string SpecificUser = "SPECIFIC_USER";
- }
- /// <summary>事件元信息。</summary>
- public sealed record S8NotifyEventDefinition(string Code, string DisplayName, string TriggerHint, int OrderNo);
- /// <summary>
- /// 事件与收件人类型目录。后端派发、配置校验、前端 UI 三方共用同一份,
- /// 避免出现「页面能配、后端根本不派发」或反之。
- /// </summary>
- public static class S8NotificationCatalog
- {
- public static readonly IReadOnlyList<S8NotifyEventDefinition> Events = new List<S8NotifyEventDefinition>
- {
- new(S8NotifyEventCode.ExceptionCreated, "异常产生", "规则命中建单 / 人工提报", 10),
- new(S8NotifyEventCode.ExceptionClaimed, "认领成功", "POST {id}/claim", 20),
- new(S8NotifyEventCode.ExceptionTransferred, "转派", "POST {id}/transfer", 30),
- new(S8NotifyEventCode.VerificationSubmitted, "提交复核", "POST {id}/submit-verification", 40),
- new(S8NotifyEventCode.EscalationTriggered, "超时升级", "超时自动升级作业", 50),
- new(S8NotifyEventCode.ExceptionRecovered, "异常恢复", "调度器检测到恢复", 60),
- new(S8NotifyEventCode.ExceptionOverdueClosed, "超时关闭", "检验通过后闭环及时性回顾", 70),
- };
- public static readonly IReadOnlyList<string> RecipientTypes = new[]
- {
- S8RecipientType.HandlerPool,
- S8RecipientType.Assignee,
- S8RecipientType.Reviewer,
- S8RecipientType.SpecificUser,
- };
- /// <summary>
- /// 租户级默认配置的 <c>rule_code</c> 哨兵值。
- /// <para>人工提报的异常没有来源规则,它的通知只能落在租户级默认上。
- /// 用显式常量而不是 NULL:NULL 在唯一索引里的比较语义容易让人配出两条"默认"。</para>
- /// </summary>
- public const string TenantDefaultRuleCode = "*";
- private static readonly HashSet<string> EventSet =
- Events.Select(e => e.Code).ToHashSet(StringComparer.OrdinalIgnoreCase);
- private static readonly HashSet<string> TypeSet =
- RecipientTypes.ToHashSet(StringComparer.OrdinalIgnoreCase);
- public static bool IsKnownEvent(string? code) => !string.IsNullOrWhiteSpace(code) && EventSet.Contains(code!);
- public static bool IsKnownRecipientType(string? t) => !string.IsNullOrWhiteSpace(t) && TypeSet.Contains(t!);
- }
|