1399 lines
32 KiB
C#
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
|
|
}
|