ItemSticsController.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367
  1. using Microsoft.AspNetCore.Http;
  2. using Microsoft.AspNetCore.Mvc;
  3. using Microsoft.Extensions.Options;
  4. using TEAMModelOS.Models;
  5. using TEAMModelOS.SDK.DI;
  6. using System.Threading.Tasks;
  7. using System.Collections.Generic;
  8. using Azure.Cosmos;
  9. using System.Text.Json;
  10. using TEAMModelBI.Tool;
  11. using System;
  12. using System.Text;
  13. using TEAMModelOS.SDK.Models;
  14. using TEAMModelOS.SDK.Extension;
  15. namespace TEAMModelBI.Controllers.Census
  16. {
  17. [Route("item")]
  18. [ApiController]
  19. public class ItemSticsController : ControllerBase
  20. {
  21. private readonly AzureCosmosFactory _azureCosmos;
  22. private readonly AzureStorageFactory _azureStorage;
  23. private readonly DingDing _dingDing;
  24. private readonly Option _option;
  25. public ItemSticsController(AzureCosmosFactory azureCosmos, AzureStorageFactory azureStorage, DingDing dingDing, IOptionsSnapshot<Option> option)
  26. {
  27. _azureCosmos = azureCosmos;
  28. _dingDing = dingDing;
  29. _azureStorage = azureStorage;
  30. _option = option?.Value;
  31. }
  32. /// <summary>
  33. /// 查询所有试题数量
  34. /// </summary>
  35. /// <param name="jsonElement"></param>
  36. /// <returns></returns>
  37. [HttpPost("get-totals")]
  38. public async Task<IActionResult> GetTotals(JsonElement jsonElement)
  39. {
  40. jsonElement.TryGetProperty("tmdId", out JsonElement tmdId);
  41. var cosmosClient = _azureCosmos.GetCosmosClient();
  42. if (!string.IsNullOrEmpty($"{tmdId}"))
  43. {
  44. List<ItemTatols> itemTatols = new List<ItemTatols>();
  45. List<string> schoolIds = await CommonFind.FindSchoolIds(cosmosClient, $"{tmdId}");
  46. foreach (var scid in schoolIds)
  47. {
  48. School school = new();
  49. var rsponse = await cosmosClient.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(scid, new PartitionKey("Base"));
  50. if (rsponse.Status == 200)
  51. {
  52. using var json = await JsonDocument.ParseAsync(rsponse.ContentStream);
  53. school = json.ToObject<School>();
  54. }
  55. ItemTatols itempTatols = new ItemTatols() { id = scid, name = school.name != null ? school.name : scid };
  56. string sqlTxt = $"select COUNT(c.id) AS totals from c where c.code='Item-{scid}'";
  57. long totals = await CommonFind.FindTotals(cosmosClient, sqlTxt.ToString(), new List<string>() { "School", "Teacher" });
  58. itempTatols.totals = totals;
  59. itemTatols.Add(itempTatols);
  60. }
  61. return Ok(new { state = 200, itemTatols });
  62. }
  63. else
  64. {
  65. string sqlTxt = $"select COUNT(c.id) AS totals from c where c.pk='Item'";
  66. long totals = await CommonFind.FindTotals(cosmosClient, sqlTxt.ToString(), new List<string>() { "School", "Teacher" });
  67. return Ok(new { state = 200, totals });
  68. }
  69. }
  70. /// <summary>
  71. /// 试题类型统计
  72. /// </summary>
  73. /// <returns></returns>
  74. [HttpPost("get-type")]
  75. public async Task<IActionResult> GetTypeCount(JsonElement jsonElement)
  76. {
  77. jsonElement.TryGetProperty("tmdId", out JsonElement tmdId);
  78. if (!jsonElement.TryGetProperty("term", out JsonElement term)) return BadRequest();
  79. var (start, end) = TimeHelper.GetTermStartOrEnd(DateTime.Now);
  80. var cosmosClient = _azureCosmos.GetCosmosClient();
  81. List<string> itemType = new List<string> { "single", "multiple", "judge", "complete", "subjective", "connector", "correct", "compose" };
  82. List<object> typeCount = new List<object>();
  83. if (!string.IsNullOrEmpty($"{tmdId}"))
  84. {
  85. List<string> schoolIds = await CommonFind.FindSchoolIds(cosmosClient, $"{tmdId}");
  86. foreach (var schoolId in schoolIds)
  87. {
  88. School school = new();
  89. var rsponse = await cosmosClient.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(schoolId, new PartitionKey("Base"));
  90. if (rsponse.Status == 200)
  91. {
  92. using var json = await JsonDocument.ParseAsync(rsponse.ContentStream);
  93. school = json.ToObject<School>();
  94. }
  95. Census tempCensus = new Census() { id = schoolId, name = school.name != null ? school.name : schoolId };
  96. foreach (var type in itemType)
  97. {
  98. StringBuilder sqlTxt = new StringBuilder($"select COUNT(c.id) AS totals from c where c.code='Item-{schoolId}' and c.type='{type}'");
  99. if (bool.Parse($"{term}") == true)
  100. {
  101. sqlTxt.Append($" and c.createTime >= {start} and c.createTime <= {end}");
  102. }
  103. long totals = await CommonFind.FindTotals(cosmosClient, sqlTxt.ToString(), new List<string>() { "School", "Teacher" });
  104. tempCensus.census.Add(new KeyValuePair<object, long>(type, totals));
  105. }
  106. typeCount.Add(tempCensus);
  107. }
  108. }
  109. else
  110. {
  111. foreach (var type in itemType)
  112. {
  113. StringBuilder sqlTxt = new StringBuilder($"select COUNT(c.id) AS totals from c where c.pk='Item' and c.type='{type}'");
  114. if (bool.Parse($"{term}") == true)
  115. {
  116. sqlTxt.Append($" and c.createTime >= {start} and c.createTime <= {end}");
  117. }
  118. long totals = await CommonFind.FindTotals(cosmosClient, sqlTxt.ToString(), new List<string>() { "School", "Teacher" });
  119. typeCount.Add(new KeyValuePair<string, object>(type, totals));
  120. }
  121. }
  122. return Ok(new { state = 200, typeCount });
  123. }
  124. /// <summary>
  125. /// 依据难度统计
  126. /// </summary>
  127. /// <returns></returns>
  128. [HttpPost("get-level")]
  129. public async Task<IActionResult> GetLevelCount(JsonElement jsonElement)
  130. {
  131. jsonElement.TryGetProperty("tmdId", out JsonElement tmdId);
  132. if(!jsonElement.TryGetProperty("term", out JsonElement term)) return BadRequest();
  133. var cosmosClient = _azureCosmos.GetCosmosClient();
  134. var (start, end) = TimeHelper.GetTermStartOrEnd(DateTime.Now);
  135. List<object> levelCount = new List<object>();
  136. if (!string.IsNullOrEmpty($"{tmdId}"))
  137. {
  138. List<string> schoolIds = new List<string>();
  139. schoolIds = await CommonFind.FindSchoolIds(cosmosClient, $"{tmdId}");
  140. foreach (var schoolId in schoolIds)
  141. {
  142. School school = new();
  143. var response = await cosmosClient.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(schoolId, new PartitionKey("Base"));
  144. if (response.Status == 200)
  145. {
  146. using var json = await JsonDocument.ParseAsync(response.ContentStream);
  147. school = json.ToObject<School>();
  148. }
  149. Census tempCensus = new Census() { id = schoolId, name = school.name != null ? school.name : schoolId };
  150. for (int i = 1; i < 6; i++)
  151. {
  152. StringBuilder sqlTxt = new StringBuilder($"SELECT COUNT(c.id) AS totals FROM c WHERE c.code='Item-{schoolId}' and c.level={i}");
  153. if (bool.Parse($"{term}") == true)
  154. {
  155. sqlTxt.Append($" and c.createTime >= {start} and c.createTime <= {end}");
  156. }
  157. long totals = await CommonFind.FindTotals(cosmosClient, sqlTxt.ToString(), new List<string>() { "School", "Teacher" });
  158. tempCensus.census.Add(new KeyValuePair<object, long>(i, totals));
  159. }
  160. levelCount.Add(tempCensus);
  161. }
  162. }
  163. else
  164. {
  165. for (int i = 1; i < 6; i++)
  166. {
  167. StringBuilder sqlTxt = new StringBuilder($"select COUNT(c.id) AS totals from c where c.pk='Item' and c.level={i}");
  168. if (bool.Parse($"{term}") == true)
  169. {
  170. sqlTxt.Append($" and c.createTime >= {start} and c.createTime <= {end}");
  171. }
  172. long total = await CommonFind.FindTotals(cosmosClient, sqlTxt.ToString(), new List<string>() { "School", "Teacher" });
  173. levelCount.Add(new KeyValuePair<int, long>(i, total));
  174. }
  175. }
  176. return Ok(new { state = 200, levelCount });
  177. }
  178. /// <summary>
  179. /// 依据层次查询
  180. /// </summary>
  181. /// <returns></returns>
  182. [ProducesDefaultResponseType]
  183. [HttpPost("get-layer")]
  184. public async Task<IActionResult> GetLayerCount(JsonElement jsonElement)
  185. {
  186. jsonElement.TryGetProperty("tmdId", out JsonElement tmdId);
  187. if (!jsonElement.TryGetProperty("term", out JsonElement term)) return BadRequest();
  188. var (start, end) = TimeHelper.GetTermStartOrEnd(DateTime.Now);
  189. var cosmosClient = _azureCosmos.GetCosmosClient();
  190. List<object> layerCount = new List<object>();
  191. if (!string.IsNullOrEmpty($"{tmdId}"))
  192. {
  193. List<string> schoolIds = new List<string>();
  194. schoolIds = await CommonFind.FindSchoolIds(cosmosClient, $"{tmdId}");
  195. foreach (var schoolId in schoolIds)
  196. {
  197. School school = new();
  198. var response = await cosmosClient.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(schoolId, new PartitionKey("Base"));
  199. if (response.Status == 200)
  200. {
  201. using var json = await JsonDocument.ParseAsync(response.ContentStream);
  202. school = json.ToObject<School>();
  203. }
  204. Census tempCensus = new Census() { id = schoolId, name = school.name != null ? school.name : schoolId };
  205. for (int i = 1; i <= 6; i++)
  206. {
  207. StringBuilder sqlTxt = new StringBuilder($"select COUNT(c.id) AS totals from c where c.code='Item-{schoolId}' and c.field={i}");
  208. if (bool.Parse($"{term}") == true)
  209. {
  210. sqlTxt.Append($" and c.createTime >= {start} and c.createTime <= {end}");
  211. }
  212. long totals = await CommonFind.FindTotals(cosmosClient, sqlTxt.ToString(), new List<string>() { "School", "Teacher" });
  213. tempCensus.census.Add(new KeyValuePair<object, long>(i, totals));
  214. }
  215. layerCount.Add(tempCensus);
  216. }
  217. }
  218. else
  219. {
  220. for (int i = 1; i <= 6; i++)
  221. {
  222. StringBuilder sqlTxt = new StringBuilder($"select COUNT(c.id) AS totals from c where c.pk='Item' and c.field={i}");
  223. if (bool.Parse($"{term}") == true)
  224. {
  225. sqlTxt.Append($" and c.createTime >= {start} and c.createTime <= {end}");
  226. }
  227. long totals = await CommonFind.FindTotals(cosmosClient, sqlTxt.ToString(), new List<string>() { "School", "Teacher" });
  228. layerCount.Add(new KeyValuePair<object, long>(i, totals));
  229. }
  230. }
  231. return Ok(new { state = 200, layerCount });
  232. }
  233. /// <summary>
  234. /// 依据试题id查询试题信息 数据管理工具——查询工具
  235. /// </summary>
  236. /// <param name="jsonElement"></param>
  237. /// <returns></returns>
  238. [HttpPost("get-info")]
  239. public async Task<IActionResult> GetInfo(JsonElement jsonElement)
  240. {
  241. if (!jsonElement.TryGetProperty("itemId", out JsonElement itemId)) return BadRequest();
  242. jsonElement.TryGetProperty("isPersonal", out JsonElement isPersonal);
  243. var cosmosClient = _azureCosmos.GetCosmosClient();
  244. List<object> objItems = new List<object>();
  245. string sqlTxt = $"select * from c where c.id='{itemId}' and c.pk='Item'";
  246. if (!string.IsNullOrEmpty($"{isPersonal}"))
  247. {
  248. string tableName = "School";
  249. if (bool.Parse($"{isPersonal}") == true)
  250. {
  251. tableName = "Teacher";
  252. }
  253. await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", tableName).GetItemQueryStreamIterator(queryText: sqlTxt, requestOptions: new QueryRequestOptions() { }))
  254. {
  255. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  256. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  257. {
  258. objItems.Add(obj.ToObject<object>());
  259. }
  260. }
  261. }
  262. else
  263. {
  264. List<string> tableName = new List<string> { "School", "Teacher" };
  265. foreach (string key in tableName)
  266. {
  267. await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", key).GetItemQueryStreamIterator(queryText: sqlTxt, requestOptions: new QueryRequestOptions() { }))
  268. {
  269. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  270. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  271. {
  272. objItems.Add(obj.ToObject<object>());
  273. }
  274. }
  275. }
  276. }
  277. return Ok(new { state = 200, items = objItems });
  278. }
  279. public record ItemTatols
  280. {
  281. /// <summary>
  282. /// 学校ID
  283. /// </summary>
  284. public string id { get; set; }
  285. /// <summary>
  286. /// 学校名称
  287. /// </summary>
  288. public string name { get; set; }
  289. /// <summary>
  290. /// 总数
  291. /// </summary>
  292. public long totals { get; set; }
  293. }
  294. /// <summary>
  295. /// 统计实体
  296. /// </summary>
  297. public record Census
  298. {
  299. /// <summary>
  300. /// 学校ID
  301. /// </summary>
  302. public string id { get; set; }
  303. /// <summary>
  304. /// 学校名称
  305. /// </summary>
  306. public string name { get; set; }
  307. /// <summary>
  308. /// 统计信息
  309. /// </summary>
  310. public List<KeyValuePair<object, long>> census { get; set; } = new List<KeyValuePair<object, long>>();
  311. }
  312. }
  313. }