MonitorSnapshot.cs 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. using System;
  2. using System.Collections.Generic;
  3. namespace ivf_tl_Control
  4. {
  5. /// <summary>
  6. /// M5-03-1:只读服务监控快照 DTO。
  7. /// 由 <see cref="AppData.GetMonitorSnapshot"/> 在 operate 同进程内聚合 control 内存/事件的当前状态,
  8. /// 供 operate 设置页「服务监控」只读页呈现(需求 7 只读服务监控、需求 10 链路健康)。
  9. ///
  10. /// 纯数据载体:所有成员均为 get-only/赋值一次性快照,**不暴露任何写入口/控制方法/可变引用**,
  11. /// 监控页拿到本 DTO 即拿不到任何能改变 control 状态的句柄(约束 4 只读边界)。
  12. /// 时间戳类字段用于「最后成功通讯时间 / 不假装实时」判定,阈值上色由 operate 侧 [D10] 占位。
  13. /// </summary>
  14. public class MonitorSnapshot
  15. {
  16. /// <summary>快照采集时刻(operate 侧据此判定数据是否过期)。</summary>
  17. public DateTime SnapshotAt { get; set; } = DateTime.Now;
  18. /// <summary>control 后台是否已完成初始化(AppData 单例存在即视为已托管)。</summary>
  19. public bool ControlHosted { get; set; }
  20. // —— MQTT 链路 ——
  21. /// <summary>MQTT 是否已连接(来源 MqttService.MqttIsConnected())。</summary>
  22. public bool MqttConnected { get; set; }
  23. /// <summary>最后一次 MQTT 上报成功时间(来源 StartSendMqttMsg 成功分支);null=尚未成功。</summary>
  24. public DateTime? LastMqttOkAt { get; set; }
  25. /// <summary>最近一次 MQTT 连接成功时刻(M5-04,断线提示「恢复时清除」据此判定);null=尚未连接。</summary>
  26. public DateTime? MqttLastConnectedAt { get; set; }
  27. /// <summary>最近一次 MQTT 断开时刻(M5-04,断线提示据此判定失联);null=未断开过。</summary>
  28. public DateTime? MqttLastDisconnectedAt { get; set; }
  29. // —— Kafka / 图片上传链路 ——
  30. /// <summary>最后一次 Kafka 图片上传成功时间(来源 KafkaUploadImageAsync 成功分支);null=尚未成功。</summary>
  31. public DateTime? LastKafkaOkAt { get; set; }
  32. /// <summary>内存待传图片缓存数(ImageDTODic.Count)。</summary>
  33. public int ImageCacheCount { get; set; }
  34. /// <summary>落盘目录待传图片数(自动对焦 + CCD 两目录 *.jpg 计数)。</summary>
  35. public int PendingDiskImageCount { get; set; }
  36. /// <summary>断网累积告警(M5-04-3:落盘待传数超阈值,疑似上传链路断开堆积,只读提示,不删图)。</summary>
  37. public bool ImageBacklogAlarm { get; set; }
  38. /// <summary>断网累积告警阈值(M5-04-3,[D10] 占位,留 M7 校准)。</summary>
  39. public int PendingImageAlarmThreshold { get; set; }
  40. // —— 服务器(HTTP)链路 ——
  41. /// <summary>服务器接口基址(脱敏展示用,仅 host:port)。</summary>
  42. public string ServerUrl { get; set; }
  43. /// <summary>最后一次 HTTP 通讯成功时间(M5-04-4 operate 侧轮询写入,本快照透传 control 已知值);null=未知。</summary>
  44. public DateTime? LastHttpOkAt { get; set; }
  45. // —— 磁盘 ——
  46. /// <summary>缓存盘符。</summary>
  47. public string DiskPath { get; set; }
  48. /// <summary>缓存盘是否存在(0=存在,1=不存在,沿用 DiskInfo.diskExist 语义)。</summary>
  49. public bool DiskExist { get; set; }
  50. /// <summary>缓存盘剩余空间 GB。</summary>
  51. public decimal DiskFreeGb { get; set; }
  52. // —— 各舱室温度/气体/CCD 只读态 ——
  53. /// <summary>各舱室只读状态行(温度/压力/CCD/运行态)。</summary>
  54. public List<HouseMonitorRow> Houses { get; set; } = new List<HouseMonitorRow>();
  55. /// <summary>舱故障列表(启动排除 + 运行期突发),供 operate 监控页红色高亮展示。</summary>
  56. public List<HouseFaultRow> Faults { get; set; } = new List<HouseFaultRow>();
  57. }
  58. /// <summary>单条舱故障只读行(operate/front 展示用,字符串化枚举便于跨端)。</summary>
  59. public class HouseFaultRow
  60. {
  61. public int HouseSn { get; set; }
  62. public string FaultType { get; set; }
  63. public string Reason { get; set; }
  64. public string Stage { get; set; }
  65. public DateTime At { get; set; }
  66. public bool Isolated { get; set; }
  67. }
  68. /// <summary>单个舱室只读监控行(取 HouseBin 已有只读字段聚合,不触发任何动作)。</summary>
  69. public class HouseMonitorRow
  70. {
  71. public int HouseSn { get; set; }
  72. public string PortName { get; set; }
  73. /// <summary>运行状态文案(HouseBin.RunState)。</summary>
  74. public string RunState { get; set; }
  75. /// <summary>主温度(HouseBin.Temperature)。</summary>
  76. public decimal Temperature { get; set; }
  77. /// <summary>压力(HouseBin.Pressure)。</summary>
  78. public decimal Pressure { get; set; }
  79. /// <summary>舱门状态文本(HouseBin.IsDoorOpen)。</summary>
  80. public string HouseState { get; set; }
  81. /// <summary>通讯连接状态文本(ComBin 是否就绪)。</summary>
  82. public string ComState { get; set; }
  83. /// <summary>CCD 状态文本(由 CCDError 派生:正常/异常)。</summary>
  84. public string CcdState { get; set; }
  85. /// <summary>是否有 CCD 错误标记(HouseBin.CCDError)。</summary>
  86. public bool CcdError { get; set; }
  87. // —— 阶段2 监控补全(§6 三块)——
  88. /// <summary>各舱实时活动类型(HouseBin.WorkingType:DoNothing/AirSwapWorking/CCDWorking/AutoFocusWorking)。</summary>
  89. public string WorkingType { get; set; }
  90. /// <summary>排气阀状态文本(HouseBin.ValveState)。</summary>
  91. public string ValveState { get; set; }
  92. /// <summary>串口借用:该舱采集是否被前台(调试/对焦)让路中(HouseBin.CapturePausedByGate)。</summary>
  93. public bool CapturePausedByGate { get; set; }
  94. }
  95. }