using YD_Event.Application.Client.Dtos; namespace YD_Event.Application.Client; public partial class EventClientController { /// /// 获取已有成绩的赛事。 /// [HttpGet("scores/events")] [AllowAnonymous] [DisplayName("获取成绩赛事")] public async Task> GetScoreEvents( [FromServices] ISqlSugarRepository resultRepository, [FromServices] ISqlSugarRepository eventRepository) { var eventIds = await resultRepository.AsQueryable() .Where(x => x.Status == AvailabilityStatus.Enable) .Select(x => x.EventId) .Distinct() .ToListAsync(); if (eventIds.Count == 0) return new List(); var events = await eventRepository.AsQueryable() .Where(x => eventIds.Contains(x.Id) && x.Status == AvailabilityStatus.Enable) .OrderByDescending(x => x.MatchStartTime) .ToListAsync(); return events.Select(x => new ScoreEventDto { Id = x.Id, Name = x.EventName }).ToList(); } /// /// 按赛事、姓名或报名人员ID查询成绩。 /// [HttpGet("scores/query")] [AllowAnonymous] [DisplayName("查询赛事成绩")] public async Task QueryScores( [FromQuery] ScoreQueryInput input, [FromServices] ISqlSugarRepository resultRepository, [FromServices] ISqlSugarRepository eventRepository, [FromServices] ISqlSugarRepository projectRepository) { var query = resultRepository.AsQueryable() .Where(x => x.Status == AvailabilityStatus.Enable) .WhereIF(input.EventId.HasValue, x => x.EventId == input.EventId.Value); if (!string.IsNullOrWhiteSpace(input.Keyword)) { var keyword = input.Keyword.Trim(); if (long.TryParse(keyword, out var personId)) { query = query.Where(x => x.ParticipantName.Contains(keyword) || x.RegistrationPersonId == personId); } else { query = query.Where(x => x.ParticipantName.Contains(keyword) || x.GroupName.Contains(keyword)); } } var results = await query.OrderBy(x => x.Rank).OrderByDescending(x => x.CreatedTime).ToListAsync(); if (results.Count == 0) return new ScoreQueryOutput(); var eventIds = results.Select(x => x.EventId).Distinct().ToList(); var projectIds = results.Select(x => x.ProjectId).Distinct().ToList(); var events = await eventRepository.AsQueryable().Where(x => eventIds.Contains(x.Id)).ToListAsync(); var projects = await projectRepository.AsQueryable().Where(x => projectIds.Contains(x.Id)).ToListAsync(); var eventMap = events.ToDictionary(x => x.Id, x => x.EventName); var projectMap = projects.ToDictionary(x => x.Id, x => x.Name); var rows = results.Select(x => new ClientScoreDto { Id = x.Id, EventId = x.EventId, EventName = eventMap.GetValueOrDefault(x.EventId, string.Empty), AthleteName = x.ParticipantName, AthleteNo = FormatBibNo(x.RegistrationPersonId), Category = projectMap.GetValueOrDefault(x.ProjectId, x.ProjectTypeName ?? string.Empty), GroupName = x.GroupName, Rank = x.Rank, TotalScore = x.Score, Status = "成绩有效", JudgeScores = new List { new() { Label = "最终成绩", Score = x.Score } } }).ToList(); return new ScoreQueryOutput { Rows = rows, Total = rows.Count }; } private static string FormatBibNo(long personId) { var value = personId.ToString(); return value.Length > 6 ? value[^6..] : value.PadLeft(6, '0'); } }