TriggerQuotaImport.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. using Microsoft.Extensions.Configuration;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Net.Http;
  6. using System.Text;
  7. using System.Text.Json;
  8. using System.Threading.Tasks;
  9. using TEAMModelOS.SDK.DI;
  10. using TEAMModelOS.SDK;
  11. using Microsoft.Azure.Cosmos;
  12. using TEAMModelOS.SDK.Models.Cosmos.School;
  13. using TEAMModelOS.SDK.Models;
  14. using TEAMModelOS.SDK.Extension;
  15. using Microsoft.OData.Edm;
  16. using TEAMModelOS.Function;
  17. namespace TEAMModelOS.CosmosDBTriggers
  18. {
  19. public class TriggerQuotaImport
  20. {
  21. public static async Task Trigger(CoreAPIHttpService _coreAPIHttpService, AzureCosmosFactory _azureCosmos, AzureServiceBusFactory _serviceBus, AzureStorageFactory _azureStorage, DingDing _dingDing,
  22. CosmosClient client, JsonElement input, TriggerData data, IHttpClientFactory _httpClient, IConfiguration _configuration,AzureRedisFactory _azureRedis)
  23. {
  24. QuotaImport quotaImport = input.ToObject<QuotaImport>();
  25. if (quotaImport != null)
  26. {
  27. HashSet<string> ids = new HashSet<string>();
  28. foreach (var x in quotaImport.students)
  29. {
  30. string id = $"{quotaImport.year}-{quotaImport.semesterId}-{x.id}";
  31. ids.Add(id);
  32. }
  33. HashSet<OverallEducation> overallEducations = new HashSet<OverallEducation>();
  34. string sql = $"select value c from c where c.id in ({string.Join(",", ids.Select(z => $"'{z}'"))}) and c.periodId='{quotaImport.periodId}' ";
  35. var result = await client.GetContainer(Constant.TEAMModelOS, Constant.Student).GetList<OverallEducation>(sql, $"OverallEducation-{quotaImport.school}");
  36. IEnumerable<string> notInDbIds = null;
  37. if (result.list.IsNotEmpty())
  38. {
  39. notInDbIds = ids.Except(result.list.Select(x => x.id));
  40. overallEducations = new HashSet<OverallEducation>(result.list);
  41. }
  42. else
  43. {
  44. notInDbIds = ids;
  45. }
  46. HashSet<OverallEducation> overallEducationChanged = new HashSet<OverallEducation>();
  47. foreach (var y in quotaImport.students)
  48. {
  49. string id = $"{quotaImport.year}-{quotaImport.semesterId}-{y.id}";
  50. var overallEducation = overallEducations.Where(z => z.id.Equals(id)).FirstOrDefault();
  51. if (overallEducation != null)
  52. {
  53. EducationScore quota = null;
  54. if (quotaImport.dimension.Equals("virtue"))
  55. {
  56. quota = overallEducation.virtue.Find(f => f.examId.Equals($"{overallEducation.stuYear}-{overallEducation.semesterId}"));
  57. }
  58. else if (quotaImport.dimension.Equals("labour")) {
  59. quota = overallEducation.labour.Find(f => f.examId.Equals($"{overallEducation.stuYear}-{overallEducation.semesterId}"));
  60. }
  61. else if (quotaImport.dimension.Equals("sports"))
  62. {
  63. quota = overallEducation.sports.Find(f => f.examId.Equals($"{overallEducation.stuYear}-{overallEducation.semesterId}"));
  64. }
  65. if (quota != null)
  66. {
  67. //体育成绩直接覆盖
  68. if (quotaImport.dimension.Equals("sports"))
  69. {
  70. List<ItemScore> itemScores = y.items.Select(z => new ItemScore
  71. {
  72. totalScore = !quotaImport.dimension.Equals("sports") ? 0 : 100,
  73. name = z.code,
  74. score = z.value,
  75. type = z.code,
  76. id = !quotaImport.dimension.Equals("sports") ? $"{y.date}-{z.code}" : z.code,
  77. time = y.time
  78. }).ToList();
  79. quota.itemScore = itemScores;
  80. overallEducationChanged.Add(overallEducation);
  81. }
  82. else {
  83. y.items.ForEach(z => {
  84. var item = quota.itemScore.Find(f => f.id.Equals(!quotaImport.dimension.Equals("sports") ? $"{y.date}-{z.code}" : z.code));
  85. if (item != null)
  86. {
  87. item.name = z.code;
  88. if (item.score != z.value)
  89. {
  90. item.score = z.value;
  91. overallEducationChanged.Add(overallEducation);
  92. }
  93. item.totalScore = !quotaImport.dimension.Equals("sports") ? 0 : 100;
  94. item.type = z.code;
  95. item.time = y.time;
  96. item.id = !quotaImport.dimension.Equals("sports") ? $"{y.date}-{z.code}" : z.code;
  97. }
  98. else
  99. {
  100. overallEducationChanged.Add(overallEducation);
  101. quota.itemScore.Add(new ItemScore
  102. {
  103. totalScore = !quotaImport.dimension.Equals("sports") ? 0 : 100,
  104. name = z.code,
  105. score = z.value,
  106. type = z.code,
  107. id = id = !quotaImport.dimension.Equals("sports") ? $"{y.date}-{z.code}" : z.code,
  108. time = y.time
  109. });
  110. }
  111. });
  112. }
  113. if (quota.sumScore != quota.itemScore.Sum(z => z.score)) {
  114. overallEducationChanged.Add(overallEducation);
  115. quota.sumScore = quota.itemScore.Sum(z => z.score);
  116. }
  117. if (quota.totalScore != quota.itemScore.Sum(z => z.totalScore))
  118. {
  119. overallEducationChanged.Add(overallEducation);
  120. quota.totalScore = quota.itemScore.Sum(z => z.totalScore);
  121. }
  122. quota.rate = quotaImport.dimension.Equals("sports") && quota.itemScore.Sum(z => z.totalScore) > 0 ? quota.itemScore.Sum(z => z.score) * 1.0 / quota.itemScore.Sum(z => z.totalScore) : 0;
  123. quota.excellenceRate = quotaImport.dimension.Equals("sports") && quota.itemScore.Sum(z => z.totalScore) > 0 ? quota.itemScore.Where(z => z.score >= 90).Sum(z => z.score) * 1.0 / quota.itemScore.Sum(z => z.totalScore) : 0;
  124. quota.passRate = quotaImport.dimension.Equals("sports") && quota.itemScore.Sum(z => z.totalScore) > 0 ? quota.itemScore.Where(z => z.score >= 60).Sum(z => z.score) * 1.0 / quota.itemScore.Sum(z => z.totalScore) : 0;
  125. quota.examType = quotaImport.type;
  126. quota.examDate = quotaImport.time;
  127. quota.examName = $"{overallEducation.stuYear}-{overallEducation.semesterId}";
  128. }
  129. else
  130. {
  131. List<ItemScore> itemScores = y.items.Select(z =>new ItemScore {
  132. totalScore = !quotaImport.dimension.Equals("sports") ? 0 : 100,
  133. name = z.code,
  134. score = z.value,
  135. type = z.code,
  136. id = !quotaImport.dimension.Equals("sports") ? $"{y.date}-{z.code}" : z.code,
  137. time = y.time
  138. }).ToList();
  139. EducationScore educationScore = new EducationScore
  140. {
  141. examName = $"{overallEducation.stuYear}-{overallEducation.semesterId}",
  142. examId = $"{overallEducation.stuYear}-{overallEducation.semesterId}",
  143. examDate = quotaImport.time,
  144. examType = quotaImport.type,
  145. sumScore = itemScores.Sum(z => z.score),
  146. itemScore = itemScores,
  147. totalScore = itemScores.Sum(z => z.totalScore),
  148. rate = quotaImport.dimension.Equals("sports") && itemScores.Sum(z => z.totalScore) > 0 ? itemScores.Sum(z => z.score) * 1.0 / itemScores.Sum(z => z.totalScore) : 0,
  149. excellenceRate = quotaImport.dimension.Equals("sports") && itemScores.Sum(z => z.totalScore) > 0 ? itemScores.Where(z => z.score >= 90).Sum(z => z.score) * 1.0 / itemScores.Sum(z => z.totalScore) : 0,
  150. passRate = quotaImport.dimension.Equals("sports") && itemScores.Sum(z => z.totalScore) > 0 ? itemScores.Where(z => z.score >= 60).Sum(z => z.score) * 1.0 / itemScores.Sum(z => z.totalScore) : 0,
  151. };
  152. if (quotaImport.dimension.Equals("virtue"))
  153. {
  154. overallEducation.virtue.Add(educationScore);
  155. }
  156. else if (quotaImport.dimension.Equals("labour"))
  157. {
  158. overallEducation.labour.Add(educationScore);
  159. }
  160. else if (quotaImport.dimension.Equals("sports"))
  161. {
  162. overallEducation.sports.Add(educationScore);
  163. }
  164. overallEducationChanged.Add(overallEducation);
  165. }
  166. }
  167. else
  168. {
  169. List<ItemScore> itemScores = y.items.Select(z => new ItemScore {
  170. totalScore = !quotaImport.dimension.Equals("sports") ? 0 : 100,
  171. name = z.code,
  172. score = z.value,
  173. type = z.code,
  174. id = !quotaImport.dimension.Equals("sports") ? $"{y.date}-{z.code}" : z.code,
  175. time = y.time
  176. }
  177. ).ToList();
  178. var educationScores = new List<EducationScore>
  179. {
  180. new EducationScore
  181. {
  182. examName=$"{y.stuYear}-{quotaImport.semesterId}",
  183. examId =$"{y.stuYear}-{quotaImport.semesterId}",
  184. examDate=quotaImport.time,
  185. examType=quotaImport.type,
  186. sumScore = itemScores.Sum(z => z.score),
  187. itemScore = itemScores,
  188. totalScore = itemScores.Sum(z => z.totalScore),
  189. rate= quotaImport.dimension.Equals("sports") && itemScores.Sum(z => z.totalScore)>0 ? itemScores.Sum(z => z.score) *1.0 / itemScores.Sum(z => z.totalScore):0,
  190. excellenceRate=quotaImport.dimension.Equals("sports")&& itemScores.Sum(z => z.totalScore)>0 ? itemScores.Where(z => z.score >= 90).Sum(z => z.score) *1.0 / itemScores.Sum(z => z.totalScore):0,
  191. passRate= quotaImport.dimension.Equals("sports") && itemScores.Sum(z => z.totalScore)>0 ? itemScores.Where(z => z.score >= 60).Sum(z => z.score) *1.0 / itemScores.Sum(z => z.totalScore):0,
  192. }
  193. };
  194. overallEducation = new OverallEducation
  195. {
  196. id = id,
  197. code = $"OverallEducation-{quotaImport.school}",
  198. pk = "OverallEducation",
  199. periodId = quotaImport.periodId,
  200. year = quotaImport.year,
  201. semesterId = quotaImport.semesterId,
  202. schoolCode = quotaImport.school,
  203. studentId = y.id,
  204. name = y.name,
  205. classId = y.classId,
  206. stuYear = y.stuYear
  207. };
  208. if (quotaImport.dimension.Equals("virtue"))
  209. {
  210. overallEducation.virtue= educationScores;
  211. }
  212. else if (quotaImport.dimension.Equals("labour"))
  213. {
  214. overallEducation.labour= educationScores;
  215. }
  216. else if (quotaImport.dimension.Equals("sports"))
  217. {
  218. overallEducation.sports= educationScores;
  219. }
  220. overallEducationChanged.Add(overallEducation);
  221. overallEducations.Add(overallEducation);
  222. }
  223. }
  224. foreach (var item in overallEducationChanged) {
  225. await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS,Constant.Student).UpsertItemAsync(item,new PartitionKey (item.code));
  226. string key = $"OverallEducation:{item.schoolCode}:{item.periodId}:{item.year}:{item.semesterId}:{item.classId}";
  227. await _azureRedis.GetRedisClient(8).HashSetAsync(key, item.studentId, item.ToJsonString());
  228. await _azureRedis.GetRedisClient(8).KeyExpireAsync(key, new TimeSpan(180 * 24, 0, 0));
  229. }
  230. }
  231. }
  232. }
  233. }