|
@@ -32,6 +32,7 @@ using TEAMModelOS.SDK.Models;
|
|
|
using TEAMModelOS.SDK.Models.Cosmos;
|
|
|
using TEAMModelOS.SDK.Models.Cosmos.Common;
|
|
|
using TEAMModelOS.SDK.Services;
|
|
|
+using static TEAMModelOS.Controllers.OverallEducationController;
|
|
|
using static TEAMModelOS.SDK.Models.Cosmos.Student.StudentAnalysis;
|
|
|
using static TEAMModelOS.SDK.Services.ActivityStudentService;
|
|
|
|
|
@@ -99,233 +100,465 @@ namespace TEAMModelOS.Controllers
|
|
|
[Authorize(Roles = "IES")]
|
|
|
public async Task<IActionResult> Overview(JsonElement json)
|
|
|
{
|
|
|
- json.TryGetProperty("studentYear", out JsonElement _studentYear);
|
|
|
- json.TryGetProperty("grades", out JsonElement _grades);
|
|
|
- json.TryGetProperty("school", out JsonElement _school);
|
|
|
- json.TryGetProperty("periodId", out JsonElement _periodId);
|
|
|
- json.TryGetProperty("semesterId", out JsonElement _semesterId);
|
|
|
- json.TryGetProperty("studyYear", out JsonElement _studyYear);
|
|
|
-
|
|
|
- var client = _azureCosmos.GetCosmosClient();
|
|
|
- School school = await client.GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<School>($"{_school}", new PartitionKey("Base"));
|
|
|
- SchoolSetting schoolSetting = await client.GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<SchoolSetting>($"{_school}", new PartitionKey("SchoolSetting"));
|
|
|
- Dictionary<string, object> dict = OverallEducationService.GetQueryCond(json);
|
|
|
- #region 此处代码用于处理 根据年级 学段获取 相关的班级。
|
|
|
- HashSet<int> years = new HashSet<int>();
|
|
|
- if (_grades.ValueKind.Equals(JsonValueKind.Array))
|
|
|
- {
|
|
|
- var yearsdata = SchoolService.GetYears(school, $"{_periodId}", _grades.ToObject<List<int>>());
|
|
|
- years = yearsdata.years;
|
|
|
- }
|
|
|
- if (int.TryParse($"{_studentYear}", out int studentYear))
|
|
|
- {
|
|
|
- years.Add(studentYear);
|
|
|
- }
|
|
|
- if (!years.Any())
|
|
|
- {
|
|
|
- var period = school.period.Find(z => z.id.Equals($"{_periodId}"));
|
|
|
- if (period != null && period.grades.IsNotEmpty())
|
|
|
+ try {
|
|
|
+ json.TryGetProperty("studentYear", out JsonElement _studentYear);
|
|
|
+ json.TryGetProperty("grades", out JsonElement _grades);
|
|
|
+ json.TryGetProperty("school", out JsonElement _school);
|
|
|
+ json.TryGetProperty("periodId", out JsonElement _periodId);
|
|
|
+ json.TryGetProperty("semesterId", out JsonElement _semesterId);
|
|
|
+ json.TryGetProperty("studyYear", out JsonElement _studyYear);
|
|
|
+ var client = _azureCosmos.GetCosmosClient();
|
|
|
+ School school = await client.GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<School>($"{_school}", new PartitionKey("Base"));
|
|
|
+ SchoolSetting schoolSetting = await client.GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<SchoolSetting>($"{_school}", new PartitionKey("SchoolSetting"));
|
|
|
+ Dictionary<string, object> dict = OverallEducationService.GetQueryCond(json);
|
|
|
+ #region 此处代码用于处理 根据年级 学段获取 相关的班级。
|
|
|
+ HashSet<int> years = new HashSet<int>();
|
|
|
+ if (_grades.ValueKind.Equals(JsonValueKind.Array))
|
|
|
{
|
|
|
- List<int> grades = new List<int>();
|
|
|
- period.grades.Select((z, index) => index).ToList().ForEach(t => { grades.Add(t); });
|
|
|
- var yearsdata = SchoolService.GetYears(school, $"{_periodId}", grades);
|
|
|
+ var yearsdata = SchoolService.GetYears(school, $"{_periodId}", _grades.ToObject<List<int>>());
|
|
|
years = yearsdata.years;
|
|
|
}
|
|
|
- }
|
|
|
- List<Class> classes = new List<Class>();
|
|
|
- List<Student> students = new List<Student>();
|
|
|
- List<Class> grade_classes = new List<Class>();
|
|
|
- List<Student> grade_students = new List<Student>();
|
|
|
- List<OverallEducation> grade_overallEducations = new List<OverallEducation>() ;
|
|
|
- List<OverallEducation> overallEducations = new List<OverallEducation>();
|
|
|
- HashSet<string> classIds = null;
|
|
|
- if (json.TryGetProperty("classIds", out JsonElement _classIds))
|
|
|
- {
|
|
|
- classIds = _classIds.ToObject<HashSet<string>>();
|
|
|
- }
|
|
|
- if (years.Any() && years.Count > 0)
|
|
|
- {
|
|
|
- var gradeData = await OverallEducationService.GetGradeData(client, years, $"{_periodId}", $"{_school}", classIds, $"{_studyYear}", $"{_semesterId}", _azureRedis);
|
|
|
- classes=gradeData.classes;
|
|
|
- students=gradeData.students;
|
|
|
- grade_classes = gradeData.grade_classes;
|
|
|
- grade_students=gradeData.grade_students;
|
|
|
- grade_overallEducations = gradeData.overallEducations;
|
|
|
- overallEducations=gradeData.overallEducations.FindAll(x=>students.Select(k=>k.id).Contains(x.studentId));
|
|
|
- }
|
|
|
- #endregion
|
|
|
- #region
|
|
|
- double dataCount = 0;
|
|
|
- double sports_count90 = 0;
|
|
|
- double sports_count60 = 0;
|
|
|
- double sports_count = 0;
|
|
|
- double art_count90 = 0;
|
|
|
- double art_count60 = 0;
|
|
|
- double art_count = 0;
|
|
|
- double intelligence_count90 = 0;
|
|
|
- double intelligence_count60 = 0;
|
|
|
- double intelligence_count = 0;
|
|
|
- double labour_count90 = 0;
|
|
|
- double labour_count60 = 0;
|
|
|
- double labour_count = 0;
|
|
|
- double virtue_count90 = 0;
|
|
|
- double virtue_count60 = 0;
|
|
|
- double virtue_count = 0;
|
|
|
- double rate90 = 0;
|
|
|
- double rate60 = 0;
|
|
|
- double activityCount = 0;
|
|
|
- #endregion
|
|
|
+ if (int.TryParse($"{_studentYear}", out int studentYear))
|
|
|
+ {
|
|
|
+ years.Add(studentYear);
|
|
|
+ }
|
|
|
+ if (!years.Any())
|
|
|
+ {
|
|
|
+ var period = school.period.Find(z => z.id.Equals($"{_periodId}"));
|
|
|
+ if (period != null && period.grades.IsNotEmpty())
|
|
|
+ {
|
|
|
+ List<int> grades = new List<int>();
|
|
|
+ period.grades.Select((z, index) => index).ToList().ForEach(t => { grades.Add(t); });
|
|
|
+ var yearsdata = SchoolService.GetYears(school, $"{_periodId}", grades);
|
|
|
+ years = yearsdata.years;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ List<Class> classes = new List<Class>();
|
|
|
+ List<Student> students = new List<Student>();
|
|
|
+ List<Class> grade_classes = new List<Class>();
|
|
|
+ List<Student> grade_students = new List<Student>();
|
|
|
+ List<OverallEducation> grade_overallEducations = new List<OverallEducation>();
|
|
|
+ List<OverallEducation> overallEducations = new List<OverallEducation>();
|
|
|
+ HashSet<string> classIds = null;
|
|
|
+ //标记是否是下钻到班级
|
|
|
+ bool isClass = false;
|
|
|
+ if (json.TryGetProperty("classIds", out JsonElement _classIds))
|
|
|
+ {
|
|
|
+ classIds = _classIds.ToObject<HashSet<string>>();
|
|
|
+ if (classIds != null && classIds.Count > 0)
|
|
|
+ {
|
|
|
+ isClass = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (years.Any() && years.Count > 0)
|
|
|
+ {
|
|
|
+ var gradeData = await OverallEducationService.GetGradeData(client, years, $"{_periodId}", $"{_school}", classIds, $"{_studyYear}", $"{_semesterId}", _azureRedis);
|
|
|
+ classes = gradeData.classes;
|
|
|
+ students = gradeData.students;
|
|
|
+ grade_classes = gradeData.grade_classes;
|
|
|
+ grade_students = gradeData.grade_students;
|
|
|
+ grade_overallEducations = gradeData.overallEducations;
|
|
|
+ overallEducations = gradeData.overallEducations.FindAll(x => students.Select(k => k.id).Contains(x.studentId));
|
|
|
+ }
|
|
|
+ #endregion
|
|
|
+
|
|
|
|
|
|
- List<(double score, OverallEducation student, string className, string picture)> ranking = new List<(double score, OverallEducation student, string className, string picture)>();
|
|
|
- List<(string classId, string className, double last, double best, double sum, double avg, int count)> classDatas = new List<(string classId, string className, double last, double best, double sum, double avg, int count)>();
|
|
|
- if (overallEducations.IsNotEmpty()) {
|
|
|
- dataCount = overallEducations.Count();
|
|
|
+ List<(double score, OverallEducation student, string className, string picture)> ranking = new List<(double score, OverallEducation student, string className, string picture)>();
|
|
|
+ List<(string classId, string className, double last, double best, double sum, double avg, int count)> classDatas = new List<(string classId, string className, double last, double best, double sum, double avg, int count)>();
|
|
|
//pr计算 100 - (100 * (index + 1) - 50) / stuCount; index 整体排名 stuCount 总人数
|
|
|
- }
|
|
|
- double basic_Score = 60;
|
|
|
- if (schoolSetting?.overallEducationSetting?.overallEducationInit!=null && schoolSetting?.overallEducationSetting?.overallEducationInit >= 0) {
|
|
|
- basic_Score = schoolSetting.overallEducationSetting.overallEducationInit;
|
|
|
- }
|
|
|
- var hasData_labour = grade_overallEducations.Where(x => x.labour.Count > 0);
|
|
|
- double max_labour = 0;
|
|
|
- double min_labour = 0;
|
|
|
- if (schoolSetting.overallEducationSetting.labour.Equals("sum"))
|
|
|
- {
|
|
|
- var data = hasData_labour.Select(x => new { score = x.labour.Sum(x => x.sumScore) , studentId = x.studentId });
|
|
|
- max_labour = data.Max(z => z.score);
|
|
|
- min_labour = data.Min(z => z.score);
|
|
|
- }
|
|
|
- var hasData_virtue = grade_overallEducations.Where(x => x.virtue.Count > 0);
|
|
|
- double max_virtue = 0;
|
|
|
- double min_virtue = 0;
|
|
|
+ double basic_Score = 60;
|
|
|
+ if (schoolSetting?.overallEducationSetting?.overallEducationInit != null && schoolSetting?.overallEducationSetting?.overallEducationInit >= 0)
|
|
|
+ {
|
|
|
+ basic_Score = schoolSetting.overallEducationSetting.overallEducationInit;
|
|
|
+ }
|
|
|
+ var hasData_labour = grade_overallEducations.Where(x => x.labour.Count > 0);
|
|
|
+ double max_labour = 0;
|
|
|
+ double min_labour = 0;
|
|
|
|
|
|
- if (schoolSetting.overallEducationSetting.virtue.Equals("sum"))
|
|
|
- {
|
|
|
- var data = hasData_virtue.Select(x =>new { score = x.virtue.Sum(x => x.sumScore) , studentId = x.studentId });
|
|
|
- max_virtue = data.Max(z => z.score);
|
|
|
- min_virtue = data.Min(z => z.score);
|
|
|
- }
|
|
|
- var hasData_lesson = grade_overallEducations.Where(x => x.lessonScore.Count > 0);
|
|
|
- double max_lesson_gscore = 0;
|
|
|
- double max_lesson_pscore = 0;
|
|
|
- double max_lesson_tscore = 0;
|
|
|
-
|
|
|
- double min_lesson_gscore = 0;
|
|
|
- double min_lesson_pscore = 0;
|
|
|
- double min_lesson_tscore = 0;
|
|
|
- if (schoolSetting.overallEducationSetting.art.Equals("sum"))
|
|
|
- {
|
|
|
- var gdata = hasData_lesson.Select(x => new { score = x.lessonScore.Sum(x => x.gscore), studentId = x.studentId });
|
|
|
- max_lesson_gscore = gdata.Max(z => z.score);
|
|
|
- min_lesson_gscore = gdata.Min(z => z.score);
|
|
|
- var pdata = hasData_lesson.Select(x => new { score = x.lessonScore.Sum(x => x.pscore), studentId = x.studentId });
|
|
|
- max_lesson_pscore = pdata.Max(z => z.score);
|
|
|
- min_lesson_pscore = pdata.Min(z => z.score);
|
|
|
- var tdata = hasData_lesson.Select(x => new { score = x.lessonScore.Sum(x => x.tscore), studentId = x.studentId });
|
|
|
- max_lesson_tscore = tdata.Max(z => z.score);
|
|
|
- min_lesson_tscore = tdata.Min(z => z.score);
|
|
|
- }
|
|
|
- foreach (var item in overallEducations) {
|
|
|
- DimensionScore dimensionScore = new DimensionScore() { studentId=item.semesterId,classId=item.classId};
|
|
|
- if (item.sports.IsNotEmpty())
|
|
|
- { //体育
|
|
|
- if (schoolSetting.overallEducationSetting.sports.Equals("avg"))
|
|
|
+ var order_labour = hasData_labour.Select(x => new { score = x.labour.Sum(x => x.sumScore), studentId = x.studentId }).OrderByDescending(x => x.score).ToList();
|
|
|
+ max_labour = order_labour.Max(z => z.score);
|
|
|
+ min_labour = order_labour.Min(z => z.score);
|
|
|
+
|
|
|
+ var hasData_virtue = grade_overallEducations.Where(x => x.virtue.Count > 0);
|
|
|
+ double max_virtue = 0;
|
|
|
+ double min_virtue = 0;
|
|
|
+
|
|
|
+ var order_virtue = hasData_virtue.Select(x => new { score = x.virtue.Sum(x => x.sumScore), studentId = x.studentId }).OrderByDescending(x => x.score).ToList();
|
|
|
+ max_virtue = order_virtue.Max(z => z.score);
|
|
|
+ min_virtue = order_virtue.Min(z => z.score);
|
|
|
+
|
|
|
+ var hasData_lesson = grade_overallEducations.Where(x => x.lessonScore.Count > 0);
|
|
|
+ double max_lesson_gscore = 0;
|
|
|
+ double max_lesson_pscore = 0;
|
|
|
+ double max_lesson_tscore = 0;
|
|
|
+
|
|
|
+ double min_lesson_gscore = 0;
|
|
|
+ double min_lesson_pscore = 0;
|
|
|
+ double min_lesson_tscore = 0;
|
|
|
+ var order_gdata = hasData_lesson.Select(x => new { score = x.lessonScore.Sum(x => x.gscore), studentId = x.studentId }).OrderByDescending(x => x.score).ToList();
|
|
|
+ max_lesson_gscore = order_gdata.Max(z => z.score);
|
|
|
+ min_lesson_gscore = order_gdata.Min(z => z.score);
|
|
|
+ var order_pdata = hasData_lesson.Select(x => new { score = x.lessonScore.Sum(x => x.pscore), studentId = x.studentId }).OrderByDescending(x => x.score).ToList();
|
|
|
+ max_lesson_pscore = order_pdata.Max(z => z.score);
|
|
|
+ min_lesson_pscore = order_pdata.Min(z => z.score);
|
|
|
+ var order_tdata = hasData_lesson.Select(x => new { score = x.lessonScore.Sum(x => x.tscore), studentId = x.studentId }).OrderByDescending(x => x.score).ToList();
|
|
|
+ max_lesson_tscore = order_tdata.Max(z => z.score);
|
|
|
+ min_lesson_tscore = order_tdata.Min(z => z.score);
|
|
|
+ List<StudentDimensionScore> grade_dimensions = new List<StudentDimensionScore>();
|
|
|
+ //全年级的数据
|
|
|
+ foreach (var item in grade_overallEducations)
|
|
|
+ {
|
|
|
+ var student = students.Find(x => x.id.Equals(item.studentId));
|
|
|
+ StudentDimensionScore dimensionScore = new StudentDimensionScore() { studentId = item.studentId, classId = item.classId, studentName = student?.name, picture = student?.picture };
|
|
|
+ //排名指数计算=( 当前值分数- 298) / (9992 - 298) * (99 - 60) + 60
|
|
|
+ //将每个人的积分转化为60-100
|
|
|
+ //排名 = (积分 - 最低积分) / (最高积分 - 最低积分) * (最大排名 - 最小排名) + 最小排名
|
|
|
+ //劳动
|
|
|
+ var labour = order_labour.Find(x => x.studentId.Equals(item.studentId));
|
|
|
+ var labour_score = basic_Score;
|
|
|
+ if (labour != null && labour.score > 0 && max_labour - min_labour>0)
|
|
|
{
|
|
|
- double sumScore = item.sports.Average(x => x.sumScore);
|
|
|
- double totalScore = item.sports.Average(x => x.totalScore);
|
|
|
- if (totalScore > 0)
|
|
|
- {
|
|
|
- dimensionScore.sports = sumScore * 1.0 / totalScore;
|
|
|
- }
|
|
|
- else {
|
|
|
- dimensionScore.sports = sumScore * 1.0 / item.sports.Count;
|
|
|
- }
|
|
|
+ labour_score = (labour.score - min_labour) / (max_labour - min_labour) * (99 - basic_Score) + basic_Score;
|
|
|
}
|
|
|
- else if (schoolSetting.overallEducationSetting.sports.Equals("newest"))
|
|
|
+ dimensionScore.labour = labour_score;
|
|
|
+ //德育
|
|
|
+ var virtue = order_virtue.Find(x => x.studentId.Equals(item.studentId));
|
|
|
+ var virtue_score = basic_Score;
|
|
|
+ if (virtue != null && virtue.score > 0 && max_virtue - min_virtue>0)
|
|
|
{
|
|
|
- double sumScore = item.sports.OrderByDescending(x => x.examDate).First().sumScore;
|
|
|
- double totalScore = item.sports.OrderByDescending(x => x.examDate).First().totalScore;
|
|
|
- if (totalScore > 0)
|
|
|
+ virtue_score = (virtue.score - min_virtue) / (max_virtue - min_virtue) * (99 - basic_Score) + basic_Score;
|
|
|
+ }
|
|
|
+ dimensionScore.virtue = virtue_score;
|
|
|
+
|
|
|
+ //合作
|
|
|
+ var gdata = order_gdata.Find(x => x.studentId.Equals(item.studentId));
|
|
|
+ var gdata_score = basic_Score;
|
|
|
+ if (gdata != null && gdata.score > 0 && max_lesson_gscore - min_lesson_gscore>0)
|
|
|
+ {
|
|
|
+ gdata_score = (gdata.score - min_lesson_gscore) / (max_lesson_gscore - min_lesson_gscore) * (99 - basic_Score) + basic_Score;
|
|
|
+ }
|
|
|
+ dimensionScore.gscore = gdata_score;
|
|
|
+ //态度
|
|
|
+ var tdata = order_tdata.Find(x => x.studentId.Equals(item.studentId));
|
|
|
+ var tdata_score = basic_Score;
|
|
|
+ if (tdata != null && tdata.score > 0 && max_lesson_tscore - min_lesson_tscore>0)
|
|
|
+ {
|
|
|
+ tdata_score = (tdata.score - min_lesson_tscore) / (max_lesson_tscore - min_lesson_tscore) * (99 - basic_Score) + basic_Score;
|
|
|
+ }
|
|
|
+ dimensionScore.tscore = tdata_score;
|
|
|
+ //能力
|
|
|
+ var pdata = order_pdata.Find(x => x.studentId.Equals(item.studentId));
|
|
|
+ var pdata_score = basic_Score;
|
|
|
+ if (pdata != null && pdata.score > 0 && max_lesson_pscore - min_lesson_pscore>0)
|
|
|
+ {
|
|
|
+ pdata_score = (pdata.score - min_lesson_pscore) / (max_lesson_pscore - min_lesson_pscore) * (99 - basic_Score) + basic_Score;
|
|
|
+ }
|
|
|
+ dimensionScore.pscore = pdata_score;
|
|
|
+ double intelligence = basic_Score;
|
|
|
+ if (item.intelligence.IsNotEmpty())
|
|
|
+ {
|
|
|
+ //智育
|
|
|
+ if (schoolSetting.overallEducationSetting.intelligence.Equals("avg"))
|
|
|
{
|
|
|
- dimensionScore.sports = sumScore * 1.0 / totalScore;
|
|
|
+ double sumScore = item.intelligence.Average(x => x.sumScore);
|
|
|
+ double totalScore = item.intelligence.Average(x => x.totalScore);
|
|
|
+ if (totalScore > 0)
|
|
|
+ {
|
|
|
+ intelligence = sumScore * 1.0 / totalScore * 100;
|
|
|
+
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ intelligence = sumScore * 1.0 / item.intelligence.Count;
|
|
|
+ }
|
|
|
}
|
|
|
- else
|
|
|
+ }
|
|
|
+ dimensionScore.exam = intelligence;
|
|
|
+ //态度
|
|
|
+ double attitude = 0.1;
|
|
|
+ //合作
|
|
|
+ double cooperate = 0.1;
|
|
|
+ //能力
|
|
|
+ double ability = 0.1;
|
|
|
+ //水平
|
|
|
+ double standard = 0.7;
|
|
|
+ var attitudeWeight = schoolSetting.overallEducationSetting.intelligenceWeight.Find(x => x.code.Equals("attitude"));
|
|
|
+ attitude = attitudeWeight != null ? attitudeWeight.value : attitude;
|
|
|
+ var cooperateWeight = schoolSetting.overallEducationSetting.intelligenceWeight.Find(x => x.code.Equals("cooperate"));
|
|
|
+ cooperate = cooperateWeight != null ? cooperateWeight.value : cooperate;
|
|
|
+ var abilityWeight = schoolSetting.overallEducationSetting.intelligenceWeight.Find(x => x.code.Equals("ability"));
|
|
|
+ ability = abilityWeight != null ? abilityWeight.value : ability;
|
|
|
+ var standardWeight = schoolSetting.overallEducationSetting.intelligenceWeight.Find(x => x.code.Equals("standard"));
|
|
|
+ standard = standardWeight != null ? standardWeight.value : standard;
|
|
|
+ dimensionScore.intelligence = intelligence * standard + pdata_score * ability + tdata_score * attitude + gdata_score * cooperate;
|
|
|
+ if (item.sports.IsNotEmpty())
|
|
|
+ { //体育
|
|
|
+ if (schoolSetting.overallEducationSetting.sports.Equals("newest"))
|
|
|
{
|
|
|
- dimensionScore.sports = sumScore * 1.0 / item.sports.Count;
|
|
|
+ double sumScore = item.sports.OrderByDescending(x => x.examDate).First().sumScore;
|
|
|
+ double totalScore = item.sports.OrderByDescending(x => x.examDate).First().totalScore;
|
|
|
+ if (totalScore > 0)
|
|
|
+ {
|
|
|
+ dimensionScore.sports = sumScore * 1.0 / totalScore * 100;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ dimensionScore.sports = sumScore * 1.0 / item.sports.Count;
|
|
|
+ }
|
|
|
}
|
|
|
+ else { dimensionScore.sports = basic_Score; }
|
|
|
}
|
|
|
- else if (schoolSetting.overallEducationSetting.sports.Equals("sum"))
|
|
|
+ else
|
|
|
{
|
|
|
- double sumScore = item.sports.Sum(x => x.sumScore);
|
|
|
- double totalScore = item.sports.Sum(x => x.totalScore);
|
|
|
- if (totalScore > 0)
|
|
|
+ dimensionScore.sports = basic_Score;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (item.art.IsNotEmpty())
|
|
|
+ {
|
|
|
+ //艺术
|
|
|
+ if (schoolSetting.overallEducationSetting.art.Equals("newest"))
|
|
|
{
|
|
|
- dimensionScore.sports = sumScore * 1.0 / totalScore;
|
|
|
+ var art = item.art.OrderByDescending(x => x.examDate).First();
|
|
|
+ double sumScore = art.sumScore;
|
|
|
+ double totalScore = art.totalScore;
|
|
|
+ if (totalScore > 0)
|
|
|
+ {
|
|
|
+ dimensionScore.art = sumScore * 1.0 / totalScore * 100;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ dimensionScore.art = sumScore * 1.0 / item.art.Count;
|
|
|
+ }
|
|
|
+ var subject_music = art.itemScore.Find(x => x.id.Equals("subject_music"));
|
|
|
+ var subject_painting = art.itemScore.Find(x => x.id.Equals("subject_painting"));
|
|
|
+ if (subject_music != null)
|
|
|
+ {
|
|
|
+ dimensionScore.subject_music = subject_music.score * 1.0 / subject_music.totalScore *100;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ dimensionScore.subject_music = 0;
|
|
|
+ }
|
|
|
+ if (subject_painting != null)
|
|
|
+ {
|
|
|
+ dimensionScore.subject_painting = subject_painting.score * 1.0 / subject_painting.totalScore *100;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ dimensionScore.subject_painting = 0;
|
|
|
+ }
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- dimensionScore.sports = sumScore * 1.0 / item.sports.Count;
|
|
|
+ dimensionScore.art = basic_Score;
|
|
|
}
|
|
|
}
|
|
|
+ else
|
|
|
+ {
|
|
|
+ dimensionScore.art = basic_Score;
|
|
|
+ }
|
|
|
+ dimensionScore.score = (dimensionScore.virtue + dimensionScore.intelligence + dimensionScore.labour + dimensionScore.art + dimensionScore.sports) / 5;
|
|
|
+ schoolSetting.overallEducationSetting.reviewLevel.ForEach(z => {
|
|
|
+ if (z.value[0] <= dimensionScore.score && z.value[1] > dimensionScore.score)
|
|
|
+ {
|
|
|
+ dimensionScore.level = z.code;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ grade_dimensions.Add(dimensionScore);
|
|
|
}
|
|
|
- else {
|
|
|
- dimensionScore.sports = basic_Score;
|
|
|
+ //处理年级排名
|
|
|
+ grade_dimensions.OrderByDescending(x => x.score).Select((z, index) => z.gradeRanking = (index + 1));
|
|
|
+ var group_class_dimensions = grade_dimensions.GroupBy(z => z.classId).Select(z => new { key = z.Key, list = z });
|
|
|
+ foreach (var classData in group_class_dimensions)
|
|
|
+ {
|
|
|
+ var classRanking = classData.list.OrderByDescending(x => x.score).Select((z, index) => z.classRanking = (index + 1));
|
|
|
}
|
|
|
+ // group_class_dimensions.ForEach(x=>x)
|
|
|
+ List<StudentDimensionScore> dimensions = new List<StudentDimensionScore>();
|
|
|
|
|
|
- if (item.intelligence.IsNotEmpty())
|
|
|
- {
|
|
|
- //智育
|
|
|
- if (schoolSetting.overallEducationSetting.intelligence.Equals("avg"))
|
|
|
- {
|
|
|
- double sumScore = item.sports.Average(x => x.sumScore);
|
|
|
- double totalScore = item.sports.Average(x => x.totalScore);
|
|
|
- }
|
|
|
- else if (schoolSetting.overallEducationSetting.intelligence.Equals("newest"))
|
|
|
- {
|
|
|
|
|
|
- }
|
|
|
- else if (schoolSetting.overallEducationSetting.intelligence.Equals("sum"))
|
|
|
+
|
|
|
+ //当前条件的数据
|
|
|
+ foreach (var item in overallEducations)
|
|
|
+ {
|
|
|
+ var dimension = grade_dimensions.Find(x => x.studentId.Equals(item.studentId));
|
|
|
+ if (dimension != null)
|
|
|
{
|
|
|
+ dimensions.Add(dimension);
|
|
|
}
|
|
|
}
|
|
|
- else {
|
|
|
- dimensionScore.intelligence = basic_Score;
|
|
|
- }
|
|
|
- if (item.art.IsNotEmpty()) {
|
|
|
- //艺术
|
|
|
- if (schoolSetting.overallEducationSetting.art.Equals("avg"))
|
|
|
- {
|
|
|
+ var class_dimensions = dimensions.GroupBy(z => z.classId).Select(z => new { key = z.Key, list = z });
|
|
|
+ List<dynamic> classDimensions = new List<dynamic>();
|
|
|
+ List<AchievementScore> achievementScores = new List<AchievementScore>();
|
|
|
|
|
|
- }
|
|
|
- else if (schoolSetting.overallEducationSetting.art.Equals("newest"))
|
|
|
+ foreach (var classData in class_dimensions)
|
|
|
+ {
|
|
|
+ ClassDimensionScore classDimensionScore = new ClassDimensionScore() { classId = classData.key };
|
|
|
+ var clazz = classes.Find(x => x.id.Equals(classData.key));
|
|
|
+ classDimensionScore.className = clazz?.name;
|
|
|
+ classDimensionScore.max = classData.list.Max(x => x.score);
|
|
|
+ classDimensionScore.min = classData.list.Min(x => x.score);
|
|
|
+ classDimensionScore.score = classData.list.Average(x => x.score);
|
|
|
+ classDimensionScore.pscore = classData.list.Average(x => x.pscore);
|
|
|
+ classDimensionScore.tscore = classData.list.Average(x => x.tscore);
|
|
|
+ classDimensionScore.gscore = classData.list.Average(x => x.gscore);
|
|
|
+ if (!isClass)
|
|
|
{
|
|
|
+ achievementScores.Add(new AchievementScore
|
|
|
+ {
|
|
|
+ gscore = classDimensionScore.gscore,
|
|
|
+ pscore = classDimensionScore.pscore,
|
|
|
+ tscore = classDimensionScore.tscore,
|
|
|
+ id = classData.key,
|
|
|
+ name = clazz?.name,
|
|
|
+ type = "class"
|
|
|
+ });
|
|
|
}
|
|
|
- else if (schoolSetting.overallEducationSetting.art.Equals("sum"))
|
|
|
- {
|
|
|
+ schoolSetting.overallEducationSetting.reviewLevel.ForEach(z => {
|
|
|
+ if (z.value[0] <= classDimensionScore.score && z.value[1] > classDimensionScore.score)
|
|
|
+ {
|
|
|
+ classDimensionScore.level = z.code;
|
|
|
+ }
|
|
|
+ });
|
|
|
|
|
|
- }
|
|
|
+ classDimensions.Add(classDimensionScore);
|
|
|
+ }
|
|
|
+ double pscore_avg = 0;
|
|
|
+ double tscore_avg = 0;
|
|
|
+ double gscore_avg = 0;
|
|
|
+ if (isClass)
|
|
|
+ {
|
|
|
+ //能力年级平均分
|
|
|
+ pscore_avg = dimensions.Average(x => x.pscore);
|
|
|
+ //态度年级平均分
|
|
|
+ tscore_avg = dimensions.Average(x => x.tscore);
|
|
|
+ //合作年级平均分
|
|
|
+ gscore_avg = dimensions.Average(x => x.gscore);
|
|
|
+ var studentAchievementScores = dimensions.Select(z => new AchievementScore { id = z.studentId, name = z.studentName, gscore = z.gscore, pscore = z.pscore, tscore = z.tscore, type = "student" });
|
|
|
+ achievementScores.AddRange(studentAchievementScores);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- dimensionScore.art = basic_Score;
|
|
|
+ //能力年级平均分
|
|
|
+ pscore_avg = grade_dimensions.Average(x => x.pscore);
|
|
|
+ //态度年级平均分
|
|
|
+ tscore_avg = grade_dimensions.Average(x => x.tscore);
|
|
|
+ //合作年级平均分
|
|
|
+ gscore_avg = grade_dimensions.Average(x => x.gscore);
|
|
|
}
|
|
|
+ #region
|
|
|
+ double data_count = overallEducations.Count;
|
|
|
+ double sports_count90 = data_count > 0 ? dimensions.Where(x => x.sports >= 90).Count() * 1.0 / data_count : 0;
|
|
|
+ double sports_count60 = data_count > 0 ? dimensions.Where(x => x.sports >= 60).Count() * 1.0 / data_count : 0;
|
|
|
+
|
|
|
+ double art_count90 = data_count > 0 ? dimensions.Where(x => x.art >= 90).Count() * 1.0 / data_count : 0;
|
|
|
+ double art_count60 = data_count > 0 ? dimensions.Where(x => x.art >= 60).Count() * 1.0 / data_count : 0;
|
|
|
+
|
|
|
+ double subject_music_count90 = data_count > 0 ? dimensions.Where(x => x.subject_music >= 90).Count() * 1.0 / data_count : 0;
|
|
|
+ double subject_music_count60 = data_count > 0 ? dimensions.Where(x => x.subject_music >= 60).Count() * 1.0 / data_count : 0;
|
|
|
+
|
|
|
+ double subject_painting_count90 = data_count > 0 ? dimensions.Where(x => x.subject_painting >= 90).Count() * 1.0 / data_count : 0;
|
|
|
+ double subject_painting_count60 = data_count > 0 ? dimensions.Where(x => x.subject_painting >= 60).Count() * 1.0 / data_count : 0;
|
|
|
+
|
|
|
+ double labour_count90 = data_count > 0 ? dimensions.Where(x => x.labour >= 90).Count() * 1.0 / data_count : 0;
|
|
|
+ double labour_count60 = data_count > 0 ? dimensions.Where(x => x.labour >= 60).Count() * 1.0 / data_count : 0;
|
|
|
+
|
|
|
+ double virtue_count90 = data_count > 0 ? dimensions.Where(x => x.virtue >= 90).Count() * 1.0 / data_count : 0;
|
|
|
+ double virtue_count60 = data_count > 0 ? dimensions.Where(x => x.virtue >= 60).Count() * 1.0 / data_count : 0;
|
|
|
+
|
|
|
+ double rate90 = data_count > 0 ? dimensions.Where(x => x.score >= 90).Count() * 1.0 / data_count : 0;
|
|
|
+ double rate60 = data_count > 0 ? dimensions.Where(x => x.score >= 60).Count() * 1.0 / data_count : 0;
|
|
|
+ #endregion
|
|
|
+ return Ok(new
|
|
|
+ {
|
|
|
+ achievementScores,
|
|
|
+ pscore_avg,
|
|
|
+ tscore_avg,
|
|
|
+ gscore_avg,
|
|
|
+ classDimensions,
|
|
|
+ dimensions,
|
|
|
+ data_count,
|
|
|
+ classCount = classes.Count,
|
|
|
+ rate90,
|
|
|
+ rate60,
|
|
|
+ sports_count60,
|
|
|
+ sports_count90,
|
|
|
+ art_count60,
|
|
|
+ art_count90,
|
|
|
+ labour_count60,
|
|
|
+ labour_count90,
|
|
|
+ virtue_count60,
|
|
|
+ virtue_count90,
|
|
|
+ subject_music_count90,
|
|
|
+ subject_music_count60,
|
|
|
+ subject_painting_count90,
|
|
|
+ subject_painting_count60
|
|
|
+ });
|
|
|
+ }
|
|
|
+ catch (Exception ex)
|
|
|
+ {
|
|
|
+ await _dingDing.SendBotMsg($"{ex.Message}\n{ex.StackTrace}",GroupNames.成都开发測試群組);
|
|
|
+
|
|
|
}
|
|
|
return Ok();
|
|
|
}
|
|
|
- //排名指数计算=( 当前值分数- 298) / (9992 - 298) * (99 - 60) + 60
|
|
|
- //将每个人的积分转化为60-100
|
|
|
- //排名 = (积分 - 最低积分) / (最高积分 - 最低积分) * (最大排名 - 最小排名) + 最小排名
|
|
|
- public class DimensionScore
|
|
|
+ /// <summary>
|
|
|
+ /// 素养
|
|
|
+ /// </summary>
|
|
|
+
|
|
|
+ public class AchievementScore
|
|
|
+ {
|
|
|
+
|
|
|
+ //class 班级,student 学生
|
|
|
+ public string type { get; set; } = "class";
|
|
|
+ /// <summary>
|
|
|
+ /// 班级名称 或者学生姓名
|
|
|
+ /// </summary>
|
|
|
+ public string name { get; set; }
|
|
|
+ /// <summary>
|
|
|
+ /// 班级id 或者学生id
|
|
|
+ /// </summary>
|
|
|
+ public string id { get; set; }
|
|
|
+ public double gscore { get; set; }
|
|
|
+ public double pscore { get; set; }
|
|
|
+ public double tscore { get; set; }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ public class ClassDimensionScore
|
|
|
+ {
|
|
|
+ public string classId { get; set; }
|
|
|
+ public string className { get; set; }
|
|
|
+ public double score { get; set; }
|
|
|
+
|
|
|
+ public double gscore { get; set; }
|
|
|
+ public double pscore { get; set; }
|
|
|
+ public double tscore { get; set; }
|
|
|
+ public double max { get; set; }
|
|
|
+ public double min { get; set; }
|
|
|
+ public string level { get; set; }
|
|
|
+ }
|
|
|
+ public class StudentDimensionScore
|
|
|
{
|
|
|
public string classId { get; set; }
|
|
|
public string studentId { get; set; }
|
|
|
+ public string studentName { get; set; }
|
|
|
+ public string picture { get; set; }
|
|
|
public double score { get; set; }
|
|
|
public double sports { get; set; }
|
|
|
public double art { get; set; }
|
|
|
+ public double subject_music { get; set; }
|
|
|
+ public double subject_painting { get; set; }
|
|
|
public double labour { get; set; }
|
|
|
public double intelligence { get; set; }
|
|
|
public double virtue { get; set; }
|
|
|
- public double lesson { get; set; }
|
|
|
+ public double exam { get; set; }
|
|
|
+ public double gscore { get; set; }
|
|
|
+ public double pscore { get; set; }
|
|
|
+ public double tscore { get; set; }
|
|
|
+ public int classRanking { get; set; }
|
|
|
+ public int gradeRanking { get; set; }
|
|
|
+ public string level { get; set; }
|
|
|
}
|
|
|
|
|
|
/*
|