diff --git a/YD_Event.Application/Common/Excel/NpoiExcelReader.cs b/YD_Event.Application/Common/Excel/NpoiExcelReader.cs index 08f3eb5..8dbb3ff 100644 --- a/YD_Event.Application/Common/Excel/NpoiExcelReader.cs +++ b/YD_Event.Application/Common/Excel/NpoiExcelReader.cs @@ -89,14 +89,15 @@ public static class NpoiExcelReader } var result = new List(); - for (var rowIndex = headerRow.RowNum + 1; rowIndex <= sheet.LastRowNum; rowIndex++) + // LastRowNum 会被整表格式残留推到 1048576;只遍历实际存在的行对象。 + var rowEnumerator = sheet.GetRowEnumerator(); + while (rowEnumerator.MoveNext()) { - var row = sheet.GetRow(rowIndex); - if (row == null) continue; + if (rowEnumerator.Current is not IRow row || row.RowNum <= headerRow.RowNum) continue; var item = new T(); if (item is IExcelRowLocation rowLocation) - rowLocation.ExcelRowNumber = rowIndex + 1; + rowLocation.ExcelRowNumber = row.RowNum + 1; var hasValue = false; foreach (var (columnIndex, property) in columnProperties) { diff --git a/YD_Event.Application/OrderBook/OrderBookService.cs b/YD_Event.Application/OrderBook/OrderBookService.cs index 6b9aba9..e077f39 100644 --- a/YD_Event.Application/OrderBook/OrderBookService.cs +++ b/YD_Event.Application/OrderBook/OrderBookService.cs @@ -506,7 +506,7 @@ public class OrderBookService : IDynamicApiController, ITransient return result; } - // 按 项目×组别×场地 生成场次,返回组合键 -> 场次 的映射 + // 按 项目×组别×场次名称×场地 生成场次,返回组合键 -> 场次 的映射 private async Task> EnsureSessionsAsync( OrderBookDraft draft, long eventId, Dictionary projectContext, @@ -518,7 +518,22 @@ public class OrderBookService : IDynamicApiController, ITransient .Distinct() .ToList(); + var existSessions = await _sessionRepository.AsQueryable() + .Where(s => !s.DeleteMark && s.EventId == eventId) + .ToListAsync(); + var venueNamesById = venueContext.ToDictionary(x => x.Value.Venue.Id, x => x.Key); + var existSessionsByKey = existSessions + .Where(s => venueNamesById.ContainsKey(s.VenueId)) + .GroupBy(s => new OrderBookSessionKey( + s.EventProjectId, + s.EventProjectGroupId ?? 0, + s.SessionName ?? string.Empty, + venueNamesById[s.VenueId])) + .ToDictionary(x => x.Key, x => x.First()); + var result = new Dictionary(); + var newSessions = new List(); + var usedSessionNos = existSessions.Select(s => s.SessionNo).ToHashSet(StringComparer.Ordinal); var sessionSort = 0; foreach (var combo in combos) { @@ -526,12 +541,7 @@ public class OrderBookService : IDynamicApiController, ITransient var vc = venueContext[combo.VenueName]; var groupId = combo.EventProjectGroupId; - var exist = await _sessionRepository.GetFirstAsync(s => - !s.DeleteMark && s.EventId == eventId && - s.EventProjectId == pc.EventProjectId && s.VenueId == vc.Venue.Id && - s.SessionName == combo.SessionName && - s.EventProjectGroupId == groupId); - if (exist != null) + if (existSessionsByKey.TryGetValue(combo, out var exist)) { if (exist.ScoreRuleId != pc.ScoreRuleId) throw Oops.Bah($"场次【{combo.SessionName}】的规则与导入项目不一致,请先核查历史编排"); @@ -539,7 +549,13 @@ public class OrderBookService : IDynamicApiController, ITransient continue; } - sessionSort++; + string sessionNo; + do + { + sessionSort++; + sessionNo = $"EP{pc.EventProjectId}-V{vc.Index:00}-{sessionSort:000}"; + } while (!usedSessionNos.Add(sessionNo)); + var session = new EventSession { Id = _idGenerator.NextId(), @@ -548,7 +564,7 @@ public class OrderBookService : IDynamicApiController, ITransient EventProjectGroupId = groupId, VenueId = vc.Venue.Id, ScoreRuleId = pc.ScoreRuleId, - SessionNo = $"EP{pc.EventProjectId}-V{vc.Index:00}-{sessionSort:000}", + SessionNo = sessionNo, SessionName = combo.SessionName, SessionStatus = 0, Version = 1, @@ -556,9 +572,12 @@ public class OrderBookService : IDynamicApiController, ITransient CreatedUserId = userId, CreatedTime = now }; - await _sessionRepository.InsertAsync(session); + newSessions.Add(session); result[combo] = session; } + + if (newSessions.Any()) + await _sessionRepository.InsertRangeAsync(newSessions); return result; }