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; }
}
}