KnowledgesController.cs 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. using Microsoft.AspNetCore.Mvc;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Threading.Tasks;
  6. using TEAMModelOS.Models;
  7. using TEAMModelOS.SDK;
  8. using TEAMModelOS.SDK;
  9. using TEAMModelOS.SDK.DI;
  10. using System.Text.Json;
  11. using TEAMModelOS.SDK.Helper.Common.StringHelper;
  12. using TEAMModelOS.SDK.Models;
  13. using Microsoft.AspNetCore.Http;
  14. using TEAMModelOS.SDK.Extension;
  15. using Azure.Cosmos;
  16. using Microsoft.AspNetCore.Authentication;
  17. using System.Text;
  18. using TEAMModelOS.SDK.DI.AzureCosmos.Inner;
  19. using Microsoft.Extensions.Options;
  20. namespace TEAMModelOS.Controllers
  21. {
  22. [ProducesResponseType(StatusCodes.Status200OK)]
  23. [ProducesResponseType(StatusCodes.Status400BadRequest)]
  24. //[Authorize(Roles = "IES5")]
  25. [Route("knowledges")]
  26. [ApiController]
  27. public class KnowledgesController: ControllerBase
  28. {
  29. private readonly SnowflakeId _snowflakeId;
  30. private readonly AzureCosmosFactory _azureCosmos;
  31. private readonly DingDing _dingDing;
  32. private readonly Option _option;
  33. private readonly AzureRedisFactory _azureRedis;
  34. public KnowledgesController(AzureCosmosFactory azureCosmos, SnowflakeId snowflakeId, DingDing dingDing, IOptionsSnapshot<Option> option, AzureRedisFactory azureRedis)
  35. {
  36. _azureCosmos = azureCosmos;
  37. _snowflakeId = snowflakeId;
  38. _dingDing = dingDing;
  39. _option = option?.Value;
  40. _azureRedis = azureRedis;
  41. }
  42. /**
  43. *
  44. {
  45. "periodId": "ca484aa8-e7b5-4a7c-8ef3-bd9e7b7d4fp2",
  46. "subjectId":"ac73f07d-2cc8-4174-85ae-b39cc5b6beef",
  47. "scope":"school",
  48. "owner":"hbcn",
  49. "points": [
  50. "一元一次方程","二元一次方程","一元二次方程","直线方程","三元一次方程","鸡兔同笼问题","微积分方程","函数有界性","函数单调性","函数奇偶性","函数周期性","函数连续性","函数凹凸性",
  51. "常函数","一次函数","二次函数","三次函数","四次函数","五次函数","幂函数","指数函数","对数函数","三角函数","反三角函数","常数函数",
  52. "正弦函数","余弦函数","正切函数","余切函数","正割函数","余割函数","正矢函数","余矢函数","半正矢函数","半余矢函数","外正割函数","外余割函数"
  53. ],
  54. "blocks":[
  55. {
  56. "name": "方程式" ,
  57. "points":["一元一次方程","二元一次方程","一元二次方程","直线方程","三元一次方程","鸡兔同笼问题","微积分方程"]
  58. },
  59. {
  60. "name": "函数的特性" ,
  61. "points": ["函数有界性","函数单调性","函数奇偶性","函数周期性","函数连续性","函数凹凸性"]
  62. },
  63. {
  64. "name": "多项式函数" ,
  65. "points": ["常函数","一次函数","二次函数","三次函数","四次函数","五次函数"]
  66. },
  67. {
  68. "name": "基本初等函数" ,
  69. "points": ["幂函数","指数函数","对数函数","三角函数","反三角函数","常数函数"]
  70. },
  71. {
  72. "name": "三角函数" ,
  73. "points":["正弦函数","余弦函数","正切函数","余切函数","正割函数","余割函数","正矢函数","余矢函数","半正矢函数","半余矢函数","外正割函数","外余割函数"]
  74. }
  75. ]
  76. }
  77. */
  78. [ProducesDefaultResponseType]
  79. [HttpPost("upsert")]
  80. public async Task<IActionResult> Upsert(TEAMModelOS.SDK.Models.Cosmos.Knowledge knowledge) {
  81. var client = _azureCosmos.GetCosmosClient();
  82. knowledge.code = $"Knowledge-{knowledge.owner}-{knowledge.subjectId}";
  83. StringBuilder sql = new StringBuilder($"select value(c) from c where c.periodId = '{knowledge.periodId}'");
  84. TEAMModelOS.SDK.Models.Cosmos.Knowledge old = null;
  85. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<TEAMModelOS.SDK.Models.Cosmos.Knowledge>(queryText: sql.ToString(), requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"{ knowledge.code}") }))
  86. {
  87. old = item;
  88. break;
  89. }
  90. if (old != null)
  91. {
  92. knowledge.id = old.id;
  93. knowledge = await client.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync(knowledge, old.id, new PartitionKey($"{knowledge.code}"));
  94. }
  95. else {
  96. knowledge.id = Guid.NewGuid().ToString();
  97. knowledge = await client.GetContainer(Constant.TEAMModelOS, "School").CreateItemAsync(knowledge, new PartitionKey($"{knowledge.code}"));
  98. }
  99. var count= new { pcount = knowledge.points!=null ? knowledge.points.Count:0,bcount= knowledge.blocks!=null? knowledge.blocks.Count:0 };
  100. //处理知识点,知识块计数问题
  101. await _azureRedis.GetRedisClient(8).HashSetAsync($"Knowledge:Count:{knowledge.owner}-{knowledge.subjectId}", knowledge.periodId, count.ToJsonString());
  102. return Ok(knowledge);
  103. }
  104. /// <summary>
  105. /**
  106. {
  107. !"hbcn-ac73f07d-2cc8-4174-85ae-b39cc5b6beef":"ca484aa8-e7b5-4a7c-8ef3-bd9e7b7d4fp2",
  108. }
  109. 单个Item查询一个学校某个科目知识点,知识块数量,如果需要确定某一个学段,则需要加学段。
  110. **/
  111. /// </summary>
  112. /// <param name="request"></param>
  113. /// <returns></returns>
  114. [ProducesDefaultResponseType]
  115. [HttpPost("find-count")]
  116. public async Task<IActionResult> FindCount(Dictionary<string,string> request)
  117. {
  118. List<dynamic> datas = new List<dynamic>();
  119. foreach (var kp in request) {
  120. var countPoint = 0;
  121. var countBlock = 0;
  122. if (!string.IsNullOrWhiteSpace(kp.Value))
  123. {
  124. var value =await _azureRedis.GetRedisClient(8).HashGetAsync($"Knowledge:Count:{kp.Key}", kp.Value);
  125. if (value != default && !value.IsNullOrEmpty)
  126. {
  127. JsonElement record = value.ToString().ToObject<JsonElement>();
  128. if (record.TryGetProperty("pcount", out JsonElement pcout))
  129. {
  130. int.TryParse($"{pcout}", out countPoint);
  131. }
  132. if (record.TryGetProperty("bcount", out JsonElement bcout))
  133. {
  134. int.TryParse($"{bcout}", out countBlock);
  135. }
  136. }
  137. }
  138. else {
  139. var values = await _azureRedis.GetRedisClient(8).HashGetAllAsync($"Knowledge:Count:{kp.Key}");
  140. if (values != null) {
  141. foreach (var value in values)
  142. {
  143. JsonElement record = value.ToString().ToObject<JsonElement>();
  144. if (record.TryGetProperty("pcount", out JsonElement pcout))
  145. {
  146. if (int.TryParse($"{pcout}", out int countP))
  147. {
  148. countPoint = countPoint + countP;
  149. }
  150. }
  151. if (record.TryGetProperty("bcount", out JsonElement bcout))
  152. {
  153. if(int.TryParse($"{bcout}", out int countB))
  154. {
  155. countBlock = countBlock + countB;
  156. }
  157. }
  158. }
  159. }
  160. }
  161. datas.Add( new { key = kp.Key, countPoint, countBlock });
  162. }
  163. return Ok(new { datas });
  164. }
  165. /**
  166. * {
  167. ?"periodId": "ca484aa8-e7b5-4a7c-8ef3-bd9e7b7d4fp2",
  168. !"subjectId": "ac73f07d-2cc8-4174-85ae-b39cc5b6beef",
  169. !"school_code": "hbcn"
  170. }
  171. **/
  172. [ProducesDefaultResponseType]
  173. [HttpPost("find")]
  174. public async Task<IActionResult> Find(JsonElement request) {
  175. var client = _azureCosmos.GetCosmosClient();
  176. request.TryGetProperty("periodId", out JsonElement periodId);
  177. if (!request.TryGetProperty("subjectId", out JsonElement subjectId)) return BadRequest();
  178. if (!request.TryGetProperty("school_code", out JsonElement school_code)) return BadRequest();
  179. string code = $"Knowledge-{school_code}-{subjectId}";
  180. StringBuilder sql = new StringBuilder($"select value(c) from c");
  181. if (periodId.ValueKind.Equals(JsonValueKind.String)) {
  182. sql.Append($" where c.periodId = '{periodId}'");
  183. }
  184. List<TEAMModelOS.SDK.Models.Cosmos.Knowledge> knowledges = new List<SDK.Models.Cosmos.Knowledge>() ;
  185. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<TEAMModelOS.SDK.Models.Cosmos.Knowledge>(queryText: sql.ToString(), requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"{code}") }))
  186. {
  187. knowledges.Add(item);
  188. }
  189. return Ok(knowledges);
  190. }
  191. }
  192. }