OverallEducationService.cs 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. using Microsoft.Azure.Cosmos;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Text.Json;
  7. using System.Threading.Tasks;
  8. using TEAMModelOS.SDK.DI;
  9. using TEAMModelOS.SDK.Extension;
  10. namespace TEAMModelOS.SDK.Models
  11. {
  12. public static class OverallEducationService
  13. {
  14. public static Dictionary<string, object> GetQueryCond(JsonElement request) {
  15. Dictionary<string, object> dict = new Dictionary<string, object>();
  16. if (request.TryGetProperty("periodId", out JsonElement periodId) && !string.IsNullOrWhiteSpace($"{periodId}"))
  17. {
  18. dict.Add("periodId", periodId);
  19. }
  20. if (request.TryGetProperty("classIds", out JsonElement classIds))
  21. {
  22. dict.Add("classId", classIds);
  23. }
  24. return dict;
  25. }
  26. public async static Task<(List<Class> classes, List<Student> students, List<Class> grade_classes, List<Student> grade_students, List<OverallEducation> overallEducations)>
  27. GetGradeData(CosmosClient client, HashSet<int> years,string _periodId,string _school,HashSet<string> classIds,string _studyYear,string _semesterId, AzureRedisFactory _azureRedis) {
  28. List<Class> classes = new List<Class>();
  29. List<Student> students = new List<Student>();
  30. List<Class> grade_classes = new List<Class>();
  31. List<Student> grade_students = new List<Student>();
  32. //StringBuilder sql = new StringBuilder($"select value c from c where c.year in ({string.Join(",", years)}) and c.periodId='{_periodId}' ");
  33. //if (classIds.Any() && classIds.Count>0)
  34. //{
  35. // sql.Append($" and c.id in ({string.Join(",", classIds.Select(z => $"'{z}'"))})");
  36. //}
  37. //当前条件的班级
  38. // var result = await client.GetContainer(Constant.TEAMModelOS, Constant.School).GetList<Class>(sql.ToString(), $"Class-{_school}");
  39. //classes = result.list;
  40. //StringBuilder studentCountSQL = new StringBuilder($"select c.id,c.name ,c.picture, c.classId,c.periodId ,c.year from c " +
  41. // $"where ( c.graduate = 0 or IS_DEFINED(c.graduate) = false) and c.classId in ({string.Join(",", classes.Select(z => $"'{z.id}'"))}) ");
  42. //当前条件的学生
  43. // var data = await client.GetContainer(Constant.TEAMModelOS, Constant.Student).GetList<Student>(studentCountSQL.ToString(), $"Base-{_school}");
  44. //获取年级的所有的班级
  45. StringBuilder gradeSql = new StringBuilder($"select value c from c where c.year in ({string.Join(",", years)}) and c.periodId='{_periodId}' ");
  46. var result_grade_classes = await client.GetContainer(Constant.TEAMModelOS, Constant.School).GetList<Class>(gradeSql.ToString(), $"Class-{_school}");
  47. grade_classes = result_grade_classes.list;
  48. //------获取当前条件的班级
  49. classes= grade_classes.FindAll(z => classIds!=null && classIds.Any() && classIds.Count>0 ? classIds.Contains(z.id):true && z.periodId.Equals(_periodId) && years.Contains(z.year));
  50. string classin = string.Empty;
  51. if (classes.IsNotEmpty())
  52. {
  53. classin=$" {string.Join(",", grade_classes.Select(z => $"'{z.id}'"))} ";
  54. }
  55. else
  56. {
  57. classin="'--00000--'";
  58. }
  59. StringBuilder grade_studentCountSQL = new StringBuilder($"select c.id,c.name ,c.picture, c.classId,c.periodId ,c.year from c " +
  60. $" where c.classId in ( {classin} ) and c.periodId='{_periodId}' and ( c.graduate = 0 or IS_DEFINED(c.graduate) = false) ");
  61. //获取年级所有学生
  62. var gradeData = await client.GetContainer(Constant.TEAMModelOS, Constant.Student).GetList<Student>(grade_studentCountSQL.ToString(), $"Base-{_school}");
  63. grade_students = gradeData.list;
  64. //------获取当前条件的学生
  65. students = grade_students.FindAll(z => classes.Select(x => x.id).Contains(z.classId) && z.periodId.Equals(_periodId));
  66. //获取缓存的五育数据
  67. //1.先从redis获取部分。
  68. List<OverallEducation> overallEducations = new List<OverallEducation>();
  69. foreach (var grade_class in grade_classes)
  70. {
  71. string key = $"OverallEducation:{_school}:{_periodId}:{_studyYear}:{_semesterId}:{grade_class.id}";
  72. var records = await _azureRedis.GetRedisClient(8).HashGetAllAsync(key);
  73. foreach (var rcd in records)
  74. {
  75. var value = rcd.Value.ToString().ToObject<OverallEducation>();
  76. if (value != null && !string.IsNullOrWhiteSpace(value.studentId))
  77. {
  78. overallEducations.Add(value);
  79. }
  80. }
  81. }
  82. //2.整个年级的学生基础信息,对比redis获取的差,看是否是有部门未缓存在Redis,缓存没有数据的学生。
  83. var no_overall_stduents = grade_students.ExceptBy(overallEducations.Select(z => z.studentId), v => v.id);
  84. if (no_overall_stduents.Any() && no_overall_stduents.Count() > 0)
  85. {
  86. string oesql = $"select value c from c where c.semesterId='{_semesterId}' and c.year={_studyYear} and c.periodId='{_periodId}' and c.studentId in ({string.Join(",", no_overall_stduents.Select(z => $"'{z.id}'"))}) ";
  87. var oeresults = await client.GetContainer(Constant.TEAMModelOS, Constant.Student).GetList<OverallEducation>(oesql, $"OverallEducation-{_school}");
  88. if (oeresults.list.IsNotEmpty())
  89. {
  90. overallEducations.AddRange(oeresults.list);
  91. //将获取到的最新数据缓存在redis中。下次则不需要再次获取
  92. foreach (var item in oeresults.list)
  93. {
  94. string key = $"OverallEducation:{item.schoolCode}:{item.periodId}:{item.year}:{item.semesterId}:{item.classId}";
  95. await _azureRedis.GetRedisClient(8).HashSetAsync(key, item.studentId, item.ToJsonString());
  96. await _azureRedis.GetRedisClient(8).KeyExpireAsync(key, new TimeSpan(180 * 24, 0, 0));
  97. }
  98. }
  99. }
  100. return (classes, students, grade_classes, grade_students, overallEducations);
  101. }
  102. }
  103. }