|
@@ -8,6 +8,7 @@ using IvfTl.Control.Entity.DTO.ApiRequestDTO;
|
|
|
using IvfTl.Control.Entity.DTO.ApiResultDTO;
|
|
using IvfTl.Control.Entity.DTO.ApiResultDTO;
|
|
|
using IvfTl.Control.Entity.GlobalEntitys;
|
|
using IvfTl.Control.Entity.GlobalEntitys;
|
|
|
using IvfTl.Control.Entity.GlobalEnums;
|
|
using IvfTl.Control.Entity.GlobalEnums;
|
|
|
|
|
+using IvfTl.Control.Entity.InitEntitys;
|
|
|
using IvfTl.Control.Services;
|
|
using IvfTl.Control.Services;
|
|
|
using IvfTl.Control.Services.HttpServices;
|
|
using IvfTl.Control.Services.HttpServices;
|
|
|
using ivf_tl_ServicesImpl.DBServices;
|
|
using ivf_tl_ServicesImpl.DBServices;
|
|
@@ -194,6 +195,9 @@ namespace ivf_tl_Control
|
|
|
|
|
|
|
|
public UserInfo CurrentUser { get; set; }
|
|
public UserInfo CurrentUser { get; set; }
|
|
|
|
|
|
|
|
|
|
+ /// <summary>启动期坏舱清单(InitTL 写入;GetMonitorSnapshot 透出 /status;ReportStartupFaults 经 reportAlarm 闭环上报)。</summary>
|
|
|
|
|
+ public List<HouseFault> StartupFaults { get; set; } = new List<HouseFault>();
|
|
|
|
|
+
|
|
|
public TLSetting TLSetting;
|
|
public TLSetting TLSetting;
|
|
|
public HouseBin HouseBin1;
|
|
public HouseBin HouseBin1;
|
|
|
public HouseBin HouseBin2;
|
|
public HouseBin HouseBin2;
|
|
@@ -288,6 +292,21 @@ namespace ivf_tl_Control
|
|
|
{
|
|
{
|
|
|
ExLog(ex, "GetMonitorSnapshot");
|
|
ExLog(ex, "GetMonitorSnapshot");
|
|
|
}
|
|
}
|
|
|
|
|
+ // 舱故障透出(StartupFaults → HouseFaultRow,字符串化枚举跨端);独立 try,不影响其余快照。
|
|
|
|
|
+ try
|
|
|
|
|
+ {
|
|
|
|
|
+ snap.Faults = (StartupFaults ?? new List<HouseFault>())
|
|
|
|
|
+ .Select(f => new HouseFaultRow
|
|
|
|
|
+ {
|
|
|
|
|
+ HouseSn = f.HouseSn,
|
|
|
|
|
+ FaultType = f.Type.ToString(),
|
|
|
|
|
+ Reason = f.Reason,
|
|
|
|
|
+ Stage = f.Stage,
|
|
|
|
|
+ At = f.At,
|
|
|
|
|
+ Isolated = f.Isolated
|
|
|
|
|
+ }).ToList();
|
|
|
|
|
+ }
|
|
|
|
|
+ catch { }
|
|
|
return snap;
|
|
return snap;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -1360,6 +1379,36 @@ namespace ivf_tl_Control
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ /// <summary>
|
|
|
|
|
+ /// 上报启动期坏舱告警(每坏舱一条),复用现有 reportAlarm 报警闭环:
|
|
|
|
|
+ /// SerialBinController.ReportAlarmController → /reportAlarm → 报警责任链 → alarm 表
|
|
|
|
|
+ /// → front/operate 报警列表 + 短信/电话通知 + 可静音/恢复自动消警(与运行期 HouseStateEvent 同一入口)。
|
|
|
|
|
+ /// 维度码 0正常/1异常/-1跳过:相机类故障 → photoState=1;串口/编号/Init 类 → comState=1;其余维度 -1(不误清别的告警)。
|
|
|
|
|
+ /// 全 try 兜底,失败不影响启动。不走 reportCloudAlarm(群消息),无新增 alarmTypeKey、无 Java 改动。
|
|
|
|
|
+ /// </summary>
|
|
|
|
|
+ public void ReportStartupFaults()
|
|
|
|
|
+ {
|
|
|
|
|
+ if (StartupFaults == null || StartupFaults.Count == 0) return;
|
|
|
|
|
+ string tlSn = "";
|
|
|
|
|
+ try { tlSn = TLSetting?.tlSn ?? ""; } catch { }
|
|
|
|
|
+ foreach (var f in StartupFaults)
|
|
|
|
|
+ {
|
|
|
|
|
+ // 舱号未知(相机/串口级)定位不到具体舱,不进 reportAlarm(仍在 /status Faults 里可见)。
|
|
|
|
|
+ if (f.HouseSn <= 0) continue;
|
|
|
|
|
+ try
|
|
|
|
|
+ {
|
|
|
|
|
+ bool cameraFault = f.Type == HouseFaultType.CcdSnMissing
|
|
|
|
|
+ || f.Type == HouseFaultType.CcdSnDuplicate
|
|
|
|
|
+ || f.Type == HouseFaultType.CameraDuplicateSn
|
|
|
|
|
+ || f.Type == HouseFaultType.CameraReadFailed;
|
|
|
|
|
+ int comState = cameraFault ? -1 : 1; // 串口/编号/Init 异常
|
|
|
|
|
+ int photoState = cameraFault ? 1 : -1; // 相机异常
|
|
|
|
|
+ SerialBinController.ReportAlarmController(tlSn, f.HouseSn, -1, comState, photoState, -1, -1);
|
|
|
|
|
+ }
|
|
|
|
|
+ catch (Exception ex) { ExLog(ex, "ReportStartupFaults"); }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
public void KafkaAlarm(string tlsn, int housesn, ulong dishId, ulong embryoId, string imageName, int wellSn)
|
|
public void KafkaAlarm(string tlsn, int housesn, ulong dishId, ulong embryoId, string imageName, int wellSn)
|
|
|
{
|
|
{
|
|
|
try
|
|
try
|