namespace Admin.NET.Plugin.AiDOP.Entity.SmartOps;
///
/// ETL 执行机实例注册表。每个连本库的后端进程注册一行并定期心跳,
/// 用于运维在页面上看清「有哪些进程连着这个库、各自属于哪个槽位、还活着没」。
///
/// 本表不再持有执行机指派:指派在 ado_etl_runner_designation,
/// 指向的是 而不是某一行实例。原因见该表注释——
/// instance_id 是进程级标识,把角色挂上去会让每次重启都丢指派。
///
/// 无租户列是刻意的:实例是部署事实,不属于任何租户。
/// 本类不实现租户过滤接口,SqlSugar 不会给它加租户条件。
///
[SugarTable("ado_etl_instance", "ETL执行机实例注册")]
public class AdoEtlInstance
{
[SugarColumn(ColumnName = "id", IsPrimaryKey = true, IsIdentity = true)]
public long Id { get; set; }
/// 形如 机器名:进程ID:启动时间,见 AidopInstanceIdentity。唯一索引。
[SugarColumn(ColumnName = "instance_id", Length = 200)]
public string InstanceId { get; set; } = string.Empty;
[SugarColumn(ColumnName = "machine_name", Length = 128)]
public string MachineName { get; set; } = string.Empty;
[SugarColumn(ColumnName = "process_id")]
public int ProcessId { get; set; }
[SugarColumn(ColumnName = "app_version", Length = 64, IsNullable = true)]
public string AppVersion { get; set; }
///
/// 本进程声明所属的部署槽位(来自 AIDOP_ETL_SLOT / AiDOP:Jobs:Slot),
/// 未声明为 null。执行机判定就是拿它和指派表里的槽位比对。
///
[SugarColumn(ColumnName = "slot_code", Length = 128, IsNullable = true)]
public string SlotCode { get; set; }
///
/// 遗留列,**不要再读写**。指派已迁到 ado_etl_runner_designation.slot_code,
/// 执行机身份请用 AidopJobGate.IsRunner 或页面返回的派生值。
///
/// 保留一个版本而不立即删列:升级窗口内可能仍有旧二进制在跑,
/// 它们会继续读这一列;待全部实例升到槽位模型后再单独发版删除。
///
[SugarColumn(ColumnName = "is_runner")]
public bool IsRunner { get; set; }
[SugarColumn(ColumnName = "started_at")]
public DateTime StartedAt { get; set; }
/// 最近一次心跳。页面据此判存活,超过心跳窗口即视为已下线。
[SugarColumn(ColumnName = "last_heartbeat_at")]
public DateTime LastHeartbeatAt { get; set; }
[SugarColumn(ColumnName = "create_time")]
public DateTime CreateTime { get; set; }
[SugarColumn(ColumnName = "update_time")]
public DateTime UpdateTime { get; set; }
}