update:智慧操场api

This commit is contained in:
ltx 2026-07-10 09:12:11 +08:00
parent 9b6d2d747b
commit d643daa3b9
5 changed files with 258 additions and 0 deletions

View File

@ -41,6 +41,13 @@ namespace VOL.Business.IServices.SportsHall
/// <returns></returns>
Task<PageDataDto<SportsHallStudentsTestModel>> GetSportsHallStudentsTestPageList(SportsHallStudentsTestParam paramDto);
/// <summary>
/// 体测成绩管理分页列表(全部体测项目)
/// </summary>
/// <param name="paramDto"></param>
/// <returns></returns>
Task<PageDataDto<SummaryOfGradesStudentsTestModel>> GetSummaryOfGradesStudentsTestPageList(SportsHallStudentsTestParam paramDto);
/// <summary>
/// 成绩推送
/// </summary>

View File

@ -571,6 +571,142 @@ namespace VOL.Business.Services.SportsHall
return result;
}
/// <summary>
/// 体测成绩管理分页列表(全部体测项目)
/// </summary>
/// <param name="paramDto"></param>
/// <returns></returns>
public async Task<PageDataDto<SummaryOfGradesStudentsTestModel>> GetSummaryOfGradesStudentsTestPageList(SportsHallStudentsTestParam paramDto)
{
var result = new PageDataDto<SummaryOfGradesStudentsTestModel>();
paramDto.PageIndex = paramDto.PageIndex <= 0 ? 1 : paramDto.PageIndex;
paramDto.PageSize = paramDto.PageSize <= 0 ? 10 : paramDto.PageSize;
var baseQuery = _sportsTestResultRepository.DbContext.Set<N_SportsTestValue>()
.Where(s => s.SchoolCode == UserContext.Current.TenantId);
if (paramDto.StartTime.HasValue)
baseQuery = baseQuery.Where(x => x.CreateDate >= paramDto.StartTime.Value);
if (paramDto.EndTime.HasValue)
baseQuery = baseQuery.Where(x => x.CreateDate <= paramDto.EndTime.Value);
if (paramDto.ClassId.HasValue)
baseQuery = baseQuery.Where(x => x.ClassId == paramDto.ClassId.Value);
if (paramDto.Sex.HasValue)
baseQuery = baseQuery.Where(x => (int)x.Sex == paramDto.Sex);
if (!string.IsNullOrWhiteSpace(paramDto.ResultLevel))
baseQuery = baseQuery.Where(x => x.Rank == paramDto.ResultLevel);
var filteredQuery = baseQuery;
if (paramDto.ItemType.HasValue && paramDto.ItemType.Value > 0)
filteredQuery = filteredQuery.Where(x => x.CategoryValue == paramDto.ItemType.Value);
var latestScoreTimeQuery = filteredQuery
.GroupBy(x => x.StudentNo)
.Select(g => new { StudentNo = g.Key, MaxScoreTime = g.Max(x => x.ScoreTime) });
var latestRecordsQuery = from record in filteredQuery
join latest in latestScoreTimeQuery
on new { record.StudentNo, record.ScoreTime }
equals new { latest.StudentNo, ScoreTime = latest.MaxScoreTime }
select record;
result.Total = await latestRecordsQuery
.Select(x => x.StudentNo)
.Distinct()
.CountAsync();
var pagedStudentKeys = await latestRecordsQuery
.OrderByDescending(x => x.ScoreTime)
.Select(x => new { x.StudentNo, x.ScoreTime })
.Distinct()
.Skip((paramDto.PageIndex - 1) * paramDto.PageSize)
.Take(paramDto.PageSize)
.ToListAsync();
if (!pagedStudentKeys.Any())
{
result.Datas = new List<SummaryOfGradesStudentsTestModel>();
return result;
}
var pagedStudentNos = pagedStudentKeys.Select(x => x.StudentNo).Distinct().ToList();
var pageRecords = await baseQuery
.Where(x => pagedStudentNos.Contains(x.StudentNo))
.Select(x => new
{
x.Id,
x.StudentNo,
x.StudentName,
x.Sex,
x.ClassName,
x.GradeName,
x.ScoreTime,
x.IsDisplay,
x.CategoryValue,
x.CategoryEnum,
x.Value,
x.Score,
x.Rank
})
.ToListAsync();
pageRecords = pageRecords
.Where(x => pagedStudentKeys.Any(k => k.StudentNo == x.StudentNo && k.ScoreTime == x.ScoreTime))
.ToList();
var sportsTestItemTypes = Enum.GetValues(typeof(SportsTestItemType))
.Cast<SportsTestItemType>()
.OrderBy(x => (int)x)
.ToList();
result.Datas = pageRecords
.GroupBy(x => new
{
x.StudentNo,
x.StudentName,
x.Sex,
x.ClassName,
x.GradeName,
x.ScoreTime,
x.IsDisplay
})
.Select(g =>
{
var records = g
.GroupBy(x => x.CategoryValue)
.ToDictionary(x => x.Key, x => x.OrderByDescending(r => r.Id).First());
return new SummaryOfGradesStudentsTestModel
{
Id = g.Max(x => x.Id),
StudentNo = g.Key.StudentNo,
StudentName = g.Key.StudentName,
SexName = g.Key.Sex.GetDescription(),
GradeAndClass = $"{g.Key.GradeName} {g.Key.ClassName}",
ScoreTime = g.Key.ScoreTime,
IsDisplay = g.Key.IsDisplay,
Items = sportsTestItemTypes.Select(itemType =>
{
records.TryGetValue((int)itemType, out var record);
return new SummaryOfGradesSportsTestItemModel
{
ItemType = (int)itemType,
ItemCode = itemType.ToString(),
ItemName = itemType.GetDisplayName(),
Unit = itemType.GetDisplayDescription(),
Value = record?.Value,
Score = record?.Score,
Rank = record?.Rank ?? string.Empty
};
}).ToList()
};
})
.OrderByDescending(x => x.ScoreTime)
.ToList();
return result;
}
/// <summary>
/// 成绩推送
/// </summary>

