Sfoglia il codice sorgente

Merge branch 'feature/task_4_knowledge' into release

qinchaoyue 6 mesi fa
parent
commit
3a45d195fe

+ 15 - 11
src/Hotline.Api/Controllers/KnowledgeController.cs

@@ -649,11 +649,6 @@ namespace Hotline.Api.Controllers
                 .Where(x => x.IsDeleted == false)
                 .Where(x => x.Status == EKnowledgeStatus.OnShelf)
                 .Where(x => x.KnowledgeType.Any(t => t.KnowledgeType.KnowledgeTypeOrgs.Any(to => to.OrgId == _sessionContext.RequiredOrgId) || t.KnowledgeType.KnowledgeTypeOrgs.Any() == false))
-                // .WhereIF(dto.RetrievalType == EKnowledgeRetrievalType.All && !string.IsNullOrEmpty(dto.Keyword), d => d.Title.Contains(dto.Keyword!) || d.Content.Contains(dto.Keyword!))
-                //.WhereIF(dto.RetrievalType == EKnowledgeRetrievalType.Title && !string.IsNullOrEmpty(dto.Keyword), d => d.Title.Contains(dto.Keyword!))
-                //.WhereIF(dto.RetrievalType == EKnowledgeRetrievalType.Content && !string.IsNullOrEmpty(dto.Keyword), d => d.Content.Contains(dto.Keyword!))
-                //.WhereIF(dto.RetrievalType == EKnowledgeRetrievalType.Summary && !string.IsNullOrEmpty(dto.Keyword), d => d.Summary != null && d.Summary.Contains(dto.Keyword!))
-                //.WhereIF(!string.IsNullOrEmpty(typeSpliceName), x => SqlFunc.JsonLike(x.KnowledgeType, typeSpliceName))
                 .WhereIF(!string.IsNullOrEmpty(typeSpliceName), x => x.KnowledgeType.Any(t => t.KnowledgeTypeSpliceName.EndsWith(typeSpliceName)))
                 .WhereIF(!string.IsNullOrEmpty(hotspotHotSpotFullName), x => x.HotspotType.HotSpotFullName.EndsWith(hotspotHotSpotFullName!))
                 .WhereIF(!string.IsNullOrEmpty(dto.HotspotName), x => x.HotspotType.HotSpotFullName.EndsWith(dto.HotspotName!))
@@ -666,22 +661,31 @@ namespace Hotline.Api.Controllers
                 foreach (var keyword in keywords)
                 {
                     if (dto.RetrievalType == EKnowledgeRetrievalType.All)
-                        exp.Or(m => m.Title.Contains(keyword) || m.Content.Contains(keyword));
+                        exp.Or(x => x.Title.Contains(keyword) || x.Content.Contains(keyword));
                     if (dto.RetrievalType == EKnowledgeRetrievalType.Title)
-                        exp.Or(m => m.Title.Contains(keyword));
+                        exp.Or(x => x.Title.Contains(keyword));
                     if (dto.RetrievalType == EKnowledgeRetrievalType.Content)
-                        exp.Or(m => m.Content.Contains(keyword));
+                        exp.Or(x => x.Content.Contains(keyword));
                     if (dto.RetrievalType == EKnowledgeRetrievalType.Summary)
-                        exp.Or(m => m.Summary != null && m.Summary.Contains(keyword));
+                        exp.Or(x => x.Summary != null && x.Summary.Contains(keyword));
                     if (dto.RetrievalType == EKnowledgeRetrievalType.KeyWord)
                     {
                         var keywordEntity = await _knowledgeWordRepository.GetAsync(m => m.Tag == keyword && m.IsEnable == 0);
                         if (keywordEntity is null) continue;
-                        exp.Or(m => SqlFunc.JsonArrayAny(m.Keywords, keywordEntity.Id));
+                        exp.Or(x => SqlFunc.JsonArrayAny(x.Keywords, keywordEntity.Id));
                     }
                 }
                 sugar.Where(exp.ToExpression());
             }
