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;
|
|
|
|
|
using YD_XinWei.Commons.Dto.HomeWork;
|
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-01-21 16:01:50 +08:00
|
|
|
|
using static Microsoft.EntityFrameworkCore.DbLoggerCategory;
|
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)
|
|
|
|
|
{
|
|
|
|
|
var res = await _sportsContext.XW_TestingProject.Where(x => x.OrgId == orgId).Select(x => new TestingProjectDto()
|
|
|
|
|
{
|
|
|
|
|
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();
|
|
|
|
|
List<SportsRosterStudentDto> sportList = new List<SportsRosterStudentDto>();
|
|
|
|
|
|
|
|
|
|
foreach (var sport in stuList)
|
|
|
|
|
{
|
|
|
|
|
sportList.Add(new SportsRosterStudentDto()
|
|
|
|
|
{
|
|
|
|
|
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,
|
|
|
|
|
GroupOrder = 1,
|
|
|
|
|
RosterId = 1,
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
item.RosterGroupList.Add(new SportsRosterGroupDto()
|
|
|
|
|
{
|
|
|
|
|
GroupName = item.Name,
|
|
|
|
|
RosterStudentList = sportList
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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,
|
|
|
|
|
Name = "1",
|
|
|
|
|
Score = item.Score,
|
|
|
|
|
Max = item.MaxValue,
|
|
|
|
|
Min = item.MinValue
|
|
|
|
|
}).ToList()
|
|
|
|
|
};
|
2025-02-20 18:57:10 +08:00
|
|
|
|
|
2025-02-25 15:33:02 +08:00
|
|
|
|
scoreRuleDto.Pluses = new List<ScoreRulePlusDto>
|
2025-02-20 18:57:10 +08:00
|
|
|
|
{
|
2025-02-25 15:33:02 +08:00
|
|
|
|
new ScoreRulePlusDto()
|
2025-02-20 18:57:10 +08:00
|
|
|
|
{
|
2025-02-25 15:33:02 +08:00
|
|
|
|
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
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
scoreRuleDto.ScoreScopes = new List<ScoreScope>
|
|
|
|
|
{
|
|
|
|
|
new ScoreScope()
|
|
|
|
|
{
|
|
|
|
|
Gender = 1,
|
|
|
|
|
MaxScore = maleMaxScore,
|
|
|
|
|
MaxCount = maleMax
|
|
|
|
|
},
|
|
|
|
|
new ScoreScope()
|
|
|
|
|
{
|
|
|
|
|
Gender = 2,
|
|
|
|
|
MaxScore = femaleMaxScore,
|
|
|
|
|
MaxCount = femaleMax
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
{
|
|
|
|
|
var entity = _mapper.Map<XW_SportsTestData>(dto);
|
|
|
|
|
|
2025-02-25 15:33:02 +08:00
|
|
|
|
Console.WriteLine(JsonConvert.SerializeObject(entity));
|
|
|
|
|
|
2025-02-07 22:22:24 +08:00
|
|
|
|
if (entity != null)
|
|
|
|
|
{
|
|
|
|
|
await _sportsContext.XW_SportsTestData.AddAsync(entity);
|
2025-02-25 15:33:02 +08:00
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
await _sportsContext.SaveChangesAsync();
|
2025-02-28 17:29:04 +08:00
|
|
|
|
|
|
|
|
|
var res = _mapper.Map<TrainDto>(entity);
|
|
|
|
|
|
|
|
|
|
Console.WriteLine("新增成功");
|
|
|
|
|
|
|
|
|
|
return res;
|
2025-02-25 15:33:02 +08:00
|
|
|
|
}
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 年级排名
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="studentId"></param>
|
|
|
|
|
/// <param name="trainId"></param>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
/// <exception cref="NotImplementedException"></exception>
|
|
|
|
|
public Task<GradeRankingVo> GradeRankingGet(int studentId, int trainId)
|
|
|
|
|
{
|
|
|
|
|
throw new NotImplementedException();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <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,
|
|
|
|
|
CreateTime = x.CreateTime,
|
|
|
|
|
Achievement = x.Achievement.ToString(),
|
|
|
|
|
Rating = x.Rating.ToString(),
|
|
|
|
|
Score = x.Score.ToString(),
|
|
|
|
|
Sex = x.Sex.ToString(),
|
|
|
|
|
StudentName = x.StudentName,
|
|
|
|
|
TouristFlag = false,
|
|
|
|
|
DoubleFlag = false,
|
|
|
|
|
})
|
|
|
|
|
.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-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()
|
|
|
|
|
{
|
|
|
|
|
Achievement = x.Achievement.ToString(),
|
|
|
|
|
ClassName = x.ClassName,
|
|
|
|
|
GradeRanking = x.Ranking.ToString(),
|
|
|
|
|
HeadImgUrl = "",
|
|
|
|
|
ProjectName = "",
|
|
|
|
|
Rating = x.Rating.ToString(),
|
|
|
|
|
Score = x.Score.ToString(),
|
|
|
|
|
Sex = x.Sex.ToString(),
|
|
|
|
|
StudentName = x.StudentName,
|
|
|
|
|
Times = x.ErrorCount.ToString(),
|
|
|
|
|
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
|
|
|
|
|
{
|
|
|
|
|
x.ClassName,
|
|
|
|
|
x.StudentId,
|
|
|
|
|
x.StudentName,
|
|
|
|
|
x.GradeId,
|
|
|
|
|
x.Sex,
|
|
|
|
|
x.Score,
|
|
|
|
|
x.CreateTime
|
|
|
|
|
}).ToListAsync();
|
|
|
|
|
|
|
|
|
|
var student = studentResults.FirstOrDefault(x => x.StudentId == dto.StudentId);
|
|
|
|
|
|
|
|
|
|
if (student == null)
|
|
|
|
|
{
|
|
|
|
|
return new TrainHistoryPersonVo();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var rankedResults = studentResults.Where(x => x.GradeId == student.GradeId)
|
|
|
|
|
.OrderByDescending(x => x.Score)
|
|
|
|
|
.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)
|
|
|
|
|
.OrderByDescending(x => x.Score)
|
|
|
|
|
.Select((x, index) => new { x, Rank = index + 1 })
|
|
|
|
|
.ToList();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var res = new TrainHistoryPersonVo()
|
|
|
|
|
{
|
|
|
|
|
ClassName = student.ClassName,
|
|
|
|
|
HeadImgUrl = "",
|
|
|
|
|
Sex = student.Sex?.ToString() ?? "无数据",
|
|
|
|
|
StudentName = student.StudentName,
|
|
|
|
|
HistoryBestScore = studentResults.Max(x => x.Score)?.ToString() ?? "无数据",
|
|
|
|
|
HistoryRanking = rankedResults.FirstOrDefault(x => x.x.Score == student.Score)?.Rank.ToString() ?? "-1",
|
|
|
|
|
MonthBestScore = monthList.Max(x => x.Score)?.ToString() ?? "无数据",
|
|
|
|
|
MonthRanking = monthRankedResults.FirstOrDefault(x => x.x.Score == student.Score)?.Rank.ToString() ?? "-1"
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
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()
|
|
|
|
|
{
|
|
|
|
|
TrainStudentId = x.StudentId,
|
|
|
|
|
ClassName = x.ClassName,
|
|
|
|
|
CreateTime = x.CreateTime,
|
|
|
|
|
Achievement = x.Achievement.ToString(),
|
|
|
|
|
Rating = x.Rating.ToString(),
|
|
|
|
|
Score = x.Score.ToString(),
|
|
|
|
|
Sex = x.Sex.ToString(),
|
|
|
|
|
StudentName = x.StudentName,
|
|
|
|
|
DoubleFlag = false,
|
|
|
|
|
})
|
|
|
|
|
.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();
|
|
|
|
|
|
|
|
|
|
var (startDate, endDate) = dto.Times switch
|
|
|
|
|
{
|
|
|
|
|
"1" => (DateTime.UtcNow.AddDays(-7), DateTime.UtcNow), // 本周
|
|
|
|
|
"2" => (DateTime.UtcNow.AddMonths(-1), DateTime.UtcNow), // 本月
|
|
|
|
|
"3" => (new DateTime(DateTime.UtcNow.Year, 9, 1), DateTime.UtcNow), // 本学期
|
|
|
|
|
_ => (DateTime.MinValue, DateTime.MaxValue)
|
|
|
|
|
};
|
|
|
|
|
// 先从数据库查询基本数据(不带时间过滤)
|
|
|
|
|
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
|
|
|
|
|
})
|
|
|
|
|
.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,
|
|
|
|
|
Achievement = x.Achievement.ToString()
|
|
|
|
|
}).OrderByDescending(x => x.Achievement)
|
|
|
|
|
.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
|
|
|
|
}
|
|
|
|
|
}
|