paiban/NPP.SmartSchedue.Api.Contracts/Services/Integration/Output/PersonnelAllocationRecommendation.cs
Asoka.Wang 21f044712c 1
2025-08-27 18:39:19 +08:00

485 lines
14 KiB
C#
Raw 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 System;
using System.Collections.Generic;
using System.Linq;
using NPP.SmartSchedue.Api.Contracts.Services.Integration.Models;
using NPP.SmartSchedue.Api.Contracts.Services.Integration.Output;
namespace NPP.SmartSchedue.Api.Contracts.Services.Integration.Output
{
/// <summary>
/// 人员分配推荐结果
/// 智能推荐系统生成的最优人员分配方案
/// 包含推荐列表、最优分配、置信度评估、冲突检测等全面信息
/// </summary>
public class PersonnelAllocationRecommendation
{
#region
/// <summary>
/// 推荐批次标识
/// 用于关联和追踪推荐过程
/// </summary>
public string RecommendationBatchId { get; set; } = string.Empty;
/// <summary>
/// 推荐生成时间
/// </summary>
public DateTime GeneratedAt { get; set; } = DateTime.Now;
/// <summary>
/// 推荐策略
/// 生成推荐时使用的分配策略
/// </summary>
public string Strategy { get; set; } = string.Empty;
/// <summary>
/// 推荐任务总数
/// </summary>
public int TotalTaskCount { get; set; }
/// <summary>
/// 成功推荐任务数
/// </summary>
public int SuccessfulRecommendationCount { get; set; }
/// <summary>
/// 推荐成功率
/// </summary>
public double SuccessRate => TotalTaskCount > 0 ? (double)SuccessfulRecommendationCount / TotalTaskCount * 100 : 0;
#endregion
#region
/// <summary>
/// 任务推荐映射
/// Key: 任务ID, Value: 推荐人员列表(按评分排序)
/// </summary>
public Dictionary<long, List<PersonnelCandidate>> Recommendations { get; set; } = new();
/// <summary>
/// 最优分配方案
/// Key: 任务ID, Value: 最优推荐人员
/// </summary>
public Dictionary<long, PersonnelCandidate> OptimalAssignments { get; set; } = new();
/// <summary>
/// 替代分配方案
/// 当最优方案不可行时的备选方案
/// </summary>
public Dictionary<long, List<PersonnelCandidate>> AlternativeAssignments { get; set; } = new();
#endregion
#region
/// <summary>
/// 推荐置信度 (0-100)
/// 对推荐结果准确性的整体信心程度
/// </summary>
public double RecommendationConfidence { get; set; }
/// <summary>
/// 推荐质量评分 (0-100)
/// 综合评估推荐结果的质量水平
/// </summary>
public double QualityScore { get; set; }
/// <summary>
/// 平均匹配分数
/// 所有推荐人员的平均匹配分数
/// </summary>
public double AverageMatchScore { get; set; }
/// <summary>
/// 最低匹配分数
/// 所有推荐人员中的最低匹配分数
/// </summary>
public double MinimumMatchScore { get; set; }
/// <summary>
/// 最高匹配分数
/// 所有推荐人员中的最高匹配分数
/// </summary>
public double MaximumMatchScore { get; set; }
#endregion
#region
/// <summary>
/// 潜在冲突警告
/// 检测到的分配冲突和风险提示
/// </summary>
public List<ConflictWarning> ConflictWarnings { get; set; } = new();
/// <summary>
/// 风险评估结果
/// 整体风险评估和风险分布
/// </summary>
public RiskAssessment RiskAssessment { get; set; } = new();
/// <summary>
/// 合规性检查结果
/// 推荐方案的合规性评估
/// </summary>
public ComplianceCheckResult ComplianceCheck { get; set; } = new();
#endregion
#region
/// <summary>
/// 人员利用率统计
/// 推荐方案中的人员工作负载分布
/// </summary>
public Dictionary<long, PersonnelUtilizationStats> PersonnelUtilization { get; set; } = new();
/// <summary>
/// 技能匹配统计
/// 推荐方案的整体技能匹配情况
/// </summary>
public SkillMatchStatistics SkillMatchStats { get; set; } = new();
/// <summary>
/// 负载均衡评估
/// 推荐方案的工作负载均衡程度
/// </summary>
public LoadBalanceAssessment LoadBalanceAssessment { get; set; } = new();
#endregion
#region
/// <summary>
/// 推荐摘要
/// 推荐结果的简要总结
/// </summary>
public string RecommendationSummary { get; set; } = string.Empty;
/// <summary>
/// 推荐依据
/// 生成推荐的具体理由和依据
/// </summary>
public string RecommendationBasis { get; set; } = string.Empty;
/// <summary>
/// 执行建议
/// 实施推荐方案的具体建议和注意事项
/// </summary>
public List<string> ExecutionAdvice { get; set; } = new();
/// <summary>
/// 改进建议
/// 提高推荐质量的改进建议
/// </summary>
public List<string> ImprovementSuggestions { get; set; } = new();
#endregion
#region
/// <summary>
/// 推荐生成耗时(毫秒)
/// </summary>
public long GenerationTimeMs { get; set; }
/// <summary>
/// 推荐算法版本
/// </summary>
public string AlgorithmVersion { get; set; } = string.Empty;
/// <summary>
/// 使用的权重配置
/// </summary>
public Dictionary<string, double> UsedWeights { get; set; } = new();
#endregion
#region
public PersonnelAllocationRecommendation()
{
Recommendations = new Dictionary<long, List<PersonnelCandidate>>();
OptimalAssignments = new Dictionary<long, PersonnelCandidate>();
AlternativeAssignments = new Dictionary<long, List<PersonnelCandidate>>();
ConflictWarnings = new List<ConflictWarning>();
ExecutionAdvice = new List<string>();
ImprovementSuggestions = new List<string>();
PersonnelUtilization = new Dictionary<long, PersonnelUtilizationStats>();
UsedWeights = new Dictionary<string, double>();
}
#endregion
#region
/// <summary>
/// 获取指定任务的推荐人员数量
/// </summary>
/// <param name="taskId">任务ID</param>
/// <returns>推荐人员数量</returns>
public int GetRecommendationCount(long taskId)
{
return Recommendations.TryGetValue(taskId, out var candidates) ? candidates.Count : 0;
}
/// <summary>
/// 获取指定任务的最优推荐人员
/// </summary>
/// <param name="taskId">任务ID</param>
/// <returns>最优推荐人员如果不存在则返回null</returns>
public PersonnelCandidate? GetOptimalCandidate(long taskId)
{
return OptimalAssignments.TryGetValue(taskId, out var candidate) ? candidate : null;
}
/// <summary>
/// 检查是否有冲突警告
/// </summary>
/// <returns>是否存在冲突警告</returns>
public bool HasConflicts => ConflictWarnings.Any();
/// <summary>
/// 获取高风险的冲突警告
/// </summary>
/// <returns>高风险冲突警告列表</returns>
public List<ConflictWarning> GetHighRiskConflicts()
{
return ConflictWarnings.Where(c => c.RiskLevel == RiskLevel.High).ToList();
}
/// <summary>
/// 计算整体推荐质量
/// </summary>
/// <returns>推荐质量评分</returns>
public double CalculateOverallQuality()
{
if (!OptimalAssignments.Any())
return 0;
var scores = OptimalAssignments.Values.Select(c => c.TotalScore);
return scores.Average();
}
#endregion
}
#region
/// <summary>
/// 冲突警告
/// </summary>
public class ConflictWarning
{
/// <summary>
/// 冲突描述
/// </summary>
public string Description { get; set; } = string.Empty;
/// <summary>
/// 涉及的任务ID
/// </summary>
public List<long> AffectedTaskIds { get; set; } = new();
/// <summary>
/// 涉及的人员ID
/// </summary>
public List<long> AffectedPersonnelIds { get; set; } = new();
/// <summary>
/// 风险等级
/// </summary>
public RiskLevel RiskLevel { get; set; } = RiskLevel.Medium;
/// <summary>
/// 建议解决方案
/// </summary>
public List<string> SuggestedSolutions { get; set; } = new();
/// <summary>
/// 冲突发生时间
/// </summary>
public DateTime ConflictTime { get; set; } = DateTime.Now;
}
/// <summary>
/// 合规性检查结果
/// </summary>
public class ComplianceCheckResult
{
/// <summary>
/// 是否合规
/// </summary>
public bool IsCompliant { get; set; } = true;
/// <summary>
/// 合规性评分 (0-100)
/// </summary>
public double ComplianceScore { get; set; }
/// <summary>
/// 合规检查项目
/// </summary>
public List<ComplianceCheckItem> CheckItems { get; set; } = new();
/// <summary>
/// 不合规项目
/// </summary>
public List<ComplianceViolation> Violations { get; set; } = new();
/// <summary>
/// 合规性建议
/// </summary>
public List<string> ComplianceSuggestions { get; set; } = new();
}
/// <summary>
/// 人员利用率统计
/// </summary>
public class PersonnelUtilizationStats
{
/// <summary>
/// 人员ID
/// </summary>
public long PersonnelId { get; set; }
/// <summary>
/// 人员姓名
/// </summary>
public string PersonnelName { get; set; } = string.Empty;
/// <summary>
/// 已分配任务数
/// </summary>
public int AssignedTaskCount { get; set; }
/// <summary>
/// 工作负载百分比
/// </summary>
public double WorkloadPercentage { get; set; }
/// <summary>
/// 是否超负荷
/// </summary>
public bool IsOverloaded => WorkloadPercentage > 100;
/// <summary>
/// 剩余可分配容量
/// </summary>
public double RemainingCapacity { get; set; }
}
/// <summary>
/// 技能匹配统计
/// </summary>
public class SkillMatchStatistics
{
/// <summary>
/// 平均技能匹配分数
/// </summary>
public double AverageSkillMatchScore { get; set; }
/// <summary>
/// 技能匹配分布
/// 各分数段的分布情况
/// </summary>
public Dictionary<string, int> ScoreDistribution { get; set; } = new();
/// <summary>
/// 技能匹配率
/// </summary>
public double SkillMatchRate { get; set; }
/// <summary>
/// 技能提升建议
/// </summary>
public List<string> SkillImprovementSuggestions { get; set; } = new();
}
/// <summary>
/// 负载均衡评估
/// </summary>
public class LoadBalanceAssessment
{
/// <summary>
/// 负载均衡评分 (0-100)
/// </summary>
public double LoadBalanceScore { get; set; }
/// <summary>
/// 负载分布情况
/// </summary>
public Dictionary<string, double> LoadDistribution { get; set; } = new();
/// <summary>
/// 负载不均衡程度
/// </summary>
public double LoadImbalanceDegree { get; set; }
/// <summary>
/// 负载均衡建议
/// </summary>
public List<string> LoadBalanceSuggestions { get; set; } = new();
}
/// <summary>
/// 合规检查项目
/// </summary>
public class ComplianceCheckItem
{
/// <summary>
/// 检查项目名称
/// </summary>
public string ItemName { get; set; } = string.Empty;
/// <summary>
/// 检查结果
/// </summary>
public bool IsPassed { get; set; }
/// <summary>
/// 检查详情
/// </summary>
public string Details { get; set; } = string.Empty;
/// <summary>
/// 检查时间
/// </summary>
public DateTime CheckTime { get; set; } = DateTime.Now;
}
/// <summary>
/// 合规违规
/// </summary>
public class ComplianceViolation
{
/// <summary>
/// 违规类型
/// </summary>
public string ViolationType { get; set; } = string.Empty;
/// <summary>
/// 违规描述
/// </summary>
public string Description { get; set; } = string.Empty;
/// <summary>
/// 违规严重程度
/// </summary>
public ViolationSeverity Severity { get; set; } = ViolationSeverity.Warning;
/// <summary>
/// 涉及的任务ID
/// </summary>
public List<long> AffectedTaskIds { get; set; } = new();
/// <summary>
/// 涉及的人员ID
/// </summary>
public List<long> AffectedPersonnelIds { get; set; } = new();
}
#endregion
}