ItemSticsController.cs 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499
  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. using Azure.Core;
  17. using TEAMModelOS.SDK.DI;
  18. using TEAMModelOS.SDK.Context.Constant;
  19. using TEAMModelOS.SDK.Models.Service.BI;
  20. namespace TEAMModelBI.Controllers.Census
  21. {
  22. [Route("item")]
  23. [ApiController]
  24. public class ItemSticsController : ControllerBase
  25. {
  26. private readonly AzureCosmosFactory _azureCosmos;
  27. private readonly AzureStorageFactory _azureStorage;
  28. private readonly DingDing _dingDing;
  29. private readonly Option _option;
  30. public ItemSticsController(AzureCosmosFactory azureCosmos, AzureStorageFactory azureStorage, DingDing dingDing, IOptionsSnapshot<Option> option)
  31. {
  32. _azureCosmos = azureCosmos;
  33. _dingDing = dingDing;
  34. _azureStorage = azureStorage;
  35. _option = option?.Value;
  36. }
  37. /// <summary>
  38. /// 查询学校试题
  39. /// </summary>
  40. /// <param name="jsonElement"></param>
  41. /// <returns></returns>
  42. [ProducesDefaultResponseType]
  43. [HttpPost("get-list")]
  44. public async Task<IActionResult> GetList(JsonElement jsonElement)
  45. {
  46. if (!jsonElement.TryGetProperty("code", out JsonElement code)) return BadRequest();
  47. jsonElement.TryGetProperty("scope", out JsonElement scope);
  48. Dictionary<string, object> dic = new();
  49. if (jsonElement.TryGetProperty("periodId", out JsonElement periodId))
  50. dic.Add("periodId", periodId);
  51. if (jsonElement.TryGetProperty("subjectId", out JsonElement subjectId))
  52. dic.Add("subjectId", subjectId);
  53. if (jsonElement.TryGetProperty("gradeIds", out JsonElement gradeIds))
  54. dic.Add("gradeIds", gradeIds);
  55. if (jsonElement.TryGetProperty("type", out JsonElement type))
  56. dic.Add("type", type);
  57. if (jsonElement.TryGetProperty("level", out JsonElement level))
  58. dic.Add("level", level);
  59. if (jsonElement.TryGetProperty("field", out JsonElement field))
  60. dic.Add("field", field);
  61. if (jsonElement.TryGetProperty("isSort", out JsonElement isSort))
  62. {
  63. if (!string.IsNullOrEmpty($"{isSort}"))
  64. {
  65. if (bool.Parse($"{isSort}") == true)
  66. dic.Add("@DESC", "createTime");
  67. else
  68. dic.Add("@ASC", "createTime");
  69. }
  70. else
  71. dic.Add("@ASC", "createTime");
  72. }
  73. if (jsonElement.TryGetProperty("pid", out JsonElement pd))
  74. {
  75. if (pd.ValueKind != JsonValueKind.Null)
  76. dic.Add("pid", pd.ToString());
  77. else
  78. dic.Add("pid", null);
  79. }
  80. var cosmosClinet = _azureCosmos.GetCosmosClient();
  81. StringBuilder sql = new("select c.id,c.code,c.repairResource, c.periodId,c.question,c.useCount,c.level,c.field,c.knowledge,c.type,c.option,c.createTime,c.answer,c.explain,c.children,c.score,c.gradeIds,c.subjectId,c.blob,c.scope from c ");
  82. AzureCosmosQuery cosmosDbQuery = SQLHelper.GetSQL(dic, sql);
  83. List<object> items = new();
  84. if (scope.ToString().Equals("private"))
  85. {
  86. await foreach (var item in cosmosClinet.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryStreamIterator(queryDefinition: cosmosDbQuery.CosmosQueryDefinition, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Item-{code}") }))
  87. {
  88. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  89. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  90. {
  91. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  92. {
  93. items.Add(obj.ToObject<object>());
  94. }
  95. }
  96. }
  97. }
  98. else if (scope.ToString().Equals("school"))
  99. {
  100. await foreach (var item in cosmosClinet.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryDefinition: cosmosDbQuery.CosmosQueryDefinition, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Item-{code}") }))
  101. {
  102. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  103. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  104. {
  105. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  106. {
  107. items.Add(obj.ToObject<object>());
  108. }
  109. }
  110. }
  111. }
  112. else
  113. {
  114. await foreach (var item in cosmosClinet.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryStreamIterator(queryDefinition: cosmosDbQuery.CosmosQueryDefinition, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Item-{code}") }))
  115. {
  116. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  117. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  118. {
  119. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  120. {
  121. items.Add(obj.ToObject<object>());
  122. }
  123. }
  124. }
  125. await foreach (var item in cosmosClinet.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryDefinition: cosmosDbQuery.CosmosQueryDefinition, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Item-{code}") }))
  126. {
  127. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  128. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  129. {
  130. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  131. {
  132. items.Add(obj.ToObject<object>());
  133. }
  134. }
  135. }
  136. }
  137. return Ok(new { state = RespondCode.Ok ,cnt = items.Count, items });
  138. }
  139. /// <summary>
  140. /// 查询所有试题数量
  141. /// </summary>
  142. /// <param name="jsonElement"></param>
  143. /// <returns></returns>
  144. [ProducesDefaultResponseType]
  145. [HttpPost("get-totals")]
  146. public async Task<IActionResult> GetTotals(JsonElement jsonElement)
  147. {
  148. jsonElement.TryGetProperty("tmdId", out JsonElement tmdId);
  149. //jsonElement.TryGetProperty("site", out JsonElement site);//分开部署,就不需要,一站多用时,取消注释
  150. var cosmosClient = _azureCosmos.GetCosmosClient();
  151. ////分开部署,就不需要,一站多用时,取消注释
  152. //if ($"{site}".Equals(BIConst.Global))
  153. // cosmosClient = _azureCosmos.GetCosmosClient(name: BIConst.Global);
  154. if (!string.IsNullOrEmpty($"{tmdId}"))
  155. {
  156. List<ItemTatols> itemTatols = new List<ItemTatols>();
  157. List<string> schoolIds = await CommonFind.FindSchoolIds(cosmosClient, $"{tmdId}");
  158. foreach (var scid in schoolIds)
  159. {
  160. School school = new();
  161. var rsponse = await cosmosClient.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(scid, new PartitionKey("Base"));
  162. if (rsponse.Status == 200)
  163. {
  164. using var json = await JsonDocument.ParseAsync(rsponse.ContentStream);
  165. school = json.ToObject<School>();
  166. }
  167. ItemTatols itempTatols = new() { id = scid, name = school.name != null ? school.name : scid };
  168. string sqlTxt = $"select value(COUNT(c.id)) from c where c.code='Item-{scid}'";
  169. long totals = await CommonFind.GetSqlValueCount(cosmosClient, new List<string>() { "School", "Teacher" }, sqlTxt.ToString());
  170. itempTatols.totals = totals;
  171. itemTatols.Add(itempTatols);
  172. }
  173. return Ok(new { state = 200, itemTatols });
  174. }
  175. else
  176. {
  177. string sqlTxt = $"select value(COUNT(c.id)) from c where c.pk='Item'";
  178. long totals = await CommonFind.GetSqlValueCount(cosmosClient, new List<string>() { "School", "Teacher" }, sqlTxt.ToString());
  179. return Ok(new { state = 200, totals });
  180. }
  181. }
  182. /// <summary>
  183. /// 试题类型统计
  184. /// </summary>
  185. /// <returns></returns>
  186. [ProducesDefaultResponseType]
  187. [HttpPost("get-type")]
  188. public async Task<IActionResult> GetTypeCount(JsonElement jsonElement)
  189. {
  190. jsonElement.TryGetProperty("tmdId", out JsonElement tmdId);
  191. if (!jsonElement.TryGetProperty("term", out JsonElement term)) return BadRequest();
  192. //jsonElement.TryGetProperty("site", out JsonElement site); //分开部署,就不需要,一站多用时,取消注释
  193. var (start, end) = TimeHelper.GetTermStartOrEnd(DateTime.Now);
  194. var cosmosClient = _azureCosmos.GetCosmosClient();
  195. ////分开部署,就不需要,一站多用时,取消注释
  196. //if ($"{site}".Equals(BIConst.Global))
  197. // cosmosClient = _azureCosmos.GetCosmosClient(name: BIConst.Global);
  198. List<string> itemType = new() { "single", "multiple", "judge", "complete", "subjective", "connector", "correct", "compose" };
  199. List<object> typeCount = new();
  200. if (!string.IsNullOrEmpty($"{tmdId}"))
  201. {
  202. List<string> schoolIds = await CommonFind.FindSchoolIds(cosmosClient, $"{tmdId}");
  203. foreach (var schoolId in schoolIds)
  204. {
  205. School school = new();
  206. var rsponse = await cosmosClient.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(schoolId, new PartitionKey("Base"));
  207. if (rsponse.Status == 200)
  208. {
  209. using var json = await JsonDocument.ParseAsync(rsponse.ContentStream);
  210. school = json.ToObject<School>();
  211. }
  212. Census tempCensus = new() { id = schoolId, name = school.name != null ? school.name : schoolId };
  213. foreach (var type in itemType)
  214. {
  215. StringBuilder sqlTxt = new($"select value(COUNT(c.id)) from c where c.code='Item-{schoolId}' and c.type='{type}'");
  216. if (bool.Parse($"{term}") == true)
  217. {
  218. sqlTxt.Append($" and c.createTime >= {start} and c.createTime <= {end}");
  219. }
  220. long totals = await CommonFind.GetSqlValueCount(cosmosClient, new List<string>() { "School", "Teacher" }, sqlTxt.ToString());
  221. tempCensus.census.Add(new KeyValuePair<object, long>(type, totals));
  222. }
  223. typeCount.Add(tempCensus);
  224. }
  225. }
  226. else
  227. {
  228. foreach (var type in itemType)
  229. {
  230. StringBuilder sqlTxt = new($"select value(COUNT(c.id)) from c where c.pk='Item' and c.type='{type}'");
  231. if (bool.Parse($"{term}") == true)
  232. {
  233. sqlTxt.Append($" and c.createTime >= {start} and c.createTime <= {end}");
  234. }
  235. long totals = await CommonFind.GetSqlValueCount(cosmosClient, new List<string>() { "School", "Teacher" }, sqlTxt.ToString());
  236. typeCount.Add(new KeyValuePair<string, object>(type, totals));
  237. }
  238. }
  239. return Ok(new { state = 200, typeCount });
  240. }
  241. /// <summary>
  242. /// 依据难度统计
  243. /// </summary>
  244. /// <returns></returns>
  245. [ProducesDefaultResponseType]
  246. [HttpPost("get-level")]
  247. public async Task<IActionResult> GetLevelCount(JsonElement jsonElement)
  248. {
  249. jsonElement.TryGetProperty("tmdId", out JsonElement tmdId);
  250. if(!jsonElement.TryGetProperty("term", out JsonElement term)) return BadRequest();
  251. //jsonElement.TryGetProperty("site", out JsonElement site);//分开部署,就不需要,一站多用时,取消注释
  252. var cosmosClient = _azureCosmos.GetCosmosClient();
  253. //if ($"{site}".Equals(BIConst.Global))
  254. // cosmosClient = _azureCosmos.GetCosmosClient(name: BIConst.Global);
  255. var (start, end) = TimeHelper.GetTermStartOrEnd(DateTime.Now);
  256. List<object> levelCount = new();
  257. if (!string.IsNullOrEmpty($"{tmdId}"))
  258. {
  259. List<string> schoolIds = new();
  260. schoolIds = await CommonFind.FindSchoolIds(cosmosClient, $"{tmdId}");
  261. foreach (var schoolId in schoolIds)
  262. {
  263. School school = new();
  264. var response = await cosmosClient.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(schoolId, new PartitionKey("Base"));
  265. if (response.Status == 200)
  266. {
  267. using var json = await JsonDocument.ParseAsync(response.ContentStream);
  268. school = json.ToObject<School>();
  269. }
  270. Census tempCensus = new() { id = schoolId, name = school.name != null ? school.name : schoolId };
  271. for (int i = 1; i < 6; i++)
  272. {
  273. StringBuilder sqlTxt = new($"SELECT value(COUNT(c.id)) FROM c WHERE c.code='Item-{schoolId}' and c.level={i}");
  274. if (bool.Parse($"{term}") == true)
  275. {
  276. sqlTxt.Append($" and c.createTime >= {start} and c.createTime <= {end}");
  277. }
  278. long totals = await CommonFind.GetSqlValueCount(cosmosClient, new List<string>() { "School", "Teacher" }, sqlTxt.ToString());
  279. tempCensus.census.Add(new KeyValuePair<object, long>(i, totals));
  280. }
  281. levelCount.Add(tempCensus);
  282. }
  283. }
  284. else
  285. {
  286. for (int i = 1; i < 6; i++)
  287. {
  288. StringBuilder sqlTxt = new($"select value(COUNT(c.id)) from c where c.pk='Item' and c.level={i}");
  289. if (bool.Parse($"{term}") == true)
  290. {
  291. sqlTxt.Append($" and c.createTime >= {start} and c.createTime <= {end}");
  292. }
  293. long total = await CommonFind.GetSqlValueCount(cosmosClient, new List<string>() { "School", "Teacher" }, sqlTxt.ToString());
  294. levelCount.Add(new KeyValuePair<int, long>(i, total));
  295. }
  296. }
  297. return Ok(new { state = 200, levelCount });
  298. }
  299. /// <summary>
  300. /// 依据层次查询
  301. /// </summary>
  302. /// <returns></returns>
  303. [ProducesDefaultResponseType]
  304. [HttpPost("get-layer")]
  305. public async Task<IActionResult> GetLayerCount(JsonElement jsonElement)
  306. {
  307. //jsonElement.TryGetProperty("site", out JsonElement site);//分开部署,就不需要,一站多用时,取消注释
  308. jsonElement.TryGetProperty("tmdId", out JsonElement tmdId);
  309. if (!jsonElement.TryGetProperty("term", out JsonElement term)) return BadRequest();
  310. var (start, end) = TimeHelper.GetTermStartOrEnd(DateTime.Now);
  311. var cosmosClient = _azureCosmos.GetCosmosClient();
  312. //if ($"{site}".Equals(BIConst.Global))
  313. // cosmosClient = _azureCosmos.GetCosmosClient(name: BIConst.Global);
  314. List<object> layerCount = new();
  315. if (!string.IsNullOrEmpty($"{tmdId}"))
  316. {
  317. List<string> schoolIds = new();
  318. schoolIds = await CommonFind.FindSchoolIds(cosmosClient, $"{tmdId}");
  319. foreach (var schoolId in schoolIds)
  320. {
  321. School school = new();
  322. var response = await cosmosClient.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(schoolId, new PartitionKey("Base"));
  323. if (response.Status == 200)
  324. {
  325. using var json = await JsonDocument.ParseAsync(response.ContentStream);
  326. school = json.ToObject<School>();
  327. }
  328. Census tempCensus = new() { id = schoolId, name = school.name != null ? school.name : schoolId };
  329. for (int i = 1; i <= 6; i++)
  330. {
  331. StringBuilder sqlTxt = new($"select value(COUNT(c.id)) from c where c.code='Item-{schoolId}' and c.field={i}");
  332. if (bool.Parse($"{term}") == true)
  333. {
  334. sqlTxt.Append($" and c.createTime >= {start} and c.createTime <= {end}");
  335. }
  336. long totals = await CommonFind.GetSqlValueCount(cosmosClient, new List<string>() { "School", "Teacher" }, sqlTxt.ToString());
  337. tempCensus.census.Add(new KeyValuePair<object, long>(i, totals));
  338. }
  339. layerCount.Add(tempCensus);
  340. }
  341. }
  342. else
  343. {
  344. for (int i = 1; i <= 6; i++)
  345. {
  346. StringBuilder sqlTxt = new($"select value(COUNT(c.id)) from c where c.pk='Item' and c.field={i}");
  347. if (bool.Parse($"{term}") == true)
  348. {
  349. sqlTxt.Append($" and c.createTime >= {start} and c.createTime <= {end}");
  350. }
  351. long totals = await CommonFind.GetSqlValueCount(cosmosClient, new List<string>() { "School", "Teacher" }, sqlTxt.ToString());
  352. layerCount.Add(new KeyValuePair<object, long>(i, totals));
  353. }
  354. }
  355. return Ok(new { state = 200, layerCount });
  356. }
  357. /// <summary>
  358. /// 依据试题id查询试题信息 数据管理工具——查询工具
  359. /// </summary>
  360. /// <param name="jsonElement"></param>
  361. /// <returns></returns>
  362. [ProducesDefaultResponseType]
  363. [HttpPost("get-info")]
  364. public async Task<IActionResult> GetInfo(JsonElement jsonElement)
  365. {
  366. if (!jsonElement.TryGetProperty("itemId", out JsonElement itemId)) return BadRequest();
  367. jsonElement.TryGetProperty("isPersonal", out JsonElement isPersonal);
  368. //jsonElement.TryGetProperty("site", out JsonElement site);//分开部署,就不需要,一站多用时,取消注释
  369. var cosmosClient = _azureCosmos.GetCosmosClient();
  370. ////分开部署,就不需要,一站多用时,取消注释
  371. //if ($"{site}".Equals(BIConst.Global))
  372. // cosmosClient = _azureCosmos.GetCosmosClient(name: BIConst.Global);
  373. List<object> objItems = new();
  374. string sqlTxt = $"select * from c where c.id='{itemId}' and c.pk='Item'";
  375. if (!string.IsNullOrEmpty($"{isPersonal}"))
  376. {
  377. string tableName = "School";
  378. if (bool.Parse($"{isPersonal}") == true)
  379. {
  380. tableName = "Teacher";
  381. }
  382. await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", tableName).GetItemQueryStreamIterator(queryText: sqlTxt, requestOptions: new QueryRequestOptions() { }))
  383. {
  384. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  385. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  386. {
  387. objItems.Add(obj.ToObject<object>());
  388. }
  389. }
  390. }
  391. else
  392. {
  393. List<string> tableName = new() { "School", "Teacher" };
  394. foreach (string key in tableName)
  395. {
  396. await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", key).GetItemQueryStreamIterator(queryText: sqlTxt, requestOptions: new QueryRequestOptions() { }))
  397. {
  398. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  399. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  400. {
  401. objItems.Add(obj.ToObject<object>());
  402. }
  403. }
  404. }
  405. }
  406. return Ok(new { state = 200, items = objItems });
  407. }
  408. public record ItemTatols
  409. {
  410. /// <summary>
  411. /// 学校ID
  412. /// </summary>
  413. public string id { get; set; }
  414. /// <summary>
  415. /// 学校名称
  416. /// </summary>
  417. public string name { get; set; }
  418. /// <summary>
  419. /// 总数
  420. /// </summary>
  421. public long totals { get; set; }
  422. }
  423. /// <summary>
  424. /// 统计实体
  425. /// </summary>
  426. public record Census
  427. {
  428. /// <summary>
  429. /// 学校ID
  430. /// </summary>
  431. public string id { get; set; }
  432. /// <summary>
  433. /// 学校名称
  434. /// </summary>
  435. public string name { get; set; }
  436. /// <summary>
  437. /// 统计信息
  438. /// </summary>
  439. public List<KeyValuePair<object, long>> census { get; set; } = new List<KeyValuePair<object, long>>();
  440. }
  441. }
  442. }