PaperController.cs 16 KB

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