diff --git a/YD_Event.Application/Judge/JudgeScoringController.cs b/YD_Event.Application/Judge/JudgeScoringController.cs index 2a2b980..6fa4721 100644 --- a/YD_Event.Application/Judge/JudgeScoringController.cs +++ b/YD_Event.Application/Judge/JudgeScoringController.cs @@ -280,6 +280,26 @@ public class JudgeScoringController : IDynamicApiController .ToListAsync()) .OrderBy(x => x.PlayOrder).ThenBy(x => x.Id).ToList(); if (entries.Count == 0) return new List(); + + var eventProjects = await _eventProjectRepository.AsQueryable() + .Where(x => x.EventId == session.EventId && !x.DeleteMark) + .ToListAsync(); + var projectIds = eventProjects.Select(x => x.ProjectId).Distinct().ToList(); + var orderedProjectIds = (await _projectRepository.AsQueryable() + .Where(x => projectIds.Contains(x.Id) && !x.DeleteMark) + .ToListAsync()) + .OrderBy(x => x.SortIndex) + .ThenBy(x => x.Id) + .Select(x => x.Id) + .ToList(); + var currentProjectId = eventProjects + .FirstOrDefault(x => x.Id == session.EventProjectId)?.ProjectId ?? 0; + var projectOrderIndex = orderedProjectIds.IndexOf(currentProjectId); + var projectOrder = projectOrderIndex >= 0 ? projectOrderIndex + 1 : orderedProjectIds.Count + 1; + var venue = await _venueRepository.GetFirstAsync(x => x.Id == session.VenueId && !x.DeleteMark); + var venueOrder = venue?.Sort > 0 ? venue.Sort : 1; + var sessionArrangementOrder = GetArrangementSequence(session.SessionNo); + var entryIds = entries.Select(x => x.Id).ToList(); var sheets = await _sheetRepository.AsQueryable() .Where(x => entryIds.Contains(x.SessionEntryId) && x.JudgeAssignmentId == assignment.Id).ToListAsync(); @@ -300,7 +320,13 @@ public class JudgeScoringController : IDynamicApiController SessionEntryId = entry.Id, EntryNo = entry.EntryNo, PlayOrder = entry.PlayOrder, - ScheduleOrder = entry.SourceType == 1 ? entry.Id : 0, + ScheduleOrder = entry.SourceType == 1 + ? entry.Id + : BuildArrangementScheduleOrder( + projectOrder, + sessionArrangementOrder, + venueOrder, + entry.PlayOrder), ParticipantName = DisplayParticipantName(entry, ctx.Scope), GroupName = entry.GroupName, EntryStatus = entry.EntryStatus, @@ -1356,6 +1382,26 @@ public class JudgeScoringController : IDynamicApiController : 0; } + /// + /// 将自动编排任务还原为“项目、场次、场地”的全局顺序。 + /// 同组同场地的多条记录在数据库中属于同一场次,因此需结合出场顺序恢复原始场次号。 + /// + private static long BuildArrangementScheduleOrder( + int projectOrder, + int sessionArrangementOrder, + int venueOrder, + int playOrder) + { + var safePlayOrder = Math.Max(playOrder, 1); + var taskSessionOrder = sessionArrangementOrder > 0 && sessionArrangementOrder < int.MaxValue + ? sessionArrangementOrder + safePlayOrder - 1 + : safePlayOrder; + + return (long)Math.Max(projectOrder, 1) * 1_000_000_000_000L + + (long)taskSessionOrder * 1_000_000L + + Math.Max(venueOrder, 1); + } + /// /// 构建裁判端展示用的“场次-场地”,去除秩序册导入时写入场次名的项目和组别信息。 ///