Ver Fonte

feat(house-fault): InitHouse 逐舱 try-catch+判空(单舱构造/启动异常只隔离该舱);上报挪到 InitHouse 后报完整清单

单舱构造异常登记 InitException 坏舱并跳过,不拖垮其余舱;CamNum/StartTask 全加判空。
ReportStartupFaults 从 InitTL 挪到 StartRun(InitHouse 之后),报含构造期故障的完整清单一次。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
huangjie há 1 dia atrás
pai
commit
e7acfa05c5
1 ficheiros alterados com 67 adições e 78 exclusões
  1. 67 78
      ivf_tl_operate_2.0/control/ivf_tl_Control/StartMain.cs

+ 67 - 78
ivf_tl_operate_2.0/control/ivf_tl_Control/StartMain.cs

@@ -49,6 +49,9 @@ namespace ivf_tl_Control
                 AppData.LogService.Pan = initTLResult.Item1.TLSetting.tmpDir;
 
                 if (!InitHouse(initTLResult.Item1, initTLResult.Item2, ref errorInfo)) return errorInfo;
+                // 舱室故障隔离:好舱继续后,把完整启动坏舱清单(扫口期 + InitHouse 构造期)经现有 reportAlarm
+                // 报警闭环上报一次(alarm 表/双端列表/短信电话/可消警);失败不影响启动。
+                try { AppData.ReportStartupFaults(); } catch { }
                 AppData.StartAsync().Wait();
                 return null;
             }
@@ -131,9 +134,6 @@ namespace ivf_tl_Control
                     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;
@@ -183,87 +183,76 @@ namespace ivf_tl_Control
 
                 var allList = AppData.SerialBinController.GetDishAndBalanceDataController(tLSetting.tlSn);
 
