PaperController.cs 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422
  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.Models;
  15. namespace TEAMModelBI.Controllers.BISchool
  16. {
  17. /// <summary>
  18. /// 试卷
  19. /// </summary>
  20. [Route("paper")]
  21. [ApiController]
  22. public class PaperController : ControllerBase
  23. {
  24. private readonly AzureCosmosFactory _azureCosmos;
  25. private readonly AzureStorageFactory _azureStorage;
  26. private readonly DingDing _dingDing;
  27. private readonly Option _option;
  28. public PaperController(AzureCosmosFactory azureCosmos, AzureStorageFactory azureStorage, DingDing dingDing, IOptionsSnapshot<Option> option)
  29. {
  30. _azureCosmos = azureCosmos;
  31. _azureStorage = azureStorage;
  32. _dingDing = dingDing;
  33. _option = option?.Value;
  34. }
  35. /// <summary>
  36. /// 查询试卷的数量统计集合
  37. /// </summary>
  38. /// <param name="jsonElement"></param>
  39. /// <returns></returns>
  40. [HttpPost("get-count")]
  41. public async Task<IActionResult> GetCount(JsonElement jsonElement)
  42. {
  43. jsonElement.TryGetProperty("tmdId", out JsonElement tmdId);
  44. if(!jsonElement.TryGetProperty("term", out JsonElement term)) return BadRequest();
  45. var (start, end) = DateTimeHeloer.GetTermStartOrEnd(DateTime.Now);
  46. var cosmosClient = _azureCosmos.GetCosmosClient();
  47. object paperCount = new object();
  48. StringBuilder sqlTxt = new StringBuilder("select count(c.id) AS totals from c");
  49. if (!string.IsNullOrEmpty($"{tmdId}"))
  50. {
  51. List<string> schoolIds = new List<string>();
  52. List<SchoolPaper> schoolPapers = new List<SchoolPaper>();
  53. string schoolSql = $"SELECT DISTINCT REPLACE(c.code,'Teacher-','') AS schoolId,c.code,c.roles,c.id,c.name From c where ARRAY_CONTAINS(c.roles,'assist',true) AND c.pk = 'Teacher' AND c.status = 'join' AND c.id='{tmdId}'";
  54. await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: schoolSql, requestOptions: new QueryRequestOptions() { }))
  55. {
  56. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  57. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  58. {
  59. schoolIds.Add(obj.GetProperty("schoolId").GetString());
  60. }
  61. }
  62. if (bool.Parse($"{term}") == true)
  63. {
  64. sqlTxt.Append($" where c.createTime >={start} and c.createTime <={end}");
  65. }
  66. foreach (var schoolId in schoolIds)
  67. {
  68. SchoolPaper schoolPaper = new SchoolPaper() { id = schoolId };
  69. School school = new();
  70. try
  71. {
  72. school = await cosmosClient.GetContainer("TEAMModelOS", "School").ReadItemAsync<School>(schoolId, new PartitionKey("Base"));
  73. }
  74. catch
  75. {
  76. }
  77. schoolPaper.name = school != null ? school.name : schoolId;
  78. await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText:sqlTxt.ToString(), requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Paper-{schoolId}") }))
  79. {
  80. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  81. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetInt16() > 0)
  82. {
  83. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  84. {
  85. schoolPaper.total += obj.GetProperty("totals").GetInt64();
  86. }
  87. }
  88. }
  89. schoolPapers.Add(schoolPaper);
  90. }
  91. paperCount = schoolPapers;
  92. }
  93. else
  94. {
  95. long tempTotal = 0;
  96. sqlTxt.Append(" where c.pk='Paper' ");
  97. if (bool.Parse($"{term}") == true)
  98. {
  99. sqlTxt.Append($" and c.createTime >= {start} and c.createTime <={end}");
  100. }
  101. await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: sqlTxt.ToString(), requestOptions: new QueryRequestOptions() { }))
  102. {
  103. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  104. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetInt64() > 0)
  105. {
  106. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  107. {
  108. tempTotal += obj.GetProperty("totals").GetInt64();
  109. }
  110. }
  111. }
  112. paperCount = tempTotal;
  113. }
  114. return Ok(new { state = 200 , paperCount });
  115. }
  116. /// <summary>
  117. /// 查询所有的试题数量
  118. /// </summary>
  119. /// <returns></returns>
  120. [HttpPost("get-total")]
  121. public async Task<IActionResult> GetTotal()
  122. {
  123. var cosmosClient = _azureCosmos.GetCosmosClient();
  124. long total = 0;
  125. //string sqlText = $"select c.id from c where c.pk='Paper'";
  126. string sqlText = $"select COUNT(c.id) AS totals from c where c.pk='Paper'";
  127. await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: sqlText, requestOptions: new QueryRequestOptions() { }))
  128. {
  129. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  130. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetInt64() > 0)
  131. {
  132. //total += count.GetInt64();
  133. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  134. {
  135. total += obj.GetProperty("totals").GetInt64();
  136. }
  137. }
  138. }
  139. return Ok(new { state = 200, total });
  140. }
  141. /// <summary>
  142. /// 依据醍摩豆账户统计相关联的学校试卷数量
  143. /// </summary>
  144. /// <param name="jsonElement"></param>
  145. /// <returns></returns>
  146. [ProducesDefaultResponseType]
  147. [HttpPost("get-assistschool")]
  148. public async Task<IActionResult> GetAssistSchool(JsonElement jsonElement)
  149. {
  150. if (!jsonElement.TryGetProperty("tmdId", out JsonElement tmdId)) return BadRequest();
  151. var cosmosClient = _azureCosmos.GetCosmosClient();
  152. List<string> schoolIds = new List<string>();
  153. List<SchoolPaper> schoolPapers = new List<SchoolPaper>();
  154. string schoolSql = $"SELECT DISTINCT REPLACE(c.code,'Teacher-','') AS schoolId,c.code,c.roles,c.id,c.name From c where ARRAY_CONTAINS(c.roles,'assist',true) AND c.pk = 'Teacher' AND c.status = 'join' AND c.id='{tmdId}'";
  155. await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryText: schoolSql, requestOptions: new QueryRequestOptions() { }))
  156. {
  157. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  158. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  159. {
  160. schoolIds.Add(obj.GetProperty("schoolId").GetString());
  161. }
  162. }
  163. foreach (var schoolId in schoolIds)
  164. {
  165. SchoolPaper schoolPaper = new SchoolPaper() { id = schoolId };
  166. School school = new();
  167. try
  168. {
  169. school = await cosmosClient.GetContainer("TEAMModelOS", "School").ReadItemAsync<School>(schoolId, new PartitionKey("Base"));
  170. }
  171. catch
  172. {
  173. }
  174. schoolPaper.name = school != null ? school.name : schoolId;
  175. await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator($"select c.id from c", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Paper-{schoolId}") }))
  176. {
  177. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  178. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetInt64() > 0)
  179. {
  180. schoolPaper.total += count.GetInt64();
  181. }
  182. }
  183. schoolPapers.Add(schoolPaper);
  184. }
  185. return Ok(new { state = 200, schoolPapers });
  186. }
  187. /// <summary>
  188. /// 一年的12个月的
  189. /// </summary>
  190. /// <param name="jsonElement"></param>
  191. /// <returns></returns>
  192. [HttpPost("get-yerar")]
  193. public async Task<IActionResult> GetNewYear(JsonElement jsonElement)
  194. {
  195. jsonElement.TryGetProperty("tmdId", out JsonElement tmdId);
  196. var cosmosClient = _azureCosmos.GetCosmosClient();
  197. List<MonthStartEnd> endList1 = DateTimeHeloer.GetYearMonthlyStartEnd13(DateTimeOffset.UtcNow.Year);
  198. if (string.IsNullOrEmpty($"{tmdId}"))
  199. {
  200. Dictionary<string, long> schoolYears = new Dictionary<string, long>();
  201. foreach (var temp in endList1)
  202. {
  203. long total = 0;
  204. string sqlText = $"SELECT COUNT(c.id) AS totals FROM c WHERE c.createTime >= {temp.start} and c.createTime <= {temp.end} and c.pk='Paper'";
  205. await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: sqlText, requestOptions: new QueryRequestOptions() { }))
  206. {
  207. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  208. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetInt64() > 0)
  209. {
  210. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  211. {
  212. total += obj.GetProperty("totals").GetInt64();
  213. }
  214. }
  215. }
  216. await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "Teacher").GetItemQueryStreamIterator(queryText: sqlText, requestOptions: new QueryRequestOptions() { }))
  217. {
  218. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  219. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetInt64() > 0)
  220. {
  221. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  222. {
  223. total += obj.GetProperty("totals").GetInt64();
  224. }
  225. }
  226. }
  227. schoolYears.Add(temp.yearMonth, total);
  228. }
  229. return Ok(new { state = 200, schoolYears });
  230. }
  231. else
  232. {
  233. List<string> schoolIds = new List<string>();
  234. string schoolSql = $"SELECT DISTINCT REPLACE(c.code,'Teacher-','') AS schoolId,c.code,c.roles,c.id,c.name From c where ARRAY_CONTAINS(c.roles,'assist',true) AND c.pk = 'Teacher' AND c.status = 'join' AND c.id='{tmdId}'";
  235. await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryText: schoolSql, requestOptions: new QueryRequestOptions() { }))
  236. {
  237. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  238. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  239. {
  240. schoolIds.Add(obj.GetProperty("schoolId").GetString());
  241. }
  242. }
  243. List<SchoolYear> schoolYears = new List<SchoolYear>();
  244. foreach (var schoolId in schoolIds)
  245. {
  246. SchoolYear schoolYear = new SchoolYear() { id = schoolId };
  247. School school = new();
  248. try
  249. {
  250. school = await cosmosClient.GetContainer("TEAMModelOS", "School").ReadItemAsync<School>(schoolId, new PartitionKey("Base"));
  251. }
  252. catch
  253. {
  254. }
  255. schoolYear.name = school != null ? school.name : schoolId;
  256. Dictionary<string, long> yearCount = new Dictionary<string, long>();
  257. foreach (var temp in endList1)
  258. {
  259. long total = 0;
  260. string sqlText = $"SELECT COUNT(c.id) AS totals FROM c WHERE c.createTime >= {temp.start} and c.createTime <= {temp.end} and c.pk='Paper'";
  261. await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: sqlText, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Paper-{schoolId}") }))
  262. {
  263. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  264. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetInt64() > 0)
  265. {
  266. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  267. {
  268. total += obj.GetProperty("totals").GetInt64();
  269. }
  270. }
  271. }
  272. await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "Teacher").GetItemQueryStreamIterator(queryText: sqlText, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Paper-{schoolId}") }))
  273. {
  274. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  275. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetInt64() > 0)
  276. {
  277. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  278. {
  279. total += obj.GetProperty("totals").GetInt64();
  280. }
  281. }
  282. }
  283. yearCount.Add(temp.yearMonth, total);
  284. }
  285. schoolYear.yearPaper = yearCount;
  286. schoolYears.Add(schoolYear);
  287. }
  288. return Ok(new { state = 200, schoolYears });
  289. }
  290. }
  291. /// <summary>
  292. /// 统计当前学期的数量,传醍摩豆则统计该账户相关的学校试题统计,不传则统计当前学期的试卷
  293. /// </summary>
  294. /// <param name="jsonElement"></param>
  295. /// <returns></returns>
  296. [HttpPost("get-termpaper")]
  297. public async Task<IActionResult> GetTermPaper(JsonElement jsonElement)
  298. {
  299. jsonElement.TryGetProperty("tmdId", out JsonElement tmdId);
  300. var cosmosClient = _azureCosmos.GetCosmosClient();
  301. var (start, end) = DateTimeHeloer.GetTermStartOrEnd(DateTime.Now);
  302. var total = new object();
  303. if (!string.IsNullOrEmpty($"{tmdId}"))
  304. {
  305. List<string> schoolIds = new List<string>();
  306. List<SchoolPaper> schoolPapers = new List<SchoolPaper>();
  307. string schoolSql = $"SELECT DISTINCT REPLACE(c.code,'Teacher-','') AS schoolId,c.code,c.roles,c.id,c.name From c where ARRAY_CONTAINS(c.roles,'assist',true) AND c.pk = 'Teacher' AND c.status = 'join' AND c.id='{tmdId}'";
  308. await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: schoolSql, requestOptions: new QueryRequestOptions() { }))
  309. {
  310. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  311. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  312. {
  313. schoolIds.Add(obj.GetProperty("schoolId").GetString());
  314. }
  315. }
  316. foreach (var schoolId in schoolIds)
  317. {
  318. SchoolPaper schoolPaper = new SchoolPaper() { id = schoolId };
  319. School school = new();
  320. try
  321. {
  322. school = await cosmosClient.GetContainer("TEAMModelOS", "School").ReadItemAsync<School>(schoolId, new PartitionKey("Base"));
  323. }
  324. catch
  325. {
  326. }
  327. schoolPaper.name = school != null ? school.name : schoolId;
  328. await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator($"select count(c.id) AS totals from c where c.createTime >={start} and c.createTime <={end}", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Paper-{schoolId}") }))
  329. {
  330. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  331. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetInt64() > 0)
  332. {
  333. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  334. {
  335. schoolPaper.total += obj.GetProperty("totals").GetInt64();
  336. }
  337. //schoolPaper.total += count.GetInt64();
  338. }
  339. }
  340. schoolPapers.Add(schoolPaper);
  341. }
  342. total = schoolPapers;
  343. }
  344. else
  345. {
  346. long tempTotal = 0;
  347. string sqlTxt = $"SELECT COUNT(c.id) AS totals FROM c where c.pk='Paper' and c.createTime >= {start} and c.createTime <= {end}";
  348. await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: sqlTxt, requestOptions: new QueryRequestOptions() { }))
  349. {
  350. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  351. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetInt64() > 0)
  352. {
  353. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  354. {
  355. //total += obj.GetProperty("totals").GetInt64();
  356. tempTotal += obj.GetProperty("totals").GetInt64();
  357. }
  358. }
  359. }
  360. total = tempTotal;
  361. }
  362. return Ok(new { state = 200, total });
  363. }
  364. public record SchoolPaper
  365. {
  366. public string id { get; set; }
  367. public string name { get; set; }
  368. public long total { get; set; }
  369. }
  370. public record SchoolYear
  371. {
  372. public string id { get; set; }
  373. public string name { get; set; }
  374. public Dictionary<string, long> yearPaper { get; set; }
  375. }
  376. }
  377. }