From a745c8b6627b5d9b3a261fac8f61c45d8c27d99b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A9=AC=E6=A2=93=E5=BD=AD?= Date: Fri, 16 Oct 2026 13:59:00 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B9=B3=E6=9D=BF=E5=9C=BA=E6=AC=A1=E6=8E=92?= =?UTF-8?q?=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Judge/Dtos/JudgeScoringDtos.cs | 5 ++ .../Judge/JudgeScoringController.cs | 59 +++++++++++++++++-- 2 files changed, 60 insertions(+), 4 deletions(-) diff --git a/YD_Event.Application/Judge/Dtos/JudgeScoringDtos.cs b/YD_Event.Application/Judge/Dtos/JudgeScoringDtos.cs index e801551..82e2531 100644 --- a/YD_Event.Application/Judge/Dtos/JudgeScoringDtos.cs +++ b/YD_Event.Application/Judge/Dtos/JudgeScoringDtos.cs @@ -162,6 +162,11 @@ public class JudgeEntryDto /// public int PlayOrder { get; set; } + /// + /// 平板端展示的业务场次号;重赛沿用来源出场记录的场次号 + /// + public int SessionOrder { get; set; } + /// /// 秩序册中的全局出场顺序;非秩序册数据为0 /// diff --git a/YD_Event.Application/Judge/JudgeScoringController.cs b/YD_Event.Application/Judge/JudgeScoringController.cs index 1c960e0..1c9f3da 100644 --- a/YD_Event.Application/Judge/JudgeScoringController.cs +++ b/YD_Event.Application/Judge/JudgeScoringController.cs @@ -300,6 +300,33 @@ public class JudgeScoringController : IDynamicApiController var venueOrder = venue?.Sort > 0 ? venue.Sort : 1; var sessionArrangementOrder = GetArrangementSequence(session.SessionNo); + var sessionEntryOrderMap = new Dictionary(); + 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 { 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 sheets = await _sheetRepository.AsQueryable() .Where(x => entryIds.Contains(x.SessionEntryId) && x.JudgeAssignmentId == assignment.Id).ToListAsync(); @@ -320,6 +347,9 @@ public class JudgeScoringController : IDynamicApiController SessionEntryId = entry.Id, EntryNo = entry.EntryNo, PlayOrder = entry.PlayOrder, + SessionOrder = entry.SourceType == 1 + ? GetImportedSessionOrder(session.SessionName, sessionArrangementOrder) + : BuildEntrySessionOrder(sessionArrangementOrder, GetDisplayPlayOrder(entry)), ScheduleOrder = entry.SourceType == 1 ? entry.Id : BuildArrangementScheduleOrder( @@ -1426,16 +1456,37 @@ public class JudgeScoringController : IDynamicApiController int venueOrder, int playOrder) { - var safePlayOrder = Math.Max(playOrder, 1); - var taskSessionOrder = sessionArrangementOrder > 0 && sessionArrangementOrder < int.MaxValue - ? sessionArrangementOrder + safePlayOrder - 1 - : safePlayOrder; + var taskSessionOrder = BuildEntrySessionOrder(sessionArrangementOrder, playOrder); return (long)Math.Max(projectOrder, 1) * 1_000_000_000_000L + (long)taskSessionOrder * 1_000_000L + Math.Max(venueOrder, 1); } + /// + /// 获取自动编排出场记录的实际场次号。 + /// + private static int BuildEntrySessionOrder(int sessionArrangementOrder, int playOrder) + { + var safePlayOrder = Math.Max(playOrder, 1); + return sessionArrangementOrder > 0 && sessionArrangementOrder < int.MaxValue + ? sessionArrangementOrder + safePlayOrder - 1 + : safePlayOrder; + } + + /// + /// 秩序册导入以场次名称作为业务场次号,无法解析时回退到编排序号。 + /// + private static int GetImportedSessionOrder(string? sessionName, int fallback) + { + if (string.IsNullOrWhiteSpace(sessionName)) return fallback; + var match = Regex.Match(sessionName, @"^\s*(?:第\s*)?(?\d+)(?:\s*场)?\s*$", + RegexOptions.CultureInvariant); + return match.Success && int.TryParse(match.Groups["sequence"].Value, out var sequence) && sequence > 0 + ? sequence + : fallback; + } + /// /// 构建裁判端展示用的“场次-场地”,去除秩序册导入时写入场次名的项目和组别信息。 ///