-                int housesn = 11;
-                AppData.BufferBottleBin = new BufferBottleBin(tLSetting, tLInitControllerResult.HouseList.FirstOrDefault(x => x.houseSn == housesn), AppData.Instance.guanbiTime);
-                AppData.InitBufferBottleBinEvent(AppData.BufferBottleBin);
-
-                housesn = 1;
-                AppData.HouseBin1 = new HouseBin(tLSetting, tLInitControllerResult.HouseList.FirstOrDefault(x => x.houseSn == housesn), allList.Dishes.FirstOrDefault(x => x.houseSn == housesn), allList.BalanceList.FirstOrDefault(x => x.houseSn == housesn), tLInitControllerResult.HouseWellList.Where(x => x.houseSn == housesn).ToList());
-                AppData.InitHouseBinEvent(AppData.HouseBin1);
-
-
-                housesn = 2;
-                AppData.HouseBin2 = new HouseBin(tLSetting, tLInitControllerResult.HouseList.FirstOrDefault(x => x.houseSn == housesn), allList.Dishes.FirstOrDefault(x => x.houseSn == housesn), allList.BalanceList.FirstOrDefault(x => x.houseSn == housesn), tLInitControllerResult.HouseWellList.Where(x => x.houseSn == housesn).ToList());
-                AppData.InitHouseBinEvent(AppData.HouseBin2);
-
-                housesn = 3;
-                AppData.HouseBin3 = new HouseBin(tLSetting, tLInitControllerResult.HouseList.FirstOrDefault(x => x.houseSn == housesn), allList.Dishes.FirstOrDefault(x => x.houseSn == housesn), allList.BalanceList.FirstOrDefault(x => x.houseSn == housesn), tLInitControllerResult.HouseWellList.Where(x => x.houseSn == housesn).ToList());
-                AppData.InitHouseBinEvent(AppData.HouseBin3);
-
-                housesn = 4;
-                AppData.HouseBin4 = new HouseBin(tLSetting, tLInitControllerResult.HouseList.FirstOrDefault(x => x.houseSn == housesn), allList.Dishes.FirstOrDefault(x => x.houseSn == housesn), allList.BalanceList.FirstOrDefault(x => x.houseSn == housesn), tLInitControllerResult.HouseWellList.Where(x => x.houseSn == housesn).ToList());
-                AppData.InitHouseBinEvent(AppData.HouseBin4);
-
-                housesn = 5;
-                AppData.HouseBin5 = new HouseBin(tLSetting, tLInitControllerResult.HouseList.FirstOrDefault(x => x.houseSn == housesn), allList.Dishes.FirstOrDefault(x => x.houseSn == housesn), allList.BalanceList.FirstOrDefault(x => x.houseSn == housesn), tLInitControllerResult.HouseWellList.Where(x => x.houseSn == housesn).ToList());
-                AppData.InitHouseBinEvent(AppData.HouseBin5);
-
-                housesn = 6;
-                AppData.HouseBin6 = new HouseBin(tLSetting, tLInitControllerResult.HouseList.FirstOrDefault(x => x.houseSn == housesn), allList.Dishes.FirstOrDefault(x => x.houseSn == housesn), allList.BalanceList.FirstOrDefault(x => x.houseSn == housesn), tLInitControllerResult.HouseWellList.Where(x => x.houseSn == housesn).ToList());
-                AppData.InitHouseBinEvent(AppData.HouseBin6);
-
-                housesn = 7;
-                AppData.HouseBin7 = new HouseBin(tLSetting, tLInitControllerResult.HouseList.FirstOrDefault(x => x.houseSn == housesn), allList.Dishes.FirstOrDefault(x => x.houseSn == housesn), allList.BalanceList.FirstOrDefault(x => x.houseSn == housesn), tLInitControllerResult.HouseWellList.Where(x => x.houseSn == housesn).ToList());
-                AppData.InitHouseBinEvent(AppData.HouseBin7);
-
-                housesn = 8;
-                AppData.HouseBin8 = new HouseBin(tLSetting, tLInitControllerResult.HouseList.FirstOrDefault(x => x.houseSn == housesn), allList.Dishes.FirstOrDefault(x => x.houseSn == housesn), allList.BalanceList.FirstOrDefault(x => x.houseSn == housesn), tLInitControllerResult.HouseWellList.Where(x => x.houseSn == housesn).ToList());
-                AppData.InitHouseBinEvent(AppData.HouseBin8);
-
-                housesn = 9;
-                AppData.HouseBin9 = new HouseBin(tLSetting, tLInitControllerResult.HouseList.FirstOrDefault(x => x.houseSn == housesn), allList.Dishes.FirstOrDefault(x => x.houseSn == housesn), allList.BalanceList.FirstOrDefault(x => x.houseSn == housesn), tLInitControllerResult.HouseWellList.Where(x => x.houseSn == housesn).ToList());
-                AppData.InitHouseBinEvent(AppData.HouseBin9);
-
-                housesn = 10;
-                AppData.HouseBin10 = new HouseBin(tLSetting, tLInitControllerResult.HouseList.FirstOrDefault(x => x.houseSn == housesn), allList.Dishes.FirstOrDefault(x => x.houseSn == housesn), allList.BalanceList.FirstOrDefault(x => x.houseSn == housesn), tLInitControllerResult.HouseWellList.Where(x => x.houseSn == housesn).ToList());
-                AppData.InitHouseBinEvent(AppData.HouseBin10);
+                // 舱室故障隔离:单舱构造/启动各自兜底——抛异常只登记坏舱 + 跳过该舱,绝不拖垮其余舱(spec §35)。
+                void Build(int sn, Action build)
+                {
+                    try { build(); }
+                    catch (Exception ex)
+                    {
+                        AppData.LogService.ExceptionLog(ex, $"舱{sn}构造失败(已隔离,其余舱继续)", null, LogEnum.RunException);
+                        AppData.StartupFaults?.Add(new HouseFault
+                        {
+                            HouseSn = sn,
+                            Type = HouseFaultType.InitException,
+                            Reason = $"舱{sn}构造异常:{ex.Message}",
+                            Stage = "舱初始化",
+                            At = DateTime.UtcNow,
+                            Isolated = true
+                        });
+                    }
+                }
+                void Start(int sn, Action start)
+                {
+                    try { start(); }
+                    catch (Exception ex)
+                    {
+                        AppData.LogService.ExceptionLog(ex, $"舱{sn} StartTask 失败(已隔离)", null, LogEnum.RunException);
+                    }
+                }
 
