ActivityHttpTrigger.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  1. using System;
  2. using System.IO;
  3. using System.Threading.Tasks;
  4. using Microsoft.AspNetCore.Mvc;
  5. using Microsoft.Azure.WebJobs;
  6. using Microsoft.Azure.WebJobs.Extensions.Http;
  7. using Microsoft.AspNetCore.Http;
  8. using Microsoft.Extensions.Logging;
  9. using Newtonsoft.Json;
  10. using TEAMModelOS.SDK.DI;
  11. using Azure.Cosmos;
  12. using System.Text.Json;
  13. using System.Collections.Generic;
  14. using TEAMModelOS.SDK.Models;
  15. using TEAMModelOS.SDK.Extension;
  16. using TEAMModelOS.SDK.Helper.Common.CollectionHelper;
  17. using TEAMModelOS.SDK.Models.Cosmos;
  18. using TEAMModelOS.SDK.Models.Cosmos.Common;
  19. namespace TEAMModelFunction
  20. {
  21. public class ActivityHttpTrigger
  22. {
  23. private readonly AzureCosmosFactory _azureCosmos;
  24. private readonly DingDing _dingDing;
  25. private readonly AzureStorageFactory _azureStorage;
  26. private readonly AzureRedisFactory _azureRedis;
  27. public ActivityHttpTrigger(AzureCosmosFactory azureCosmos, DingDing dingDing, AzureStorageFactory azureStorage
  28. , AzureRedisFactory azureRedis)
  29. {
  30. _azureCosmos = azureCosmos;
  31. _dingDing = dingDing;
  32. _azureStorage = azureStorage;
  33. _azureRedis = azureRedis;
  34. }
  35. [FunctionName("fix-exam-activity")]
  36. public async Task<IActionResult> ExamActivity([HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = null)] HttpRequest req,ILogger log)
  37. {
  38. log.LogInformation("fix-exam-activity...");
  39. string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
  40. List<string> datas = JsonConvert.DeserializeObject<List<string>>(requestBody);
  41. var client = _azureCosmos.GetCosmosClient();
  42. var query = $"select * from c ";
  43. foreach (string data in datas) {
  44. List<ExamInfo> exams = new List<ExamInfo>();
  45. await foreach (var item in client.GetContainer("TEAMModelOS", "Common").GetItemQueryStreamIterator(
  46. queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Exam-{data}") }))
  47. {
  48. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  49. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  50. {
  51. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  52. {
  53. exams.Add(obj.ToObject<ExamInfo>());
  54. }
  55. }
  56. }
  57. log.LogInformation($"{exams.ToJsonString()}");
  58. foreach (var info in exams)
  59. {
  60. if (info.classes.IsEmpty())
  61. {
  62. continue;
  63. }
  64. List<string> sub = new List<string>();
  65. foreach (ExamSubject subject in info.subjects)
  66. {
  67. sub.Add(subject.id);
  68. }
  69. (List<string> tmdids, List<Students> studentss) = await TriggerStuActivity.GetStuList(client, info.classes, info.school);
  70. List<StuActivity> stuActivities = new List<StuActivity>();
  71. List<StuActivity> tmdActivities = new List<StuActivity>();
  72. if (tmdids.IsNotEmpty())
  73. {
  74. tmdids.ForEach(x => {
  75. tmdActivities.Add(new StuActivity
  76. {
  77. pk = "Activity",
  78. id = info.id,
  79. code = $"Activity-{x}",
  80. type = "exam",
  81. name = info.name,
  82. startTime = info.startTime,
  83. endTime = info.endTime,
  84. scode = info.code,
  85. scope = info.scope,
  86. school = info.school,
  87. creatorId = info.creatorId,
  88. subjects = sub,
  89. blob = null
  90. });
  91. });
  92. }
  93. if (studentss.IsNotEmpty())
  94. {
  95. studentss.ForEach(x => {
  96. stuActivities.Add(new StuActivity
  97. {
  98. pk = "Activity",
  99. id = info.id,
  100. code = $"Activity-{info.school}-{x.id}",
  101. type = "exam",
  102. name = info.name,
  103. startTime = info.startTime,
  104. endTime = info.endTime,
  105. scode = info.code,
  106. scope = info.scope,
  107. school = info.school,
  108. creatorId = info.creatorId,
  109. subjects = sub,
  110. blob=null
  111. });
  112. });
  113. }
  114. await TriggerStuActivity.SaveStuActivity(client, stuActivities, tmdActivities);
  115. }
  116. }
  117. return new OkObjectResult(new { });
  118. }
  119. [FunctionName("fix-vote-activity")]
  120. public async Task<IActionResult> VoteActivity(
  121. [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
  122. ILogger log)
  123. {
  124. log.LogInformation("fix-vote-activity...");
  125. string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
  126. List<string> datas = JsonConvert.DeserializeObject<List<string>>(requestBody);
  127. var client = _azureCosmos.GetCosmosClient();
  128. var query = $"select * from c ";
  129. foreach (string data in datas)
  130. {
  131. List<Vote> votes = new List<Vote>();
  132. await foreach (var item in client.GetContainer("TEAMModelOS", "Common").GetItemQueryStreamIterator(
  133. queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Vote-{data}") }))
  134. {
  135. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  136. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  137. {
  138. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  139. {
  140. votes.Add(obj.ToObject<Vote>());
  141. }
  142. }
  143. }
  144. log.LogInformation($"{votes.ToJsonString()}");
  145. foreach (var info in votes)
  146. {
  147. if (info.classes.IsEmpty())
  148. {
  149. continue;
  150. }
  151. (List<string> tmdids, List<Students> studentss) = await TriggerStuActivity.GetStuList(client, info.classes, info.school);
  152. List<StuActivity> stuActivities = new List<StuActivity>();
  153. List<StuActivity> tmdActivities = new List<StuActivity>();
  154. if (tmdids.IsNotEmpty())
  155. {
  156. tmdids.ForEach(x => {
  157. tmdActivities.Add(new StuActivity
  158. {
  159. pk = "Activity",
  160. id = info.id,
  161. code = $"Activity-{x}",
  162. type = "vote",
  163. name = info.name,
  164. startTime = info.startTime,
  165. endTime = info.endTime,
  166. scode = info.code,
  167. scope = info.scope,
  168. school = info.school,
  169. creatorId = info.creatorId,
  170. subjects = new List<string>() { "" },
  171. blob = null
  172. });
  173. });
  174. }
  175. if (studentss.IsNotEmpty())
  176. {
  177. studentss.ForEach(x => {
  178. stuActivities.Add(new StuActivity
  179. {
  180. pk = "Activity",
  181. id = info.id,
  182. code = $"Activity-{info.school}-{x.id}",
  183. type = "vote",
  184. name = info.name,
  185. startTime = info.startTime,
  186. endTime = info.endTime,
  187. scode = info.code,
  188. scope = info.scope,
  189. school = info.school,
  190. creatorId = info.creatorId,
  191. subjects = new List<string>() { "" },
  192. blob = null
  193. });
  194. });
  195. }
  196. await TriggerStuActivity.SaveStuActivity(client, stuActivities, tmdActivities);
  197. }
  198. }
  199. return new OkObjectResult(new { });
  200. }
  201. [FunctionName("fix-survey-activity")]
  202. public async Task<IActionResult> SurveyActivity(
  203. [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
  204. ILogger log)
  205. {
  206. log.LogInformation("fix-survey-activity...");
  207. string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
  208. List<string> datas = JsonConvert.DeserializeObject<List<string>>(requestBody);
  209. var client = _azureCosmos.GetCosmosClient();
  210. var query = $"select * from c ";
  211. foreach (string data in datas)
  212. {
  213. List<Survey> surveys = new List<Survey>();
  214. await foreach (var item in client.GetContainer("TEAMModelOS", "Common").GetItemQueryStreamIterator(
  215. queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Survey-{data}") }))
  216. {
  217. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  218. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  219. {
  220. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  221. {
  222. surveys.Add(obj.ToObject<Survey>());
  223. }
  224. }
  225. }
  226. log.LogInformation($"{surveys.ToJsonString()}");
  227. foreach (var info in surveys)
  228. {
  229. if (info.classes.IsEmpty())
  230. {
  231. continue;
  232. }
  233. (List<string> tmdids, List<Students> studentss) = await TriggerStuActivity.GetStuList(client, info.classes, info.school);
  234. List<StuActivity> stuActivities = new List<StuActivity>();
  235. List<StuActivity> tmdActivities = new List<StuActivity>();
  236. if (tmdids.IsNotEmpty())
  237. {
  238. tmdids.ForEach(x => {
  239. tmdActivities.Add(new StuActivity
  240. {
  241. pk = "Activity",
  242. id = info.id,
  243. code = $"Activity-{x}",
  244. type = "survey",
  245. name = info.name,
  246. startTime = info.startTime,
  247. endTime = info.endTime,
  248. scode = info.code,
  249. scope = info.scope,
  250. school = info.school,
  251. creatorId = info.creatorId,
  252. subjects = new List<string>() { "" },
  253. blob = info.blob
  254. });
  255. });
  256. }
  257. if (studentss.IsNotEmpty())
  258. {
  259. studentss.ForEach(x => {
  260. stuActivities.Add(new StuActivity
  261. {
  262. pk = "Activity",
  263. id = info.id,
  264. code = $"Activity-{info.school}-{x.id}",
  265. type = "survey",
  266. name = info.name,
  267. startTime = info.startTime,
  268. endTime = info.endTime,
  269. scode = info.code,
  270. scope = info.scope,
  271. school = info.school,
  272. creatorId = info.creatorId,
  273. subjects = new List<string>() { "" },
  274. blob=info.blob
  275. });
  276. });
  277. }
  278. await TriggerStuActivity.SaveStuActivity(client, stuActivities, tmdActivities);
  279. }
  280. }
  281. return new OkObjectResult(new { });
  282. }
  283. }
  284. }