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; } }