Sfoglia il codice sorgente

Merge branch 'master' of http://git.fwt.com/Hotline/hotline

Dun.Jason 2 anni fa
parent
commit
8b7d705096
36 ha cambiato i file con 244 aggiunte e 85 eliminazioni
  1. 8 8
      src/Hotline.Api/Controllers/CallController.cs
  2. 1 1
      src/Hotline.Api/Controllers/RoleController.cs
  3. 3 2
      src/Hotline.Api/Controllers/UserController.cs
  4. 2 2
      src/Hotline.Application/Handlers/CallCenter/BaseHandler.cs
  5. 1 1
      src/Hotline.Application/Hotline.Application.csproj
  6. 33 9
      src/Hotline.Repository.SqlSugar/BaseRepository.cs
  7. 2 1
      src/Hotline.Repository.SqlSugar/CallCenter/BlacklistRepository.cs
  8. 2 1
      src/Hotline.Repository.SqlSugar/CallCenter/CallDetailRepository.cs
  9. 2 1
      src/Hotline.Repository.SqlSugar/CallCenter/CallRecordRepository.cs
  10. 3 4
      src/Hotline.Repository.SqlSugar/CallCenter/CallRepository.cs
  11. 2 1
      src/Hotline.Repository.SqlSugar/CallCenter/IvrCategoryRepository.cs
  12. 2 1
      src/Hotline.Repository.SqlSugar/CallCenter/IvrRepository.cs
  13. 2 1
      src/Hotline.Repository.SqlSugar/CallCenter/TelGroupRepository.cs
  14. 2 1
      src/Hotline.Repository.SqlSugar/CallCenter/TelRepository.cs
  15. 2 1
      src/Hotline.Repository.SqlSugar/CallCenter/TelRestRepository.cs
  16. 3 2
      src/Hotline.Repository.SqlSugar/CallCenter/WorkRepository.cs
  17. 33 0
      src/Hotline.Repository.SqlSugar/DataPermissions/DataPermissionFilterBuilder.cs
  18. 34 0
      src/Hotline.Repository.SqlSugar/DataPermissions/DataPermissionManager.cs
  19. 3 0
      src/Hotline.Repository.SqlSugar/DataPermissions/DataPermissionScheme.cs
  20. 10 0
      src/Hotline.Repository.SqlSugar/DataPermissions/IDataPermissionFilterBuilder.cs
  21. 9 0
      src/Hotline.Repository.SqlSugar/DataPermissions/IDataPermissionManager.cs
  22. 15 0
      src/Hotline.Repository.SqlSugar/QueryExtensions.cs
  23. 8 8
      src/Hotline.Repository.SqlSugar/SqlSugarStartupExtensions.cs
  24. 3 2
      src/Hotline.Repository.SqlSugar/System/SystemAuthorityRepository.cs
  25. 3 2
      src/Hotline.Repository.SqlSugar/System/SystemButtonRepository.cs
  26. 3 2
      src/Hotline.Repository.SqlSugar/System/SystemDataAuthorityRepository.cs
  27. 3 2
      src/Hotline.Repository.SqlSugar/System/SystemMenuRepository.cs
  28. 3 2
      src/Hotline.Repository.SqlSugar/System/SystemOrganizeRepository.cs
  29. 3 2
      src/Hotline.Repository.SqlSugar/System/SystemSettingGroupRepository.cs
  30. 3 2
      src/Hotline.Repository.SqlSugar/System/SystemSettingRepository.cs
  31. 2 1
      src/Hotline.Repository.SqlSugar/User/OrgUserRepository.cs
  32. 3 2
      src/Hotline.Repository.SqlSugar/User/UserFastMenuRepository.cs
  33. 3 2
      src/Hotline.Repository.SqlSugar/User/UserRepository.cs
  34. 23 16
      src/XF.Domain.Repository/Entity.cs
  35. 9 4
      src/XF.Domain.Repository/IRepositorySqlSugar.cs
  36. 1 1
      src/XF.Domain/Entities/IDataPermission.cs

+ 8 - 8
src/Hotline.Api/Controllers/CallController.cs

@@ -27,8 +27,8 @@ namespace Hotline.Api.Controllers
         /// <param name="blacklistDomainService"></param>
         /// <param name="blacklistRepository"></param>
         public CallController(
-            ICallRepository callRepository, 
-            IMapper mapper, 
+            ICallRepository callRepository,
+            IMapper mapper,
             IBlacklistDomainService blacklistDomainService,
             IBlacklistRepository blacklistRepository)
         {
@@ -48,14 +48,14 @@ namespace Hotline.Api.Controllers
         /// <returns></returns>
         [Permission(EPermission.GetCallList)]
         [HttpGet("paged")]
-        public async Task<PagedDto<CallDto>> GetCallList([FromQuery]GetCallListRequest request)
+        public async Task<PagedDto<CallDto>> GetCallList([FromQuery] GetCallListRequest request)
         {
             var (total, items) = await _callRepository.QueryPagedAsync(
-                x=> true,
+                x => true,
                 x => x.OrderByDescending(d => d.CreationTime),
                 request.PageIndex,
                 request.PageSize,
-                (!string.IsNullOrEmpty(request.PhoneNum), d => d.FromNo.Contains(request.PhoneNum!))
+                whereIfs: (!string.IsNullOrEmpty(request.PhoneNum), d => d.FromNo.Contains(request.PhoneNum!))
             );
             return new PagedDto<CallDto>(total, _mapper.Map<IReadOnlyList<CallDto>>(items));
         }
@@ -80,7 +80,7 @@ namespace Hotline.Api.Controllers
                 outCallDto.CallId = item.Id;
                 outCallDto.InfoType = Share.Enums.EInfoType.Call;//TODO目前写死(只有电话)
                 outCallDto.Direction = item.CallDirection;
-                outCallDto.Cpn = item.FromNo??"";
+                outCallDto.Cpn = item.FromNo ?? "";
                 outCallDto.Cdpn = item.ToNo ?? "";
                 outCallDto.Answered = item.CallDetails?.FirstOrDefault(x => x.EventName == "ANSWERED")?.AnswerNo ?? "";
                 outCallDto.BeginTime = item.CreationTime;
@@ -90,7 +90,7 @@ namespace Hotline.Api.Controllers
                 outCallDto.SoundFileName = item.CallDetails?.FirstOrDefault(x => x.EventName == "BYE")?.Recording ?? "";
                 outCallDto.EvaluateResult = "";
                 outCallDto.EndBy = item.EndBy;
-                outCallDto.OnState = item.CallDetails?.Any(x => x.EventName == "ANSWERED")==true? EOnState.On : EOnState.NoOn;
+                outCallDto.OnState = item.CallDetails?.Any(x => x.EventName == "ANSWERED") == true ? EOnState.On : EOnState.NoOn;
                 outCallList.Add(outCallDto);
             }
             return outCallList;
