namespace Admin.NET.Plugin.AiDOP.Entity.SmartOps; /// /// ETL 执行机指派。全表**只有一行**,记录当前被指派跑定时 ETL 的**槽位**。 /// /// 为什么指派不能存在 ado_etl_instance 上:实例标识是 /// 机器名:进程ID:启动时间(见 AidopInstanceIdentity,进程级唯一是刻意的), /// 于是「指派」一旦挂在实例行上,就绑死在一次进程化身上——执行机每重启一次, /// 指派必然留在一行死记录上,全库变成零台存活执行机,定时 ETL 静默停摆。 /// 2026-09-28 实测即是此情形:03:40 扇出 28 条 AUTO_NIGHTLY 的实例 04:10 退出, /// 队列此后无人可领。角色是部署槽位的属性,不是进程化身的属性,故独立成表。 /// /// 「最多一台执行机」由结构保证:主键固定为 , /// 表里放不下第二行,无需再靠事务先清后置。这比原来的写入侧约束更强—— /// 并发指派会被主键挡住,而不是依赖调用方守规矩。 /// /// 无租户列是刻意的:指派是部署事实,不属于任何租户。 /// 本类不实现租户过滤接口,SqlSugar 不会给它加租户条件。 /// [SugarTable("ado_etl_runner_designation", "ETL执行机指派")] public class AdoEtlRunnerDesignation { /// 全表唯一一行的主键值。 public const long SingletonId = 1; [SugarColumn(ColumnName = "id", IsPrimaryKey = true, IsIdentity = false)] public long Id { get; set; } = SingletonId; /// /// 被指派的槽位码,与进程侧 AidopInstanceIdentity.SlotCode 比对。 /// 为 null / 空表示「当前无指派」——此后无人跑定时 ETL,这是允许的状态。 /// [SugarColumn(ColumnName = "slot_code", Length = 128, IsNullable = true)] public string SlotCode { get; set; } /// 操作人账号,仅供审计与页面展示。 [SugarColumn(ColumnName = "assigned_by", Length = 64, IsNullable = true)] public string AssignedBy { get; set; } [SugarColumn(ColumnName = "assigned_at", IsNullable = true)] public DateTime? AssignedAt { get; set; } [SugarColumn(ColumnName = "remark", Length = 512, IsNullable = true)] public string Remark { get; set; } [SugarColumn(ColumnName = "create_time")] public DateTime CreateTime { get; set; } [SugarColumn(ColumnName = "update_time")] public DateTime UpdateTime { get; set; } }