Ver código fonte

feat(house-fault): InitTL 改坏舱剔除——相机/串口异常不再整机中止,零可跑才中止,坏舱存AppData+经闭环上报

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
huangjie 1 dia atrás
pai
commit
a9045c9

+ 23 - 7
ivf_tl_operate_2.0/control/ivf_tl_Control/StartMain.cs

@@ -77,9 +77,8 @@ namespace ivf_tl_Control
                 AppData.LogService.TLLog($"相机信息:{JsonConvert.SerializeObject(serialBin.CCDidSn)}", LogEnum.RunRecord);
                 if (errorList.Any())
                 {
-                    errora = $"获取相机Id和CCDSN错误{JsonConvert.SerializeObject(errorList)}";
-                    AppData.LogService.TLLog(errora, LogEnum.RunRecord);
-                    return (new TLInitControllerResult(), new List<int>());
+                    // 舱室故障隔离:相机枚举异常不再整机中止,只记日志;受影响舱稍后在 CCDSN 配对时落坏舱被剔除。
+                    AppData.LogService.TLLog($"相机枚举有异常(不中止,受影响舱将按坏舱剔除):{JsonConvert.SerializeObject(errorList)}", LogEnum.RunRecord);
                 }
                 CamNum = serialBin.CCDidSn.Where(x => x.Value != null).Count();
                 errorList = serialBin.Start();
@@ -88,9 +87,8 @@ namespace ivf_tl_Control
 
                 if (errorList.Any())
                 {
-                    errora = $"获取串口信息错误{JsonConvert.SerializeObject(errorList)}";
-                    AppData.LogService.TLLog(errora, LogEnum.RunRecord);
-                    return (new TLInitControllerResult(), new List<int>());
+                    // 舱室故障隔离:扫口异常不再整机中止,剔除坏舱后用好舱继续(见下方 RunnableHouses)。
+                    AppData.LogService.TLLog($"扫口有异常(将剔除坏舱后继续):{JsonConvert.SerializeObject(errorList)}", LogEnum.RunRecord);
                 }
 
                 var modelCount = serialBin.SerialModels.Count;
@@ -117,7 +115,25 @@ namespace ivf_tl_Control
                     }
                 }
 
-                List<int> listIntRunHoues = serialBin.SerialModels.Select(x => x.houseSn).ToList();
+                // 舱室故障隔离:坏舱 = 故障清单中已知舱号;可跑舱 = 发现的舱 − 坏舱;仅零可跑才整机中止。
+                var discovered = serialBin.SerialModels.Select(x => x.houseSn).ToList();
+                List<int> listIntRunHoues = StartupFaultPolicy.RunnableHouses(discovered, serialBin.Faults);
+
+                foreach (var f in serialBin.Faults) if (f.HouseSn > 0) f.Isolated = true;
+                AppData.StartupFaults = serialBin.Faults;
+                if (serialBin.Faults.Any())
+                    AppData.LogService.TLLog($"启动坏舱清单:{JsonConvert.SerializeObject(serialBin.Faults)};可跑舱:{string.Join(",", listIntRunHoues)}", LogEnum.RunRecord);
+
+                if (StartupFaultPolicy.IsFatal(listIntRunHoues))
+                {
+                    errora = "所有舱室初始化失败,无可运行舱室";
+                    AppData.LogService.TLLog(errora, LogEnum.RunRecord);
+                    return (new TLInitControllerResult(), new List<int>());
+                }
+
+                // 启动期坏舱经现有 reportAlarm 报警闭环上报(alarm 表/双端列表/短信电话/可消警);失败不影响启动。
+                try { AppData.ReportStartupFaults(); } catch { }
+
                 TLInitData tLInitData = new TLInitData();
                 tLInitData.tlSn = $"NEO-1-{serialBin.TLNum}";
                 tLInitData.dayLighting = serialBin.dayLighting;