890 lines
35 KiB
C#
Raw Normal View History

2025-01-14 16:04:33 +08:00
using AutoMapper;
using Microsoft.EntityFrameworkCore;
2025-02-25 15:33:02 +08:00
using Newtonsoft.Json;
2025-01-14 16:04:33 +08:00
using System.Collections.Generic;
2025-01-21 16:01:50 +08:00
using System.Security.Cryptography;
using VOL.Entity.DomainModels.XinWei;
2025-01-14 16:04:33 +08:00
using YD_XinWei.Api.Context;
using YD_XinWei.Api.Services.Interface;
using YD_XinWei.Api.SmartSportsEntitys;
using YD_XinWei.Api.Utilities;
using YD_XinWei.Commons.Dto.Common;
2025-01-15 09:32:35 +08:00
using YD_XinWei.Commons.Dto.Open;
2025-01-14 16:04:33 +08:00
using YD_XinWei.Commons.Dto.School;
2025-03-03 17:08:29 +08:00
using YD_XinWei.Commons;
using YD_XinWei.Commons.Utils;
2025-01-21 16:01:50 +08:00
using static Microsoft.EntityFrameworkCore.DbLoggerCategory;
2025-03-04 15:20:40 +08:00
using Newtonsoft.Json.Linq;
using VOL.Entity.Enum;
2025-01-14 16:04:33 +08:00
namespace YD_XinWei.Api.Services.Impl
{
2025-01-15 09:32:35 +08:00
/// <summary>
2025-01-21 16:01:50 +08:00
/// 服务实现
2025-01-15 09:32:35 +08:00
/// </summary>
2025-01-14 16:04:33 +08:00
public class XinWeiService : IXinWeiService
{
public SmartSportsContext _sportsContext;
private readonly IMapper _mapper;
2025-01-15 09:32:35 +08:00
/// <summary>
/// 构造
/// </summary>
/// <param name="sportsContext"></param>
/// <param name="mapper"></param>
2025-01-14 16:04:33 +08:00
public XinWeiService(SmartSportsContext sportsContext, IMapper mapper)
{
_sportsContext = sportsContext;
_mapper = mapper;
}
2025-01-15 09:32:35 +08:00
2025-01-21 16:01:50 +08:00
/// <summary>
/// 获取设备信息
/// </summary>
/// <param name="deviceSerial"></param>
/// <returns></returns>
/// <exception cref="NotImplementedException"></exception>
public async Task<DeviceInfoDto> DeviceInfo(string deviceSerial)
{
2025-02-12 16:05:53 +08:00
var deviceInfo = await _sportsContext.XW_Device.FirstOrDefaultAsync(x => x.DeviceSerial == deviceSerial);
2025-01-21 16:01:50 +08:00
var res = _mapper.Map<DeviceInfoDto>(deviceInfo);
return res;
}
2025-01-15 09:32:35 +08:00
/// <summary>
/// 项目模式
/// </summary>
/// <returns></returns>
2025-01-14 16:04:33 +08:00
public async Task<List<ProjectModeDto>> SportsModelTypeList()
{
var res = await _sportsContext.XW_ProjectMode.Select(x => new ProjectModeDto()
{
Id = x.Id,
ProjectKind = x.ProjectKind,
Name = x.Name
}).ToListAsync();
return res;
}
2025-01-15 09:32:35 +08:00
/// <summary>
/// 体育项目
/// </summary>
/// <param name="orgId">学校Id</param>
/// <returns></returns>
2025-01-14 16:04:33 +08:00
public async Task<List<TestingProjectDto>> OrgSportsProjectList(int orgId)
{
2025-03-12 13:30:12 +08:00
//var res = await _sportsContext.XW_TestingProject.Where(x => x.OrgId == orgId).Select(x => new TestingProjectDto()
var res = await _sportsContext.XW_TestingProject.Select(x => new TestingProjectDto()
2025-01-14 16:04:33 +08:00
{
ProjectId = x.ProjectId,
IsOpen = x.IsOpen,
IsShow = x.IsShow,
ProjectName = x.ProjectName
}).ToListAsync();
return res;
}
2025-01-15 09:32:35 +08:00
/// <summary>
/// 获取学生信息
/// </summary>
/// <param name="orgId">学校Id</param>
/// <returns></returns>
public async Task<List<StudentInfoDto>> MinimumOfStudentInfoList(int orgId)
{
2025-01-15 10:10:13 +08:00
string schoolCode = await _sportsContext.School.Where(x => x.Id == orgId).Select(x => x.SchoolCode).FirstAsync();
2025-01-15 09:32:35 +08:00
2025-01-15 10:10:13 +08:00
var res = await (from s in _sportsContext.Student
join c in _sportsContext.Class on s.ClassId equals c.Id
join g in _sportsContext.Grade on c.GradeId equals g.Id
where s.SchoolCode == schoolCode
select new StudentInfoDto()
{
Id = s.Id,
OrgId = orgId,
2025-02-20 18:57:10 +08:00
UserId = s.Id,
2025-01-15 10:10:13 +08:00
StudentNo = s.StudentNo,
Name = s.StudentName,
Sex = s.Sex == 1 ? "男" : "女",
ClassId = c.Id,
GradeId = g.Id,
RuleGradeId = g.Id,
ClassName = c.ClassName,
GradeName = g.GradeName,
2025-02-20 18:57:10 +08:00
CardNo = new List<string>()
2025-01-15 10:10:13 +08:00
}).ToListAsync();
2025-01-15 09:32:35 +08:00
2025-01-15 10:10:13 +08:00
return res;
}
2025-01-21 16:01:50 +08:00
2025-02-20 18:57:10 +08:00
/// <summary>
/// 获取名单列表
/// </summary>
/// <param name="orgId"></param>
/// <param name="userId"></param>
/// <returns></returns>
/// <exception cref="NotImplementedException"></exception>
public async Task<List<SportsRosterDto>> SportsRosterList(int orgId, int userId = 0)
{
string schoolCode = await _sportsContext.School.Where(x => x.Id == orgId).Select(x => x.SchoolCode).FirstAsync();
var studentList = await _sportsContext.Student.Where(x => x.SchoolCode == schoolCode).ToListAsync();
var list = await (from c in _sportsContext.Class
join g in _sportsContext.Grade on c.GradeId equals g.Id
where c.SchoolCode == schoolCode
select new SportsRosterDto()
{
Id = c.Id,
OrgId = orgId,
Name = c.ClassName,
GradeId = g.Id,
RuleGradeId = g.Id,
GradeName = g.GradeName,
Status = 1,
Type = 1
}).ToListAsync();
foreach (var item in list)
{
var stuList = studentList.Where(x => x.ClassId == item.Id).ToList();
2025-03-07 16:37:06 +08:00
List<SportsRosterStudentDto> sportList1 = new List<SportsRosterStudentDto>();
2025-02-20 18:57:10 +08:00
foreach (var sport in stuList)
{
2025-03-07 16:37:06 +08:00
sportList1.Add(new SportsRosterStudentDto()
2025-02-20 18:57:10 +08:00
{
Id = sport.Id,
GroupName = item.Name,
ClassId = item.Id,
ClassName = item.Name,
GradeId = item.GradeId,
GradeName = item.GradeName,
OrgId = orgId,
Sex = sport.Sex,
UserName = sport.StudentName,
StudentNo = sport.StudentNo,
UserId = sport.Id,
2025-03-07 16:37:06 +08:00
GroupOrder = sport.Id,
2025-02-20 18:57:10 +08:00
RosterId = 1,
});
}
item.RosterGroupList.Add(new SportsRosterGroupDto()
{
GroupName = item.Name,
2025-03-07 16:37:06 +08:00
RosterStudentList = sportList1
2025-02-20 18:57:10 +08:00
});
}
2025-03-07 16:37:06 +08:00
//var list1 = list.Select(x => new SportsRosterDto
//{
// Type = 2
//}).ToList();
//var mergedList = list.Concat(list1).ToList();
2025-02-20 18:57:10 +08:00
return list;
}
2025-01-21 16:01:50 +08:00
/// <summary>
/// 获取人脸信息
/// </summary>
/// <param name="dto"></param>
/// <returns></returns>
public async Task<FaceListOfDevicePageDto> FaceListOfDevicePage(FaceListOfDeviceDto dto)
{
string schoolCode = await _sportsContext.School.Where(x => x.Id == dto.OrgId).Select(x => x.SchoolCode).FirstAsync();
2025-02-28 17:29:04 +08:00
var total = await _sportsContext.Student.CountAsync(x => x.SchoolCode == schoolCode && !string.IsNullOrWhiteSpace(x.Photo));
2025-01-21 16:01:50 +08:00
var list = await _sportsContext.Student
2025-02-28 17:29:04 +08:00
.Where(x => x.SchoolCode == schoolCode && !string.IsNullOrWhiteSpace(x.Photo))
2025-01-21 16:01:50 +08:00
.Select(s => new DeviceUserFaceVo()
{
FaceId = s.StudentNo,
FaceType = 1,
FaceUrl = s.Photo,
2025-02-25 15:32:58 +08:00
PersonId = s.StudentNo,
2025-01-21 16:01:50 +08:00
UserId = s.Id
})
.Skip((dto.PageNo - 1) * dto.PageSize)
.Take(dto.PageSize)
.ToListAsync();
return new FaceListOfDevicePageDto()
{
Total = total,
PageNum = dto.PageNo,
2025-02-28 17:29:04 +08:00
PageSize = dto.PageSize,
Pages = (int)Math.Ceiling((double)total / dto.PageSize),
2025-01-21 16:01:50 +08:00
List = list
};
}
/// <summary>
/// 获取训练评分规则
/// </summary>
/// <param name="orgId">学校Id</param>
/// <returns></returns>
public async Task<List<ScoreRuleDto>> ScoreRules(int orgId)
{
2025-02-25 15:33:02 +08:00
var scoreRules = await _sportsContext.HealthStandards.ToListAsync();
var projects = await _sportsContext.XW_TestingProject.ToListAsync();
var projectModels = await _sportsContext.XW_ProjectMode.ToListAsync();
2025-02-20 18:57:10 +08:00
2025-02-25 15:33:02 +08:00
var scoreRuleItemsByType = scoreRules
.GroupBy(x => x.CategoryEnum)
.ToDictionary(g => g.Key, g => g.ToList());
List<ScoreRuleDto> res = new List<ScoreRuleDto>();
foreach (var projectModel in projectModels)
2025-02-20 18:57:10 +08:00
{
2025-02-25 15:33:02 +08:00
var project = projects.FirstOrDefault(x => x.ProjectId == projectModel.ProjectKind);
if (project == null) continue; // Skip if project doesn't exist
var scoreRuleTypes = projectModel.CategoryEnum.Split(',');
var scoreRuleItems = scoreRuleTypes.SelectMany(type => scoreRuleItemsByType.GetValueOrDefault(type, new List<N_HealthStandards>())).ToList();
var groupedItemsData = scoreRuleItems.GroupBy(x => x.GradeId).ToList();
foreach (var grouped in groupedItemsData)
2025-02-20 18:57:10 +08:00
{
2025-02-25 15:33:02 +08:00
var maleItems = grouped.Where(x => x.Sex == 1).ToList();
var femaleItems = grouped.Where(x => x.Sex == 2).ToList();
var maleMax = maleItems.DefaultIfEmpty().Max(x => x?.MaxValue ?? 0);
var maleMin = maleItems.DefaultIfEmpty().Max(x => x?.MinValue ?? 0);
var maleMaxScore = maleItems.DefaultIfEmpty().Max(x => x?.Score ?? 0);
var femaleMax = femaleItems.DefaultIfEmpty().Max(x => x?.MaxValue ?? 0);
var femaleMin = femaleItems.DefaultIfEmpty().Max(x => x?.MinValue ?? 0);
var femaleMaxScore = femaleItems.DefaultIfEmpty().Max(x => x?.Score ?? 0);
ScoreRuleDto scoreRuleDto = new ScoreRuleDto
{
GradeId = grouped.Key,
OrgId = orgId,
ProjectKind = project.ProjectId,
ProjectName = project.ProjectName,
ModelType = projectModel.Id,
RuleType = 1,
ProjectId = project.ProjectId,
Items = grouped.Select(item => new ScoreRuleItemDto
{
Id = item.Id,
Sex = item.Sex,
2025-04-03 16:36:01 +08:00
Name = item.Score.GetRank().ToString(),
2025-02-25 15:33:02 +08:00
Score = item.Score,
Max = item.MaxValue,
Min = item.MinValue
2025-03-07 16:37:06 +08:00
}).OrderByDescending(x => x.Min).ToList()
2025-02-25 15:33:02 +08:00
};
2025-02-20 18:57:10 +08:00
2025-02-25 15:33:02 +08:00
scoreRuleDto.Pluses = new List<ScoreRulePlusDto>
2025-03-07 16:37:06 +08:00
{
//new ScoreRulePlusDto()
//{
// Id = grouped.FirstOrDefault()?.Id ?? 0,
// Sex = 1,
// Max = maleMax,
// Min = maleMin,
// MaxScore = maleMaxScore,
// Score = maleMaxScore
//},
//new ScoreRulePlusDto()
//{
// Id = grouped.FirstOrDefault()?.Id ?? 0,
// Sex = 2,
// Max = femaleMax,
// Min = femaleMin,
// MaxScore = femaleMaxScore,
// Score = femaleMaxScore
//}
};
2025-02-25 15:33:02 +08:00
scoreRuleDto.ScoreScopes = new List<ScoreScope>
2025-03-07 16:37:06 +08:00
{
//new ScoreScope()
//{
// Gender = 1,
// MaxScore = maleMaxScore,
// MaxCount = maleMax
//},
//new ScoreScope()
//{
// Gender = 2,
// MaxScore = femaleMaxScore,
// MaxCount = femaleMax
//}
};
2025-02-25 15:33:02 +08:00
res.Add(scoreRuleDto);
}
}
return res;
2025-02-07 22:22:24 +08:00
}
/// <summary>
/// 新增训练
/// </summary>
/// <param name="dto"></param>
/// <returns></returns>
2025-03-02 23:59:28 +08:00
public async Task<TrainDto> AddTrain(AddTrainDto dto)
2025-02-07 22:22:24 +08:00
{
2025-03-05 08:54:26 +08:00
var xwProject = await _sportsContext.XW_TestingProject.ToListAsync();
var healthStandards = await _sportsContext.HealthStandards.ToListAsync();
2025-02-25 15:33:02 +08:00
2025-03-05 08:54:26 +08:00
try
2025-02-07 22:22:24 +08:00
{
2025-03-05 08:54:26 +08:00
dto.StudentList.ForEach(stu =>
2025-02-25 15:33:02 +08:00
{
2025-03-05 08:54:26 +08:00
var project = xwProject.Where(x => x.ProjectId == dto.ProjectId).FirstOrDefault();
string categoryEnum = project?.CategoryEnum ?? "";
2025-04-03 16:36:01 +08:00
if (dto.ProjectId == 4 || dto.ProjectId == 11)
2025-03-05 08:54:26 +08:00
{
stu.Achievement = stu.Achievement / 10;
stu.Achievement2 = stu.Achievement2 / 10;
}
2025-03-07 16:37:06 +08:00
if (dto.ProjectId == 21)
{
var value = stu.Achievement2;
var standard = healthStandards.Where(x =>
x.CategoryEnum.Equals(categoryEnum) &&
x.GradeId == x.GradeId &&
x.Sex == x.Sex &&
value >= x.MinValue &&
value < x.MaxValue
).FirstOrDefault();
2025-03-05 08:54:26 +08:00
2025-03-07 16:37:06 +08:00
if (standard != null)
{
stu.Score = standard.Score;
stu.Rating = standard.Score.GetRank();
}
}
else
2025-03-05 08:54:26 +08:00
{
2025-03-07 16:37:06 +08:00
var standard = healthStandards.Where(x =>
x.CategoryEnum.Equals(categoryEnum) &&
x.GradeId == x.GradeId &&
x.Sex == x.Sex &&
stu.Achievement >= x.MinValue &&
stu.Achievement < x.MaxValue
).FirstOrDefault();
if (standard != null)
{
stu.Score = standard.Score;
stu.Rating = standard.Score.GetRank();
}
2025-03-05 08:54:26 +08:00
}
});
2025-02-28 17:29:04 +08:00
2025-04-03 16:36:01 +08:00
dto.StudentList.ForEach(x => { x.OrgId = dto.OrgId; });
2025-03-05 08:54:26 +08:00
var entity = _mapper.Map<XW_SportsTestData>(dto);
await _sportsContext.XW_SportsTestData.AddAsync(entity);
2025-03-04 15:20:40 +08:00
2025-03-05 08:54:26 +08:00
var sportsTestValueEntinys = await AddSportsTestValueEntity(dto, healthStandards, xwProject);
await _sportsContext.SportsTestValue.AddRangeAsync(sportsTestValueEntinys);
2025-02-28 17:29:04 +08:00
2025-03-05 08:54:26 +08:00
await _sportsContext.SaveChangesAsync();
2025-02-28 17:29:04 +08:00
2025-04-03 16:36:01 +08:00
var res = _mapper.Map<TrainDto>(entity);
2025-03-05 08:54:26 +08:00
Console.WriteLine("新增成功");
2025-02-25 15:33:02 +08:00
2025-03-05 08:54:26 +08:00
return res;
}
catch (Exception e)
{
Console.WriteLine(e.Message + "/n" + e.InnerException);
2025-02-07 22:22:24 +08:00
}
2025-02-28 17:29:04 +08:00
return null;
}
2025-03-05 08:54:26 +08:00
private async Task<List<N_SportsTestValue>> AddSportsTestValueEntity(AddTrainDto dto, List<N_HealthStandards> healthStandards, List<XW_TestingProject> xwProject)
2025-03-04 15:20:40 +08:00
{
var sportsTestValueEntinys = new List<N_SportsTestValue>();
string schoolCode = await _sportsContext.School.Where(x => x.Id == dto.OrgId).Select(x => x.SchoolCode).FirstAsync();
var nowTime = DateTime.Now;
foreach (var data in dto.StudentList)
{
if (data.Achievement == 0)
continue;
var sportsTestValueEntity = new N_SportsTestValue();
var project = xwProject.Where(x => x.ProjectId == dto.ProjectId).FirstOrDefault();
2025-03-05 08:54:26 +08:00
2025-03-04 15:20:40 +08:00
string categoryEnum = project?.CategoryEnum ?? "";
2025-03-07 16:37:06 +08:00
float value = 0;
if (categoryEnum == "BMI")
{
value = data.Achievement2 ?? 0 / 10;
sportsTestValueEntity.Height = data.Achievement ?? 0 / 10;
sportsTestValueEntity.Weight = data.OriginalAchievement ?? 0 / 100;
}
else
value = data.Achievement ?? 0;
2025-03-05 08:54:26 +08:00
2025-03-04 15:20:40 +08:00
var standard = healthStandards.Where(x =>
x.CategoryEnum.Equals(categoryEnum) &&
x.GradeId == data.GradeId &&
x.Sex == data.Sex &&
2025-03-05 08:54:26 +08:00
value >= x.MinValue &&
value < x.MaxValue
2025-03-04 15:20:40 +08:00
).FirstOrDefault();
if (standard != null)
{
sportsTestValueEntity.Score = standard.Score;
sportsTestValueEntity.Rank = standard.Rank;
}
sportsTestValueEntity.SchoolCode = schoolCode;
sportsTestValueEntity.Sex = (int)data.Sex;
sportsTestValueEntity.DataSource = DataSource.XW;
sportsTestValueEntity.CategoryValue = project?.CategoryValue ?? 0;
sportsTestValueEntity.CategoryEnum = categoryEnum;
sportsTestValueEntity.GradeId = data.GradeId;
sportsTestValueEntity.GradeName = data.GradeName;
sportsTestValueEntity.ClassId = data.ClassId;
sportsTestValueEntity.ClassName = data.ClassName;
sportsTestValueEntity.TeacherId = data.TeacherId ?? 0;
sportsTestValueEntity.TeacherName = data.Teacher;
sportsTestValueEntity.StudentNo = data.StudentNo;
sportsTestValueEntity.StudentName = data.StudentName;
2025-03-07 16:37:06 +08:00
sportsTestValueEntity.Value = value;
2025-03-04 15:20:40 +08:00
sportsTestValueEntity.Creator = dto.OrgId ?? 0;
sportsTestValueEntity.CreateDate = nowTime;
sportsTestValueEntity.ScoreTime = Convert.ToDateTime(dto.StartTime);
sportsTestValueEntity.AdditionalScore = (float)(data.PlusesScore ?? 0);
SemesterDto semesterDto = new SemesterDto();
sportsTestValueEntity.Year = semesterDto.Year;
sportsTestValueEntity.Semester = semesterDto.Semester;
sportsTestValueEntity.IsDisplay = true;
sportsTestValueEntinys.Add(sportsTestValueEntity);
}
return sportsTestValueEntinys;
}
2025-02-28 17:29:04 +08:00
/// <summary>
/// 年级排名
/// </summary>
/// <param name="studentId"></param>
/// <param name="trainId"></param>
/// <returns></returns>
2025-03-03 17:08:29 +08:00
public async Task<GradeRankingVo> GradeRankingGet(int studentId, int trainId)
2025-02-28 17:29:04 +08:00
{
2025-03-03 17:08:29 +08:00
var res = new GradeRankingVo();
var now = DateTime.UtcNow;
var firstDayOfMonth = new DateTime(now.Year, now.Month, 1);
var lastDayOfMonth = firstDayOfMonth.AddMonths(1).AddDays(-1);
var studentResults = await _sportsContext.XW_TrainStudents.Where(x => x.XW_SportsTestDataId == trainId)
.Select(x => new
{
x.GradeId,
x.StudentId,
x.StudentName,
x.Rating,
x.CreateTime,
x.Score
}).ToListAsync();
var student = studentResults.FirstOrDefault(x => x.StudentId == studentId);
if (student == null)
{
return res;
}
2025-04-03 16:36:01 +08:00
2025-03-03 17:08:29 +08:00
var rankedResults = studentResults
.Where(x => x.GradeId == student.GradeId &&
DateTime.TryParse(x.CreateTime, out var createTime) &&
createTime >= firstDayOfMonth && createTime <= lastDayOfMonth)
.OrderByDescending(x => x.Score)
.Select((x, index) => new { x.StudentId, Rank = index + 1 })
.ToList();
var studentRank = rankedResults.FirstOrDefault(x => x.StudentId == student.StudentId)?.Rank.ToString() ?? "无数据";
2025-04-03 16:36:01 +08:00
res.Rating = student.Score.GetRankStr();
2025-03-03 17:08:29 +08:00
res.MonthRanking = studentRank;
return res;
2025-02-28 17:29:04 +08:00
}
/// <summary>
/// 全部历史记录
/// </summary>
/// <param name="dto"></param>
/// <returns></returns>
2025-03-02 23:59:28 +08:00
public async Task<TrainHistoryResponseDto> HistoryGet(HistoryGetDto dto)
2025-02-28 17:29:04 +08:00
{
2025-03-02 23:59:28 +08:00
var res = new TrainHistoryResponseDto();
var trainList = await _sportsContext.XW_SportsTestData
.Where(x =>
x.OrgId == dto.OrgId &&
x.ProjectKind == Convert.ToInt32(dto.ProjectKind) &&
x.ModelType == dto.ModelType)
.ToListAsync();
if (trainList == null || !trainList.Any())
return res;
var trainIds = trainList.Select(t => t.Id).ToList();
var query = _sportsContext.XW_TrainStudents
.Where(x => trainIds.Contains(x.XW_SportsTestDataId))
.AsQueryable();
// 动态排序
if (!string.IsNullOrEmpty(dto.OrderByColumn))
{
bool isAsc = dto.IsAsc?.ToLower() == "asc";
query = isAsc
? query.OrderBy(x => EF.Property<object>(x, dto.OrderByColumn))
: query.OrderByDescending(x => EF.Property<object>(x, dto.OrderByColumn));
}
else
{
query = query.OrderByDescending(x => x.Id); // 默认排序
}
var total = await query.CountAsync();
var list = await query
.Skip((dto.PageNo - 1) * dto.PageSize)
.Take(dto.PageSize)
.Select(x => new TrainHistoryVo()
{
TrainStudentId = x.Id,
ClassName = x.ClassName,
2025-03-03 17:08:29 +08:00
CreateTime = x.CreateTime ?? "无数据",
Achievement = x.Achievement.ToString() ?? "无数据",
2025-03-07 16:37:06 +08:00
Rating = x.Score.GetRankStr(),
2025-03-03 17:08:29 +08:00
Score = x.Score.ToString() ?? "无数据",
Sex = x.Sex == 1 ? "男" : "女",
2025-03-02 23:59:28 +08:00
StudentName = x.StudentName,
TouristFlag = false,
DoubleFlag = false,
2025-03-03 17:08:29 +08:00
}).OrderByDescending(x => x.CreateTime)
2025-03-02 23:59:28 +08:00
.ToListAsync();
res.Total = total;
res.Rows = list;
return res;
2025-02-28 17:29:04 +08:00
}
2025-03-02 23:59:28 +08:00
2025-02-28 17:29:04 +08:00
/// <summary>
/// 历史记录详细
/// </summary>
/// <param name="dto"></param>
/// <returns></returns>
2025-03-02 23:59:28 +08:00
public async Task<TrainAnalusisVo> TrainAnalysisHistoryDetail(HistoryDetailRequestDto dto)
2025-02-28 17:29:04 +08:00
{
2025-03-07 16:37:06 +08:00
var trainModel = await _sportsContext.XW_TrainStudents.Where(x => x.Id == dto.TrainStudentId).Select(x => new { x.XW_SportsTestDataId, x.StudentId, x.GradeId }).FirstAsync();
2025-03-03 17:08:29 +08:00
var stuHeadUrl = await _sportsContext.Student.Where(x => x.Id == trainModel.StudentId).Select(x => x.Photo).FirstOrDefaultAsync();
2025-03-07 16:37:06 +08:00
var train = await _sportsContext.XW_SportsTestData.Where(x => x.Id == trainModel.XW_SportsTestDataId).Select(x => new { x.ProjectName, x.ProjectId }).FirstOrDefaultAsync();
2025-03-03 17:08:29 +08:00
var now = DateTime.UtcNow;
var firstDayOfMonth = new DateTime(now.Year, now.Month, 1);
var lastDayOfMonth = firstDayOfMonth.AddMonths(1).AddDays(-1);
2025-03-07 16:37:06 +08:00
var trainIds = await _sportsContext.XW_SportsTestData.Where(x => x.ProjectId == train.ProjectId).Select(x => x.Id).ToListAsync();
2025-03-03 17:08:29 +08:00
2025-03-07 16:37:06 +08:00
var studentResults = await _sportsContext.XW_TrainStudents.Where(x => trainIds.Contains(x.XW_SportsTestDataId))
2025-03-03 17:08:29 +08:00
.Select(x => new
{
2025-03-07 16:37:06 +08:00
x.Id,
2025-03-03 17:08:29 +08:00
x.GradeId,
x.StudentId,
x.StudentName,
x.Rating,
x.CreateTime,
2025-03-07 16:37:06 +08:00
x.Score,
x.Achievement
2025-03-03 17:08:29 +08:00
}).ToListAsync();
2025-03-07 16:37:06 +08:00
var student = studentResults.Where(x => x.Id == dto.TrainStudentId).OrderByDescending(x => x.Achievement).FirstOrDefault();
2025-03-03 17:08:29 +08:00
if (student == null)
{
return null;
}
var rankedResults = studentResults
.Where(x => x.GradeId == student.GradeId &&
DateTime.TryParse(x.CreateTime, out var createTime) &&
createTime >= firstDayOfMonth && createTime <= lastDayOfMonth)
2025-03-07 16:37:06 +08:00
.OrderByDescending(x => x.Achievement)
.Select((x, index) => new { x.Id, Rank = index + 1 })
2025-03-03 17:08:29 +08:00
.ToList();
2025-03-07 16:37:06 +08:00
var studentRank = rankedResults.FirstOrDefault(x => x.Id == dto.TrainStudentId)?.Rank.ToString() ?? "无数据";
2025-03-03 17:08:29 +08:00
2025-03-02 23:59:28 +08:00
var res = await _sportsContext.XW_TrainStudents.Where(x => x.Id == dto.TrainStudentId).Include(x => x.TrainViolationsBO).Select(x => new TrainAnalusisVo()
{
2025-03-03 17:08:29 +08:00
Achievement = x.Achievement.ToString() ?? "无数据",
2025-03-02 23:59:28 +08:00
ClassName = x.ClassName,
2025-03-03 17:08:29 +08:00
GradeRanking = studentRank,
HeadImgUrl = stuHeadUrl,
2025-03-07 16:37:06 +08:00
ProjectName = train.ProjectName,
Rating = x.Score.GetRankStr(),
2025-03-03 17:08:29 +08:00
Score = x.Score.ToString() ?? "无数据",
Sex = x.Sex == 1 ? "男" : "女",
2025-03-02 23:59:28 +08:00
StudentName = x.StudentName,
2025-03-04 15:20:40 +08:00
Times = x.Times.ToString(),
VideoRecord = x.VideoRecord,
2025-03-02 23:59:28 +08:00
ViolationsNumber = x.TrainViolationsBO.Count(),
TrainViolationsVo = x.TrainViolationsBO.Select(x => new TrainViolationsVo()
{
CreateTime = x.TrainTime,
TrainTime = x.TrainTime,
PicUrl = x.PicUrl,
ViolationId = x.ViolationId,
ViolationName = "",
}).ToList(),
}).FirstOrDefaultAsync();
return res;
2025-02-28 17:29:04 +08:00
}
/// <summary>
/// 个人历史记录-历史成绩
/// </summary>
/// <param name="dto"></param>
/// <returns></returns>
2025-03-02 23:59:28 +08:00
public async Task<TrainHistoryPersonVo> HistoryPersonGet(HistoryPersonGetDto dto)
2025-02-28 17:29:04 +08:00
{
2025-03-02 23:59:28 +08:00
var trainList = await _sportsContext.XW_SportsTestData
.Where(x =>
x.OrgId == dto.OrgId &&
x.ProjectKind == Convert.ToInt32(dto.ProjectKind) &&
x.ModelType == dto.ModelType)
.ToListAsync();
var trainIds = trainList.Select(t => t.Id).ToList();
var studentResults = await _sportsContext.XW_TrainStudents.Where(x => trainIds.Contains(x.XW_SportsTestDataId))
.Select(x => new
{
2025-03-03 17:08:29 +08:00
x.Id,
2025-03-02 23:59:28 +08:00
x.ClassName,
x.StudentId,
x.StudentName,
x.GradeId,
x.Sex,
x.Score,
2025-03-07 16:37:06 +08:00
x.Achievement,
2025-03-02 23:59:28 +08:00
x.CreateTime
}).ToListAsync();
2025-03-07 16:37:06 +08:00
var student = studentResults.Where(x => x.StudentId == dto.StudentId).OrderByDescending(x => x.Achievement).FirstOrDefault();
2025-03-02 23:59:28 +08:00
if (student == null)
{
return new TrainHistoryPersonVo();
}
var rankedResults = studentResults.Where(x => x.GradeId == student.GradeId)
2025-03-07 16:37:06 +08:00
.OrderByDescending(x => x.Achievement)
2025-03-02 23:59:28 +08:00
.Select((x, index) => new { x, Rank = index + 1 })
.ToList();
var monthList = studentResults.Where(x => DateTime.TryParse(x.CreateTime, out var date) && date.Year == DateTime.Now.Year && date.Month == DateTime.Now.Month).ToList();
var monthRankedResults = studentResults.Where(x => x.GradeId == student.GradeId)
2025-03-07 16:37:06 +08:00
.OrderByDescending(x => x.Achievement)
2025-03-02 23:59:28 +08:00
.Select((x, index) => new { x, Rank = index + 1 })
.ToList();
2025-03-03 17:08:29 +08:00
var stuHeadUrl = await _sportsContext.Student.Where(x => x.Id == student.StudentId).Select(x => x.Photo).FirstOrDefaultAsync();
2025-03-02 23:59:28 +08:00
var res = new TrainHistoryPersonVo()
{
ClassName = student.ClassName,
2025-03-03 17:08:29 +08:00
HeadImgUrl = stuHeadUrl,
Sex = student.Sex == 1 ? "男" : "女",
2025-03-02 23:59:28 +08:00
StudentName = student.StudentName,
2025-03-07 16:37:06 +08:00
HistoryBestScore = studentResults.Max(x => x.Achievement).ToString() ?? "无数据",
HistoryRanking = rankedResults.FirstOrDefault(x => x.x.Achievement == student.Achievement)?.Rank.ToString() ?? "-1",
MonthBestScore = monthList.Max(x => x.Achievement).ToString() ?? "无数据",
MonthRanking = monthRankedResults.FirstOrDefault(x => x.x.Achievement == student.Achievement)?.Rank.ToString() ?? "-1"
2025-03-02 23:59:28 +08:00
};
return res;
2025-02-28 17:29:04 +08:00
}
/// <summary>
/// 个人历史记录-记录列表
/// </summary>
/// <param name="dto"></param>
/// <returns></returns>
2025-03-02 23:59:28 +08:00
public async Task<TableDataPersonAnalysisVo> HistoryPersonListGet(HistoryPersonListDto dto)
2025-02-28 17:29:04 +08:00
{
2025-03-02 23:59:28 +08:00
var res = new TableDataPersonAnalysisVo();
var trainList = await _sportsContext.XW_SportsTestData
.Where(x =>
x.OrgId == dto.OrgId &&
x.ProjectKind == Convert.ToInt32(dto.ProjectKind) &&
x.ModelType == dto.ModelType)
.ToListAsync();
if (trainList == null || !trainList.Any())
return res;
var trainIds = trainList.Select(t => t.Id).ToList();
var query = _sportsContext.XW_TrainStudents
.Where(x => trainIds.Contains(x.XW_SportsTestDataId) && x.StudentId == dto.StudentId)
.AsQueryable();
// 动态排序
if (!string.IsNullOrEmpty(dto.OrderByColumn))
{
bool isAsc = dto.IsAsc?.ToLower() == "asc";
query = isAsc
? query.OrderBy(x => EF.Property<object>(x, dto.OrderByColumn))
: query.OrderByDescending(x => EF.Property<object>(x, dto.OrderByColumn));
}
else
{
query = query.OrderByDescending(x => x.Id); // 默认排序
}
var total = await query.CountAsync();
var list = await query
.Skip((dto.PageNo - 1) * dto.PageSize)
.Take(dto.PageSize)
.Select(x => new PersonAnalysisVo()
{
2025-03-03 17:08:29 +08:00
TrainStudentId = x.Id,
2025-03-02 23:59:28 +08:00
ClassName = x.ClassName,
2025-03-03 17:08:29 +08:00
CreateTime = x.CreateTime ?? "无数据",
Achievement = x.Achievement.ToString() ?? "无数据",
2025-03-07 16:37:06 +08:00
Rating = x.Score.GetRankStr(),
2025-03-03 17:08:29 +08:00
Score = x.Score.ToString() ?? "无数据",
Sex = x.Sex == 1 ? "男" : "女",
2025-03-02 23:59:28 +08:00
StudentName = x.StudentName,
DoubleFlag = false,
2025-03-03 17:08:29 +08:00
}).OrderByDescending(x => x.CreateTime)
2025-03-02 23:59:28 +08:00
.ToListAsync();
res.Total = total;
res.Rows = list;
return res;
2025-02-28 17:29:04 +08:00
}
/// <summary>
/// 成绩榜-年级列表
/// </summary>
/// <param name="orgId"></param>
/// <returns></returns>
public async Task<List<GradeVo>> GetGradeListByOrg(int orgId)
{
string schoolCode = await _sportsContext.School.Where(x => x.Id == orgId).Select(x => x.SchoolCode).FirstAsync();
var res = await (from s in _sportsContext.SchoolAssocGrade
2025-03-02 23:59:28 +08:00
join g in _sportsContext.Grade on s.GradeId equals g.Id
where s.SchoolCode == schoolCode
select new GradeVo()
{
GradeId = g.Id,
GradeName = g.GradeName
}).ToListAsync();
2025-02-28 17:29:04 +08:00
return res;
}
/// <summary>
/// 成绩榜-年级列表
/// </summary>
/// <param name="dto"></param>
/// <returns></returns>
2025-03-03 10:16:50 +08:00
public async Task<ScoreRankingVo> ScoreRanking(ScoreRankingDto dto)
2025-02-28 17:29:04 +08:00
{
2025-03-03 10:16:50 +08:00
var res = new ScoreRankingVo();
var trainList = await _sportsContext.XW_SportsTestData
.Where(x =>
x.OrgId == dto.OrgId &&
x.ProjectKind == Convert.ToInt32(dto.ProjectKind) &&
x.ModelType == Convert.ToInt32(dto.ModelType))
.ToListAsync();
var trainIds = trainList.Select(t => t.Id).ToList();
2025-03-06 11:22:44 +08:00
var today = DateTime.UtcNow.Date;
2025-03-03 10:16:50 +08:00
var (startDate, endDate) = dto.Times switch
{
2025-03-06 11:22:44 +08:00
"1" => (today.AddDays(-(int)today.DayOfWeek + 1), today.AddDays(7 - (int)today.DayOfWeek)), // 本周(从周一到周日)
"2" => (new DateTime(today.Year, today.Month, 1), new DateTime(today.Year, today.Month, 1).AddMonths(1).AddDays(-1)), // 本月从1号到最后一天
"3" => (new DateTime(today.Year, 9, 1), new DateTime(today.Year, 9, 1).AddMonths(6).AddDays(-1)), // 本学期9月1日到次年2月最后一天
2025-03-03 10:16:50 +08:00
_ => (DateTime.MinValue, DateTime.MaxValue)
};
2025-03-06 11:22:44 +08:00
2025-03-03 10:16:50 +08:00
// 先从数据库查询基本数据(不带时间过滤)
var rawResults = await _sportsContext.XW_TrainStudents
.Where(x => trainIds.Contains(x.XW_SportsTestDataId) && x.GradeId == dto.GradeId)
.Select(x => new
{
x.StudentName,
x.ClassName,
x.Achievement,
x.CreateTime,
x.Sex
2025-04-03 16:36:01 +08:00
}).OrderByDescending(x => x.Achievement)
2025-03-03 10:16:50 +08:00
.ToListAsync(); // 先加载到内存
// 在内存中进行时间和性别过滤
var studentResults = rawResults
.Where(x => DateTime.TryParse(x.CreateTime, out var date) && date >= startDate && date <= endDate) // 过滤时间
.Where(x => dto.Sex == "1" ? x.Sex == 1 : dto.Sex == "2" ? x.Sex == 2 : true) // 过滤性别
.Select(x => new RankingVo()
{
Name = x.StudentName,
ClassName = x.ClassName,
2025-03-03 17:08:29 +08:00
Achievement = x.Achievement.ToString() ?? "无数据"
2025-04-03 16:36:01 +08:00
})
2025-03-03 10:16:50 +08:00
.ToList();
res.Times = dto.Times;
res.Lists = studentResults;
return res;
2025-01-21 16:01:50 +08:00
}
2025-01-14 16:04:33 +08:00
}
}