using AutoMapper; using Microsoft.EntityFrameworkCore; using YD_WeChatApplet.Api.Entitys; using YD_WeChatApplet.Api.SmartSportsEntitys; using YD_WeChatApplet.Api.Utilities; using YD_WeChatApplet.Commons.Dto; using YD_WeChatApplet.Commons.Dto.HomeWork; using YD_WeChatApplet.Commons.Dto.Patriarch; using YD_WeChatApplet.Commons.Dto.Resource; using YD_WeChatApplet.Commons.Dto.School; using YD_WeChatApplet.Commons.Dto.SportsTest; using YD_WeChatApplet.Commons.Dto.Teacher; using YD_WeChatApplet.Commons.Enum; using YD_WeChatApplet.Context; using YD_WeChatApplet.Services; namespace YD_WeChatApplet.Api.Services.Impl { /// /// 家长端 /// public class PatriarchService : IPatriarchService { public UserContext _userContext; public SmartSportsContext _sportsContext; private readonly IMapper _mapper; public PatriarchService(UserContext userContext, SmartSportsContext sportsContext, IMapper mapper) { _userContext = userContext; _sportsContext = sportsContext; _mapper = mapper; } /// /// 新建训练数据 /// /// /// /// public async Task AddExerciseData(AddExerciseDataDto dto) { var entity = _mapper.Map(dto); entity.RoleId = UserLoginContext.Current.RoleId; entity.UserId = UserLoginContext.Current.UserId; entity.UserName = UserLoginContext.Current.UserName; entity.CreateTime = DateTime.Now; if (dto.HomeWorkId == 0) { await _userContext.AddAsync(entity); await _userContext.SaveChangesAsync(); return; } var work = await _sportsContext.HomeWork.Where(x => x.Id == dto.HomeWorkId).Select(x => new { x.Id, x.Amount, x.GroupNumber }).FirstAsync(); entity.Status = dto.GroupNumber >= work.GroupNumber ? 2 : 1; var student = await _sportsContext.HomeWorkStudents.FirstAsync(x => x.HomeWorkId == dto.HomeWorkId && x.StudentNo == UserLoginContext.Current.UserNo); student.WorkStatus = entity.Status; if (entity.RoleId == 3) { entity.StudentNo = UserLoginContext.Current.UserNo; entity.StudentName = UserLoginContext.Current.UserName; } student.Value = dto.WorkModeType == 1 ? dto.Amount : dto.Duration; _sportsContext.HomeWorkStudents.Update(student); await _sportsContext.SaveChangesAsync(); await _userContext.AddAsync(entity); await _userContext.SaveChangesAsync(); } /// /// 作业记录 /// /// /// public async Task> HomeWorkRecordByPatriarch(PatriarchHomeWorkHistoryDto dto) { var userNo = UserLoginContext.Current.UserNo; var currentTime = DateTime.Now; var query = _sportsContext.HomeWorkStudents .Join(_sportsContext.HomeWork, a => a.HomeWorkId, s => s.Id, (a, s) => new { s.Id, a.StudentNo, a.WorkStatus, s.WorkName, s.WorkTypeName, s.GroupNumber, s.StartTime, s.EndTime }) .Where(a => a.StudentNo == userNo); query = dto.IsHistory ? query.Where(x => x.EndTime < currentTime) : query.Where(x => x.EndTime >= currentTime); var totalCount = await query.CountAsync(); var list = await query .Select(x => new HomeWorkRecordByPatriarchDto { Id = x.Id, WorkName = x.WorkName, WorkTypeName = x.WorkTypeName, WorkStatus = x.EndTime < currentTime ? 3 : (x.StartTime > currentTime ? 1 : 2), GroupNumber = x.GroupNumber, IsComplete = x.WorkStatus == 2, StartTime = x.StartTime, EndTime = x.EndTime }) .OrderByDescending(x => x.Id) .Skip((dto.PageIndex - 1) * dto.PageSize) .Take(dto.PageSize) .ToListAsync(); return new PageDataDto { Total = totalCount, Datas = list }; } /// /// 作业详情 /// /// /// public async Task HomeWorkDetailsByPatriarch(int homeWorkId) { var res = await _sportsContext.HomeWork.Where(x => x.Id == homeWorkId).Select(x => new PatriarchHomeWorkDetailsDto() { Id = x.Id, WorkName = x.WorkName, StartTime = x.StartTime, EndTime = x.EndTime, WorkText = x.WorkText, WorkType = (int)x.WorkType, WorkTypeName = x.WorkTypeName, WorkModeType = x.WorkModeType, WorkModeTypeName = x.WorkModeTypeName, Amount = x.Amount, Duration = x.Duration, GroupNumber = x.GroupNumber, IsRepeat = x.IsRepeat, RepetitionPeriod = x.RepetitionPeriod, WorkStatus = x.WorkStatus }).FirstOrDefaultAsync(); return res; } /// /// 学生报告 /// /// /// public async Task StudentReport() { var res = new StudentReportDto(); var studentNo = UserLoginContext.Current.UserNo; var student = await _sportsContext.Student.Where(x => x.StudentNo == studentNo).FirstOrDefaultAsync(); if (student == null) return res; var classInfo = await _sportsContext.Class.FirstOrDefaultAsync(x => x.Id == student.ClassId); if (classInfo == null) return res; var categorys = await ( from g in _sportsContext.GradeAssocCategory join s in _sportsContext.SportsTestCategory on g.CategoryValue equals s.CategoryValue where g.GradeId == classInfo.GradeId select new { s.Id, s.CategoryValue, s.CategoryName, s.CategoryEnum, g.Weight }).ToListAsync(); if (categorys == null) return res; var iotQuery = await _sportsContext.SportsTestValue.Where(x => x.IsDisplay && x.SchoolCode == student.SchoolCode && x.StudentNo == studentNo).Select(x => new SportsTestValueModel() { StudentNo = x.StudentNo, Value = x.Value, Score = x.Score, AdditionalScore = x.AdditionalScore, CategoryValue = x.CategoryValue }).ToListAsync(); var aiQuery = await _sportsContext.SportsTestData.Where(x => x.IsDisplay && x.SchoolCode == student.SchoolCode && x.StudentNo == studentNo).Select(x => new SportsTestValueModel() { StudentNo = x.StudentNo, Value = (float)x.Value, Score = x.Score, AdditionalScore = x.AdditionalScore, CategoryValue = x.CategoryValue }).ToListAsync(); var sportsTestResults = iotQuery.Concat(aiQuery).ToList(); res.CategoryScoreList = new List(); double totalScore = 0; var currentYear = DateTime.Now.Year; var currentMonth = DateTime.Now.Month; foreach (var item in categorys) { var maxResultInMonth = sportsTestResults .Where(x => x.CategoryValue == item.Id && x.ScoreTime?.Year == currentYear && x.ScoreTime?.Month == currentMonth) .OrderByDescending(x => x.Value) .FirstOrDefault(); var maxResult = maxResultInMonth ?? sportsTestResults .Where(x => x.CategoryValue == item.Id) .OrderByDescending(x => x.Value) .FirstOrDefault(); if (item.CategoryName == "BMI") res.BodyShape = maxResult?.Score ?? 0; if (item.CategoryName == "肺活量") res.BodyFunction = maxResult?.Score ?? 0; res.CategoryScoreList.Add(new CategoryScoreDto() { Name = item.CategoryName, Score = maxResult?.Score ?? 0, ImgUrl = $"{AppSettings.ALiYunOSS.CategoryImgUrl}{item.CategoryEnum}.png" }); double currentScore = maxResult?.Score ?? 0; double currentAdditionalScore = maxResult?.AdditionalScore ?? 0; totalScore += ((currentScore + currentAdditionalScore) * item.Weight); } res.TotalScore = (float)totalScore; var bodyFunction = res.CategoryScoreList.Where(x => x.Name != "BMI" && x.Name != "肺活量").ToList(); res.BodyFunction = bodyFunction.Average(x => x.Score); return res; } /// /// 训练记录 /// /// public async Task> ExerciseRecord(PageDto dto) { var userId = UserLoginContext.Current.UserId; var query = _userContext.ExerciseData.Where(x => x.UserId == userId); var totalCount = await query.CountAsync(); var list = await query .Select(x => new ExerciseRecordDto { Id = x.Id, WorkTypeName = x.WorkTypeName, WorkModeTypeName = x.WorkModeTypeName, StartTime = x.StartTime, EndTime = x.CreateTime, GroupNumber = x.GroupNumber, Amount = x.Amount ?? 0, Duration = x.Duration ?? 0, Calorie = x.Calorie ?? 0 }) .OrderByDescending(x => x.EndTime) .Skip((dto.PageIndex - 1) * dto.PageSize) .Take(dto.PageSize) .ToListAsync(); return new PageDataDto { Total = totalCount, Datas = list }; } } }