3002 lines
70 KiB
C#
3002 lines
70 KiB
C#
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();
|
||
}
|