KnowledgeController.cs 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537
  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.Linq;
  8. using System.Text.Json;
  9. using System.Threading.Tasks;
  10. using TEAMModelOS.Models;
  11. using TEAMModelOS.SDK.Models;
  12. using TEAMModelOS.Models.Dto;
  13. using TEAMModelOS.SDK;
  14. using TEAMModelOS.SDK.DI;
  15. using TEAMModelOS.SDK.Extension;
  16. using TEAMModelOS.SDK.Helper.Common.CollectionHelper;
  17. using TEAMModelOS.SDK.Helper.Common.StringHelper;
  18. namespace TEAMModelOS.Controllers
  19. {
  20. [ProducesResponseType(StatusCodes.Status200OK)]
  21. [ProducesResponseType(StatusCodes.Status400BadRequest)]
  22. //[Authorize(Roles = "IES5")]
  23. //[Route("knowledge")]
  24. //[ApiController]
  25. //[Authorize]
  26. public class KnowledgeController : ControllerBase
  27. {
  28. private readonly AzureStorageFactory _azureStorage;
  29. private readonly AzureCosmosFactory _azureCosmos;
  30. private readonly SnowflakeId _snowflakeId;
  31. private readonly DingDing _dingDing;
  32. private readonly Option _option;
  33. public KnowledgeController(AzureStorageFactory azureStorage, AzureCosmosFactory azureCosmos, SnowflakeId snowflakeId,DingDing dingDing, IOptionsSnapshot<Option> option)
  34. {
  35. _snowflakeId = snowflakeId;
  36. _azureStorage = azureStorage;
  37. _azureCosmos = azureCosmos;
  38. _dingDing = dingDing;
  39. _option = option?.Value;
  40. }
  41. /// <summary>
  42. /// 删除学校 知识点 或 知识块 代理
  43. /// </summary>
  44. /// <typeparam name="T"></typeparam>
  45. /// <param name="request"></param>
  46. /// <param name="builder"></param>
  47. /// <returns></returns>
  48. delegate Task<List<T>> DeleteDelegate<T>(JsonElement request) where T : CosmosEntity;
  49. /// <summary>
  50. /// 保存或者更新学校 知识点 或者 知识块 代理
  51. /// </summary>
  52. /// <typeparam name="T"></typeparam>
  53. /// <param name="schoolBlock"></param>
  54. /// <param name="_azureCosmos"></param>
  55. /// <returns></returns>
  56. delegate Task<string> SchoolSaveOrUpdate<T>(dynamic schoolBlock, AzureCosmosFactory _azureCosmos);
  57. // private delegate dynamic SaveOrUpdate(dynamic t);
  58. /// <summary>
  59. /// 获取标准知识点
  60. /// </summary>
  61. /// <param name="request"></param>
  62. /// <returns></returns>
  63. [ProducesDefaultResponseType]
  64. [HttpPost("find-std-point")]
  65. public async Task<IActionResult> FindStdPoint(KnowledgeDto request)
  66. {
  67. // request.@params.PointParams.TryAdd("PartitionKey", request.lang);
  68. ResponseBuilder builder = ResponseBuilder.custom();
  69. List<KnowledgePoint> data = new List<KnowledgePoint>();
  70. if (request != null && request.PointParams.TryGetValue("SubjectCode", out _))
  71. {
  72. List<KnowledgePoint> points = await _azureStorage.FindListByDict<KnowledgePoint>(request.PointParams);
  73. if (request.Periods.IsNotEmpty())
  74. {
  75. HashSet<KnowledgePoint> knowledges = new HashSet<KnowledgePoint>();
  76. foreach (string period in request.Periods)
  77. {
  78. if (!string.IsNullOrEmpty(period))
  79. {
  80. knowledges.UnionWith(points.Where(x => x.AdvicePeriodCode.Contains(period)).ToHashSet());
  81. }
  82. }
  83. data = knowledges.OrderBy(x => x.Order).ToList();
  84. }
  85. else
  86. {
  87. data = points.OrderBy(x => x.Order).ToList();
  88. }
  89. }
  90. else
  91. {
  92. return Ok(new { ResponseCode.PARAMS_ERROR, V = "SubjectCode is null or empty!" });
  93. }
  94. //return builder.Data(data).Extend(new Dictionary<string, object> { { "count", data.Count } }).build();
  95. return Ok(new { data , data.Count});
  96. }
  97. /// <summary>
  98. /// 获取标准的知识块及包含的知识点
  99. /// </summary>
  100. /// <param name="request"></param>
  101. /// <returns></returns>
  102. [ProducesDefaultResponseType]
  103. [HttpPost("find-std-block-point")]
  104. public async Task<IActionResult> FindStdBlockPoint(KnowledgeDto request)
  105. {
  106. //request.@params.PointParams.TryAdd("PartitionKey", request.lang);
  107. ResponseBuilder builder = ResponseBuilder.custom();
  108. List<BlockPointDto> data = new List<BlockPointDto>();
  109. if (request != null && request.PointParams.TryGetValue("SubjectCode", out _))
  110. {
  111. List<KnowledgeBlockPoint> blockPoints = await _azureStorage.FindListByDict<KnowledgeBlockPoint>(request.PointParams);
  112. List<KnowledgeBlock> blocks = await _azureStorage.FindListByDict<KnowledgeBlock>(request.PointParams);
  113. if (request.Periods.IsNotEmpty())
  114. {
  115. HashSet<KnowledgeBlock> knowledges = new HashSet<KnowledgeBlock>();
  116. HashSet<KnowledgeBlockPoint> knowledgeBlocks = new HashSet<KnowledgeBlockPoint>();
  117. foreach (string period in request.Periods)
  118. {
  119. if (!string.IsNullOrEmpty(period))
  120. {
  121. knowledges.UnionWith(blocks.Where(x => x.AdvicePeriodCode.Contains(period)).ToHashSet());
  122. knowledgeBlocks.UnionWith(blockPoints.Where(x => x.AdvicePeriodCode.Contains(period)).ToHashSet());
  123. }
  124. }
  125. blocks = knowledges.OrderBy(x => x.Order).ToList();
  126. blockPoints = knowledgeBlocks.OrderBy(x => x.Order).ToList();
  127. }
  128. List<BlockPointDto> blockPointDtos = new List<BlockPointDto>();
  129. data = FindTree(ListToTree(blocks, blockPoints), request.BlockId, blockPointDtos);
  130. }
  131. else
  132. {
  133. //return builder.Error(ResponseCode.PARAMS_ERROR, "SubjectCode is null or empty!").build();
  134. return Ok(new { ResponseCode.PARAMS_ERROR, V = "SubjectCode is null or empty!" });
  135. }
  136. //return builder.Data(data).Extend(new Dictionary<string, object> { { "count", data.Count } }).build();
  137. return Ok(new { data, data.Count });
  138. }
  139. /// <summary>
  140. /// 获取知识
  141. /// </summary>
  142. /// <param name="request"></param>
  143. /// <returns></returns>
  144. [ProducesDefaultResponseType]
  145. [HttpPost("find")]
  146. public async Task<IActionResult> Find(JsonElement requert)
  147. {
  148. var client = _azureCosmos.GetCosmosClient();
  149. if (!requert.TryGetProperty("code", out JsonElement school_code)) return BadRequest();
  150. if (!requert.TryGetProperty("type", out JsonElement type)) return BadRequest();
  151. if (!requert.TryGetProperty("periodId", out JsonElement period)) return BadRequest();
  152. if (!requert.TryGetProperty("subjectId", out JsonElement subjectCode)) return BadRequest();
  153. //if (!requert.TryGetProperty("id", out JsonElement id)) return BadRequest();
  154. List<object> Knowledges = new List<object>();
  155. List<Dictionary<string, object>> roles = new List<Dictionary<string, object>>();
  156. /* var response = await client.GetContainer("TEAMModelOSTemp", "Common").ReadItemStreamAsync(id + "", new PartitionKey($"Knowledge-{school_code}"));
  157. if (response.Status == 200)
  158. {
  159. using var json = await JsonDocument.ParseAsync(response.ContentStream);
  160. foreach (var obj in json.RootElement.GetProperty("points").EnumerateArray())
  161. {
  162. roles.Add(obj.GetString());
  163. }
  164. }*/
  165. var query = $"select c.id,c.type,c.code, c.name,c.alias,c.subjectId,c.points,c.knowledgeId,c.periodId from c where c.type = {type} and c.periodId = '{period}' and c.subjectId = '{subjectCode}'";
  166. await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Knowledge-{school_code}") }))
  167. {
  168. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  169. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  170. {
  171. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  172. {
  173. Dictionary<string, object> keyValues = new Dictionary<string, object>();
  174. foreach (var obj_ in obj.EnumerateObject()) {
  175. if ((obj_.Name + "").Equals("type")) {
  176. keyValues.Add("type", obj_.Value + "");
  177. }
  178. if ((obj_.Name+"").Equals("points")) {
  179. keyValues.Add("points", obj_.Value +"");
  180. }
  181. }
  182. roles.Add(keyValues);
  183. Knowledges.Add(obj.ToObject<object>());
  184. }
  185. }
  186. }
  187. return Ok(new { Knowledges, roles, Knowledges.Count });
  188. // request.@params.TryAdd("PartitionKey", request.lang);
  189. /* ResponseBuilder builder = ResponseBuilder.custom();
  190. List<Knowledge> data = new List<Knowledge>();
  191. if (StringHelper.getKeyCount(request) > 0)
  192. {
  193. data = await _azureCosmos.FindByDict<Knowledge>(request);
  194. data.ForEach(d =>
  195. {
  196. if (d.type == 1) {
  197. if (d.code.Equals("habook#0001"))
  198. {
  199. d.ownCount = d.points.Count;
  200. }
  201. else {
  202. d.openCount = d.points.Count;
  203. }
  204. }
  205. });
  206. }
  207. else
  208. {
  209. return builder.Error(ResponseCode.PARAMS_ERROR, "参数异常!").build();
  210. }
  211. return builder.Data(data.OrderBy(m => m.order)).Extend(new Dictionary<string, object> { { "count", data.Count } }).build();*/
  212. }
  213. /// <summary>
  214. /// 保存或更新知识
  215. /// </summary>
  216. /// <param name="request"></param>
  217. /// <returns></returns>
  218. [ProducesDefaultResponseType]
  219. [HttpPost("upsert-all")]
  220. public async Task<IActionResult> UpsertAll(List<Knowledge> request)
  221. {
  222. try
  223. {
  224. var client = _azureCosmos.GetCosmosClient();
  225. List<Knowledge> Knowledges = new List<Knowledge>();
  226. if (request.IsNotEmpty())
  227. {
  228. foreach (Knowledge knowledge in request) {
  229. knowledge.code = "Knowledge-" + knowledge.code;
  230. Knowledge kno = new Knowledge();
  231. if (knowledge.id == null)
  232. {
  233. knowledge.id = Guid.NewGuid().ToString();
  234. kno = await client.GetContainer("TEAMModelOS", "School").CreateItemAsync(knowledge, new PartitionKey($"{knowledge.code}"));
  235. Knowledges.Add(kno);
  236. }
  237. else {
  238. kno = await client.GetContainer("TEAMModelOS", "School").ReplaceItemAsync(knowledge, knowledge.id, new PartitionKey($"{knowledge.code}"));
  239. Knowledges.Add(kno);
  240. }
  241. }
  242. //Knowledges = await SaveOrUpdateKnowledge(request);
  243. /*if (ts.Count > 0) builder.Data(ts).Extend(new Dictionary<string, object> { { "count", ts.Count } });
  244. else {
  245. return Ok(new { ResponseCode.FAILED, V = "失败!" });
  246. }; */
  247. }
  248. return Ok(new { Knowledges });
  249. }
  250. catch (Exception ex)
  251. {
  252. await _dingDing.SendBotMsg($"knowledge,{_option.Location},upsert-all()\n{ex.Message}", GroupNames.醍摩豆服務運維群組);
  253. return BadRequest();
  254. }
  255. }
  256. // TODO 代码优化
  257. /// <summary>
  258. /// 删除知识
  259. /// </summary>
  260. /// <param name="request"></param>
  261. /// <returns></returns>
  262. [ProducesDefaultResponseType]
  263. [HttpPost("delete")]
  264. public async Task<IActionResult> Delete(JsonElement request)
  265. {
  266. try {
  267. var client = _azureCosmos.GetCosmosClient();
  268. if (!request.TryGetProperty("code", out JsonElement code)) return BadRequest();
  269. if (!request.TryGetProperty("id", out JsonElement id)) return BadRequest();
  270. await client.GetContainer("TEAMModelOS", "School").DeleteItemStreamAsync(id.ToString(), new PartitionKey($"Knowledge-{code}"));
  271. return Ok(id);
  272. } catch (Exception ex) {
  273. await _dingDing.SendBotMsg($"knowledge,{_option.Location},delete()\n{ex.Message}", GroupNames.醍摩豆服務運維群組);
  274. return BadRequest();
  275. }
  276. return Ok();
  277. //ResponseBuilder builder = ResponseBuilder.custom();
  278. //DeleteDelegate<Knowledge> deleteDelegate1 = Delete<Knowledge>;
  279. //List<Knowledge> Knowledges = await deleteDelegate1(request);
  280. //if(Knowledges.Count >0) {
  281. // foreach (Knowledge Knowledge in Knowledges)
  282. // {
  283. // if (Knowledge.type == 1)
  284. // {
  285. // List<Knowledge> knowledges = await _azureCosmos.FindSQL<Knowledge>("SELECT value(c) FROM c join a in c.points where c.pk='Knowledge'and Contains(a, '" + Knowledge.id + "') = true ");
  286. // List<Resource> Resources = await _azureCosmos.FindSQL<Resource>("SELECT value(c) FROM c join a in c.points where c.pk='Resources' and Contains(a, '" + Knowledge.id + "') = true ");
  287. // //select value(c) from c join A0 in c.points where 1=1 and A0 = @points0
  288. // foreach (Knowledge knowledge in knowledges) knowledge.points.Remove(Knowledge.id);
  289. // foreach (Resource Resource in Resources) Resource.points.Remove(Knowledge.id);
  290. // await _azureCosmos.SaveOrUpdateAll(Resources);
  291. // await _azureCosmos.SaveOrUpdateAll(knowledges);
  292. // }
  293. // }
  294. // return Ok(new { Knowledges });
  295. //}else
  296. //{
  297. // return Ok(new { erro = ResponseCode.FAILED, v = "删除失败!" });
  298. //}
  299. }
  300. /// <summary>
  301. /// 统计个数
  302. /// </summary>
  303. /// <param name="request"></param>
  304. /// <returns></returns>
  305. [ProducesDefaultResponseType]
  306. [HttpPost("count")]
  307. public async Task<IActionResult> Count(JsonElement request)
  308. {
  309. List<List<List<int>>> sCount = new List<List<List<int>>>();
  310. //List<List<List<List<int>>>> allCount = new List<List<List<List<int>>>>();
  311. ResponseBuilder builder = ResponseBuilder.custom();
  312. request.TryGetProperty("code",out JsonElement code);
  313. if (StringHelper.getKeyCount(request) > 0) {
  314. /*List<School> sc = await _azureCosmos.FindByDict<School>(new Dictionary<string, object>() { { "id", code.ToString()}});*/
  315. List<School> sc = new List<School>();
  316. var client = _azureCosmos.GetCosmosClient();
  317. //List<object> schools = new List<object>();
  318. var query = $"select c.id,c.pk,c.code, c.name,c.region,c.province,c.city,c.timeZone,c.picture,c.size,c.period,c.campuses from c where c.id ='{code}'";
  319. await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("Base") }))
  320. {
  321. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  322. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  323. {
  324. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  325. {
  326. sc.Add(obj.ToObject<School>());
  327. }
  328. }
  329. }
  330. /* //查询校本所有知识块
  331. Dictionary<string, object> scMap = new Dictionary<string, object>
  332. {
  333. { "type", 0},
  334. { "status", 1}
  335. };
  336. List<Knowledge> knowlegeo = await _azureCosmos.FindByDict<Knowledge>(scMap);*/
  337. List<Knowledge> knowlegeo = new List<Knowledge>();
  338. var queryOne = $"select c.id,c.type,c.code, c.name,c.alias,c.subjectId,c.points,c.knowledgeId,c.periodId from c where c.type = 0 and c.status = 1";
  339. await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: queryOne, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Knowledge-{code}") }))
  340. {
  341. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  342. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  343. {
  344. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  345. {
  346. knowlegeo.Add(obj.ToObject<Knowledge>());
  347. }
  348. }
  349. }
  350. for (int i = 0; i < sc.Count; i++)
  351. {
  352. for (int j = 0; j < sc[i].period.Count; j++)
  353. {
  354. List<List<int>> pCount = new List<List<int>>();
  355. for (int k = 0; k < sc[i].period[j].subjects.Count; k++)
  356. {
  357. List<int> listCount = new List<int>() { 0, 0 };
  358. //查询校本知识块
  359. //计数校本知识块与个人知识块
  360. int n = 0;
  361. int s = 0;
  362. for (int m = 0; m < knowlegeo.Count; m++)
  363. {
  364. if (sc[i].period[j].id.Equals(knowlegeo[m].periodId) &&
  365. sc[i].period[j].subjects[k].id.Equals(knowlegeo[m].subjectId))
  366. {
  367. n++;
  368. }
  369. if (knowlegeo[m].code.Equals("habook#0001") &&
  370. sc[i].period[j].id.Equals(knowlegeo[m].periodId) &&
  371. sc[i].period[j].subjects[k].id.Equals(knowlegeo[m].subjectId))
  372. {
  373. s++;
  374. }
  375. }
  376. //册别数量
  377. listCount[0] = n;
  378. listCount[1] = s;
  379. pCount.Add(listCount);
  380. }
  381. sCount.Add(pCount);
  382. }
  383. }
  384. }
  385. //return builder.Data(sCount).build();
  386. return Ok(sCount);
  387. }
  388. #region private
  389. private List<BlockPointDto> ListToTree(List<KnowledgeBlock> blocks, List<KnowledgeBlockPoint> points)
  390. {
  391. List<PointDto> pointList = points.ToJsonString().ToObject<List<PointDto>>();
  392. List<BlockPointDto> blockList = points.ToJsonString().ToObject<List<BlockPointDto>>();
  393. Dictionary<string, List<PointDto>> pointDict = new Dictionary<string, List<PointDto>>();
  394. List<string> keys = (pointList.GroupBy(c => c.BlockId).Select(group => group.Key)).ToList();
  395. foreach (string key in keys)
  396. {
  397. pointDict.Add(key, pointList.Where(x => x.BlockId.Equals(key)).ToList());
  398. }
  399. //var blockDict = blockList.ToDictionary(n => n.RowKey, n => n);
  400. var res = from r in blockList group r by r.RowKey into g select g;
  401. Dictionary<string, BlockPointDto> blockDict = new Dictionary<string, BlockPointDto>();
  402. foreach (var s in res)
  403. {
  404. blockDict.TryAdd(s.First().RowKey, s.First());
  405. }
  406. return GetChild(blockList, blockDict, pointDict);
  407. }
  408. private List<BlockPointDto> GetChild(List<BlockPointDto> list, Dictionary<string, BlockPointDto> blockDict, Dictionary<string, List<PointDto>> pointDict)
  409. {
  410. List<PointDto> empt = new List<PointDto>();
  411. list = list.OrderBy(m => m.Order).ToList();
  412. List<BlockPointDto> trees = new List<BlockPointDto>();
  413. foreach (BlockPointDto node in list)
  414. {
  415. node.Type = 0;
  416. bool fl = pointDict.TryGetValue(node.RowKey, out List<PointDto> points);
  417. if (fl && points.IsNotEmpty())
  418. {
  419. points.ForEach(m =>
  420. {
  421. node.Children.Add(new BlockPointDto
  422. {
  423. PartitionKey = m.PartitionKey,
  424. Pid = m.BlockId,
  425. RowKey = m.PointId,
  426. Type = 1,
  427. Order = m.Order,
  428. Name = m.Name,
  429. SubjectCode = m.SubjectCode,
  430. AdvicePeriodCode = m.AdvicePeriodCode,
  431. //Timestamp = m.Timestamp
  432. });
  433. });
  434. }
  435. bool flag = blockDict.TryGetValue(node.Pid, out BlockPointDto syllabus);
  436. if (flag && syllabus != null)
  437. {
  438. syllabus.Children.Add(node);
  439. }
  440. else
  441. {
  442. trees.Add(node);
  443. }
  444. }
  445. return trees.OrderBy(x => x.Order).ToList();
  446. }
  447. private List<BlockPointDto> FindTree(List<BlockPointDto> trees, String rowKey, List<BlockPointDto> blockPoints)
  448. {
  449. if (!string.IsNullOrEmpty(rowKey))
  450. {
  451. foreach (BlockPointDto tree in trees)
  452. {
  453. if (tree.RowKey.Equals(rowKey))
  454. {
  455. blockPoints.Add(tree);
  456. }
  457. if (null != tree.Children && tree.Children.Count > 0)
  458. {
  459. FindTree(tree.Children, rowKey, blockPoints);
  460. }
  461. }
  462. }
  463. else
  464. {
  465. blockPoints = trees;
  466. }
  467. return blockPoints;
  468. }
  469. // TODO 代码优化
  470. private async Task<List<Knowledge>> SaveOrUpdateKnowledge(List<Knowledge> request)
  471. {
  472. return new List<Knowledge>();
  473. //foreach (Knowledge item in request)
  474. //{
  475. // if (item.id == null)
  476. // {
  477. // item.id = _snowflakeId.NextId() + "";
  478. // }
  479. // if (item.type == 1 && item.points.Count > 0)
  480. // {
  481. // List<string> vs = item.points;
  482. // foreach (string s in vs)
  483. // {
  484. // List<Knowledge> knowledges = await _azureCosmos.FindByDict<Knowledge>(new Dictionary<string, object>() { { "id", s } });
  485. // foreach (Knowledge knowledge in knowledges)
  486. // {
  487. // knowledge.points.Remove(item.id);
  488. // knowledge.points.Add(item.id);
  489. // }
  490. // await _azureCosmos.SaveOrUpdateAll(knowledges);
  491. // }
  492. // item.points.Clear();
  493. // }
  494. //}
  495. //List<Knowledge> ts = await _azureCosmos.SaveOrUpdateAll(request);
  496. //return ts;
  497. }
  498. #endregion
  499. }
  500. }