View File

@ -26,6 +26,11 @@ namespace VOL.Model.School.Request
/// </summary>
public string? ResultLevel { get; set; }
/// <summary>
/// 体测项目类型
/// </summary>
public int? ItemType { get; set; }
/// <summary>
/// 开始时间
/// </summary>

View File

@ -0,0 +1,99 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
namespace VOL.Model.School.Response
{
/// <summary>
/// 体测成绩管理汇总查询
/// </summary>
public class SummaryOfGradesStudentsTestModel
{
/// <summary>
/// Id
/// </summary>
public int Id { get; set; }
/// <summary>
/// 学号
/// </summary>
[Display(Name = "学号")]
public string StudentNo { get; set; }
/// <summary>
/// 姓名
/// </summary>
[Display(Name = "姓名")]
public string StudentName { get; set; }
/// <summary>
/// 年级班级
/// </summary>
[Display(Name = "年级班级")]
public string GradeAndClass { get; set; }
/// <summary>
/// 性别
/// </summary>
[Display(Name = "性别")]
public string SexName { get; set; }
/// <summary>
/// 测试时间
/// </summary>
[Display(Name = "测试时间")]
public DateTime ScoreTime { get; set; }
/// <summary>
/// 是否显示
/// </summary>
[Display(Name = "是否显示")]
public bool IsDisplay { get; set; }
/// <summary>
/// 全部体测项目成绩
/// </summary>
public List<SummaryOfGradesSportsTestItemModel> Items { get; set; } = new();
}
/// <summary>
/// 体测项目成绩
/// </summary>
public class SummaryOfGradesSportsTestItemModel
{
/// <summary>
/// 项目类型
/// </summary>
public int ItemType { get; set; }
/// <summary>
/// 项目枚举名称
/// </summary>
public string ItemCode { get; set; }
/// <summary>
/// 项目名称
/// </summary>
public string ItemName { get; set; }
/// <summary>
/// 单位
/// </summary>
public string Unit { get; set; }
/// <summary>
/// 成绩值
/// </summary>
public float? Value { get; set; }
/// <summary>
/// 分数
/// </summary>
public float? Score { get; set; }
/// <summary>
/// 等级
/// </summary>
public string Rank { get; set; }
}
}

View File

@ -79,6 +79,17 @@ namespace VOL.WebApi.Controllers.SportsHall
return await _sportsHallService.GetSportsHallStudentsTestPageList(paramDto);
}
/// <summary>
/// 体测成绩管理分页列表(全部体测项目)
/// </summary>
/// <param name="paramDto"></param>
/// <returns></returns>
[HttpGet(nameof(GetSummaryOfGradesStudentsTestPageList))]
public async Task<PageDataDto<SummaryOfGradesStudentsTestModel>> GetSummaryOfGradesStudentsTestPageList(SportsHallStudentsTestParam paramDto)
{
return await _sportsHallService.GetSummaryOfGradesStudentsTestPageList(paramDto);
}
/// <summary>
/// 成绩推送
/// </summary>