xf před 1 rokem
rodič
revize
380b08f2e5
38 změnil soubory, kde provedl 273 přidání a 283 odebrání
  1. 3 2
      src/Hotline.Api/Controllers/HomeController.cs
  2. 3 2
      src/Hotline.Api/Controllers/KnowledgeApplyController.cs
  3. 3 2
      src/Hotline.Api/Controllers/KnowledgeController.cs
  4. 3 2
      src/Hotline.Api/Controllers/PbxController.cs
  5. 3 2
      src/Hotline.Api/Controllers/RoleController.cs
  6. 8 17
      src/Hotline.Api/Controllers/TestController.cs
  7. 3 2
      src/Hotline.Api/Controllers/UserController.cs
  8. 10 8
      src/Hotline.Api/Controllers/WorkflowController.cs
  9. 1 1
      src/Hotline.Api/config/appsettings.Development.json
  10. 8 7
      src/Hotline.Application/FlowEngine/WorkflowApplication.cs
  11. 3 2
      src/Hotline.Application/Identity/IdentityAppService.cs
  12. 3 2
      src/Hotline.Application/Roles/RoleAppService.cs
  13. 101 0
      src/Hotline.Repository.SqlSugar/BaseRepositoryTextSearch.cs
  14. 0 20
      src/Hotline.Repository.SqlSugar/FlowEngine/DefinitionRepository.cs
  15. 0 20
      src/Hotline.Repository.SqlSugar/FlowEngine/WfModuleRepository.cs
  16. 0 13
      src/Hotline.Repository.SqlSugar/FlowEngine/WorkflowAssignRepository.cs
  17. 0 13
      src/Hotline.Repository.SqlSugar/FlowEngine/WorkflowCountersignRepository.cs
  18. 0 13
      src/Hotline.Repository.SqlSugar/FlowEngine/WorkflowStepRepository.cs
  19. 0 13
      src/Hotline.Repository.SqlSugar/FlowEngine/WorkflowSupplementRepository.cs
  20. 0 13
      src/Hotline.Repository.SqlSugar/FlowEngine/WorkflowTraceRepository.cs
  21. 0 19
      src/Hotline.Repository.SqlSugar/Identity/RoleRepository.cs
  22. 72 0
      src/Hotline.Repository.SqlSugar/TextSearch/IRepositoryTextSearch.cs
  23. 0 13
      src/Hotline.Repository.SqlSugar/Users/UserRepository.cs
  24. 3 2
      src/Hotline/Caching/Services/WfModuleCacheManager.cs
  25. 3 2
      src/Hotline/FlowEngine/Definitions/DefinitionDomainService.cs
  26. 0 9
      src/Hotline/FlowEngine/Definitions/IDefintionRepository.cs
  27. 0 14
      src/Hotline/FlowEngine/WfModules/IWfModuleRepository.cs
  28. 3 2
      src/Hotline/FlowEngine/WfModules/WfModuleDomainService.cs
  29. 0 8
      src/Hotline/FlowEngine/Workflows/IWorkflowAssignRepository.cs
  30. 0 13
      src/Hotline/FlowEngine/Workflows/IWorkflowCountersignRepository.cs
  31. 0 8
      src/Hotline/FlowEngine/Workflows/IWorkflowStepRepository.cs
  32. 0 8
      src/Hotline/FlowEngine/Workflows/IWorkflowSupplementRepository.cs
  33. 0 8
      src/Hotline/FlowEngine/Workflows/IWorkflowTraceRepository.cs
  34. 11 10
      src/Hotline/FlowEngine/Workflows/WorkflowDomainService.cs
  35. 22 0
      src/Hotline/Orders/OrderTs.cs
  36. 0 8
      src/Hotline/Users/IUserRepository.cs
  37. 3 2
      src/Hotline/Users/UserDomainService.cs
  38. 4 3
      src/XF.Domain/Entities/ITextSearch.cs

+ 3 - 2
src/Hotline.Api/Controllers/HomeController.cs

@@ -17,6 +17,7 @@ using StackExchange.Redis;
 using XF.Domain.Authentications;
 using XF.Domain.Constants;
 using XF.Domain.Exceptions;
+using XF.Domain.Repository;
 
 namespace Hotline.Api.Controllers;
 
@@ -31,7 +32,7 @@ public class HomeController : BaseController
     private readonly ISystemMenuRepository _systemMenuRepository;
     private readonly IMapper _mapper;
     private readonly IUserFastMenuRepository _userFastMenuRepository;
