123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888 |
- using Microsoft.Azure.Cosmos;
-
- using MathNet.Numerics.Distributions;
- using Microsoft.AspNetCore.Authorization;
- using Microsoft.AspNetCore.Http;
- using Microsoft.AspNetCore.Mvc;
- using Microsoft.Azure.Amqp.Framing;
- using Microsoft.Extensions.Configuration;
- using Microsoft.Extensions.Options;
- using Microsoft.OData.Edm;
- using System;
- using System.Collections.Generic;
- using System.Dynamic;
- using System.Linq;
- using System.Reflection;
- using System.Security.Claims;
- using System.Text;
- using System.Text.Json;
- using System.Threading.Tasks;
- using TEAMModelOS.Filter;
- using TEAMModelOS.Models;
- using TEAMModelOS.SDK;
- using TEAMModelOS.SDK.DI;
- using TEAMModelOS.SDK.Extension;
- using TEAMModelOS.SDK.Models;
- using TEAMModelOS.SDK.Models.Cosmos;
- using TEAMModelOS.SDK.Models.Cosmos.Common;
- using TEAMModelOS.SDK.Models.Service;
- using TEAMModelOS.SDK.Services;
- using static TEAMModelOS.Controllers.OverallEducationController;
- using static TEAMModelOS.SDK.Models.Cosmos.Student.StudentAnalysis;
- using static TEAMModelOS.SDK.Services.ActivityStudentService;
- namespace TEAMModelOS.Controllers
- {
- /// <summary>
- /// 学生五育画像接口
- /// </summary>
- [Route("overall-education")]
- [ApiController]
- public class OverallEducationController : ControllerBase
- {
- private readonly AzureCosmosFactory _azureCosmos;
- private readonly AzureStorageFactory _azureStorage;
- private readonly AzureRedisFactory _azureRedis;
- private readonly DingDing _dingDing;
- private readonly Option _option;
- private readonly IConfiguration _configuration;
- private readonly CoreAPIHttpService _coreAPIHttpService;
- private readonly AzureServiceBusFactory _serviceBus;
- private readonly SnowflakeId _snowflakeId;
- public OverallEducationController(AzureCosmosFactory azureCosmos, AzureStorageFactory azureStorage, AzureRedisFactory azureRedis, AzureServiceBusFactory serviceBus, DingDing dingDing, CoreAPIHttpService coreAPIHttpService, IOptionsSnapshot<Option> option, IConfiguration configuration, SnowflakeId snowflakeId)
- {
- _azureCosmos = azureCosmos;
- _azureStorage = azureStorage;
- _azureRedis = azureRedis;
- _dingDing = dingDing;
- _option = option?.Value;
- _configuration = configuration;
- _coreAPIHttpService = coreAPIHttpService;
- _serviceBus = serviceBus;
- _snowflakeId = snowflakeId;
- }
- /// <summary>
- /// 获取看板的基本条件
- /// </summary>
- /// <param name="json"></param>
- /// <returns></returns>
- [HttpPost("overview-cond")]
- [AuthToken(Roles = "teacher,admin")]
- [Authorize(Roles = "IES")]
- public async Task<IActionResult> OverviewCond(JsonElement json)
- {
- json.TryGetProperty("schoolId", out JsonElement schoolId);
- json.TryGetProperty("periodId", out JsonElement periodId);
- var client = _azureCosmos.GetCosmosClient();
- StringBuilder classsql = new StringBuilder($"SELECT count(1) FROM c where ( c.graduate = 0 or IS_DEFINED(c.graduate) = false )");
- if (!string.IsNullOrEmpty($"{periodId}"))
- {
- classsql.Append($" and c.periodId='{periodId}' ");
- }
- await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIteratorSql<ClassInfo>(queryText: classsql.ToString(),
- requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Class-{schoolId}") }))
- {
- }
- return Ok();
- }
-
- [HttpPost("overview")]
- #if !DEBUG
- [AuthToken(Roles = "teacher,admin")]
- [Authorize(Roles = "IES")]
- #endif
- public async Task<IActionResult> Overview(JsonElement json)
- {
- 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);
- json.TryGetProperty("studentId", out JsonElement _studentId);
- 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 = new HashSet<string>();
- 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))
- {
- if (!string.IsNullOrWhiteSpace($"{_studentId}"))
- {
- Student student= await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Student).ReadItemAsync<Student>($"{_studentId}", new PartitionKey($"Base-{school.id}"));
- Class classz = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).ReadItemAsync<Class>($"{student.classId}", new PartitionKey($"Class-{school.id}"));
- years.Add(classz.year);
- }
- else {
- years.Add(studentYear);
- }
- }
- Period period = school.period.Find(z => z.id.Equals($"{_periodId}")); ;
- Semester semester = period.semesters.Find(x => x.id.Equals($"{_semesterId}"));
- if (!years.Any())
- {
- 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;
- }
- }
-
- //标记是否是下钻到班级
- bool isClass = false;
- if (json.TryGetProperty("classIds", out JsonElement _classIds))
- {
- classIds = _classIds.ToObject<HashSet<string>>();
- if (classIds != null && classIds.Count > 0)
- {
- isClass = true;
- }
- }
- if (!string.IsNullOrWhiteSpace($"{_studentId}")) {
-
- ResponseMessage response= await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Student).ReadItemStreamAsync($"{_studentId}", new PartitionKey($"Base-{school.id}"));
- if (response.StatusCode==System.Net.HttpStatusCode.OK) {
- Student student= JsonDocument.Parse(response.Content).RootElement.Deserialize<Student>();
- if (student != null && !string.IsNullOrWhiteSpace(student.classId)) {
- classIds.Add(student.classId);
- 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)>();
- //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 (hasData_labour != null && hasData_labour.Any())
- {
- 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;
- if (hasData_virtue != null && hasData_virtue.Any()) {
- 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;
- if (hasData_lesson != null && hasData_lesson.Any()) {
- 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));
- var clazz = classes.Find(x => x.id.Equals(item.classId));
- StudentDimensionScore dimensionScore = new StudentDimensionScore() { studentId = item.studentId,className=clazz?.name, classId = item.classId, studentName = student?.name, picture = student?.picture };
- StudentDimensionScoreDefault dimensionScoreDefault = new StudentDimensionScoreDefault { studentId=item.studentId };
- //排名指数计算=( 当前值分数- 298) / (9992 - 298) * (99 - 60) + 60
- //将每个人的积分转化为60-100
- //排名 = (积分 - 最低积分) / (最高积分 - 最低积分) * (最大排名 - 最小排名) + 最小排名
- //劳动
- var order_labour = hasData_labour.Select(x => new { score = x.labour.Sum(x => x.sumScore), studentId = x.studentId }).OrderByDescending(x => x.score).ToList();
- 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)
- {
- dimensionScoreDefault.labour=1;
- labour_score = Math.Round((labour.score - min_labour) / (max_labour - min_labour) * (99 - basic_Score) + basic_Score,2);
- }
- dimensionScore.labour = labour_score;
- //德育
- var order_virtue = hasData_virtue.Select(x => new { score = x.virtue.Sum(x => x.sumScore), studentId = x.studentId }).OrderByDescending(x => x.score).ToList();
- 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)
- {
- dimensionScoreDefault.virtue=1;
- virtue_score = Math.Round((virtue.score - min_virtue) / (max_virtue - min_virtue) * (99 - basic_Score) + basic_Score,2);
- }
- dimensionScore.virtue = virtue_score;
- double intelligence = basic_Score;
- if (item.intelligence.IsNotEmpty())
- {
- //智育
- //if (schoolSetting.overallEducationSetting.intelligence.Equals("avg"))
- //{
- //}
- //else {
- //}
- List<EducationScore> intelligenceScore = new List<EducationScore>();
- if (schoolSetting.overallEducationSetting.examTypes.IsNotEmpty())
- {
- var datas = item.intelligence.FindAll(z => !string.IsNullOrWhiteSpace(z.examType) && schoolSetting.overallEducationSetting.examTypes.Contains(z.examType));
- if (datas.IsNotEmpty()) {
- intelligenceScore.AddRange(datas);
- }
- }
- else {
- intelligenceScore.AddRange(item.intelligence);
- }
- if (intelligenceScore.Count>0) {
- double sumScore = intelligenceScore.Average(x => x.sumScore);
- double totalScore = intelligenceScore.Average(x => x.totalScore);
- if (totalScore > 0)
- {
- intelligence = Math.Round(sumScore * 1.0 / totalScore * 100, 2);
- }
- else
- {
- intelligence = Math.Round(sumScore * 1.0 / intelligenceScore.Count, 2);
- }
- }
- dimensionScoreDefault.intelligence=1;
- dimensionScoreDefault.exam=1;
- }
- dimensionScore.exam = intelligence;
- var order_tdata = hasData_lesson.Select(x => new { score = x.lessonScore.Sum(x => x.tscore), studentId = x.studentId }).OrderByDescending(x => x.score).ToList();
- var order_gdata = hasData_lesson.Select(x => new { score = x.lessonScore.Sum(x => x.gscore), studentId = x.studentId }).OrderByDescending(x => x.score).ToList();
- var order_pdata = hasData_lesson.Select(x => new { score = x.lessonScore.Sum(x => x.pscore), studentId = x.studentId }).OrderByDescending(x => x.score).ToList();
- //合作
- 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)
- {
- dimensionScoreDefault.gscore=1;
- dimensionScoreDefault.intelligence=1;
- gdata_score = Math.Round((gdata.score - min_lesson_gscore) / (max_lesson_gscore - min_lesson_gscore) * (99 - basic_Score) + basic_Score,2);
- }
- 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)
- {
- dimensionScoreDefault.tscore=1;
- dimensionScoreDefault.intelligence=1;
- tdata_score = Math.Round((tdata.score - min_lesson_tscore) / (max_lesson_tscore - min_lesson_tscore) * (99 - basic_Score) + basic_Score,2);
- }
- 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)
- {
- dimensionScoreDefault.pscore=1;
- dimensionScoreDefault.intelligence=1;
- pdata_score = Math.Round((pdata.score - min_lesson_pscore) / (max_lesson_pscore - min_lesson_pscore) * (99 - basic_Score) + basic_Score,2);
- }
- dimensionScore.pscore = pdata_score;
-
- //态度
- 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 = Math.Round(intelligence * standard + pdata_score * ability + tdata_score * attitude + gdata_score * cooperate, 2);
- if (item.sports.IsNotEmpty())
- { //体育
- //if (schoolSetting.overallEducationSetting.sports.Equals("newest"))
- //{
-
- //}
- //else { dimensionScore.sports = basic_Score; }
- 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 = Math.Round(sumScore * 1.0 / totalScore * 100, 2);
- }
- else
- {
- dimensionScore.sports = Math.Round(sumScore * 1.0 / item.sports.Count, 2);
- }
- dimensionScoreDefault.sports=1;
- }
- else
- {
- dimensionScore.sports = basic_Score;
- }
- if (item.art.IsNotEmpty())
- {
- //艺术
- //if (schoolSetting.overallEducationSetting.art.Equals("newest"))
- //{
-
- //}
- //else
- //{
- // dimensionScore.art = basic_Score;
- //}
- var art = item.art.OrderByDescending(x => x.examDate).First();
- double sumScore = art.sumScore;
- double totalScore = art.totalScore;
- if (totalScore > 0)
- {
- dimensionScore.art = Math.Round(sumScore * 1.0 / totalScore * 100, 2);
- }
- else
- {
- dimensionScore.art = Math.Round(sumScore * 1.0 / item.art.Count, 2);
- }
- dimensionScoreDefault.art=1;
- var subject_music = art.itemScore.Find(x => !string.IsNullOrWhiteSpace(x.id) ? x.id.Equals("subject_music") : x.type.Equals("subject_music"));
- var subject_painting = art.itemScore.Find(x => !string.IsNullOrWhiteSpace(x.id) ? x.id.Equals("subject_painting") : x.type.Equals("subject_painting"));
- if (subject_music != null)
- {
- dimensionScore.subject_music = Math.Round(subject_music.score * 1.0 / subject_music.totalScore *100, 2);
- dimensionScoreDefault.subject_music=1;
- }
- else
- {
- dimensionScore.subject_music = 0;
- }
- if (subject_painting != null)
- {
- dimensionScoreDefault.subject_painting=1;
- dimensionScore.subject_painting = Math.Round(subject_painting.score * 1.0 / subject_painting.totalScore *100, 2);
- }
- else
- {
- dimensionScore.subject_painting = 0;
- }
- }
- else
- {
- dimensionScore.art = basic_Score;
- }
- dimensionScore.score =Math.Round((dimensionScore.virtue + dimensionScore.intelligence + dimensionScore.labour + dimensionScore.art + dimensionScore.sports) / 5,2);
- schoolSetting.overallEducationSetting.reviewLevel.ForEach(z => {
- if (z.value[0] <= dimensionScore.score && z.value[1] > dimensionScore.score)
- {
- dimensionScore.level = z.code;
- }
- });
- grade_dimensions.Add(dimensionScore);
- }
- //处理年级排名
- // grade_dimensions.OrderByDescending(x => x.score).Select((z, index) => z.gradeRanking = (index + 1));
- grade_dimensions = grade_dimensions.OrderByDescending(x => x.score).ToList();
- int index = 1;
- foreach(var item in grade_dimensions)
- {
- item.gradeRanking = index;
- index++;
- }
- var group_class_dimensions = grade_dimensions.GroupBy(z => z.classId).Select(z => new { key = z.Key, list =z.OrderByDescending(x => x.score) });
- foreach (var classData in group_class_dimensions)
- {
- index = 1;
- // classData.list.OrderByDescending(x => x.score).Select((z, index) => z.classRanking = (index + 1));
- foreach (var item in classData.list)
- {
- item.classRanking = index;
- index++;
- }
- }
- // group_class_dimensions.ForEach(x=>x)
- List<StudentDimensionScore> dimensions = new List<StudentDimensionScore>();
- //当前条件的数据
- foreach (var item in overallEducations)
- {
- var dimension = grade_dimensions.Find(x => x.studentId.Equals(item.studentId));
- if (dimension != null)
- {
- var stud = students.Find(c => c.id.Equals(item.studentId));
- dimension.classId=stud.classId;
- dimensions.Add(dimension);
- }
- }
-
- 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>();
- 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 = Math.Round(classData.list.Max(x => x.score),2);
- classDimensionScore.min = Math.Round(classData.list.Min(x => x.score),2);
- classDimensionScore.score = Math.Round(classData.list.Average(x => x.score),2);
- classDimensionScore.pscore = Math.Round(classData.list.Average(x => x.pscore),2);
- classDimensionScore.tscore = Math.Round(classData.list.Average(x => x.tscore),2);
- classDimensionScore.gscore = Math.Round(classData.list.Average(x => x.gscore),2);
- classDimensionScore.exam = Math.Round(classData.list.Average(x => x.exam), 2);
- double intelligenceScore = Math.Round(classData.list.Average(x => x.intelligence), 2);
- schoolSetting.overallEducationSetting.reviewLevel.ForEach(z => {
- if (z.value[0] <= intelligenceScore && z.value[1] > intelligenceScore)
- {
- classDimensionScore.intelligenceLevel = z.code;
- }
- });
- classDimensionScore.intelligenceLevels= classData.list.GroupBy(x => x.level).Select(x => new CodeLong { code = x.Key, value = x.Count() }).ToList();
- if (!isClass)
- {
- achievementScores.Add(new AchievementScore
- {
- gscore = classDimensionScore.gscore,
- pscore = classDimensionScore.pscore,
- tscore = classDimensionScore.tscore,
- id = classData.key,
- name = clazz?.name,
- type = "class"
- });
- }
- 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;
- //年级
- double grade_pscore_avg = 0;
- double grade_tscore_avg = 0;
- double grade_gscore_avg = 0;
- if (isClass)
- {
- if (dimensions != null && dimensions.Any())
- { //能力年级平均分
- pscore_avg = Math.Round(dimensions.Average(x => x.pscore), 2);
- //态度年级平均分
- tscore_avg = Math.Round(dimensions.Average(x => x.tscore), 2);
- //合作年级平均分
- gscore_avg = Math.Round(dimensions.Average(x => x.gscore), 2);
- 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
- {
- if (grade_dimensions != null && grade_dimensions.Any())
- { //能力年级平均分
- pscore_avg = Math.Round(grade_dimensions.Average(x => x.pscore), 2);
- //态度年级平均分
- tscore_avg = Math.Round(grade_dimensions.Average(x => x.tscore), 2);
- //合作年级平均分
- gscore_avg = Math.Round(grade_dimensions.Average(x => x.gscore), 2);
- }
- }
- if (grade_dimensions != null && grade_dimensions.Any())
- { //能力年级平均分
- grade_pscore_avg = Math.Round(grade_dimensions.Average(x => x.pscore), 2);
- //态度年级平均分
- grade_tscore_avg = Math.Round(grade_dimensions.Average(x => x.tscore), 2);
- //合作年级平均分
- grade_gscore_avg = Math.Round(grade_dimensions.Average(x => x.gscore), 2);
- }
- #region
- double data_count = overallEducations.Count;
- int sports_count90 = dimensions.Where(x => x.sports >= 90).Count();
- int sports_count60 = dimensions.Where(x => x.sports >= 60).Count();
- double sports_rate90 = Math.Round(data_count > 0 ? dimensions.Where(x => x.sports >= 90).Count() * 1.0 / data_count *100: 0,2);
- double sports_rate60 =Math.Round(data_count > 0 ? dimensions.Where(x => x.sports >= 60).Count() * 1.0 / data_count * 100 : 0,2);
- int art_count90 = dimensions.Where(x => x.art >= 90).Count();
- int art_count60 = dimensions.Where(x => x.art >= 60).Count();
- double art_rate90 = Math.Round(data_count > 0 ? dimensions.Where(x => x.art >= 90).Count() * 1.0 / data_count * 100 : 0, 2);
- double art_rate60 = Math.Round(data_count > 0 ? dimensions.Where(x => x.art >= 60).Count() * 1.0 / data_count * 100 : 0, 2);
- int subject_music_count90 = dimensions.Where(x => x.subject_music >= 90).Count();
- int subject_music_count60 = dimensions.Where(x => x.subject_music >= 60).Count();
- double subject_music_rate90 = Math.Round(data_count > 0 ? dimensions.Where(x => x.subject_music >= 90).Count() * 1.0 / data_count * 100 : 0, 2);
- double subject_music_rate60 = Math.Round(data_count > 0 ? dimensions.Where(x => x.subject_music >= 60).Count() * 1.0 / data_count * 100 : 0, 2);
- int subject_painting_count90 = dimensions.Where(x => x.subject_painting >= 90).Count();
- int subject_painting_count60 = dimensions.Where(x => x.subject_painting >= 60).Count();
- double subject_painting_rate90 = Math.Round(data_count > 0 ? dimensions.Where(x => x.subject_painting >= 90).Count() * 1.0 / data_count * 100 : 0, 2);
- double subject_painting_rate60 = Math.Round(data_count > 0 ? dimensions.Where(x => x.subject_painting >= 60).Count() * 1.0 / data_count * 100 : 0, 2);
- int labour_count90 = dimensions.Where(x => x.labour >= 90).Count();
- int labour_count60 = dimensions.Where(x => x.labour >= 60).Count();
- double labour_rate90 = Math.Round(data_count > 0 ? dimensions.Where(x => x.labour >= 90).Count() * 1.0 / data_count * 100 : 0, 2);
- double labour_rate60 = Math.Round(data_count > 0 ? dimensions.Where(x => x.labour >= 60).Count() * 1.0 / data_count * 100 : 0, 2);
- int virtue_count90 = dimensions.Where(x => x.virtue >= 90).Count();
- int virtue_count60 = dimensions.Where(x => x.virtue >= 60).Count();
- double virtue_rate90 = Math.Round(data_count > 0 ? dimensions.Where(x => x.virtue >= 90).Count() * 1.0 / data_count * 100 : 0, 2);
- double virtue_rate60 = Math.Round(data_count > 0 ? dimensions.Where(x => x.virtue >= 60).Count() * 1.0 / data_count * 100 : 0, 2);
- double rate90 = Math.Round(data_count > 0 ? dimensions.Where(x => x.score >= 90).Count() * 1.0 / data_count * 100 : 0, 2);
- double rate60 = Math.Round(data_count > 0 ? dimensions.Where(x => x.score >= 60).Count() * 1.0 / data_count * 100 : 0, 2);
- OverallEducation studentOverallEducation = null;
-
- var studyYear = int.Parse($"{_studyYear}");
- var semesterData= SchoolService.GetSemester(period, time: SchoolService.GetOpensByStudyYearAndSemester(period.semesters,studyYear,$"{_semesterId}"));
- var examData = await ExamService.getGradeScore(_coreAPIHttpService, _dingDing,_azureCosmos.GetCosmosClient(), grade_classes.Select(x=>x.id).ToList(), $"{_periodId}", school.id, schoolSetting.overallEducationSetting.examTypes
- , semesterData.date.ToUnixTimeMilliseconds(), semesterData.nextSemester.ToUnixTimeMilliseconds());
-
- var groupExam= examData.GroupBy(x => x.name).Select(y => new { key = y.Key, list = y });
- List<ExamScore> exam3Scores = new List<ExamScore>();
- foreach (var item in examData) {
- if (!string.IsNullOrWhiteSpace($"{_studentId}"))
- {
- var student = students.Find(x => x.id.Equals($"{_studentId}"));
- ExamScore exam3Score = new ExamScore();
- exam3Score.name = item.name;
- exam3Score.gradeScore=item.total;
- exam3Score.xdatas= new List<CodeDouble>
- {
- new CodeDouble
- {
- code=student.id,
- name= student.name,
- value=item.students.Find(x=>x.studentId.Equals(student.id)).scores
- }
- };
- exam3Score.classScore=item.classMore.Find(x=>x.classId.Equals(student.classId)).average;
- exam3Scores.Add(exam3Score);
- }
- else
- {
- if (isClass)
- {
- Class clazz = classes.First();
- ExamScore exam3Score = new ExamScore();
- exam3Score.name = item.name;
- exam3Score.gradeScore=item.total;
- exam3Score.classScore=item.classMore.Find(x => x.classId.Equals(clazz.id)).average;
- exam3Score.xdatas= item.students.Where(y=>y.classId.Equals(clazz.id)).Select(x=>new CodeDouble { code=x.studentId,name= students.Find(z=>z.id.Equals(x.studentId))?.name,value=x.scores }).ToList();
- exam3Scores.Add(exam3Score);
- }
- else
- {
- ExamScore exam3Score = new ExamScore();
- exam3Score.name = item.name;
- exam3Score.gradeScore=item.total;
- exam3Score.classScore=-1;
- exam3Score.xdatas= item.classMore.Select(x => new CodeDouble { code=x.classId, name= grade_classes.Find(z => z.id.Equals(x.classId))?.name, value=x.average }).ToList();
- exam3Scores.Add(exam3Score);
- }
- }
- }
- var examScores = exam3Scores.Select(x => new {
- x.name,
- x.gradeScore,
- x.classScore,
- data = x.xdatas.Where(c => !string.IsNullOrEmpty(c.name)).Select(z => new {
- z.code,
- z.name,
- z.value
- })
- });
- //学生统计数据
- dynamic studentStatistics = new ExpandoObject();
- if (!string.IsNullOrWhiteSpace($"{_studentId}"))
- {
- List<ExamDimensionScore> stuExamScores= new List<ExamDimensionScore>();
- exam3Scores.ForEach(z => {
- var stu = z.xdatas.Find(z => z.code.Equals($"{_studentId}"));
- if (stu!=null) {
- stuExamScores.Add(new ExamDimensionScore { examName=z.name, classScore=z.classScore,gradeScore=z.gradeScore,stuScore=stu.value });
- }
- });
- var student = students.Find(z => z.id.Equals($"{_studentId}"));
- var studentDimension = dimensions.Find(z => z.studentId.Equals($"{_studentId}"));
- if (studentDimension==null)
- {
- studentDimension=new StudentDimensionScore
- {
- stuExamScores=stuExamScores,
- art=60,
- classId=student.classId,
- className=student.classId,
- classRanking=0,
- exam=60,
- gradeRanking=0,
- gscore=60,
- intelligence=60,
- labour=60,
- level="",
- picture=student.picture,
- pscore=60,
- score=60,
- sports=60,
- studentId=student.id,
- studentName=student.name,
- subject_music=0,
- subject_painting=0,
- tscore=60,
- virtue=60,
- };
- }
- else {
- studentDimension.stuExamScores= stuExamScores;
- }
- var classDimension = classDimensions.Find(z => z.classId.Equals(student.classId));
- studentStatistics= new { studentDimension, inClass = classDimension, inGrade = new { grade_gscore_avg, grade_pscore_avg, grade_tscore_avg } };
- studentOverallEducation = overallEducations.FindAll(x => x.studentId.Equals($"{_studentId}")).FirstOrDefault();
- if (studentOverallEducation==null)
- {
- studentOverallEducation = new OverallEducation() { studentId=student.id, name= student.name, classId=student.classId, picture = student.picture, schoolCode= student.schoolId };
- }
- }
- #endregion
- return Ok(new
- {
- examScores,
- sports_count60,
- sports_count90,
- labour_count60,
- labour_count90,
- virtue_count60,
- virtue_count90,
- art_count60,
- art_count90,
- subject_music_count60,
- subject_music_count90,
- subject_painting_count60,
- subject_painting_count90,
- achievementScores,
- grade_pscore_avg,
- grade_tscore_avg,
- grade_gscore_avg,
- pscore_avg,
- tscore_avg,
- gscore_avg,
- classDimensions,
- dimensions=dimensions.OrderByDescending(x => x.score),
- data_count,
- classCount = classes.Count,
- rate90,
- rate60,
- sports_rate60,
- sports_rate90,
- art_rate60,
- art_rate90,
- labour_rate60,
- labour_rate90,
- virtue_rate60,
- virtue_rate90,
- subject_music_rate90,
- subject_music_rate60,
- subject_painting_rate90,
- subject_painting_rate60,
- studentCount = students.Count(),
- studentOverallEducation,
- studentStatistics
- });
- }
- catch (Exception ex)
- {
- await _dingDing.SendBotMsg($"{ex.Message}\n{ex.StackTrace}",GroupNames.成都开发測試群組);
- }
- return Ok();
- }
- public class ExamScore {
- public double gradeScore { get; set; }
- public double classScore { get; set; }
- public string name { get; set; }
- public List<CodeDouble> xdatas = new List<CodeDouble>();
- }
- /// <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 ExamDimensionScore
- {
- public string examName { get; set; }
- public double stuScore { get; set; }
- public double classScore { get;set; }
- public double gradeScore { 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 exam { get; set; }
- public string intelligenceLevel { get; set; }
- public double max { get; set; }
- public double min { get; set; }
- public string level { get; set; }
- // 等级人数
- public List<CodeLong> intelligenceLevels { get; set; } = new List<CodeLong>();
- }
- public class StudentDimensionScore
- {
- public List<ExamDimensionScore> stuExamScores { get; set; } = new List<ExamDimensionScore>();
- public string className { get; set; }
- 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 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; }
- }
- /// <summary>
- /// 学生学生画像是否是默认初始化
- /// </summary>
- public class StudentDimensionScoreDefault
- {
- public string studentId { get; set; }
-
- public int sports { get; set; }
- public int art { get; set; }
- public int subject_music { get; set; }
- public int subject_painting { get; set; }
- public int labour { get; set; }
- public int intelligence { get; set; }
- public int virtue { get; set; }
- public int exam { get; set; }
- public int gscore { get; set; }
- public int pscore { get; set; }
- public int tscore { get; set; }
- }
- /*
-
- {
- "grades": [
- 0,1
- ],
- "periodId": "463db08d-cbe7-48a0-a81a-fc39b3c1fep1",
- "school": "hbcn",
- "classIds": [
- "e1729a0c-0e7c-4968-bec9-21254b70325b",
- "b44694b7-4cb2-46b8-8986-106696c4a282"
- ]
- }
-
- */
- }
- }
|