paiban/NPP.SmartSchedue.Api.Contracts/Services/Integration/Input/PersonnelAllocationValidationInput.cs
Asoka.Wang 21f044712c 1
2025-08-27 18:39:19 +08:00

613 lines
17 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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