AdoS8RuleHandlerUser.cs 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. namespace Admin.NET.Plugin.AiDOP.Entity.S8;
  2. /// <summary>
  3. /// S8-HANDLER-POOL-1:规则的<b>处理账号池</b>成员。回答「哪些账号负责这条规则」。
  4. ///
  5. /// <para><b>与「异常操作权限」正交</b>:后者(<see cref="AdoS8ExceptionActionRole"/>)
  6. /// 回答「这个角色能不能做认领这类事」,本表回答「这个账号负不负责这条规则」。
  7. /// 最终能否认领 = 动作权限 ∩ 规则责任 ∩ 状态机,三者缺一不可。</para>
  8. ///
  9. /// <para><b>身份用 <c>rule_code</c> 而不是 <c>rule_id</c></b>:
  10. /// <c>S8RuleProvisioningService</c> 的身份口径就是 <c>(TenantId, RuleCode)</c>,
  11. /// 而 <c>ado_s8_watch_rule</c> 的行是可以被重建的 —— 上一批的 clean reset 之后
  12. /// provisioning 会新建行、id 全部变化。绑 id 会让人员池在那一刻集体失联,
  13. /// 而且不报错:规则照常跑,只是谁都不再"负责"它。</para>
  14. ///
  15. /// <para><b>为什么不塞进 <c>params_json</c></b>:① 认领资格、可见性过滤、通知收件人解析
  16. /// 都需要「按 user 反查规则」与「与 SysUser 关联校验租户/启用」,JSON 数组做不到;
  17. /// ② 该字段有事故先例 —— <c>PUT /params {"enabled":false}</c> 曾把整块 JSON 抹成 NULL,
  18. /// 把「谁能处理」放进同一个易被整体重写的 blob 等于让它暴露在同一类静默失效下;
  19. /// ③ 去重与合法性可由唯一索引在 DB 层保证,JSON 只能靠应用层自觉。</para>
  20. /// </summary>
  21. [SugarTable("ado_s8_rule_handler_user", "S8 规则处理账号池")]
  22. [SugarIndex("uk_s8_rule_handler", nameof(TenantId), OrderByType.Asc, nameof(RuleCode), OrderByType.Asc, nameof(UserId), OrderByType.Asc, IsUnique = true)]
  23. [SugarIndex("idx_s8_rule_handler_user", nameof(TenantId), OrderByType.Asc, nameof(UserId), OrderByType.Asc)]
  24. public class AdoS8RuleHandlerUser
  25. {
  26. [SugarColumn(ColumnName = "id", IsPrimaryKey = true, IsIdentity = true, ColumnDataType = "bigint")]
  27. public long Id { get; set; }
  28. /// <summary>租户。<b>唯一安全边界</b>;工厂不参与。</summary>
  29. [SugarColumn(ColumnName = "tenant_id", ColumnDataType = "bigint")]
  30. public long TenantId { get; set; }
  31. /// <summary>规则编码(与 provisioning 身份口径一致,不用 rule_id)。</summary>
  32. [SugarColumn(ColumnName = "rule_code", Length = 128)]
  33. public string RuleCode { get; set; } = string.Empty;
  34. /// <summary>处理账号(<c>SysUser.Id</c>)。写入时经 <c>S8UserScopeValidator</c> 校验同租户 + 启用。</summary>
  35. [SugarColumn(ColumnName = "user_id", ColumnDataType = "bigint")]
  36. public long UserId { get; set; }
  37. [SugarColumn(ColumnName = "created_at")]
  38. public DateTime CreatedAt { get; set; } = DateTime.Now;
  39. [SugarColumn(ColumnName = "created_by", Length = 64, IsNullable = true)]
  40. public string? CreatedBy { get; set; }
  41. }