KnowApplication.cs 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388
  1. using Hotline.Application.Tools;
  2. using Hotline.KnowledgeBase;
  3. using Hotline.Repository.SqlSugar.Extensions;
  4. using Hotline.Settings;
  5. using Hotline.Settings.Hotspots;
  6. using Hotline.Share.Dtos;
  7. using Hotline.Share.Dtos.Knowledge;
  8. using Hotline.Share.Enums.Article;
  9. using Hotline.Share.Enums.KnowledgeBase;
  10. using Hotline.Share.Tools;
  11. using Hotline.Users;
  12. using Mapster;
  13. using MapsterMapper;
  14. using Microsoft.AspNetCore.Http;
  15. using Microsoft.AspNetCore.Mvc;
  16. using Org.BouncyCastle.Utilities.IO;
  17. using PanGu;
  18. using SqlSugar;
  19. using XF.Domain.Authentications;
  20. using XF.Domain.Dependency;
  21. using XF.Domain.Exceptions;
  22. using XF.Domain.Repository;
  23. namespace Hotline.Application.Knowledge
  24. {
  25. public class KnowApplication : IKnowApplication, IScopeDependency
  26. {
  27. private readonly IKnowledgeRepository _knowledgeRepository;
  28. private readonly IRepository<KnowledgePv> _knowledgePvepository;
  29. private readonly IRepository<Hotspot> _hotspotTypeRepository;
  30. private readonly IRepository<KnowledgeType> _knowledgeTypeRepository;
  31. private readonly IRepository<KnowledgeApply> _knowledgeApplyRepository;
  32. private readonly IRepository<KnowledgeWord> _knowledgeWordRepository;
  33. private readonly IRepository<KnowledgeHotWord> _knowledgeHotWordRepository;
  34. private readonly ISessionContext _sessionContext;
  35. private readonly IMapper _mapper;
  36. /// <summary>
  37. ///
  38. /// </summary>
  39. /// <param name="knowledgeRepository"></param>
  40. /// <param name="knowledgeApplyRepository"></param>
  41. /// <param name="sessionContext"></param>
  42. /// <param name="knowledgeDomainService"></param>
  43. /// <param name="mapper"></param>
  44. public KnowApplication(IKnowledgeRepository knowledgeRepository, IRepository<KnowledgeApply> knowledgeApplyRepository, ISessionContext sessionContext, IMapper mapper, IRepository<KnowledgeType> knowledgeTypeRepository, IRepository<Hotspot> hotspotTypeRepository, IRepository<KnowledgeWord> knowledgeWordRepository, IRepository<KnowledgePv> knowledgePvepository, IRepository<KnowledgeHotWord> knowledgeHotWordRepository)
  45. {
  46. _knowledgeRepository = knowledgeRepository;
  47. _knowledgeApplyRepository = knowledgeApplyRepository;
  48. _sessionContext = sessionContext;
  49. _mapper = mapper;
  50. _knowledgeTypeRepository = knowledgeTypeRepository;
  51. _hotspotTypeRepository = hotspotTypeRepository;
  52. _knowledgeWordRepository = knowledgeWordRepository;
  53. _knowledgePvepository = knowledgePvepository;
  54. _knowledgeHotWordRepository = knowledgeHotWordRepository;
  55. }
  56. /// <summary>
  57. /// 知识库查询
  58. /// </summary>
  59. /// <param name="pagedDto"></param>
  60. /// <returns></returns>
  61. public async Task<(int, IList<KnowledgeDataDto>)> GetKnowList(KnowPagedListDto pagedDto, CancellationToken cancellationToken)
  62. {
  63. if (!_sessionContext.OrgIsCenter)
  64. {
  65. pagedDto.Attribution = "部门知识库";
  66. }
  67. var typeSpliceName = string.Empty;
  68. var hotspotHotSpotFullName = string.Empty;
  69. if (!string.IsNullOrEmpty(pagedDto.KnowledgeTypeId))
  70. {
  71. var type = await _knowledgeTypeRepository.GetAsync(x => x.Id == pagedDto.KnowledgeTypeId);
  72. typeSpliceName = type?.SpliceName;
  73. }
  74. if (!string.IsNullOrEmpty(pagedDto.HotspotId))
  75. {
  76. var hotspot = await _hotspotTypeRepository.GetAsync(x => x.Id == pagedDto.HotspotId);
  77. hotspotHotSpotFullName = hotspot?.HotSpotFullName;
  78. }
  79. var (total, temp) = await _knowledgeRepository.Queryable(false, false, false)
  80. .Includes(x => x.User)
  81. .Includes(x => x.SystemOrganize)
  82. .Includes(x => x.SourceOrganize)
  83. .Includes(x => x.HotspotType)
  84. .Includes(x => x.Workflow)
  85. .Includes(x => x.KnowledgeType)
  86. .Where(x => x.IsDeleted == false)
  87. .Where(x => x.KnowledgeType.Any(t => t.KnowledgeType.KnowledgeTypeOrgs.Any(to => to.OrgId == _sessionContext.RequiredOrgId) || t.KnowledgeType.KnowledgeTypeOrgs.Any() == false))
  88. .Where(x => (x.Status == EKnowledgeStatus.Drafts && x.CreatorId == _sessionContext.UserId) || (x.Status != EKnowledgeStatus.Drafts))
  89. .WhereIF(!string.IsNullOrEmpty(pagedDto.Title), x => x.Title.Contains(pagedDto.Title!))
  90. .WhereIF(!string.IsNullOrEmpty(pagedDto.Keyword), x => x.Title.Contains(pagedDto.Keyword!) || x.CreatorName.Contains(pagedDto.Keyword!) || x.CreatorOrgName.Contains(pagedDto.Keyword!) || x.SourceOrganize.Name.Contains(pagedDto.Keyword!))
  91. .WhereIF(pagedDto.Status.HasValue && pagedDto.Status != EKnowledgeStatus.OffShelf && pagedDto.Status != EKnowledgeStatus.NewDrafts && pagedDto.Status != EKnowledgeStatus.All, x => x.Status == pagedDto.Status && ((x.ExpiredTime != null && x.ExpiredTime > DateTime.Now) || x.ExpiredTime == null))
  92. .WhereIF(pagedDto.Status.HasValue && pagedDto.Status == EKnowledgeStatus.OffShelf , x => x.Status == pagedDto.Status || (x.ExpiredTime != null && x.ExpiredTime < DateTime.Now && x.Status != EKnowledgeStatus.Drafts))
  93. .WhereIF(pagedDto.IsPublic.HasValue, x => x.IsPublic == pagedDto.IsPublic)
  94. .WhereIF(!string.IsNullOrEmpty(pagedDto.Summary), x => x.Summary != null && x.Summary.Contains(pagedDto.Summary!))
  95. .WhereIF(!string.IsNullOrEmpty(typeSpliceName), x => x.KnowledgeType.Any(t => t.KnowledgeTypeSpliceName.StartsWith(typeSpliceName)))
  96. .WhereIF(!string.IsNullOrEmpty(hotspotHotSpotFullName), x => x.HotspotType.HotSpotFullName.EndsWith(hotspotHotSpotFullName!))
  97. .WhereIF(!string.IsNullOrEmpty(pagedDto.CreateOrgId), x => x.SourceOrganizeId != null && x.SourceOrganizeId.EndsWith(pagedDto.CreateOrgId!))
  98. .WhereIF(!string.IsNullOrEmpty(pagedDto.ModuleCode), x => x.Workflow.ModuleCode == pagedDto.ModuleCode)
  99. .WhereIF(pagedDto.Status == EKnowledgeStatus.NewDrafts ,x=>x.Status == EKnowledgeStatus.Drafts || x.Status == EKnowledgeStatus.Revert)
  100. .WhereIF(pagedDto.NewDraftsStatus is EKnowledgeStatus.Drafts , x=>x.Status == EKnowledgeStatus.Drafts)
  101. .WhereIF(pagedDto.NewDraftsStatus is EKnowledgeStatus.Revert, x => x.Status == EKnowledgeStatus.Revert)
  102. .WhereIF(!string.IsNullOrEmpty(pagedDto.Attribution),x=>x.Attribution == pagedDto.Attribution)
  103. .OrderByDescending(d => d.CreationTime)
  104. .ToPagedListAsync(pagedDto.PageIndex, pagedDto.PageSize, cancellationToken);
  105. //返回数据
  106. return (total, _mapper.Map<IList<KnowledgeDataDto>>(temp));
  107. }
  108. /// <summary>
  109. /// 知识申请查询
  110. /// </summary>
  111. /// <param name="pagedDto"></param>
  112. /// <param name="cancellationToken"></param>
  113. /// <returns></returns>
  114. public async Task<PagedDto<KnowledgeApplyHandlePageDto>> GetApplyList(KnowledgeApplyPagedDto pagedDto, CancellationToken cancellationToken)
  115. {
  116. var (total, items) = await _knowledgeApplyRepository
  117. .Queryable()
  118. .Includes(it => it.User)
  119. .Includes(it => it.SystemOrganize)
  120. .Where(d => d.CreatorId == _sessionContext.RequiredUserId)
  121. .WhereIF(pagedDto.Status.HasValue, d => d.Status == pagedDto.Status)
  122. .WhereIF(pagedDto.ApplyType.HasValue, d => d.KnowledgeApplyType == pagedDto.ApplyType)
  123. .WhereIF(!string.IsNullOrEmpty(pagedDto.IsOvertime) && pagedDto.IsOvertime == "0", d => d.IsOvertime == true)
  124. .WhereIF(!string.IsNullOrEmpty(pagedDto.IsOvertime) && pagedDto.IsOvertime == "1", d => d.IsOvertime == false)
  125. .WhereIF(pagedDto.StartTime.HasValue, d => d.CreationTime >= pagedDto.StartTime)
  126. .WhereIF(pagedDto.EndTime.HasValue, d => d.CreationTime <= pagedDto.EndTime)
  127. .OrderByDescending(p => p.CreationTime)
  128. .ToPagedListAsync(pagedDto.PageIndex, pagedDto.PageSize, cancellationToken);
  129. return new PagedDto<KnowledgeApplyHandlePageDto>(total, _mapper.Map<IReadOnlyList<KnowledgeApplyHandlePageDto>>(items));
  130. }
  131. /// <summary>
  132. /// 申请处理查询
  133. /// </summary>
  134. /// <param name="pagedDto"></param>
  135. /// <param name="cancellationToken"></param>
  136. /// <returns></returns>
  137. public async Task<PagedDto<KnowledgeApplyHandlePageDto>> GetApplyHandleList(KnowledgeHandlePagedDto pagedDto, CancellationToken cancellationToken)
  138. {
  139. var (total, items) = await _knowledgeApplyRepository
  140. .Queryable()
  141. .Includes(it => it.User)
  142. .Includes(it => it.SystemOrganize)
  143. .Where(p => p.DepartmentId == _sessionContext.RequiredOrgId)
  144. .WhereIF(pagedDto.Status.HasValue, d => d.Status == pagedDto.Status)
  145. .WhereIF(!string.IsNullOrEmpty(pagedDto.Keyword), d => d.User.Name.Contains(pagedDto.Keyword!) || d.SystemOrganize.Name.Contains(pagedDto.Keyword!))
  146. .WhereIF(pagedDto.ApplyType.HasValue, d => d.KnowledgeApplyType == pagedDto.ApplyType)
  147. .WhereIF(!string.IsNullOrEmpty(pagedDto.IsOvertime) && pagedDto.IsOvertime == "0", d => d.IsOvertime == true)
  148. .WhereIF(!string.IsNullOrEmpty(pagedDto.IsOvertime) && pagedDto.IsOvertime == "1", d => d.IsOvertime == false)
  149. .WhereIF(pagedDto.StartTime.HasValue && pagedDto.Status != EKnowledgeApplyStatus.Failed && pagedDto.Status != EKnowledgeApplyStatus.Succeed, d => d.CreationTime >= pagedDto.StartTime)
  150. .WhereIF(pagedDto.EndTime.HasValue && pagedDto.Status != EKnowledgeApplyStatus.Failed && pagedDto.Status != EKnowledgeApplyStatus.Succeed, d => d.CreationTime <= pagedDto.EndTime)
  151. .WhereIF(pagedDto.StartTime.HasValue && pagedDto.Status == EKnowledgeApplyStatus.Failed, d => d.ReturnTime >= pagedDto.StartTime)
  152. .WhereIF(pagedDto.EndTime.HasValue && pagedDto.Status == EKnowledgeApplyStatus.Failed, d => d.ReturnTime <= pagedDto.EndTime)
  153. .WhereIF(pagedDto.StartTime.HasValue && pagedDto.Status == EKnowledgeApplyStatus.Succeed, d => d.HandleTime >= pagedDto.StartTime)
  154. .WhereIF(pagedDto.EndTime.HasValue && pagedDto.Status == EKnowledgeApplyStatus.Succeed, d => d.HandleTime <= pagedDto.EndTime)
  155. .OrderByDescending(p => p.CreationTime)
  156. .ToPagedListAsync(pagedDto.PageIndex, pagedDto.PageSize, cancellationToken);
  157. return new PagedDto<KnowledgeApplyHandlePageDto>(total, _mapper.Map<IReadOnlyList<KnowledgeApplyHandlePageDto>>(items));
  158. }
  159. //public async Task<Dictionary<string, Stream>> KnowledgeInfoListExportAsync(KnowledgeInfoExportInDto dto, CancellationToken cancellationToken)
  160. //{
  161. // var streamList = new Dictionary<string, Stream>();
  162. // var knowList = await _knowledgeRepository.Queryable()
  163. // .Where(m => dto.Ids.Contains(m.Id))
  164. // .Select(m => new { m.Title, m.Content })
  165. // .ToListAsync(cancellationToken);
  166. // foreach (var item in knowList)
  167. // {
  168. // Stream stream = item.Content.HtmlToStream(dto.FileType);
  169. // streamList.Add(item.Title + dto.FileType.GetFileExtension(), stream);
  170. // }
  171. // return streamList;
  172. //}
  173. public async Task<Dictionary<string, Stream>> KnowledgeInfoListExportAsync(KnowledgeInfoExportInDto dto, CancellationToken cancellationToken)
  174. {
  175. var streamList = new Dictionary<string, Stream>();
  176. var knowList = await _knowledgeRepository.Queryable()
  177. .Where(m => dto.Ids.Contains(m.Id))
  178. .Select(m => new { m.Title, m.Content })
  179. .ToListAsync(cancellationToken);
  180. var tasks = knowList.Select(async item =>
  181. {
  182. var stream = await Task.Run(() => item.Content.HtmlToStream(dto.FileType), cancellationToken);
  183. return new KeyValuePair<string, Stream>(
  184. item.Title + dto.FileType.GetFileExtension(),
  185. stream
  186. );
  187. });
  188. var results = await Task.WhenAll(tasks);
  189. foreach (var kvp in results)
  190. {
  191. streamList.Add(kvp.Key, kvp.Value);
  192. }
  193. return streamList;
  194. }
  195. public async Task<IList<KnowledgeWordOutDto>> TitleParticiple(string title)
  196. {
  197. var keywords = new List<KnowledgeWordOutDto>();
  198. var splitWords = new Segment().DoSegment(title);
  199. for (int i = 0;i < splitWords.Count;i++)
  200. {
  201. var word = splitWords.ElementAt(i);
  202. if (word is not { WordType: WordType.SimplifiedChinese, Word.Length: > 1 }) continue;
  203. var tag = splitWords.ElementAt(i).Word;
  204. var entity = await _knowledgeWordRepository.Queryable().Where(m => m.Tag == tag).FirstAsync();
  205. if (entity is not null)
  206. {
  207. keywords.Add(new KnowledgeWordOutDto(entity.Id, entity.Tag));
  208. continue;
  209. }
  210. var wordEntity = new KnowledgeWord
  211. {
  212. Tag = tag,
  213. Classify = "普通标签",
  214. Remark = "系统自动从知识标题分词",
  215. Synonym = "",
  216. IsEnable = 1
  217. };
  218. var keyId = await _knowledgeWordRepository.AddAsync(wordEntity);
  219. keywords.Add(new KnowledgeWordOutDto(keyId, tag));
  220. }
  221. return keywords;
  222. }
  223. public async Task<(int, IList<PageViewOutDto>)> GetPageViewListAsync(PageViewInDto dto, CancellationToken requestAborted = default)
  224. {
  225. var typeSpliceName = string.Empty;
  226. if (!string.IsNullOrEmpty(dto.KnowledgeTypeId))
  227. {
  228. var type = await _knowledgeTypeRepository.GetAsync(x => x.Id == dto.KnowledgeTypeId);
  229. typeSpliceName = type?.SpliceName;
  230. }
  231. var query = _knowledgePvepository.Queryable(includeDeleted: true)
  232. .LeftJoin<KnowledgeBase.Knowledge>((p, k) => p.KnowledgeCode == k.Code)
  233. .LeftJoin<KnowledgeRelationType>((p, k, r) => r.KnowledgeId == k.Id)
  234. .WhereIF(dto.Title.NotNullOrEmpty(), (p, k, r) => k.Title.Contains(dto.Title))
  235. .WhereIF(dto.CreatorName.NotNullOrEmpty(), (p, k, r) => p.CreatorName.Contains(dto.CreatorName))
  236. .WhereIF(dto.KnowledgeTypeId.NotNullOrEmpty(), (p, k, r) => r.KnowledgeTypeSpliceName.StartsWith(typeSpliceName))
  237. .WhereIF(dto.StartTime.HasValue && dto.EndTime.HasValue, (p, k, r) => p.CreationTime >= dto.StartTime && p.CreationTime <= dto.EndTime)
  238. .OrderByDescending((p, k, r) => p.CreationTime);
  239. if (_sessionContext.OrgIsCenter == false)
  240. query = query.Where((p, k, r) => p.CreatorOrgId.StartsWith(_sessionContext.OrgId));
  241. return await query.Select<PageViewOutDto>().ToPagedListAsync(dto.PageIndex, dto.PageSize, requestAborted);
  242. }
  243. public async Task<(int total, IList<KnowledgeHotWordOutDto> items)> GetKnowledgeHotWordListAsync(KnowledgeHotWordInDto dto, CancellationToken requestAborted)
  244. {
  245. var query = _knowledgeHotWordRepository.Queryable()
  246. .WhereIF(dto.IsEnable != null, m => m.IsEnable == dto.IsEnable)
  247. .WhereIF(dto.KeyWord.NotNullOrEmpty(), m => m.KeyWord.Contains(dto.KeyWord))
  248. .WhereIF(dto.Type != null, m => m.Type == dto.Type)
  249. // .WhereIF(dto.StartTime.HasValue && dto.EndTime.HasValue, m => m.CreationTime >= dto.StartTime && m.CreationTime <= dto.EndTime)
  250. ;
  251. if (dto.SortField.NotNullOrEmpty())
  252. query = query.OrderByPropertyName(dto.SortField, (OrderByType)dto.OrderByType);
  253. else
  254. {
  255. query = query.OrderByDescending(m => m.Sort);
  256. query = query.OrderByDescending(m => m.CreationTime);
  257. }
  258. return await query.Select<KnowledgeHotWordOutDto>().ToPagedListAsync(dto.PageIndex, dto.PageSize, requestAborted);
  259. }
  260. public async Task UpdateKnowledgeHotWordAsync(UpdateKnowledgeHotWordInDto dto, CancellationToken requestAborted)
  261. {
  262. var entity = await _knowledgeHotWordRepository.GetAsync(dto.Id)
  263. ?? throw UserFriendlyException.SameMessage("数据不存在");
  264. dto.Adapt(entity);
  265. await _knowledgeHotWordRepository.UpdateAsync(entity);
  266. }
  267. public async Task AddKnowledgeHotWordAsync(AddKnowledgeHotWordInDto dto, CancellationToken requestAborted)
  268. {
  269. var isExist = await _knowledgeHotWordRepository.Queryable()
  270. .Where(m => m.KeyWord == dto.KeyWord).AnyAsync();
  271. if (isExist) throw UserFriendlyException.SameMessage("热词已存在");
  272. var entity = dto.Adapt<KnowledgeHotWord>();
  273. await _knowledgeHotWordRepository.AddAsync(entity, requestAborted);
  274. }
  275. public async Task<(int, List<KnowledgeRetrievalDataDto>)> KnowRetrievalAsync(KnowledgeRetrievalPagedListDto dto)
  276. {
  277. var typeSpliceName = string.Empty;
  278. var hotspotHotSpotFullName = string.Empty;
  279. if (!string.IsNullOrEmpty(dto.KnowledgeTypeId))
  280. {
  281. var type = await _knowledgeTypeRepository.GetAsync(x => x.Id == dto.KnowledgeTypeId);
  282. typeSpliceName = type?.SpliceName;
  283. }
  284. if (!string.IsNullOrEmpty(dto.HotspotId))
  285. {
  286. var hotspot = await _hotspotTypeRepository.GetAsync(x => x.Id == dto.HotspotId);
  287. hotspotHotSpotFullName = hotspot?.HotSpotFullName;
  288. }
  289. if (!_sessionContext.OrgIsCenter)
  290. {
  291. dto.Attribution = "部门知识库";
  292. }
  293. var sugar = _knowledgeRepository
  294. .Queryable(false, false, false)
  295. .Includes(x => x.User)
  296. .Includes(x => x.SystemOrganize)
  297. .Includes(x => x.HotspotType)
  298. .Where(x => x.IsDeleted == false)
  299. .Where(x => x.Status == EKnowledgeStatus.OnShelf)
  300. .Where(x => x.KnowledgeType.Any(t => t.KnowledgeType.KnowledgeTypeOrgs.Any(to => to.OrgId == _sessionContext.RequiredOrgId) || t.KnowledgeType.KnowledgeTypeOrgs.Any() == false))
  301. .WhereIF(!string.IsNullOrEmpty(typeSpliceName), x => x.KnowledgeType.Any(t => t.KnowledgeTypeSpliceName.StartsWith(typeSpliceName)))
  302. .WhereIF(!string.IsNullOrEmpty(hotspotHotSpotFullName), x => x.HotspotType.HotSpotFullName.EndsWith(hotspotHotSpotFullName!))
  303. .WhereIF(!string.IsNullOrEmpty(dto.HotspotName), x => x.HotspotType.HotSpotFullName.EndsWith(dto.HotspotName!))
  304. .WhereIF(!string.IsNullOrEmpty(dto.CreateOrgId), x => x.CreatorOrgId != null && x.CreatorOrgId.EndsWith(dto.CreateOrgId!))
  305. .WhereIF(!string.IsNullOrEmpty(dto.Attribution), x => x.Attribution == dto.Attribution!);
  306. if (dto.Keyword.NotNullOrEmpty())
  307. {
  308. var keywords = dto.Keyword!.SplitKeywords();
  309. var exp = Expressionable.Create<KnowledgeBase.Knowledge>();
  310. foreach (var keyword in keywords)
  311. {
  312. if (dto.RetrievalType == EKnowledgeRetrievalType.All)
  313. exp.Or(x => x.Title.Contains(keyword) || x.Content.Contains(keyword));
  314. if (dto.RetrievalType == EKnowledgeRetrievalType.Title)
  315. exp.Or(x => x.Title.Contains(keyword));
  316. if (dto.RetrievalType == EKnowledgeRetrievalType.Content)
  317. exp.Or(x => x.Content.Contains(keyword));
  318. if (dto.RetrievalType == EKnowledgeRetrievalType.Summary)
  319. exp.Or(x => x.Summary != null && x.Summary.Contains(keyword));
  320. if (dto.RetrievalType == EKnowledgeRetrievalType.KeyWord)
  321. {
  322. var keywordEntity = await _knowledgeWordRepository.GetAsync(m => m.Tag == keyword && m.IsEnable == 0);
  323. if (keywordEntity is null) continue;
  324. exp.Or(x => SqlFunc.JsonArrayAny(x.Keywords, keywordEntity.Id));
  325. }
  326. }
  327. sugar = sugar.Where(exp.ToExpression());
  328. }
  329. if (dto.Content.NotNullOrEmpty())
  330. {
  331. var keywords = dto.Content!.GetSegment();
  332. var exp = Expressionable.Create<KnowledgeBase.Knowledge>();
  333. _knowledgeWordRepository.Queryable()
  334. .Where(m => keywords.Contains(m.Tag) && m.IsEnable == 0)
  335. .Select(m => m.Id)
  336. .ToList()
  337. .ForEach(m =>
  338. exp.Or(x => SqlFunc.JsonArrayAny(x.Keywords, m))
  339. );
  340. sugar = sugar.Where(exp.ToExpression());
  341. }
  342. switch (dto.Sort)
  343. {
  344. case "2":
  345. sugar = sugar.OrderByDescending(p => p.CollectCount);
  346. break;
  347. case "3":
  348. sugar = sugar.OrderByDescending(p => p.CreationTime);
  349. break;
  350. default:
  351. sugar = sugar.OrderByDescending(p => p.PageView);
  352. break;
  353. }
  354. return await sugar.Select<KnowledgeRetrievalDataDto>().ToPagedListAsync(dto.PageIndex, dto.PageSize);
  355. }
  356. }
  357. }