OverallEducationController.cs 63 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222
  1. using Microsoft.Azure.Cosmos;
  2. using MathNet.Numerics.Distributions;
  3. using Microsoft.AspNetCore.Authorization;
  4. using Microsoft.AspNetCore.Http;
  5. using Microsoft.AspNetCore.Mvc;
  6. using Microsoft.Azure.Amqp.Framing;
  7. using Microsoft.Extensions.Configuration;
  8. using Microsoft.Extensions.Options;
  9. using Microsoft.OData.Edm;
  10. using System;
  11. using System.Collections.Generic;
  12. using System.Dynamic;
  13. using System.Linq;
  14. using System.Reflection;
  15. using System.Security.Claims;
  16. using System.Text;
  17. using System.Text.Json;
  18. using System.Threading.Tasks;
  19. using TEAMModelOS.Filter;
  20. using TEAMModelOS.Models;
  21. using TEAMModelOS.SDK;
  22. using TEAMModelOS.SDK.DI;
  23. using TEAMModelOS.SDK.Extension;
  24. using TEAMModelOS.SDK.Models;
  25. using TEAMModelOS.SDK.Models.Cosmos;
  26. using TEAMModelOS.SDK.Models.Cosmos;
  27. using TEAMModelOS.SDK.Models.Service;
  28. using TEAMModelOS.SDK.Services;
  29. using static TEAMModelOS.Controllers.OverallEducationController;
  30. using static TEAMModelOS.SDK.Models.Cosmos.Student.StudentAnalysis;
  31. using static TEAMModelOS.SDK.Services.ActivityStudentService;
  32. using TEAMModelOS.SDK.Models.Cosmos.OpenEntity;
  33. using HTEX.Lib.ETL.Lesson;
  34. namespace TEAMModelOS.Controllers
  35. {
  36. /// <summary>
  37. /// 学生五育画像接口
  38. /// </summary>
  39. [Route("overall-education")]
  40. [ApiController]
  41. public class OverallEducationController : ControllerBase
  42. {
  43. private readonly AzureCosmosFactory _azureCosmos;
  44. private readonly AzureStorageFactory _azureStorage;
  45. private readonly AzureRedisFactory _azureRedis;
  46. private readonly DingDing _dingDing;
  47. private readonly Option _option;
  48. private readonly IConfiguration _configuration;
  49. private readonly CoreAPIHttpService _coreAPIHttpService;
  50. private readonly AzureServiceBusFactory _serviceBus;
  51. private readonly SnowflakeId _snowflakeId;
  52. public OverallEducationController(AzureCosmosFactory azureCosmos, AzureStorageFactory azureStorage, AzureRedisFactory azureRedis, AzureServiceBusFactory serviceBus, DingDing dingDing, CoreAPIHttpService coreAPIHttpService, IOptionsSnapshot<Option> option, IConfiguration configuration, SnowflakeId snowflakeId)
  53. {
  54. _azureCosmos = azureCosmos;
  55. _azureStorage = azureStorage;
  56. _azureRedis = azureRedis;
  57. _dingDing = dingDing;
  58. _option = option?.Value;
  59. _configuration = configuration;
  60. _coreAPIHttpService = coreAPIHttpService;
  61. _serviceBus = serviceBus;
  62. _snowflakeId = snowflakeId;
  63. }
  64. /// <summary>
  65. /// 获取看板的基本条件
  66. /// </summary>
  67. /// <param name="json"></param>
  68. /// <returns></returns>
  69. [HttpPost("overview-cond")]
  70. [AuthToken(Roles = "teacher,admin")]
  71. [Authorize(Roles = "IES")]
  72. public async Task<IActionResult> OverviewCond(JsonElement json)
  73. {
  74. json.TryGetProperty("schoolId", out JsonElement schoolId);
  75. json.TryGetProperty("periodId", out JsonElement periodId);
  76. var client = _azureCosmos.GetCosmosClient();
  77. StringBuilder classsql = new StringBuilder($"SELECT count(1) FROM c where ( c.graduate = 0 or IS_DEFINED(c.graduate) = false )");
  78. if (!string.IsNullOrEmpty($"{periodId}"))
  79. {
  80. classsql.Append($" and c.periodId='{periodId}' ");
  81. }
  82. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIteratorSql<ClassInfo>(queryText: classsql.ToString(),
  83. requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Class-{schoolId}") }))
  84. {
  85. }
  86. return Ok();
  87. }
  88. [HttpPost("overview")]
  89. #if !DEBUG
  90. [AuthToken(Roles = "teacher,admin")]
  91. [Authorize(Roles = "IES")]
  92. #endif
  93. public async Task<IActionResult> Overview(JsonElement json)
  94. {
  95. try
  96. {
  97. json.TryGetProperty("studentYear", out JsonElement _studentYear);
  98. json.TryGetProperty("grades", out JsonElement _grades);
  99. json.TryGetProperty("school", out JsonElement _school);
  100. json.TryGetProperty("periodId", out JsonElement _periodId);
  101. json.TryGetProperty("semesterId", out JsonElement _semesterId);
  102. json.TryGetProperty("studyYear", out JsonElement _studyYear);
  103. json.TryGetProperty("studentId", out JsonElement _studentId);
  104. List<Class> classes = new List<Class>();
  105. List<Student> students = new List<Student>();
  106. List<Class> grade_classes = new List<Class>();
  107. List<Student> grade_students = new List<Student>();
  108. List<OverallEducation> grade_overallEducations = new List<OverallEducation>();
  109. List<OverallEducation> overallEducations = new List<OverallEducation>();
  110. List<OverallEducation> overallEducationsNoData = new List<OverallEducation>();
  111. HashSet<string> classIds = new HashSet<string>();
  112. var client = _azureCosmos.GetCosmosClient();
  113. School school = await client.GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<School>($"{_school}", new PartitionKey("Base"));
  114. SchoolSetting schoolSetting = await client.GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<SchoolSetting>($"{_school}", new PartitionKey("SchoolSetting"));
  115. Dictionary<string, object> dict = OverallEducationService.GetQueryCond(json);
  116. #region 此处代码用于处理 根据年级 学段获取 相关的班级。
  117. HashSet<int> years = new HashSet<int>();
  118. if (_grades.ValueKind.Equals(JsonValueKind.Array))
  119. {
  120. var yearsdata = SchoolService.GetYears(school, $"{_periodId}", _grades.ToObject<List<int>>());
  121. years = yearsdata.years;
  122. }
  123. if (int.TryParse($"{_studentYear}", out int studentYear))
  124. {
  125. if (!string.IsNullOrWhiteSpace($"{_studentId}"))
  126. {
  127. Student student= await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Student).ReadItemAsync<Student>($"{_studentId}", new PartitionKey($"Base-{school.id}"));
  128. Class classz = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).ReadItemAsync<Class>($"{student.classId}", new PartitionKey($"Class-{school.id}"));
  129. years.Add(classz.year);
  130. }
  131. else {
  132. years.Add(studentYear);
  133. }
  134. }
  135. Period period = school.period.Find(z => z.id.Equals($"{_periodId}")); ;
  136. Semester semester = period.semesters.Find(x => x.id.Equals($"{_semesterId}"));
  137. if (!years.Any())
  138. {
  139. if (period != null && period.grades.IsNotEmpty())
  140. {
  141. List<int> grades = new List<int>();
  142. period.grades.Select((z, index) => index).ToList().ForEach(t => { grades.Add(t); });
  143. var yearsdata = SchoolService.GetYears(school, $"{_periodId}", grades);
  144. years = yearsdata.years;
  145. }
  146. }
  147. //标记是否是下钻到班级
  148. bool isClass = false;
  149. if (json.TryGetProperty("classIds", out JsonElement _classIds))
  150. {
  151. classIds = _classIds.ToObject<HashSet<string>>();
  152. if (classIds != null && classIds.Count > 0)
  153. {
  154. isClass = true;
  155. }
  156. }
  157. if (!string.IsNullOrWhiteSpace($"{_studentId}")) {
  158. ResponseMessage response= await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Student).ReadItemStreamAsync($"{_studentId}", new PartitionKey($"Base-{school.id}"));
  159. if (response.StatusCode==System.Net.HttpStatusCode.OK) {
  160. Student student= JsonDocument.Parse(response.Content).RootElement.Deserialize<Student>();
  161. if (student != null && !string.IsNullOrWhiteSpace(student.classId)) {
  162. classIds.Add(student.classId);
  163. isClass=true;
  164. }
  165. }
  166. }
  167. if (years.Any() && years.Count > 0)
  168. {
  169. var gradeData = await OverallEducationService.GetGradeData(client, years, $"{_periodId}", $"{_school}", classIds, $"{_studyYear}", $"{_semesterId}", _azureRedis);
  170. classes = gradeData.classes;
  171. students = gradeData.students;
  172. grade_classes = gradeData.grade_classes;
  173. grade_students = gradeData.grade_students;
  174. grade_overallEducations = gradeData.overallEducations;
  175. overallEducations = gradeData.overallEducations.FindAll(x => students.Select(k => k.id).Contains(x.studentId));
  176. //是否处理没有任何数据的学生。
  177. if (isClass)
  178. {
  179. var nodata_students = students.ExceptBy(overallEducations.Select(z => z.studentId), v => v.id);
  180. if (nodata_students.Any() && nodata_students.Count()>0)
  181. {
  182. foreach (var student in nodata_students)
  183. {
  184. overallEducationsNoData.Add(new OverallEducation
  185. {
  186. classId= student.classId,
  187. schoolCode=$"{_school}",
  188. name= student.name,
  189. studentId= student.id,
  190. year= int.Parse($"{_studyYear}"),
  191. semesterId=$"{_semesterId}",
  192. picture= student.picture,
  193. periodId= student.periodId,
  194. stuYear=student.year,
  195. code=$"OverallEducation-{_school}",
  196. pk="OverallEducation",
  197. id=$"{_studyYear}-{_semesterId}-{student.id}"
  198. });
  199. }
  200. }
  201. }
  202. }
  203. #endregion
  204. List<(double score, OverallEducation student, string className, string picture)> ranking = new List<(double score, OverallEducation student, string className, string picture)>();
  205. 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)>();
  206. //pr计算 100 - (100 * (index + 1) - 50) / stuCount; index 整体排名 stuCount 总人数
  207. double basic_Score = 60;
  208. if (schoolSetting?.overallEducationSetting?.overallEducationInit != null && schoolSetting?.overallEducationSetting?.overallEducationInit >= 0)
  209. {
  210. basic_Score = schoolSetting.overallEducationSetting.overallEducationInit;
  211. }
  212. var hasData_labour = grade_overallEducations.Where(x => x.labour.Count > 0);
  213. double max_labour = 0;
  214. double min_labour = 0;
  215. if (hasData_labour != null && hasData_labour.Any())
  216. {
  217. var order_labour = hasData_labour.Select(x => new { score = x.labour.Sum(x => x.sumScore), studentId = x.studentId }).OrderByDescending(x => x.score).ToList();
  218. max_labour = order_labour.Max(z => z.score);
  219. min_labour = order_labour.Min(z => z.score);
  220. }
  221. var hasData_virtue = grade_overallEducations.Where(x => x.virtue.Count > 0);
  222. double max_virtue = 0;
  223. double min_virtue = 0;
  224. if (hasData_virtue != null && hasData_virtue.Any()) {
  225. var order_virtue = hasData_virtue.Select(x => new { score = x.virtue.Sum(x => x.sumScore), studentId = x.studentId }).OrderByDescending(x => x.score).ToList();
  226. max_virtue = order_virtue.Max(z => z.score);
  227. min_virtue = order_virtue.Min(z => z.score);
  228. }
  229. var hasData_lesson = grade_overallEducations.Where(x => x.lessonScore.Count > 0);
  230. double max_lesson_gscore = 0;
  231. double max_lesson_pscore = 0;
  232. double max_lesson_tscore = 0;
  233. double min_lesson_gscore = 0;
  234. double min_lesson_pscore = 0;
  235. double min_lesson_tscore = 0;
  236. if (hasData_lesson != null && hasData_lesson.Any()) {
  237. var order_gdata = hasData_lesson.Select(x => new { score = x.lessonScore.Sum(x => x.gscore), studentId = x.studentId }).OrderByDescending(x => x.score).ToList();
  238. max_lesson_gscore = order_gdata.Max(z => z.score);
  239. min_lesson_gscore = order_gdata.Min(z => z.score);
  240. var order_pdata = hasData_lesson.Select(x => new { score = x.lessonScore.Sum(x => x.pscore), studentId = x.studentId }).OrderByDescending(x => x.score).ToList();
  241. max_lesson_pscore = order_pdata.Max(z => z.score);
  242. min_lesson_pscore = order_pdata.Min(z => z.score);
  243. var order_tdata = hasData_lesson.Select(x => new { score = x.lessonScore.Sum(x => x.tscore), studentId = x.studentId }).OrderByDescending(x => x.score).ToList();
  244. max_lesson_tscore = order_tdata.Max(z => z.score);
  245. min_lesson_tscore = order_tdata.Min(z => z.score);
  246. }
  247. List<StudentDimensionScore> grade_dimensions = new List<StudentDimensionScore>();
  248. //全年级的数据
  249. foreach (var item in grade_overallEducations)
  250. {
  251. var student = students.Find(x => x.id.Equals(item.studentId));
  252. var clazz = classes.Find(x => x.id.Equals(item.classId));
  253. StudentDimensionScore dimensionScore = new StudentDimensionScore() { studentId = item.studentId,className=clazz?.name, classId = item.classId, studentName = student?.name, picture = student?.picture };
  254. StudentDimensionScoreDefault dimensionScoreDefault = new StudentDimensionScoreDefault { studentId=item.studentId };
  255. //排名指数计算=( 当前值分数- 298) / (9992 - 298) * (99 - 60) + 60
  256. //将每个人的积分转化为60-100
  257. //排名 = (积分 - 最低积分) / (最高积分 - 最低积分) * (最大排名 - 最小排名) + 最小排名
  258. //劳动
  259. var order_labour = hasData_labour.Select(x => new { score = x.labour.Sum(x => x.sumScore), studentId = x.studentId }).OrderByDescending(x => x.score).ToList();
  260. var labour = order_labour.Find(x => x.studentId.Equals(item.studentId));
  261. var labour_score = basic_Score;
  262. if (labour != null && labour.score > 0 && max_labour - min_labour>0)
  263. {
  264. dimensionScoreDefault.labour=1;
  265. labour_score = Math.Round((labour.score - min_labour) / (max_labour - min_labour) * (99 - basic_Score) + basic_Score,2);
  266. }
  267. dimensionScore.labour = labour_score;
  268. //德育
  269. var order_virtue = hasData_virtue.Select(x => new { score = x.virtue.Sum(x => x.sumScore), studentId = x.studentId }).OrderByDescending(x => x.score).ToList();
  270. var virtue = order_virtue.Find(x => x.studentId.Equals(item.studentId));
  271. var virtue_score = basic_Score;
  272. if (virtue != null && virtue.score > 0 && max_virtue - min_virtue>0)
  273. {
  274. dimensionScoreDefault.virtue=1;
  275. virtue_score = Math.Round((virtue.score - min_virtue) / (max_virtue - min_virtue) * (99 - basic_Score) + basic_Score,2);
  276. }
  277. dimensionScore.virtue = virtue_score;
  278. double intelligence = basic_Score;
  279. if (item.intelligence.IsNotEmpty())
  280. {
  281. //智育
  282. //if (schoolSetting.overallEducationSetting.intelligence.Equals("avg"))
  283. //{
  284. //}
  285. //else {
  286. //}
  287. List<EducationScore> intelligenceScore = new List<EducationScore>();
  288. if (schoolSetting.overallEducationSetting.examTypes.IsNotEmpty())
  289. {
  290. var datas = item.intelligence.FindAll(z => !string.IsNullOrWhiteSpace(z.examType) && schoolSetting.overallEducationSetting.examTypes.Contains(z.examType));
  291. if (datas.IsNotEmpty()) {
  292. intelligenceScore.AddRange(datas);
  293. }
  294. }
  295. else {
  296. intelligenceScore.AddRange(item.intelligence);
  297. }
  298. if (intelligenceScore.Count>0) {
  299. double sumScore = intelligenceScore.Average(x => x.sumScore);
  300. double totalScore = intelligenceScore.Average(x => x.totalScore);
  301. if (totalScore > 0)
  302. {
  303. intelligence = Math.Round(sumScore * 1.0 / totalScore * 100, 2);
  304. }
  305. else
  306. {
  307. intelligence = Math.Round(sumScore * 1.0 / intelligenceScore.Count, 2);
  308. }
  309. }
  310. dimensionScoreDefault.intelligence=1;
  311. dimensionScoreDefault.exam=1;
  312. }
  313. dimensionScore.exam = intelligence;
  314. var order_tdata = hasData_lesson.Select(x => new { score = x.lessonScore.Sum(x => x.tscore), studentId = x.studentId }).OrderByDescending(x => x.score).ToList();
  315. var order_gdata = hasData_lesson.Select(x => new { score = x.lessonScore.Sum(x => x.gscore), studentId = x.studentId }).OrderByDescending(x => x.score).ToList();
  316. var order_pdata = hasData_lesson.Select(x => new { score = x.lessonScore.Sum(x => x.pscore), studentId = x.studentId }).OrderByDescending(x => x.score).ToList();
  317. //合作
  318. var gdata = order_gdata.Find(x => x.studentId.Equals(item.studentId));
  319. var gdata_score = basic_Score;
  320. if (gdata != null && gdata.score > 0 && max_lesson_gscore - min_lesson_gscore>0)
  321. {
  322. dimensionScoreDefault.gscore=1;
  323. dimensionScoreDefault.intelligence=1;
  324. gdata_score = Math.Round((gdata.score - min_lesson_gscore) / (max_lesson_gscore - min_lesson_gscore) * (99 - basic_Score) + basic_Score,2);
  325. }
  326. dimensionScore.gscore = gdata_score;
  327. //态度
  328. var tdata = order_tdata.Find(x => x.studentId.Equals(item.studentId));
  329. var tdata_score = basic_Score;
  330. if (tdata != null && tdata.score > 0 && max_lesson_tscore - min_lesson_tscore>0)
  331. {
  332. dimensionScoreDefault.tscore=1;
  333. dimensionScoreDefault.intelligence=1;
  334. tdata_score = Math.Round((tdata.score - min_lesson_tscore) / (max_lesson_tscore - min_lesson_tscore) * (99 - basic_Score) + basic_Score,2);
  335. }
  336. dimensionScore.tscore = tdata_score;
  337. //能力
  338. var pdata = order_pdata.Find(x => x.studentId.Equals(item.studentId));
  339. var pdata_score = basic_Score;
  340. if (pdata != null && pdata.score > 0 && max_lesson_pscore - min_lesson_pscore>0)
  341. {
  342. dimensionScoreDefault.pscore=1;
  343. dimensionScoreDefault.intelligence=1;
  344. pdata_score = Math.Round((pdata.score - min_lesson_pscore) / (max_lesson_pscore - min_lesson_pscore) * (99 - basic_Score) + basic_Score,2);
  345. }
  346. dimensionScore.pscore = pdata_score;
  347. //态度=》学习态度
  348. double attitude = 0.1;
  349. //合作=》合作能力
  350. double cooperate = 0.1;
  351. //能力=》 //协作能力 //评价能力
  352. double ability = 0.1;
  353. //水平=》学习成效
  354. double standard = 0.7;
  355. var attitudeWeight = schoolSetting.overallEducationSetting.intelligenceWeight.Find(x => x.code.Equals("attitude"));
  356. attitude = attitudeWeight != null ? attitudeWeight.value : attitude;
  357. var cooperateWeight = schoolSetting.overallEducationSetting.intelligenceWeight.Find(x => x.code.Equals("cooperate"));
  358. cooperate = cooperateWeight != null ? cooperateWeight.value : cooperate;
  359. var abilityWeight = schoolSetting.overallEducationSetting.intelligenceWeight.Find(x => x.code.Equals("ability"));
  360. ability = abilityWeight != null ? abilityWeight.value : ability;
  361. var standardWeight = schoolSetting.overallEducationSetting.intelligenceWeight.Find(x => x.code.Equals("standard"));
  362. standard = standardWeight != null ? standardWeight.value : standard;
  363. dimensionScore.intelligence = Math.Round(intelligence * standard + pdata_score * ability + tdata_score * attitude + gdata_score * cooperate, 2);
  364. //成效权重
  365. double c_w = 0.1;
  366. //态度权重
  367. double t_w = 0.1;
  368. //合作权重
  369. double h_w = 0.1;
  370. //评价权重
  371. double p_w = 0.1;
  372. //协作权重
  373. double x_w = 0.1;
  374. //水平权重
  375. double s_w = 0.5;
  376. double xrate = 0, crate = 0, prate = 0,trate=0,hrate =0 ;
  377. var crates = item.lessonScore.Where(x => x.crate>0).Select(x=>x.crate);
  378. if (crates!=null && crates.Count()>0)
  379. {
  380. var crates_c= LessonETLService.CleanDataBySDThreshold(crates, 2);
  381. if (crates_c.Count>0)
  382. {
  383. crate = crates_c.Average();
  384. }
  385. else
  386. {
  387. crate = crates.Average();
  388. }
  389. }
  390. var trates = item.lessonScore.Where(x => x.trate>0).Select(x => x.trate);
  391. if (trates!=null && trates.Count()>0)
  392. {
  393. var trates_c= LessonETLService.CleanDataBySDThreshold(trates, 2);
  394. if (trates_c.Count>0)
  395. {
  396. trate = trates_c.Average();
  397. }
  398. else
  399. {
  400. trate = trates.Average();
  401. }
  402. }
  403. var prates = item.lessonScore.Where(x => x.prate>0).Select(x => x.prate);
  404. if (prates!=null && prates.Count()>0)
  405. {
  406. var prates_c= LessonETLService.CleanDataBySDThreshold(prates, 2);
  407. if (prates_c.Count>0)
  408. {
  409. prate = prates_c.Average();
  410. }
  411. else {
  412. prate = prates.Average();
  413. }
  414. }
  415. var hrates = item.lessonScore.Where(x => x.hrate>0).Select(x => x.hrate);
  416. if (hrates!=null && hrates.Count()>0)
  417. {
  418. var hrates_c= LessonETLService.CleanDataBySDThreshold(hrates, 2);
  419. if (hrates_c.Count>0)
  420. {
  421. hrate = hrates_c.Average();
  422. }
  423. else
  424. {
  425. hrate = hrates.Average();
  426. }
  427. }
  428. var xrates = item.lessonScore.Where(x => x.xrate>0).Select(x => x.xrate);
  429. if (xrates!=null && xrates.Count()>0)
  430. {
  431. var xrates_c= LessonETLService.CleanDataBySDThreshold(xrates, 2);
  432. if (xrates_c.Count>0)
  433. {
  434. xrate = xrates_c.Average();
  435. }
  436. else
  437. {
  438. xrate = hrates.Average();
  439. }
  440. }
  441. dimensionScore.intelligence = Math.Round(intelligence * s_w + crate * c_w + trate * t_w + prate* p_w+ hrate* h_w+xrate* x_w, 2);
  442. // dimensionScore.intelligence = Math.Round(intelligence * standard + pdata_score * ability + tdata_score * attitude + gdata_score * cooperate, 2);
  443. if (item.sports.IsNotEmpty())
  444. { //体育
  445. //if (schoolSetting.overallEducationSetting.sports.Equals("newest"))
  446. //{
  447. //}
  448. //else { dimensionScore.sports = basic_Score; }
  449. double sumScore = item.sports.OrderByDescending(x => x.examDate).First().sumScore;
  450. double totalScore = item.sports.OrderByDescending(x => x.examDate).First().totalScore;
  451. if (totalScore > 0)
  452. {
  453. dimensionScore.sports = Math.Round(sumScore * 1.0 / totalScore * 100, 2);
  454. }
  455. else
  456. {
  457. dimensionScore.sports = Math.Round(sumScore * 1.0 / item.sports.Count, 2);
  458. }
  459. dimensionScoreDefault.sports=1;
  460. }
  461. else
  462. {
  463. dimensionScore.sports = basic_Score;
  464. }
  465. if (item.art.IsNotEmpty())
  466. {
  467. //艺术
  468. //if (schoolSetting.overallEducationSetting.art.Equals("newest"))
  469. //{
  470. //}
  471. //else
  472. //{
  473. // dimensionScore.art = basic_Score;
  474. //}
  475. var art = item.art.OrderByDescending(x => x.examDate).First();
  476. double sumScore = art.sumScore;
  477. double totalScore = art.totalScore;
  478. if (totalScore > 0)
  479. {
  480. dimensionScore.art = Math.Round(sumScore * 1.0 / totalScore * 100, 2);
  481. }
  482. else
  483. {
  484. dimensionScore.art = Math.Round(sumScore * 1.0 / item.art.Count, 2);
  485. }
  486. dimensionScoreDefault.art=1;
  487. var subject_music = art.itemScore.Find(x => !string.IsNullOrWhiteSpace(x.id) ? x.id.Equals("subject_music") : x.type.Equals("subject_music"));
  488. var subject_painting = art.itemScore.Find(x => !string.IsNullOrWhiteSpace(x.id) ? x.id.Equals("subject_painting") : x.type.Equals("subject_painting"));
  489. if (subject_music != null)
  490. {
  491. dimensionScore.subject_music = Math.Round(subject_music.score * 1.0 / subject_music.totalScore *100, 2);
  492. dimensionScoreDefault.subject_music=1;
  493. }
  494. else
  495. {
  496. dimensionScore.subject_music = 0;
  497. }
  498. if (subject_painting != null)
  499. {
  500. dimensionScoreDefault.subject_painting=1;
  501. dimensionScore.subject_painting = Math.Round(subject_painting.score * 1.0 / subject_painting.totalScore *100, 2);
  502. }
  503. else
  504. {
  505. dimensionScore.subject_painting = 0;
  506. }
  507. }
  508. else
  509. {
  510. dimensionScore.art = basic_Score;
  511. }
  512. dimensionScore.score =Math.Round((dimensionScore.virtue + dimensionScore.intelligence + dimensionScore.labour + dimensionScore.art + dimensionScore.sports) / 5,2);
  513. schoolSetting.overallEducationSetting.reviewLevel.ForEach(z => {
  514. if (z.value[0] <= dimensionScore.score && z.value[1] > dimensionScore.score)
  515. {
  516. dimensionScore.level = z.code;
  517. }
  518. });
  519. //dimensionScore.xrate=60;
  520. //dimensionScore.trate=60;
  521. //dimensionScore.zrate=60;
  522. //dimensionScore.prate=60;
  523. //dimensionScore.crate=60;
  524. dimensionScore.xrate=Math.Round(xrate, 2);
  525. dimensionScore.trate=Math.Round(trate, 2);
  526. // dimensionScore.zrate=60;
  527. dimensionScore.hrate=Math.Round(hrate, 2);
  528. dimensionScore.prate=Math.Round(prate, 2);
  529. dimensionScore.crate=Math.Round(crate, 2);
  530. grade_dimensions.Add(dimensionScore);
  531. }
  532. //处理年级排名
  533. // grade_dimensions.OrderByDescending(x => x.score).Select((z, index) => z.gradeRanking = (index + 1));
  534. grade_dimensions = grade_dimensions.OrderByDescending(x => x.score).ToList();
  535. int index = 1;
  536. foreach(var item in grade_dimensions)
  537. {
  538. item.gradeRanking = index;
  539. index++;
  540. }
  541. var group_class_dimensions = grade_dimensions.GroupBy(z => z.classId).Select(z => new { key = z.Key, list =z.OrderByDescending(x => x.score) });
  542. foreach (var classData in group_class_dimensions)
  543. {
  544. index = 1;
  545. // classData.list.OrderByDescending(x => x.score).Select((z, index) => z.classRanking = (index + 1));
  546. foreach (var item in classData.list)
  547. {
  548. item.classRanking = index;
  549. index++;
  550. }
  551. }
  552. // group_class_dimensions.ForEach(x=>x)
  553. List<StudentDimensionScore> dimensions = new List<StudentDimensionScore>();
  554. //当前条件的数据
  555. foreach (var item in overallEducations)
  556. {
  557. var dimension = grade_dimensions.Find(x => x.studentId.Equals(item.studentId));
  558. if (dimension != null)
  559. {
  560. var stud = students.Find(c => c.id.Equals(item.studentId));
  561. dimension.classId=stud.classId;
  562. dimensions.Add(dimension);
  563. }
  564. }
  565. var class_dimensions = dimensions.GroupBy(z => z.classId).Select(z => new { key = z.Key, list = z }).ToList();
  566. List<dynamic> classDimensions = new List<dynamic>();
  567. List<AchievementScore> achievementScores = new List<AchievementScore>();
  568. classes.ForEach(c => {
  569. var classData= class_dimensions.Where(x => x.key == c.id).FirstOrDefault();
  570. ClassDimensionScore classDimensionScore = null;
  571. double intelligenceScore = 0;
  572. if (classData!=null)
  573. {
  574. classDimensionScore = new ClassDimensionScore() { classId = classData.key };
  575. var clazz = classes.Find(x => x.id.Equals(classData.key));
  576. classDimensionScore.className = clazz?.name;
  577. classDimensionScore.max = Math.Round(classData.list.Max(x => x.score), 2);
  578. classDimensionScore.min = Math.Round(classData.list.Min(x => x.score), 2);
  579. classDimensionScore.score = Math.Round(classData.list.Average(x => x.score), 2);
  580. classDimensionScore.pscore = Math.Round(classData.list.Average(x => x.pscore), 2);
  581. classDimensionScore.tscore = Math.Round(classData.list.Average(x => x.tscore), 2);
  582. classDimensionScore.gscore = Math.Round(classData.list.Average(x => x.gscore), 2);
  583. classDimensionScore.crate = Math.Round(classData.list.Average(x => x.crate), 2);
  584. classDimensionScore.trate = Math.Round(classData.list.Average(x => x.trate), 2);
  585. classDimensionScore.hrate = Math.Round(classData.list.Average(x => x.hrate), 2);
  586. classDimensionScore.xrate = Math.Round(classData.list.Average(x => x.xrate), 2);
  587. classDimensionScore.prate = Math.Round(classData.list.Average(x => x.prate), 2);
  588. classDimensionScore.exam = Math.Round(classData.list.Average(x => x.exam), 2);
  589. intelligenceScore = Math.Round(classData.list.Average(x => x.intelligence), 2);
  590. classDimensionScore.intelligenceLevels= classData.list.GroupBy(x => x.level).Select(x => new CodeLong { code = x.Key, value = x.Count() }).ToList();
  591. classDimensionScore.avg_intelligence =Math.Round(classData.list.Average(x => x.intelligence), 2);
  592. classDimensionScore.avg_virtue = Math.Round(classData.list.Average(x => x.virtue), 2);
  593. classDimensionScore.avg_labour = Math.Round(classData.list.Average(x => x.labour), 2);
  594. classDimensionScore.avg_sports = Math.Round(classData.list.Average(x => x.sports), 2);
  595. classDimensionScore.avg_art = Math.Round(classData.list.Average(x => x.art), 2);
  596. }
  597. else {
  598. classDimensionScore = new ClassDimensionScore() { classId = c.id };
  599. classDimensionScore.className = c?.name;
  600. classDimensionScore.intelligenceLevel=string.Empty;
  601. }
  602. schoolSetting.overallEducationSetting.reviewLevel.ForEach(z =>
  603. {
  604. var level = classDimensionScore.intelligenceLevels.Find(x => x.code==z.code);
  605. if (level==null)
  606. {
  607. classDimensionScore.intelligenceLevels.Add(new CodeLong { code = z.code, value = 0 });
  608. }
  609. if (z.value[0] <= classDimensionScore.score && z.value[1] > classDimensionScore.score)
  610. {
  611. classDimensionScore.level = z.code;
  612. }
  613. if (z.value[0] <= intelligenceScore && z.value[1] > intelligenceScore)
  614. {
  615. classDimensionScore.intelligenceLevel = z.code;
  616. }
  617. });
  618. if (!isClass)
  619. {
  620. achievementScores.Add(new AchievementScore
  621. {
  622. gscore = classDimensionScore.gscore,
  623. pscore = classDimensionScore.pscore,
  624. tscore = classDimensionScore.tscore,
  625. xrate = classDimensionScore.xrate,
  626. crate = classDimensionScore.crate,
  627. hrate = classDimensionScore.hrate,
  628. prate = classDimensionScore.prate,
  629. trate = classDimensionScore.trate,
  630. id = classDimensionScore.classId,
  631. name = classDimensionScore?.className,
  632. type = "class"
  633. });
  634. }
  635. classDimensions.Add(classDimensionScore);
  636. });
  637. //foreach (var classData in class_dimensions)
  638. //{
  639. //}
  640. ///当前条件的
  641. double pscore_avg = 0;
  642. double tscore_avg = 0;
  643. double gscore_avg = 0;
  644. //年级
  645. double grade_pscore_avg = 0;
  646. double grade_tscore_avg = 0;
  647. double grade_gscore_avg = 0;
  648. double crate_avg = 0;
  649. double trate_avg = 0;
  650. double hrate_avg = 0;
  651. double xrate_avg = 0;
  652. double prate_avg = 0;
  653. //年级
  654. double grade_crate_avg = 0;
  655. double grade_trate_avg = 0;
  656. double grade_hrate_avg = 0;
  657. double grade_xrate_avg = 0;
  658. double grade_prate_avg = 0;
  659. if (isClass)
  660. {
  661. if (dimensions != null && dimensions.Any())
  662. { //能力年级平均分
  663. pscore_avg = Math.Round(dimensions.Average(x => x.pscore), 2);
  664. //态度年级平均分
  665. tscore_avg = Math.Round(dimensions.Average(x => x.tscore), 2);
  666. //合作年级平均分
  667. gscore_avg = Math.Round(dimensions.Average(x => x.gscore), 2);
  668. crate_avg= Math.Round(dimensions.Average(x => x.crate), 2);
  669. trate_avg= Math.Round(dimensions.Average(x => x.trate), 2);
  670. hrate_avg= Math.Round(dimensions.Average(x => x.hrate), 2);
  671. xrate_avg= Math.Round(dimensions.Average(x => x.xrate), 2);
  672. prate_avg= Math.Round(dimensions.Average(x => x.prate), 2);
  673. var studentAchievementScores = dimensions.Select(z => new AchievementScore
  674. {
  675. id = z.studentId,
  676. name = z.studentName,
  677. gscore = z.gscore,
  678. pscore = z.pscore,
  679. tscore = z.tscore,
  680. type = "student",
  681. xrate=z.xrate,
  682. hrate=z.hrate,
  683. prate=z.prate,
  684. crate=z.crate,
  685. trate=z.trate
  686. });
  687. achievementScores.AddRange(studentAchievementScores);
  688. }
  689. }
  690. else
  691. {
  692. if (grade_dimensions != null && grade_dimensions.Any())
  693. { //能力年级平均分
  694. pscore_avg = Math.Round(grade_dimensions.Average(x => x.pscore), 2);
  695. //态度年级平均分
  696. tscore_avg = Math.Round(grade_dimensions.Average(x => x.tscore), 2);
  697. //合作年级平均分
  698. gscore_avg = Math.Round(grade_dimensions.Average(x => x.gscore), 2);
  699. crate_avg= Math.Round(grade_dimensions.Average(x => x.crate), 2);
  700. trate_avg= Math.Round(grade_dimensions.Average(x => x.trate), 2);
  701. hrate_avg= Math.Round(grade_dimensions.Average(x => x.hrate), 2);
  702. xrate_avg= Math.Round(grade_dimensions.Average(x => x.xrate), 2);
  703. prate_avg= Math.Round(grade_dimensions.Average(x => x.prate), 2);
  704. }
  705. }
  706. if (grade_dimensions != null && grade_dimensions.Any())
  707. { //能力年级平均分
  708. grade_pscore_avg = Math.Round(grade_dimensions.Average(x => x.pscore), 2);
  709. //态度年级平均分
  710. grade_tscore_avg = Math.Round(grade_dimensions.Average(x => x.tscore), 2);
  711. //合作年级平均分
  712. grade_gscore_avg = Math.Round(grade_dimensions.Average(x => x.gscore), 2);
  713. grade_crate_avg= Math.Round(grade_dimensions.Average(x => x.crate), 2);
  714. grade_trate_avg= Math.Round(grade_dimensions.Average(x => x.trate), 2);
  715. grade_hrate_avg= Math.Round(grade_dimensions.Average(x => x.hrate), 2);
  716. grade_xrate_avg= Math.Round(grade_dimensions.Average(x => x.xrate), 2);
  717. grade_prate_avg= Math.Round(grade_dimensions.Average(x => x.prate), 2);
  718. }
  719. #region
  720. double data_count = overallEducations.Count;
  721. int sports_count90 = dimensions.Where(x => x.sports >= 90).Count();
  722. int sports_count60 = dimensions.Where(x => x.sports >= 60).Count();
  723. double sports_rate90 = Math.Round(data_count > 0 ? dimensions.Where(x => x.sports >= 90).Count() * 1.0 / data_count *100: 0,2);
  724. double sports_rate60 =Math.Round(data_count > 0 ? dimensions.Where(x => x.sports >= 60).Count() * 1.0 / data_count * 100 : 0,2);
  725. int art_count90 = dimensions.Where(x => x.art >= 90).Count();
  726. int art_count60 = dimensions.Where(x => x.art >= 60).Count();
  727. double art_rate90 = Math.Round(data_count > 0 ? dimensions.Where(x => x.art >= 90).Count() * 1.0 / data_count * 100 : 0, 2);
  728. double art_rate60 = Math.Round(data_count > 0 ? dimensions.Where(x => x.art >= 60).Count() * 1.0 / data_count * 100 : 0, 2);
  729. int subject_music_count90 = dimensions.Where(x => x.subject_music >= 90).Count();
  730. int subject_music_count60 = dimensions.Where(x => x.subject_music >= 60).Count();
  731. double subject_music_rate90 = Math.Round(data_count > 0 ? dimensions.Where(x => x.subject_music >= 90).Count() * 1.0 / data_count * 100 : 0, 2);
  732. double subject_music_rate60 = Math.Round(data_count > 0 ? dimensions.Where(x => x.subject_music >= 60).Count() * 1.0 / data_count * 100 : 0, 2);
  733. int subject_painting_count90 = dimensions.Where(x => x.subject_painting >= 90).Count();
  734. int subject_painting_count60 = dimensions.Where(x => x.subject_painting >= 60).Count();
  735. double subject_painting_rate90 = Math.Round(data_count > 0 ? dimensions.Where(x => x.subject_painting >= 90).Count() * 1.0 / data_count * 100 : 0, 2);
  736. double subject_painting_rate60 = Math.Round(data_count > 0 ? dimensions.Where(x => x.subject_painting >= 60).Count() * 1.0 / data_count * 100 : 0, 2);
  737. int labour_count90 = dimensions.Where(x => x.labour >= 90).Count();
  738. int labour_count60 = dimensions.Where(x => x.labour >= 60).Count();
  739. double labour_rate90 = Math.Round(data_count > 0 ? dimensions.Where(x => x.labour >= 90).Count() * 1.0 / data_count * 100 : 0, 2);
  740. double labour_rate60 = Math.Round(data_count > 0 ? dimensions.Where(x => x.labour >= 60).Count() * 1.0 / data_count * 100 : 0, 2);
  741. int virtue_count90 = dimensions.Where(x => x.virtue >= 90).Count();
  742. int virtue_count60 = dimensions.Where(x => x.virtue >= 60).Count();
  743. double virtue_rate90 = Math.Round(data_count > 0 ? dimensions.Where(x => x.virtue >= 90).Count() * 1.0 / data_count * 100 : 0, 2);
  744. double virtue_rate60 = Math.Round(data_count > 0 ? dimensions.Where(x => x.virtue >= 60).Count() * 1.0 / data_count * 100 : 0, 2);
  745. double rate90 = Math.Round(data_count > 0 ? dimensions.Where(x => x.score >= 90).Count() * 1.0 / data_count * 100 : 0, 2);
  746. double rate60 = Math.Round(data_count > 0 ? dimensions.Where(x => x.score >= 60).Count() * 1.0 / data_count * 100 : 0, 2);
  747. OverallEducation studentOverallEducation = null;
  748. var studyYear = int.Parse($"{_studyYear}");
  749. var semesterData= SchoolService.GetSemester(period, time: SchoolService.GetOpensByStudyYearAndSemester(period.semesters,studyYear,$"{_semesterId}"));
  750. var examData = await ExamService.getGradeScore(_coreAPIHttpService, _dingDing,_azureCosmos.GetCosmosClient(), grade_classes.Select(x=>x.id).ToList(), $"{_periodId}", school.id, schoolSetting.overallEducationSetting.examTypes
  751. , semesterData.date.ToUnixTimeMilliseconds(), semesterData.nextSemester.ToUnixTimeMilliseconds());
  752. var groupExam= examData.GroupBy(x => x.name).Select(y => new { key = y.Key, list = y });
  753. List<ExamScore> exam3Scores = new List<ExamScore>();
  754. foreach (var item in examData) {
  755. if (!string.IsNullOrWhiteSpace($"{_studentId}"))
  756. {
  757. var student = students.Find(x => x.id.Equals($"{_studentId}"));
  758. ExamScore exam3Score = new ExamScore();
  759. exam3Score.name = item.name;
  760. exam3Score.gradeRate=item.total;
  761. exam3Score.xdatas= new List<CodeDouble>
  762. {
  763. new CodeDouble
  764. {
  765. code = student.id,
  766. name= student.name,
  767. value= item.students.Find(x=>x.studentId.Equals(student.id)).scores,
  768. rank = item.students.OrderByDescending(x => x.scores).Select(z => z.studentId).ToList().IndexOf(student.id) + 1,
  769. time = item.time
  770. }
  771. };
  772. exam3Score.classRate=item.classMore.Find(x=>x.classId.Equals(student.classId)).average;
  773. exam3Scores.Add(exam3Score);
  774. }
  775. else
  776. {
  777. if (isClass)
  778. {
  779. Class clazz = classes.First();
  780. ExamScore exam3Score = new ExamScore();
  781. exam3Score.name = item.name;
  782. exam3Score.gradeRate=item.total;
  783. exam3Score.classRate=item.classMore.Find(x => x.classId.Equals(clazz.id)).average;
  784. exam3Score.xdatas= item.students.Where(y=>y.classId.Equals(clazz.id)).Select(x=>new CodeDouble {
  785. code=x.studentId,
  786. name= students.Find(z=>z.id.Equals(x.studentId))?.name,
  787. value=x.scores,
  788. rank = item.students.Where(y => y.classId.Equals(clazz.id)).OrderByDescending(x => x.scores).Select(z => z.studentId).ToList().IndexOf(x.studentId) + 1,
  789. time = item.time
  790. }).ToList();
  791. exam3Scores.Add(exam3Score);
  792. }
  793. else
  794. {
  795. ExamScore exam3Score = new ExamScore();
  796. exam3Score.name = item.name;
  797. exam3Score.gradeRate =item.total;
  798. exam3Score.classRate =-1;
  799. exam3Score.xdatas= item.classMore.Select(x => new CodeDouble {
  800. code=x.classId,
  801. name= grade_classes.Find(z => z.id.Equals(x.classId))?.name,
  802. value=x.average,
  803. time = item.time
  804. }).ToList();
  805. exam3Scores.Add(exam3Score);
  806. }
  807. }
  808. }
  809. var examScores = exam3Scores.Select(x => new {
  810. x.name,
  811. x.gradeRate,
  812. x.classRate,
  813. data = x.xdatas.Where(c => !string.IsNullOrEmpty(c.name)).Select(z => new {
  814. z.code,
  815. z.name,
  816. z.value,
  817. z.rank,
  818. z.time
  819. })
  820. });
  821. //学生统计数据
  822. dynamic studentStatistics = new ExpandoObject();
  823. if (!string.IsNullOrWhiteSpace($"{_studentId}"))
  824. {
  825. List<ExamDimensionScore> stuExamScores= new List<ExamDimensionScore>();
  826. exam3Scores.ForEach(z => {
  827. var stu = z.xdatas.Find(z => z.code.Equals($"{_studentId}"));
  828. if (stu!=null) {
  829. stuExamScores.Add(new ExamDimensionScore { examName=z.name, classRate=z.classRate,gradeRate=z.gradeRate,stuScore=stu.value });
  830. }
  831. });
  832. var student = students.Find(z => z.id.Equals($"{_studentId}"));
  833. var studentDimension = dimensions.Find(z => z.studentId.Equals($"{_studentId}"));
  834. if (studentDimension==null)
  835. {
  836. studentDimension=new StudentDimensionScore
  837. {
  838. stuExamScores=stuExamScores,
  839. art=60,
  840. classId=student.classId,
  841. className=student.classId,
  842. classRanking=0,
  843. exam=60,
  844. gradeRanking=0,
  845. gscore=60,
  846. intelligence=60,
  847. labour=60,
  848. level="",
  849. picture=student.picture,
  850. pscore=60,
  851. score=60,
  852. sports=60,
  853. studentId=student.id,
  854. studentName=student.name,
  855. subject_music=0,
  856. subject_painting=0,
  857. tscore=60,
  858. virtue=60,
  859. crate=0,
  860. xrate=0,
  861. // zrate=60,
  862. prate=0,
  863. trate=0,
  864. hrate=0
  865. };
  866. }
  867. else {
  868. studentDimension.stuExamScores= stuExamScores;
  869. }
  870. var classDimension = classDimensions.Find(z => z.classId.Equals(student.classId));
  871. studentStatistics= new {
  872. studentDimension, inClass = classDimension, inGrade = new
  873. {
  874. grade_gscore_avg,
  875. grade_pscore_avg,
  876. grade_tscore_avg,
  877. grade_xrate_avg = grade_xrate_avg,
  878. grade_crate_avg = grade_crate_avg,
  879. grade_hrate_avg = grade_hrate_avg,
  880. grade_prate_avg = grade_prate_avg,
  881. grade_trate_avg = grade_trate_avg,
  882. }
  883. };
  884. studentOverallEducation = overallEducations.FindAll(x => x.studentId.Equals($"{_studentId}")).FirstOrDefault();
  885. if (studentOverallEducation==null)
  886. {
  887. studentOverallEducation = new OverallEducation() { studentId=student.id, name= student.name, classId=student.classId, picture = student.picture, schoolCode= student.schoolId };
  888. }
  889. }
  890. #endregion
  891. //补充没有数据的
  892. foreach (var student in overallEducationsNoData)
  893. {
  894. var studentDimension = dimensions.Find(z => z.studentId.Equals(student.id));
  895. if (studentDimension==null)
  896. {
  897. List<ExamDimensionScore> stuExamScores = new List<ExamDimensionScore>();
  898. exam3Scores.ForEach(z => {
  899. var stu = z.xdatas.Find(z => z.code.Equals(student.id));
  900. if (stu!=null)
  901. {
  902. stuExamScores.Add(new ExamDimensionScore { examName=z.name, classRate=z.classRate, gradeRate=z.gradeRate, stuScore=stu.value });
  903. }
  904. });
  905. studentDimension=new StudentDimensionScore
  906. {
  907. stuExamScores=stuExamScores,
  908. art=60,
  909. classId=student.classId,
  910. className=student.classId,
  911. classRanking=0,
  912. exam=60,
  913. gradeRanking=0,
  914. gscore=60,
  915. intelligence=60,
  916. labour=60,
  917. level="",
  918. picture=student.picture,
  919. pscore=60,
  920. score=60,
  921. sports=60,
  922. studentId=student.studentId,
  923. studentName=student.name,
  924. subject_music=0,
  925. subject_painting=0,
  926. tscore=60,
  927. virtue=60,
  928. crate=0,
  929. xrate=0,
  930. //zrate=0,
  931. prate=0,
  932. trate=0,
  933. hrate=0
  934. };
  935. dimensions.Add(studentDimension);
  936. }
  937. }
  938. return Ok(new
  939. {
  940. avg_intelligence= dimensions.IsNotEmpty()?Math.Round(dimensions.Average(x => x.intelligence),2):0,
  941. avg_virtue = dimensions.IsNotEmpty() ? Math.Round(dimensions.Average(x => x.virtue),2):0,
  942. avg_labour = dimensions.IsNotEmpty() ? Math.Round(dimensions.Average(x => x.labour), 2) : 0,
  943. avg_sports = dimensions.IsNotEmpty() ? Math.Round(dimensions.Average(x => x.sports), 2) : 0,
  944. avg_art = dimensions.IsNotEmpty() ? Math.Round(dimensions.Average(x => x.art), 2) : 0,
  945. examScores,
  946. sports_count60,
  947. sports_count90,
  948. labour_count60,
  949. labour_count90,
  950. virtue_count60,
  951. virtue_count90,
  952. art_count60,
  953. art_count90,
  954. subject_music_count60,
  955. subject_music_count90,
  956. subject_painting_count60,
  957. subject_painting_count90,
  958. achievementScores,
  959. grade_pscore_avg,
  960. grade_tscore_avg,
  961. grade_gscore_avg,
  962. grade_prate_avg = grade_prate_avg,
  963. grade_trate_avg = grade_trate_avg,
  964. //grade_zrate_avg = grade_gscore_avg,
  965. grade_hrate_avg = grade_hrate_avg,
  966. grade_xrate_avg = grade_xrate_avg,
  967. grade_crate_avg = grade_crate_avg,
  968. pscore_avg,
  969. tscore_avg,
  970. gscore_avg,
  971. prate_avg = pscore_avg,
  972. trate_avg = tscore_avg,
  973. zrate_avg = gscore_avg,
  974. xrate_avg = 60,
  975. crate_avg = 60,
  976. classDimensions,
  977. dimensions = dimensions.OrderByDescending(x => x.score),
  978. data_count,
  979. classCount = classes.Count,
  980. rate90,
  981. rate60,
  982. sports_rate60,
  983. sports_rate90,
  984. art_rate60,
  985. art_rate90,
  986. labour_rate60,
  987. labour_rate90,
  988. virtue_rate60,
  989. virtue_rate90,
  990. subject_music_rate90,
  991. subject_music_rate60,
  992. subject_painting_rate90,
  993. subject_painting_rate60,
  994. studentCount = students.Count(),
  995. studentOverallEducation,
  996. studentStatistics,
  997. overallEducationsNoData,
  998. });
  999. }
  1000. catch (Exception ex)
  1001. {
  1002. await _dingDing.SendBotMsg($"{_option.Location},{ex.Message}\n{ex.StackTrace},{json.ToJsonString()}",GroupNames.成都开发測試群組);
  1003. }
  1004. return Ok();
  1005. }
  1006. public class ExamScore {
  1007. public double gradeRate { get; set; }
  1008. public double classRate { get; set; }
  1009. public string name { get; set; }
  1010. public List<CodeDouble> xdatas = new List<CodeDouble>();
  1011. }
  1012. /// <summary>
  1013. /// 素养
  1014. /// </summary>
  1015. public class AchievementScore
  1016. {
  1017. //class 班级,student 学生
  1018. public string type { get; set; } = "class";
  1019. /// <summary>
  1020. /// 班级名称 或者学生姓名
  1021. /// </summary>
  1022. public string name { get; set; }
  1023. /// <summary>
  1024. /// 班级id 或者学生id
  1025. /// </summary>
  1026. public string id { get; set; }
  1027. public double gscore { get; set; }
  1028. public double pscore { get; set; }
  1029. public double tscore { get; set; }
  1030. public double xrate { get; set; }
  1031. public double crate { get; set; }
  1032. //public double zrate { get; set; }
  1033. public double prate { get; set; }
  1034. public double trate { get; set; }
  1035. public double hrate { get; set; }
  1036. }
  1037. public class ExamDimensionScore
  1038. {
  1039. public string examName { get; set; }
  1040. public double stuScore { get; set; }
  1041. public double classRate { get;set; }
  1042. public double gradeRate { get; set; }
  1043. }
  1044. public class ClassDimensionScore
  1045. {
  1046. public string classId { get; set; }
  1047. public string className { get; set; }
  1048. public double score { get; set; }
  1049. public double gscore { get; set; }
  1050. public double pscore { get; set; }
  1051. public double tscore { get; set; }
  1052. public double hrate { get; set; }
  1053. // public double zrate { get; set; }
  1054. public double prate { get; set; }
  1055. public double trate { get; set; }
  1056. public double crate { get; set; }
  1057. public double xrate { get; set; }
  1058. public double exam { get; set; }
  1059. public string intelligenceLevel { get; set; }
  1060. public double max { get; set; }
  1061. public double min { get; set; }
  1062. public string level { get; set; }
  1063. // 等级人数
  1064. public List<CodeLong> intelligenceLevels { get; set; } = new List<CodeLong>();
  1065. public double avg_intelligence { get; set; }
  1066. public double avg_virtue { get; set; }
  1067. public double avg_labour { get; set; }
  1068. public double avg_sports { get; set; }
  1069. public double avg_art { get; set; }
  1070. }
  1071. public class StudentDimensionScore
  1072. {
  1073. public List<ExamDimensionScore> stuExamScores { get; set; } = new List<ExamDimensionScore>();
  1074. public string className { get; set; }
  1075. public string classId { get; set; }
  1076. public string studentId { get; set; }
  1077. public string studentName { get; set; }
  1078. public string picture { get; set; }
  1079. public double score { get; set; }
  1080. public double sports { get; set; }
  1081. public double art { get; set; }
  1082. public double subject_music { get; set; }
  1083. public double subject_painting { get; set; }
  1084. public double labour { get; set; }
  1085. public double intelligence { get; set; }
  1086. public double virtue { get; set; }
  1087. public double exam { get; set; }
  1088. public double gscore { get; set; }
  1089. public double pscore { get; set; }
  1090. public double tscore { get; set; }
  1091. // public double zrate { get; set; }
  1092. public double prate { get; set; }
  1093. public double trate { get; set; }
  1094. public double crate { get; set; }
  1095. public double xrate { get; set; }
  1096. public double hrate { get; set; }
  1097. public int classRanking { get; set; }
  1098. public int gradeRanking { get; set; }
  1099. public string level { get; set; }
  1100. }
  1101. /// <summary>
  1102. /// 学生学生画像是否是默认初始化
  1103. /// </summary>
  1104. public class StudentDimensionScoreDefault
  1105. {
  1106. public string studentId { get; set; }
  1107. public int sports { get; set; }
  1108. public int art { get; set; }
  1109. public int subject_music { get; set; }
  1110. public int subject_painting { get; set; }
  1111. public int labour { get; set; }
  1112. public int intelligence { get; set; }
  1113. public int virtue { get; set; }
  1114. public int exam { get; set; }
  1115. public int gscore { get; set; }
  1116. public int pscore { get; set; }
  1117. public int tscore { get; set; }
  1118. }
  1119. /*
  1120. {
  1121. "grades": [
  1122. 0,1
  1123. ],
  1124. "periodId": "463db08d-cbe7-48a0-a81a-fc39b3c1fep1",
  1125. "school": "hbcn",
  1126. "classIds": [
  1127. "e1729a0c-0e7c-4968-bec9-21254b70325b",
  1128. "b44694b7-4cb2-46b8-8986-106696c4a282"
  1129. ]
  1130. }
  1131. */
  1132. }
  1133. }