ltx e54112e08d fix: 修复赛事编排并完善成绩与检录大屏数据"
-m "修复赛事编排确认时 EventSessionEntry 写入无效 RegistrationItemId 导致的外键冲突。"
  -m "完善成绩展示数据,补充参赛单位名称,支持成绩管理矩阵及大屏展示。"
  -m "调整检录大屏进度规则:赛事检录顺序、当前检录项目及队伍状态统一跟随一检进度。"
  -m "当前比赛默认根据三检通过记录更新;赛事仅配置两检时,允许二检作为上场标记。"
  -m "一检全部完成后自动切换下一项目,全部完成后不再错误展示全部参赛队伍。
2026-10-30 10:42:40 +08:00

1085 lines
26 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.

namespace YD_Event.Application.Workbench.Dtos;
/// <summary>
/// 工作台赛事选择查询输入
/// </summary>
public class WorkbenchEventQueryInput : Pagination
{
/// <summary>
/// 赛事名称(可选,模糊匹配)
/// </summary>
public string? EventName { get; set; }
/// <summary>
/// 数据来源:registration-报名平台(默认),orderbook-秩序册
/// </summary>
public string SourceMode { get; set; } = "registration";
}
/// <summary>
/// 工作台赛事选择项
/// </summary>
public class WorkbenchEventDto
{
/// <summary>
/// 赛事ID
/// </summary>
public long Id { get; set; }
/// <summary>
/// 赛事名称
/// </summary>
public string EventName { get; set; } = string.Empty;
/// <summary>
/// 赛事状态
/// </summary>
public int EventStatus { get; set; }
/// <summary>
/// 比赛开始时间
/// </summary>
public DateTime? MatchStartTime { get; set; }
/// <summary>
/// 比赛结束时间
/// </summary>
public DateTime? MatchEndTime { get; set; }
}
/// <summary>
/// 工作台场次列表查询输入
/// </summary>
public class WorkbenchSessionQueryInput
{
/// <summary>
/// 赛事ID
/// </summary>
public long EventId { get; set; }
/// <summary>
/// 场地ID(可选)
/// </summary>
public long? VenueId { get; set; }
/// <summary>
/// 项目ID(可选)
/// </summary>
public long? EventProjectId { get; set; }
/// <summary>
/// 场次状态(可选):0-草稿,10-就绪,20-检录中,30-进行中,40-暂停,50-待确认,60-已结束,90-已取消
/// </summary>
public int? SessionStatus { get; set; }
/// <summary>
/// 关键词搜索(场次编号、场次名称)
/// </summary>
public string? Keyword { get; set; }
}
/// <summary>
/// 工作台场次信息
/// </summary>
public class WorkbenchSessionDto
{
/// <summary>
/// 赛事ID
/// </summary>
public long EventId { get; set; }
/// <summary>
/// 场地ID
/// </summary>
public long VenueId { get; set; }
/// <summary>
/// 赛事项目ID
/// </summary>
public long EventProjectId { get; set; }
/// <summary>
/// 项目组别ID(多组别混合场次时为空)
/// </summary>
public long? EventProjectGroupId { get; set; }
/// <summary>
/// 计分规则编码,用于前端按规则展示评分维度
/// </summary>
public string ScoreRuleCode { get; set; } = string.Empty;
/// <summary>
/// 场次ID
/// </summary>
public long SessionId { get; set; }
/// <summary>
/// 场次编号
/// </summary>
public string SessionNo { get; set; } = string.Empty;
/// <summary>
/// 场次名称
/// </summary>
public string? SessionName { get; set; }
/// <summary>
/// 赛事名称
/// </summary>
public string EventName { get; set; } = string.Empty;
/// <summary>
/// 项目名称
/// </summary>
public string ProjectName { get; set; } = string.Empty;
/// <summary>
/// 场地名称
/// </summary>
public string VenueName { get; set; } = string.Empty;
/// <summary>
/// 组别名称(多组别混合时为空)
/// </summary>
public string? GroupName { get; set; }
/// <summary>
/// 场次开始时间
/// </summary>
public DateTime? StartTime { get; set; }
/// <summary>
/// 场次结束时间
/// </summary>
public DateTime? EndTime { get; set; }
/// <summary>
/// 场次状态:0-草稿,10-就绪,20-检录中,30-进行中,40-暂停,50-待确认,60-已结束,90-已取消
/// </summary>
public int SessionStatus { get; set; }
/// <summary>
/// 场次状态名称
/// </summary>
public string SessionStatusName { get; set; } = string.Empty;
/// <summary>
/// 当前出场记录ID
/// </summary>
public long? CurrentEntryId { get; set; }
/// <summary>
/// 总出场数
/// </summary>
public int TotalEntries { get; set; }
/// <summary>
/// 已完成出场数
/// </summary>
public int CompletedEntries { get; set; }
/// <summary>
/// 已确认成绩数
/// </summary>
public int ConfirmedResults { get; set; }
}
/// <summary>
/// 工作台出场记录列表输入
/// </summary>
public class WorkbenchEntryQueryInput
{
/// <summary>仅获取指定出场记录(供详情按需加载)。</summary>
public long? SessionEntryId { get; set; }
/// <summary>
/// 场次ID
/// </summary>
public long SessionId { get; set; }
/// <summary>
/// 出场状态(可选)
/// </summary>
public int? EntryStatus { get; set; }
/// <summary>
/// 成绩状态(可选)
/// </summary>
public int? ResultStatus { get; set; }
/// <summary>
/// 关键词搜索(参赛者姓名、队名、出场编号)
/// </summary>
public string? Keyword { get; set; }
}
/// <summary>
/// 工作台出场记录详情
/// </summary>
public class WorkbenchEntryDetailDto
{
/// <summary>所属场次ID。</summary>
public long SessionId { get; set; }
/// <summary>
/// 出场记录ID
/// </summary>
public long SessionEntryId { get; set; }
/// <summary>
/// 出场编号
/// </summary>
public string EntryNo { get; set; } = string.Empty;
/// <summary>
/// 出场顺序
/// </summary>
public int PlayOrder { get; set; }
/// <summary>
/// 该运动员在秩序册预览中的实际场次号
/// </summary>
public int SessionOrder { get; set; }
/// <summary>
/// 秩序册预览/赛事编排中的全局出场顺序
/// </summary>
public long ScheduleOrder { get; set; }
/// <summary>
/// 参赛者姓名
/// </summary>
public string ParticipantName { get; set; } = string.Empty;
/// <summary>
/// 队伍名称(个人项目为空)
/// </summary>
public string? TeamName { get; set; }
/// <summary>
/// 参赛单位名称
/// </summary>
public string? UnitName { get; set; }
/// <summary>
/// 组别名称
/// </summary>
public string GroupName { get; set; } = string.Empty;
/// <summary>
/// 出场状态:0-待出场,10-已检录,20-已叫号,30-进行中,40-已完成,80-退赛,90-取消比赛资格
/// </summary>
public int EntryStatus { get; set; }
/// <summary>
/// 出场状态名称
/// </summary>
public string EntryStatusName { get; set; } = string.Empty;
/// <summary>
/// 是否为重赛
/// </summary>
public bool IsRematch { get; set; }
/// <summary>
/// 成绩信息
/// </summary>
public WorkbenchEntryResultDto? Result { get; set; }
/// <summary>
/// 裁判评分详情列表
/// </summary>
public List<WorkbenchJudgeScoreDto> JudgeScores { get; set; } = new();
}
/// <summary>
/// 工作台出场成绩信息
/// </summary>
public class WorkbenchEntryResultDto
{
/// <summary>已保存的花样得分系数 M;规定赛为空。</summary>
public decimal? DeductionFactor { get; set; }
/// <summary>用于复核的计算快照(包括失误平均和因子舍入过程)。</summary>
public string? CalculationJson { get; set; }
/// <summary>
/// 成绩ID
/// </summary>
public long ResultId { get; set; }
/// <summary>
/// 难度分
/// </summary>
public decimal DifficultyScore { get; set; }
/// <summary>
/// 表现分
/// </summary>
public decimal PerformanceScore { get; set; }
/// <summary>
/// 规定分
/// </summary>
public decimal RequiredScore { get; set; }
/// <summary>
/// 扣分
/// </summary>
public decimal DeductionScore { get; set; }
/// <summary>
/// 总分
/// </summary>
public decimal? TotalScore { get; set; }
/// <summary>
/// 成绩显示文本
/// </summary>
public string ScoreText { get; set; } = string.Empty;
/// <summary>
/// 是否取消比赛资格
/// </summary>
public bool IsDisqualified { get; set; }
/// <summary>
/// 取消比赛资格原因
/// </summary>
public string? DisqualifyReason { get; set; }
/// <summary>
/// 成绩状态:0-计算中,10-待复核,20-已确认,30-已投屏,40-已更正,90-已作废
/// </summary>
public int ResultStatus { get; set; }
/// <summary>
/// 成绩状态名称
/// </summary>
public string ResultStatusName { get; set; } = string.Empty;
/// <summary>
/// 当前成绩版本号
/// </summary>
public int ResultVersion { get; set; }
/// <summary>
/// 复核人(后台系统用户ID)
/// </summary>
public long? ReviewUserId { get; set; }
/// <summary>
/// 复核时间
/// </summary>
public DateTime? ReviewTime { get; set; }
/// <summary>
/// 排名
/// </summary>
public int? Rank { get; set; }
}
/// <summary>
/// 工作台裁判评分信息
/// </summary>
public class WorkbenchJudgeScoreDto
{
/// <summary>
/// 评分单ID
/// </summary>
public long ScoreSheetId { get; set; }
/// <summary>
/// 裁判席位编码
/// </summary>
public string JudgeRole { get; set; } = string.Empty;
/// <summary>
/// 裁判类型编码
/// </summary>
public string JudgeRoleType { get; set; } = string.Empty;
/// <summary>
/// 裁判类型名称
/// </summary>
public string JudgeRoleName { get; set; } = string.Empty;
/// <summary>
/// 裁判姓名
/// </summary>
public string JudgeName { get; set; } = string.Empty;
/// <summary>
/// 评分状态:0-草稿,10-已提交,20-已确认,30-已被修正,90-已作废
/// </summary>
public int SheetStatus { get; set; }
/// <summary>
/// 评分状态名称
/// </summary>
public string SheetStatusName { get; set; } = string.Empty;
/// <summary>
/// 难度分
/// </summary>
public decimal DifficultyScore { get; set; }
/// <summary>
/// 表现分
/// </summary>
public decimal PerformanceScore { get; set; }
/// <summary>
/// 规定分
/// </summary>
public decimal RequiredScore { get; set; }
/// <summary>
/// 扣分
/// </summary>
public decimal DeductionScore { get; set; }
/// <summary>
/// 合计得分
/// </summary>
public decimal TotalScore { get; set; }
/// <summary>
/// 是否判定取消比赛资格
/// </summary>
public bool IsDisqualified { get; set; }
/// <summary>
/// 提交时间
/// </summary>
public DateTime? SubmittedTime { get; set; }
/// <summary>
/// 是否存在待处理的修正申请
/// </summary>
public bool HasPendingCorrection { get; set; }
/// <summary>
/// 修正任务已批准或裁判修改中,原评分仅供追溯,本次提交仍待裁判重新完成。
/// </summary>
public bool RequiresResubmission { get; set; }
/// <summary>
/// 当前评分单提交的记录画板 PNG 地址
/// </summary>
public string? AnnotationUrl { get; set; }
/// <summary>
/// 评分单的动态评分项明细快照
/// </summary>
public List<WorkbenchScoreItemDto> ScoreItems { get; set; } = new();
}
/// <summary>
/// 成绩修正可选裁判:一个裁判类型下本场次已分配的裁判。
/// 裁判类型取自该场次项目的计分规则,裁判人数取自【裁判报名与分配】的分配结果。
/// </summary>
public class CorrectionJudgeOptionDto
{
/// <summary>
/// 裁判类型编码(如 CJ、CQ、T)
/// </summary>
public string JudgeRoleType { get; set; } = string.Empty;
/// <summary>
/// 裁判类型名称(如 创意编排、完成质量、主裁)
/// </summary>
public string JudgeRoleName { get; set; } = string.Empty;
/// <summary>
/// 该类型下已分配的裁判席位
/// </summary>
public List<CorrectionJudgeItemDto> Judges { get; set; } = new();
}
/// <summary>
/// 成绩修正可选裁判席位
/// </summary>
public class CorrectionJudgeItemDto
{
/// <summary>
/// 裁判分配ID
/// </summary>
public long JudgeAssignmentId { get; set; }
/// <summary>
/// 裁判席位编码(如 CQ1、T)
/// </summary>
public string JudgeRole { get; set; } = string.Empty;
/// <summary>
/// 裁判档案ID
/// </summary>
public long RefereeId { get; set; }
/// <summary>
/// 裁判姓名
/// </summary>
public string JudgeName { get; set; } = string.Empty;
/// <summary>
/// 席位展示名称,如“完成质量1(崔一)”
/// </summary>
public string DisplayName { get; set; } = string.Empty;
/// <summary>
/// 该裁判对当前出场的评分单ID,未提交评分时为空
/// </summary>
public long? ScoreSheetId { get; set; }
/// <summary>
/// 评分单状态:0-草稿,10-已提交,20-已确认,30-已被修正,90-已作废
/// </summary>
public int? SheetStatus { get; set; }
/// <summary>
/// 评分单状态名称
/// </summary>
public string? SheetStatusName { get; set; }
/// <summary>
/// 该裁判的评分合计
/// </summary>
public decimal? TotalScore { get; set; }
/// <summary>
/// 是否可发起修正
/// </summary>
public bool CanCorrect { get; set; }
/// <summary>
/// 不可发起修正的原因,可修正时为空
/// </summary>
public string? DisabledReason { get; set; }
}
/// <summary>
/// 发起成绩修正输入(可一次勾选多名裁判)
/// </summary>
public class WorkbenchCorrectionInitiateInput
{
/// <summary>
/// 出场记录ID
/// </summary>
public long SessionEntryId { get; set; }
/// <summary>
/// 需要修正的评分单ID列表
/// </summary>
[Required(ErrorMessage = "请选择需要修正的裁判")]
[MinLength(1, ErrorMessage = "请至少选择一名裁判")]
public List<long> ScoreSheetIds { get; set; } = new();
/// <summary>
/// 修正原因
/// </summary>
[Required(ErrorMessage = "修正原因不能为空")]
[StringLength(200, MinimumLength = 2, ErrorMessage = "修正原因长度必须为2-200个字符")]
public string Reason { get; set; } = string.Empty;
}
/// <summary>
/// 工作台评分项详情
/// </summary>
public class WorkbenchScoreItemDto
{
/// <summary>
/// 评分项编码
/// </summary>
public string ItemCode { get; set; } = string.Empty;
/// <summary>
/// 评分项名称
/// </summary>
public string ItemName { get; set; } = string.Empty;
/// <summary>
/// 所属科目编码(可选)
/// </summary>
public string? SubjectCode { get; set; }
/// <summary>
/// 评分项类型
/// </summary>
public int ItemType { get; set; }
/// <summary>
/// 计分维度
/// </summary>
public int ScoreDimension { get; set; }
/// <summary>
/// 计数值(计数类评分项,如次数、人数)
/// </summary>
public decimal? CountValue { get; set; }
/// <summary>
/// 裁判录入值
/// </summary>
public decimal? InputValue { get; set; }
/// <summary>
/// 小计得分
/// </summary>
public decimal Subtotal { get; set; }
/// <summary>
/// 是否由服务端联动生成
/// </summary>
public bool IsAutoGenerated { get; set; }
/// <summary>
/// 联动来源评分项编码
/// </summary>
public string? ParentItemCode { get; set; }
/// <summary>
/// 排序号
/// </summary>
public int Sort { get; set; }
}
/// <summary>
/// 成绩投屏输入
/// </summary>
public class ResultScreenCastInput
{
/// <summary>
/// 赛事ID
/// </summary>
public long EventId { get; set; }
/// <summary>
/// 投屏类型:1-单个成绩,2-排名列表
/// </summary>
public int CastType { get; set; }
/// <summary>
/// 场地ID(可选,用于筛选投屏范围)
/// </summary>
public long? VenueId { get; set; }
/// <summary>
/// 项目ID(投屏排名时必填)
/// </summary>
public long? EventProjectId { get; set; }
/// <summary>
/// 组别ID(投屏排名时必填)
/// </summary>
public long? EventProjectGroupId { get; set; }
/// <summary>
/// 场次ID(投屏单个成绩时必填)
/// </summary>
public long? SessionId { get; set; }
/// <summary>
/// 出场记录ID(投屏单个成绩时必填)
/// </summary>
public long? SessionEntryId { get; set; }
/// <summary>
/// 成绩ID(投屏单个成绩时必填)
/// </summary>
public long? EventResultId { get; set; }
/// <summary>
/// 成绩版本号(可选,默认使用当前版本)
/// </summary>
public int? ResultVersion { get; set; }
}
/// <summary>
/// 成绩投屏输出
/// </summary>
public class ResultScreenCastOutput
{
/// <summary>
/// 投屏记录ID
/// </summary>
public long ScreenCastId { get; set; }
/// <summary>
/// 投屏类型:1-成绩,2-排名
/// </summary>
public int CastType { get; set; }
/// <summary>
/// 投屏时间
/// </summary>
public DateTime CastTime { get; set; }
/// <summary>
/// 投屏内容快照
/// </summary>
public string PayloadJson { get; set; } = string.Empty;
}
/// <summary>
/// 撤回投屏输入
/// </summary>
public class WithdrawScreenCastInput
{
/// <summary>
/// 投屏记录ID
/// </summary>
public long ScreenCastId { get; set; }
}
/// <summary>
/// 获取当前投屏内容输入
/// </summary>
public class GetCurrentScreenCastInput
{
/// <summary>
/// 赛事ID
/// </summary>
public long EventId { get; set; }
/// <summary>
/// 场地ID(可选)
/// </summary>
public long? VenueId { get; set; }
}
/// <summary>
/// 当前投屏内容输出
/// </summary>
public class CurrentScreenCastDto
{
/// <summary>
/// 投屏记录ID
/// </summary>
public long ScreenCastId { get; set; }
/// <summary>
/// 投屏类型:1-成绩,2-排名
/// </summary>
public int CastType { get; set; }
/// <summary>
/// 投屏状态:0-已投出,10-已撤回,20-已被新投屏替换
/// </summary>
public int CastStatus { get; set; }
/// <summary>
/// 投屏时间
/// </summary>
public DateTime CastTime { get; set; }
/// <summary>
/// 赛事名称(大屏标题)
/// </summary>
public string EventName { get; set; } = string.Empty;
/// <summary>
/// 项目名称
/// </summary>
public string ProjectName { get; set; } = string.Empty;
/// <summary>
/// 计分规则编码
/// </summary>
public string ScoreRuleCode { get; set; } = string.Empty;
/// <summary>
/// 组别名称
/// </summary>
public string GroupName { get; set; } = string.Empty;
/// <summary>
/// 场地名称
/// </summary>
public string VenueName { get; set; } = string.Empty;
/// <summary>
/// 场次编号
/// </summary>
public string SessionNo { get; set; } = string.Empty;
/// <summary>
/// 投屏内容(JSON格式)
/// </summary>
public string PayloadJson { get; set; } = string.Empty;
}
/// <summary>
/// 成绩修正申请审批输入
/// </summary>
public class ApproveScoreCorrectionInput
{
/// <summary>
/// 修正申请ID
/// </summary>
public long CorrectionId { get; set; }
/// <summary>
/// 审批结果:true-批准,false-拒绝
/// </summary>
public bool IsApproved { get; set; }
/// <summary>
/// 审批意见
/// </summary>
public string? ApproveRemark { get; set; }
}
/// <summary>
/// 成绩修正申请列表查询输入
/// </summary>
public class ScoreCorrectionQueryInput
{
/// <summary>
/// 赛事ID
/// </summary>
public long EventId { get; set; }
/// <summary>
/// 修正状态(可选):0-已申请,10-已批准,20-已拒绝,30-裁判修改中,40-已完成,90-已取消
/// </summary>
public int? CorrectionStatus { get; set; }
/// <summary>
/// 关键词搜索
/// </summary>
public string? Keyword { get; set; }
}
/// <summary>
/// 成绩修正申请列表项
/// </summary>
public class ScoreCorrectionListDto
{
/// <summary>
/// 修正申请ID
/// </summary>
public long CorrectionId { get; set; }
/// <summary>
/// 赛事名称
/// </summary>
public string EventName { get; set; } = string.Empty;
/// <summary>
/// 场次编号
/// </summary>
public string SessionNo { get; set; } = string.Empty;
/// <summary>
/// 出场编号
/// </summary>
public string EntryNo { get; set; } = string.Empty;
/// <summary>
/// 参赛者姓名
/// </summary>
public string ParticipantName { get; set; } = string.Empty;
/// <summary>
/// 裁判席位
/// </summary>
public string JudgeRole { get; set; } = string.Empty;
/// <summary>
/// 申请人姓名
/// </summary>
public string ApplyUserName { get; set; } = string.Empty;
/// <summary>
/// 申请修正原因
/// </summary>
public string ApplyReason { get; set; } = string.Empty;
/// <summary>
/// 申请时间
/// </summary>
public DateTime CreatedTime { get; set; }
/// <summary>
/// 修正状态:0-已申请,10-已批准,20-已拒绝,30-裁判修改中,40-已完成,90-已取消
/// </summary>
public int CorrectionStatus { get; set; }
/// <summary>
/// 修正状态名称
/// </summary>
public string CorrectionStatusName { get; set; } = string.Empty;
/// <summary>
/// 审批人姓名
/// </summary>
public string? ApproveUserName { get; set; }
/// <summary>
/// 审批时间
/// </summary>
public DateTime? ApproveTime { get; set; }
/// <summary>
/// 完成时间
/// </summary>
public DateTime? CompletedTime { get; set; }
}
/// <summary>
/// 成绩修正申请详情
/// </summary>
public class ScoreCorrectionDetailDto
{
/// <summary>
/// 修正申请ID
/// </summary>
public long CorrectionId { get; set; }
/// <summary>
/// 赛事信息
/// </summary>
public WorkbenchSessionDto Session { get; set; } = new();
/// <summary>
/// 出场信息
/// </summary>
public WorkbenchEntryDetailDto Entry { get; set; } = new();
/// <summary>
/// 原评分单信息
/// </summary>
public WorkbenchJudgeScoreDto OriginalScore { get; set; } = new();
/// <summary>
/// 新评分单信息(修正完成后有值)
/// </summary>
public WorkbenchJudgeScoreDto? NewScore { get; set; }
/// <summary>
/// 申请人信息
/// </summary>
public string ApplyUserName { get; set; } = string.Empty;
/// <summary>
/// 申请修正原因
/// </summary>
public string ApplyReason { get; set; } = string.Empty;
/// <summary>
/// 申请时间
/// </summary>
public DateTime CreatedTime { get; set; }
/// <summary>
/// 修正状态:0-已申请,10-已批准,20-已拒绝,30-裁判修改中,40-已完成,90-已取消
/// </summary>
public int CorrectionStatus { get; set; }
/// <summary>
/// 审批人姓名
/// </summary>
public string? ApproveUserName { get; set; }
/// <summary>
/// 审批意见
/// </summary>
public string? ApproveRemark { get; set; }
/// <summary>
/// 审批时间
/// </summary>
public DateTime? ApproveTime { get; set; }
/// <summary>
/// 完成时间
/// </summary>
public DateTime? CompletedTime { get; set; }
}
/// <summary>
/// 重赛输入
/// </summary>
public class CreateRematchInput
{
/// <summary>
/// 原出场记录ID
/// </summary>
public long OriginalSessionEntryId { get; set; }
/// <summary>
/// 重赛原因
/// </summary>
[Required(ErrorMessage = "重赛原因不能为空")]
[StringLength(200, MinimumLength = 2, ErrorMessage = "重赛原因长度必须为2-200个字符")]
public string RematchReason { get; set; } = string.Empty;
}
/// <summary>
/// 重赛输出
/// </summary>
public class CreateRematchOutput
{
/// <summary>
/// 新出场记录ID
/// </summary>
public long NewSessionEntryId { get; set; }
/// <summary>
/// 新出场编号
/// </summary>
public string NewEntryNo { get; set; } = string.Empty;
/// <summary>
/// 新出场顺序
/// </summary>
public int NewPlayOrder { get; set; }
}
/// <summary>
/// 成绩作废输入
/// </summary>
public class VoidResultInput
{
/// <summary>
/// 出场记录ID
/// </summary>
public long SessionEntryId { get; set; }
/// <summary>
/// 作废原因
/// </summary>
[Required(ErrorMessage = "作废原因不能为空")]
[StringLength(200, MinimumLength = 2, ErrorMessage = "作废原因长度必须为2-200个字符")]
public string VoidReason { get; set; } = string.Empty;
}
/// <summary>
/// 成绩确认输入
/// </summary>
public class ConfirmResultInput
{
/// <summary>
/// 成绩ID
/// </summary>
public long ResultId { get; set; }
}
/// <summary>
/// 批量成绩确认输入
/// </summary>
public class BatchConfirmResultInput
{
/// <summary>
/// 场次ID
/// </summary>
public long SessionId { get; set; }
/// <summary>
/// 成绩ID列表(必须明确提交选中的成绩)
/// </summary>
[Required(ErrorMessage = "请选择需要确认的成绩")]
[MinLength(1, ErrorMessage = "请选择至少一条待确认成绩")]
public List<long> ResultIds { get; set; } = new();
}