+            if (dto.Content.NotNullOrEmpty())
+            {
+                var keywords = dto.Content!.GetSegment();
+                var keywordIds = _knowledgeWordRepository.Queryable()
+                    .Where(m => keywords.Contains(m.Tag))
+                    .Select(m => m.Id)
+                    .ToList();
+                sugar = sugar.Where(x => SqlFunc.JsonArrayAny(x.Keywords, keywordIds));
+            }
 
             switch (dto.Sort)
             {
@@ -707,7 +711,7 @@ namespace Hotline.Api.Controllers
         public async Task<Dictionary<string, dynamic>> GetKnowretrievalBaseData()
         {
             return _baseDataApplication
-                .KnowledgeRetrievalType(new[] { 3, 4})
+                .KnowledgeRetrievalType([3, 4])
                 .Build();
         }
 

+ 0 - 1
src/Hotline.Application/Hotline.Application.csproj

@@ -9,7 +9,6 @@
   <ItemGroup>
     <PackageReference Include="HtmlToOpenXml.dll" Version="3.2.0" />
     <PackageReference Include="JiebaAspNetCore.Segmenter" Version="1.0.1" />
-    <PackageReference Include="JV.PanGu.Core" Version="1.0.1" />
     <PackageReference Include="NPOI" Version="2.7.0" />
     <PackageReference Include="OpenHtmlToPdf" Version="1.12.0" />
     <PackageReference Include="XC.RSAUtil" Version="1.3.6" />

+ 11 - 10
src/Hotline.Share/Dtos/Knowledge/KnowledgePagedDto.cs

@@ -21,17 +21,18 @@ namespace Hotline.Share.Dtos.Knowledge
 	/// <param name="EKnowledgeWorkFlowStatus">审核状态</param>
 	public record KnowledgeApprovalPagedListDto(EKnowledgeApplyType? EKnowledgeApplyType, EKnowledgeWorkFlowStatus? EKnowledgeWorkFlowStatus) : PagedKeywordRequest;
 
-	/// <summary>
-	/// 知识检索
-	/// </summary>
-	/// <param name="RetrievalType">检索类型</param>
-	/// <param name="Attribution">归属</param>
-	/// <param name="Sort">排序字段</param>
-	/// <param name="CreateOrgId">部门id</param>
-	/// <param name="HotspotId">热点id</param>
+    /// <summary>
+    /// 知识检索
+    /// </summary>
+    /// <param name="RetrievalType">检索类型</param>
+    /// <param name="Attribution">归属</param>
+    /// <param name="Sort">排序字段</param>
+    /// <param name="CreateOrgId">部门id</param>
+    /// <param name="HotspotId">热点id</param>
     /// <param name="HotspotName">热点名称</param>;
-	/// <param name="KnowledgeTypeId">类型id</param>
-	public record KnowledgeRetrievalPagedListDto(EKnowledgeRetrievalType? RetrievalType,string? Attribution,string Sort, string? CreateOrgId, string? HotspotId, string? HotspotName, string? KnowledgeTypeId) : PagedKeywordRequest;
+    /// <param name="KnowledgeTypeId">类型id</param>
+    /// <param name="Content">受理内容</param>
+    public record KnowledgeRetrievalPagedListDto(EKnowledgeRetrievalType? RetrievalType,string? Attribution,string Sort, string? CreateOrgId, string? HotspotId, string? HotspotName, string? KnowledgeTypeId, string? Content) : PagedKeywordRequest;
 
     /// <summary>
     /// 来电弹屏知识库查询

+ 1 - 0
src/Hotline.Share/Hotline.Share.csproj

@@ -12,6 +12,7 @@
 
   <ItemGroup>
     <PackageReference Include="DocXCore" Version="1.0.10" />
+    <PackageReference Include="JV.PanGu.Core" Version="1.0.1" />
     <PackageReference Include="Mapster" Version="7.4.0" />
     <PackageReference Include="MediatR.Contracts" Version="2.0.1" />
     <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.1" />

+ 17 - 2
src/Hotline.Share/Tools/StringExtensions.cs

@@ -1,4 +1,5 @@
-using System.Text.RegularExpressions;
+using PanGu;
+using System.Text.RegularExpressions;
 
 namespace Hotline.Share.Tools;
 public static class StringExtensions
@@ -44,7 +45,21 @@ public static class StringExtensions
         return Regex.IsMatch(value, phoneNumberPattern);
     }
 
-    public static IList<string> SplitKeywords(this string value)
+    /// <summary>
+    /// 通过 PanGu 进行分词
+    /// </summary>
+    /// <param name="value"></param>
+    /// <returns></returns>
+    public static IList<string> GetSegment(this string value)
+    {
+        return new Segment()
+            .DoSegment(value)
+            .Where(word => word.WordType == WordType.SimplifiedChinese && word.Word.Length > 1)
+            .Select(word => word.Word)
+            .ToList();
+    }
+
+        public static IList<string> SplitKeywords(this string value)
     {
         var regex = new Regex(@"[ ,,]+");