namespace SSPCTester.Logic.Models; using System.Collections.ObjectModel; /// 被测件 / 测试信息。 public sealed class DutInfo { public string ProductName { get; set; } = ""; public string Model { get; set; } = ""; public string SerialNumber { get; set; } = ""; public string Manufacturer { get; set; } = ""; } public sealed class TestSiteInfo { public string Tester { get; set; } = ""; public DateTime TestDate { get; set; } = DateTime.Today; public double TemperatureC { get; set; } = 25.0; public double HumidityPct { get; set; } = 60.0; public double PressureKpa { get; set; } = 101.3; public string Remark { get; set; } = ""; } /// 一个测试项目:信息 + 选择 + 各模块结果。 public sealed class Project { public string Name { get; set; } = "新项目"; public DateTime CreatedAt { get; set; } = DateTime.Now; public DateTime LastTestedAt { get; set; } public DutInfo Dut { get; set; } = new(); public TestSiteInfo Site { get; set; } = new(); public TestSelection Selection { get; set; } = new(); public ReportSelection Report { get; set; } = new(); public TestFunctionNotes TestFunction { get; set; } = new(); public CurveThresholds CurveThresholds { get; set; } = new(); public ObservableCollection BasicResults { get; set; } = new(); public ObservableCollection CurveResults { get; set; } = new(); public ObservableCollection PowerResults { get; set; } = new(); public ObservableCollection ProtectResults { get; set; } = new(); /// 项目根目录(含 project.json、curves/、report.pdf)。运行时填充,不持久化。 [System.Text.Json.Serialization.JsonIgnore] public string FolderPath { get; set; } = ""; /// 综合判定(取所有结果中最差状态)。 public TestStatus OverallStatus { get { var all = BasicResults.Select(r => r.Status) .Concat(CurveResults.Select(r => r.Status)) .Concat(PowerResults.Select(r => r.Status)) .Concat(ProtectResults.Select(r => r.Status)) .ToList(); if (all.Count == 0) return TestStatus.Untested; if (all.Any(s => s == TestStatus.Fail)) return TestStatus.Fail; if (all.Any(s => s == TestStatus.Running)) return TestStatus.Running; if (all.All(s => s == TestStatus.Pass)) return TestStatus.Pass; if (all.All(s => s is TestStatus.Pass or TestStatus.Measured) && all.Any(s => s == TestStatus.Measured)) return TestStatus.Measured; return TestStatus.Untested; } } }