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
}