-    private readonly IUserRepository _userRepository;
+    private readonly IRepository<User> _userRepository;
     private readonly ISystemSettingCacheManager _systemSettingCacheManager;
 
     public HomeController(
@@ -41,7 +42,7 @@ public class HomeController : BaseController
         ISystemMenuRepository systemMenuRepository,
         IMapper mapper,
         IUserFastMenuRepository userFastMenuRepository,
-        IUserRepository userRepository,
+        IRepository<User> userRepository,
         ISystemSettingCacheManager systemSettingCacheManager)
     {
         _uow = uow;

+ 3 - 2
src/Hotline.Api/Controllers/KnowledgeApplyController.cs

@@ -10,6 +10,7 @@ using MapsterMapper;
 using Microsoft.AspNetCore.Mvc;
 using XF.Domain.Authentications;
 using XF.Domain.Exceptions;
+using XF.Domain.Repository;
 using XF.Utility.EnumExtensions;
 
 namespace Hotline.Api.Controllers
@@ -25,7 +26,7 @@ namespace Hotline.Api.Controllers
         private readonly ISessionContext _sessionContext;
         private readonly IMapper _mapper;
         private readonly IKnowApplication _knowApplication;
-        private readonly IUserRepository _userRepository;
+        private readonly IRepository<User> _userRepository;
         private readonly ISystemOrganizeRepository _systemOrganizeRepository;
         private readonly IKnowledgeDomainService _knowledgeDomainService;
 
@@ -41,7 +42,7 @@ namespace Hotline.Api.Controllers
         /// <param name="systemOrganizeRepository"></param>
         /// <param name="knowledgeDomainService"></param>
         public KnowledgeApplyController(IKnowledgeRepository knowledgeRepository, IKnowledgeApplyRepository knowledgeApplyRepository, ISessionContext sessionContext
-            , IMapper mapper, IKnowApplication knowApplication, IUserRepository userRepository, ISystemOrganizeRepository systemOrganizeRepository, IKnowledgeDomainService knowledgeDomainService)
+            , IMapper mapper, IKnowApplication knowApplication, IRepository<User> userRepository, ISystemOrganizeRepository systemOrganizeRepository, IKnowledgeDomainService knowledgeDomainService)
         {
             _knowledgeRepository = knowledgeRepository;
             _knowledgeApplyRepository = knowledgeApplyRepository;

+ 3 - 2
src/Hotline.Api/Controllers/KnowledgeController.cs

@@ -18,6 +18,7 @@ using Microsoft.AspNetCore.Mvc;
 using SqlSugar;
 using XF.Domain.Authentications;
 using XF.Domain.Exceptions;
+using XF.Domain.Repository;
 using XF.Utility.EnumExtensions;
 
 namespace Hotline.Api.Controllers
@@ -37,7 +38,7 @@ namespace Hotline.Api.Controllers
         private readonly IMediator _mediator;
         private readonly IWorkflowApplication _workflowApplication;
         private readonly IKnowledgeWorkFlowRepository _knowledgeWorkFlowRepository;
-        private readonly IUserRepository _userRepository;
+        private readonly IRepository<User> _userRepository;
         private readonly IKnowledgeTypeRepository _knowledgeTypeRepository;
         private readonly IHotspotTypeRepository _hotspotTypeRepository;
 
@@ -58,7 +59,7 @@ namespace Hotline.Api.Controllers
         /// <param name="hotspotTypeRepository"></param>
         public KnowledgeController(IKnowledgeRepository knowledgeRepository, ISessionContext sessionContext, IKnowledgeDomainService knowledgeDomainService, IMapper mapper, IKnowApplication knowApplication,
            IMediator mediator, IWorkflowApplication workflowApplication, IKnowledgeWorkFlowRepository knowledgeWorkFlowRepository
-            , IUserRepository userRepository, IKnowledgeTypeRepository knowledgeTypeRepository, IHotspotTypeRepository hotspotTypeRepository)
+            , IRepository<User> userRepository, IKnowledgeTypeRepository knowledgeTypeRepository, IHotspotTypeRepository hotspotTypeRepository)
         {
             _knowledgeRepository = knowledgeRepository;
             _sessionContext = sessionContext;

+ 3 - 2
src/Hotline.Api/Controllers/PbxController.cs

@@ -26,6 +26,7 @@ using XF.Utility.EnumExtensions;
 using System.Linq;
 using Hotline.Share.Dtos;
 using Microsoft.AspNetCore.Authorization;
+using XF.Domain.Repository;
 
 namespace Hotline.Api.Controllers
 {
@@ -54,7 +55,7 @@ namespace Hotline.Api.Controllers
         private readonly IIvrCacheManager _ivrCacheManager;
         private readonly ILogger<TelController> _logger;
         private readonly ICallDetailRepository _callDetailRepository;
-        private readonly IUserRepository _userRepository;
+        private readonly IRepository<User> _userRepository;
         private readonly IWexClient _wexClient;
         private readonly IWexTelGroupRepository _wexTelGroupRepository;
 
@@ -79,7 +80,7 @@ namespace Hotline.Api.Controllers
             IIvrCacheManager ivrCacheManager,
             ILogger<TelController> logger,
             ICallDetailRepository callDetailRepository,
-            IUserRepository userRepository,
+            IRepository<User> userRepository,
             IWexClient wexClient,
             IWexTelGroupRepository wexTelGroupRepository)
         {

+ 3 - 2
src/Hotline.Api/Controllers/RoleController.cs

@@ -15,6 +15,7 @@ using Microsoft.Extensions.Options;
 using SqlSugar;
 using XF.Domain.Exceptions;
 using XF.Domain.Options;
+using XF.Domain.Repository;
 using XF.Utility.EnumExtensions;
 
 namespace Hotline.Api.Controllers;
@@ -24,7 +25,7 @@ namespace Hotline.Api.Controllers;
 /// </summary>
 public class RoleController : BaseController
 {
-    private readonly IRoleRepository _roleRepository;
+    private readonly IRepository<Role> _roleRepository;
     private readonly ISystemAuthorityRepository _systemAuthorityRepository;
     private readonly ISystemDataAuthorityRepository _systemDataAuthorityRepository;
     private readonly ITableAccessLevelRepository _tableAccessLevelRepository;
@@ -35,7 +36,7 @@ public class RoleController : BaseController
     private readonly ISystemDataTableRepository _systemDataTableRepository;
 
     public RoleController(
-        IRoleRepository roleRepository,
+        IRepository<Role> roleRepository,
         ISystemAuthorityRepository systemAuthorityRepository,
         ISystemDataAuthorityRepository systemDataAuthorityRepository,
         ITableAccessLevelRepository tableAccessLevelRepository,

+ 8 - 17
src/Hotline.Api/Controllers/TestController.cs

@@ -6,6 +6,7 @@ using Hotline.Identity.Roles;
 using Hotline.Orders;
 using Hotline.Realtimes;
 using Hotline.Repository.SqlSugar;
+using Hotline.Repository.SqlSugar.TextSearch;
 using Hotline.Share.Dtos.Realtime;
 using Hotline.Share.Dtos.Settings;
 using Hotline.Share.Enums.Settings;
@@ -27,6 +28,7 @@ using XF.Domain.Cache;
 using XF.Domain.Exceptions;
 using XF.Domain.Filters;
 using XF.Domain.Locks;
+using XF.Domain.Repository;
 
 namespace Hotline.Api.Controllers;
 
@@ -40,14 +42,14 @@ public class TestController : BaseController
     private readonly IAuthorizeGenerator _authorizeGenerator;
     private readonly IOptionsSnapshot<CallCenterConfiguration> _options;
     private readonly ISessionContext _sessionContext;
-    private readonly IUserRepository _userRepository;
+    private readonly IRepository<User> _userRepository;
 
     private readonly ITypedCache<User> _cache;
     private readonly IRealtimeService _realtimeService;
     private readonly IBlacklistDomainService _blacklistDomainService;
     private readonly IIvrDomainService _ivrDomainService;
     private readonly ISugarUnitOfWork<HotlineDbContext> _uow;
-    private readonly IRoleRepository _roleRepository;
+    private readonly IRepository<Role> _roleRepository;
     private readonly IMediator _mediator;
 
     private readonly ITimeLimitApplication _timeLimitApplication;
@@ -67,7 +69,7 @@ public class TestController : BaseController
         IAuthorizeGenerator authorizeGenerator,
         IOptionsSnapshot<CallCenterConfiguration> options,
         ISessionContext sessionContext,
-        IUserRepository userRepository,
+        IRepository<User> userRepository,
         //ICacheManager<User> cache
         //ITypedCache<List<User>> cache
         ITypedCache<User> cache,
@@ -75,14 +77,14 @@ public class TestController : BaseController
         IBlacklistDomainService blacklistDomainService,
         IIvrDomainService ivrDomainService,
         ISugarUnitOfWork<HotlineDbContext> uow,
-        IRoleRepository roleRepository,
+        IRepository<Role> roleRepository,
         IMediator mediator,
         ITimeLimitApplication timeLimitApplication,
         IDistributedLock distributedLock,
         IWexClient wexClient,
         ISugarUnitOfWork<WexDbContext> uowWex,
         IOrderUrgeRepository orderUrgeRepository
-    )
+        )
     {
         _logger = logger;
         _authorizeGenerator = authorizeGenerator;
@@ -106,18 +108,7 @@ public class TestController : BaseController
     [HttpGet("time")]
     public async Task<OpenResponse> GetTime()
     {
-        //var ourge = new OrderUrge
-        //{
-        //    Content = "fat cats ate fat rats"
-        //};
-
-        //await _orderUrgeRepository.AddAsync(ourge, HttpContext.RequestAborted);
-
-        //var sqlQuery =
-        //    "SELECT * FROM order_urge, to_tsquery('simple', @1) query WHERE TsVector @@ query ORDER BY score DESC";
-
-
-        //"UPDATE cargos SET tokens = setweight(to_tsvector('simple', $1), 'A') || setweight(to_tsvector('simple', $2), 'B') WHERE id = $3"
+        
 
         //_uow.Db.Ado.SqlQueryAsync<OrderUrge>("SELECT to_tsvector('fat cats ate fat rats') @@ to_tsquery('fat & rat')")
 

+ 3 - 2
src/Hotline.Api/Controllers/UserController.cs

@@ -20,6 +20,7 @@ using Hotline.Caching.Interfaces;
 using Hotline.Share.Enums.CallCenter;
 using System;
 using Hotline.Settings.CommonOpinions;
+using XF.Domain.Repository;
 
 namespace Hotline.Api.Controllers;
 
@@ -31,7 +32,7 @@ public class UserController : BaseController
     private readonly ISessionContext _sessionContext;
     private readonly IUserDomainService _userDomainService;
     private readonly ITelRepository _telRepository;
-    private readonly IUserRepository _userRepository;
+    private readonly IRepository<User> _userRepository;
     private readonly IWorkRepository _workRepository;
     private readonly ITelCacheManager _telCacheManager;
     private readonly IUserCacheManager _userCacheManager;
@@ -46,7 +47,7 @@ public class UserController : BaseController
         ISessionContext sessionContext,
         IUserDomainService userDomainService,
         ITelRepository telRepository,
-        IUserRepository userRepository,
+        IRepository<User> userRepository,
         IWorkRepository workRepository,
         ITelCacheManager telCacheManager,
         IUserCacheManager userCacheManager,

+ 10 - 8
src/Hotline.Api/Controllers/WorkflowController.cs

@@ -17,6 +17,8 @@ using Microsoft.AspNetCore.Authorization;
 using XF.Domain.Authentications;
 using XF.Domain.Exceptions;
 using XF.Utility.EnumExtensions;
+using System.Reflection;
+using XF.Domain.Repository;
 
 namespace Hotline.Api.Controllers;
 
@@ -26,31 +28,31 @@ namespace Hotline.Api.Controllers;
 public class WorkflowController : BaseController
 {
     private readonly IDefinitionDomainService _definitionDomainService;
-    private readonly IDefinitionRepository _definitionRepository;
+    private readonly IRepository<Definition> _definitionRepository;
     private readonly IWorkflowApplication _workflowApplication;
     private readonly IWorkflowDomainService _workflowDomainService;
     private readonly IWorkflowRepository _workflowRepository;
-    private readonly IUserRepository _userRepository;
+    private readonly IRepository<User> _userRepository;
     private readonly ISystemOrganizeRepository _organizeRepository;
-    private readonly IRoleRepository _roleRepository;
+    private readonly IRepository<Role> _roleRepository;
     private readonly ISystemDomainService _systemDomainService;
     private readonly IWfModuleDomainService _wfModuleDomainService;
-    private readonly IWfModuleRepository _wfModuleRepository;
+    private readonly IRepository<WorkflowModule> _wfModuleRepository;
     private readonly ISessionContext _sessionContext;
     private readonly IMapper _mapper;
 
     public WorkflowController(
         IDefinitionDomainService definitionDomainService,
-        IDefinitionRepository definitionRepository,
+        IRepository<Definition> definitionRepository,
         IWorkflowApplication workflowApplication,
         IWorkflowDomainService workflowDomainService,
         IWorkflowRepository workflowRepository,
-        IUserRepository userRepository,
+        IRepository<User> userRepository,
         ISystemOrganizeRepository organizeRepository,
-        IRoleRepository roleRepository,
+        IRepository<Role> roleRepository,
         ISystemDomainService systemDomainService,
         IWfModuleDomainService wfModuleDomainService,
-        IWfModuleRepository wfModuleRepository,
+        IRepository<WorkflowModule> wfModuleRepository,
         ISessionContext sessionContext,
         IMapper mapper)
     {

+ 1 - 1
src/Hotline.Api/config/appsettings.Development.json

@@ -54,7 +54,7 @@
     }
   },
   "DatabaseConfiguration": {
-    "ApplyDbMigrations": false,
+    "ApplyDbMigrations": true,
     "ApplySeed": false
   },
   "MqConfiguration": {

+ 8 - 7
src/Hotline.Application/FlowEngine/WorkflowApplication.cs

@@ -22,6 +22,7 @@ using XF.Domain.Authentications;
 using XF.Domain.Dependency;
 using XF.Domain.Entities;
 using XF.Domain.Exceptions;
+using XF.Domain.Repository;
 
 namespace Hotline.Application.FlowEngine;
 
@@ -31,11 +32,11 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
     private readonly IWorkflowDomainService _workflowDomainService;
     private readonly IOrderDomainService _orderDomainService;
     private readonly IWorkflowRepository _workflowRepository;
-    private readonly IWorkflowAssignRepository _workflowAssignRepository;
-    private readonly IUserRepository _userRepository;
+    private readonly IRepository<WorkflowAssign> _workflowAssignRepository;
+    private readonly IRepository<User> _userRepository;
     private readonly IAccountRepository _accountRepository;
     private readonly ISystemOrganizeRepository _organizeRepository;
-    private readonly IRoleRepository _roleRepository;
+    private readonly IRepository<Role> _roleRepository;
     private readonly IWfModuleCacheManager _wfModuleCacheManager;
     private readonly ISystemDomainService _systemDomainService;
     private readonly IUserDomainService _userDomainService;
@@ -48,11 +49,11 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
         IWorkflowDomainService workflowDomainService,
         IOrderDomainService orderDomainService,
         IWorkflowRepository workflowRepository,
-        IWorkflowAssignRepository workflowAssignRepository,
-        IUserRepository userRepository,
+        IRepository<WorkflowAssign> workflowAssignRepository,
+        IRepository<User> userRepository,
         IAccountRepository accountRepository,
         ISystemOrganizeRepository organizeRepository,
-        IRoleRepository roleRepository,
+        IRepository<Role> roleRepository,
         IWfModuleCacheManager wfModuleCacheManager,
         ISystemDomainService systemDomainService,
         ISessionContext sessionContext,
@@ -143,7 +144,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
     public async Task RecallAsync(RecallDto dto, CancellationToken cancellationToken)
     {
         var workflow = await _workflowDomainService.GetWorkflowAsync(dto.WorkflowId, true, true, cancellationToken: cancellationToken);
-        
+
         await _orderDomainService.ReadyToRecallAsync(workflow.ExternalId, cancellationToken);
 
         var targetStepDefine = _workflowDomainService.GetStepBoxDefine(workflow.Definition, dto.NextStepCode);

+ 3 - 2
src/Hotline.Application/Identity/IdentityAppService.cs

@@ -10,6 +10,7 @@ using XF.Domain.Authentications;
 using XF.Domain.Dependency;
 using XF.Domain.Exceptions;
 using XF.Domain.Options;
+using XF.Domain.Repository;
 
 namespace Hotline.Application.Identity;
 
@@ -17,14 +18,14 @@ public class IdentityAppService : IIdentityAppService, IScopeDependency
 {
     private readonly IAccountRepository _accountRepository;
     private readonly IAccountDomainService _accountDomainService;
-    private readonly IUserRepository _userRepository;
+    private readonly IRepository<User> _userRepository;
     private readonly IJwtSecurity _jwtSecurity;
     private readonly IOptionsSnapshot<IdentityConfiguration> _identityOptionsAccessor;
 
     public IdentityAppService(
         IAccountRepository accountRepository,
         IAccountDomainService accountDomainService,
-        IUserRepository userRepository,
+        IRepository<User> userRepository,
         IJwtSecurity jwtSecurity,
         IOptionsSnapshot<IdentityConfiguration> identityOptionsAccessor)
     {

+ 3 - 2
src/Hotline.Application/Roles/RoleAppService.cs

@@ -2,16 +2,17 @@
 using Hotline.Share.Dtos.Roles;
 using MapsterMapper;
 using XF.Domain.Dependency;
+using XF.Domain.Repository;
 
 namespace Hotline.Application.Roles;
 
 public class RoleAppService : IRoleAppService, IScopeDependency
 {
-    private readonly IRoleRepository _roleRepository;
+    private readonly IRepository<Role> _roleRepository;
     private readonly IMapper _mapper;
 
     public RoleAppService(
-        IRoleRepository roleRepository,
+        IRepository<Role> roleRepository,
         IMapper mapper)
     {
         _roleRepository = roleRepository;

+ 101 - 0
src/Hotline.Repository.SqlSugar/BaseRepositoryTextSearch.cs

@@ -0,0 +1,101 @@
+using System.Text;
+using Hotline.Repository.SqlSugar.TextSearch;
+using NpgsqlTypes;
+using SqlSugar;
+using XF.Domain.Dependency;
+using XF.Domain.Entities;
+using XF.Domain.Extensions;
+
+namespace Hotline.Repository.SqlSugar;
+
+public abstract class BaseRepositoryTextSearch<TEntity> : IRepositoryTextSearch<TEntity>, IScopeDependency
+    where TEntity : class, IEntity<string>, ITextSearch, new()
+{
+    private readonly ISugarUnitOfWork<HotlineDbContext> _uow;
+    private readonly ISqlSugarClient _db;
+
+    public BaseRepositoryTextSearch(ISugarUnitOfWork<HotlineDbContext> uow)
+    {
+        _uow = uow;
+        _db = uow.Db;
+    }
+
+    /// <summary>
+    /// 全都采用默认权重
+    /// </summary>
+    /// <param name="id">原始数据Id</param>
+    /// <param name="creationTime">原始数据CreationTime</param>
+    /// <param name="texts"></param>
+    /// <param name="cancellationToken"></param>
+    /// <returns></returns>
+    public Task AddVectorAsync(string id, DateTime creationTime, ICollection<string> texts, CancellationToken cancellationToken)
+    {
+        var weights = texts.Select(d => new NpgsqlWeight
+        {
+            Text = d
+        }).ToList();
+        return AddVectorAsync(id, creationTime, weights, cancellationToken);
+    }
+
+    /// <summary>
+    /// 自定义权重
+    /// </summary>
+    /// <param name="id">原始数据Id</param>
+    /// <param name="creationTime">原始数据CreationTime</param>
+    /// <param name="cancellationToken"></param>
+    /// <returns></returns>
+    public async Task AddVectorAsync(string id, DateTime creationTime, ICollection<NpgsqlWeight> weights, CancellationToken cancellationToken)
+    {
+        var tableName = typeof(TEntity).Name.ToSnakeCase();
+        var vectorSql = CreateVectorSql(weights);
+        var sql = $"INSERT INTO @tableName VALUES ('@id', '@creationTime', @vector)";
+        await _db.Ado.ExecuteCommandAsync(sql, new { tableName, id, creationTime, vector = vectorSql }, cancellationToken);
+        /*
+         INSERT INTO "order_ts" VALUES ('f595e730-909a-45e4-9138-a84bf15f4660', '2023-09-06 10:51:38', setweight(to_tsvector('simple', 'aa'), 'C') || setweight(to_tsvector('simple', 'bb'), 'C'))
+         */
+
+    }
+
+    /// <summary>
+    /// 全都采用默认权重
+    /// </summary>
+    public Task UpdateVectorAsync(string id, ICollection<string> texts, CancellationToken cancellationToken)
+    {
+        var weights = texts.Select(d => new NpgsqlWeight
+        {
+            Text = d
+        }).ToList();
+        return UpdateVectorAsync(id, weights, cancellationToken);
+    }
+
+    /// <summary>
+    /// 自定义权重
+    /// </summary>
+    public async Task UpdateVectorAsync(string id, ICollection<NpgsqlWeight> weights, CancellationToken cancellationToken)
+    {
+        var tableName = typeof(TEntity).Name.ToSnakeCase();
+        var vectorSql = CreateVectorSql(weights);
+        var sql = $"UPDATE @tableName SET \"Vector\"=@vector WHERE id=@id ";
+        await _db.Ado.ExecuteCommandAsync(sql, new { tableName, id, vector = vectorSql }, cancellationToken);
+    }
+
+    public async Task<List<RankedResult<TEntity>>> SearchAsync(IReadOnlyList<string> texts, CancellationToken cancellationToken)
+    {
+        var tableName = typeof(TEntity).Name.ToSnakeCase();
+        var tsquery = string.Join(' ', texts);
+        var sql = "SELECT Id, CreationTime, Vector, Texts, ts_rank(\"Vector\", query) AS score FROM @tableName to_tsquery('simple', @tsquery) query WHERE \"Vector\" @@ query ORDER BY score DESC)";
+        return await _db.Ado.SqlQueryAsync<RankedResult<TEntity>>(sql, new { tableName, tsquery }, cancellationToken);
+    }
+
+
+    #region private method
+
+    private static string CreateVectorSql(ICollection<NpgsqlWeight> weights)
+    {
+        var setweghtStrings = weights.Select(d => $"setweight(to_tsvector('simple', {d.Text}), '{d.Weight}')");
+        var vectorString = string.Join(" || ", setweghtStrings);
+        return vectorString;
+    }
+
+    #endregion
+}

+ 0 - 20
src/Hotline.Repository.SqlSugar/FlowEngine/DefinitionRepository.cs

@@ -1,20 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-using Hotline.FlowEngine.Definitions;
-using Hotline.Repository.SqlSugar.DataPermissions;
-using Hotline.Share.Requests;
-using SqlSugar;
-using XF.Domain.Dependency;
-
-namespace Hotline.Repository.SqlSugar.FlowEngine
-{
-    public class DefinitionRepository : BaseRepository<Definition>, IDefinitionRepository, IScopeDependency
-    {
-        public DefinitionRepository(ISugarUnitOfWork<HotlineDbContext> uow, IDataPermissionFilterBuilder dataPermissionFilterBuilder) : base(uow, dataPermissionFilterBuilder)
-        {
-        }
-    }
-}

+ 0 - 20
src/Hotline.Repository.SqlSugar/FlowEngine/WfModuleRepository.cs

@@ -1,20 +0,0 @@
-using Hotline.FlowEngine.Definitions;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-using Hotline.FlowEngine.WfModules;
-using Hotline.Repository.SqlSugar.DataPermissions;
-using SqlSugar;
-using XF.Domain.Dependency;
-
-namespace Hotline.Repository.SqlSugar.FlowEngine
-{
-    public class WfModuleRepository : BaseRepository<WorkflowModule>, IWfModuleRepository, IScopeDependency
-    {
-        public WfModuleRepository(ISugarUnitOfWork<HotlineDbContext> uow, IDataPermissionFilterBuilder dataPermissionFilterBuilder) : base(uow, dataPermissionFilterBuilder)
-        {
-        }
-    }
-}

+ 0 - 13
src/Hotline.Repository.SqlSugar/FlowEngine/WorkflowAssignRepository.cs

@@ -1,13 +0,0 @@
-using Hotline.FlowEngine.Workflows;
-using Hotline.Repository.SqlSugar.DataPermissions;
-using SqlSugar;
-using XF.Domain.Dependency;
-
-namespace Hotline.Repository.SqlSugar.FlowEngine;
-
-public class WorkflowAssignRepository : BaseRepository<WorkflowAssign>, IWorkflowAssignRepository, IScopeDependency
-{
-    public WorkflowAssignRepository(ISugarUnitOfWork<HotlineDbContext> uow, IDataPermissionFilterBuilder dataPermissionFilterBuilder) : base(uow, dataPermissionFilterBuilder)
-    {
-    }
-}

+ 0 - 13
src/Hotline.Repository.SqlSugar/FlowEngine/WorkflowCountersignRepository.cs

@@ -1,13 +0,0 @@
-using Hotline.FlowEngine.Workflows;
-using Hotline.Repository.SqlSugar.DataPermissions;
-using SqlSugar;
-using XF.Domain.Dependency;
-
-namespace Hotline.Repository.SqlSugar.FlowEngine;
-
-public class WorkflowCountersignRepository : BaseRepository<WorkflowCountersign>, IWorkflowCountersignRepository, IScopeDependency
-{
-    public WorkflowCountersignRepository(ISugarUnitOfWork<HotlineDbContext> uow, IDataPermissionFilterBuilder dataPermissionFilterBuilder) : base(uow, dataPermissionFilterBuilder)
-    {
-    }
-}

+ 0 - 13
src/Hotline.Repository.SqlSugar/FlowEngine/WorkflowStepRepository.cs

@@ -1,13 +0,0 @@
-using Hotline.FlowEngine.Workflows;
-using Hotline.Repository.SqlSugar.DataPermissions;
-using SqlSugar;
-using XF.Domain.Dependency;
-
-namespace Hotline.Repository.SqlSugar.FlowEngine;
-
-public class WorkflowStepRepository : BaseRepository<WorkflowStep>, IWorkflowStepRepository, IScopeDependency
-{
-    public WorkflowStepRepository(ISugarUnitOfWork<HotlineDbContext> uow, IDataPermissionFilterBuilder dataPermissionFilterBuilder) : base(uow, dataPermissionFilterBuilder)
-    {
-    }
-}

+ 0 - 13
src/Hotline.Repository.SqlSugar/FlowEngine/WorkflowSupplementRepository.cs

@@ -1,13 +0,0 @@
-using Hotline.FlowEngine.Workflows;
-using Hotline.Repository.SqlSugar.DataPermissions;
-using SqlSugar;
-using XF.Domain.Dependency;
-
-namespace Hotline.Repository.SqlSugar.FlowEngine;
-
-public class WorkflowSupplementRepository : BaseRepository<WorkflowSupplement>, IWorkflowSupplementRepository, IScopeDependency
-{
-    public WorkflowSupplementRepository(ISugarUnitOfWork<HotlineDbContext> uow, IDataPermissionFilterBuilder dataPermissionFilterBuilder) : base(uow, dataPermissionFilterBuilder)
-    {
-    }
-}

+ 0 - 13
src/Hotline.Repository.SqlSugar/FlowEngine/WorkflowTraceRepository.cs

@@ -1,13 +0,0 @@
-using Hotline.FlowEngine.Workflows;
-using Hotline.Repository.SqlSugar.DataPermissions;
-using SqlSugar;
-using XF.Domain.Dependency;
-
-namespace Hotline.Repository.SqlSugar.FlowEngine;
-
-public class WorkflowTraceRepository : BaseRepository<WorkflowTrace>, IWorkflowTraceRepository, IScopeDependency
-{
-    public WorkflowTraceRepository(ISugarUnitOfWork<HotlineDbContext> uow, IDataPermissionFilterBuilder dataPermissionFilterBuilder) : base(uow, dataPermissionFilterBuilder)
-    {
-    }
-}

+ 0 - 19
src/Hotline.Repository.SqlSugar/Identity/RoleRepository.cs

@@ -1,19 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-using Hotline.Identity.Roles;
-using Hotline.Repository.SqlSugar.DataPermissions;
-using SqlSugar;
-using XF.Domain.Dependency;
-
-namespace Hotline.Repository.SqlSugar.Identity
-{
-    public class RoleRepository : BaseRepository<Role>, IRoleRepository, IScopeDependency
-    {
-        public RoleRepository(ISugarUnitOfWork<HotlineDbContext> uow, IDataPermissionFilterBuilder dataPermissionFilterBuilder) : base(uow, dataPermissionFilterBuilder)
-        {
-        }
-    }
-}

+ 72 - 0
src/Hotline.Repository.SqlSugar/TextSearch/IRepositoryTextSearch.cs

@@ -0,0 +1,72 @@
+using NpgsqlTypes;
+using XF.Domain.Entities;
+
+namespace Hotline.Repository.SqlSugar.TextSearch;
+
+public interface IRepositoryTextSearch<TEntity>
+    where TEntity : class, IEntity<string>, ITextSearch, new()
+{
+    /// <summary>
+    /// 全都采用默认权重
+    /// </summary>
+    /// <param name="id">原始数据Id</param>
+    /// <param name="creationTime">原始数据CreationTime</param>
+    /// <param name="texts"></param>
+    /// <param name="cancellationToken"></param>
+    /// <returns></returns>
+    Task AddVectorAsync(string id, DateTime creationTime, ICollection<string> texts, CancellationToken cancellationToken);
+
+    /// <summary>
+    /// 自定义权重
+    /// </summary>
+    /// <param name="id">原始数据Id</param>
+    /// <param name="creationTime">原始数据CreationTime</param>
+    /// <param name="cancellationToken"></param>
+    /// <returns></returns>
+    Task AddVectorAsync(string id, DateTime creationTime, ICollection<NpgsqlWeight> weights, CancellationToken cancellationToken);
+
+    /// <summary>
+    /// 全都采用默认权重
+    /// </summary>
+    Task UpdateVectorAsync(string id, ICollection<string> texts, CancellationToken cancellationToken);
+
+    /// <summary>
+    /// 自定义权重
+    /// </summary>
+    Task UpdateVectorAsync(string id, ICollection<NpgsqlWeight> weights, CancellationToken cancellationToken);
+
+    Task<List<RankedResult<TEntity>>> SearchAsync(IReadOnlyList<string> texts, CancellationToken cancellationToken);
+}
+
+public class RankedResult<TEntity>
+{
+    public double Score { get; set; }
+
+    public TEntity Entity { get; set; }
+}
+
+public class NpgsqlWeight
+{
+    public string Text { get; set; }
+
+    public string Weight { get; set; } = NpgsqlLexemeWeight.C;
+}
+
+public sealed class NpgsqlLexemeWeight
+{
+    public const string A = "A";
+    public const string B = "B";
+    public const string C = "C";
+    public const string D = "D";
+    public const string E = "E";
+
+    public static IReadOnlyList<KeyValuePair<string, string>> All() =>
+        new List<KeyValuePair<string, string>>
+        {
+            new(A,"最高优先级"),
+            new(B,"较高优先级"),
+            new(C,"默认优先级"),
+            new(D,"较低优先级"),
+            new(E,"最低优先级"),
+        };
+}

+ 0 - 13
src/Hotline.Repository.SqlSugar/Users/UserRepository.cs

@@ -1,13 +0,0 @@
-using Hotline.Repository.SqlSugar.DataPermissions;
-using Hotline.Users;
-using SqlSugar;
-using XF.Domain.Dependency;
-
-namespace Hotline.Repository.SqlSugar.Users;
-
-public class UserRepository : BaseRepository<User>, IUserRepository, IScopeDependency
-{
-    public UserRepository(ISugarUnitOfWork<HotlineDbContext> uow, IDataPermissionFilterBuilder dataPermissionFilterBuilder) : base(uow, dataPermissionFilterBuilder)
-    {
-    }
-}

+ 3 - 2
src/Hotline/Caching/Services/WfModuleCacheManager.cs

@@ -8,15 +8,16 @@ using Hotline.FlowEngine.WfModules;
 using XF.Domain.Cache;
 using XF.Domain.Dependency;
 using XF.Domain.Exceptions;
+using XF.Domain.Repository;
 
 namespace Hotline.Caching.Services
 {
     public class WfModuleCacheManager : IWfModuleCacheManager, IScopeDependency
     {
         private readonly ITypedCache<WorkflowModule> _cacheWfModule;
-        private readonly IWfModuleRepository _wfModuleRepository;
+        private readonly IRepository<WorkflowModule> _wfModuleRepository;
 
-        public WfModuleCacheManager(ITypedCache<WorkflowModule> cacheWfModule, IWfModuleRepository wfModuleRepository)
+        public WfModuleCacheManager(ITypedCache<WorkflowModule> cacheWfModule, IRepository<WorkflowModule> wfModuleRepository)
         {
             _cacheWfModule = cacheWfModule;
             _wfModuleRepository = wfModuleRepository;

+ 3 - 2
src/Hotline/FlowEngine/Definitions/DefinitionDomainService.cs

@@ -3,15 +3,16 @@ using Hotline.Share.Enums.FlowEngine;
 using MapsterMapper;
 using XF.Domain.Dependency;
 using XF.Domain.Exceptions;
+using XF.Domain.Repository;
 
 namespace Hotline.FlowEngine.Definitions;
 
 public class DefinitionDomainService : IDefinitionDomainService, IScopeDependency
 {
-    private readonly IDefinitionRepository _definitionRepository;
+    private readonly IRepository<Definition> _definitionRepository;
     private readonly IMapper _mapper;
 
-    public DefinitionDomainService(IDefinitionRepository definitionRepository, IMapper mapper)
+    public DefinitionDomainService(IRepository<Definition> definitionRepository, IMapper mapper)
     {
         _definitionRepository = definitionRepository;
         _mapper = mapper;

+ 0 - 9
src/Hotline/FlowEngine/Definitions/IDefintionRepository.cs

@@ -1,9 +0,0 @@
-using Hotline.Share.Requests;
-using XF.Domain.Repository;
-
-namespace Hotline.FlowEngine.Definitions
-{
-    public interface IDefinitionRepository : IRepository<Definition>
-    {
-    }
-}

+ 0 - 14
src/Hotline/FlowEngine/WfModules/IWfModuleRepository.cs

@@ -1,14 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-using XF.Domain.Repository;
-
-namespace Hotline.FlowEngine.WfModules
-{
-    public interface IWfModuleRepository : IRepository<WorkflowModule>
-    {
-
-    }
-}

+ 3 - 2
src/Hotline/FlowEngine/WfModules/WfModuleDomainService.cs

@@ -9,16 +9,17 @@ using Hotline.Share.Dtos.FlowEngine;
 using MapsterMapper;
 using XF.Domain.Dependency;
 using XF.Domain.Exceptions;
+using XF.Domain.Repository;
 
 namespace Hotline.FlowEngine.WfModules
 {
     public class WfModuleDomainService : IWfModuleDomainService, IScopeDependency
     {
-        private readonly IWfModuleRepository _repository;
+        private readonly IRepository<WorkflowModule> _repository;
         private readonly IWfModuleCacheManager _cacheManager;
 
         public WfModuleDomainService(
-            IWfModuleRepository repository,
+            IRepository<WorkflowModule> repository,
             IWfModuleCacheManager cacheManager)
         {
             _repository = repository;

+ 0 - 8
src/Hotline/FlowEngine/Workflows/IWorkflowAssignRepository.cs

@@ -1,8 +0,0 @@
-using XF.Domain.Repository;
-
-namespace Hotline.FlowEngine.Workflows;
-
-public interface IWorkflowAssignRepository : IRepository<WorkflowAssign>
-{
-
-}

+ 0 - 13
src/Hotline/FlowEngine/Workflows/IWorkflowCountersignRepository.cs

@@ -1,13 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-using XF.Domain.Repository;
-
-namespace Hotline.FlowEngine.Workflows
-{
-    public interface IWorkflowCountersignRepository : IRepository<WorkflowCountersign>
-    {
-    }
-}

+ 0 - 8
src/Hotline/FlowEngine/Workflows/IWorkflowStepRepository.cs

@@ -1,8 +0,0 @@
-using XF.Domain.Repository;
-
-namespace Hotline.FlowEngine.Workflows;
-
-public interface IWorkflowStepRepository : IRepository<WorkflowStep>
-{
-
-}

+ 0 - 8
src/Hotline/FlowEngine/Workflows/IWorkflowSupplementRepository.cs

@@ -1,8 +0,0 @@
-using XF.Domain.Repository;
-
-namespace Hotline.FlowEngine.Workflows;
-
-public interface IWorkflowSupplementRepository : IRepository<WorkflowSupplement>
-{
-
-}

+ 0 - 8
src/Hotline/FlowEngine/Workflows/IWorkflowTraceRepository.cs

@@ -1,8 +0,0 @@
-using XF.Domain.Repository;
-
-namespace Hotline.FlowEngine.Workflows;
-
-public interface IWorkflowTraceRepository : IRepository<WorkflowTrace>
-{
-
-}

+ 11 - 10
src/Hotline/FlowEngine/Workflows/WorkflowDomainService.cs

@@ -11,17 +11,18 @@ using Microsoft.Extensions.Logging;
 using XF.Domain.Authentications;
 using XF.Domain.Dependency;
 using XF.Domain.Exceptions;
+using XF.Domain.Repository;
 
 namespace Hotline.FlowEngine.Workflows
 {
     public class WorkflowDomainService : IWorkflowDomainService, IScopeDependency
     {
         private readonly IWorkflowRepository _workflowRepository;
-        private readonly IWorkflowStepRepository _workflowStepRepository;
-        private readonly IWorkflowTraceRepository _workflowTraceRepository;
-        private readonly IWorkflowSupplementRepository _workflowSupplementRepository;
-        private readonly IWorkflowAssignRepository _workflowAssignRepository;
-        private readonly IWorkflowCountersignRepository _workflowCountersignRepository;
+        private readonly IRepository<WorkflowStep> _workflowStepRepository;
+        private readonly IRepository<WorkflowTrace> _workflowTraceRepository;
+        private readonly IRepository<WorkflowAssign> _workflowAssignRepository;
+        private readonly IRepository<WorkflowSupplement> _workflowSupplementRepository;
+        private readonly IRepository<WorkflowCountersign> _workflowCountersignRepository;
         private readonly ISessionContext _sessionContext;
         private readonly IMapper _mapper;
         private readonly IMediator _mediator;
@@ -29,11 +30,11 @@ namespace Hotline.FlowEngine.Workflows
 
         public WorkflowDomainService(
             IWorkflowRepository workflowRepository,
-            IWorkflowStepRepository workflowStepRepository,
-            IWorkflowTraceRepository workflowTraceRepository,
-            IWorkflowAssignRepository workflowAssignRepository,
-            IWorkflowSupplementRepository workflowSupplementRepository,
-            IWorkflowCountersignRepository workflowCountersignRepository,
+            IRepository<WorkflowStep> workflowStepRepository,
+            IRepository<WorkflowTrace> workflowTraceRepository,
+            IRepository<WorkflowAssign> workflowAssignRepository,
+            IRepository<WorkflowSupplement> workflowSupplementRepository,
+            IRepository<WorkflowCountersign> workflowCountersignRepository,
             ISessionContext sessionContext,
             IMapper mapper,
             IMediator mediator,

+ 22 - 0
src/Hotline/Orders/OrderTs.cs

@@ -0,0 +1,22 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using NpgsqlTypes;
+using SqlSugar;
+using XF.Domain.Entities;
+using XF.Domain.Repository;
+
+namespace Hotline.Orders
+{
+    public class OrderTs : ITable
+    {
+        public string Id { get; set; }
+
+        public DateTime CreationTime { get; set; }
+
+        [SugarColumn(ColumnDataType = "tsvector")]
+        public NpgsqlTsVector Vector { get; set; }
+    }
+}

+ 0 - 8
src/Hotline/Users/IUserRepository.cs

@@ -1,8 +0,0 @@
-using XF.Domain.Repository;
-
-namespace Hotline.Users
-{
-    public interface IUserRepository : IRepository<User>
-    {
-    }
-}

+ 3 - 2
src/Hotline/Users/UserDomainService.cs

@@ -7,12 +7,13 @@ using MapsterMapper;
 using XF.Domain.Cache;
 using XF.Domain.Dependency;
 using XF.Domain.Exceptions;
+using XF.Domain.Repository;
 
 namespace Hotline.Users
 {
     public class UserDomainService : IUserDomainService, IScopeDependency
     {
-        private readonly IUserRepository _userRepository;
+        private readonly IRepository<User> _userRepository;
         private readonly IWorkRepository _workRepository;
         private readonly IDeviceManager _deviceManager;
         private readonly IUserCacheManager _userCacheManager;
@@ -21,7 +22,7 @@ namespace Hotline.Users
         private readonly IMapper _mapper;
 
         public UserDomainService(
-            IUserRepository userRepository,
+            IRepository<User> userRepository,
             IWorkRepository workRepository,
             IDeviceManager deviceManager,
             ITypedCache<Work> cacheWork,

+ 4 - 3
src/Hotline/Identity/Roles/IRoleRepository.cs → src/XF.Domain/Entities/ITextSearch.cs

@@ -3,11 +3,12 @@ using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
-using XF.Domain.Repository;
 
-namespace Hotline.Identity.Roles
+namespace XF.Domain.Entities
 {
-    public interface IRoleRepository : IRepository<Role>
+    public interface ITextSearch
     {
+        string Texts { get; }
+        string Vector { get; }
     }
 }