-                AppData.HouseBin1.CamNum = CamNum;
-                AppData.HouseBin2.CamNum = CamNum;
-                AppData.HouseBin3.CamNum = CamNum;
-                AppData.HouseBin4.CamNum = CamNum;
-                AppData.HouseBin5.CamNum = CamNum;
-                AppData.HouseBin6.CamNum = CamNum;
-                AppData.HouseBin7.CamNum = CamNum;
-                AppData.HouseBin8.CamNum = CamNum;
-                AppData.HouseBin9.CamNum = CamNum;
-                AppData.HouseBin10.CamNum = CamNum;
+                Build(11, () =>
+                {
+                    AppData.BufferBottleBin = new BufferBottleBin(tLSetting, tLInitControllerResult.HouseList.FirstOrDefault(x => x.houseSn == 11), AppData.Instance.guanbiTime);
+                    AppData.InitBufferBottleBinEvent(AppData.BufferBottleBin);
+                });
+
+                Build(1, () => { AppData.HouseBin1 = new HouseBin(tLSetting, tLInitControllerResult.HouseList.FirstOrDefault(x => x.houseSn == 1), allList.Dishes.FirstOrDefault(x => x.houseSn == 1), allList.BalanceList.FirstOrDefault(x => x.houseSn == 1), tLInitControllerResult.HouseWellList.Where(x => x.houseSn == 1).ToList()); AppData.InitHouseBinEvent(AppData.HouseBin1); });
+                Build(2, () => { AppData.HouseBin2 = new HouseBin(tLSetting, tLInitControllerResult.HouseList.FirstOrDefault(x => x.houseSn == 2), allList.Dishes.FirstOrDefault(x => x.houseSn == 2), allList.BalanceList.FirstOrDefault(x => x.houseSn == 2), tLInitControllerResult.HouseWellList.Where(x => x.houseSn == 2).ToList()); AppData.InitHouseBinEvent(AppData.HouseBin2); });
+                Build(3, () => { AppData.HouseBin3 = new HouseBin(tLSetting, tLInitControllerResult.HouseList.FirstOrDefault(x => x.houseSn == 3), allList.Dishes.FirstOrDefault(x => x.houseSn == 3), allList.BalanceList.FirstOrDefault(x => x.houseSn == 3), tLInitControllerResult.HouseWellList.Where(x => x.houseSn == 3).ToList()); AppData.InitHouseBinEvent(AppData.HouseBin3); });
+                Build(4, () => { AppData.HouseBin4 = new HouseBin(tLSetting, tLInitControllerResult.HouseList.FirstOrDefault(x => x.houseSn == 4), allList.Dishes.FirstOrDefault(x => x.houseSn == 4), allList.BalanceList.FirstOrDefault(x => x.houseSn == 4), tLInitControllerResult.HouseWellList.Where(x => x.houseSn == 4).ToList()); AppData.InitHouseBinEvent(AppData.HouseBin4); });
+                Build(5, () => { AppData.HouseBin5 = new HouseBin(tLSetting, tLInitControllerResult.HouseList.FirstOrDefault(x => x.houseSn == 5), allList.Dishes.FirstOrDefault(x => x.houseSn == 5), allList.BalanceList.FirstOrDefault(x => x.houseSn == 5), tLInitControllerResult.HouseWellList.Where(x => x.houseSn == 5).ToList()); AppData.InitHouseBinEvent(AppData.HouseBin5); });
+                Build(6, () => { AppData.HouseBin6 = new HouseBin(tLSetting, tLInitControllerResult.HouseList.FirstOrDefault(x => x.houseSn == 6), allList.Dishes.FirstOrDefault(x => x.houseSn == 6), allList.BalanceList.FirstOrDefault(x => x.houseSn == 6), tLInitControllerResult.HouseWellList.Where(x => x.houseSn == 6).ToList()); AppData.InitHouseBinEvent(AppData.HouseBin6); });
+                Build(7, () => { AppData.HouseBin7 = new HouseBin(tLSetting, tLInitControllerResult.HouseList.FirstOrDefault(x => x.houseSn == 7), allList.Dishes.FirstOrDefault(x => x.houseSn == 7), allList.BalanceList.FirstOrDefault(x => x.houseSn == 7), tLInitControllerResult.HouseWellList.Where(x => x.houseSn == 7).ToList()); AppData.InitHouseBinEvent(AppData.HouseBin7); });
+                Build(8, () => { AppData.HouseBin8 = new HouseBin(tLSetting, tLInitControllerResult.HouseList.FirstOrDefault(x => x.houseSn == 8), allList.Dishes.FirstOrDefault(x => x.houseSn == 8), allList.BalanceList.FirstOrDefault(x => x.houseSn == 8), tLInitControllerResult.HouseWellList.Where(x => x.houseSn == 8).ToList()); AppData.InitHouseBinEvent(AppData.HouseBin8); });
+                Build(9, () => { AppData.HouseBin9 = new HouseBin(tLSetting, tLInitControllerResult.HouseList.FirstOrDefault(x => x.houseSn == 9), allList.Dishes.FirstOrDefault(x => x.houseSn == 9), allList.BalanceList.FirstOrDefault(x => x.houseSn == 9), tLInitControllerResult.HouseWellList.Where(x => x.houseSn == 9).ToList()); AppData.InitHouseBinEvent(AppData.HouseBin9); });
+                Build(10, () => { AppData.HouseBin10 = new HouseBin(tLSetting, tLInitControllerResult.HouseList.FirstOrDefault(x => x.houseSn == 10), allList.Dishes.FirstOrDefault(x => x.houseSn == 10), allList.BalanceList.FirstOrDefault(x => x.houseSn == 10), tLInitControllerResult.HouseWellList.Where(x => x.houseSn == 10).ToList()); AppData.InitHouseBinEvent(AppData.HouseBin10); });
+
+                if (AppData.HouseBin1 != null) AppData.HouseBin1.CamNum = CamNum;
+                if (AppData.HouseBin2 != null) AppData.HouseBin2.CamNum = CamNum;
+                if (AppData.HouseBin3 != null) AppData.HouseBin3.CamNum = CamNum;
+                if (AppData.HouseBin4 != null) AppData.HouseBin4.CamNum = CamNum;
+                if (AppData.HouseBin5 != null) AppData.HouseBin5.CamNum = CamNum;
+                if (AppData.HouseBin6 != null) AppData.HouseBin6.CamNum = CamNum;
+                if (AppData.HouseBin7 != null) AppData.HouseBin7.CamNum = CamNum;
+                if (AppData.HouseBin8 != null) AppData.HouseBin8.CamNum = CamNum;
+                if (AppData.HouseBin9 != null) AppData.HouseBin9.CamNum = CamNum;
+                if (AppData.HouseBin10 != null) AppData.HouseBin10.CamNum = CamNum;
 
                 if (!AppData.MvcTest)
                 {
-                    if (runHouses.Contains(1)) AppData.HouseBin1.StartTask();
-
-                    if (runHouses.Contains(2)) AppData.HouseBin2.StartTask();
-
-                    if (runHouses.Contains(3)) AppData.HouseBin3.StartTask();
-
-                    if (runHouses.Contains(4)) AppData.HouseBin4.StartTask();
-
-
-
-                    if (runHouses.Contains(6)) AppData.HouseBin6.StartTask();
-
-                    if (runHouses.Contains(7)) AppData.HouseBin7.StartTask();
-
-                    if (runHouses.Contains(8)) AppData.HouseBin8.StartTask();
-
-                    if (runHouses.Contains(9)) AppData.HouseBin9.StartTask();
-
-                    if (runHouses.Contains(10)) AppData.HouseBin10.StartTask();
+                    if (runHouses.Contains(1) && AppData.HouseBin1 != null) Start(1, () => AppData.HouseBin1.StartTask());
+                    if (runHouses.Contains(2) && AppData.HouseBin2 != null) Start(2, () => AppData.HouseBin2.StartTask());
+                    if (runHouses.Contains(3) && AppData.HouseBin3 != null) Start(3, () => AppData.HouseBin3.StartTask());
+                    if (runHouses.Contains(4) && AppData.HouseBin4 != null) Start(4, () => AppData.HouseBin4.StartTask());
+                    if (runHouses.Contains(6) && AppData.HouseBin6 != null) Start(6, () => AppData.HouseBin6.StartTask());
+                    if (runHouses.Contains(7) && AppData.HouseBin7 != null) Start(7, () => AppData.HouseBin7.StartTask());
+                    if (runHouses.Contains(8) && AppData.HouseBin8 != null) Start(8, () => AppData.HouseBin8.StartTask());
+                    if (runHouses.Contains(9) && AppData.HouseBin9 != null) Start(9, () => AppData.HouseBin9.StartTask());
+                    if (runHouses.Contains(10) && AppData.HouseBin10 != null) Start(10, () => AppData.HouseBin10.StartTask());
                 }
-                if (runHouses.Contains(5)) AppData.HouseBin5.StartTask();
+                if (runHouses.Contains(5) && AppData.HouseBin5 != null) Start(5, () => AppData.HouseBin5.StartTask());
 
-                if (runHouses.Contains(11)) AppData.BufferBottleBin.StartTask();
+                if (runHouses.Contains(11) && AppData.BufferBottleBin != null) Start(11, () => AppData.BufferBottleBin.StartTask());
                 return true;
             }
             catch (Exception ex)