平板场次排序
This commit is contained in:
parent
2b7bf7bdd0
commit
a745c8b662
@ -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>
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user