using System;
using System.Collections.Generic;
using NPP.SmartSchedue.Api.Contracts.Services.Integration.Output;
namespace NPP.SmartSchedue.Api.Contracts.Services.Integration.Output
{
///
/// 处理器执行结果
/// 用于表示五层决策模型中各层处理器的执行结果
/// 包含执行状态、性能指标、处理统计等完整信息
///
public class ProcessorResult
{
#region 核心执行状态
///
/// 处理器执行是否成功
///
public bool IsSuccess { get; set; }
///
/// 处理器名称
/// 用于标识具体的处理器类型,如:QualificationFilter、ConstraintEvaluation等
///
public string ProcessorName { get; set; } = string.Empty;
///
/// 执行耗时(毫秒)
/// 用于性能监控和优化分析
///
public long ExecutionTimeMs { get; set; }
///
/// 执行结果消息
/// 成功或失败的详细描述信息
///
public string Message { get; set; } = string.Empty;
#endregion
#region 处理统计信息
///
/// 成功处理的数量
/// 根据处理器类型有不同的含义:
/// - 资格过滤:资质匹配成功的人员数量
/// - 约束评估:通过约束检查的人员数量
/// - 优化决策:完成优化评分的人员数量
/// - 结果生成:成功分配的任务数量
///
public int SuccessCount { get; set; }
///
/// 失败处理的数量
/// 主要用于结果生成阶段,记录分配失败的任务数量
///
public int FailureCount { get; set; }
///
/// 总处理数量
/// 处理器处理的总体数量,用于计算成功率
///
public int ProcessedCount { get; set; }
///
/// 跳过处理的数量
/// 某些情况下可能需要跳过处理的记录数量
///
public int SkippedCount { get; set; }
#endregion
#region 详细结果数据
///
/// 处理器返回的结果数据
/// 根据处理器类型包含不同的数据结构:
/// - 资格过滤:FilteredCandidates
/// - 约束评估:ConstraintResults
/// - 优化决策:OptimizationResults
/// - 结果生成:AllocationGenerationResult
///
public object? ResultData { get; set; }
///
/// 过滤后的候选人列表
/// 资格过滤处理器的主要输出
///
public List? FilteredCandidates { get; set; }
///
/// 评估后的候选人列表
/// 约束评估处理器的主要输出
///
public List? EvaluatedCandidates { get; set; }
///
/// 排名后的候选人列表
/// 优化决策处理器的主要输出
///
public List? RankedCandidates { get; set; }
///
/// 最终分配结果
/// 结果生成处理器的主要输出
///
public object? FinalResult { get; set; }
#endregion
#region 处理日志和错误信息
///
/// 处理日志
/// 记录处理器执行过程中的关键步骤和状态
///
public string ProcessingLog { get; set; } = string.Empty;
///
/// 警告信息列表
/// 处理器执行过程中产生的警告信息
///
public List Warnings { get; set; } = new();
///
/// 错误信息列表
/// 处理器执行过程中产生的错误信息
///
public List Errors { get; set; } = new();
#endregion
#region 性能和质量指标
///
/// 处理成功率
/// 计算公式:SuccessCount / ProcessedCount * 100
///
public double SuccessRate => ProcessedCount > 0 ? (double)SuccessCount / ProcessedCount * 100 : 0;
///
/// 平均处理时间(毫秒)
/// 计算公式:ExecutionTimeMs / ProcessedCount
///
public double AverageProcessingTime => ProcessedCount > 0 ? (double)ExecutionTimeMs / ProcessedCount : 0;
///
/// 性能评分(0-100)
/// 基于执行时间和处理数量的综合评分
///
public double PerformanceScore => CalculatePerformanceScore();
///
/// 质量评分(0-100)
/// 基于成功率和错误数量的综合评分
///
public double QualityScore => CalculateQualityScore();
#endregion
#region 扩展属性
///
/// 处理器版本信息
/// 用于追踪处理器的版本和更新历史
///
public string ProcessorVersion { get; set; } = string.Empty;
///
/// 处理器配置信息
/// 记录处理器执行时使用的配置参数
///
public Dictionary Configuration { get; set; } = new();
///
/// 执行环境信息
/// 记录处理器执行的环境相关信息
///
public Dictionary EnvironmentInfo { get; set; } = new();
///
/// 创建时间
/// 处理器结果创建的时间戳
///
public DateTime CreatedAt { get; set; } = DateTime.UtcNow;
#endregion
#region 私有方法
///
/// 计算性能评分
///
private double CalculatePerformanceScore()
{
if (ProcessedCount == 0) return 0;
// 基础分数:基于处理数量
var volumeScore = Math.Min(ProcessedCount * 10, 50);
// 效率分数:基于平均处理时间
var efficiencyScore = 0.0;
if (AverageProcessingTime > 0)
{
// 假设理想平均处理时间为10ms,超过则扣分
var idealTime = 10.0;
var timeRatio = idealTime / AverageProcessingTime;
efficiencyScore = Math.Min(timeRatio * 50, 50);
}
return volumeScore + efficiencyScore;
}
///
/// 计算质量评分
///
private double CalculateQualityScore()
{
var baseScore = SuccessRate;
// 错误数量扣分
var errorPenalty = Math.Min(Errors.Count * 5, 20);
var warningPenalty = Math.Min(Warnings.Count * 2, 10);
return Math.Max(0, baseScore - errorPenalty - warningPenalty);
}
#endregion
#region 静态工厂方法
///
/// 创建成功结果
///
public static ProcessorResult CreateSuccess(string processorName, string message, int successCount, int processedCount, long executionTimeMs)
{
return new ProcessorResult
{
IsSuccess = true,
ProcessorName = processorName,
Message = message,
SuccessCount = successCount,
ProcessedCount = processedCount,
ExecutionTimeMs = executionTimeMs,
CreatedAt = DateTime.UtcNow
};
}
///
/// 创建失败结果
///
public static ProcessorResult CreateFailure(string processorName, string message, long executionTimeMs, List? errors = null)
{
return new ProcessorResult
{
IsSuccess = false,
ProcessorName = processorName,
Message = message,
ExecutionTimeMs = executionTimeMs,
Errors = errors ?? new List(),
CreatedAt = DateTime.UtcNow
};
}
///
/// 创建资格过滤结果
///
public static ProcessorResult CreateQualificationFilterResult(bool isSuccess, int totalProcessed, int totalQualified, long executionTimeMs, string message)
{
return new ProcessorResult
{
IsSuccess = isSuccess,
ProcessorName = "QualificationFilter",
ExecutionTimeMs = executionTimeMs,
SuccessCount = totalQualified,
ProcessedCount = totalProcessed,
Message = message,
CreatedAt = DateTime.UtcNow
};
}
///
/// 创建约束评估结果
///
public static ProcessorResult CreateConstraintEvaluationResult(bool isSuccess, int totalEvaluated, int totalPassed, long executionTimeMs, string message)
{
return new ProcessorResult
{
IsSuccess = isSuccess,
ProcessorName = "ConstraintEvaluation",
ExecutionTimeMs = executionTimeMs,
SuccessCount = totalPassed,
ProcessedCount = totalEvaluated,
Message = message,
CreatedAt = DateTime.UtcNow
};
}
///
/// 创建优化决策结果
///
public static ProcessorResult CreateOptimizationDecisionResult(bool isSuccess, int totalOptimized, long executionTimeMs, string message)
{
return new ProcessorResult
{
IsSuccess = isSuccess,
ProcessorName = "OptimizationDecision",
ExecutionTimeMs = executionTimeMs,
SuccessCount = totalOptimized,
ProcessedCount = totalOptimized,
Message = message,
CreatedAt = DateTime.UtcNow
};
}
///
/// 创建结果生成结果
///
public static ProcessorResult CreateResultGenerationResult(bool isSuccess, int successCount, int failureCount, int totalTasks, long executionTimeMs, string message, object? resultData = null)
{
return new ProcessorResult
{
IsSuccess = isSuccess,
ProcessorName = "ResultGeneration",
ExecutionTimeMs = executionTimeMs,
SuccessCount = successCount,
FailureCount = failureCount,
ProcessedCount = totalTasks,
Message = message,
ResultData = resultData,
CreatedAt = DateTime.UtcNow
};
}
#endregion
}
}