using System; using System.Collections.Generic; namespace ivf_tl_Control { /// /// M5-03-1:只读服务监控快照 DTO。 /// 由 在 operate 同进程内聚合 control 内存/事件的当前状态, /// 供 operate 设置页「服务监控」只读页呈现(需求 7 只读服务监控、需求 10 链路健康)。 /// /// 纯数据载体:所有成员均为 get-only/赋值一次性快照,**不暴露任何写入口/控制方法/可变引用**, /// 监控页拿到本 DTO 即拿不到任何能改变 control 状态的句柄(约束 4 只读边界)。 /// 时间戳类字段用于「最后成功通讯时间 / 不假装实时」判定,阈值上色由 operate 侧 [D10] 占位。 /// public class MonitorSnapshot { /// 快照采集时刻(operate 侧据此判定数据是否过期)。 public DateTime SnapshotAt { get; set; } = DateTime.Now; /// control 后台是否已完成初始化(AppData 单例存在即视为已托管)。 public bool ControlHosted { get; set; } // —— MQTT 链路 —— /// MQTT 是否已连接(来源 MqttService.MqttIsConnected())。 public bool MqttConnected { get; set; } /// 最后一次 MQTT 上报成功时间(来源 StartSendMqttMsg 成功分支);null=尚未成功。 public DateTime? LastMqttOkAt { get; set; } /// 最近一次 MQTT 连接成功时刻(M5-04,断线提示「恢复时清除」据此判定);null=尚未连接。 public DateTime? MqttLastConnectedAt { get; set; } /// 最近一次 MQTT 断开时刻(M5-04,断线提示据此判定失联);null=未断开过。 public DateTime? MqttLastDisconnectedAt { get; set; } // —— Kafka / 图片上传链路 —— /// 最后一次 Kafka 图片上传成功时间(来源 KafkaUploadImageAsync 成功分支);null=尚未成功。 public DateTime? LastKafkaOkAt { get; set; } /// 内存待传图片缓存数(ImageDTODic.Count)。 public int ImageCacheCount { get; set; } /// 落盘目录待传图片数(自动对焦 + CCD 两目录 *.jpg 计数)。 public int PendingDiskImageCount { get; set; } /// 断网累积告警(M5-04-3:落盘待传数超阈值,疑似上传链路断开堆积,只读提示,不删图)。 public bool ImageBacklogAlarm { get; set; } /// 断网累积告警阈值(M5-04-3,[D10] 占位,留 M7 校准)。 public int PendingImageAlarmThreshold { get; set; } // —— 服务器(HTTP)链路 —— /// 服务器接口基址(脱敏展示用,仅 host:port)。 public string ServerUrl { get; set; } /// 最后一次 HTTP 通讯成功时间(M5-04-4 operate 侧轮询写入,本快照透传 control 已知值);null=未知。 public DateTime? LastHttpOkAt { get; set; } // —— 磁盘 —— /// 缓存盘符。 public string DiskPath { get; set; } /// 缓存盘是否存在(0=存在,1=不存在,沿用 DiskInfo.diskExist 语义)。 public bool DiskExist { get; set; } /// 缓存盘剩余空间 GB。 public decimal DiskFreeGb { get; set; } // —— 各舱室温度/气体/CCD 只读态 —— /// 各舱室只读状态行(温度/压力/CCD/运行态)。 public List Houses { get; set; } = new List(); /// 舱故障列表(启动排除 + 运行期突发),供 operate 监控页红色高亮展示。 public List Faults { get; set; } = new List(); } /// 单条舱故障只读行(operate/front 展示用,字符串化枚举便于跨端)。 public class HouseFaultRow { public int HouseSn { get; set; } public string FaultType { get; set; } public string Reason { get; set; } public string Stage { get; set; } public DateTime At { get; set; } public bool Isolated { get; set; } } /// 单个舱室只读监控行(取 HouseBin 已有只读字段聚合,不触发任何动作)。 public class HouseMonitorRow { public int HouseSn { get; set; } public string PortName { get; set; } /// 运行状态文案(HouseBin.RunState)。 public string RunState { get; set; } /// 主温度(HouseBin.Temperature)。 public decimal Temperature { get; set; } /// 压力(HouseBin.Pressure)。 public decimal Pressure { get; set; } /// 舱门状态文本(HouseBin.IsDoorOpen)。 public string HouseState { get; set; } /// 通讯连接状态文本(ComBin 是否就绪)。 public string ComState { get; set; } /// CCD 状态文本(由 CCDError 派生:正常/异常)。 public string CcdState { get; set; } /// 是否有 CCD 错误标记(HouseBin.CCDError)。 public bool CcdError { get; set; } // —— 阶段2 监控补全(§6 三块)—— /// 各舱实时活动类型(HouseBin.WorkingType:DoNothing/AirSwapWorking/CCDWorking/AutoFocusWorking)。 public string WorkingType { get; set; } /// 排气阀状态文本(HouseBin.ValveState)。 public string ValveState { get; set; } /// 串口借用:该舱采集是否被前台(调试/对焦)让路中(HouseBin.CapturePausedByGate)。 public bool CapturePausedByGate { get; set; } } }