@@ -140,7 +140,7 @@ namespace Hotline.Api.Controllers
                 d => d.OrderByDescending(x => x.CreationTime),
                 dto.PageIndex,
                 dto.PageSize,
-                (!string.IsNullOrEmpty(dto.PhoneNo), d => d.PhoneNo.Contains(dto.PhoneNo!)));
+                whereIfs: (!string.IsNullOrEmpty(dto.PhoneNo), d => d.PhoneNo.Contains(dto.PhoneNo!)));
             return new PagedDto<Blacklist>(total, items);
         }
 

+ 1 - 1
src/Hotline.Api/Controllers/RoleController.cs

@@ -89,7 +89,7 @@ public class RoleController : BaseController
     /// <returns></returns>
     [Permission(EPermission.UpdateRole)]
     [HttpPut]
-    public async Task Update([FromBody] IdentityRoleDto dto)
+    public async Task Update([FromBody] UpdateRoleDto dto)
     {
         var updateRoleRsp = await _identityClient.UpdateRoleAsync(dto, HttpContext.RequestAborted);
         CheckHttpRequestSuccess(updateRoleRsp, "UpdateRoleAsync");

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

@@ -107,6 +107,7 @@ public class UserController : BaseController
             d => d.OrderByDescending(x => x.CreationTime),
             dto.PageIndex,
             dto.PageSize,
+            false,
             (!string.IsNullOrEmpty(dto.PhoneNo), d => d.PhoneNo.Contains(dto.PhoneNo!)),
             (!string.IsNullOrEmpty(dto.DisplayName), d => !string.IsNullOrEmpty(d.Name) && d.Name.Contains(dto.DisplayName!)));
         return new PagedDto<UserDto>(total, _mapper.Map<IReadOnlyList<UserDto>>(items));
@@ -163,7 +164,7 @@ public class UserController : BaseController
     /// <returns></returns>
     [Permission(EPermission.AddUser)]
     [HttpPost]
-    public async Task<string> Add([FromBody]AddUserDto userDto)
+    public async Task<string> Add([FromBody] AddUserDto userDto)
     {
         var getAccountRsp = await _identityClient.GetUserAsync(userDto.UserName, HttpContext.RequestAborted);
         CheckHttpRequestSuccess(getAccountRsp, "GetUserAsync");
@@ -188,7 +189,7 @@ public class UserController : BaseController
             //如果有组织架构就新增一条数据
             if (!string.IsNullOrEmpty(userDto.OrgId) && !string.IsNullOrEmpty(userDto.OrgCode))
             {
-                await _orgUserRepository.AddAsync(new OrgUser() { OrgId = userDto.OrgId,OrgCode = userDto.OrgCode,UserId = userid });
+                await _orgUserRepository.AddAsync(new OrgUser() { OrgId = userDto.OrgId, OrgCode = userDto.OrgCode, UserId = userid });
             }
             return userid;
         }

+ 2 - 2
src/Hotline.Application/Handlers/BaseHandler.cs → src/Hotline.Application/Handlers/CallCenter/BaseHandler.cs

@@ -8,7 +8,7 @@ using NewRock.Sdk.Control.Request;
 using NewRock.Sdk.Transfer.Connect.Request;
 using NewRock.Sdk.Transfer.Queue.Request;
 
