CorrectController.cs 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. using Azure.Cosmos;
  2. using Microsoft.AspNetCore.Http;
  3. using Microsoft.AspNetCore.Mvc;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.IdentityModel.Tokens.Jwt;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Text.Json;
  10. using System.Threading.Tasks;
  11. using TEAMModelOS.Models.Dto;
  12. using TEAMModelOS.SDK.Models;
  13. using TEAMModelOS.SDK;
  14. using TEAMModelOS.SDK.DI;
  15. using TEAMModelOS.SDK.DI.AzureCosmos.Inner;
  16. using TEAMModelOS.SDK.Extension;
  17. using TEAMModelOS.SDK;
  18. using TEAMModelOS.SDK.Helper.Common.StringHelper;
  19. using TEAMModelOS.Models;
  20. using Microsoft.Extensions.Options;
  21. using TEAMModelOS.SDK.Models.Cosmos;
  22. using Microsoft.AspNetCore.Authorization;
  23. using TEAMModelOS.Filter;
  24. using StackExchange.Redis;
  25. using TEAMModelOS.SDK.Models.Cosmos.Common.Inner;
  26. using TEAMModelOS.Services.Common;
  27. namespace TEAMModelOS.Controllers
  28. {
  29. [ProducesResponseType(StatusCodes.Status200OK)]
  30. [ProducesResponseType(StatusCodes.Status400BadRequest)]
  31. //[Authorize(Roles = "IES5")]
  32. [Route("school/correct")]
  33. [ApiController]
  34. public class CorrectController : ControllerBase
  35. {
  36. private readonly AzureRedisFactory _azureRedis;
  37. private readonly AzureCosmosFactory _azureCosmos;
  38. private readonly SnowflakeId _snowflakeId;
  39. private readonly AzureServiceBusFactory _serviceBus;
  40. private readonly DingDing _dingDing;
  41. private readonly Option _option;
  42. private readonly AzureStorageFactory _azureStorage;
  43. public CorrectController(AzureCosmosFactory azureCosmos, AzureServiceBusFactory serviceBus, SnowflakeId snowflakeId, DingDing dingDing, IOptionsSnapshot<Option> option,
  44. AzureRedisFactory azureRedis, AzureStorageFactory azureStorage)
  45. {
  46. _azureCosmos = azureCosmos;
  47. _serviceBus = serviceBus;
  48. _snowflakeId = snowflakeId;
  49. _dingDing = dingDing;
  50. _option = option?.Value;
  51. _azureRedis = azureRedis;
  52. _azureStorage = azureStorage;
  53. }
  54. ///<summary>
  55. ///查询教师的阅卷任务列表
  56. /// </summary>
  57. /// <data>
  58. /// ! "code":"tmdid"
  59. /// </data>
  60. /// <param name="request"></param>
  61. /// <returns></returns>
  62. [ProducesDefaultResponseType]
  63. [HttpPost("find-task")]
  64. public async Task<IActionResult> FindTask(JsonElement requert) {
  65. List<CorrectTask> tasks = new List<CorrectTask>();
  66. try
  67. {
  68. var client = _azureCosmos.GetCosmosClient();
  69. //活动分区
  70. if (!requert.TryGetProperty("code", out JsonElement code)) return BadRequest();
  71. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIterator<CorrectTask>(queryText: $"select value(c) from c ",
  72. requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"CorrectTask-{code}") }))
  73. {
  74. tasks.Add(item);
  75. }
  76. return Ok(new { tasks = tasks });
  77. }
  78. catch (CosmosException ex)
  79. {
  80. await _dingDing.SendBotMsg($"OS,{_option.Location},common/Correct/find-task()\n{ex.Message}{ex.StackTrace}", GroupNames.醍摩豆服務運維群組);
  81. return Ok(new { tasks = tasks });
  82. }
  83. }
  84. /*
  85. {
  86. "id":"uuid",//新增为null或者空
  87. "code":"hbcn",
  88. "owner":"school",
  89. "name":"xxx评测-阅卷",
  90. "creatorId":"1558635535",
  91. "progress":"pending 待发布|going 已发布|finish 已结束",
  92. "scope":"school",
  93. "startTime":158556666658,//评测结束的时间
  94. "createTime":158556666658,//当前时间
  95. "endTime":158556666658,//指定一个结束时间
  96. "examType":"评测活动的类型",
  97. "scode":"评测的源数据code值",
  98. "mode":"阅卷模式,1 按题目,0 按人/学生",
  99. "corSubs":[//科目的设置
  100. {
  101. "id":"科目id",
  102. "corTmdids":[//设置的醍摩豆账号
  103. {
  104. "tmdid":"1558635535,评卷教师的id",
  105. "corCount":100
  106. },
  107. ]
  108. }
  109. ]
  110. }
  111. */
  112. /// <summary>
  113. /// 新增 或 修改阅卷设置
  114. /// </summary>
  115. /// <param name="request"></param>
  116. /// <returns></returns>
  117. [ProducesDefaultResponseType]
  118. [HttpPost("upsert")]
  119. public async Task<IActionResult> Upsert(Correct request)
  120. {
  121. try
  122. {
  123. //新增阅卷活动设置
  124. var client = _azureCosmos.GetCosmosClient();
  125. request.pk = $"Correct";
  126. request.code = $"Correct-{request.code}" ;
  127. request.ttl = -1;
  128. long now = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
  129. request.createTime = now;
  130. //如果设置的时间是小于当前时间则立即发布
  131. if (request.startTime <= 0)
  132. {
  133. request.startTime = now;
  134. }
  135. if (string.IsNullOrEmpty(request.id))
  136. {
  137. request.id = Guid.NewGuid().ToString();
  138. if (request.startTime > now)
  139. {
  140. request.progress = "pending";
  141. }
  142. else
  143. {
  144. request.progress = "going";
  145. }
  146. request = await client.GetContainer(Constant.TEAMModelOS, "Common").CreateItemAsync(request, new PartitionKey($"{request.code}"));
  147. }
  148. else
  149. {
  150. var response = await client.GetContainer(Constant.TEAMModelOS, "Common").ReadItemStreamAsync(request.id, new PartitionKey($"{request.code}"));
  151. if (response.Status == 200)
  152. {
  153. using var json = await JsonDocument.ParseAsync(response.ContentStream);
  154. var info = json.ToObject<Correct>();
  155. if (info.progress.Equals("going"))
  156. {
  157. return Ok(new { v = "活动正在进行中" });
  158. }
  159. if (request.startTime > now)
  160. {
  161. request.progress = "pending";
  162. }
  163. else
  164. {
  165. request.progress = "going";
  166. }
  167. request.progress = info.progress;
  168. request = await client.GetContainer(Constant.TEAMModelOS, "Common").ReplaceItemAsync(request, info.id, new PartitionKey($"{info.code}"));
  169. }
  170. else
  171. {
  172. if (request.startTime > now)
  173. {
  174. request.progress = "pending";
  175. }
  176. else
  177. {
  178. request.progress = "going";
  179. }
  180. request = await client.GetContainer(Constant.TEAMModelOS, "Common").CreateItemAsync(request, new PartitionKey($"{request.code}"));
  181. }
  182. }
  183. return Ok(new { vote = request });
  184. }
  185. catch (Exception e)
  186. {
  187. await _dingDing.SendBotMsg($"OS,{_option.Location},common/Correct/upsert()\n{e.Message}", GroupNames.醍摩豆服務運維群組);
  188. return BadRequest(e.StackTrace);
  189. }
  190. }
  191. ///<summary>
  192. ///
  193. /// </summary>
  194. /// <data>
  195. /// ! "id":"3c075347-75ef-4bcb-ae03-68678d02d5ef", //评测id
  196. /// ! "code":"hbcn"//
  197. /// </data>
  198. /// <param name="request"></param>
  199. /// <returns></returns>
  200. [ProducesDefaultResponseType]
  201. [HttpPost("find-id")]
  202. public async Task<IActionResult> FindById(JsonElement requert)
  203. {
  204. try
  205. {
  206. //活动id
  207. if (!requert.TryGetProperty("id", out JsonElement id)) return BadRequest();
  208. //活动分区
  209. if (!requert.TryGetProperty("code", out JsonElement code)) return BadRequest();
  210. var client = _azureCosmos.GetCosmosClient();
  211. Correct correct = await client.GetContainer(Constant.TEAMModelOS, "Common").ReadItemAsync<Correct>(id.GetString(), new PartitionKey($"Correct-{code}"));
  212. return Ok(new { correct });
  213. }
  214. catch (CosmosException ex){
  215. Correct correct = null;
  216. return Ok(new { correct ,status=ex.Status });
  217. }
  218. catch (Exception ex)
  219. {
  220. await _dingDing.SendBotMsg($"OS,{_option.Location},common/Correct/find-id()\n{ex.Message}", GroupNames.醍摩豆服務運維群組);
  221. Correct correct = null;
  222. return Ok(new { correct });
  223. }
  224. }
  225. }
  226. }