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