Files
OrpaonVision/OrpaonVision.Core/FinalJudgment/IFinalJudgmentService.cs
2026-04-06 22:04:05 +08:00

1399 lines
32 KiB
C#

using OrpaonVision.Core.LayerCompletion;
using OrpaonVision.Core.Results;
namespace OrpaonVision.Core.FinalJudgment;
/// <summary>
/// 整机完成判定服务接口。
/// </summary>
public interface IFinalJudgmentService
{
/// <summary>
/// 执行整机完成判定。
/// </summary>
/// <param name="judgmentContext">判定上下文。</param>
/// <param name="finalRules">终判规则列表。</param>
/// <param name="cancellationToken">取消令牌。</param>
/// <returns>终判结果。</returns>
Task<Result<FinalJudgmentResult>> ExecuteFinalJudgmentAsync(FinalJudgmentContext judgmentContext, IReadOnlyList<FinalJudgmentRule> finalRules, CancellationToken cancellationToken = default);
/// <summary>
/// 批量执行整机完成判定。
/// </summary>
/// <param name="judgmentContexts">判定上下文列表。</param>
/// <param name="finalRules">终判规则列表。</param>
/// <param name="cancellationToken">取消令牌。</param>
/// <returns>批量终判结果。</returns>
Task<Result<BatchFinalJudgmentResult>> BatchExecuteFinalJudgmentAsync(IReadOnlyList<FinalJudgmentContext> judgmentContexts, IReadOnlyList<FinalJudgmentRule> finalRules, CancellationToken cancellationToken = default);
/// <summary>
/// 获取整机完成判定历史。
/// </summary>
/// <param name="startTime">开始时间。</param>
/// <param name="endTime">结束时间。</param>
/// <param name="cancellationToken">取消令牌。</param>
/// <returns>判定历史。</returns>
Task<Result<IReadOnlyList<FinalJudgmentHistory>>> GetJudgmentHistoryAsync(DateTime startTime, DateTime endTime, CancellationToken cancellationToken = default);
/// <summary>
/// 获取整机完成判定统计信息。
/// </summary>
/// <param name="startTime">开始时间。</param>
/// <param name="endTime">结束时间。</param>
/// <param name="cancellationToken">取消令牌。</param>
/// <returns>统计信息。</returns>
Task<Result<FinalJudgmentStatistics>> GetJudgmentStatisticsAsync(DateTime startTime, DateTime endTime, CancellationToken cancellationToken = default);
/// <summary>
/// 获取NG原因分析。
/// </summary>
/// <param name="startTime">开始时间。</param>
/// <param name="endTime">结束时间。</param>
/// <param name="cancellationToken">取消令牌。</param>
/// <returns>NG原因分析。</returns>
Task<Result<NGCauseAnalysis>> GetNGCauseAnalysisAsync(DateTime startTime, DateTime endTime, CancellationToken cancellationToken = default);
/// <summary>
/// 创建终判规则。
/// </summary>
/// <param name="rule">终判规则。</param>
/// <param name="cancellationToken">取消令牌。</param>
/// <returns>创建结果。</returns>
Task<Result<FinalJudgmentRule>> CreateFinalRuleAsync(FinalJudgmentRule rule, CancellationToken cancellationToken = default);
/// <summary>
/// 更新终判规则。
/// </summary>
/// <param name="rule">终判规则。</param>
/// <param name="cancellationToken">取消令牌。</param>
/// <returns>更新结果。</returns>
Task<Result> UpdateFinalRuleAsync(FinalJudgmentRule rule, CancellationToken cancellationToken = default);
/// <summary>
/// 删除终判规则。
/// </summary>
/// <param name="ruleId">规则ID。</param>
/// <param name="cancellationToken">取消令牌。</param>
/// <returns>删除结果。</returns>
Task<Result> DeleteFinalRuleAsync(Guid ruleId, CancellationToken cancellationToken = default);
/// <summary>
/// 获取终判规则列表。
/// </summary>
/// <param name="productTypeCode">产品类型编码(可选)。</param>
/// <param name="ruleType">规则类型(可选)。</param>
/// <param name="cancellationToken">取消令牌。</param>
/// <returns>规则列表。</returns>
Task<Result<IReadOnlyList<FinalJudgmentRule>>> GetFinalRulesAsync(string? productTypeCode = null, FinalJudgmentRuleType? ruleType = null, CancellationToken cancellationToken = default);
/// <summary>
/// 生成整机完成判定报告。
/// </summary>
/// <param name="judgmentId">判定ID。</param>
/// <param name="cancellationToken">取消令牌。</param>
/// <returns>判定报告。</returns>
Task<Result<FinalJudgmentReport>> GenerateJudgmentReportAsync(Guid judgmentId, CancellationToken cancellationToken = default);
}
/// <summary>
/// 整机完成判定上下文。
/// </summary>
public sealed class FinalJudgmentContext
{
/// <summary>
/// 产品类型编码。
/// </summary>
public string ProductTypeCode { get; init; } = string.Empty;
/// <summary>
/// 会话ID。
/// </summary>
public string SessionId { get; init; } = string.Empty;
/// <summary>
/// 总层级数量。
/// </summary>
public int TotalLayers { get; init; }
/// <summary>
/// 已完成层级数量。
/// </summary>
public int CompletedLayers { get; init; }
/// <summary>
/// 失败层级数量。
/// </summary>
public int FailedLayers { get; init; }
/// <summary>
/// 层级完成判定结果列表。
/// </summary>
public IReadOnlyList<LayerCompletionResult> LayerCompletionResults { get; init; } = Array.Empty<LayerCompletionResult>();
/// <summary>
/// 整体完成度。
/// </summary>
public double OverallCompletionPercentage => TotalLayers > 0 ? (double)CompletedLayers / TotalLayers * 100 : 0.0;
/// <summary>
/// 判定开始时间。
/// </summary>
public DateTime JudgmentStartTimeUtc { get; init; }
/// <summary>
/// 判定结束时间。
/// </summary>
public DateTime JudgmentEndTimeUtc { get; init; }
/// <summary>
/// 总耗时(毫秒)。
/// </summary>
public long TotalElapsedMs { get; init; }
/// <summary>
/// 是否存在错误。
/// </summary>
public bool HasErrors { get; init; }
/// <summary>
/// 错误信息列表。
/// </summary>
public IReadOnlyList<string> ErrorMessages { get; init; } = Array.Empty<string>();
/// <summary>
/// 是否需要人工干预。
/// </summary>
public bool RequiresManualIntervention { get; init; }
/// <summary>
/// 人工干预原因。
/// </summary>
public string? ManualInterventionReason { get; init; }
/// <summary>
/// 扩展属性。
/// </summary>
public Dictionary<string, object> ExtendedProperties { get; init; } = new();
}
/// <summary>
/// 整机完成判定结果。
/// </summary>
public sealed class FinalJudgmentResult
{
/// <summary>
/// 判定ID。
/// </summary>
public Guid JudgmentId { get; init; }
/// <summary>
/// 产品类型编码。
/// </summary>
public string ProductTypeCode { get; init; } = string.Empty;
/// <summary>
/// 会话ID。
/// </summary>
public string SessionId { get; init; } = string.Empty;
/// <summary>
/// 是否通过终判。
/// </summary>
public bool IsPassed { get; init; }
/// <summary>
/// 判定类型。
/// </summary>
public FinalJudgmentType JudgmentType { get; init; }
/// <summary>
/// 判定时间。
/// </summary>
public DateTime JudgmentTimeUtc { get; init; }
/// <summary>
/// 判定耗时(毫秒)。
/// </summary>
public long JudgmentElapsedMs { get; init; }
/// <summary>
/// 总体评分。
/// </summary>
public double OverallScore { get; init; }
/// <summary>
/// 判定质量。
/// </summary>
public JudgmentQuality JudgmentQuality { get; init; }
/// <summary>
/// 通过的规则列表。
/// </summary>
public IReadOnlyList<RuleJudgmentResult> PassedRules { get; init; } = Array.Empty<RuleJudgmentResult>();
/// <summary>
/// 失败的规则列表。
/// </summary>
public IReadOnlyList<RuleJudgmentResult> FailedRules { get; init; } = Array.Empty<RuleJudgmentResult>();
/// <summary>
/// NG原因列表。
/// </summary>
public IReadOnlyList<NGCause> NGCauses { get; init; } = Array.Empty<NGCause>();
/// <summary>
/// 证据链。
/// </summary>
public EvidenceChain EvidenceChain { get; init; } = new();
/// <summary>
/// 判定详情。
/// </summary>
public string? Details { get; init; }
/// <summary>
/// 判定建议。
/// </summary>
public string? Recommendation { get; init; }
/// <summary>
/// 扩展属性。
/// </summary>
public Dictionary<string, object> ExtendedProperties { get; init; } = new();
}
/// <summary>
/// 规则判定结果。
/// </summary>
public sealed class RuleJudgmentResult
{
/// <summary>
/// 规则ID。
/// </summary>
public Guid RuleId { get; init; }
/// <summary>
/// 规则名称。
/// </summary>
public string RuleName { get; init; } = string.Empty;
/// <summary>
/// 规则类型。
/// </summary>
public FinalJudgmentRuleType RuleType { get; init; }
/// <summary>
/// 是否通过规则。
/// </summary>
public bool IsPassed { get; init; }
/// <summary>
/// 规则评分。
/// </summary>
public double RuleScore { get; init; }
/// <summary>
/// 规则权重。
/// </summary>
public double RuleWeight { get; init; }
/// <summary>
/// 实际值。
/// </summary>
public double ActualValue { get; init; }
/// <summary>
/// 阈值。
/// </summary>
public double Threshold { get; init; }
/// <summary>
/// 判定详情。
/// </summary>
public string? Details { get; init; }
/// <summary>
/// 扩展属性。
/// </summary>
public Dictionary<string, object> ExtendedProperties { get; init; } = new();
}
/// <summary>
/// NG原因。
/// </summary>
public sealed class NGCause
{
/// <summary>
/// 原因ID。
/// </summary>
public Guid CauseId { get; init; }
/// <summary>
/// 原因类型。
/// </summary>
public NGCauseType CauseType { get; init; }
/// <summary>
/// 原因级别。
/// </summary>
public NGCauseLevel CauseLevel { get; init; }
/// <summary>
/// 原因描述。
/// </summary>
public string Description { get; init; } = string.Empty;
/// <summary>
/// 相关层级。
/// </summary>
public int? RelatedLayer { get; init; }
/// <summary>
/// 相关部件。
/// </summary>
public string? RelatedPart { get; init; }
/// <summary>
/// 发生时间。
/// </summary>
public DateTime OccurrenceTimeUtc { get; init; }
/// <summary>
/// 修复建议。
/// </summary>
public string? FixSuggestion { get; init; }
/// <summary>
/// 影响程度。
/// </summary>
public ImpactLevel ImpactLevel { get; init; }
/// <summary>
/// 扩展属性。
/// </summary>
public Dictionary<string, object> ExtendedProperties { get; init; } = new();
}
/// <summary>
/// 证据链。
/// </summary>
public sealed class EvidenceChain
{
/// <summary>
/// 证据链ID。
/// </summary>
public Guid ChainId { get; init; }
/// <summary>
/// 创建时间。
/// </summary>
public DateTime CreatedAtUtc { get; init; }
/// <summary>
/// 证据节点列表。
/// </summary>
public IReadOnlyList<EvidenceNode> EvidenceNodes { get; init; } = Array.Empty<EvidenceNode>();
/// <summary>
/// 证据链完整性评分。
/// </summary>
public double CompletenessScore { get; init; }
/// <summary>
/// 证据链可信度评分。
/// </summary>
public double CredibilityScore { get; init; }
/// <summary>
/// 扩展属性。
/// </summary>
public Dictionary<string, object> ExtendedProperties { get; init; } = new();
}
/// <summary>
/// 证据节点。
/// </summary>
public sealed class EvidenceNode
{
/// <summary>
/// 节点ID。
/// </summary>
public Guid NodeId { get; init; }
/// <summary>
/// 节点类型。
/// </summary>
public EvidenceNodeType NodeType { get; init; }
/// <summary>
/// 节点名称。
/// </summary>
public string NodeName { get; init; } = string.Empty;
/// <summary>
/// 节点描述。
/// </summary>
public string NodeDescription { get; init; } = string.Empty;
/// <summary>
/// 发生时间。
/// </summary>
public DateTime TimestampUtc { get; init; }
/// <summary>
/// 相关层级。
/// </summary>
public int? RelatedLayer { get; init; }
/// <summary>
/// 数据内容。
/// </summary>
public object? DataContent { get; init; }
/// <summary>
/// 文件路径。
/// </summary>
public string? FilePath { get; init; }
/// <summary>
/// 证据权重。
/// </summary>
public double EvidenceWeight { get; init; }
/// <summary>
/// 扩展属性。
/// </summary>
public Dictionary<string, object> ExtendedProperties { get; init; } = new();
}
/// <summary>
/// 批量终判结果。
/// </summary>
public sealed class BatchFinalJudgmentResult
{
/// <summary>
/// 终判结果列表。
/// </summary>
public IReadOnlyList<FinalJudgmentResult> JudgmentResults { get; init; } = Array.Empty<FinalJudgmentResult>();
/// <summary>
/// 总判定数量。
/// </summary>
public int TotalJudgments { get; init; }
/// <summary>
/// 通过数量。
/// </summary>
public int PassedCount { get; init; }
/// <summary>
/// 失败数量。
/// </summary>
public int FailedCount { get; init; }
/// <summary>
/// 总体通过率。
/// </summary>
public double OverallPassRate => TotalJudgments > 0 ? (double)PassedCount / TotalJudgments * 100 : 0.0;
/// <summary>
/// 批量处理时间。
/// </summary>
public DateTime BatchProcessingTimeUtc { get; init; }
/// <summary>
/// 总耗时(毫秒)。
/// </summary>
public long TotalElapsedMs { get; init; }
/// <summary>
/// 判定详情。
/// </summary>
public string? Details { get; init; }
/// <summary>
/// 扩展属性。
/// </summary>
public Dictionary<string, object> ExtendedProperties { get; init; } = new();
}
/// <summary>
/// 整机完成判定历史。
/// </summary>
public sealed class FinalJudgmentHistory
{
/// <summary>
/// 判定ID。
/// </summary>
public Guid JudgmentId { get; init; }
/// <summary>
/// 产品类型编码。
/// </summary>
public string ProductTypeCode { get; init; } = string.Empty;
/// <summary>
/// 会话ID。
/// </summary>
public string SessionId { get; init; } = string.Empty;
/// <summary>
/// 判定类型。
/// </summary>
public FinalJudgmentType JudgmentType { get; init; }
/// <summary>
/// 判定时间。
/// </summary>
public DateTime JudgmentTimeUtc { get; init; }
/// <summary>
/// 是否通过。
/// </summary>
public bool IsPassed { get; init; }
/// <summary>
/// 总体评分。
/// </summary>
public double OverallScore { get; init; }
/// <summary>
/// 判定质量。
/// </summary>
public JudgmentQuality JudgmentQuality { get; init; }
/// <summary>
/// 操作用户。
/// </summary>
public string OperatorUser { get; init; } = string.Empty;
/// <summary>
/// NG原因数量。
/// </summary>
public int NGCauseCount { get; init; }
/// <summary>
/// 扩展属性。
/// </summary>
public Dictionary<string, object> ExtendedProperties { get; init; } = new();
}
/// <summary>
/// 整机完成判定统计信息。
/// </summary>
public sealed class FinalJudgmentStatistics
{
/// <summary>
/// 总判定次数。
/// </summary>
public int TotalJudgments { get; init; }
/// <summary>
/// 通过次数。
/// </summary>
public int PassedCount { get; init; }
/// <summary>
/// 失败次数。
/// </summary>
public int FailedCount { get; init; }
/// <summary>
/// 总体通过率。
/// </summary>
public double OverallPassRate => TotalJudgments > 0 ? (double)PassedCount / TotalJudgments * 100 : 0.0;
/// <summary>
/// 按判定类型分组的统计。
/// </summary>
public Dictionary<FinalJudgmentType, JudgmentTypeStatistics> ByJudgmentType { get; init; } = new();
/// <summary>
/// 按产品类型分组的统计。
/// </summary>
public Dictionary<string, ProductTypeJudgmentStatistics> ByProductType { get; init; } = new();
/// <summary>
/// 按判定质量分组的统计。
/// </summary>
public Dictionary<JudgmentQuality, QualityStatistics> ByQuality { get; init; } = new();
/// <summary>
/// 平均评分。
/// </summary>
public double AverageScore { get; init; }
/// <summary>
/// 平均耗时(毫秒)。
/// </summary>
public double AverageElapsedMs { get; init; }
/// <summary>
/// 统计开始时间。
/// </summary>
public DateTime StartTimeUtc { get; init; }
/// <summary>
/// 统计结束时间。
/// </summary>
public DateTime EndTimeUtc { get; init; }
}
/// <summary>
/// 判定类型统计。
/// </summary>
public sealed class JudgmentTypeStatistics
{
/// <summary>
/// 判定类型。
/// </summary>
public FinalJudgmentType JudgmentType { get; init; }
/// <summary>
/// 判定次数。
/// </summary>
public int JudgmentCount { get; init; }
/// <summary>
/// 通过次数。
/// </summary>
public int PassCount { get; init; }
/// <summary>
/// 通过率。
/// </summary>
public double PassRate => JudgmentCount > 0 ? (double)PassCount / JudgmentCount * 100 : 0.0;
/// <summary>
/// 平均评分。
/// </summary>
public double AverageScore { get; init; }
/// <summary>
/// 平均耗时(毫秒)。
/// </summary>
public double AverageElapsedMs { get; init; }
}
/// <summary>
/// 产品类型判定统计。
/// </summary>
public sealed class ProductTypeJudgmentStatistics
{
/// <summary>
/// 产品类型编码。
/// </summary>
public string ProductTypeCode { get; init; } = string.Empty;
/// <summary>
/// 判定次数。
/// </summary>
public int JudgmentCount { get; init; }
/// <summary>
/// 通过次数。
/// </summary>
public int PassCount { get; init; }
/// <summary>
/// 通过率。
/// </summary>
public double PassRate => JudgmentCount > 0 ? (double)PassCount / JudgmentCount * 100 : 0.0;
/// <summary>
/// 平均评分。
/// </summary>
public double AverageScore { get; init; }
/// <summary>
/// 平均耗时(毫秒)。
/// </summary>
public double AverageElapsedMs { get; init; }
}
/// <summary>
/// 质量统计。
/// </summary>
public sealed class QualityStatistics
{
/// <summary>
/// 判定质量。
/// </summary>
public JudgmentQuality Quality { get; init; }
/// <summary>
/// 判定次数。
/// </summary>
public int JudgmentCount { get; init; }
/// <summary>
/// 占比。
/// </summary>
public double Percentage => JudgmentCount > 0 ? (double)JudgmentCount / JudgmentCount * 100 : 0.0;
/// <summary>
/// 平均评分。
/// </summary>
public double AverageScore { get; init; }
}
/// <summary>
/// NG原因分析。
/// </summary>
public sealed class NGCauseAnalysis
{
/// <summary>
/// 分析时间范围。
/// </summary>
public DateTime StartTimeUtc { get; init; }
/// <summary>
/// 分析时间范围。
/// </summary>
public DateTime EndTimeUtc { get; init; }
/// <summary>
/// 总NG数量。
/// </summary>
public int TotalNGCount { get; init; }
/// <summary>
/// 按原因类型分组的统计。
/// </summary>
public Dictionary<NGCauseType, CauseTypeStatistics> ByCauseType { get; init; } = new();
/// <summary>
/// 按原因级别分组的统计。
/// </summary>
public Dictionary<NGCauseLevel, CauseLevelStatistics> ByCauseLevel { get; init; } = new();
/// <summary>
/// 按影响程度分组的统计。
/// </summary>
public Dictionary<ImpactLevel, ImpactStatistics> ByImpactLevel { get; init; } = new();
/// <summary>
/// 按层级分组的统计。
/// </summary>
public Dictionary<int, LayerNGStatistics> ByLayer { get; init; } = new();
/// <summary>
/// 热点NG原因列表。
/// </summary>
public IReadOnlyList<HotNGCause> HotCauses { get; init; } = Array.Empty<HotNGCause>();
/// <summary>
/// 趋势分析。
/// </summary>
public NGCauseTrend Trend { get; init; } = new();
}
/// <summary>
/// 原因类型统计。
/// </summary>
public sealed class CauseTypeStatistics
{
/// <summary>
/// 原因类型。
/// </summary>
public NGCauseType CauseType { get; init; }
/// <summary>
/// 发生次数。
/// </summary>
public int OccurrenceCount { get; init; }
/// <summary>
/// 占比。
/// </summary>
public double Percentage => OccurrenceCount > 0 ? (double)OccurrenceCount / OccurrenceCount * 100 : 0.0;
/// <summary>
/// 平均影响程度。
/// </summary>
public double AverageImpactLevel { get; init; }
}
/// <summary>
/// 原因级别统计。
/// </summary>
public sealed class CauseLevelStatistics
{
/// <summary>
/// 原因级别。
/// </summary>
public NGCauseLevel CauseLevel { get; init; }
/// <summary>
/// 发生次数。
/// </summary>
public int OccurrenceCount { get; init; }
/// <summary>
/// 占比。
/// </summary>
public double Percentage => OccurrenceCount > 0 ? (double)OccurrenceCount / OccurrenceCount * 100 : 0.0;
}
/// <summary>
/// 影响程度统计。
/// </summary>
public sealed class ImpactStatistics
{
/// <summary>
/// 影响程度。
/// </summary>
public ImpactLevel ImpactLevel { get; init; }
/// <summary>
/// 发生次数。
/// </summary>
public int OccurrenceCount { get; init; }
/// <summary>
/// 占比。
/// </summary>
public double Percentage => OccurrenceCount > 0 ? (double)OccurrenceCount / OccurrenceCount * 100 : 0.0;
}
/// <summary>
/// 层级NG统计。
/// </summary>
public sealed class LayerNGStatistics
{
/// <summary>
/// 层级编号。
/// </summary>
public int LayerNumber { get; init; }
/// <summary>
/// NG数量。
/// </summary>
public int NGCount { get; init; }
/// <summary>
/// 占比。
/// </summary>
public double Percentage => NGCount > 0 ? (double)NGCount / NGCount * 100 : 0.0;
}
/// <summary>
/// 热点NG原因。
/// </summary>
public sealed class HotNGCause
{
/// <summary>
/// 原因描述。
/// </summary>
public string Description { get; init; } = string.Empty;
/// <summary>
/// 发生次数。
/// </summary>
public int OccurrenceCount { get; init; }
/// <summary>
/// 排名。
/// </summary>
public int Rank { get; init; }
/// <summary>
/// 趋势。
/// </summary>
public NGCauseTrendDirection Trend { get; init; }
}
/// <summary>
/// NG原因趋势。
/// </summary>
public sealed class NGCauseTrend
{
/// <summary>
/// 趋势方向。
/// </summary>
public NGCauseTrendDirection Direction { get; init; }
/// <summary>
/// 变化率。
/// </summary>
public double ChangeRate { get; init; }
/// <summary>
/// 趋势描述。
/// </summary>
public string TrendDescription { get; init; } = string.Empty;
}
/// <summary>
/// 终判规则。
/// </summary>
public sealed class FinalJudgmentRule
{
/// <summary>
/// 规则ID。
/// </summary>
public Guid RuleId { get; init; }
/// <summary>
/// 规则名称。
/// </summary>
public string RuleName { get; init; } = string.Empty;
/// <summary>
/// 规则描述。
/// </summary>
public string RuleDescription { get; init; } = string.Empty;
/// <summary>
/// 产品类型编码。
/// </summary>
public string ProductTypeCode { get; init; } = string.Empty;
/// <summary>
/// 规则类型。
/// </summary>
public FinalJudgmentRuleType RuleType { get; init; }
/// <summary>
/// 规则权重。
/// </summary>
public double RuleWeight { get; init; } = 1.0;
/// <summary>
/// 阈值。
/// </summary>
public double Threshold { get; init; }
/// <summary>
/// 比较操作符。
/// </summary>
public ComparisonOperator ComparisonOperator { get; init; }
/// <summary>
/// 是否为必须满足的规则。
/// </summary>
public bool IsMandatory { get; init; } = true;
/// <summary>
/// 是否启用。
/// </summary>
public bool IsEnabled { get; init; } = true;
/// <summary>
/// 优先级。
/// </summary>
public int Priority { get; init; } = 1;
/// <summary>
/// 创建时间。
/// </summary>
public DateTime CreatedAtUtc { get; init; }
/// <summary>
/// 更新时间。
/// </summary>
public DateTime UpdatedAtUtc { get; init; }
/// <summary>
/// 版本号。
/// </summary>
public string Version { get; init; } = "1.0";
/// <summary>
/// 扩展属性。
/// </summary>
public Dictionary<string, object> ExtendedProperties { get; init; } = new();
}
/// <summary>
/// 整机完成判定报告。
/// </summary>
public sealed class FinalJudgmentReport
{
/// <summary>
/// 报告ID。
/// </summary>
public Guid ReportId { get; init; }
/// <summary>
/// 判定ID。
/// </summary>
public Guid JudgmentId { get; init; }
/// <summary>
/// 报告生成时间。
/// </summary>
public DateTime GeneratedAtUtc { get; init; }
/// <summary>
/// 报告类型。
/// </summary>
public ReportType ReportType { get; init; }
/// <summary>
/// 报告内容。
/// </summary>
public string ReportContent { get; init; } = string.Empty;
/// <summary>
/// 报告格式。
/// </summary>
public ReportFormat ReportFormat { get; init; }
/// <summary>
/// 文件路径。
/// </summary>
public string? FilePath { get; init; }
/// <summary>
/// 扩展属性。
/// </summary>
public Dictionary<string, object> ExtendedProperties { get; init; } = new();
}
/// <summary>
/// 整机完成判定类型枚举。
/// </summary>
public enum FinalJudgmentType
{
/// <summary>
/// 自动判定。
/// </summary>
Automatic = 0,
/// <summary>
/// 手动判定。
/// </summary>
Manual = 1,
/// <summary>
/// 复核判定。
/// </summary>
Review = 2,
/// <summary>
/// 仲裁判定。
/// </summary>
Arbitration = 3
}
/// <summary>
/// 终判规则类型枚举。
/// </summary>
public enum FinalJudgmentRuleType
{
/// <summary>
/// 完成度规则。
/// </summary>
CompletionRate = 0,
/// <summary>
/// 质量评分规则。
/// </summary>
QualityScore = 1,
/// <summary>
/// 错误率规则。
/// </summary>
ErrorRate = 2,
/// <summary>
/// 时间规则。
/// </summary>
TimeConstraint = 3,
/// <summary>
/// 自定义规则。
/// </summary>
Custom = 4
}
/// <summary>
/// 判定质量枚举。
/// </summary>
public enum JudgmentQuality
{
/// <summary>
/// 优秀。
/// </summary>
Excellent = 0,
/// <summary>
/// 良好。
/// </summary>
Good = 1,
/// <summary>
/// 一般。
/// </summary>
Fair = 2,
/// <summary>
/// 较差。
/// </summary>
Poor = 3,
/// <summary>
/// 不合格。
/// </summary>
Unqualified = 4
}
/// <summary>
/// NG原因类型枚举。
/// </summary>
public enum NGCauseType
{
/// <summary>
/// 部件缺失。
/// </summary>
MissingPart = 0,
/// <summary>
/// 部件错误。
/// </summary>
WrongPart = 1,
/// <summary>
/// 位置错误。
/// </summary>
WrongPosition = 2,
/// <summary>
/// 质量问题。
/// </summary>
QualityIssue = 3,
/// <summary>
/// 工艺问题。
/// </summary>
ProcessIssue = 4,
/// <summary>
/// 设备问题。
/// </summary>
EquipmentIssue = 5,
/// <summary>
/// 环境问题。
/// </summary>
EnvironmentIssue = 6,
/// <summary>
/// 人为因素。
/// </summary>
HumanFactor = 7,
/// <summary>
/// 其他原因。
/// </summary>
Other = 8
}
/// <summary>
/// NG原因级别枚举。
/// </summary>
public enum NGCauseLevel
{
/// <summary>
/// 轻微。
/// </summary>
Minor = 0,
/// <summary>
/// 一般。
/// </summary>
Normal = 1,
/// <summary>
/// 严重。
/// </summary>
Serious = 2,
/// <summary>
/// 致命。
/// </summary>
Critical = 3
}
/// <summary>
/// 影响程度枚举。
/// </summary>
public enum ImpactLevel
{
/// <summary>
/// 低影响。
/// </summary>
Low = 0,
/// <summary>
/// 中影响。
/// </summary>
Medium = 1,
/// <summary>
/// 高影响。
/// </summary>
High = 2,
/// <summary>
/// 严重影响。
/// </summary>
Critical = 3
}
/// <summary>
/// 证据节点类型枚举。
/// </summary>
public enum EvidenceNodeType
{
/// <summary>
/// 图像证据。
/// </summary>
Image = 0,
/// <summary>
/// 数据证据。
/// </summary>
Data = 1,
/// <summary>
/// 日志证据。
/// </summary>
Log = 2,
/// <summary>
/// 视频证据。
/// </summary>
Video = 3,
/// <summary>
/// 文档证据。
/// </summary>
Document = 4,
/// <summary>
/// 其他证据。
/// </summary>
Other = 5
}
/// <summary>
/// NG原因趋势方向枚举。
/// </summary>
public enum NGCauseTrendDirection
{
/// <summary>
/// 上升。
/// </summary>
Increasing = 0,
/// <summary>
/// 下降。
/// </summary>
Decreasing = 1,
/// <summary>
/// 稳定。
/// </summary>
Stable = 2,
/// <summary>
/// 波动。
/// </summary>
Fluctuating = 3
}
/// <summary>
/// 报告类型枚举。
/// </summary>
public enum ReportType
{
/// <summary>
/// 标准报告。
/// </summary>
Standard = 0,
/// <summary>
/// 详细报告。
/// </summary>
Detailed = 1,
/// <summary>
/// 摘要报告。
/// </summary>
Summary = 2,
/// <summary>
/// 统计报告。
/// </summary>
Statistical = 3
}
/// <summary>
/// 报告格式枚举。
/// </summary>
public enum ReportFormat
{
/// <summary>
/// 文本格式。
/// </summary>
Text = 0,
/// <summary>
/// HTML格式。
/// </summary>
Html = 1,
/// <summary>
/// PDF格式。
/// </summary>
Pdf = 2,
/// <summary>
/// Excel格式。
/// </summary>
Excel = 3,
/// <summary>
/// JSON格式。
/// </summary>
Json = 4
}
/// <summary>
/// 比较操作符枚举。
/// </summary>
public enum ComparisonOperator
{
/// <summary>
/// 等于。
/// </summary>
Equal = 0,
/// <summary>
/// 不等于。
/// </summary>
NotEqual = 1,
/// <summary>
/// 大于。
/// </summary>
GreaterThan = 2,
/// <summary>
/// 大于等于。
/// </summary>
GreaterThanOrEqual = 3,
/// <summary>
/// 小于。
/// </summary>
LessThan = 4,
/// <summary>
/// 小于等于。
/// </summary>
LessThanOrEqual = 5
}