using System; using System.Collections.Generic; using System.Linq; using NPP.SmartSchedue.Api.Contracts.Domain.Work; using NPP.SmartSchedue.Api.Contracts.Domain.Personnel; using NPP.SmartSchedue.Api.Contracts.Services.Integration.Input; using NPP.SmartSchedue.Api.Contracts.Services.Integration.Output; using NPP.SmartSchedue.Api.Contracts.Services.Time.Output; namespace NPP.SmartSchedue.Api.Contracts.Services.Integration.Internal { /// /// 全局分配内部上下文 /// 业务用途:封装遗传算法运行所需的完整环境信息,预加载数据避免重复查询 /// public class GlobalAllocationContext { /// /// 待分配的任务列表 /// public List Tasks { get; set; } = new(); /// /// 可用人员池 /// public List AvailablePersonnel { get; set; } = new(); /// /// 全局优化配置 /// public GlobalOptimizationConfig Config { get; set; } = new(); /// /// 性能指标数据 /// public Dictionary Metrics { get; set; } = new(); /// /// 处理日志记录 /// public List ProcessingLog { get; set; } = new(); /// /// 当前正在处理的任务(用于规则验证时的精确项目信息获取) /// public WorkOrderEntity CurrentTask { get; set; } /// /// 班次编号映射缓存 /// Key: ShiftId, Value: ShiftNumber /// public Dictionary ShiftNumberMapping { get; set; } = new(); /// /// 人员项目FL映射缓存 /// Key: "PersonnelId_ProjectNumber", Value: 是否为FL /// public Dictionary PersonnelProjectFLMapping { get; set; } = new(); /// /// 班次规则 /// public List ShiftRulesMapping { get; set; } = new(); /// /// 【性能优化】预加载的人员历史任务数据 - 避免重复查询sse_work_order表 /// Key: PersonnelId, Value: 该人员的历史任务列表(包含班次信息) /// public Dictionary> PersonnelHistoryTasks { get; set; } = new(); /// /// 【性能优化】预加载的FL人员关系数据 - 避免重复查询sse_work_order_fl_personnel表 /// Key: TaskId, Value: 该任务的FL人员列表 /// public Dictionary> TaskFLPersonnelMapping { get; set; } = new(); /// /// 【性能优化】预加载的人员资质缓存 - 避免重复查询sse_personnel_qualification表 /// Key: PersonnelId, Value: 该人员的资质信息列表 /// 用于加速资质匹配计算,避免遗传算法中的重复资质查询 /// public Dictionary> PersonnelQualificationsCache { get; set; } = new(); /// /// 【性能优化】预筛选结果缓存 - 60%性能提升核心机制 /// Key: "TaskId_PersonnelId" (复合键), Value: 预筛选评分和可行性结果 /// 用于快速排除不可行的任务-人员组合,大幅减少遗传算法搜索空间 /// public Dictionary PrefilterResults { get; set; } = new(); /// /// 【性能优化】高优先级任务-人员组合索引 /// 用于加速遗传算法初始种群生成和变异操作 /// public Dictionary> HighPriorityTaskPersonnelMapping { get; set; } = new(); /// /// 【并行计算】线程安全的缓存锁 /// 用于并行计算时保护共享数据结构 /// public readonly object CacheLock = new object(); /// /// 【收敛检测】遗传算法收敛检测器 - 15%性能提升 /// 用于智能监测算法收敛状态,提前终止无效迭代 /// public ConvergenceDetector ConvergenceDetector { get; set; } = new(); /// /// 【并行计算】并行计算分区列表 - 40%性能提升 /// 用于多线程并行处理,充分利用多核处理器性能 /// public List ParallelPartitions { get; set; } = new(); /// /// 【缓存优化】智能分层缓存管理器 - 20%性能提升 /// 用于管理多层次缓存结构,提供智能缓存策略和生命周期管理 /// public IntelligentCacheManager CacheManager { get; set; } = new(); #region 班次规则验证专用缓存 - 新增 /// /// 【班次规则优化】人员历史工作日期缓存 - 15天时间窗口 /// Key: PersonnelId, Value: 工作日期列表 /// 用途: 加速连续工作天数、次日休息等规则验证,避免重复查询 /// public Dictionary> PersonnelWorkDatesCache { get; set; } = new(); /// /// 【班次规则优化】项目FL人员映射 - 项目FL优先规则专用 /// Key: "PersonnelId_ProjectNumber", Value: 是否为该项目FL /// 用途: 快速判断人员在项目中的FL身份,优化规则10验证性能 /// public Dictionary PersonnelProjectFLCache { get; set; } = new(); /// /// 【班次规则优化】人员项目FL统计 - 综合评分专用 /// Key: PersonnelId, Value: 该人员所有项目FL关联信息 /// 用途: 支持规则10的综合评分算法,考虑多项目FL经验 /// public Dictionary> PersonnelAllProjectFLsCache { get; set; } = new(); /// /// 时间窗口起始日期 - 15天历史数据范围 /// public DateTime TimeWindowStartDate { get; set; } /// /// 时间窗口结束日期 - 15天未来数据范围 /// public DateTime TimeWindowEndDate { get; set; } /// /// 已加载缓存数据的人员ID集合 - 避免重复加载 /// public HashSet CachedPersonnelIds { get; set; } = new(); /// /// 已加载缓存数据的项目集合 - 避免重复加载 /// public HashSet CachedProjects { get; set; } = new(); #endregion #region 班次不可用性缓存 - 新增高价值缓存 /// /// 【高价值缓存】班次不可用性数据 - 85%+性能提升核心 /// Key: "Date_ShiftId" (复合键), Value: 该日期班次不可用的人员ID集合 /// 业务用途: 快速排除在指定日期班次不可用的人员,避免无效分配 /// 缓存策略: 基于任务时间范围的智能窗口加载,避免全量数据 /// public Dictionary> DateShiftUnavailablePersonnel { get; set; } = new(); /// /// 【性能优化】人员不可用性快速索引 - 支持人员维度的快速查询 /// Key: PersonnelId, Value: 该人员的不可用时间-班次映射 /// 业务用途: 在遗传算法中快速检查人员在特定时间的可用性 /// public Dictionary>> PersonnelUnavailabilityIndex { get; set; } = new(); /// /// 【详细信息】班次不可用性详细数据缓存 - 支持复杂业务逻辑 /// Key: "Date_ShiftId_PersonnelId", Value: 不可用性详细信息 /// 业务用途: 提供不可用原因、优先级、时间段等详细信息,支持智能调度决策 /// public Dictionary UnavailabilityDetails { get; set; } = new(); /// /// 不可用性缓存的时间窗口起始日期 /// 基于任务组的最早日期计算 /// public DateTime UnavailabilityTimeWindowStart { get; set; } /// /// 不可用性缓存的时间窗口结束日期 /// 基于任务组的最晚日期计算 /// public DateTime UnavailabilityTimeWindowEnd { get; set; } /// /// 缓存命中率统计 - 性能监控用 /// public UnavailabilityCacheStats CacheStats { get; set; } = new(); #endregion #region 人员工作限制和请假缓存 /// /// 人员工作限制规则缓存 /// Key: PersonnelId, Value: 工作限制规则列表 /// public Dictionary PersonnelWorkLimitsRuleCache { get; set; } = new(); /// /// 人员请假记录缓存 /// Key: PersonnelId, Value: 请假记录列表 /// public Dictionary> PersonnelLeaveRecordsCache { get; set; } = new(); #endregion } /// /// 工作任务历史记录项 - 优化数据结构 /// 用于缓存人员历史任务,减少数据库查询 /// public class WorkOrderHistoryItem { public long TaskId { get; set; } public DateTime WorkDate { get; set; } public long? ShiftId { get; set; } public int? ShiftNumber { get; set; } public string ShiftName { get; set; } public string TaskCode { get; set; } public string ProjectNumber { get; set; } public int Status { get; set; } } /// /// 班次规则项 - 优化数据结构 /// 用于缓存班次规则,减少数据库查询 /// public class ShiftRuleItem { public long RuleId { get; set; } public string RuleType { get; set; } public string RuleName { get; set; } public bool IsEnabled { get; set; } public string RuleDescription { get; set; } } /// /// 全局分配人员信息 /// 业务用途:算法层使用的简化人员信息结构 /// public class GlobalPersonnelInfo { /// /// 人员ID /// public long Id { get; set; } /// /// 人员姓名 /// public string Name { get; set; } = string.Empty; /// /// 是否激活 /// public bool IsActive { get; set; } = true; } /// /// 输入验证结果 /// 业务用途:封装输入参数验证的结果信息 /// public class GlobalInputValidationResult { /// /// 验证是否通过 /// public bool IsValid { get; set; } /// /// 错误消息 /// public string ErrorMessage { get; set; } = string.Empty; /// /// 已验证的工作任务列表 /// public List WorkOrders { get; set; } = new(); } /// /// 遗传算法优化解决方案 /// 业务用途:封装遗传算法的优化结果和性能指标 /// public class GlobalOptimizedSolution { /// /// 解决方案是否有效 /// public bool IsValid { get; set; } /// /// 最佳分配方案 (TaskId -> PersonnelId) /// public Dictionary BestSolution { get; set; } = new(); /// /// 失败的任务ID列表 /// public List FailedTasks { get; set; } = new(); /// /// 人员工作负载分布 (PersonnelId -> Workload) /// public Dictionary PersonnelWorkloadDistribution { get; set; } = new(); /// /// 实际执行的遗传代数 /// public int ActualGenerations { get; set; } /// /// 收敛水平 (0-1) /// public double ConvergenceLevel { get; set; } /// /// 最佳适应度分数 /// public double BestFitness { get; set; } /// /// 平均适应度分数 /// public double AverageFitness { get; set; } /// /// 约束满足率 /// public double ConstraintSatisfactionRate { get; set; } /// /// 获取指定人员分配的任务数量 /// /// 人员ID /// 任务数量 public int GetTaskCountForPersonnel(long personnelId) { return BestSolution.Count(kvp => kvp.Value == personnelId); } /// /// 获取指定人员分配的任务ID列表 /// /// 人员ID /// 任务ID列表 public List GetAssignedTaskIds(long personnelId) { return BestSolution.Where(kvp => kvp.Value == personnelId).Select(kvp => kvp.Key).ToList(); } } /// /// 智能协商结果 /// 业务用途:封装协商引擎的执行结果 /// public class GlobalNegotiationResult { /// /// 协商操作列表 /// public List Actions { get; set; } = new(); /// /// 冲突检测信息列表 /// public List ConflictDetections { get; set; } = new(); } /// /// 人员任务预筛选结果 - 核心性能优化数据结构 /// 业务用途:缓存任务-人员组合的预筛选评估结果,避免重复计算 /// 性能价值:将O(n²)的适应度计算优化为O(1)的缓存查找 /// public class PersonnelTaskPrefilterResult { /// /// 任务ID /// public long TaskId { get; set; } /// /// 人员ID /// public long PersonnelId { get; set; } /// /// 是否可行(硬约束检查结果) /// public bool IsFeasible { get; set; } /// /// 预筛选评分(0-100分,综合软约束评估) /// public double PrefilterScore { get; set; } /// /// 约束违规类型列表 /// public List ConstraintViolations { get; set; } = new(); /// /// 评分详细分解 /// public Dictionary ScoreBreakdown { get; set; } = new(); /// /// 缓存时间戳(用于缓存过期管理) /// public DateTime CacheTimestamp { get; set; } = DateTime.Now; /// /// 是否为高优先级组合 /// public bool IsHighPriority { get; set; } } /// /// 遗传算法收敛检测器 - 15%性能提升机制 /// 业务用途:监测遗传算法收敛状态,提前终止无效迭代 /// 性能价值:避免无意义的计算资源浪费,智能调整迭代次数 /// public class ConvergenceDetector { /// /// 历史最佳适应度记录(最近N代) /// public List FitnessHistory { get; set; } = new(); /// /// 收敛检测窗口大小 /// public int WindowSize { get; set; } = 10; /// /// 收敛阈值(适应度改善低于此值认为收敛) /// public double ConvergenceThreshold { get; set; } = 0.001; /// /// 当前收敛状态 /// public bool IsConverged { get; set; } /// /// 收敛检测开始的最小代数 /// public int MinGenerationsBeforeCheck { get; set; } = 20; /// /// 平台期持续代数(适应度无显著改善的连续代数) /// public int PlateauGenerations { get; set; } /// /// 最大允许的平台期代数 /// public int MaxPlateauGenerations { get; set; } = 15; /// /// 当前最佳适应度 /// public double CurrentBestFitness { get; set; } /// /// 上一次显著改善时的代数 /// public int LastImprovementGeneration { get; set; } } /// /// 并行计算任务分区 - 40%性能提升机制 /// 业务用途:将计算任务合理分区,支持多线程并行处理 /// 性能价值:充分利用多核处理器,显著提升计算速度 /// public class ParallelComputePartition { /// /// 分区ID /// public int PartitionId { get; set; } /// /// 分区包含的任务ID列表 /// public List TaskIds { get; set; } = new(); /// /// 分区包含的人员ID列表 /// public List PersonnelIds { get; set; } = new(); /// /// 分区的预筛选结果 /// public List PartitionPrefilterResults { get; set; } = new(); /// /// 分区处理状态 /// public ParallelPartitionStatus Status { get; set; } = ParallelPartitionStatus.Pending; /// /// 分区处理开始时间 /// public DateTime StartTime { get; set; } /// /// 分区处理结束时间 /// public DateTime EndTime { get; set; } /// /// 分区处理异常信息 /// public string ErrorMessage { get; set; } = string.Empty; } /// /// 并行分区处理状态枚举 /// public enum ParallelPartitionStatus { /// /// 等待处理 /// Pending, /// /// 正在处理 /// Processing, /// /// 处理完成 /// Completed, /// /// 处理失败 /// Failed } /// /// 智能分层缓存管理器 - 20%性能提升核心组件 /// 业务用途:提供多层次缓存架构,优化数据访问模式,减少重复计算 /// 技术特点:L1高速缓存、L2常规缓存、L3持久缓存、智能淘汰策略 /// 性能价值:显著减少数据库访问、计算重复执行,提升整体响应速度 /// public class IntelligentCacheManager { /// /// L1高速缓存 - 最频繁访问的数据(内存中,容量小,速度最快) /// 适用:当前分配过程中的热点数据,如活跃的班次规则、FL关系等 /// public Dictionary> L1Cache { get; set; } = new(); /// /// L2常规缓存 - 一般频率访问的数据(内存中,容量中等) /// 适用:预筛选结果、人员历史数据、计算结果等 /// public Dictionary> L2Cache { get; set; } = new(); /// /// L3持久缓存 - 低频率但重要的数据(可持久化,容量大) /// 适用:基础配置数据、长期统计数据等 /// public Dictionary> L3Cache { get; set; } = new(); /// /// 缓存访问统计 - 用于智能缓存策略优化 /// public Dictionary AccessStats { get; set; } = new(); /// /// L1缓存最大容量 /// public int L1MaxSize { get; set; } = 100; /// /// L2缓存最大容量 /// public int L2MaxSize { get; set; } = 500; /// /// L3缓存最大容量 /// public int L3MaxSize { get; set; } = 2000; /// /// 缓存清理间隔(秒) /// public int CleanupIntervalSeconds { get; set; } = 300; /// /// 上次清理时间 /// public DateTime LastCleanupTime { get; set; } = DateTime.Now; /// /// 缓存命中率统计 /// public CachePerformanceStats PerformanceStats { get; set; } = new(); } /// /// 缓存项 - 包含数据和元数据的封装结构 /// public class CacheItem { /// /// 缓存的数据 /// public T Data { get; set; } /// /// 创建时间 /// public DateTime CreatedTime { get; set; } = DateTime.Now; /// /// 最后访问时间 /// public DateTime LastAccessTime { get; set; } = DateTime.Now; /// /// 访问次数 /// public int AccessCount { get; set; } = 0; /// /// 过期时间(可选) /// public DateTime? ExpiryTime { get; set; } /// /// 缓存优先级 /// public CachePriority Priority { get; set; } = CachePriority.Normal; /// /// 数据大小估算(用于内存管理) /// public long EstimatedSize { get; set; } = 0; /// /// 是否已过期 /// public bool IsExpired => ExpiryTime.HasValue && DateTime.Now > ExpiryTime.Value; /// /// 缓存效价值评分(访问频率 × 优先级 × 时效性) /// public double ValueScore => (AccessCount + 1) * (int)Priority * GetTimeWeight(); /// /// 计算时间权重(越新的数据权重越高) /// private double GetTimeWeight() { var ageHours = (DateTime.Now - LastAccessTime).TotalHours; return Math.Max(0.1, 1.0 - (ageHours / 24.0)); // 24小时内的数据权重从1.0递减到0.1 } } /// /// 缓存访问统计 /// public class CacheAccessStats { /// /// 总访问次数 /// public long TotalAccesses { get; set; } /// /// 缓存命中次数 /// public long HitCount { get; set; } /// /// 缓存未命中次数 /// public long MissCount { get; set; } /// /// 缓存命中率 /// public double HitRate => TotalAccesses > 0 ? (double)HitCount / TotalAccesses : 0.0; /// /// 平均访问时间(毫秒) /// public double AverageAccessTimeMs { get; set; } /// /// 最后统计重置时间 /// public DateTime LastResetTime { get; set; } = DateTime.Now; } /// /// 缓存性能统计 /// public class CachePerformanceStats { /// /// L1缓存命中率 /// public double L1HitRate { get; set; } /// /// L2缓存命中率 /// public double L2HitRate { get; set; } /// /// L3缓存命中率 /// public double L3HitRate { get; set; } /// /// 整体缓存命中率 /// public double OverallHitRate { get; set; } /// /// 缓存节省的数据库查询次数 /// public long SavedDatabaseQueries { get; set; } /// /// 缓存节省的计算时间(毫秒) /// public long SavedComputationMs { get; set; } /// /// 内存使用量估算(字节) /// public long MemoryUsageBytes { get; set; } } /// /// 缓存优先级枚举 /// public enum CachePriority { /// /// 低优先级 - 可随时清理 /// Low = 1, /// /// 普通优先级 - 常规清理策略 /// Normal = 2, /// /// 高优先级 - 优先保留 /// High = 3, /// /// 关键优先级 - 尽量不清理 /// Critical = 4 } #region 性能测试相关数据结构 /// /// 性能基准测试结果 /// 业务用途:封装性能测试的完整结果,包含优化前后对比 /// public class PerformanceBenchmarkResult { /// /// 测试是否成功 /// public bool IsSuccess { get; set; } /// /// 错误消息(如果测试失败) /// public string ErrorMessage { get; set; } = string.Empty; /// /// 测试配置信息 /// public PerformanceTestConfig TestConfiguration { get; set; } = new(); /// /// 优化后的性能指标 /// public PerformanceMetrics OptimizedPerformance { get; set; } = new(); /// /// 基线性能指标(优化前估算) /// public PerformanceMetrics BaselinePerformance { get; set; } = new(); /// /// 性能改进报告 /// public PerformanceImprovementReport PerformanceImprovement { get; set; } = new(); /// /// 测试执行总时间(毫秒) /// public long TestExecutionTimeMs { get; set; } /// /// 测试执行时间戳 /// public DateTime TestTimestamp { get; set; } = DateTime.Now; } /// /// 性能测试配置 /// public class PerformanceTestConfig { /// /// 测试任务数量 /// public int TaskCount { get; set; } /// /// 种群大小 /// public int PopulationSize { get; set; } /// /// 最大迭代代数 /// public int MaxGenerations { get; set; } /// /// 最大执行时间(秒) /// public int MaxExecutionTimeSeconds { get; set; } /// /// 测试环境信息 /// public string TestEnvironment { get; set; } = Environment.MachineName; /// /// CPU核心数 /// public int CpuCores { get; set; } = Environment.ProcessorCount; } /// /// 性能指标 /// 业务用途:详细记录各阶段的性能数据 /// public class PerformanceMetrics { /// /// 总执行时间(毫秒) /// public long TotalExecutionTimeMs { get; set; } /// /// 上下文构建时间(毫秒) /// public long ContextBuildTimeMs { get; set; } /// /// 预筛选时间(毫秒) /// public long PrefilteringTimeMs { get; set; } /// /// 遗传算法执行时间(毫秒) /// public long GeneticAlgorithmTimeMs { get; set; } /// /// 协商时间(毫秒) /// public long NegotiationTimeMs { get; set; } /// /// 实际执行代数 /// public int ActualGenerations { get; set; } /// /// 最佳适应度 /// public double BestFitness { get; set; } /// /// 约束满足率 /// public double ConstraintSatisfactionRate { get; set; } /// /// 收敛水平 /// public double ConvergenceLevel { get; set; } /// /// 复杂度因子(用于算法复杂度分析) /// public long ComplexityFactor { get; set; } /// /// 是否为估算值 /// public bool IsEstimate { get; set; } /// /// 是否有错误 /// public bool HasError { get; set; } /// /// 错误消息 /// public string ErrorMessage { get; set; } = string.Empty; /// /// 内存使用峰值(字节) /// public long PeakMemoryUsageBytes { get; set; } /// /// CPU使用率(百分比) /// public double CpuUsagePercent { get; set; } } /// /// 性能改进报告 /// 业务用途:量化优化效果,提供详细的对比分析 /// public class PerformanceImprovementReport { /// /// 时间改进百分比 /// public double TimeImprovementPercent { get; set; } /// /// 加速倍数 /// public double SpeedupFactor { get; set; } /// /// 预筛选时间改进(毫秒) /// public long PrefilteringImprovementMs { get; set; } /// /// 遗传算法时间改进(毫秒) /// public long GeneticAlgorithmImprovementMs { get; set; } /// /// 质量改进百分比 /// public double QualityImprovementPercent { get; set; } /// /// 约束满足率改进百分比 /// public double ConstraintImprovementPercent { get; set; } /// /// 综合改进百分比 /// public double OverallImprovementPercent { get; set; } /// /// 改进总结报告 /// public string ImprovementSummary { get; set; } = string.Empty; /// /// 关键优化点列表 /// public List KeyOptimizations { get; set; } = new(); /// /// 进一步优化建议 /// public List FurtherOptimizationSuggestions { get; set; } = new(); } #endregion #region 人员数据缓存项定义 /// /// 人员工作限制缓存项 /// 业务用途:缓存sse_personnel_work_limit表数据,避免遗传算法中的重复查询 /// public class PersonnelWorkLimitCacheItem { /// /// 主键ID /// public long Id { get; set; } /// /// 人员ID /// public long PersonnelId { get; set; } /// /// 最大连续工作天数 /// public int? MaxContinuousWorkDays { get; set; } /// /// 当周最大排班次数 /// public int? MaxShiftsPerWeek { get; set; } /// /// 特殊限制规则 /// public string? SpecialRule { get; set; } } /// /// 人员资质缓存项 /// 业务用途:缓存sse_personnel_qualification表数据,用于快速资质匹配 /// public class PersonnelQualificationCacheItem { /// /// 主键ID /// public long Id { get; set; } /// /// 人员ID /// public long PersonnelId { get; set; } /// /// 人员姓名 /// public string PersonnelName { get; set; } = string.Empty; /// /// 资质ID /// public long QualificationId { get; set; } /// /// 岗位负责人 /// public bool HighLevel { get; set; } = false; /// /// 有效期 /// public DateTime? ExpiryDate { get; set; } /// /// 有效期预警天数 /// public int? ExpiryWarningDays { get; set; } /// /// 续期日期 /// public DateTime? RenewalDate { get; set; } /// /// 绑定状态 /// public bool IsActive { get; set; } } #endregion #region 班次规则验证相关数据结构 - 新增 /// /// 人员工作限制实体 - 缓存版本 /// 用途:缓存sse_personnel_work_limit表数据,避免频繁数据库查询 /// public class PersonnelWorkLimitEntity { public long Id { get; set; } public long PersonnelId { get; set; } public int? MaxContinuousWorkDays { get; set; } public int? MaxShiftsPerWeek { get; set; } public string? SpecialRules { get; set; } public bool IsActive { get; set; } = true; } /// /// 员工请假记录 - 缓存版本 /// 用途:缓存请假信息,快速验证时间可用性 /// public class EmployeeLeaveRecord { public long Id { get; set; } public long PersonnelId { get; set; } public DateTime StartDate { get; set; } public DateTime EndDate { get; set; } public string LeaveType { get; set; } = string.Empty; public bool IsApproved { get; set; } } /// /// 项目FL汇总信息 /// 用途:支持规则10的综合评分算法 /// public class ProjectFLSummary { /// /// 项目号 /// public string ProjectNumber { get; set; } = string.Empty; /// /// 在该项目中的任务数量 /// public int TaskCount { get; set; } /// /// 最后参与该项目的时间 /// public DateTime LastAssignmentDate { get; set; } /// /// 项目活跃度评分 /// public double ActivityScore { get; set; } } #region 班次不可用性相关数据结构 /// /// 班次不可用性缓存项 - 优化数据结构 /// 用于缓存人员在特定日期班次的不可用性详细信息 /// public class ShiftUnavailabilityCacheItem { /// /// 人员ID /// public long PersonnelId { get; set; } /// /// 日期 /// public DateTime Date { get; set; } /// /// 班次ID /// public long ShiftId { get; set; } /// /// 不可用原因类型 /// 1=个人意愿, 2=培训任务, 3=会议任务, 4=设备维护, 7=临时请假, 8=计划请假, 9=医疗原因, 10=家庭事务, 11=轮岗安排, 12=技能认证, 99=其他原因 /// public int ReasonType { get; set; } /// /// 优先级权重 /// public int Priority { get; set; } /// /// 生效开始时间(可选) /// public TimeSpan? EffectiveStartTime { get; set; } /// /// 生效结束时间(可选) /// public TimeSpan? EffectiveEndTime { get; set; } /// /// 备注信息 /// public string Remark { get; set; } /// /// 是否为硬约束(不可违反) /// public bool IsHardConstraint => ReasonType is 7 or 8 or 9; // 请假和医疗原因为硬约束 /// /// 约束权重评分(用于遗传算法评分) /// public double ConstraintScore { get { return ReasonType switch { 1 => 0.3, // 个人意愿 - 软约束 2 => 0.2, // 培训任务 - 可协调 3 => 0.4, // 会议任务 - 中等约束 4 => 0.6, // 设备维护 - 较强约束 7 => 0.0, // 临时请假 - 硬约束 8 => 0.0, // 计划请假 - 硬约束 9 => 0.0, // 医疗原因 - 硬约束 10 => 0.1, // 家庭事务 - 弱约束 11 => 0.3, // 轮岗安排 - 软约束 12 => 0.5, // 技能认证 - 中等约束 _ => 0.2 // 其他原因 - 默认软约束 }; } } } /// /// 不可用性缓存统计信息 /// public class UnavailabilityCacheStats { /// /// 缓存命中次数 /// public long HitCount { get; set; } /// /// 缓存未命中次数 /// public long MissCount { get; set; } /// /// 缓存命中率 /// public double HitRate => HitCount + MissCount == 0 ? 0 : (double)HitCount / (HitCount + MissCount); /// /// 缓存的记录总数 /// public int CachedRecordCount { get; set; } /// /// 覆盖的人员数量 /// public int CoveredPersonnelCount { get; set; } /// /// 覆盖的日期范围天数 /// public int CoveredDays { get; set; } /// /// 硬约束记录数量 /// public int HardConstraintCount { get; set; } /// /// 软约束记录数量 /// public int SoftConstraintCount { get; set; } } #endregion /// /// 规则验证结果 - 与PersonnelAllocationService保持一致 /// public class ShiftRuleValidationResult { /// /// 是否验证通过 /// public bool IsValid { get; set; } /// /// 合规评分 (0-100) /// public double ComplianceScore { get; set; } /// /// 是否为关键违规 /// public bool IsCritical { get; set; } /// /// 违规信息 /// public string ViolationMessage { get; set; } = string.Empty; } /// /// 班次规则验证汇总结果 /// public class ShiftRulesValidationSummary { /// /// 整体是否合规 /// public bool IsCompliant { get; set; } /// /// 综合评分 /// public double OverallScore { get; set; } /// /// 验证详情 /// public string ValidationReason { get; set; } = string.Empty; /// /// 是否有关键违规 /// public bool HasCriticalViolations { get; set; } /// /// 个别规则验证结果 /// public List IndividualResults { get; set; } = new(); } /// /// 规则类型和配置信息 /// public class ShiftRuleConfig { public string RuleType { get; set; } = string.Empty; public int Priority { get; set; } public bool IsCritical { get; set; } public string RuleName { get; set; } = string.Empty; public string Description { get; set; } = string.Empty; } /// /// 规则优先级配置 - 与用户决策保持一致 /// public static class ShiftRulePriorityConfig { public static readonly Dictionary Rules = new() { ["1"] = new() { RuleType = "1", Priority = 5, IsCritical = false, RuleName = "指定人员优先", Description = "优先分配指定人员" }, ["2"] = new() { RuleType = "2", Priority = 2, IsCritical = true, RuleName = "周任务限制", Description = "限制人员周任务数量" }, ["3"] = new() { RuleType = "3", Priority = 3, IsCritical = true, RuleName = "早中班连续性", Description = "同天禁止早班和中班同时存在" }, ["4"] = new() { RuleType = "4", Priority = 3, IsCritical = true, RuleName = "中夜班连续性", Description = "同天禁止中班和夜班同时存在" }, ["5"] = new() { RuleType = "5", Priority = 4, IsCritical = true, RuleName = "跨周末连续性", Description = "禁止周日/下周六连续工作" }, ["6"] = new() { RuleType = "6", Priority = 4, IsCritical = true, RuleName = "周末连续性", Description = "禁止周六/周日连续工作" }, ["7"] = new() { RuleType = "7", Priority = 2, IsCritical = true, RuleName = "连续工作天数", Description = "限制连续工作天数" }, ["8"] = new() { RuleType = "8", Priority = 1, IsCritical = true, RuleName = "夜班后休息", Description = "夜班后次日必须休息" }, ["9"] = new() { RuleType = "9", Priority = 1, IsCritical = true, RuleName = "中班后休息", Description = "中班后次日必须休息" }, ["10"] = new() { RuleType = "10", Priority = 5, IsCritical = false, RuleName = "项目FL优先", Description = "优先分配本项目FL人员" } }; } #endregion }