using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; namespace NPP.SmartSchedue.Api.Contracts.Services.Integration.Input { /// /// 人员分配验证输入 /// 用于智能分配系统中验证人员分配方案的可行性和合规性 /// 支持批量验证、多维度检查和灵活配置 /// public class PersonnelAllocationValidationInput { #region 核心验证数据 /// /// 待验证的人员分配列表 /// 包含任务与人员的具体分配关系 /// [Required(ErrorMessage = "人员分配列表不能为空")] [MinLength(1, ErrorMessage = "至少需要一个分配项")] public List Assignments { get; set; } = new(); #endregion #region 验证配置选项 /// /// 验证级别 /// 控制验证的严格程度和覆盖范围 /// public ValidationLevel ValidationLevel { get; set; } = ValidationLevel.Standard; /// /// 验证范围配置 /// 可选择验证的具体维度 /// public ValidationScopeConfig ValidationScope { get; set; } = new(); /// /// 是否包含冲突检测 /// 检测分配间的相互冲突 /// public bool IncludeConflictDetection { get; set; } = true; /// /// 是否包含性能分析 /// 分析验证对系统性能的影响 /// public bool IncludePerformanceAnalysis { get; set; } = false; /// /// 验证超时时间(秒) /// 防止验证过程过长影响用户体验 /// [Range(5, 300, ErrorMessage = "验证超时时间应在5-300秒之间")] public int ValidationTimeoutSeconds { get; set; } = 30; #endregion #region 业务上下文信息 /// /// 验证请求来源 /// 标识验证触发的业务场景 /// public ValidationSource RequestSource { get; set; } = ValidationSource.Manual; /// /// 操作员信息 /// 记录执行验证的用户 /// public OperatorInfo Operator { get; set; } = new(); /// /// 验证批次标识 /// 用于关联和追踪验证过程 /// public string ValidationBatchId { get; set; } = Guid.NewGuid().ToString(); /// /// 业务场景标识 /// 标识具体的业务使用场景 /// public string BusinessScenario { get; set; } = string.Empty; #endregion #region 时间范围控制 /// /// 验证基准日期 /// 作为验证计算的基准时间点 /// public DateTime ValidationBaseDate { get; set; } = DateTime.Now; /// /// 验证时间范围 /// 限制验证的时间窗口 /// public DateTimeRange ValidationTimeRange { get; set; } = new(); /// /// 是否忽略历史数据 /// 是否跳过已过时的分配验证 /// public bool IgnoreHistoricalData { get; set; } = true; #endregion #region 自定义验证规则 /// /// 自定义验证规则列表 /// 支持业务特定的验证逻辑 /// public List CustomRules { get; set; } = new(); /// /// 验证权重配置 /// 各类验证项的重要性权重 /// public ValidationWeights Weights { get; set; } = new(); /// /// 排除验证的项目 /// 明确不需要验证的特定项目 /// public List ExcludedValidationTypes { get; set; } = new(); #endregion #region 辅助方法 /// /// 验证输入数据的完整性 /// public ValidationInputCheckResult ValidateInput() { var result = new ValidationInputCheckResult { IsValid = true, Issues = new List() }; // 基础数据验证 if (!Assignments.Any()) { result.IsValid = false; result.Issues.Add("分配列表不能为空"); } // 分配数据完整性检查 foreach (var assignment in Assignments) { if (assignment.WorkOrderId <= 0) { result.IsValid = false; result.Issues.Add($"无效的工作任务ID: {assignment.WorkOrderId}"); } if (assignment.PersonnelId <= 0) { result.IsValid = false; result.Issues.Add($"无效的人员ID: {assignment.PersonnelId}"); } if (assignment.AssignmentDate == default) { result.IsValid = false; result.Issues.Add($"任务ID {assignment.WorkOrderId} 的分配日期无效"); } } // 时间范围合理性检查 if (ValidationTimeRange.IsValid() && ValidationTimeRange.EndDate < ValidationTimeRange.StartDate) { result.IsValid = false; result.Issues.Add("验证时间范围配置错误"); } // 超时时间合理性检查 if (ValidationTimeoutSeconds < 5 || ValidationTimeoutSeconds > 300) { result.IsValid = false; result.Issues.Add("验证超时时间配置超出有效范围"); } return result; } /// /// 获取验证统计信息 /// public ValidationInputStatistics GetStatistics() { return new ValidationInputStatistics { TotalAssignments = Assignments.Count, UniquePersonnelCount = Assignments.Select(a => a.PersonnelId).Distinct().Count(), UniqueTaskCount = Assignments.Select(a => a.WorkOrderId).Distinct().Count(), DateRangeSpan = Assignments.Any() ? (Assignments.Max(a => a.AssignmentDate) - Assignments.Min(a => a.AssignmentDate)).Days : 0, ValidationScopeCount = ValidationScope.GetEnabledScopeCount(), CustomRuleCount = CustomRules.Count, EstimatedExecutionTimeSeconds = EstimateExecutionTime() }; } /// /// 估算验证执行时间 /// private int EstimateExecutionTime() { // 基础验证时间(每个分配项约0.1秒) var baseTime = Assignments.Count * 0.1; // 冲突检测额外时间 if (IncludeConflictDetection) baseTime += Assignments.Count * 0.05; // 性能分析额外时间 if (IncludePerformanceAnalysis) baseTime += 2; // 自定义规则额外时间 baseTime += CustomRules.Count * 0.2; return Math.Max(1, (int)Math.Ceiling(baseTime)); } #endregion } #region 支持类定义 /// /// 人员分配项 /// 定义具体的任务-人员分配关系 /// public class PersonnelAssignment { /// /// 工作任务ID /// [Required] [Range(1, long.MaxValue, ErrorMessage = "工作任务ID必须大于0")] public long WorkOrderId { get; set; } /// /// 人员ID /// [Required] [Range(1, long.MaxValue, ErrorMessage = "人员ID必须大于0")] public long PersonnelId { get; set; } /// /// 分配日期 /// [Required] public DateTime AssignmentDate { get; set; } /// /// 班次ID /// public long? ShiftId { get; set; } /// /// 预计工作小时数 /// [Range(0.1, 24, ErrorMessage = "预计工作小时数应在0.1-24之间")] public decimal EstimatedWorkHours { get; set; } /// /// 分配优先级 /// 用于冲突时的优先级判断 /// [Range(1, 10, ErrorMessage = "优先级应在1-10之间")] public int Priority { get; set; } = 5; /// /// 分配标签 /// 用于分类和筛选 /// public List Tags { get; set; } = new(); /// /// 备注信息 /// [MaxLength(500, ErrorMessage = "备注信息不能超过500字符")] public string Remarks { get; set; } = string.Empty; /// /// 是否为强制分配 /// 强制分配将跳过某些验证规则 /// public bool IsMandatoryAssignment { get; set; } = false; } /// /// 验证级别枚举 /// public enum ValidationLevel { /// /// 基础验证 - 仅检查最基本的约束 /// Basic = 1, /// /// 标准验证 - 包含常用的验证规则 /// Standard = 2, /// /// 严格验证 - 全面的验证检查 /// Strict = 3, /// /// 自定义验证 - 根据配置执行验证 /// Custom = 4 } /// /// 验证范围配置 /// 控制具体验证的维度 /// public class ValidationScopeConfig { /// /// 验证资质匹配 /// public bool ValidateQualification { get; set; } = true; /// /// 验证时间冲突 /// public bool ValidateTimeConflict { get; set; } = true; /// /// 验证工作限制 /// public bool ValidateWorkLimit { get; set; } = true; /// /// 验证班次规则 /// public bool ValidateShiftRule { get; set; } = true; /// /// 验证负载均衡 /// public bool ValidateLoadBalance { get; set; } = false; /// /// 验证技能匹配 /// public bool ValidateSkillMatch { get; set; } = false; /// /// 验证成本控制 /// public bool ValidateCostControl { get; set; } = false; /// /// 获取启用的验证范围数量 /// public int GetEnabledScopeCount() { int count = 0; if (ValidateQualification) count++; if (ValidateTimeConflict) count++; if (ValidateWorkLimit) count++; if (ValidateShiftRule) count++; if (ValidateLoadBalance) count++; if (ValidateSkillMatch) count++; if (ValidateCostControl) count++; return count; } } /// /// 验证来源枚举 /// public enum ValidationSource { /// /// 手动验证 /// Manual = 1, /// /// 自动验证 /// Automatic = 2, /// /// 批量验证 /// Batch = 3, /// /// 定时验证 /// Scheduled = 4, /// /// API调用验证 /// ApiCall = 5 } /// /// 操作员信息 /// public class OperatorInfo { /// /// 操作员ID /// public long OperatorId { get; set; } /// /// 操作员姓名 /// public string OperatorName { get; set; } = string.Empty; /// /// 操作时间 /// public DateTime OperationTime { get; set; } = DateTime.Now; /// /// 操作IP地址 /// public string IpAddress { get; set; } = string.Empty; /// /// 操作角色 /// public string Role { get; set; } = string.Empty; } /// /// 日期时间范围 /// public class DateTimeRange { /// /// 开始时间 /// public DateTime StartDate { get; set; } /// /// 结束时间 /// public DateTime EndDate { get; set; } /// /// 是否为有效的时间范围 /// public bool IsValid() { return StartDate != default && EndDate != default && StartDate <= EndDate; } /// /// 获取时间跨度(天数) /// public int GetDaySpan() { return IsValid() ? (EndDate - StartDate).Days : 0; } } /// /// 自定义验证规则 /// public class CustomValidationRule { /// /// 规则ID /// public string RuleId { get; set; } = string.Empty; /// /// 规则名称 /// public string RuleName { get; set; } = string.Empty; /// /// 规则类型 /// public string RuleType { get; set; } = string.Empty; /// /// 规则配置参数 /// public Dictionary Parameters { get; set; } = new(); /// /// 规则权重 /// [Range(0.1, 10.0, ErrorMessage = "规则权重应在0.1-10.0之间")] public double Weight { get; set; } = 1.0; /// /// 是否启用 /// public bool IsEnabled { get; set; } = true; } /// /// 验证权重配置 /// public class ValidationWeights { /// /// 资质验证权重 /// [Range(0.0, 10.0)] public double QualificationWeight { get; set; } = 1.0; /// /// 时间冲突验证权重 /// [Range(0.0, 10.0)] public double TimeConflictWeight { get; set; } = 1.0; /// /// 工作限制验证权重 /// [Range(0.0, 10.0)] public double WorkLimitWeight { get; set; } = 1.0; /// /// 班次规则验证权重 /// [Range(0.0, 10.0)] public double ShiftRuleWeight { get; set; } = 0.8; /// /// 负载均衡验证权重 /// [Range(0.0, 10.0)] public double LoadBalanceWeight { get; set; } = 0.6; /// /// 技能匹配验证权重 /// [Range(0.0, 10.0)] public double SkillMatchWeight { get; set; } = 0.7; } /// /// 验证输入检查结果 /// public class ValidationInputCheckResult { /// /// 输入是否有效 /// public bool IsValid { get; set; } /// /// 问题列表 /// public List Issues { get; set; } = new(); } /// /// 验证输入统计信息 /// public class ValidationInputStatistics { /// /// 总分配数量 /// public int TotalAssignments { get; set; } /// /// 唯一人员数量 /// public int UniquePersonnelCount { get; set; } /// /// 唯一任务数量 /// public int UniqueTaskCount { get; set; } /// /// 日期范围跨度(天) /// public int DateRangeSpan { get; set; } /// /// 验证范围数量 /// public int ValidationScopeCount { get; set; } /// /// 自定义规则数量 /// public int CustomRuleCount { get; set; } /// /// 预估执行时间(秒) /// public int EstimatedExecutionTimeSeconds { get; set; } } #endregion }