TriggerQuotaImport.cs 14 KB

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