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;
+ }
+
///
/// 构建裁判端展示用的“场次-场地”,去除秩序册导入时写入场次名的项目和组别信息。
///