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