PaperController.cs 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341
  1. using Microsoft.AspNetCore.Mvc;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text.Json;
  6. using System.Threading.Tasks;
  7. using TEAMModelOS.SDK;
  8. using TEAMModelOS.SDK.DI;
  9. using TEAMModelOS.SDK.Models;
  10. using TEAMModelOS.SDK.Helper.Common.StringHelper;
  11. using Microsoft.AspNetCore.Http;
  12. using System.IdentityModel.Tokens.Jwt;
  13. using Azure.Cosmos;
  14. using TEAMModelOS.SDK.Extension;
  15. using TEAMModelOS.SDK.DI;
  16. using System.Text;
  17. using Azure.Messaging.ServiceBus;
  18. using Microsoft.Extensions.Configuration;
  19. using Microsoft.AspNetCore.Authorization;
  20. using TEAMModelOS.Filter;
  21. using TEAMModelOS.SDK.Services;
  22. using DocumentFormat.OpenXml.Office2010.Excel;
  23. namespace TEAMModelOS.Controllers
  24. {
  25. [ProducesResponseType(StatusCodes.Status200OK)]
  26. [ProducesResponseType(StatusCodes.Status400BadRequest)]
  27. [Route("paper")]
  28. [ApiController]
  29. public class PaperController: ControllerBase
  30. {
  31. private readonly SnowflakeId _snowflakeId;
  32. private readonly AzureCosmosFactory _azureCosmos;
  33. private readonly AzureStorageFactory _azureStorage;
  34. private readonly AzureServiceBusFactory _serviceBus;
  35. private readonly DingDing _dingDing;
  36. private readonly AzureRedisFactory _azureRedis;
  37. public IConfiguration _configuration { get; set; }
  38. public PaperController(AzureRedisFactory azureRedis,AzureCosmosFactory azureCosmos, SnowflakeId snowflakeId,AzureStorageFactory azureStorage, AzureServiceBusFactory serviceBus, IConfiguration configuration, DingDing dingDing)
  39. {
  40. _azureCosmos = azureCosmos;
  41. _snowflakeId = snowflakeId;
  42. _azureStorage = azureStorage;
  43. _serviceBus = serviceBus;
  44. _configuration = configuration;
  45. _dingDing = dingDing;
  46. _azureRedis = azureRedis;
  47. }
  48. /// <summary>
  49. /// 删除
  50. /// </summary>
  51. /// <param name="request"></param>
  52. /// <returns></returns>
  53. [ProducesDefaultResponseType]
  54. //[AuthToken(Roles = "teacher")]
  55. [HttpPost("delete")]
  56. [AuthToken(Roles = "teacher,admin,student")]
  57. #if !DEBUG
  58. [Authorize(Roles = "IES")]
  59. #endif
  60. public async Task<IActionResult> Delete(JsonElement request)
  61. {
  62. if (!request.TryGetProperty("code", out JsonElement code)) return BadRequest();
  63. if (!request.TryGetProperty("id", out JsonElement id)) return BadRequest();
  64. if (!request.TryGetProperty("scope", out JsonElement scope)) return BadRequest();
  65. //ResponseBuilder builder = ResponseBuilder.custom();
  66. Paper paper;
  67. var client = _azureCosmos.GetCosmosClient();
  68. //删除blob 相关资料
  69. await _azureStorage.GetBlobServiceClient().DeleteBlobs(_dingDing, code.ToString().Replace("Paper-",""), new List<string> { $"paper/{id}" });
  70. //通知删除信息
  71. await BlobService.RefreshBlobRoot(new BlobRefreshMessage { progress = "delete", root = $"paper", name = code.ToString().Replace("Paper-", "") }, _serviceBus, _configuration, _azureRedis);
  72. if (scope.ToString().Equals("school"))
  73. {
  74. paper = await client.GetContainer(Constant.TEAMModelOS, "School").DeleteItemAsync<Paper>(id.ToString(), new PartitionKey($"{code}"));
  75. }
  76. else {
  77. paper = await client.GetContainer(Constant.TEAMModelOS, "Teacher").DeleteItemAsync<Paper>(id.ToString(), new PartitionKey($"{code}"));
  78. }
  79. //IdPk items = await _azureCosmos.DeleteAsync<Paper>(request.id, request.pk);
  80. return Ok(new { paper });
  81. }
  82. /// <summary>
  83. /// 查询试卷摘要信息
  84. /// </summary>
  85. /// <param name="request"></param>
  86. /// <returns></returns>
  87. [ProducesDefaultResponseType]
  88. //[AuthToken(Roles = "teacher")]
  89. [HttpPost("find-summary")]
  90. [AuthToken(Roles = "teacher,admin,student")]
  91. #if !DEBUG
  92. [Authorize(Roles = "IES")]
  93. #endif
  94. public async Task<IActionResult> findSummary(JsonElement request)
  95. {
  96. //ResponseBuilder builder = ResponseBuilder.custom();
  97. if (!request.TryGetProperty("id_token", out JsonElement id_token)) return BadRequest();
  98. if (!request.TryGetProperty("school_code", out JsonElement school_code)) return BadRequest();
  99. var jwt = new JwtSecurityToken(id_token.GetString());
  100. var id = jwt.Payload.Sub;
  101. var client = _azureCosmos.GetCosmosClient();
  102. List<object> papers = new List<object>();
  103. var query = $"select c.id,c.subjectCode,c.code,c.periodCode,c.name,c.itemCount,c.level,c.pointItem,c.pointScore,c.score,c.gradeCode,c.createTime,c.sheet,c.sheetNo,c.tags ,c.mode ,c.itemSort from c where c.id = {id}";
  104. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Paper-{school_code}") }))
  105. {
  106. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  107. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  108. {
  109. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  110. {
  111. papers.Add(obj.ToObject<object>());
  112. }
  113. }
  114. }
  115. return Ok(new { papers });
  116. /* List<string> props = new List<string> {
  117. "subjectCode", "id", "code", "periodCode",
  118. "name","itemCount","level","pointItem","pointScore","score", "gradeCode"
  119. };
  120. if (StringHelper.getKeyCount(request) > 0)
  121. {
  122. return builder.Data(await _azureCosmos.FindByDict<Paper>(request, propertys: props)).build();
  123. }
  124. else {
  125. return builder.build();
  126. }*/
  127. }
  128. /// <summary>
  129. /// 查询试卷
  130. /// </summary>
  131. /// <param name="request"></param>
  132. /// <returns></returns>
  133. [ProducesDefaultResponseType]
  134. //[AuthToken(Roles = "teacher")]
  135. [HttpPost("find")]
  136. [AuthToken(Roles = "teacher,admin,student")]
  137. #if !DEBUG
  138. [Authorize(Roles = "IES")]
  139. #endif
  140. public async Task<IActionResult> Find(JsonElement request)
  141. {
  142. //ResponseBuilder builder = ResponseBuilder.custom();
  143. //if (!request.TryGetProperty("id_token", out JsonElement id_token)) return BadRequest();
  144. if (!request.TryGetProperty("code", out JsonElement code)) return BadRequest();
  145. if (!request.TryGetProperty("scope", out JsonElement scope)) return BadRequest();
  146. var client = _azureCosmos.GetCosmosClient();
  147. StringBuilder sql = new StringBuilder();
  148. Dictionary<string, object> dict = new Dictionary<string, object>();
  149. var emobj = request.EnumerateObject();
  150. while (emobj.MoveNext())
  151. {
  152. dict[emobj.Current.Name] = emobj.Current.Value;
  153. }
  154. //处理code
  155. if (dict.TryGetValue("code", out object _))
  156. {
  157. dict.Remove("code");
  158. }
  159. List<Paper> papers = new List<Paper>();
  160. if (scope.ToString().Equals("school"))
  161. {
  162. sql.Append("select c.id,c.code,c.name,c.blob,c.periodId,c.gradeIds,c.subjectId,c.subjectName,c.score,c.useCount,c.scope,c.scoring,c.createTime,c.sheet ,c.mode ,c.sheetNo, c.tags,c.itemSort from c");
  163. AzureCosmosQuery cosmosDbQuery = SQLHelper.GetSQL(dict, sql);
  164. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<Paper>(queryDefinition: cosmosDbQuery.CosmosQueryDefinition, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Paper-{code}") }))
  165. {
  166. papers.Add(item);
  167. //using var json = await JsonDocument.ParseAsync(item.ContentStream);
  168. //if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  169. //{
  170. // foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  171. // {
  172. // papers.Add(obj.ToObject<object>());
  173. // }
  174. //}
  175. }
  176. }
  177. if (scope.ToString().Equals("private"))
  178. {
  179. sql.Append("select c.id,c.code,c.name,c.blob,c.subjectName,c.score,c.useCount,c.scope,c.scoring ,c.createTime ,c.sheet,c.sheetNo ,c.mode , c.tags, c.itemSort from c");
  180. AzureCosmosQuery cosmosDbQuery = SQLHelper.GetSQL(dict, sql);
  181. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIterator<Paper>(queryDefinition: cosmosDbQuery.CosmosQueryDefinition, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Paper-{code}") }))
  182. {
  183. papers.Add(item);
  184. //using var json = await JsonDocument.ParseAsync(item.ContentStream);
  185. //if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  186. //{
  187. // foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  188. // {
  189. // papers.Add(obj.ToObject<object>());
  190. // }
  191. //}
  192. }
  193. }
  194. return Ok(new { papers });
  195. /*if (StringHelper.getKeyCount(request) > 0) {
  196. return builder.Data(await _azureCosmos.FindByDict<Paper>(request)).build();
  197. }
  198. else
  199. {
  200. return builder.build();
  201. }*/
  202. }
  203. /// <summary>
  204. /// 保存试卷
  205. /// </summary>
  206. /// <param name="request"></param>
  207. /// <returns></returns>
  208. [ProducesDefaultResponseType]
  209. //[AuthToken(Roles = "teacher")]
  210. [HttpPost("check-paper-name")]
  211. [AuthToken(Roles = "teacher,admin,student")]
  212. #if !DEBUG
  213. [Authorize(Roles = "IES")]
  214. #endif
  215. public async Task<IActionResult> CheckPaperName(JsonElement request) {
  216. var client = _azureCosmos.GetCosmosClient();
  217. if (!request.TryGetProperty("scope", out JsonElement _scope)) return BadRequest();
  218. if (!request.TryGetProperty("name", out JsonElement _name)) return BadRequest();
  219. if (!request.TryGetProperty("code", out JsonElement _code)) return BadRequest();
  220. string tbname = $"{_scope}".Equals("private") ? "Teacher" : "School";
  221. string sql = $"select * from c where c.name='{_name}' ";
  222. List<Paper> papers = new List<Paper>();
  223. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, tbname).GetItemQueryIterator<Paper>(sql, requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey($"Paper-{_code}") }))
  224. {
  225. papers.Add(item);
  226. }
  227. return Ok(new { papers });
  228. }
  229. /// <summary>
  230. /// 保存试卷
  231. /// </summary>
  232. /// <param name="request"></param>
  233. /// <returns></returns>
  234. [ProducesDefaultResponseType]
  235. //[AuthToken(Roles = "teacher")]
  236. [HttpPost("upsert")]
  237. [Authorize(Roles = "IES")]
  238. public async Task<IActionResult> Upsert(JsonElement request)
  239. {
  240. var client = _azureCosmos.GetCosmosClient();
  241. if (!request.TryGetProperty("paper", out JsonElement _paper)) return BadRequest();
  242. if (!request.TryGetProperty("option", out JsonElement option)) return BadRequest();
  243. Paper paper;
  244. paper = _paper.ToObject<Paper>();
  245. paper.createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
  246. paper.size = await _azureStorage.GetBlobContainerClient(paper.code).GetBlobsSize($"paper/{paper.id}");
  247. await BlobService.RefreshBlobRoot(new BlobRefreshMessage { progress = "update", root = $"paper", name = $"{paper.code}".Replace("Paper-", "") }, _serviceBus, _configuration, _azureRedis);
  248. paper.code = "Paper-" + paper.code;
  249. if (option.ToString().Equals("insert"))
  250. {
  251. string tbname = paper.scope.Equals("private") ? "Teacher" : "School";
  252. string sql = $"select * from c where c.name='{paper.name}' ";
  253. List<Paper> papers = new List<Paper>();
  254. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, tbname).GetItemQueryIterator<Paper>(sql, requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey(paper.code) }))
  255. {
  256. papers.Add(item);
  257. }
  258. await client.GetContainer(Constant.TEAMModelOS, tbname).DeleteItemsStreamAsync(papers.Select(x => x.id).ToList(), paper.code);
  259. paper = await client.GetContainer(Constant.TEAMModelOS, tbname).UpsertItemAsync(paper, new PartitionKey($"{paper.code}"));
  260. }
  261. else
  262. {
  263. if (paper.scope.Equals("private"))
  264. {
  265. paper = await client.GetContainer(Constant.TEAMModelOS, "Teacher").ReplaceItemAsync(paper, paper.id, new PartitionKey($"{paper.code}"));
  266. }
  267. else
  268. {
  269. paper = await client.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync(paper, paper.id, new PartitionKey($"{paper.code}"));
  270. }
  271. }
  272. return Ok(new { paper });
  273. }
  274. /// <summary>
  275. /// 更新试卷的答题卡
  276. /// </summary>
  277. /// <param name="request"></param>
  278. /// <returns></returns>
  279. [ProducesDefaultResponseType]
  280. //[AuthToken(Roles = "teacher")]
  281. [HttpPost("upsert-sheet")]
  282. [AuthToken(Roles = "teacher,admin,student")]
  283. #if !DEBUG
  284. [Authorize(Roles = "IES")]
  285. #endif
  286. public async Task<IActionResult> UpsertSheet(JsonElement request)
  287. {
  288. try {
  289. var client = _azureCosmos.GetCosmosClient();
  290. if (!request.TryGetProperty("id", out JsonElement id)) return BadRequest();
  291. if (!request.TryGetProperty("code", out JsonElement code)) return BadRequest();
  292. if (!request.TryGetProperty("scope", out JsonElement scope)) return BadRequest();
  293. if (!request.TryGetProperty("sheet", out JsonElement sheet)) return BadRequest();
  294. if ($"{scope}".Equals("school"))
  295. {
  296. Paper paper = await client.GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<Paper>($"{id}", new PartitionKey($"Paper-{code}"));
  297. paper.sheet = $"{sheet}";
  298. await client.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync(paper, paper.id, new PartitionKey($"{paper.code}"));
  299. }
  300. else
  301. {
  302. Paper paper = await client.GetContainer(Constant.TEAMModelOS, "Teacher").ReadItemAsync<Paper>($"{id}", new PartitionKey($"Paper-{code}"));
  303. paper.sheet = $"{sheet}";
  304. await client.GetContainer(Constant.TEAMModelOS, "Teacher").ReplaceItemAsync(paper, paper.id, new PartitionKey($"{paper.code}"));
  305. }
  306. return Ok(new { status = 200 });
  307. } catch (CosmosException ex)
  308. {
  309. if (ex.Status == 404)
  310. {
  311. return Ok(new { status = 404 });
  312. }
  313. else {
  314. return Ok(new { status = 500 });
  315. }
  316. }
  317. }
  318. }
  319. }