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