using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using NPP.SmartSchedue.Api.Contracts.Services.Integration.Input; using System.Linq; using NPP.SmartSchedue.Api.Contracts.Services.Integration.Models; // Added for .Any() and .Intersect() namespace NPP.SmartSchedue.Api.Contracts.Services.Integration.Input { /// /// 人员分配推荐输入参数 /// 用于智能推荐系统中获取最优人员分配方案的输入数据 /// 支持多种推荐策略、批量任务处理和灵活配置选项 /// public class PersonnelAllocationRecommendationInput { #region 核心任务数据 /// /// 工作任务ID列表 /// 需要推荐人员分配的具体工作任务 /// [Required(ErrorMessage = "工作任务ID列表不能为空")] [MinLength(1, ErrorMessage = "至少需要一个工作任务")] public List WorkOrderIds { get; set; } = new(); /// /// 推荐策略 /// 控制推荐算法的优先级和侧重点 /// public PersonnelAllocationStrategy Strategy { get; set; } = PersonnelAllocationStrategy.FairDistribution; #endregion #region 推荐配置选项 /// /// 每个任务的推荐人数 /// 为每个任务推荐的前N个候选人员数量 /// [Range(1, 10, ErrorMessage = "推荐人数应在1-10之间")] public int RecommendationCount { get; set; } = 3; /// /// 是否包含详细评分 /// 在推荐结果中包含各维度的详细评分信息 /// public bool IncludeDetailedScores { get; set; } = true; /// /// 是否包含风险评估 /// 在推荐结果中包含潜在风险和冲突检测 /// public bool IncludeRiskAssessment { get; set; } = true; /// /// 是否包含替代方案 /// 当最优方案不可行时,提供替代分配方案 /// public bool IncludeAlternativeSolutions { get; set; } = false; #endregion #region 筛选和约束条件 /// /// 排除的人员ID列表 /// 明确指定不参与推荐的人员 /// public List ExcludedPersonnelIds { get; set; } = new(); /// /// 优先考虑的人员ID列表 /// 在同等条件下优先推荐的人员 /// public List PreferredPersonnelIds { get; set; } = new(); /// /// 最小资质匹配度要求 (0-100) /// 推荐人员必须达到的最低资质匹配分数 /// [Range(0, 100, ErrorMessage = "最小资质匹配度应在0-100之间")] public double MinimumQualificationScore { get; set; } = 60.0; /// /// 最小约束符合度要求 (0-100) /// 推荐人员必须达到的最低约束符合分数 /// [Range(0, 100, ErrorMessage = "最小约束符合度应在0-100之间")] public double MinimumConstraintScore { get; set; } = 60.0; #endregion #region 时间范围控制 /// /// 推荐基准日期 /// 作为推荐计算的基准时间点 /// public DateTime RecommendationBaseDate { get; set; } = DateTime.Now; /// /// 推荐时间范围 /// 限制推荐计算的时间窗口 /// public DateRange? TimeRange { get; set; } #endregion #region 业务上下文信息 /// /// 推荐请求来源 /// 标识推荐触发的业务场景 /// public RecommendationSource RequestSource { get; set; } = RecommendationSource.Manual; /// /// 操作员信息 /// 记录执行推荐的用户 /// public OperatorInfo Operator { get; set; } = new(); /// /// 推荐批次标识 /// 用于关联和追踪推荐过程 /// public string RecommendationBatchId { get; set; } = Guid.NewGuid().ToString(); /// /// 业务场景标识 /// 标识具体的业务使用场景 /// public string BusinessScenario { get; set; } = string.Empty; /// /// 优先级权重配置 /// 自定义各评分维度的权重分配 /// public Dictionary CustomWeights { get; set; } = new(); #endregion #region 性能和质量控制 /// /// 推荐超时时间(秒) /// 防止推荐过程过长影响用户体验 /// [Range(5, 300, ErrorMessage = "推荐超时时间应在5-300秒之间")] public int RecommendationTimeoutSeconds { get; set; } = 60; /// /// 最小推荐置信度 (0-100) /// 只返回置信度达到此阈值的推荐结果 /// [Range(0, 100, ErrorMessage = "最小推荐置信度应在0-100之间")] public double MinimumConfidenceLevel { get; set; } = 70.0; /// /// 是否启用缓存 /// 使用缓存提高推荐性能 /// public bool EnableCaching { get; set; } = true; #endregion #region 高级配置选项 /// /// 负载均衡策略 /// 控制推荐时的人员工作负载分配策略 /// public LoadBalanceStrategy LoadBalanceStrategy { get; set; } = LoadBalanceStrategy.Moderate; /// /// 技能匹配策略 /// 控制技能匹配的严格程度 /// public SkillMatchStrategy SkillMatchStrategy { get; set; } = SkillMatchStrategy.Balanced; /// /// 历史表现权重 /// 历史工作表现对推荐的影响权重 /// [Range(0, 1, ErrorMessage = "历史表现权重应在0-1之间")] public double HistoricalPerformanceWeight { get; set; } = 0.3; #endregion #region 验证和约束 /// /// 是否启用严格验证 /// 启用更严格的推荐结果验证 /// public bool EnableStrictValidation { get; set; } = false; /// /// 是否包含合规性检查 /// 在推荐中包含法规和制度合规性检查 /// public bool IncludeComplianceCheck { get; set; } = true; /// /// 是否包含成本效益分析 /// 在推荐中包含成本效益评估 /// public bool IncludeCostBenefitAnalysis { get; set; } = false; #endregion #region 输出格式控制 /// /// 输出语言 /// 推荐结果的显示语言 /// public string OutputLanguage { get; set; } = "zh-CN"; /// /// 是否包含可视化数据 /// 在结果中包含图表和可视化所需的数据 /// public bool IncludeVisualizationData { get; set; } = false; /// /// 是否包含执行建议 /// 在结果中包含具体的执行建议和注意事项 /// public bool IncludeExecutionAdvice { get; set; } = true; #endregion #region 构造函数 public PersonnelAllocationRecommendationInput() { // 设置默认值 WorkOrderIds = new List(); ExcludedPersonnelIds = new List(); PreferredPersonnelIds = new List(); CustomWeights = new Dictionary(); TimeRange = null; } public PersonnelAllocationRecommendationInput(List workOrderIds, PersonnelAllocationStrategy strategy = PersonnelAllocationStrategy.FairDistribution) { WorkOrderIds = workOrderIds ?? new List(); Strategy = strategy; ExcludedPersonnelIds = new List(); PreferredPersonnelIds = new List(); CustomWeights = new Dictionary(); TimeRange = null; } #endregion } #region 相关枚举定义 /// /// 推荐请求来源 /// public enum RecommendationSource { /// /// 手动触发 /// Manual = 1, /// /// 系统自动 /// System = 2, /// /// 定时任务 /// Scheduled = 3, /// /// 外部接口 /// External = 4, /// /// 工作流触发 /// Workflow = 5 } /// /// 负载均衡策略 /// public enum LoadBalanceStrategy { /// /// 保守策略 /// 优先考虑人员休息和负载均衡 /// Conservative = 1, /// /// 平衡策略 /// 平衡效率和负载均衡 /// Moderate = 2, /// /// 激进策略 /// 优先考虑任务完成效率 /// Aggressive = 3 } /// /// 技能匹配策略 /// public enum SkillMatchStrategy { /// /// 严格匹配 /// 要求技能完全匹配 /// Strict = 1, /// /// 平衡匹配 /// 允许部分技能匹配,考虑学习能力 /// Balanced = 2, /// /// 宽松匹配 /// 允许技能相近,优先考虑人员发展 /// Flexible = 3 } #endregion #region 辅助类 /// /// 日期范围 /// public class DateRange { /// /// 开始日期 /// public DateTime StartDate { get; set; } /// /// 结束日期 /// public DateTime EndDate { get; set; } /// /// 时间范围跨度 /// public TimeSpan Duration => EndDate - StartDate; } #endregion }