Pārlūkot izejas kodu

feat(house-fault): HouseFault 数据载体 + HouseFaultType 枚举(TDD 2绿)

路径修正:control 的 Entity 工程是 control/ivf_tl_Entity/(命名空间 IvfTl.Control.Entity.InitEntitys)。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
huangjie 2 dienas atpakaļ
vecāks
revīzija
f7d1d75

+ 41 - 0
ivf_tl_operate_2.0/control/IvfTl.ControlHost.Tests/HouseFaultTests.cs

@@ -0,0 +1,41 @@
+using System;
+using IvfTl.Control.Entity.InitEntitys;
+using Xunit;
+
+namespace IvfTl.ControlHost.Tests
+{
+    public class HouseFaultTests
+    {
+        [Fact]
+        public void HouseFault_Holds_All_Fields()
+        {
+            var at = new DateTime(2026, 6, 23, 12, 0, 0, DateTimeKind.Utc);
+            var f = new HouseFault
+            {
+                HouseSn = 6,
+                Port = "COM7",
+                Type = HouseFaultType.CcdSnMissing,
+                Reason = "相机列表中不存在仓室的CCDSN12345",
+                Stage = "扫口握手",
+                At = at,
+                Isolated = true
+            };
+
+            Assert.Equal(6, f.HouseSn);
+            Assert.Equal("COM7", f.Port);
+            Assert.Equal(HouseFaultType.CcdSnMissing, f.Type);
+            Assert.Equal("相机列表中不存在仓室的CCDSN12345", f.Reason);
+            Assert.Equal("扫口握手", f.Stage);
+            Assert.Equal(at, f.At);
+            Assert.True(f.Isolated);
+        }
+
+        [Fact]
+        public void HouseFault_Defaults_HouseSn_Unknown_As_Minus1()
+        {
+            var f = new HouseFault { Type = HouseFaultType.CameraDuplicateSn };
+            Assert.Equal(-1, f.HouseSn);   // -1 = 舱号未知(相机/串口级故障)
+            Assert.False(f.Isolated);
+        }
+    }
+}

+ 40 - 0
ivf_tl_operate_2.0/control/ivf_tl_Entity/InitEntitys/HouseFault.cs

@@ -0,0 +1,40 @@
+using System;
+
+namespace IvfTl.Control.Entity.InitEntitys
+{
+    /// <summary>
+    /// 舱级故障类型。启动期 SerialBin 登记 + 运行期升级共用。
+    /// </summary>
+    public enum HouseFaultType
+    {
+        CameraReadFailed = 0,    // 相机 SN 读取异常(舱号未知)
+        CameraDuplicateSn = 1,   // 两台相机报同一 SN,配对不明(舱号未知)
+        HouseSnDuplicate = 2,    // 两个串口握手返回同一舱号
+        CcdSnMissing = 3,        // 相机列表中不存在该舱 CCDSN(该舱相机半坏)
+        CcdSnDuplicate = 4,      // 两个舱报同一 CCDSN
+        SerialReadException = 5, // 扫口过程串口读异常(舱号可能未知)
+        InitException = 6,       // 舱构造/StartTask 抛异常
+        RuntimeFault = 7         // 运行期突发(第二阶段用)
+    }
+
+    /// <summary>
+    /// 单条舱故障。HouseSn>0=已知具体舱(可被剔除);HouseSn=-1=相机/串口级故障(仅提示,不剔除某舱)。
+    /// 纯数据载体,无任何行为。
+    /// </summary>
+    public class HouseFault
+    {
+        /// <summary>舱号;-1 表示舱号未知(相机/串口级)。</summary>
+        public int HouseSn { get; set; } = -1;
+        /// <summary>串口名(已知时)。</summary>
+        public string Port { get; set; }
+        public HouseFaultType Type { get; set; }
+        /// <summary>人类可读原因(直接取自原 errorlist 文案)。</summary>
+        public string Reason { get; set; }
+        /// <summary>发生阶段:相机枚举/扫口握手/舱初始化/运行期。</summary>
+        public string Stage { get; set; }
+        /// <summary>发生时刻(UTC)。</summary>
+        public DateTime At { get; set; }
+        /// <summary>是否已被隔离(该舱已从可跑清单剔除/已停)。</summary>
+        public bool Isolated { get; set; }
+    }
+}