namespace Admin.NET.Plugin.AiDOP.Entity.S8;
///
/// S8-HANDLER-POOL-1:规则的处理账号池成员。回答「哪些账号负责这条规则」。
///
/// 与「异常操作权限」正交:后者()
/// 回答「这个角色能不能做认领这类事」,本表回答「这个账号负不负责这条规则」。
/// 最终能否认领 = 动作权限 ∩ 规则责任 ∩ 状态机,三者缺一不可。
///
/// 身份用 rule_code 而不是 rule_id:
/// S8RuleProvisioningService 的身份口径就是 (TenantId, RuleCode),
/// 而 ado_s8_watch_rule 的行是可以被重建的 —— 上一批的 clean reset 之后
/// provisioning 会新建行、id 全部变化。绑 id 会让人员池在那一刻集体失联,
/// 而且不报错:规则照常跑,只是谁都不再"负责"它。
///
/// 为什么不塞进 params_json:① 认领资格、可见性过滤、通知收件人解析
/// 都需要「按 user 反查规则」与「与 SysUser 关联校验租户/启用」,JSON 数组做不到;
/// ② 该字段有事故先例 —— PUT /params {"enabled":false} 曾把整块 JSON 抹成 NULL,
/// 把「谁能处理」放进同一个易被整体重写的 blob 等于让它暴露在同一类静默失效下;
/// ③ 去重与合法性可由唯一索引在 DB 层保证,JSON 只能靠应用层自觉。
///
[SugarTable("ado_s8_rule_handler_user", "S8 规则处理账号池")]
[SugarIndex("uk_s8_rule_handler", nameof(TenantId), OrderByType.Asc, nameof(RuleCode), OrderByType.Asc, nameof(UserId), OrderByType.Asc, IsUnique = true)]
[SugarIndex("idx_s8_rule_handler_user", nameof(TenantId), OrderByType.Asc, nameof(UserId), OrderByType.Asc)]
public class AdoS8RuleHandlerUser
{
[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;
/// 处理账号(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; }
}