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

3002 lines
70 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using OrpaonVision.Core.Results;
using OrpaonVision.Core.Common;
namespace OrpaonVision.Core.HistoryTrace;
/// <summary>
/// 历史追溯服务接口。
/// </summary>
public interface IHistoryTraceService
{
/// <summary>
/// 获取产品会话历史记录。
/// </summary>
/// <param name="startTime">开始时间。</param>
/// <param name="endTime">结束时间。</param>
/// <param name="productTypeCode">产品类型编码(可选)。</param>
/// <param name="sessionStatus">会话状态(可选)。</param>
/// <param name="cancellationToken">取消令牌。</param>
/// <returns>产品会话历史记录。</returns>
Task<Result<IReadOnlyList<ProductSessionHistory>>> GetProductSessionHistoryAsync(DateTime startTime, DateTime endTime, string? productTypeCode = null, SessionStatus? sessionStatus = null, CancellationToken cancellationToken = default);
/// <summary>
/// 获取会话详细信息。
/// </summary>
/// <param name="sessionId">会话ID。</param>
/// <param name="cancellationToken">取消令牌。</param>
/// <returns>会话详细信息。</returns>
Task<Result<ProductSessionDetail>> GetSessionDetailAsync(Guid sessionId, CancellationToken cancellationToken = default);
/// <summary>
/// 获取层处理历史记录。
/// </summary>
/// <param name="sessionId">会话ID。</param>
/// <param name="cancellationToken">取消令牌。</param>
/// <returns>层处理历史记录。</returns>
Task<Result<IReadOnlyList<LayerProcessingHistory>>> GetLayerProcessingHistoryAsync(Guid sessionId, CancellationToken cancellationToken = default);
/// <summary>
/// 获取层详细信息。
/// </summary>
/// <param name="layerId">层ID。</param>
/// <param name="cancellationToken">取消令牌。</param>
/// <returns>层详细信息。</returns>
Task<Result<LayerProcessingDetail>> GetLayerDetailAsync(Guid layerId, CancellationToken cancellationToken = default);
/// <summary>
/// 获取截图历史记录。
/// </summary>
/// <param name="sessionId">会话ID可选。</param>
/// <param name="layerId">层ID可选。</param>
/// <param name="startTime">开始时间(可选)。</param>
/// <param name="endTime">结束时间(可选)。</param>
/// <param name="screenshotType">截图类型(可选)。</param>
/// <param name="cancellationToken">取消令牌。</param>
/// <returns>截图历史记录。</returns>
Task<Result<IReadOnlyList<ScreenshotHistory>>> GetScreenshotHistoryAsync(Guid? sessionId = null, Guid? layerId = null, DateTime? startTime = null, DateTime? endTime = null, ScreenshotType? screenshotType = null, CancellationToken cancellationToken = default);
/// <summary>
/// 获取截图详细信息。
/// </summary>
/// <param name="screenshotId">截图ID。</param>
/// <param name="cancellationToken">取消令牌。</param>
/// <returns>截图详细信息。</returns>
Task<Result<ScreenshotDetail>> GetScreenshotDetailAsync(Guid screenshotId, CancellationToken cancellationToken = default);
/// <summary>
/// 获取截图文件内容。
/// </summary>
/// <param name="screenshotId">截图ID。</param>
/// <param name="cancellationToken">取消令牌。</param>
/// <returns>截图文件内容。</returns>
Task<Result<byte[]>> GetScreenshotContentAsync(Guid screenshotId, CancellationToken cancellationToken = default);
/// <summary>
/// 获取证据链信息。
/// </summary>
/// <param name="sessionId">会话ID。</param>
/// <param name="cancellationToken">取消令牌。</param>
/// <returns>证据链信息。</returns>
Task<Result<EvidenceChain>> GetEvidenceChainAsync(Guid sessionId, CancellationToken cancellationToken = default);
/// <summary>
/// 获取层级证据回溯。
/// </summary>
/// <param name="sessionId">会话ID。</param>
/// <param name="layerSequence">层序号(可选)。</param>
/// <param name="cancellationToken">取消令牌。</param>
/// <returns>层级证据回溯。</returns>
Task<Result<LayerEvidenceTraceback>> GetLayerEvidenceTracebackAsync(Guid sessionId, int? layerSequence = null, CancellationToken cancellationToken = default);
/// <summary>
/// 获取缺陷追溯信息。
/// </summary>
/// <param name="sessionId">会话ID。</param>
/// <param name="defectType">缺陷类型(可选)。</param>
/// <param name="cancellationToken">取消令牌。</param>
/// <returns>缺陷追溯信息。</returns>
Task<Result<DefectTraceback>> GetDefectTracebackAsync(Guid sessionId, DefectType? defectType = null, CancellationToken cancellationToken = default);
/// <summary>
/// 获取操作历史记录。
/// </summary>
/// <param name="sessionId">会话ID可选。</param>
/// <param name="operatorId">操作员ID可选。</param>
/// <param name="startTime">开始时间(可选)。</param>
/// <param name="endTime">结束时间(可选)。</param>
/// <param name="operationType">操作类型(可选)。</param>
/// <param name="cancellationToken">取消令牌。</param>
/// <returns>操作历史记录。</returns>
Task<Result<IReadOnlyList<OperationHistory>>> GetOperationHistoryAsync(Guid? sessionId = null, string? operatorId = null, DateTime? startTime = null, DateTime? endTime = null, OperationType? operationType = null, CancellationToken cancellationToken = default);
/// <summary>
/// 获取综合追溯报告。
/// </summary>
/// <param name="sessionId">会话ID。</param>
/// <param name="reportType">报告类型。</param>
/// <param name="cancellationToken">取消令牌。</param>
/// <returns>综合追溯报告。</returns>
Task<Result<ComprehensiveTracebackReport>> GetComprehensiveTracebackReportAsync(Guid sessionId, TracebackReportType reportType, CancellationToken cancellationToken = default);
/// <summary>
/// 获取追溯统计数据。
/// </summary>
/// <param name="startTime">开始时间。</param>
/// <param name="endTime">结束时间。</param>
/// <param name="productTypeCode">产品类型编码(可选)。</param>
/// <param name="cancellationToken">取消令牌。</param>
/// <returns>追溯统计数据。</returns>
Task<Result<TracebackStatistics>> GetTracebackStatisticsAsync(DateTime startTime, DateTime endTime, string? productTypeCode = null, CancellationToken cancellationToken = default);
/// <summary>
/// 搜索历史记录。
/// </summary>
/// <param name="searchRequest">搜索请求。</param>
/// <param name="cancellationToken">取消令牌。</param>
/// <returns>搜索结果。</returns>
Task<Result<HistorySearchResult>> SearchHistoryAsync(HistorySearchRequest searchRequest, CancellationToken cancellationToken = default);
/// <summary>
/// 导出追溯数据。
/// </summary>
/// <param name="exportRequest">导出请求。</param>
/// <param name="cancellationToken">取消令牌。</param>
/// <returns>导出结果。</returns>
Task<Result<TracebackExportResult>> ExportTracebackDataAsync(TracebackExportRequest exportRequest, CancellationToken cancellationToken = default);
}
/// <summary>
/// 产品会话历史记录。
/// </summary>
public sealed class ProductSessionHistory
{
/// <summary>
/// 会话ID。
/// </summary>
public Guid SessionId { get; init; }
/// <summary>
/// 产品序列号。
/// </summary>
public string ProductSerialNumber { get; init; } = string.Empty;
/// <summary>
/// 产品类型编码。
/// </summary>
public string ProductTypeCode { get; init; } = string.Empty;
/// <summary>
/// 会话状态。
/// </summary>
public SessionStatus SessionStatus { get; init; }
/// <summary>
/// 会话开始时间。
/// </summary>
public DateTime SessionStartTimeUtc { get; init; }
/// <summary>
/// 会话结束时间。
/// </summary>
public DateTime? SessionEndTimeUtc { get; init; }
/// <summary>
/// 会话持续时间(分钟)。
/// </summary>
public double SessionDurationMinutes => SessionEndTimeUtc.HasValue ? (SessionEndTimeUtc.Value - SessionStartTimeUtc).TotalMinutes : (DateTime.UtcNow - SessionStartTimeUtc).TotalMinutes;
/// <summary>
/// 操作员ID。
/// </summary>
public string? OperatorId { get; init; }
/// <summary>
/// 操作员姓名。
/// </summary>
public string? OperatorName { get; init; }
/// <summary>
/// 工位ID。
/// </summary>
public string? StationId { get; init; }
/// <summary>
/// 工位名称。
/// </summary>
public string? StationName { get; init; }
/// <summary>
/// 总层数。
/// </summary>
public int TotalLayerCount { get; init; }
/// <summary>
/// 已完成层数。
/// </summary>
public int CompletedLayerCount { get; init; }
/// <summary>
/// 会话完成率。
/// </summary>
public double SessionCompletionRate => TotalLayerCount > 0 ? (double)CompletedLayerCount / TotalLayerCount * 100 : 0.0;
/// <summary>
/// 最终判定结果。
/// </summary>
public FinalJudgmentResult? FinalJudgmentResult { get; init; }
/// <summary>
/// 缺陷数量。
/// </summary>
public int DefectCount { get; init; }
/// <summary>
/// 报警数量。
/// </summary>
public int AlarmCount { get; init; }
/// <summary>
/// 截图数量。
/// </summary>
public int ScreenshotCount { get; init; }
/// <summary>
/// 扩展属性。
/// </summary>
public Dictionary<string, object> ExtendedProperties { get; init; } = new();
}
/// <summary>
/// 会话状态枚举。
/// </summary>
public enum SessionStatus
{
/// <summary>
/// 进行中。
/// </summary>
InProgress = 0,
/// <summary>
/// 已完成。
/// </summary>
Completed = 1,
/// <summary>
/// 已取消。
/// </summary>
Cancelled = 2,
/// <summary>
/// 已暂停。
/// </summary>
Paused = 3,
/// <summary>
/// 失败。
/// </summary>
Failed = 4,
/// <summary>
/// 异常终止。
/// </summary>
Aborted = 5
}
/// <summary>
/// 最终判定结果枚举。
/// </summary>
public enum FinalJudgmentResult
{
/// <summary>
/// 通过。
/// </summary>
Pass = 0,
/// <summary>
/// 不通过。
/// </summary>
Fail = 1,
/// <summary>
/// 待定。
/// </summary>
Pending = 2,
/// <summary>
/// 人工判定。
/// </summary>
ManualJudgment = 3
}
/// <summary>
/// 产品会话详细信息。
/// </summary>
public sealed class ProductSessionDetail
{
/// <summary>
/// 会话历史信息。
/// </summary>
public ProductSessionHistory SessionHistory { get; init; } = new();
/// <summary>
/// 层处理历史记录。
/// </summary>
public IReadOnlyList<LayerProcessingHistory> LayerHistories { get; init; } = Array.Empty<LayerProcessingHistory>();
/// <summary>
/// 截图历史记录。
/// </summary>
public IReadOnlyList<ScreenshotHistory> ScreenshotHistories { get; init; } = Array.Empty<ScreenshotHistory>();
/// <summary>
/// 操作历史记录。
/// </summary>
public IReadOnlyList<OperationHistory> OperationHistories { get; init; } = Array.Empty<OperationHistory>();
/// <summary>
/// 证据链信息。
/// </summary>
public EvidenceChain? EvidenceChain { get; init; }
/// <summary>
/// 缺陷追溯信息。
/// </summary>
public DefectTraceback? DefectTraceback { get; init; }
/// <summary>
/// 性能指标。
/// </summary>
public SessionPerformanceMetrics PerformanceMetrics { get; init; } = new();
/// <summary>
/// 扩展属性。
/// </summary>
public Dictionary<string, object> ExtendedProperties { get; init; } = new();
}
/// <summary>
/// 层处理历史记录。
/// </summary>
public sealed class LayerProcessingHistory
{
/// <summary>
/// 层ID。
/// </summary>
public Guid LayerId { get; init; }
/// <summary>
/// 会话ID。
/// </summary>
public Guid SessionId { get; init; }
/// <summary>
/// 层序号。
/// </summary>
public int LayerSequence { get; init; }
/// <summary>
/// 层名称。
/// </summary>
public string LayerName { get; init; } = string.Empty;
/// <summary>
/// 层类型。
/// </summary>
public string LayerType { get; init; } = string.Empty;
/// <summary>
/// 层状态。
/// </summary>
public LayerStatus LayerStatus { get; init; }
/// <summary>
/// 层开始时间。
/// </summary>
public DateTime LayerStartTimeUtc { get; init; }
/// <summary>
/// 层结束时间。
/// </summary>
public DateTime? LayerEndTimeUtc { get; init; }
/// <summary>
/// 层处理持续时间(秒)。
/// </summary>
public double LayerProcessingDurationSeconds => LayerEndTimeUtc.HasValue ? (LayerEndTimeUtc.Value - LayerStartTimeUtc).TotalSeconds : (DateTime.UtcNow - LayerStartTimeUtc).TotalSeconds;
/// <summary>
/// 检测到的部件数量。
/// </summary>
public int DetectedPartCount { get; init; }
/// <summary>
/// 合格部件数量。
/// </summary>
public int QualifiedPartCount { get; init; }
/// <summary>
/// 缺陷部件数量。
/// </summary>
public int DefectivePartCount { get; init; }
/// <summary>
/// 层合格率。
/// </summary>
public double LayerPassRate => DetectedPartCount > 0 ? (double)QualifiedPartCount / DetectedPartCount * 100 : 0.0;
/// <summary>
/// 层判定结果。
/// </summary>
public LayerJudgmentResult LayerJudgmentResult { get; init; }
/// <summary>
/// 缺陷列表。
/// </summary>
public IReadOnlyList<LayerDefect> Defects { get; init; } = Array.Empty<LayerDefect>();
/// <summary>
/// 截图数量。
/// </summary>
public int ScreenshotCount { get; init; }
/// <summary>
/// 报警数量。
/// </summary>
public int AlarmCount { get; init; }
/// <summary>
/// 扩展属性。
/// </summary>
public Dictionary<string, object> ExtendedProperties { get; init; } = new();
}
/// <summary>
/// 层状态枚举。
/// </summary>
public enum LayerStatus
{
/// <summary>
/// 等待中。
/// </summary>
Waiting = 0,
/// <summary>
/// 处理中。
/// </summary>
Processing = 1,
/// <summary>
/// 已完成。
/// </summary>
Completed = 2,
/// <summary>
/// 失败。
/// </summary>
Failed = 3,
/// <summary>
/// 跳过。
/// </summary>
Skipped = 4,
/// <summary>
/// 重试中。
/// </summary>
Retrying = 5
}
/// <summary>
/// 层判定结果枚举。
/// </summary>
public enum LayerJudgmentResult
{
/// <summary>
/// 通过。
/// </summary>
Pass = 0,
/// <summary>
/// 不通过。
/// </summary>
Fail = 1,
/// <summary>
/// 重试。
/// </summary>
Retry = 2,
/// <summary>
/// 人工判定。
/// </summary>
ManualJudgment = 3
}
/// <summary>
/// 层缺陷信息。
/// </summary>
public sealed class LayerDefect
{
/// <summary>
/// 缺陷ID。
/// </summary>
public Guid DefectId { get; init; }
/// <summary>
/// 缺陷类型。
/// </summary>
public DefectType DefectType { get; init; }
/// <summary>
/// 缺陷严重程度。
/// </summary>
public DefectSeverity DefectSeverity { get; init; }
/// <summary>
/// 缺陷描述。
/// </summary>
public string DefectDescription { get; init; } = string.Empty;
/// <summary>
/// 部件名称。
/// </summary>
public string? PartName { get; init; }
/// <summary>
/// 缺陷位置X坐标。
/// </summary>
public double DefectPositionX { get; init; }
/// <summary>
/// 缺陷位置Y坐标。
/// </summary>
public double DefectPositionY { get; init; }
/// <summary>
/// 缺陷置信度。
/// </summary>
public double DefectConfidence { get; init; }
/// <summary>
/// 检测时间。
/// </summary>
public DateTime DetectionTimeUtc { get; init; }
/// <summary>
/// 关联截图ID。
/// </summary>
public Guid? AssociatedScreenshotId { get; init; }
/// <summary>
/// 扩展属性。
/// </summary>
public Dictionary<string, object> ExtendedProperties { get; init; } = new();
}
/// <summary>
/// 层处理详细信息。
/// </summary>
public sealed class LayerProcessingDetail
{
/// <summary>
/// 层处理历史信息。
/// </summary>
public LayerProcessingHistory LayerHistory { get; init; } = new();
/// <summary>
/// 截图历史记录。
/// </summary>
public IReadOnlyList<ScreenshotHistory> ScreenshotHistories { get; init; } = Array.Empty<ScreenshotHistory>();
/// <summary>
/// 操作历史记录。
/// </summary>
public IReadOnlyList<OperationHistory> OperationHistories { get; init; } = Array.Empty<OperationHistory>();
/// <summary>
/// 部件检测结果。
/// </summary>
public IReadOnlyList<PartDetectionResult> PartDetectionResults { get; init; } = Array.Empty<PartDetectionResult>();
/// <summary>
/// 规则执行结果。
/// </summary>
public IReadOnlyList<RuleExecutionResult> RuleExecutionResults { get; init; } = Array.Empty<RuleExecutionResult>();
/// <summary>
/// 性能指标。
/// </summary>
public LayerPerformanceMetrics PerformanceMetrics { get; init; } = new();
/// <summary>
/// 扩展属性。
/// </summary>
public Dictionary<string, object> ExtendedProperties { get; init; } = new();
}
/// <summary>
/// 部件检测结果。
/// </summary>
public sealed class PartDetectionResult
{
/// <summary>
/// 检测ID。
/// </summary>
public Guid DetectionId { get; init; }
/// <summary>
/// 部件名称。
/// </summary>
public string PartName { get; init; } = string.Empty;
/// <summary>
/// 部件类型。
/// </summary>
public string PartType { get; init; } = string.Empty;
/// <summary>
/// 检测状态。
/// </summary>
public PartDetectionStatus DetectionStatus { get; init; }
/// <summary>
/// 置信度。
/// </summary>
public double Confidence { get; init; }
/// <summary>
/// 边界框。
/// </summary>
public BoundingBox BoundingBox { get; init; } = new();
/// <summary>
/// 检测时间。
/// </summary>
public DateTime DetectionTimeUtc { get; init; }
/// <summary>
/// 关联截图ID。
/// </summary>
public Guid? AssociatedScreenshotId { get; init; }
/// <summary>
/// 扩展属性。
/// </summary>
public Dictionary<string, object> ExtendedProperties { get; init; } = new();
}
/// <summary>
/// 部件检测状态枚举。
/// </summary>
public enum PartDetectionStatus
{
/// <summary>
/// 检测到。
/// </summary>
Detected = 0,
/// <summary>
/// 未检测到。
/// </summary>
NotDetected = 1,
/// <summary>
/// 误检。
/// </summary>
FalsePositive = 2,
/// <summary>
/// 漏检。
/// </summary>
FalseNegative = 3,
/// <summary>
/// 位置错误。
/// </summary>
PositionError = 4,
/// <summary>
/// 方向错误。
/// </summary>
OrientationError = 5
}
/// <summary>
/// 边界框。
/// </summary>
public sealed class BoundingBox
{
/// <summary>
/// X坐标。
/// </summary>
public double X { get; init; }
/// <summary>
/// Y坐标。
/// </summary>
public double Y { get; init; }
/// <summary>
/// 宽度。
/// </summary>
public double Width { get; init; }
/// <summary>
/// 高度。
/// </summary>
public double Height { get; init; }
/// <summary>
/// 中心点X坐标。
/// </summary>
public double CenterX => X + Width / 2;
/// <summary>
/// 中心点Y坐标。
/// </summary>
public double CenterY => Y + Height / 2;
/// <summary>
/// 面积。
/// </summary>
public double Area => Width * Height;
}
/// <summary>
/// 规则执行结果。
/// </summary>
public sealed class RuleExecutionResult
{
/// <summary>
/// 执行ID。
/// </summary>
public Guid ExecutionId { get; init; }
/// <summary>
/// 规则名称。
/// </summary>
public string RuleName { get; init; } = string.Empty;
/// <summary>
/// 规则类型。
/// </summary>
public string RuleType { get; init; } = string.Empty;
/// <summary>
/// 执行状态。
/// </summary>
public RuleExecutionStatus ExecutionStatus { get; init; }
/// <summary>
/// 执行结果。
/// </summary>
public bool ExecutionResult { get; init; }
/// <summary>
/// 执行时间(毫秒)。
/// </summary>
public long ExecutionTimeMs { get; init; }
/// <summary>
/// 执行时间。
/// </summary>
public DateTime ExecutionTimeUtc { get; init; }
/// <summary>
/// 错误信息。
/// </summary>
public string? ErrorMessage { get; init; }
/// <summary>
/// 执行详情。
/// </summary>
public string ExecutionDetails { get; init; } = string.Empty;
/// <summary>
/// 扩展属性。
/// </summary>
public Dictionary<string, object> ExtendedProperties { get; init; } = new();
}
/// <summary>
/// 规则执行状态枚举。
/// </summary>
public enum RuleExecutionStatus
{
/// <summary>
/// 成功。
/// </summary>
Success = 0,
/// <summary>
/// 失败。
/// </summary>
Failed = 1,
/// <summary>
/// 跳过。
/// </summary>
Skipped = 2,
/// <summary>
/// 超时。
/// </summary>
Timeout = 3,
/// <summary>
/// 错误。
/// </summary>
Error = 4
}
/// <summary>
/// 截图历史记录。
/// </summary>
public sealed class ScreenshotHistory
{
/// <summary>
/// 截图ID。
/// </summary>
public Guid ScreenshotId { get; init; }
/// <summary>
/// 会话ID。
/// </summary>
public Guid SessionId { get; init; }
/// <summary>
/// 层ID可选
/// </summary>
public Guid? LayerId { get; init; }
/// <summary>
/// 截图类型。
/// </summary>
public ScreenshotType ScreenshotType { get; init; }
/// <summary>
/// 截图时间。
/// </summary>
public DateTime ScreenshotTimeUtc { get; init; }
/// <summary>
/// 文件路径。
/// </summary>
public string FilePath { get; init; } = string.Empty;
/// <summary>
/// 文件大小(字节)。
/// </summary>
public long FileSizeBytes { get; init; }
/// <summary>
/// 文件格式。
/// </summary>
public string FileFormat { get; init; } = string.Empty;
/// <summary>
/// 图像宽度。
/// </summary>
public int ImageWidth { get; init; }
/// <summary>
/// 图像高度。
/// </summary>
public int ImageHeight { get; init; }
/// <summary>
/// 图像描述。
/// </summary>
public string ImageDescription { get; init; } = string.Empty;
/// <summary>
/// 关联的检测数量。
/// </summary>
public int AssociatedDetectionCount { get; init; }
/// <summary>
/// 关联的缺陷数量。
/// </summary>
public int AssociatedDefectCount { get; init; }
/// <summary>
/// 扩展属性。
/// </summary>
public Dictionary<string, object> ExtendedProperties { get; init; } = new();
}
/// <summary>
/// 截图类型枚举。
/// </summary>
public enum ScreenshotType
{
/// <summary>
/// 原始图像。
/// </summary>
Original = 0,
/// <summary>
/// 处理后图像。
/// </summary>
Processed = 1,
/// <summary>
/// 检测结果图像。
/// </summary>
DetectionResult = 2,
/// <summary>
/// 缺陷标记图像。
/// </summary>
DefectMarked = 3,
/// <summary>
/// 热力图。
/// </summary>
Heatmap = 4,
/// <summary>
/// 对比图像。
/// </summary>
Comparison = 5,
/// <summary>
/// 调试图像。
/// </summary>
Debug = 6,
/// <summary>
/// 自定义图像。
/// </summary>
Custom = 7
}
/// <summary>
/// 截图详细信息。
/// </summary>
public sealed class ScreenshotDetail
{
/// <summary>
/// 截图历史信息。
/// </summary>
public ScreenshotHistory ScreenshotHistory { get; init; } = new();
/// <summary>
/// 图像元数据。
/// </summary>
public ImageMetadata ImageMetadata { get; init; } = new();
/// <summary>
/// 关联的检测结果。
/// </summary>
public IReadOnlyList<PartDetectionResult> AssociatedDetections { get; init; } = Array.Empty<PartDetectionResult>();
/// <summary>
/// 关联的缺陷信息。
/// </summary>
public IReadOnlyList<LayerDefect> AssociatedDefects { get; init; } = Array.Empty<LayerDefect>();
/// <summary>
/// 图像标注。
/// </summary>
public IReadOnlyList<ImageAnnotation> Annotations { get; init; } = Array.Empty<ImageAnnotation>();
/// <summary>
/// 扩展属性。
/// </summary>
public Dictionary<string, object> ExtendedProperties { get; init; } = new();
}
/// <summary>
/// 图像元数据。
/// </summary>
public sealed class ImageMetadata
{
/// <summary>
/// 拍摄时间。
/// </summary>
public DateTime CaptureTimeUtc { get; init; }
/// <summary>
/// 相机ID。
/// </summary>
public string? CameraId { get; init; }
/// <summary>
/// 相机名称。
/// </summary>
public string? CameraName { get; init; }
/// <summary>
/// 曝光时间。
/// </summary>
public double? ExposureTimeMs { get; init; }
/// <summary>
/// ISO感光度。
/// </summary>
public int? ISO { get; init; }
/// <summary>
/// 光圈值。
/// </summary>
public double? Aperture { get; init; }
/// <summary>
/// 焦距。
/// </summary>
public double? FocalLength { get; init; }
/// <summary>
/// 闪光灯状态。
/// </summary>
public bool? FlashUsed { get; init; }
/// <summary>
/// 图像质量评分。
/// </summary>
public double? ImageQualityScore { get; init; }
/// <summary>
/// 扩展属性。
/// </summary>
public Dictionary<string, object> ExtendedProperties { get; init; } = new();
}
/// <summary>
/// 图像标注。
/// </summary>
public sealed class ImageAnnotation
{
/// <summary>
/// 标注ID。
/// </summary>
public Guid AnnotationId { get; init; }
/// <summary>
/// 标注类型。
/// </summary>
public AnnotationType AnnotationType { get; init; }
/// <summary>
/// 标注内容。
/// </summary>
public string AnnotationContent { get; init; } = string.Empty;
/// <summary>
/// 标注位置。
/// </summary>
public BoundingBox AnnotationPosition { get; init; } = new();
/// <summary>
/// 标注颜色。
/// </summary>
public string AnnotationColor { get; init; } = string.Empty;
/// <summary>
/// 标注时间。
/// </summary>
public DateTime AnnotationTimeUtc { get; init; }
/// <summary>
/// 标注者。
/// </summary>
public string? Annotator { get; init; }
/// <summary>
/// 扩展属性。
/// </summary>
public Dictionary<string, object> ExtendedProperties { get; init; } = new();
}
/// <summary>
/// 标注类型枚举。
/// </summary>
public enum AnnotationType
{
/// <summary>
/// 矩形。
/// </summary>
Rectangle = 0,
/// <summary>
/// 圆形。
/// </summary>
Circle = 1,
/// <summary>
/// 多边形。
/// </summary>
Polygon = 2,
/// <summary>
/// 点。
/// </summary>
Point = 3,
/// <summary>
/// 线条。
/// </summary>
Line = 4,
/// <summary>
/// 文本。
/// </summary>
Text = 5,
/// <summary>
/// 箭头。
/// </summary>
Arrow = 6,
/// <summary>
/// 自定义。
/// </summary>
Custom = 7
}
/// <summary>
/// 证据链信息。
/// </summary>
public sealed class EvidenceChain
{
/// <summary>
/// 证据链ID。
/// </summary>
public Guid EvidenceChainId { get; init; }
/// <summary>
/// 会话ID。
/// </summary>
public Guid SessionId { get; init; }
/// <summary>
/// 证据链创建时间。
/// </summary>
public DateTime CreatedAtUtc { get; init; }
/// <summary>
/// 证据链完整性评分。
/// </summary>
public double CompletenessScore { get; init; }
/// <summary>
/// 证据链可信度评分。
/// </summary>
public double CredibilityScore { get; init; }
/// <summary>
/// 证据节点列表。
/// </summary>
public IReadOnlyList<EvidenceNode> EvidenceNodes { get; init; } = Array.Empty<EvidenceNode>();
/// <summary>
/// 证据链摘要。
/// </summary>
public EvidenceChainSummary Summary { get; init; } = new();
/// <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 double NodeWeight { get; init; }
/// <summary>
/// 节点时间。
/// </summary>
public DateTime NodeTimeUtc { get; init; }
/// <summary>
/// 节点描述。
/// </summary>
public string NodeDescription { get; init; } = string.Empty;
/// <summary>
/// 关联数据ID。
/// </summary>
public Guid? AssociatedDataId { get; init; }
/// <summary>
/// 关联数据类型。
/// </summary>
public string? AssociatedDataType { get; init; }
/// <summary>
/// 子节点列表。
/// </summary>
public IReadOnlyList<EvidenceNode> ChildNodes { get; init; } = Array.Empty<EvidenceNode>();
/// <summary>
/// 扩展属性。
/// </summary>
public Dictionary<string, object> ExtendedProperties { get; init; } = new();
}
/// <summary>
/// 证据节点类型枚举。
/// </summary>
public enum EvidenceNodeType
{
/// <summary>
/// 会话开始。
/// </summary>
SessionStart = 0,
/// <summary>
/// 层处理。
/// </summary>
LayerProcessing = 1,
/// <summary>
/// 部件检测。
/// </summary>
PartDetection = 2,
/// <summary>
/// 规则执行。
/// </summary>
RuleExecution = 3,
/// <summary>
/// 截图采集。
/// </summary>
ScreenshotCapture = 4,
/// <summary>
/// 缺陷发现。
/// </summary>
DefectDetection = 5,
/// <summary>
/// 报警触发。
/// </summary>
AlarmTrigger = 6,
/// <summary>
/// 人工操作。
/// </summary>
ManualOperation = 7,
/// <summary>
/// 最终判定。
/// </summary>
FinalJudgment = 8,
/// <summary>
/// 会话结束。
/// </summary>
SessionEnd = 9
}
/// <summary>
/// 证据链摘要。
/// </summary>
public sealed class EvidenceChainSummary
{
/// <summary>
/// 总节点数量。
/// </summary>
public int TotalNodeCount { get; init; }
/// <summary>
/// 关键节点数量。
/// </summary>
public int CriticalNodeCount { get; init; }
/// <summary>
/// 截图节点数量。
/// </summary>
public int ScreenshotNodeCount { get; init; }
/// <summary>
/// 缺陷节点数量。
/// </summary>
public int DefectNodeCount { get; init; }
/// <summary>
/// 报警节点数量。
/// </summary>
public int AlarmNodeCount { get; init; }
/// <summary>
/// 时间跨度(分钟)。
/// </summary>
public double TimeSpanMinutes { get; init; }
/// <summary>
/// 证据链质量评级。
/// </summary>
public EvidenceChainQuality QualityRating { get; init; }
/// <summary>
/// 扩展属性。
/// </summary>
public Dictionary<string, object> ExtendedProperties { get; init; } = new();
}
/// <summary>
/// 证据链质量评级枚举。
/// </summary>
public enum EvidenceChainQuality
{
/// <summary>
/// 优秀。
/// </summary>
Excellent = 0,
/// <summary>
/// 良好。
/// </summary>
Good = 1,
/// <summary>
/// 一般。
/// </summary>
Fair = 2,
/// <summary>
/// 较差。
/// </summary>
Poor = 3,
/// <summary>
/// 不完整。
/// </summary>
Incomplete = 4
}
/// <summary>
/// 层级证据回溯。
/// </summary>
public sealed class LayerEvidenceTraceback
{
/// <summary>
/// 会话ID。
/// </summary>
public Guid SessionId { get; init; }
/// <summary>
/// 回溯时间。
/// </summary>
public DateTime TracebackTimeUtc { get; init; }
/// <summary>
/// 层级证据链路。
/// </summary>
public IReadOnlyList<LayerEvidenceLink> LayerEvidenceLinks { get; init; } = Array.Empty<LayerEvidenceLink>();
/// <summary>
/// 回溯摘要。
/// </summary>
public LayerTracebackSummary Summary { get; init; } = new();
/// <summary>
/// 扩展属性。
/// </summary>
public Dictionary<string, object> ExtendedProperties { get; init; } = new();
}
/// <summary>
/// 层级证据链路。
/// </summary>
public sealed class LayerEvidenceLink
{
/// <summary>
/// 链路ID。
/// </summary>
public Guid LinkId { get; init; }
/// <summary>
/// 层序号。
/// </summary>
public int LayerSequence { get; init; }
/// <summary>
/// 层名称。
/// </summary>
public string LayerName { get; init; } = string.Empty;
/// <summary>
/// 层处理时间。
/// </summary>
public DateTime LayerProcessingTimeUtc { get; init; }
/// <summary>
/// 关键截图列表。
/// </summary>
public IReadOnlyList<ScreenshotHistory> KeyScreenshots { get; init; } = Array.Empty<ScreenshotHistory>();
/// <summary>
/// 关键缺陷列表。
/// </summary>
public IReadOnlyList<LayerDefect> KeyDefects { get; init; } = Array.Empty<LayerDefect>();
/// <summary>
/// 关键操作列表。
/// </summary>
public IReadOnlyList<OperationHistory> KeyOperations { get; init; } = Array.Empty<OperationHistory>();
/// <summary>
/// 链路完整性。
/// </summary>
public double LinkCompleteness { get; init; }
/// <summary>
/// 扩展属性。
/// </summary>
public Dictionary<string, object> ExtendedProperties { get; init; } = new();
}
/// <summary>
/// 层级回溯摘要。
/// </summary>
public sealed class LayerTracebackSummary
{
/// <summary>
/// 总层数。
/// </summary>
public int TotalLayerCount { get; init; }
/// <summary>
/// 完整链路数量。
/// </summary>
public int CompleteLinkCount { get; init; }
/// <summary>
/// 部分链路数量。
/// </summary>
public int PartialLinkCount { get; init; }
/// <summary>
/// 缺失链路数量。
/// </summary>
public int MissingLinkCount { get; init; }
/// <summary>
/// 总截图数量。
/// </summary>
public int TotalScreenshotCount { get; init; }
/// <summary>
/// 总缺陷数量。
/// </summary>
public int TotalDefectCount { get; init; }
/// <summary>
/// 回溯完整性评分。
/// </summary>
public double TracebackCompletenessScore { get; init; }
/// <summary>
/// 扩展属性。
/// </summary>
public Dictionary<string, object> ExtendedProperties { get; init; } = new();
}
/// <summary>
/// 缺陷追溯信息。
/// </summary>
public sealed class DefectTraceback
{
/// <summary>
/// 会话ID。
/// </summary>
public Guid SessionId { get; init; }
/// <summary>
/// 追溯时间。
/// </summary>
public DateTime TracebackTimeUtc { get; init; }
/// <summary>
/// 缺陷追溯链路。
/// </summary>
public IReadOnlyList<DefectTracebackLink> DefectTracebackLinks { get; init; } = Array.Empty<DefectTracebackLink>();
/// <summary>
/// 缺陷统计分析。
/// </summary>
public DefectStatisticsAnalysis DefectStatistics { get; init; } = new();
/// <summary>
/// 缺陷模式分析。
/// </summary>
public DefectPatternAnalysis PatternAnalysis { get; init; } = new();
/// <summary>
/// 扩展属性。
/// </summary>
public Dictionary<string, object> ExtendedProperties { get; init; } = new();
}
/// <summary>
/// 缺陷追溯链路。
/// </summary>
public sealed class DefectTracebackLink
{
/// <summary>
/// 链路ID。
/// </summary>
public Guid LinkId { get; init; }
/// <summary>
/// 缺陷ID。
/// </summary>
public Guid DefectId { get; init; }
/// <summary>
/// 缺陷类型。
/// </summary>
public DefectType DefectType { get; init; }
/// <summary>
/// 缺陷严重程度。
/// </summary>
public DefectSeverity DefectSeverity { get; init; }
/// <summary>
/// 发现时间。
/// </summary>
public DateTime DiscoveryTimeUtc { get; init; }
/// <summary>
/// 所在层序号。
/// </summary>
public int LayerSequence { get; init; }
/// <summary>
/// 所在层名称。
/// </summary>
public string LayerName { get; init; } = string.Empty;
/// <summary>
/// 根本原因分析。
/// </summary>
public string RootCauseAnalysis { get; init; } = string.Empty;
/// <summary>
/// 关联截图。
/// </summary>
public ScreenshotHistory? AssociatedScreenshot { get; init; }
/// <summary>
/// 关联操作。
/// </summary>
public IReadOnlyList<OperationHistory> AssociatedOperations { get; init; } = Array.Empty<OperationHistory>();
/// <summary>
/// 扩展属性。
/// </summary>
public Dictionary<string, object> ExtendedProperties { get; init; } = new();
}
/// <summary>
/// 缺陷统计分析。
/// </summary>
public sealed class DefectStatisticsAnalysis
{
/// <summary>
/// 总缺陷数量。
/// </summary>
public int TotalDefectCount { get; init; }
/// <summary>
/// 按类型分组的缺陷统计。
/// </summary>
public Dictionary<DefectType, int> DefectsByType { get; init; } = new();
/// <summary>
/// 按严重程度分组的缺陷统计。
/// </summary>
public Dictionary<DefectSeverity, int> DefectsBySeverity { get; init; } = new();
/// <summary>
/// 按层分组的缺陷统计。
/// </summary>
public Dictionary<int, int> DefectsByLayer { get; init; } = new();
/// <summary>
/// 缺陷密度。
/// </summary>
public double DefectDensity { get; init; }
/// <summary>
/// 缺陷率。
/// </summary>
public double DefectRate { get; init; }
/// <summary>
/// 扩展属性。
/// </summary>
public Dictionary<string, object> ExtendedProperties { get; init; } = new();
}
/// <summary>
/// 缺陷模式分析。
/// </summary>
public sealed class DefectPatternAnalysis
{
/// <summary>
/// 重复缺陷模式。
/// </summary>
public IReadOnlyList<DefectPattern> RecurringPatterns { get; init; } = Array.Empty<DefectPattern>();
/// <summary>
/// 异常缺陷模式。
/// </summary>
public IReadOnlyList<DefectPattern> AnomalousPatterns { get; init; } = Array.Empty<DefectPattern>();
/// <summary>
/// 趋势分析。
/// </summary>
public DefectTrendAnalysis TrendAnalysis { get; init; } = new();
/// <summary>
/// 扩展属性。
/// </summary>
public Dictionary<string, object> ExtendedProperties { get; init; } = new();
}
/// <summary>
/// 缺陷模式。
/// </summary>
public sealed class DefectPattern
{
/// <summary>
/// 模式ID。
/// </summary>
public Guid PatternId { get; init; }
/// <summary>
/// 模式名称。
/// </summary>
public string PatternName { get; init; } = string.Empty;
/// <summary>
/// 模式描述。
/// </summary>
public string PatternDescription { get; init; } = string.Empty;
/// <summary>
/// 出现频率。
/// </summary>
public double OccurrenceFrequency { get; init; }
/// <summary>
/// 模式置信度。
/// </summary>
public double PatternConfidence { get; init; }
/// <summary>
/// 相关缺陷列表。
/// </summary>
public IReadOnlyList<Guid> RelatedDefectIds { get; init; } = Array.Empty<Guid>();
/// <summary>
/// 扩展属性。
/// </summary>
public Dictionary<string, object> ExtendedProperties { get; init; } = new();
}
/// <summary>
/// 缺陷趋势分析。
/// </summary>
public sealed class DefectTrendAnalysis
{
/// <summary>
/// 趋势方向。
/// </summary>
public TrendDirection TrendDirection { get; init; }
/// <summary>
/// 变化率。
/// </summary>
public double ChangeRate { get; init; }
/// <summary>
/// 趋势描述。
/// </summary>
public string TrendDescription { get; init; } = string.Empty;
/// <summary>
/// 预测下期缺陷数量。
/// </summary>
public int PredictedNextDefectCount { get; init; }
/// <summary>
/// 置信度。
/// </summary>
public double Confidence { get; init; }
/// <summary>
/// 扩展属性。
/// </summary>
public Dictionary<string, object> ExtendedProperties { get; init; } = new();
}
/// <summary>
/// 操作历史记录。
/// </summary>
public sealed class OperationHistory
{
/// <summary>
/// 操作ID。
/// </summary>
public Guid OperationId { get; init; }
/// <summary>
/// 会话ID。
/// </summary>
public Guid SessionId { get; init; }
/// <summary>
/// 层ID可选
/// </summary>
public Guid? LayerId { get; init; }
/// <summary>
/// 操作类型。
/// </summary>
public OperationType OperationType { get; init; }
/// <summary>
/// 操作时间。
/// </summary>
public DateTime OperationTimeUtc { get; init; }
/// <summary>
/// 操作员ID。
/// </summary>
public string OperatorId { get; init; } = string.Empty;
/// <summary>
/// 操作员姓名。
/// </summary>
public string OperatorName { get; init; } = string.Empty;
/// <summary>
/// 操作描述。
/// </summary>
public string OperationDescription { get; init; } = string.Empty;
/// <summary>
/// 操作结果。
/// </summary>
public OperationResult OperationResult { get; init; }
/// <summary>
/// 操作参数。
/// </summary>
public Dictionary<string, object> OperationParameters { get; init; } = new();
/// <summary>
/// 操作耗时(毫秒)。
/// </summary>
public long OperationDurationMs { get; init; }
/// <summary>
/// 关联截图ID。
/// </summary>
public Guid? AssociatedScreenshotId { get; init; }
/// <summary>
/// 错误信息。
/// </summary>
public string? ErrorMessage { get; init; }
/// <summary>
/// 扩展属性。
/// </summary>
public Dictionary<string, object> ExtendedProperties { get; init; } = new();
}
/// <summary>
/// 操作类型枚举。
/// </summary>
public enum OperationType
{
/// <summary>
/// 会话开始。
/// </summary>
SessionStart = 0,
/// <summary>
/// 会话结束。
/// </summary>
SessionEnd = 1,
/// <summary>
/// 层开始。
/// </summary>
LayerStart = 2,
/// <summary>
/// 层结束。
/// </summary>
LayerEnd = 3,
/// <summary>
/// 截图采集。
/// </summary>
ScreenshotCapture = 4,
/// <summary>
/// 部件检测。
/// </summary>
PartDetection = 5,
/// <summary>
/// 规则执行。
/// </summary>
RuleExecution = 6,
/// <summary>
/// 报警确认。
/// </summary>
AlarmConfirm = 7,
/// <summary>
/// 报警清除。
/// </summary>
AlarmClear = 8,
/// <summary>
/// 人工判定。
/// </summary>
ManualJudgment = 9,
/// <summary>
/// 参数调整。
/// </summary>
ParameterAdjustment = 10,
/// <summary>
/// 系统配置。
/// </summary>
SystemConfiguration = 11,
/// <summary>
/// 数据导出。
/// </summary>
DataExport = 12,
/// <summary>
/// 其他操作。
/// </summary>
Other = 13
}
/// <summary>
/// 操作结果枚举。
/// </summary>
public enum OperationResult
{
/// <summary>
/// 成功。
/// </summary>
Success = 0,
/// <summary>
/// 失败。
/// </summary>
Failed = 1,
/// <summary>
/// 部分成功。
/// </summary>
PartialSuccess = 2,
/// <summary>
/// 跳过。
/// </summary>
Skipped = 3,
/// <summary>
/// 超时。
/// </summary>
Timeout = 4,
/// <summary>
/// 错误。
/// </summary>
Error = 5
}
/// <summary>
/// 综合追溯报告。
/// </summary>
public sealed class ComprehensiveTracebackReport
{
/// <summary>
/// 报告ID。
/// </summary>
public Guid ReportId { get; init; }
/// <summary>
/// 报告类型。
/// </summary>
public TracebackReportType ReportType { get; init; }
/// <summary>
/// 会话ID。
/// </summary>
public Guid SessionId { get; init; }
/// <summary>
/// 报告生成时间。
/// </summary>
public DateTime GeneratedAtUtc { get; init; }
/// <summary>
/// 报告标题。
/// </summary>
public string ReportTitle { get; init; } = string.Empty;
/// <summary>
/// 执行摘要。
/// </summary>
public ReportExecutiveSummary ExecutiveSummary { get; init; } = new();
/// <summary>
/// 会话概览。
/// </summary>
public ProductSessionDetail SessionOverview { get; init; } = new();
/// <summary>
/// 层级分析。
/// </summary>
public IReadOnlyList<LayerAnalysisReport> LayerAnalyses { get; init; } = Array.Empty<LayerAnalysisReport>();
/// <summary>
/// 缺陷分析。
/// </summary>
public DefectAnalysisReport DefectAnalysis { get; init; } = new();
/// <summary>
/// 性能分析。
/// </summary>
public PerformanceAnalysisReport PerformanceAnalysis { get; init; } = new();
/// <summary>
/// 证据链分析。
/// </summary>
public EvidenceChainAnalysis EvidenceChainAnalysis { get; init; } = new();
/// <summary>
/// 改进建议。
/// </summary>
public IReadOnlyList<TracebackImprovementSuggestion> ImprovementSuggestions { get; init; } = Array.Empty<TracebackImprovementSuggestion>();
/// <summary>
/// 扩展属性。
/// </summary>
public Dictionary<string, object> ExtendedProperties { get; init; } = new();
}
/// <summary>
/// 追溯报告类型枚举。
/// </summary>
public enum TracebackReportType
{
/// <summary>
/// 标准报告。
/// </summary>
Standard = 0,
/// <summary>
/// 详细报告。
/// </summary>
Detailed = 1,
/// <summary>
/// 摘要报告。
/// </summary>
Summary = 2,
/// <summary>
/// 缺陷报告。
/// </summary>
DefectFocused = 3,
/// <summary>
/// 性能报告。
/// </summary>
PerformanceFocused = 4,
/// <summary>
/// 合规报告。
/// </summary>
ComplianceFocused = 5,
/// <summary>
/// 自定义报告。
/// </summary>
Custom = 6
}
/// <summary>
/// 报告执行摘要。
/// </summary>
public sealed class ReportExecutiveSummary
{
/// <summary>
/// 总体评分。
/// </summary>
public double OverallScore { get; init; }
/// <summary>
/// 关键发现。
/// </summary>
public IReadOnlyList<string> KeyFindings { get; init; } = Array.Empty<string>();
/// <summary>
/// 主要问题。
/// </summary>
public IReadOnlyList<string> MajorIssues { get; init; } = Array.Empty<string>();
/// <summary>
/// 改进机会。
/// </summary>
public IReadOnlyList<string> ImprovementOpportunities { get; init; } = Array.Empty<string>();
/// <summary>
/// 摘要描述。
/// </summary>
public string SummaryDescription { get; init; } = string.Empty;
/// <summary>
/// 扩展属性。
/// </summary>
public Dictionary<string, object> ExtendedProperties { get; init; } = new();
}
/// <summary>
/// 层级分析报告。
/// </summary>
public sealed class LayerAnalysisReport
{
/// <summary>
/// 层序号。
/// </summary>
public int LayerSequence { get; init; }
/// <summary>
/// 层名称。
/// </summary>
public string LayerName { get; init; } = string.Empty;
/// <summary>
/// 层性能评分。
/// </summary>
public double LayerPerformanceScore { get; init; }
/// <summary>
/// 层质量评分。
/// </summary>
public double LayerQualityScore { get; init; }
/// <summary>
/// 层效率评分。
/// </summary>
public double LayerEfficiencyScore { get; init; }
/// <summary>
/// 关键指标。
/// </summary>
public Dictionary<string, double> KeyMetrics { get; init; } = new();
/// <summary>
/// 问题识别。
/// </summary>
public IReadOnlyList<string> IdentifiedIssues { get; init; } = Array.Empty<string>();
/// <summary>
/// 扩展属性。
/// </summary>
public Dictionary<string, object> ExtendedProperties { get; init; } = new();
}
/// <summary>
/// 缺陷分析报告。
/// </summary>
public sealed class DefectAnalysisReport
{
/// <summary>
/// 总缺陷数量。
/// </summary>
public int TotalDefectCount { get; init; }
/// <summary>
/// 缺陷率。
/// </summary>
public double DefectRate { get; init; }
/// <summary>
/// 缺陷分布。
/// </summary>
public Dictionary<DefectType, int> DefectDistribution { get; init; } = new();
/// <summary>
/// 严重程度分布。
/// </summary>
public Dictionary<DefectSeverity, int> SeverityDistribution { get; init; } = new();
/// <summary>
/// 高频缺陷。
/// </summary>
public IReadOnlyList<DefectPattern> HighFrequencyDefects { get; init; } = Array.Empty<DefectPattern>();
/// <summary>
/// 缺陷趋势。
/// </summary>
public DefectTrendAnalysis DefectTrend { get; init; } = new();
/// <summary>
/// 扩展属性。
/// </summary>
public Dictionary<string, object> ExtendedProperties { get; init; } = new();
}
/// <summary>
/// 性能分析报告。
/// </summary>
public sealed class PerformanceAnalysisReport
{
/// <summary>
/// 总处理时间。
/// </summary>
public double TotalProcessingTimeMinutes { get; init; }
/// <summary>
/// 平均层处理时间。
/// </summary>
public double AverageLayerProcessingTimeSeconds { get; init; }
/// <summary>
/// 系统可用性。
/// </summary>
public double SystemAvailability { get; init; }
/// <summary>
/// 处理效率。
/// </summary>
public double ProcessingEfficiency { get; init; }
/// <summary>
/// 资源利用率。
/// </summary>
public double ResourceUtilization { get; init; }
/// <summary>
/// 性能瓶颈。
/// </summary>
public IReadOnlyList<string> PerformanceBottlenecks { get; init; } = Array.Empty<string>();
/// <summary>
/// 扩展属性。
/// </summary>
public Dictionary<string, object> ExtendedProperties { get; init; } = new();
}
/// <summary>
/// 证据链分析。
/// </summary>
public sealed class EvidenceChainAnalysis
{
/// <summary>
/// 证据链完整性。
/// </summary>
public double EvidenceChainCompleteness { get; init; }
/// <summary>
/// 证据链可信度。
/// </summary>
public double EvidenceChainCredibility { get; init; }
/// <summary>
/// 关键证据节点。
/// </summary>
public IReadOnlyList<EvidenceNode> CriticalEvidenceNodes { get; init; } = Array.Empty<EvidenceNode>();
/// <summary>
/// 证据缺口。
/// </summary>
public IReadOnlyList<EvidenceGap> EvidenceGaps { get; init; } = Array.Empty<EvidenceGap>();
/// <summary>
/// 扩展属性。
/// </summary>
public Dictionary<string, object> ExtendedProperties { get; init; } = new();
}
/// <summary>
/// 证据缺口。
/// </summary>
public sealed class EvidenceGap
{
/// <summary>
/// 缺口ID。
/// </summary>
public Guid GapId { get; init; }
/// <summary>
/// 缺口类型。
/// </summary>
public EvidenceGapType GapType { get; init; }
/// <summary>
/// 缺口描述。
/// </summary>
public string GapDescription { get; init; } = string.Empty;
/// <summary>
/// 缺口严重程度。
/// </summary>
public GapSeverity GapSeverity { get; init; }
/// <summary>
/// 建议措施。
/// </summary>
public string RecommendedAction { get; init; } = string.Empty;
/// <summary>
/// 扩展属性。
/// </summary>
public Dictionary<string, object> ExtendedProperties { get; init; } = new();
}
/// <summary>
/// 证据缺口类型枚举。
/// </summary>
public enum EvidenceGapType
{
/// <summary>
/// 缺失截图。
/// </summary>
MissingScreenshot = 0,
/// <summary>
/// 缺失操作记录。
/// </summary>
MissingOperationRecord = 1,
/// <summary>
/// 缺失检测数据。
/// </summary>
MissingDetectionData = 2,
/// <summary>
/// 缺失规则执行。
/// </summary>
MissingRuleExecution = 3,
/// <summary>
/// 数据不一致。
/// </summary>
DataInconsistency = 4,
/// <summary>
/// 时间戳异常。
/// </summary>
TimestampAnomaly = 5,
/// <summary>
/// 其他缺口。
/// </summary>
Other = 6
}
/// <summary>
/// 缺口严重程度枚举。
/// </summary>
public enum GapSeverity
{
/// <summary>
/// 低。
/// </summary>
Low = 0,
/// <summary>
/// 中。
/// </summary>
Medium = 1,
/// <summary>
/// 高。
/// </summary>
High = 2,
/// <summary>
/// 严重。
/// </summary>
Critical = 3
}
/// <summary>
/// 追溯改进建议。
/// </summary>
public sealed class TracebackImprovementSuggestion
{
/// <summary>
/// 建议ID。
/// </summary>
public Guid SuggestionId { get; init; }
/// <summary>
/// 建议类别。
/// </summary>
public SuggestionCategory SuggestionCategory { get; init; }
/// <summary>
/// 建议标题。
/// </summary>
public string SuggestionTitle { get; init; } = string.Empty;
/// <summary>
/// 建议描述。
/// </summary>
public string SuggestionDescription { get; init; } = string.Empty;
/// <summary>
/// 优先级。
/// </summary>
public int Priority { get; init; }
/// <summary>
/// 预期效果。
/// </summary>
public string ExpectedImpact { get; init; } = string.Empty;
/// <summary>
/// 实施难度。
/// </summary>
public ImplementationDifficulty ImplementationDifficulty { get; init; }
/// <summary>
/// 相关证据。
/// </summary>
public IReadOnlyList<Guid> RelatedEvidenceIds { get; init; } = Array.Empty<Guid>();
/// <summary>
/// 扩展属性。
/// </summary>
public Dictionary<string, object> ExtendedProperties { get; init; } = new();
}
/// <summary>
/// 追溯统计数据。
/// </summary>
public sealed class TracebackStatistics
{
/// <summary>
/// 统计时间范围。
/// </summary>
public TimeRange TimeRange { get; init; } = new();
/// <summary>
/// 产品类型编码。
/// </summary>
public string ProductTypeCode { get; init; } = string.Empty;
/// <summary>
/// 总会话数量。
/// </summary>
public int TotalSessionCount { get; init; }
/// <summary>
/// 完成会话数量。
/// </summary>
public int CompletedSessionCount { get; init; }
/// <summary>
/// 会话完成率。
/// </summary>
public double SessionCompletionRate => TotalSessionCount > 0 ? (double)CompletedSessionCount / TotalSessionCount * 100 : 0.0;
/// <summary>
/// 总层数量。
/// </summary>
public int TotalLayerCount { get; init; }
/// <summary>
/// 总截图数量。
/// </summary>
public int TotalScreenshotCount { get; init; }
/// <summary>
/// 总缺陷数量。
/// </summary>
public int TotalDefectCount { get; init; }
/// <summary>
/// 总操作数量。
/// </summary>
public int TotalOperationCount { get; init; }
/// <summary>
/// 平均会话持续时间(分钟)。
/// </summary>
public double AverageSessionDurationMinutes { get; init; }
/// <summary>
/// 平均层处理时间(秒)。
/// </summary>
public double AverageLayerProcessingTimeSeconds { get; init; }
/// <summary>
/// 按日期分组的统计。
/// </summary>
public Dictionary<DateTime, DailyTracebackStatistics> ByDate { get; init; } = new();
/// <summary>
/// 按产品类型分组的统计。
/// </summary>
public Dictionary<string, ProductTypeTracebackStatistics> ByProductType { get; init; } = new();
/// <summary>
/// 扩展属性。
/// </summary>
public Dictionary<string, object> ExtendedProperties { get; init; } = new();
}
/// <summary>
/// 按日期分组的追溯统计。
/// </summary>
public sealed class DailyTracebackStatistics
{
/// <summary>
/// 日期。
/// </summary>
public DateTime Date { get; init; }
/// <summary>
/// 会话数量。
/// </summary>
public int SessionCount { get; init; }
/// <summary>
/// 完成会话数量。
/// </summary>
public int CompletedSessionCount { get; init; }
/// <summary>
/// 层数量。
/// </summary>
public int LayerCount { get; init; }
/// <summary>
/// 截图数量。
/// </summary>
public int ScreenshotCount { get; init; }
/// <summary>
/// 缺陷数量。
/// </summary>
public int DefectCount { get; init; }
}
/// <summary>
/// 按产品类型分组的追溯统计。
/// </summary>
public sealed class ProductTypeTracebackStatistics
{
/// <summary>
/// 产品类型编码。
/// </summary>
public string ProductTypeCode { get; init; } = string.Empty;
/// <summary>
/// 会话数量。
/// </summary>
public int SessionCount { get; init; }
/// <summary>
/// 完成会话数量。
/// </summary>
public int CompletedSessionCount { get; init; }
/// <summary>
/// 层数量。
/// </summary>
public int LayerCount { get; init; }
/// <summary>
/// 截图数量。
/// </summary>
public int ScreenshotCount { get; init; }
/// <summary>
/// 缺陷数量。
/// </summary>
public int DefectCount { get; init; }
}
/// <summary>
/// 历史搜索请求。
/// </summary>
public sealed class HistorySearchRequest
{
/// <summary>
/// 搜索ID。
/// </summary>
public Guid SearchId { get; init; }
/// <summary>
/// 搜索关键词。
/// </summary>
public string SearchKeyword { get; init; } = string.Empty;
/// <summary>
/// 搜索类型。
/// </summary>
public HistorySearchType SearchType { get; init; }
/// <summary>
/// 时间范围。
/// </summary>
public TimeRange? TimeRange { get; init; }
/// <summary>
/// 产品类型编码。
/// </summary>
public string? ProductTypeCode { get; init; }
/// <summary>
/// 会话状态。
/// </summary>
public SessionStatus? SessionStatus { get; init; }
/// <summary>
/// 缺陷类型。
/// </summary>
public DefectType? DefectType { get; init; }
/// <summary>
/// 操作员ID。
/// </summary>
public string? OperatorId { get; init; }
/// <summary>
/// 最大结果数量。
/// </summary>
public int MaxResultCount { get; init; } = 100;
/// <summary>
/// 搜索参数。
/// </summary>
public Dictionary<string, object> SearchParameters { get; init; } = new();
/// <summary>
/// 搜索时间。
/// </summary>
public DateTime SearchTimeUtc { get; init; }
/// <summary>
/// 扩展属性。
/// </summary>
public Dictionary<string, object> ExtendedProperties { get; init; } = new();
}
/// <summary>
/// 历史搜索类型枚举。
/// </summary>
public enum HistorySearchType
{
/// <summary>
/// 会话搜索。
/// </summary>
Session = 0,
/// <summary>
/// 层搜索。
/// </summary>
Layer = 1,
/// <summary>
/// 截图搜索。
/// </summary>
Screenshot = 2,
/// <summary>
/// 缺陷搜索。
/// </summary>
Defect = 3,
/// <summary>
/// 操作搜索。
/// </summary>
Operation = 4,
/// <summary>
/// 全文搜索。
/// </summary>
FullText = 5,
/// <summary>
/// 综合搜索。
/// </summary>
Comprehensive = 6
}
/// <summary>
/// 历史搜索结果。
/// </summary>
public sealed class HistorySearchResult
{
/// <summary>
/// 搜索ID。
/// </summary>
public Guid SearchId { get; init; }
/// <summary>
/// 搜索时间。
/// </summary>
public DateTime SearchTimeUtc { get; init; }
/// <summary>
/// 总结果数量。
/// </summary>
public int TotalResultCount { get; init; }
/// <summary>
/// 返回结果数量。
/// </summary>
public int ReturnedResultCount { get; init; }
/// <summary>
/// 搜索耗时(毫秒)。
/// </summary>
public long SearchElapsedMs { get; init; }
/// <summary>
/// 会话结果。
/// </summary>
public IReadOnlyList<ProductSessionHistory> SessionResults { get; init; } = Array.Empty<ProductSessionHistory>();
/// <summary>
/// 层结果。
/// </summary>
public IReadOnlyList<LayerProcessingHistory> LayerResults { get; init; } = Array.Empty<LayerProcessingHistory>();
/// <summary>
/// 截图结果。
/// </summary>
public IReadOnlyList<ScreenshotHistory> ScreenshotResults { get; init; } = Array.Empty<ScreenshotHistory>();
/// <summary>
/// 缺陷结果。
/// </summary>
public IReadOnlyList<LayerDefect> DefectResults { get; init; } = Array.Empty<LayerDefect>();
/// <summary>
/// 操作结果。
/// </summary>
public IReadOnlyList<OperationHistory> OperationResults { get; init; } = Array.Empty<OperationHistory>();
/// <summary>
/// 搜索建议。
/// </summary>
public IReadOnlyList<string> SearchSuggestions { get; init; } = Array.Empty<string>();
/// <summary>
/// 扩展属性。
/// </summary>
public Dictionary<string, object> ExtendedProperties { get; init; } = new();
}
/// <summary>
/// 追溯数据导出请求。
/// </summary>
public sealed class TracebackExportRequest
{
/// <summary>
/// 导出ID。
/// </summary>
public Guid ExportId { get; init; }
/// <summary>
/// 导出类型。
/// </summary>
public TracebackExportType ExportType { get; init; }
/// <summary>
/// 导出格式。
/// </summary>
public ExportFormat ExportFormat { get; init; }
/// <summary>
/// 时间范围。
/// </summary>
public TimeRange TimeRange { get; init; } = new();
/// <summary>
/// 产品类型编码。
/// </summary>
public string? ProductTypeCode { get; init; }
/// <summary>
/// 会话ID列表。
/// </summary>
public IReadOnlyList<Guid> SessionIds { get; init; } = Array.Empty<Guid>();
/// <summary>
/// 包含截图。
/// </summary>
public bool IncludeScreenshots { get; init; } = true;
/// <summary>
/// 包含缺陷详情。
/// </summary>
public bool IncludeDefectDetails { get; init; } = true;
/// <summary>
/// 包含操作记录。
/// </summary>
public bool IncludeOperationRecords { get; init; } = true;
/// <summary>
/// 包含证据链。
/// </summary>
public bool IncludeEvidenceChain { get; init; } = true;
/// <summary>
/// 导出参数。
/// </summary>
public Dictionary<string, object> ExportParameters { get; init; } = new();
/// <summary>
/// 请求用户。
/// </summary>
public string RequestUser { get; init; } = string.Empty;
/// <summary>
/// 请求时间。
/// </summary>
public DateTime RequestTimeUtc { get; init; }
/// <summary>
/// 扩展属性。
/// </summary>
public Dictionary<string, object> ExtendedProperties { get; init; } = new();
}
/// <summary>
/// 追溯导出类型枚举。
/// </summary>
public enum TracebackExportType
{
/// <summary>
/// 会话导出。
/// </summary>
Session = 0,
/// <summary>
/// 层导出。
/// </summary>
Layer = 1,
/// <summary>
/// 截图导出。
/// </summary>
Screenshot = 2,
/// <summary>
/// 缺陷导出。
/// </summary>
Defect = 3,
/// <summary>
/// 操作导出。
/// </summary>
Operation = 4,
/// <summary>
/// 证据链导出。
/// </summary>
EvidenceChain = 5,
/// <summary>
/// 综合报告导出。
/// </summary>
ComprehensiveReport = 6,
/// <summary>
/// 自定义导出。
/// </summary>
Custom = 7
}
/// <summary>
/// 追溯导出结果。
/// </summary>
public sealed class TracebackExportResult
{
/// <summary>
/// 导出ID。
/// </summary>
public Guid ExportId { get; init; }
/// <summary>
/// 是否成功导出。
/// </summary>
public bool IsSuccess { get; init; }
/// <summary>
/// 导出文件路径。
/// </summary>
public string? FilePath { get; init; }
/// <summary>
/// 导出文件大小(字节)。
/// </summary>
public long FileSizeBytes { get; init; }
/// <summary>
/// 导出记录数量。
/// </summary>
public int RecordCount { get; init; }
/// <summary>
/// 导出耗时(毫秒)。
/// </summary>
public long ExportElapsedMs { get; init; }
/// <summary>
/// 导出时间。
/// </summary>
public DateTime ExportTimeUtc { get; init; }
/// <summary>
/// 结果描述。
/// </summary>
public string? ResultDescription { get; init; }
/// <summary>
/// 导出统计。
/// </summary>
public ExportStatistics ExportStatistics { get; init; } = new();
/// <summary>
/// 扩展属性。
/// </summary>
public Dictionary<string, object> ExtendedProperties { get; init; } = new();
}
/// <summary>
/// 导出统计。
/// </summary>
public sealed class ExportStatistics
{
/// <summary>
/// 会话数量。
/// </summary>
public int SessionCount { get; init; }
/// <summary>
/// 层数量。
/// </summary>
public int LayerCount { get; init; }
/// <summary>
/// 截图数量。
/// </summary>
public int ScreenshotCount { get; init; }
/// <summary>
/// 缺陷数量。
/// </summary>
public int DefectCount { get; init; }
/// <summary>
/// 操作数量。
/// </summary>
public int OperationCount { get; init; }
/// <summary>
/// 证据链数量。
/// </summary>
public int EvidenceChainCount { get; init; }
/// <summary>
/// 扩展属性。
/// </summary>
public Dictionary<string, object> ExtendedProperties { get; init; } = new();
}
/// <summary>
/// 会话性能指标。
/// </summary>
public sealed class SessionPerformanceMetrics
{
/// <summary>
/// 总处理时间(分钟)。
/// </summary>
public double TotalProcessingTimeMinutes { get; init; }
/// <summary>
/// 平均层处理时间(秒)。
/// </summary>
public double AverageLayerProcessingTimeSeconds { get; init; }
/// <summary>
/// 系统可用性。
/// </summary>
public double SystemAvailability { get; init; }
/// <summary>
/// 处理效率。
/// </summary>
public double ProcessingEfficiency { get; init; }
/// <summary>
/// 资源利用率。
/// </summary>
public double ResourceUtilization { get; init; }
/// <summary>
/// 扩展属性。
/// </summary>
public Dictionary<string, object> ExtendedProperties { get; init; } = new();
}
/// <summary>
/// 层性能指标。
/// </summary>
public sealed class LayerPerformanceMetrics
{
/// <summary>
/// 层处理时间(秒)。
/// </summary>
public double LayerProcessingTimeSeconds { get; init; }
/// <summary>
/// 检测处理时间(毫秒)。
/// </summary>
public long DetectionProcessingTimeMs { get; init; }
/// <summary>
/// 规则执行时间(毫秒)。
/// </summary>
public long RuleExecutionTimeMs { get; init; }
/// <summary>
/// 截图处理时间(毫秒)。
/// </summary>
public long ScreenshotProcessingTimeMs { get; init; }
/// <summary>
/// 内存使用量MB
/// </summary>
public double MemoryUsageMb { get; init; }
/// <summary>
/// CPU使用率。
/// </summary>
public double CpuUsagePercentage { get; init; }
/// <summary>
/// 扩展属性。
/// </summary>
public Dictionary<string, object> ExtendedProperties { get; init; } = new();
}