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;
}
}
}