平板场次排序

This commit is contained in:
马梓彭 2026-10-16 13:59:00 +08:00
parent 2b7bf7bdd0
commit a745c8b662
2 changed files with 60 additions and 4 deletions

View File

@ -162,6 +162,11 @@ public class JudgeEntryDto
/// </summary> /// </summary>
public int PlayOrder { get; set; } public int PlayOrder { get; set; }
/// <summary>
/// 平板端展示的业务场次号;重赛沿用来源出场记录的场次号
/// </summary>
public int SessionOrder { get; set; }
/// <summary> /// <summary>
/// 秩序册中的全局出场顺序;非秩序册数据为0 /// 秩序册中的全局出场顺序;非秩序册数据为0
/// </summary> /// </summary>

View File

@ -300,6 +300,33 @@ public class JudgeScoringController : IDynamicApiController
var venueOrder = venue?.Sort > 0 ? venue.Sort : 1; var venueOrder = venue?.Sort > 0 ? venue.Sort : 1;
var sessionArrangementOrder = GetArrangementSequence(session.SessionNo); var sessionArrangementOrder = GetArrangementSequence(session.SessionNo);
var sessionEntryOrderMap = new Dictionary<long, (int PlayOrder, long? RematchFromEntryId)>();
if (entries.Any(x => x.IsRematch))
{
sessionEntryOrderMap = (await _entryRepository.AsQueryable()
.Where(x => x.SessionId == sessionId && !x.DeleteMark)
.Select(x => new { x.Id, x.PlayOrder, x.RematchFromEntryId })
.ToListAsync())
.ToDictionary(x => x.Id, x => (x.PlayOrder, x.RematchFromEntryId));
}
int GetDisplayPlayOrder(EventSessionEntry entry)
{
var displayPlayOrder = entry.PlayOrder;
var sourceEntryId = entry.RematchFromEntryId;
var visitedEntryIds = new HashSet<long> { entry.Id };
while (sourceEntryId.HasValue &&
visitedEntryIds.Add(sourceEntryId.Value) &&
sessionEntryOrderMap.TryGetValue(sourceEntryId.Value, out var sourceEntry))
{
displayPlayOrder = sourceEntry.PlayOrder;
sourceEntryId = sourceEntry.RematchFromEntryId;
}
return displayPlayOrder;
}
var entryIds = entries.Select(x => x.Id).ToList(); var entryIds = entries.Select(x => x.Id).ToList();
var sheets = await _sheetRepository.AsQueryable() var sheets = await _sheetRepository.AsQueryable()
.Where(x => entryIds.Contains(x.SessionEntryId) && x.JudgeAssignmentId == assignment.Id).ToListAsync(); .Where(x => entryIds.Contains(x.SessionEntryId) && x.JudgeAssignmentId == assignment.Id).ToListAsync();
@ -320,6 +347,9 @@ public class JudgeScoringController : IDynamicApiController
SessionEntryId = entry.Id, SessionEntryId = entry.Id,
EntryNo = entry.EntryNo, EntryNo = entry.EntryNo,
PlayOrder = entry.PlayOrder, PlayOrder = entry.PlayOrder,
SessionOrder = entry.SourceType == 1
? GetImportedSessionOrder(session.SessionName, sessionArrangementOrder)
: BuildEntrySessionOrder(sessionArrangementOrder, GetDisplayPlayOrder(entry)),
ScheduleOrder = entry.SourceType == 1 ScheduleOrder = entry.SourceType == 1
? entry.Id ? entry.Id
: BuildArrangementScheduleOrder( : BuildArrangementScheduleOrder(
@ -1426,16 +1456,37 @@ public class JudgeScoringController : IDynamicApiController
int venueOrder, int venueOrder,
int playOrder) int playOrder)
{ {
var safePlayOrder = Math.Max(playOrder, 1); var taskSessionOrder = BuildEntrySessionOrder(sessionArrangementOrder, playOrder);
var taskSessionOrder = sessionArrangementOrder > 0 && sessionArrangementOrder < int.MaxValue
? sessionArrangementOrder + safePlayOrder - 1
: safePlayOrder;
return (long)Math.Max(projectOrder, 1) * 1_000_000_000_000L return (long)Math.Max(projectOrder, 1) * 1_000_000_000_000L
+ (long)taskSessionOrder * 1_000_000L + (long)taskSessionOrder * 1_000_000L
+ Math.Max(venueOrder, 1); + Math.Max(venueOrder, 1);
} }
/// <summary>
/// 获取自动编排出场记录的实际场次号。
/// </summary>
private static int BuildEntrySessionOrder(int sessionArrangementOrder, int playOrder)
{
var safePlayOrder = Math.Max(playOrder, 1);
return sessionArrangementOrder > 0 && sessionArrangementOrder < int.MaxValue
? sessionArrangementOrder + safePlayOrder - 1
: safePlayOrder;
}
/// <summary>
/// 秩序册导入以场次名称作为业务场次号,无法解析时回退到编排序号。
/// </summary>
private static int GetImportedSessionOrder(string? sessionName, int fallback)
{
if (string.IsNullOrWhiteSpace(sessionName)) return fallback;
var match = Regex.Match(sessionName, @"^\s*(?:第\s*)?(?<sequence>\d+)(?:\s*场)?\s*$",
RegexOptions.CultureInvariant);
return match.Success && int.TryParse(match.Groups["sequence"].Value, out var sequence) && sequence > 0
? sequence
: fallback;
}
/// <summary> /// <summary>
/// 构建裁判端展示用的“场次-场地”,去除秩序册导入时写入场次名的项目和组别信息。 /// 构建裁判端展示用的“场次-场地”,去除秩序册导入时写入场次名的项目和组别信息。
/// </summary> /// </summary>