using AutoMapper; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc.ModelBinding; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Tea.Utils; using VOL.Business.IRepositories; using VOL.Business.IServices.Training; using VOL.Business.Repositories; using VOL.Core.CacheManager; using VOL.Core.Extensions; using VOL.Core.Extensions.AutofacManager; using VOL.Core.ManageUser; using VOL.Entity.DomainModels; using VOL.Entity.Enum; using VOL.Model; using VOL.System.Repositories; using static Microsoft.EntityFrameworkCore.DbLoggerCategory; namespace VOL.Business.Services.Training { public class I_TrainingStudentDataService : II_TrainingStudentDataService, IDependency { #region 初始化 private readonly IMapper _mapper; private readonly ICacheService _cacheService; private readonly S_TeacherRepository _teacherRepository; [ActivatorUtilitiesConstructor] public I_TrainingStudentDataService(IMapper mapper, ICacheService cacheService, S_TeacherRepository teacherRepository) { _mapper = mapper; _cacheService = cacheService; _teacherRepository = teacherRepository; } #endregion /// /// 获取达标率 /// /// /// public async Task> GetAttainmentRate(TrainingDataParam paramDto) { //var query = _teacherRepository // .FindAsIQueryable(x => x.TrainingData.ItemType.Equals(paramDto.ItemType) && x.TrainingData.SchoolCode.Equals(UserContext.Current.TenantId)); //if (paramDto.DataSource.HasValue) //{ // query = query.Where(x => x.TrainingData.DataSource.Equals(paramDto.DataSource)); //} //if (paramDto.StartTime.HasValue) //{ // query = query.Where(x => x.TrainingData.InsertTime != null && x.TrainingData.InsertTime >= paramDto.StartTime); //} //if (paramDto.EndTime.HasValue) //{ // query = query.Where(x => x.TrainingData.InsertTime != null && x.TrainingData.InsertTime <= paramDto.EndTime); //} //var list = await query // .Where(x => x.ResultLevel.HasValue) // .GroupBy(x => x.TrainingData.ItemType) // .Select(x => new AttainmentRateModel // { // AttainmentType = AttainmentRateType.Total.ToSafeInt() ?? 0, // TotalNumber = x.Count(), // AttainmentNumber = x.Where(c=> // ( // c.TrainingData.ItemType == TrainingItemType.HeartRate.ToSafeInt() && // c.ResultLevel != AchievementRank.Fine.ToSafeInt() // ) || // ( // c.TrainingData.ItemType != TrainingItemType.HeartRate.ToSafeInt() && // c.ResultLevel != AchievementRank.Fail.ToSafeInt() // ) // ).Count() // }).ToListAsync(); //return list; return null; } /// /// 分数比例 /// /// /// public async Task> GetScoreProportion(TrainingDataParam paramDto) { //var query = _teacherRepository // .FindAsIQueryable(x => x.TrainingData.ItemType.Equals(paramDto.ItemType) && x.TrainingData.SchoolCode.Equals(UserContext.Current.TenantId)); //if (paramDto.DataSource.HasValue) //{ // query = query.Where(x => x.TrainingData.DataSource.Equals(paramDto.DataSource)); //} //if (paramDto.StartTime.HasValue) //{ // query = query.Where(x => x.TrainingData.InsertTime != null && x.TrainingData.InsertTime >= paramDto.StartTime); //} //if (paramDto.EndTime.HasValue) //{ // query = query.Where(x => x.TrainingData.InsertTime != null && x.TrainingData.InsertTime <= paramDto.EndTime); //} //var list = await query // .Where(x => x.ResultLevel.HasValue) // .GroupBy(x => x.ResultLevel) // .Select(x => new ScoreProportionModel // { // ScoreLevel = x.Key ?? 0, // TotalNumber = x.Count(), // MaleNumber = x.Where(c => c.Gender == SexType.Male.ToSafeInt()).Count(), // FemaleNumber = x.Where(c => c.Gender == SexType.Female.ToSafeInt()).Count() // }).ToListAsync(); //return list; return null; } /// /// 训练学生详情列表 /// /// /// public async Task> GetItemTrainingStudentDataList(ItemTrainingStudentDataListParam paramDto) { var query = from tsd in _teacherRepository.DbContext.Set() join s in _teacherRepository.DbContext.Set() on tsd.StudentNo equals s.StudentNo into students from student in students.DefaultIfEmpty() where tsd.TrainingData.Id.Equals(paramDto.TrainingId) where tsd.TrainingData.SchoolCode.Equals(UserContext.Current.TenantId) orderby tsd.SpeedTime select new ItemTrainingStudentDataListModel() { StudentId = student.Id, StudentDataId = tsd.Id, StudentNo = tsd.StudentNo, StudentName = tsd.StudentName, Gender = tsd.Gender, SecondsNumber = tsd.SecondsNumber, SpeedTime = tsd.SpeedTime, Kcal = tsd.Kcal, Efficiency = tsd.Efficiency, ResultLevel = tsd.ResultLevel, JumpValue = tsd.JumpValue, ErrorNumber = tsd.ErrorNumber, StuAgileSpeedTimeNumber = tsd.StuAgileSpeedTimeNumber, HeartRatePercentage = tsd.HeartRatePercentage, HighHeartRate = tsd.HighHeartRate, LowHeartRate = tsd.LowHeartRate, ModelName = tsd.TrainingData.ModelName }; if (paramDto.Gender.HasValue) { query = query.Where(x => x.Gender.Equals(paramDto.Gender)); } if (paramDto.ResultLevel.HasValue) { query = query.Where(x => x.ResultLevel.Equals(paramDto.ResultLevel)); } if (!paramDto.StudentName.IsNullOrEmpty()) { query = query.Where(x => x.StudentName.Contains(paramDto.StudentName)); } if (!paramDto.StudentNo.IsNullOrEmpty()) { query = query.Where(x => x.StudentNo.Contains(paramDto.StudentNo)); } var trainingStudentDataList = await query.ToListAsync(); var rankedData = trainingStudentDataList .Select((data, index) => new ItemTrainingStudentDataListModel { StudentId = data.StudentId, StudentDataId = data.StudentDataId, StudentNo = data.StudentNo, StudentName = data.StudentName, Gender = data.Gender, SecondsNumber = data.SecondsNumber, SpeedTime = data.SpeedTime, Kcal = data.Kcal, Efficiency = data.Efficiency, ResultLevel = data.ResultLevel, JumpValue = data.JumpValue, ErrorNumber = data.ErrorNumber, StuAgileSpeedTimeNumber = data.StuAgileSpeedTimeNumber, HeartRatePercentage = data.HeartRatePercentage, HighHeartRate = data.HighHeartRate, LowHeartRate = data.LowHeartRate, ModelName = data.ModelName, Ranking = index + 1 }); var list = await query .OrderBy(c => c.StudentDataId) .Skip((paramDto.PageIndex - 1) * paramDto.PageSize) .Take(paramDto.PageSize) .ToListAsync(); return list; } /// /// 训练学生详情 /// /// /// public async Task GetTrainingStudentData(TrainingStudentDataParam paramDto) { var query = from tsd in _teacherRepository.DbContext.Set() join s in _teacherRepository.DbContext.Set() on tsd.StudentNo equals s.StudentNo into students from student in students.DefaultIfEmpty() join g in _teacherRepository.DbContext.Set() on tsd.TrainingData.GradeId equals g.Id into grades from grade in grades.DefaultIfEmpty() join sc in _teacherRepository.DbContext.Set() on tsd.TrainingData.ClassId equals sc.Id into sclasss from sclass in sclasss.DefaultIfEmpty() where student.Id.Equals(paramDto.StudentId) where tsd.TrainingData.ItemType.Equals(paramDto.ItemType) where tsd.TrainingData.SchoolCode.Equals(UserContext.Current.TenantId) select new TrainingStudentDataModel() { StudentDataId = tsd.Id, ClassId = tsd.TrainingData.ClassId, ClassName = sclass.ClassName, GradeId = tsd.TrainingData.GradeId, GradeName = grade.GradeName, GradeCode = grade.SchoolCode, StudentId = student.Id, StudentNo = tsd.StudentNo, StudentName = tsd.StudentName, StudentBirthday = student.Birthday, StudentGender = tsd.Gender, StudentAge = student.Age, DataSource = tsd.TrainingData.DataSource, StartTime = tsd.TrainingData.InsertTime, EndTime = tsd.TrainingData.EndTime, SecondsNumber = tsd.SecondsNumber, SpeedTime = tsd.SpeedTime, Kcal = tsd.Kcal, Efficiency = tsd.Efficiency }; if (paramDto.DataSource.HasValue) { query = query.Where(x => x.DataSource.Equals(paramDto.DataSource)); } if (paramDto.StartTime.HasValue) { query = query.Where(x => x.StartTime != null && x.StartTime >= paramDto.StartTime); } if (paramDto.EndTime.HasValue) { query = query.Where(x => x.StartTime != null && x.StartTime <= paramDto.EndTime); } var modelList = await query.ToListAsync(); var model = modelList.FirstOrDefault(); if (model != null) { model.TotalTrainNumber = modelList.Count; // 跳绳 if (paramDto.ItemType == TrainingItemType.Coordinate.ToSafeInt()) { model.TotalScoreRate = modelList.Sum(c => c.Kcal); } // 敏捷 else if (paramDto.ItemType == TrainingItemType.Agility.ToSafeInt()) { model.TotalScoreRate = modelList.Sum(c => c.SpeedTime); } // 力量 else if (paramDto.ItemType == TrainingItemType.Strength.ToSafeInt()) { model.TotalScoreRate = modelList.Sum(c => c.SpeedTime); } // 平衡 else if (paramDto.ItemType == TrainingItemType.Balance.ToSafeInt()) { model.TotalScoreRate = modelList.Sum(c => c.SpeedTime); } // 速度 else if (paramDto.ItemType == TrainingItemType.Speed.ToSafeInt()) { model.TotalScoreRate = modelList.Sum(c => c.SpeedTime); } // 心率 else if (paramDto.ItemType == TrainingItemType.HeartRate.ToSafeInt()) { model.TotalScoreRate = modelList.Sum(c => c.Kcal); } } return model; } /// /// 项目训练学生详情列表 /// /// /// public async Task> GetTrainingStudentDataList(TrainingStudentDataListParam paramDto) { var query = from tsd in _teacherRepository.DbContext.Set() join s in _teacherRepository.DbContext.Set() on tsd.StudentNo equals s.StudentNo into students from student in students.DefaultIfEmpty() join st in _teacherRepository.DbContext.Set() on tsd.TrainingData.TeacherId equals st.Id into teachers from teacher in teachers.DefaultIfEmpty() where student.Id.Equals(paramDto.StudentId) where tsd.TrainingData.ItemType.Equals(paramDto.ItemType) where tsd.TrainingData.SchoolCode.Equals(UserContext.Current.TenantId) orderby tsd.TrainingData.InsertTime select new TrainingStudentDataListModel() { StartTime = tsd.TrainingData.InsertTime, EndTime = tsd.TrainingData.EndTime, StudentId = student.Id, TeacherName = teacher.TeacherName, DataSource = tsd.TrainingData.DataSource, ModelName = tsd.TrainingData.ModelName, StudentDataId = tsd.Id, StudentNo = tsd.StudentNo, StudentName = tsd.StudentName, Gender = tsd.Gender, SecondsNumber = tsd.SecondsNumber, SpeedTime = tsd.SpeedTime, Kcal = tsd.Kcal, Efficiency = tsd.Efficiency, ResultLevel = tsd.ResultLevel, JumpValue = tsd.JumpValue, ErrorNumber = tsd.ErrorNumber, StuAgileSpeedTimeNumber = tsd.StuAgileSpeedTimeNumber, HeartRatePercentage = tsd.HeartRatePercentage, HighHeartRate = tsd.HighHeartRate, LowHeartRate = tsd.LowHeartRate, ItemType = tsd.TrainingData.ItemType, LimitNumber = tsd.TrainingData.LimitNumber, LimitTime = tsd.TrainingData.LimitTime }; if (paramDto.DataSource.HasValue) { query = query.Where(x => x.DataSource.Equals(paramDto.DataSource)); } if (paramDto.StartTime.HasValue) { query = query.Where(x => x.StartTime != null && x.StartTime >= paramDto.StartTime); } if (paramDto.EndTime.HasValue) { query = query.Where(x => x.StartTime != null && x.StartTime <= paramDto.EndTime); } if (!paramDto.TeacherName.IsNullOrEmpty()) { query = query.Where(x => x.TeacherName.Equals(paramDto.TeacherName)); } if (paramDto.ResultLevel.HasValue) { query = query.Where(x => x.ResultLevel.Equals(paramDto.ResultLevel)); } var list = await query .Skip((paramDto.PageIndex - 1) * paramDto.PageSize) .Take(paramDto.PageSize) .ToListAsync(); return list; } /// /// 训练学生趋势列表 /// /// /// public async Task> GetTrainingStudentDataTrendList(TrainingStudentDataTrendListParam paramDto) { var dbQuery = from tsd in _teacherRepository.DbContext.Set() join s in _teacherRepository.DbContext.Set() on tsd.StudentNo equals s.StudentNo into students from student in students.DefaultIfEmpty() join st in _teacherRepository.DbContext.Set() on tsd.TrainingData.TeacherId equals st.Id into teachers from teacher in teachers.DefaultIfEmpty() where student.Id.Equals(paramDto.StudentId) where tsd.TrainingData.ItemType.Equals(paramDto.ItemType) where tsd.TrainingData.SchoolCode.Equals(UserContext.Current.TenantId) orderby tsd.TrainingData.InsertTime select new TrainingStudentDataListModel() { StartTime = tsd.TrainingData.InsertTime, EndTime = tsd.TrainingData.EndTime, StudentId = student.Id, TeacherName = teacher.TeacherName, DataSource = tsd.TrainingData.DataSource, ModelName = tsd.TrainingData.ModelName, StudentDataId = tsd.Id, StudentNo = tsd.StudentNo, StudentName = tsd.StudentName, Gender = tsd.Gender, SecondsNumber = tsd.SecondsNumber, SpeedTime = tsd.SpeedTime, Kcal = tsd.Kcal, Efficiency = tsd.Efficiency, ResultLevel = tsd.ResultLevel, JumpValue = tsd.JumpValue, ErrorNumber = tsd.ErrorNumber, StuAgileSpeedTimeNumber = tsd.StuAgileSpeedTimeNumber, HeartRatePercentage = tsd.HeartRatePercentage, HighHeartRate = tsd.HighHeartRate, LowHeartRate = tsd.LowHeartRate, ItemType = tsd.TrainingData.ItemType, LimitNumber = tsd.TrainingData.LimitNumber, LimitTime = tsd.TrainingData.LimitTime }; if (paramDto.DataSource.HasValue) { dbQuery = dbQuery.Where(x => x.DataSource.Equals(paramDto.DataSource)); } if (paramDto.StartTime.HasValue) { dbQuery = dbQuery.Where(x => x.StartTime != null && x.StartTime >= paramDto.StartTime); } if (paramDto.EndTime.HasValue) { dbQuery = dbQuery.Where(x => x.StartTime != null && x.StartTime <= paramDto.EndTime); } if (!paramDto.TeacherName.IsNullOrEmpty()) { dbQuery = dbQuery.Where(x => x.TeacherName.Equals(paramDto.TeacherName)); } if (paramDto.ResultLevel.HasValue) { dbQuery = dbQuery.Where(x => x.ResultLevel.Equals(paramDto.ResultLevel)); } var query = dbQuery.Select(tsd => new TrainingStudentDataTrendModel { InsertTime = tsd.StartTime.GetDateTime(), Number = 0 }); // 跳绳 if (paramDto.ItemType == TrainingItemType.Coordinate.ToSafeInt()) { query = dbQuery.Select(tsd => new TrainingStudentDataTrendModel { InsertTime = tsd.StartTime.GetDateTime(), //Number = paramDto.TrendType == TrainingTrendType.BestResult.ToSafeInt() ? tsd.Kcal : //(paramDto.TrendType == TrainingTrendType.Average.ToSafeInt() ? tsd.SecondsNumber : 0) }); } // 敏捷 else if (paramDto.ItemType == TrainingItemType.Agility.ToSafeInt()) { query = dbQuery.Select(tsd => new TrainingStudentDataTrendModel { InsertTime = tsd.StartTime.GetDateTime(), //Number = paramDto.TrendType == TrainingTrendType.BestResult.ToSafeInt() ? tsd.SpeedTime : 0 }); } // 力量 else if (paramDto.ItemType == TrainingItemType.Strength.ToSafeInt()) { query = dbQuery.Select(tsd => new TrainingStudentDataTrendModel { InsertTime = tsd.StartTime.GetDateTime(), //Number = paramDto.TrendType == TrainingTrendType.BestResult.ToSafeInt() ? tsd.SpeedTime : //(paramDto.TrendType == TrainingTrendType.Average.ToSafeInt() ? tsd.Efficiency : 0) }); } // 平衡 else if (paramDto.ItemType == TrainingItemType.Balance.ToSafeInt()) { query = dbQuery.Select(tsd => new TrainingStudentDataTrendModel { InsertTime = tsd.StartTime.GetDateTime(), //Number = paramDto.TrendType == TrainingTrendType.BestResult.ToSafeInt() ? tsd.SpeedTime : 0 }); } // 速度 else if (paramDto.ItemType == TrainingItemType.Speed.ToSafeInt()) { query = dbQuery.Select(tsd => new TrainingStudentDataTrendModel { InsertTime = tsd.StartTime.GetDateTime(), //Number = paramDto.TrendType == TrainingTrendType.BestResult.ToSafeInt() ? tsd.SpeedTime : //(paramDto.TrendType == TrainingTrendType.Average.ToSafeInt() ? tsd.SecondsNumber : 0) }); } // 心率 else if (paramDto.ItemType == TrainingItemType.HeartRate.ToSafeInt()) { query = dbQuery.Select(tsd => new TrainingStudentDataTrendModel { InsertTime = tsd.StartTime.GetDateTime(), //Number = paramDto.TrendType == TrainingTrendType.BestResult.ToSafeInt() ? tsd.Kcal : 0 }); } var list = await query .Skip((paramDto.PageIndex - 1) * paramDto.PageSize) .Take(paramDto.PageSize) .ToListAsync(); return list; } } }