PaperController.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290
  1. using Azure.Cosmos;
  2. using Microsoft.AspNetCore.Http;
  3. using Microsoft.AspNetCore.Mvc;
  4. using Microsoft.Extensions.Options;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Text;
  8. using System.Text.Json;
  9. using System.Threading.Tasks;
  10. using TEAMModelBI.Models;
  11. using TEAMModelBI.Tool;
  12. using TEAMModelOS.Models;
  13. using TEAMModelOS.SDK.DI;
  14. using TEAMModelOS.SDK.Extension;
  15. using TEAMModelOS.SDK.Models;
  16. namespace TEAMModelBI.Controllers.BISchool
  17. {
  18. /// <summary>
  19. /// 试卷
  20. /// </summary>
  21. [Route("paper")]
  22. [ApiController]
  23. public class PaperController : ControllerBase
  24. {
  25. private readonly AzureCosmosFactory _azureCosmos;
  26. private readonly AzureStorageFactory _azureStorage;
  27. private readonly DingDing _dingDing;
  28. private readonly Option _option;
  29. public PaperController(AzureCosmosFactory azureCosmos, AzureStorageFactory azureStorage, DingDing dingDing, IOptionsSnapshot<Option> option)
  30. {
  31. _azureCosmos = azureCosmos;
  32. _azureStorage = azureStorage;
  33. _dingDing = dingDing;
  34. _option = option?.Value;
  35. }
  36. /// <summary>
  37. /// 查询试卷的数量统计集合
  38. /// </summary>
  39. /// <param name="jsonElement"></param>
  40. /// <returns></returns>
  41. [HttpPost("get-count")]
  42. public async Task<IActionResult> GetCount(JsonElement jsonElement)
  43. {
  44. jsonElement.TryGetProperty("tmdId", out JsonElement tmdId);
  45. if(!jsonElement.TryGetProperty("term", out JsonElement term)) return BadRequest();
  46. var (start, end) = DateTimeHeloer.GetTermStartOrEnd(DateTime.Now);
  47. var cosmosClient = _azureCosmos.GetCosmosClient();
  48. object paperCount = new object();
  49. StringBuilder sqlTxt = new StringBuilder("select count(c.id) AS totals from c");
  50. if (!string.IsNullOrEmpty($"{tmdId}"))
  51. {
  52. List<string> schoolIds = new List<string>();
  53. schoolIds = await CommonFind.FindSchoolIds(cosmosClient, $"{tmdId}");
  54. List<SchoolPaper> schoolPapers = new List<SchoolPaper>();
  55. if (bool.Parse($"{term}") == true)
  56. {
  57. sqlTxt.Append($" where c.createTime >={start} and c.createTime <={end}");
  58. }
  59. foreach (var schoolId in schoolIds)
  60. {
  61. School school = new();
  62. var response = await cosmosClient.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(schoolId, new PartitionKey("Base"));
  63. if (response.Status == 200)
  64. {
  65. using var json = await JsonDocument.ParseAsync(response.ContentStream);
  66. school = json.ToObject<School>();
  67. }
  68. SchoolPaper schoolPaper = new SchoolPaper() { id = schoolId, name = school != null ? school.name : schoolId };
  69. schoolPaper.totals = await CommonFind.FindTotals(cosmosClient, sqlTxt.ToString(), new List<string>() { "School" });
  70. schoolPapers.Add(schoolPaper);
  71. }
  72. paperCount = schoolPapers;
  73. }
  74. else
  75. {
  76. sqlTxt.Append(" where c.pk='Paper' ");
  77. if (bool.Parse($"{term}") == true)
  78. {
  79. sqlTxt.Append($" and c.createTime >= {start} and c.createTime <={end}");
  80. }
  81. paperCount = await CommonFind.FindTotals(cosmosClient, sqlTxt.ToString(), new List<string>() { "School" });
  82. }
  83. return Ok(new { state = 200 , paperCount });
  84. }
  85. /// <summary>
  86. /// 查询所有的试题数量
  87. /// </summary>
  88. /// <returns></returns>
  89. [HttpPost("get-total")]
  90. public async Task<IActionResult> GetTotal()
  91. {
  92. var cosmosClient = _azureCosmos.GetCosmosClient();
  93. string sqlTxt = $"select COUNT(c.id) AS totals from c where c.pk='Paper'";
  94. long totals = await CommonFind.FindTotals(cosmosClient, sqlTxt.ToString(), new List<string>() { "School" });
  95. return Ok(new { state = 200, totals });
  96. }
  97. /// <summary>
  98. /// 依据醍摩豆账户统计相关联的学校试卷数量
  99. /// </summary>
  100. /// <param name="jsonElement"></param>
  101. /// <returns></returns>
  102. [ProducesDefaultResponseType]
  103. [HttpPost("get-assistschool")]
  104. public async Task<IActionResult> GetAssistSchool(JsonElement jsonElement)
  105. {
  106. if (!jsonElement.TryGetProperty("tmdId", out JsonElement tmdId)) return BadRequest();
  107. var cosmosClient = _azureCosmos.GetCosmosClient();
  108. List<string> schoolIds = new List<string>();
  109. List<SchoolPaper> schoolPapers = new List<SchoolPaper>();
  110. schoolIds = await CommonFind.FindSchoolIds(cosmosClient, $"{tmdId}");
  111. foreach (var schoolId in schoolIds)
  112. {
  113. School school = new();
  114. var response = await cosmosClient.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(schoolId, new PartitionKey("Base"));
  115. if (response.Status == 200)
  116. {
  117. using var json = await JsonDocument.ParseAsync(response.ContentStream);
  118. school = json.ToObject<School>();
  119. }
  120. SchoolPaper schoolPaper = new SchoolPaper() { id = schoolId , name = school != null ? school.name : schoolId };
  121. schoolPaper.totals = await CommonFind.FindTotals(cosmosClient, "select COUNT(c.id) AS totals from c", new List<string>() { "School" });
  122. schoolPapers.Add(schoolPaper);
  123. }
  124. return Ok(new { state = 200, schoolPapers });
  125. }
  126. /// <summary>
  127. /// 一年的12个月的
  128. /// </summary>
  129. /// <param name="jsonElement"></param>
  130. /// <returns></returns>
  131. [HttpPost("get-yerar")]
  132. public async Task<IActionResult> GetNewYear(JsonElement jsonElement)
  133. {
  134. jsonElement.TryGetProperty("tmdId", out JsonElement tmdId);
  135. var cosmosClient = _azureCosmos.GetCosmosClient();
  136. List<MonthStartEnd> endList1 = DateTimeHeloer.GetYearMonthlyStartEnd13(DateTimeOffset.UtcNow.Year);
  137. if (string.IsNullOrEmpty($"{tmdId}"))
  138. {
  139. Dictionary<string, long> schoolYears = new Dictionary<string, long>();
  140. foreach (var temp in endList1)
  141. {
  142. string sqlText = $"SELECT COUNT(c.id) AS totals FROM c WHERE c.createTime >= {temp.start} and c.createTime <= {temp.end} and c.pk='Paper'";
  143. long total = await CommonFind.FindTotals(cosmosClient, sqlText, new List<string>() { "School", "Teacher" });
  144. schoolYears.Add(temp.yearMonth, total);
  145. }
  146. return Ok(new { state = 200, schoolYears });
  147. }
  148. else
  149. {
  150. List<string> schoolIds = new List<string>();
  151. schoolIds = await CommonFind.FindSchoolIds(cosmosClient, $"{tmdId}");
  152. List<SchoolYear> schoolYears = new List<SchoolYear>();
  153. foreach (var schoolId in schoolIds)
  154. {
  155. School school = new();
  156. var response = await cosmosClient.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(schoolId, new PartitionKey("Base"));
  157. if (response.Status == 200)
  158. {
  159. using var json = await JsonDocument.ParseAsync(response.ContentStream);
  160. school = json.ToObject<School>();
  161. }
  162. SchoolYear schoolYear = new SchoolYear() { id = schoolId, name = school != null ? school.name : schoolId };
  163. Dictionary<string, long> yearCount = new Dictionary<string, long>();
  164. foreach (var temp in endList1)
  165. {
  166. string sqlTxt = $"SELECT COUNT(c.id) AS totals FROM c WHERE c.createTime >= {temp.start} and c.createTime <= {temp.end} and c.pk='Paper'";
  167. long totals = await CommonFind.FindTotals(cosmosClient, sqlTxt, new List<string>() { "School", "Teacher" });
  168. yearCount.Add(temp.yearMonth, totals);
  169. }
  170. schoolYear.yearPaper = yearCount;
  171. schoolYears.Add(schoolYear);
  172. }
  173. return Ok(new { state = 200, schoolYears });
  174. }
  175. }
  176. /// <summary>
  177. /// 统计当前学期的数量,传醍摩豆则统计该账户相关的学校试题统计,不传则统计当前学期的试卷
  178. /// </summary>
  179. /// <param name="jsonElement"></param>
  180. /// <returns></returns>
  181. [HttpPost("get-termpaper")]
  182. public async Task<IActionResult> GetTermPaper(JsonElement jsonElement)
  183. {
  184. jsonElement.TryGetProperty("tmdId", out JsonElement tmdId);
  185. var cosmosClient = _azureCosmos.GetCosmosClient();
  186. var (start, end) = DateTimeHeloer.GetTermStartOrEnd(DateTime.Now);
  187. var totals = new object();
  188. if (!string.IsNullOrEmpty($"{tmdId}"))
  189. {
  190. List<SchoolPaper> schoolPapers = new List<SchoolPaper>();
  191. List<string> schoolIds = await CommonFind.FindSchoolIds(cosmosClient, $"{tmdId}");
  192. foreach (var schoolId in schoolIds)
  193. {
  194. School school = new();
  195. var response = await cosmosClient.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(schoolId, new PartitionKey("Base"));
  196. if(response.Status == 200)
  197. {
  198. using var json = await JsonDocument.ParseAsync(response.ContentStream);
  199. school = json.ToObject<School>();
  200. }
  201. SchoolPaper schoolPaper = new SchoolPaper() { id = schoolId, name = school != null ? school.name : schoolId };
  202. string sqlTxt = $"select count(c.id) AS totals from c where c.createTime >={start} and c.createTime <={end}";
  203. schoolPaper.totals += await CommonFind.FindTotals(cosmosClient, sqlTxt, "School", $"Paper-{schoolId}");
  204. //await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText:sqlTxt.ToString(),requestOptions:new QueryRequestOptions() { PartitionKey = new PartitionKey($"Paper-{schoolId}")}))
  205. //{
  206. // using var json = await JsonDocument.ParseAsync(item.ContentStream);
  207. // if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetInt32() > 0)
  208. // {
  209. // foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  210. // {
  211. // schoolPaper.totals += obj.GetProperty("totals").GetInt64();
  212. // }
  213. // }
  214. //}
  215. //schoolPaper.totals = await CommonFind.FindTotals(cosmosClient, sqlTxt, new List<string>() { "School" });
  216. schoolPapers.Add(schoolPaper);
  217. }
  218. totals = schoolPapers;
  219. }
  220. else
  221. {
  222. string sqlTxt = $"SELECT COUNT(c.id) AS totals FROM c where c.pk='Paper' and c.createTime >= {start} and c.createTime <= {end}";
  223. totals = await CommonFind.FindTotals(cosmosClient, sqlTxt, new List<string>() { "School" });
  224. }
  225. return Ok(new { state = 200, totals });
  226. }
  227. public record SchoolPaper
  228. {
  229. public string id { get; set; }
  230. public string name { get; set; }
  231. public long totals { get; set; }
  232. }
  233. public record SchoolYear
  234. {
  235. public string id { get; set; }
  236. public string name { get; set; }
  237. public Dictionary<string, long> yearPaper { get; set; }
  238. }
  239. }
  240. }