using AutoMapper;
using Microsoft.EntityFrameworkCore;
using Newtonsoft.Json;
using System.Collections.Generic;
using System.Security.Cryptography;
using VOL.Entity.DomainModels.XinWei;
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;
using YD_XinWei.Commons.Dto.Open;
using YD_XinWei.Commons.Dto.School;
using YD_XinWei.Commons;
using YD_XinWei.Commons.Utils;
using static Microsoft.EntityFrameworkCore.DbLoggerCategory;
namespace YD_XinWei.Api.Services.Impl
{
///
/// 服务实现
///
public class XinWeiService : IXinWeiService
{
public SmartSportsContext _sportsContext;
private readonly IMapper _mapper;
///
/// 构造
///
///
///
public XinWeiService(SmartSportsContext sportsContext, IMapper mapper)
{
_sportsContext = sportsContext;
_mapper = mapper;
}
///
/// 获取设备信息
///
///
///
///
public async Task DeviceInfo(string deviceSerial)
{
var deviceInfo = await _sportsContext.XW_Device.FirstOrDefaultAsync(x => x.DeviceSerial == deviceSerial);
var res = _mapper.Map(deviceInfo);
return res;
}
///
/// 项目模式
///
///
public async Task> SportsModelTypeList()
{
var res = await _sportsContext.XW_ProjectMode.Select(x => new ProjectModeDto()
{
Id = x.Id,
ProjectKind = x.ProjectKind,
Name = x.Name
}).ToListAsync();
return res;
}
///
/// 体育项目
///
/// 学校Id
///
public async Task> 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;
}
///
/// 获取学生信息
///
/// 学校Id
///
public async Task> MinimumOfStudentInfoList(int orgId)
{
string schoolCode = await _sportsContext.School.Where(x => x.Id == orgId).Select(x => x.SchoolCode).FirstAsync();
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,
UserId = s.Id,
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,
CardNo = new List()
}).ToListAsync();
return res;
}
///
/// 获取名单列表
///
///
///
///
///
public async Task> 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 sportList = new List();
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;
}
///
/// 获取人脸信息
///
///
///
public async Task FaceListOfDevicePage(FaceListOfDeviceDto dto)
{
string schoolCode = await _sportsContext.School.Where(x => x.Id == dto.OrgId).Select(x => x.SchoolCode).FirstAsync();
var total = await _sportsContext.Student.CountAsync(x => x.SchoolCode == schoolCode && !string.IsNullOrWhiteSpace(x.Photo));
var list = await _sportsContext.Student
.Where(x => x.SchoolCode == schoolCode && !string.IsNullOrWhiteSpace(x.Photo))
.Select(s => new DeviceUserFaceVo()
{
FaceId = s.StudentNo,
FaceType = 1,
FaceUrl = s.Photo,
PersonId = s.StudentNo,
UserId = s.Id
})
.Skip((dto.PageNo - 1) * dto.PageSize)
.Take(dto.PageSize)
.ToListAsync();
return new FaceListOfDevicePageDto()
{
Total = total,
PageNum = dto.PageNo,
PageSize = dto.PageSize,
Pages = (int)Math.Ceiling((double)total / dto.PageSize),
List = list
};
}
///
/// 获取训练评分规则
///
/// 学校Id
///
public async Task> ScoreRules(int orgId)
{
var scoreRules = await _sportsContext.HealthStandards.ToListAsync();
var projects = await _sportsContext.XW_TestingProject.ToListAsync();
var projectModels = await _sportsContext.XW_ProjectMode.ToListAsync();
var scoreRuleItemsByType = scoreRules
.GroupBy(x => x.CategoryEnum)
.ToDictionary(g => g.Key, g => g.ToList());
List res = new List();
foreach (var projectModel in projectModels)
{
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())).ToList();
var groupedItemsData = scoreRuleItems.GroupBy(x => x.GradeId).ToList();
foreach (var grouped in groupedItemsData)
{
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()
};
scoreRuleDto.Pluses = new List
{
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
}
};
scoreRuleDto.ScoreScopes = new List
{
new ScoreScope()
{
Gender = 1,
MaxScore = maleMaxScore,
MaxCount = maleMax
},
new ScoreScope()
{
Gender = 2,
MaxScore = femaleMaxScore,
MaxCount = femaleMax
}
};
res.Add(scoreRuleDto);
}
}
return res;
}
///
/// 新增训练
///
///
///
public async Task AddTrain(AddTrainDto dto)
{
var entity = _mapper.Map(dto);
Console.WriteLine(JsonConvert.SerializeObject(entity));
if (entity != null)
{
await _sportsContext.XW_SportsTestData.AddAsync(entity);
try
{
await _sportsContext.SaveChangesAsync();
var res = _mapper.Map(entity);
Console.WriteLine("新增成功");
return res;
}
catch (Exception e)
{
Console.WriteLine(e.Message + "/n" + e.InnerException);
}
}
return null;
}
///
/// 年级排名
///
///
///
///
///
public async Task GradeRankingGet(int studentId, int trainId)
{
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;
}
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() ?? "无数据";
res.Rating = student.Rating.ToString() ?? "无数据";
res.MonthRanking = studentRank;
return res;
}
///
/// 全部历史记录
///
///
///
public async Task HistoryGet(HistoryGetDto dto)
{
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