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