PaperController.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352
  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.Census
  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) = TimeHelper.GetTermStartOrEnd(DateTime.Now);
  47. var cosmosClient = _azureCosmos.GetCosmosClient();
  48. object paperCount = new object();
  49. if (!string.IsNullOrEmpty($"{tmdId}"))
  50. {
  51. List<string> schoolIds = new List<string>();
  52. schoolIds = await CommonFind.FindSchoolIds(cosmosClient, $"{tmdId}");
  53. List<SchoolPaper> schoolPapers = new List<SchoolPaper>();
  54. string time = "";
  55. bool bos = bool.Parse($"{term}");
  56. if (bos == true)
  57. {
  58. time = $" where c.createTime >={start} and c.createTime <={end}";
  59. }
  60. foreach (var schoolId in schoolIds)
  61. {
  62. StringBuilder sqlTxt = new StringBuilder("select count(c.id) AS totals from c");
  63. if (bos != true)
  64. sqlTxt.Append($" where c.code='Paper-{schoolId}'");
  65. else
  66. {
  67. sqlTxt.Append(time);
  68. sqlTxt.Append($" and c.code='Paper-{schoolId}'");
  69. };
  70. School school = new();
  71. var response = await cosmosClient.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(schoolId, new PartitionKey("Base"));
  72. if (response.Status == 200)
  73. {
  74. using var json = await JsonDocument.ParseAsync(response.ContentStream);
  75. school = json.ToObject<School>();
  76. }
  77. SchoolPaper schoolPaper = new SchoolPaper() { id = schoolId, name = school != null ? school.name : schoolId };
  78. schoolPaper.totals = await CommonFind.FindTotals(cosmosClient, sqlTxt.ToString(), new List<string>() { "School" });
  79. schoolPapers.Add(schoolPaper);
  80. }
  81. paperCount = schoolPapers;
  82. }
  83. else
  84. {
  85. StringBuilder sqlTxt = new StringBuilder("select count(c.id) AS totals from c where c.pk='Paper'");
  86. if (bool.Parse($"{term}") == true)
  87. {
  88. sqlTxt.Append($" and c.createTime >= {start} and c.createTime <={end}");
  89. }
  90. paperCount = await CommonFind.FindTotals(cosmosClient, sqlTxt.ToString(), new List<string>() { "School" });
  91. }
  92. return Ok(new { state = 200 , paperCount });
  93. }
  94. /// <summary>
  95. /// 查询所有的试题数量
  96. /// </summary>
  97. /// <returns></returns>
  98. [HttpPost("get-total")]
  99. public async Task<IActionResult> GetTotal()
  100. {
  101. var cosmosClient = _azureCosmos.GetCosmosClient();
  102. string sqlTxt = $"select COUNT(c.id) AS totals from c where c.pk='Paper'";
  103. long totals = await CommonFind.FindTotals(cosmosClient, sqlTxt.ToString(), new List<string>() { "School" });
  104. return Ok(new { state = 200, totals });
  105. }
  106. /// <summary>
  107. /// 依据醍摩豆账户统计相关联的学校试卷数量
  108. /// </summary>
  109. /// <param name="jsonElement"></param>
  110. /// <returns></returns>
  111. [ProducesDefaultResponseType]
  112. [HttpPost("get-assistschool")]
  113. public async Task<IActionResult> GetAssistSchool(JsonElement jsonElement)
  114. {
  115. if (!jsonElement.TryGetProperty("tmdId", out JsonElement tmdId)) return BadRequest();
  116. var cosmosClient = _azureCosmos.GetCosmosClient();
  117. List<string> schoolIds = new List<string>();
  118. List<SchoolPaper> schoolPapers = new List<SchoolPaper>();
  119. schoolIds = await CommonFind.FindSchoolIds(cosmosClient, $"{tmdId}");
  120. foreach (var schoolId in schoolIds)
  121. {
  122. School school = new();
  123. var response = await cosmosClient.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(schoolId, new PartitionKey("Base"));
  124. if (response.Status == 200)
  125. {
  126. using var json = await JsonDocument.ParseAsync(response.ContentStream);
  127. school = json.ToObject<School>();
  128. }
  129. SchoolPaper schoolPaper = new SchoolPaper() { id = schoolId , name = school != null ? school.name : schoolId };
  130. schoolPaper.totals = await CommonFind.FindTotals(cosmosClient, $"select COUNT(c.id) AS totals from c where c.code='Paper-{schoolId}'", new List<string>() { "School" });
  131. schoolPapers.Add(schoolPaper);
  132. }
  133. return Ok(new { state = 200, schoolPapers });
  134. }
  135. /// <summary>
  136. /// 一年的12个月的
  137. /// </summary>
  138. /// <param name="jsonElement"></param>
  139. /// <returns></returns>
  140. [HttpPost("get-yerar")]
  141. public async Task<IActionResult> GetNewYear(JsonElement jsonElement)
  142. {
  143. jsonElement.TryGetProperty("tmdId", out JsonElement tmdId);
  144. var cosmosClient = _azureCosmos.GetCosmosClient();
  145. List<MonthStartEnd> endList1 = TimeHelper.GetYearMonthlyStartEnd13(DateTimeOffset.UtcNow.Year);
  146. if (string.IsNullOrEmpty($"{tmdId}"))
  147. {
  148. Dictionary<string, long> schoolYears = new Dictionary<string, long>();
  149. foreach (var temp in endList1)
  150. {
  151. string sqlText = $"SELECT COUNT(c.id) AS totals FROM c WHERE c.createTime >= {temp.start} and c.createTime <= {temp.end} and c.pk='Paper'";
  152. long total = await CommonFind.FindTotals(cosmosClient, sqlText, new List<string>() { "School", "Teacher" });
  153. schoolYears.Add(temp.yearMonth, total);
  154. }
  155. return Ok(new { state = 200, schoolYears });
  156. }
  157. else
  158. {
  159. List<string> schoolIds = new List<string>();
  160. schoolIds = await CommonFind.FindSchoolIds(cosmosClient, $"{tmdId}");
  161. List<SchoolYear> schoolYears = new List<SchoolYear>();
  162. foreach (var schoolId in schoolIds)
  163. {
  164. School school = new();
  165. var response = await cosmosClient.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(schoolId, new PartitionKey("Base"));
  166. if (response.Status == 200)
  167. {
  168. using var json = await JsonDocument.ParseAsync(response.ContentStream);
  169. school = json.ToObject<School>();
  170. }
  171. SchoolYear schoolYear = new SchoolYear() { id = schoolId, name = school != null ? school.name : schoolId };
  172. Dictionary<string, long> yearCount = new Dictionary<string, long>();
  173. foreach (var temp in endList1)
  174. {
  175. string sqlTxt = $"SELECT COUNT(c.id) AS totals FROM c WHERE c.code='Paper-{schoolId}' and c.createTime >= {temp.start} and c.createTime <= {temp.end} and c.pk='Paper'";
  176. long totals = await CommonFind.FindTotals(cosmosClient, sqlTxt, new List<string>() { "School", "Teacher" });
  177. yearCount.Add(temp.yearMonth, totals);
  178. }
  179. schoolYear.yearPaper = yearCount;
  180. schoolYears.Add(schoolYear);
  181. }
  182. return Ok(new { state = 200, schoolYears });
  183. }
  184. }
  185. /// <summary>
  186. /// 统计当前学期的数量,传醍摩豆则统计该账户相关的学校试题统计,不传则统计当前学期的试卷
  187. /// </summary>
  188. /// <param name="jsonElement"></param>
  189. /// <returns></returns>
  190. [HttpPost("get-termpaper")]
  191. public async Task<IActionResult> GetTermPaper(JsonElement jsonElement)
  192. {
  193. jsonElement.TryGetProperty("tmdId", out JsonElement tmdId);
  194. var cosmosClient = _azureCosmos.GetCosmosClient();
  195. var (start, end) = TimeHelper.GetTermStartOrEnd(DateTime.Now);
  196. var totals = new object();
  197. if (!string.IsNullOrEmpty($"{tmdId}"))
  198. {
  199. List<SchoolPaper> schoolPapers = new List<SchoolPaper>();
  200. List<string> schoolIds = await CommonFind.FindSchoolIds(cosmosClient, $"{tmdId}");
  201. foreach (var schoolId in schoolIds)
  202. {
  203. School school = new();
  204. var response = await cosmosClient.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(schoolId, new PartitionKey("Base"));
  205. if(response.Status == 200)
  206. {
  207. using var json = await JsonDocument.ParseAsync(response.ContentStream);
  208. school = json.ToObject<School>();
  209. }
  210. SchoolPaper schoolPaper = new SchoolPaper() { id = schoolId, name = school != null ? school.name : schoolId };
  211. string sqlTxt = $"select count(c.id) AS totals from c where c.createTime >={start} and c.createTime <={end}";
  212. schoolPaper.totals += await CommonFind.FindTotals(cosmosClient, sqlTxt, "School", $"Paper-{schoolId}");
  213. //await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText:sqlTxt.ToString(),requestOptions:new QueryRequestOptions() { PartitionKey = new PartitionKey($"Paper-{schoolId}")}))
  214. //{
  215. // using var json = await JsonDocument.ParseAsync(item.ContentStream);
  216. // if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetInt32() > 0)
  217. // {
  218. // foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  219. // {
  220. // schoolPaper.totals += obj.GetProperty("totals").GetInt64();
  221. // }
  222. // }
  223. //}
  224. //schoolPaper.totals = await CommonFind.FindTotals(cosmosClient, sqlTxt, new List<string>() { "School" });
  225. schoolPapers.Add(schoolPaper);
  226. }
  227. totals = schoolPapers;
  228. }
  229. else
  230. {
  231. string sqlTxt = $"SELECT COUNT(c.id) AS totals FROM c where c.pk='Paper' and c.createTime >= {start} and c.createTime <= {end}";
  232. totals = await CommonFind.FindTotals(cosmosClient, sqlTxt, new List<string>() { "School" });
  233. }
  234. return Ok(new { state = 200, totals });
  235. }
  236. /// <summary>
  237. /// 依据试卷Id查询试卷信息 数据管理工具——查询工具
  238. /// </summary>
  239. /// <param name="jsonElement"></param>
  240. /// <returns></returns>
  241. [HttpPost("get-info")]
  242. public async Task<IActionResult> GetInfo(JsonElement jsonElement)
  243. {
  244. if (!jsonElement.TryGetProperty("paperId", out JsonElement paperId)) return BadRequest();
  245. jsonElement.TryGetProperty("isPersonal", out JsonElement isPersonal);
  246. var cosmosClient = _azureCosmos.GetCosmosClient();
  247. List<object> paperInfos = new List<object>();
  248. string sqlTxt = $"select * from c where c.id='{paperId}' and c.pk='Paper'";
  249. if (!string.IsNullOrEmpty($"{isPersonal}"))
  250. {
  251. string tableName = "School";
  252. if (bool.Parse($"{isPersonal}") == true)
  253. {
  254. tableName = "Teacher";
  255. }
  256. await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", tableName).GetItemQueryStreamIterator(queryText: sqlTxt, requestOptions: new QueryRequestOptions() { }))
  257. {
  258. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  259. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  260. {
  261. paperInfos.Add(obj.ToObject<object>());
  262. }
  263. }
  264. }
  265. else
  266. {
  267. List<string> tableName = new List<string> { "School", "Teacher" };
  268. foreach (var temp in tableName)
  269. {
  270. await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", temp).GetItemQueryStreamIterator(queryText: sqlTxt, requestOptions: new QueryRequestOptions() { }))
  271. {
  272. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  273. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  274. {
  275. paperInfos.Add(obj.ToObject<object>());
  276. }
  277. }
  278. }
  279. }
  280. return Ok(new { state = 200, paperInfos });
  281. }
  282. public record SchoolPaper
  283. {
  284. public string id { get; set; }
  285. public string name { get; set; }
  286. public long totals { get; set; }
  287. }
  288. public record SchoolYear
  289. {
  290. public string id { get; set; }
  291. public string name { get; set; }
  292. public Dictionary<string, long> yearPaper { get; set; }
  293. }
  294. }
  295. }