-namespace Hotline.Application.Handlers
+namespace Hotline.Application.Handlers.CallCenter
 {
     public class BaseHandler
     {
@@ -20,7 +20,7 @@ namespace Hotline.Application.Handlers
             _options = options;
         }
 
-        public async Task HandlerIvr(IvrAnswer? runResult,Call model,CancellationToken cancellationToken)
+        public async Task HandlerIvr(IvrAnswer? runResult, Call model, CancellationToken cancellationToken)
         {
             if (runResult != null)
             {

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

@@ -7,7 +7,7 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="Identity.Admin.HttpClient" Version="1.0.18" />
+    <PackageReference Include="Identity.Admin.HttpClient" Version="1.0.20" />
   </ItemGroup>
 
   <ItemGroup>

+ 33 - 9
src/Hotline.Repository.SqlSugar/BaseRepository.cs

@@ -1,19 +1,22 @@
 using System.Linq.Expressions;
+using Hotline.Repository.SqlSugar.DataPermissions;
 using SqlSugar;
 using XF.Domain.Entities;
 using XF.Domain.Repository;
 
 namespace Hotline.Repository.SqlSugar
 {
-    public abstract class BaseRepository<TEntity> : IRepository<TEntity> where TEntity : class, IEntity<string>, IHasCreationTime, new()
+    public abstract class BaseRepository<TEntity> : IRepository<TEntity> where TEntity : class, IEntity<string>, IHasCreationTime, IDataPermission, new()
     {
+        private readonly IDataPermissionFilterBuilder _dataPermissionFilterBuilder;
         protected ISugarUnitOfWork<HotlineDbContext> Uow { get; }
         protected ISqlSugarClient Db { get; }
 
-        public BaseRepository(ISugarUnitOfWork<HotlineDbContext> uow)
+        public BaseRepository(ISugarUnitOfWork<HotlineDbContext> uow, IDataPermissionFilterBuilder dataPermissionFilterBuilder)
         {
             Uow = uow;
             Db = uow.Db;
+            _dataPermissionFilterBuilder = dataPermissionFilterBuilder;
         }
 
         public async Task<string> AddAsync(TEntity entity, CancellationToken cancellationToken = default)
@@ -129,16 +132,21 @@ namespace Hotline.Repository.SqlSugar
         /// <param name="orderByCreator"></param>
         /// <param name="pageIndex"></param>
         /// <param name="pageSize"></param>
+        /// <param name="permissionVerify"></param>
         /// <returns></returns>
         public async Task<(int Total, List<TEntity> Items)> QueryPagedAsync(
             Expression<Func<TEntity, bool>> predicate,
             Func<ISugarQueryable<TEntity>, ISugarQueryable<TEntity>> orderByCreator,
             int pageIndex,
             int pageSize,
+            bool permissionVerify = false,
             params (bool isWhere, Expression<Func<TEntity, bool>> expression)[] whereIfs)
         {
             RefAsync<int> total = 0;
             var query = Db.Queryable<TEntity>().Where(predicate);
+            if (permissionVerify)
+                query = query.DataPermissionFiltering(_dataPermissionFilterBuilder);
+
             if (whereIfs.Any())
             {
                 foreach (var whereIf in whereIfs)
@@ -151,16 +159,20 @@ namespace Hotline.Repository.SqlSugar
         }
 
         public async Task<List<TEntity>> QueryExtAsync(
-            Expression<Func<TEntity, bool>> predicate, 
-            Func<ISugarQueryable<TEntity>, ISugarQueryable<TEntity>>? includes = null, 
+            Expression<Func<TEntity, bool>> predicate,
+            Func<ISugarQueryable<TEntity>, ISugarQueryable<TEntity>>? includes = null,
             Func<ISugarQueryable<TEntity>, ISugarQueryable<TEntity>>? orderByCreator = null,
+            bool permissionVerify = false,
             params (bool isWhere, Expression<Func<TEntity, bool>> expression)[] whereIfs)
         {
             var query = Db.Queryable<TEntity>().Where(predicate);
+            if (permissionVerify)
+                query = query.DataPermissionFiltering(_dataPermissionFilterBuilder);
+
             if (includes is not null)
                 query = includes(query);
-            
-            if(whereIfs.Any())
+
+            if (whereIfs.Any())
             {
                 foreach (var whereIf in whereIfs)
                 {
@@ -174,23 +186,35 @@ namespace Hotline.Repository.SqlSugar
             return await query.ToListAsync();
         }
 
-        public async Task<List<TEntity>> QueryExtAsync(Expression<Func<TEntity, bool>> predicate, Func<ISugarQueryable<TEntity>, ISugarQueryable<TEntity>> includes)
+        public async Task<List<TEntity>> QueryExtAsync(
+            Expression<Func<TEntity, bool>> predicate,
+            Func<ISugarQueryable<TEntity>, ISugarQueryable<TEntity>> includes,
+            bool permissionVerify = false)
         {
             var query = Db.Queryable<TEntity>().Where(predicate);
+            if (permissionVerify)
+                query = query.DataPermissionFiltering(_dataPermissionFilterBuilder);
             query = includes(query);
             return await query.ToListAsync();
         }
 
-        public async Task<TEntity> GetExtAsync(Expression<Func<TEntity, bool>> predicate, Func<ISugarQueryable<TEntity>, ISugarQueryable<TEntity>> includes)
+        public async Task<TEntity> GetExtAsync(
+            Expression<Func<TEntity, bool>> predicate,
+            Func<ISugarQueryable<TEntity>, ISugarQueryable<TEntity>> includes,
+            bool permissionVerify = false)
         {
             var query = Db.Queryable<TEntity>();
+            if (permissionVerify)
+                query = query.DataPermissionFiltering(_dataPermissionFilterBuilder);
             query = includes(query);
             return await query.FirstAsync(predicate);
         }
 
-        public async Task<TEntity> GetExtAsync(string id, Func<ISugarQueryable<TEntity>, ISugarQueryable<TEntity>> includes)
+        public async Task<TEntity> GetExtAsync(string id, Func<ISugarQueryable<TEntity>, ISugarQueryable<TEntity>> includes, bool permissionVerify = false)
         {
             var query = Db.Queryable<TEntity>();
+            if (permissionVerify)
+                query = query.DataPermissionFiltering(_dataPermissionFilterBuilder);
             query = includes(query);
             return await query.FirstAsync(d => d.Id == id);
         }

+ 2 - 1
src/Hotline.Repository.SqlSugar/CallCenter/BlacklistRepository.cs

@@ -1,4 +1,5 @@
 using Hotline.CallCenter.BlackLists;
+using Hotline.Repository.SqlSugar.DataPermissions;
 using SqlSugar;
 using XF.Domain.Dependency;
 
@@ -6,7 +7,7 @@ namespace Hotline.Repository.SqlSugar.CallCenter
 {
     public class BlacklistRepository : BaseRepository<Blacklist>, IBlacklistRepository, IScopeDependency
     {
-        public BlacklistRepository(ISugarUnitOfWork<HotlineDbContext> uow) : base(uow)
+        public BlacklistRepository(ISugarUnitOfWork<HotlineDbContext> uow, IDataPermissionFilterBuilder dataPermissionFilterBuilder) : base(uow, dataPermissionFilterBuilder)
         {
         }
     }

+ 2 - 1
src/Hotline.Repository.SqlSugar/CallCenter/CallDetailRepository.cs

@@ -1,4 +1,5 @@
 using Hotline.CallCenter.Calls;
+using Hotline.Repository.SqlSugar.DataPermissions;
 using SqlSugar;
 using XF.Domain.Dependency;
 
@@ -6,7 +7,7 @@ namespace Hotline.Repository.SqlSugar.CallCenter
 {
     public class CallDetailRepository : BaseRepository<CallDetail>, ICallDetailRepository, IScopeDependency
     {
-        public CallDetailRepository(ISugarUnitOfWork<HotlineDbContext> uow) : base(uow)
+        public CallDetailRepository(ISugarUnitOfWork<HotlineDbContext> uow, IDataPermissionFilterBuilder dataPermissionFilterBuilder) : base(uow, dataPermissionFilterBuilder)
         {
         }
     }

+ 2 - 1
src/Hotline.Repository.SqlSugar/CallCenter/CallRecordRepository.cs

@@ -1,4 +1,5 @@
 using Hotline.CallCenter.Calls;
+using Hotline.Repository.SqlSugar.DataPermissions;
 using SqlSugar;
 using XF.Domain.Dependency;
 
@@ -6,7 +7,7 @@ namespace Hotline.Repository.SqlSugar.CallCenter
 {
     public class CallRecordRepository : BaseRepository<CallRecord>, ICallRecordRepository, IScopeDependency
     {
-        public CallRecordRepository(ISugarUnitOfWork<HotlineDbContext> uow) : base(uow)
+        public CallRecordRepository(ISugarUnitOfWork<HotlineDbContext> uow, IDataPermissionFilterBuilder dataPermissionFilterBuilder) : base(uow, dataPermissionFilterBuilder)
         {
         }
     }

+ 3 - 4
src/Hotline.Repository.SqlSugar/CallCenter/CallRepository.cs

@@ -1,4 +1,5 @@
 using Hotline.CallCenter.Calls;
+using Hotline.Repository.SqlSugar.DataPermissions;
 using Hotline.Share.Enums;
 using SqlSugar;
 using XF.Domain.Dependency;
@@ -7,13 +8,13 @@ namespace Hotline.Repository.SqlSugar.CallCenter
 {
     public class CallRepository : BaseRepository<Call>, ICallRepository, IScopeDependency
     {
-        public CallRepository(ISugarUnitOfWork<HotlineDbContext> uow) : base(uow)
+        public CallRepository(ISugarUnitOfWork<HotlineDbContext> uow, IDataPermissionFilterBuilder dataPermissionFilterBuilder) : base(uow, dataPermissionFilterBuilder)
         {
         }
 
         public async Task<IReadOnlyList<Call>> QueryPartAsync(DateTime datetime)
         {
-            var a = await Db.Queryable<Call>()
+            return await Db.Queryable<Call>()
                 .Includes(d => d.CallDetails)
                 //.Where(d => d.CallDetails.Any(x => x.EventName == "BYE") 
                 .Where(d => d.CallStatus == ECallStatus.Bye
@@ -21,8 +22,6 @@ namespace Hotline.Repository.SqlSugar.CallCenter
                 .OrderBy(d => d.CreationTime)
                 .Take(10)
                 .ToListAsync();
-
-            return a;
         }
     }
 }

+ 2 - 1
src/Hotline.Repository.SqlSugar/CallCenter/IvrCategoryRepository.cs

@@ -1,4 +1,5 @@
 using Hotline.CallCenter.Ivrs;
+using Hotline.Repository.SqlSugar.DataPermissions;
 using SqlSugar;
 using XF.Domain.Dependency;
 
@@ -6,7 +7,7 @@ namespace Hotline.Repository.SqlSugar.CallCenter
 {
     public class IvrCategoryRepository : BaseRepository<IvrCategory>, IIvrCategoryRepository, IScopeDependency
     {
-        public IvrCategoryRepository(ISugarUnitOfWork<HotlineDbContext> uow) : base(uow)
+        public IvrCategoryRepository(ISugarUnitOfWork<HotlineDbContext> uow, IDataPermissionFilterBuilder dataPermissionFilterBuilder) : base(uow, dataPermissionFilterBuilder)
         {
         }
 

+ 2 - 1
src/Hotline.Repository.SqlSugar/CallCenter/IvrRepository.cs

@@ -1,4 +1,5 @@
 using Hotline.CallCenter.Ivrs;
+using Hotline.Repository.SqlSugar.DataPermissions;
 using SqlSugar;
 using XF.Domain.Dependency;
 
@@ -6,7 +7,7 @@ namespace Hotline.Repository.SqlSugar.CallCenter
 {
     public class IvrRepository : BaseRepository<Ivr>, IIvrRepository, IScopeDependency
     {
-        public IvrRepository(ISugarUnitOfWork<HotlineDbContext> uow) : base(uow)
+        public IvrRepository(ISugarUnitOfWork<HotlineDbContext> uow, IDataPermissionFilterBuilder dataPermissionFilterBuilder) : base(uow, dataPermissionFilterBuilder)
         {
         }
 

+ 2 - 1
src/Hotline.Repository.SqlSugar/CallCenter/TelGroupRepository.cs

@@ -1,4 +1,5 @@
 using Hotline.CallCenter.Tels;
+using Hotline.Repository.SqlSugar.DataPermissions;
 using SqlSugar;
 using XF.Domain.Dependency;
 
@@ -6,7 +7,7 @@ namespace Hotline.Repository.SqlSugar.CallCenter;
 
 public class TelGroupRepository : BaseRepository<TelGroup>, ITelGroupRepository, IScopeDependency
 {
-    public TelGroupRepository(ISugarUnitOfWork<HotlineDbContext> uow) : base(uow)
+    public TelGroupRepository(ISugarUnitOfWork<HotlineDbContext> uow, IDataPermissionFilterBuilder dataPermissionFilterBuilder) : base(uow, dataPermissionFilterBuilder)
     {
     }
 

+ 2 - 1
src/Hotline.Repository.SqlSugar/CallCenter/TelRepository.cs

@@ -1,4 +1,5 @@
 using Hotline.CallCenter.Tels;
+using Hotline.Repository.SqlSugar.DataPermissions;
 using SqlSugar;
 using XF.Domain.Dependency;
 
@@ -6,7 +7,7 @@ namespace Hotline.Repository.SqlSugar.CallCenter
 {
     public class TelRepository : BaseRepository<Tel>, ITelRepository, IScopeDependency
     {
-        public TelRepository(ISugarUnitOfWork<HotlineDbContext> uow) : base(uow)
+        public TelRepository(ISugarUnitOfWork<HotlineDbContext> uow, IDataPermissionFilterBuilder dataPermissionFilterBuilder) : base(uow, dataPermissionFilterBuilder)
         {
         }
 

+ 2 - 1
src/Hotline.Repository.SqlSugar/CallCenter/TelRestRepository.cs

@@ -1,4 +1,5 @@
 using Hotline.CallCenter.Tels;
+using Hotline.Repository.SqlSugar.DataPermissions;
 using SqlSugar;
 using XF.Domain.Dependency;
 
@@ -6,7 +7,7 @@ namespace Hotline.Repository.SqlSugar.CallCenter
 {
     public class TelRestRepository : BaseRepository<TelRest>, ITelRestRepository, IScopeDependency
     {
-        public TelRestRepository(ISugarUnitOfWork<HotlineDbContext> uow) : base(uow)
+        public TelRestRepository(ISugarUnitOfWork<HotlineDbContext> uow, IDataPermissionFilterBuilder dataPermissionFilterBuilder) : base(uow, dataPermissionFilterBuilder)
         {
         }
     }

+ 3 - 2
src/Hotline.Repository.SqlSugar/CallCenter/WorkRepository.cs

@@ -1,4 +1,5 @@
-using Hotline.Users;
+using Hotline.Repository.SqlSugar.DataPermissions;
+using Hotline.Users;
 using SqlSugar;
 using XF.Domain.Dependency;
 
@@ -6,7 +7,7 @@ namespace Hotline.Repository.SqlSugar.CallCenter;
 
 public class WorkRepository : BaseRepository<Work>, IWorkRepository, IScopeDependency
 {
-    public WorkRepository(ISugarUnitOfWork<HotlineDbContext> uow) : base(uow)
+    public WorkRepository(ISugarUnitOfWork<HotlineDbContext> uow, IDataPermissionFilterBuilder dataPermissionFilterBuilder) : base(uow, dataPermissionFilterBuilder)
     {
     }
 

+ 33 - 0
src/Hotline.Repository.SqlSugar/DataPermissions/DataPermissionFilterBuilder.cs

@@ -0,0 +1,33 @@
+using System.Linq.Expressions;
+using XF.Domain.Authentications;
+using XF.Domain.Dependency;
+using XF.Domain.Entities;
+
+namespace Hotline.Repository.SqlSugar.DataPermissions;
+
+public class DataPermissionFilterBuilder : IDataPermissionFilterBuilder, IScopeDependency
+{
+    private readonly ISessionContext _sessionContext;
+    private readonly IDataPermissionManager _dataPermissionManager;
+
+    public DataPermissionFilterBuilder(ISessionContext sessionContext, IDataPermissionManager dataPermissionManager)
+    {
+        _sessionContext = sessionContext;
+        _dataPermissionManager = dataPermissionManager;
+    }
+
+    public Expression<Func<TEntity, bool>> Build<TEntity>() where TEntity : class, IEntity<string>, IDataPermission, new()
+    {
+        var userId = _sessionContext.RequiredUserId;
+        var scheme = _dataPermissionManager.GetQueryFilter<TEntity>(_sessionContext);
+        switch (scheme.QueryFilter)
+        {
+            case EQueryFilter.CreatorOnly:
+                return d => d.CreateUserId == userId;
+            case EQueryFilter.SelfAndSubDepartment:
+                return d => d.OrgCode == scheme.OrgCode;//todo
+            default:
+                throw new ArgumentOutOfRangeException();
+        }
+    }
+}

+ 34 - 0
src/Hotline.Repository.SqlSugar/DataPermissions/DataPermissionManager.cs

@@ -0,0 +1,34 @@
+using XF.Domain.Authentications;
+using XF.Domain.Dependency;
+using XF.Domain.Entities;
+
+namespace Hotline.Repository.SqlSugar.DataPermissions;
+
+public class DataPermissionManager : IDataPermissionManager, IScopeDependency
+{
+    public DataPermissionScheme GetQueryFilter<TEntity>(ISessionContext sessionContext) where TEntity : class, IEntity<string>, IDataPermission, new()
+    {
+        EQueryFilter? queryFilter = GetCurrentQueryFilter(sessionContext.Roles, typeof(TEntity).Name);
+        if (queryFilter == null)
+        {
+            //todo 未配置数据查询权限处理方案
+        }
+
+        if (queryFilter == EQueryFilter.CreatorOnly)
+            return new DataPermissionScheme(EQueryFilter.CreatorOnly);
+
+        if (queryFilter == EQueryFilter.SelfAndSubDepartment)
+        {
+            //todo 查询对应部门编码
+
+            return new DataPermissionScheme(EQueryFilter.SelfAndSubDepartment, "");
+        }
+
+        throw new NotImplementedException();
+    }
+
+    private EQueryFilter? GetCurrentQueryFilter(string[] roles, string entityName)
+    {
+        throw new NotImplementedException();
+    }
+}

+ 3 - 0
src/Hotline.Repository.SqlSugar/DataPermissions/DataPermissionScheme.cs

@@ -0,0 +1,3 @@
+namespace Hotline.Repository.SqlSugar.DataPermissions;
+
+public record DataPermissionScheme(EQueryFilter QueryFilter, string? OrgCode = "", string? AreaId = "");

+ 10 - 0
src/Hotline.Repository.SqlSugar/DataPermissions/IDataPermissionFilterBuilder.cs

@@ -0,0 +1,10 @@
+using System.Linq.Expressions;
+using XF.Domain.Entities;
+
+namespace Hotline.Repository.SqlSugar.DataPermissions;
+
+public interface IDataPermissionFilterBuilder
+{
+    Expression<Func<TEntity, bool>> Build<TEntity>()
+        where TEntity : class, IEntity<string>, IDataPermission, new();
+}

+ 9 - 0
src/Hotline.Repository.SqlSugar/DataPermissions/IDataPermissionManager.cs

@@ -0,0 +1,9 @@
+using XF.Domain.Authentications;
+using XF.Domain.Entities;
+
+namespace Hotline.Repository.SqlSugar.DataPermissions;
+
+public interface IDataPermissionManager
+{
+    DataPermissionScheme GetQueryFilter<TEntity>(ISessionContext sessionContext) where TEntity : class, IEntity<string>, IDataPermission, new();
+}

+ 15 - 0
src/Hotline.Repository.SqlSugar/QueryExtensions.cs

@@ -0,0 +1,15 @@
+using Hotline.Repository.SqlSugar.DataPermissions;
+using SqlSugar;
+using XF.Domain.Entities;
+
+namespace Hotline.Repository.SqlSugar
+{
+    public static class QueryExtensions
+    {
+        public static ISugarQueryable<TEntity> DataPermissionFiltering<TEntity>(this ISugarQueryable<TEntity> queryable, IDataPermissionFilterBuilder dataPermissionFilterBuilder)
+            where TEntity : class, IEntity<string>, IDataPermission, new()
+        {
+            return queryable.Where(dataPermissionFilterBuilder.Build<TEntity>());
+        }
+    }
+}

+ 8 - 8
src/Hotline.Repository.SqlSugar/SqlSugarStartupExtensions.cs

@@ -96,16 +96,16 @@ namespace Hotline.Repository.SqlSugar
                         //5.0.8.2 获取无参数化 SQL  对性能有影响,特别大的SQL参数多的,调试使用
                         //UtilMethods.GetSqlString(DbType.SqlServer,exp.sql,exp.parameters)           
                     };
-                    db.Aop.OnExecutingChangeSql = (sql, pars) => //可以修改SQL和参数的值
-                    {
-                        //sql=newsql
-                        foreach (var p in pars) //修改
-                        {
+                    //db.Aop.OnExecutingChangeSql = (sql, pars) => //可以修改SQL和参数的值
+                    //{
+                    //    //sql=newsql
+                    //    //foreach (var p in pars) //修改
+                    //    //{
 
-                        }
+                    //    //}
 
-                        return new KeyValuePair<string, SugarParameter[]>(sql, pars);
-                    };
+                    //    return new KeyValuePair<string, SugarParameter[]>(sql, pars);
+                    //};
 
                     db.Aop.OnLogExecuted = (sql, p) =>
                     {

+ 3 - 2
src/Hotline.Repository.SqlSugar/System/SystemAuthorityRepository.cs

@@ -1,4 +1,5 @@
-using Hotline.Settings;
+using Hotline.Repository.SqlSugar.DataPermissions;
+using Hotline.Settings;
 using SqlSugar;
 using XF.Domain.Dependency;
 
@@ -6,7 +7,7 @@ namespace Hotline.Repository.SqlSugar.System
 {
     public class SystemAuthorityRepository : BaseRepository<SystemAuthority>, ISystemAuthorityRepository, IScopeDependency
     {
-        public SystemAuthorityRepository(ISugarUnitOfWork<HotlineDbContext> uow) : base(uow)
+        public SystemAuthorityRepository(ISugarUnitOfWork<HotlineDbContext> uow, IDataPermissionFilterBuilder dataPermissionFilterBuilder) : base(uow, dataPermissionFilterBuilder)
         {
         }
 

+ 3 - 2
src/Hotline.Repository.SqlSugar/System/SystemButtonRepository.cs

@@ -1,4 +1,5 @@
-using Hotline.Settings;
+using Hotline.Repository.SqlSugar.DataPermissions;
+using Hotline.Settings;
 using SqlSugar;
 using System;
 using System.Collections.Generic;
@@ -11,7 +12,7 @@ namespace Hotline.Repository.SqlSugar.System
 {
     public class SystemButtonRepository : BaseRepository<SystemButton>, ISystemButtonRepository, IScopeDependency
     {
-        public SystemButtonRepository(ISugarUnitOfWork<HotlineDbContext> uow) : base(uow)
+        public SystemButtonRepository(ISugarUnitOfWork<HotlineDbContext> uow, IDataPermissionFilterBuilder dataPermissionFilterBuilder) : base(uow, dataPermissionFilterBuilder)
         {
         }
     }

+ 3 - 2
src/Hotline.Repository.SqlSugar/System/SystemDataAuthorityRepository.cs

@@ -1,4 +1,5 @@
-using Hotline.Settings;
+using Hotline.Repository.SqlSugar.DataPermissions;
+using Hotline.Settings;
 using SqlSugar;
 using XF.Domain.Dependency;
 
@@ -6,7 +7,7 @@ namespace Hotline.Repository.SqlSugar.System
 {
     public class SystemDataAuthorityRepository : BaseRepository<SystemDataAuthority>, ISystemDataAuthorityRepository, IScopeDependency
     {
-        public SystemDataAuthorityRepository(ISugarUnitOfWork<HotlineDbContext> uow) : base(uow)
+        public SystemDataAuthorityRepository(ISugarUnitOfWork<HotlineDbContext> uow, IDataPermissionFilterBuilder dataPermissionFilterBuilder) : base(uow, dataPermissionFilterBuilder)
         {
         }
     }

+ 3 - 2
src/Hotline.Repository.SqlSugar/System/SystemMenuRepository.cs

@@ -1,4 +1,5 @@
-using Hotline.Settings;
+using Hotline.Repository.SqlSugar.DataPermissions;
+using Hotline.Settings;
 using Hotline.Share.Dtos.Menu;
 using SqlSugar;
 using System;
@@ -13,7 +14,7 @@ namespace Hotline.Repository.SqlSugar.System
 {
     public class SystemMenuRepository : BaseRepository<SystemMenu>, ISystemMenuRepository, IScopeDependency
     {
-        public SystemMenuRepository(ISugarUnitOfWork<HotlineDbContext> uow) : base(uow)
+        public SystemMenuRepository(ISugarUnitOfWork<HotlineDbContext> uow, IDataPermissionFilterBuilder dataPermissionFilterBuilder) : base(uow, dataPermissionFilterBuilder)
         {
         }
 

+ 3 - 2
src/Hotline.Repository.SqlSugar/System/SystemOrganizeRepository.cs

@@ -1,4 +1,5 @@
-using Hotline.Settings;
+using Hotline.Repository.SqlSugar.DataPermissions;
+using Hotline.Settings;
 using SqlSugar;
 using XF.Domain.Dependency;
 
@@ -6,7 +7,7 @@ namespace Hotline.Repository.SqlSugar.System
 {
     public class SystemOrganizeRepository : BaseRepository<SystemOrganize>, ISystemOrganizeRepository, IScopeDependency
     {
-        public SystemOrganizeRepository(ISugarUnitOfWork<HotlineDbContext> uow) : base(uow)
+        public SystemOrganizeRepository(ISugarUnitOfWork<HotlineDbContext> uow, IDataPermissionFilterBuilder dataPermissionFilterBuilder) : base(uow, dataPermissionFilterBuilder)
         {
         }
 

+ 3 - 2
src/Hotline.Repository.SqlSugar/System/SystemSettingGroupRepository.cs

@@ -1,4 +1,5 @@
-using Hotline.Settings;
+using Hotline.Repository.SqlSugar.DataPermissions;
+using Hotline.Settings;
 using SqlSugar;
 using XF.Domain.Dependency;
 
@@ -6,7 +7,7 @@ namespace Hotline.Repository.SqlSugar.System
 {
     public class SystemSettingGroupRepository : BaseRepository<SystemSettingGroup>, ISystemSettingGroupRepository, IScopeDependency
     {
-        public SystemSettingGroupRepository(ISugarUnitOfWork<HotlineDbContext> uow) : base(uow)
+        public SystemSettingGroupRepository(ISugarUnitOfWork<HotlineDbContext> uow, IDataPermissionFilterBuilder dataPermissionFilterBuilder) : base(uow, dataPermissionFilterBuilder)
         {
         }
     }

+ 3 - 2
src/Hotline.Repository.SqlSugar/System/SystemSettingRepository.cs

@@ -1,4 +1,5 @@
-using Hotline.Settings;
+using Hotline.Repository.SqlSugar.DataPermissions;
+using Hotline.Settings;
 using SqlSugar;
 using XF.Domain.Dependency;
 
@@ -6,7 +7,7 @@ namespace Hotline.Repository.SqlSugar.System
 {
     public class SystemSettingRepository : BaseRepository<SystemSetting>, ISystemSettingRepository, IScopeDependency
     {
-        public SystemSettingRepository(ISugarUnitOfWork<HotlineDbContext> uow) : base(uow)
+        public SystemSettingRepository(ISugarUnitOfWork<HotlineDbContext> uow, IDataPermissionFilterBuilder dataPermissionFilterBuilder) : base(uow, dataPermissionFilterBuilder)
         {
         }
     }

+ 2 - 1
src/Hotline.Repository.SqlSugar/User/OrgUserRepository.cs

@@ -1,4 +1,5 @@
 using Hotline.CallCenter.Calls;
+using Hotline.Repository.SqlSugar.DataPermissions;
 using Hotline.Settings;
 using SqlSugar;
 using XF.Domain.Dependency;
@@ -7,7 +8,7 @@ namespace Hotline.Repository.SqlSugar.User
 {
     public class OrgUserRepository : BaseRepository<OrgUser>, IOrgUserRepository, IScopeDependency
     {
-        public OrgUserRepository(ISugarUnitOfWork<HotlineDbContext> uow) : base(uow)
+        public OrgUserRepository(ISugarUnitOfWork<HotlineDbContext> uow, IDataPermissionFilterBuilder dataPermissionFilterBuilder) : base(uow, dataPermissionFilterBuilder)
         {
         }
 

+ 3 - 2
src/Hotline.Repository.SqlSugar/User/UserFastMenuRepository.cs

@@ -1,4 +1,5 @@
-using Hotline.Settings;
+using Hotline.Repository.SqlSugar.DataPermissions;
+using Hotline.Settings;
 using SqlSugar;
 using XF.Domain.Dependency;
 
@@ -6,7 +7,7 @@ namespace Hotline.Repository.SqlSugar.User
 {
     public class UserFastMenuRepository : BaseRepository<UserFastMenu>, IUserFastMenuRepository, IScopeDependency
     {
-        public UserFastMenuRepository(ISugarUnitOfWork<HotlineDbContext> uow) : base(uow)
+        public UserFastMenuRepository(ISugarUnitOfWork<HotlineDbContext> uow, IDataPermissionFilterBuilder dataPermissionFilterBuilder) : base(uow, dataPermissionFilterBuilder)
         {
         }
     }

+ 3 - 2
src/Hotline.Repository.SqlSugar/User/UserRepository.cs

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

+ 23 - 16
src/XF.Domain.Repository/Entity.cs

@@ -4,11 +4,28 @@ using XF.Domain.Events;
 
 namespace XF.Domain.Repository;
 
-public abstract class Entity : IEntity<string>, IDomainEvents
+public abstract class Entity : IEntity<string>, IDomainEvents, IDataPermission
 {
     private List<IAppNotification> _domainEvents = new();
 
-    public string Id { get; set; }//判断为空时生成递增Id
+    public string Id { get; set; }
+
+    /// <summary>
+    /// 组织编码
+    /// </summary>
+    [SugarColumn(ColumnDescription = "组织编码")]
+    public string OrgCode { get; set; }
+    /// <summary>
+    /// 创建人
+    /// </summary>
+    [SugarColumn(ColumnDescription = "创建人")]
+    public string CreateUserId { get; set; }
+
+    /// <summary>
+    /// 赋值部门Id
+    /// </summary>
+    [SugarColumn(ColumnDescription = "数据权限区域Id")]
+    public string AreaId { get; set; }
 
     public void AddEvent(IAppNotification notification)
     {
@@ -105,29 +122,19 @@ public abstract class FullStateEntity : CreationSoftDeleteEntity, IHasModificati
 /// <summary>
 /// 实体(权限、创建时间)
 /// </summary>
-public abstract class CreationEntityHasAuth : Entity, IHasCreationTime, IDataPermission
+public abstract class CreationEntityHasAuth : Entity, IHasCreationTime
 {
     /// <summary>
     /// 创建时间
     /// </summary>
     [SugarColumn(ColumnDescription = "创建时间")]
     public DateTime CreationTime { get; set; }
-    /// <summary>
-    /// 组织编码
-    /// </summary>
-    [SugarColumn(ColumnDescription ="组织编码")]
-    public string OrgCode { get; set; }
-    /// <summary>
-    /// 创建人
-    /// </summary>
-    [SugarColumn(ColumnDescription ="创建人")]
-    public string CreateUserId { get; set; }
 }
 
 /// <summary>
 /// 实体(权限、创建时间、软删除)
 /// </summary>
-public abstract class CreationSoftDeleteEntityHasAuth:CreationEntityHasAuth, IHasDeletionTime, ISoftDelete
+public abstract class CreationSoftDeleteEntityHasAuth : CreationEntityHasAuth, IHasDeletionTime, ISoftDelete
 {
     [SugarColumn(ColumnDescription = "是否删除")]
     public bool IsDeleted { get; private set; }
@@ -150,7 +157,7 @@ public abstract class CreationSoftDeleteEntityHasAuth:CreationEntityHasAuth, IHa
 /// <summary>
 /// 实体(权限、修改时间)
 /// </summary>
-public abstract class CreationModifycationHasAuth: CreationEntityHasAuth, IHasModificationTime
+public abstract class CreationModifycationHasAuth : CreationEntityHasAuth, IHasModificationTime
 {
     /// <summary>
     /// 最近更新时间
@@ -164,7 +171,7 @@ public abstract class CreationModifycationHasAuth: CreationEntityHasAuth, IHasMo
 /// <summary>
 /// 全状态实体(权限、创建时间、更新时间、软删除)
 /// </summary>
-public abstract class FullStateEntityHasAuthEntity: CreationSoftDeleteEntityHasAuth, IHasModificationTime
+public abstract class FullStateEntityHasAuthEntity : CreationSoftDeleteEntityHasAuth, IHasModificationTime
 {
     /// <summary>
     /// 最近更新时间

+ 9 - 4
src/XF.Domain.Repository/IRepositorySqlSugar.cs

@@ -17,25 +17,30 @@ namespace XF.Domain.Repository
             Func<ISugarQueryable<TEntity>, ISugarQueryable<TEntity>> orderByCreator,
             int pageIndex,
             int pageSize,
+            bool permissionVerify = false,
             params (bool isWhere, Expression<Func<TEntity, bool>> expression)[] whereIfs);
-        
+
         Task<List<TEntity>> QueryExtAsync(
             Expression<Func<TEntity, bool>> predicate,
             Func<ISugarQueryable<TEntity>, ISugarQueryable<TEntity>>? includes = null,
             Func<ISugarQueryable<TEntity>, ISugarQueryable<TEntity>>? orderByCreator = null,
+            bool permissionVerify = false,
             params (bool isWhere, Expression<Func<TEntity, bool>> expression)[] whereIfs);
 
         Task<List<TEntity>> QueryExtAsync(
             Expression<Func<TEntity, bool>> predicate,
-            Func<ISugarQueryable<TEntity>, ISugarQueryable<TEntity>> includes);
+            Func<ISugarQueryable<TEntity>, ISugarQueryable<TEntity>> includes,
+            bool permissionVerify = false);
 
         Task<TEntity> GetExtAsync(
             Expression<Func<TEntity, bool>> predicate,
-            Func<ISugarQueryable<TEntity>, ISugarQueryable<TEntity>> includes);
+            Func<ISugarQueryable<TEntity>, ISugarQueryable<TEntity>> includes,
+            bool permissionVerify = false);
 
         Task<TEntity> GetExtAsync(
             TKey id,
-            Func<ISugarQueryable<TEntity>, ISugarQueryable<TEntity>> includes);
+            Func<ISugarQueryable<TEntity>, ISugarQueryable<TEntity>> includes,
+            bool permissionVerify = false);
 
         Task UpdateAsync(TEntity entity, bool ignoreNullColumns = true, CancellationToken cancellationToken = default);
     }

+ 1 - 1
src/XF.Domain/Entities/IDataPermission.cs

@@ -7,6 +7,6 @@ namespace XF.Domain.Entities
 
         string CreateUserId { get; set; }
 
-        //string AreaId { get; set; }
+        string AreaId { get; set; }
     }
 }