ItemSticsController.cs 16 KB

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