TestController.cs 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. using Azure.Cosmos;
  2. using Microsoft.AspNetCore.Http;
  3. using Microsoft.AspNetCore.Mvc;
  4. using Newtonsoft.Json;
  5. using OS.Funct;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.IO;
  9. using System.Linq;
  10. using System.Text.Json;
  11. using System.Threading.Tasks;
  12. using TEAMModelOS.SDK.DI;
  13. using TEAMModelOS.SDK.Extension;
  14. using TEAMModelOS.SDK.Helper.Common.CollectionHelper;
  15. using TEAMModelOS.SDK.Models;
  16. using TEAMModelOS.SDK.Models.Cosmos.Common;
  17. namespace TEAMModelOS.Controllers.XTest
  18. {
  19. [Route("test")]
  20. [ApiController]
  21. public class TestController :ControllerBase
  22. {
  23. private readonly AzureStorageFactory _azureStorage;
  24. private readonly AzureRedisFactory _azureRedis;
  25. private readonly AzureCosmosFactory _azureCosmos;
  26. public TestController(AzureCosmosFactory azureCosmos, AzureRedisFactory azureRedis, AzureStorageFactory azureStorage) {
  27. _azureCosmos = azureCosmos;
  28. _azureRedis = azureRedis;
  29. _azureStorage = azureStorage;
  30. }
  31. /// <summary>
  32. /// 测试blob多线程写入同一个文件
  33. /// </summary>
  34. /// <returns></returns>
  35. [ProducesDefaultResponseType]
  36. [HttpGet("multiple-blob")]
  37. public async Task<IActionResult> MultipleBlob() {
  38. await _azureStorage.GetBlobContainerClient("hbcn").List("other");
  39. var dn=await _azureStorage.GetBlobContainerClient("hbcn").GetBlobClient("survey/2e44ee33-ba65-34b6-7e0f-b7e627c70a54/record.json").DownloadAsync();
  40. var jsonc = await JsonDocument.ParseAsync( dn.Value.Content);
  41. var Recordc = jsonc.RootElement.ToObject<JsonElement>();
  42. return Ok();
  43. }
  44. /// <summary>
  45. /// 测试redis通配符
  46. /// </summary>
  47. /// <param name="request"></param>
  48. /// <returns></returns>
  49. [ProducesDefaultResponseType]
  50. [HttpGet("test-redis")]
  51. public async Task<IActionResult> TestRedis( ) {
  52. var db = _azureRedis.GetRedisClient(8);
  53. //var keys = server.Keys(pattern: "Vote*", database: db.Database);
  54. //foreach (var key in keys) {
  55. // Console.WriteLine(key);
  56. //}
  57. // db.HashScanAsync()
  58. return Ok() ;
  59. }
  60. /// <summary>
  61. /// 删除
  62. /// </summary>
  63. /// <param name="request"></param>
  64. /// <returns></returns>
  65. [ProducesDefaultResponseType]
  66. //[AuthToken(Roles = "teacher")]
  67. [HttpPost("delete")]
  68. public async Task<IActionResult> Delete(JsonElement request)
  69. {
  70. try
  71. {
  72. if (!request.TryGetProperty("code", out JsonElement code)) return BadRequest();
  73. if (!request.TryGetProperty("scope", out JsonElement scope)) return BadRequest();
  74. var client = _azureCosmos.GetCosmosClient();
  75. List<Task> tasksFiles = new List<Task>();
  76. var query = $"select c.id from c ";
  77. if (scope.ToString().Equals("school"))
  78. {
  79. var ids = client.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"{code}") });
  80. await foreach (var id in ids)
  81. {
  82. using var json = await JsonDocument.ParseAsync(id.ContentStream);
  83. var jsonList = json.RootElement.GetProperty("Documents").EnumerateArray();
  84. //批量删除
  85. foreach (var obj in jsonList)
  86. {
  87. tasksFiles.Add(client.GetContainer("TEAMModelOS", "School").DeleteItemStreamAsync(obj.GetProperty("id").ToString(), new PartitionKey($"{code}")));
  88. }
  89. }
  90. }
  91. else if (scope.ToString().Equals("teacher")) {
  92. var ids = client.GetContainer("TEAMModelOS", "Teacher").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"{code}") });
  93. await foreach (var id in ids)
  94. {
  95. using var json = await JsonDocument.ParseAsync(id.ContentStream);
  96. var jsonList = json.RootElement.GetProperty("Documents").EnumerateArray();
  97. //批量删除
  98. foreach (var obj in jsonList)
  99. {
  100. //tasksFiles.Add(client.GetContainer("TEAMModelOS", "Teacher").DeleteItemStreamAsync(obj.GetProperty("id").ToString(), new PartitionKey($"{code}")));
  101. }
  102. }
  103. }
  104. await Task.WhenAll(tasksFiles);
  105. return Ok(new { code = 1 });
  106. }
  107. catch (Exception e)
  108. {
  109. return BadRequest(e.StackTrace);
  110. }
  111. }
  112. [ProducesDefaultResponseType]
  113. //[AuthToken(Roles = "teacher")]
  114. [HttpPost("fixExamActivity")]
  115. public async Task<IActionResult> ExamActivity(JsonElement request)
  116. {
  117. var datas = request.ToObject<List<string>>();
  118. var client = _azureCosmos.GetCosmosClient();
  119. var query = $"select * from c ";
  120. foreach (string data in datas)
  121. {
  122. List<Vote> votes = new List<Vote>();
  123. await foreach (var item in client.GetContainer("TEAMModelOS", "Common").GetItemQueryStreamIterator(
  124. queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Vote-{data}") }))
  125. {
  126. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  127. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  128. {
  129. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  130. {
  131. votes.Add(obj.ToObject<Vote>());
  132. }
  133. }
  134. }
  135. foreach (var info in votes)
  136. {
  137. if (!info.classes.IsNotEmpty())
  138. {
  139. continue;
  140. }
  141. (List<string> tmdids, List<Students> studentss) = await TriggerStuActivity.GetStuList(client, info.classes, info.school);
  142. List<StuActivity> stuActivities = new List<StuActivity>();
  143. List<StuActivity> tmdActivities = new List<StuActivity>();
  144. if (tmdids.IsNotEmpty())
  145. {
  146. tmdids.ForEach(x => {
  147. tmdActivities.Add(new StuActivity
  148. {
  149. pk = "Activity",
  150. id = info.id,
  151. code = $"Activity-{x}",
  152. type = "vote",
  153. name = info.name,
  154. startTime = info.startTime,
  155. endTime = info.endTime,
  156. scode = info.code,
  157. scope = info.scope,
  158. school = info.school,
  159. creatorId = info.creatorId,
  160. subjects = new List<string>() { "" },
  161. blob = null
  162. });
  163. });
  164. }
  165. if (studentss.IsNotEmpty())
  166. {
  167. studentss.ForEach(x => {
  168. stuActivities.Add(new StuActivity
  169. {
  170. pk = "Activity",
  171. id = info.id,
  172. code = $"Activity-{info.school}-{x.id}",
  173. type = "vote",
  174. name = info.name,
  175. startTime = info.startTime,
  176. endTime = info.endTime,
  177. scode = info.code,
  178. scope = info.scope,
  179. school = info.school,
  180. creatorId = info.creatorId,
  181. subjects = new List<string>() { "" },
  182. blob = null
  183. });
  184. });
  185. }
  186. await TriggerStuActivity.SaveStuActivity(client, stuActivities, tmdActivities);
  187. }
  188. }
  189. return new OkObjectResult(new { });
  190. }
  191. }
  192. }