AdoS8RuleResponsibilityUser.cs 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. namespace Admin.NET.Plugin.AiDOP.Entity.S8;
  2. /// <summary>
  3. /// S8-RESPONSIBILITY-POOL-1:规则的<b>复核账号池</b>与<b>升级账号池</b>成员。
  4. ///
  5. /// <para><b>为什么不含 HANDLER</b>:处理账号池已有 <see cref="AdoS8RuleHandlerUser"/>,
  6. /// 且就绪门禁、认领资格、可见性收敛、通知收件人解析四条生产链路都已依赖它。
  7. /// 把它迁进本表只换来"三种责任长得一样"的观感,代价却是动四条已经跑通的链路 ——
  8. /// 存储差异由统一 reader 收敛在一处,调用方看到的仍是同一套 API。</para>
  9. ///
  10. /// <para><b>身份用 <c>rule_code</c> 而不是 <c>rule_id</c></b>:与
  11. /// <see cref="AdoS8RuleHandlerUser"/> 同口径。<c>ado_s8_watch_rule</c> 的行会被
  12. /// clean reset + provisioning 重建、id 全部变化;绑 id 会让责任池在那一刻集体失联,
  13. /// 而且不报错 —— 规则照常跑,只是谁都不再"负责"它。</para>
  14. ///
  15. /// <para><b>唯一索引带 <c>responsibility_type</c></b>:同一个账号既是复核人又是升级人
  16. /// 是合法配置,两条行必须能共存;而"同一类型下重复配同一人"必须在 DB 层挡住,
  17. /// 不能只靠应用层自觉。</para>
  18. /// </summary>
  19. [SugarTable("ado_s8_rule_responsibility_user", "S8 规则复核/升级账号池")]
  20. [SugarIndex("uk_s8_rule_responsibility", nameof(TenantId), OrderByType.Asc, nameof(RuleCode), OrderByType.Asc, nameof(ResponsibilityType), OrderByType.Asc, nameof(UserId), OrderByType.Asc, IsUnique = true)]
  21. [SugarIndex("idx_s8_rule_responsibility_user", nameof(TenantId), OrderByType.Asc, nameof(UserId), OrderByType.Asc)]
  22. public class AdoS8RuleResponsibilityUser
  23. {
  24. [SugarColumn(ColumnName = "id", IsPrimaryKey = true, IsIdentity = true, ColumnDataType = "bigint")]
  25. public long Id { get; set; }
  26. /// <summary>租户。<b>唯一安全边界</b>;工厂不参与。</summary>
  27. [SugarColumn(ColumnName = "tenant_id", ColumnDataType = "bigint")]
  28. public long TenantId { get; set; }
  29. /// <summary>规则编码(与 provisioning 身份口径一致,不用 rule_id)。</summary>
  30. [SugarColumn(ColumnName = "rule_code", Length = 128)]
  31. public string RuleCode { get; set; } = string.Empty;
  32. /// <summary>责任类型:<c>REVIEWER</c> / <c>ESCALATION</c>(见 <c>S8ResponsibilityType</c>)。</summary>
  33. [SugarColumn(ColumnName = "responsibility_type", Length = 32)]
  34. public string ResponsibilityType { get; set; } = string.Empty;
  35. /// <summary>成员账号(<c>SysUser.Id</c>)。写入时经 <c>S8UserScopeValidator</c> 校验同租户 + 启用。</summary>
  36. [SugarColumn(ColumnName = "user_id", ColumnDataType = "bigint")]
  37. public long UserId { get; set; }
  38. [SugarColumn(ColumnName = "created_at")]
  39. public DateTime CreatedAt { get; set; } = DateTime.Now;
  40. [SugarColumn(ColumnName = "created_by", Length = 64, IsNullable = true)]
  41. public string? CreatedBy { get; set; }
  42. }