xf 2 роки тому
батько
коміт
38f1e85f9d
28 змінених файлів з 200 додано та 71 видалено
  1. 8 8
      src/Hotline.Api/Controllers/CallController.cs
  2. 3 2
      src/Hotline.Api/Controllers/UserController.cs
  3. 32 9
      src/Hotline.Repository.SqlSugar/BaseRepository.cs
  4. 1 1
      src/Hotline.Repository.SqlSugar/CallCenter/BlacklistRepository.cs
  5. 1 1
      src/Hotline.Repository.SqlSugar/CallCenter/CallDetailRepository.cs
  6. 1 1
      src/Hotline.Repository.SqlSugar/CallCenter/CallRecordRepository.cs
  7. 2 4
      src/Hotline.Repository.SqlSugar/CallCenter/CallRepository.cs
  8. 1 1
      src/Hotline.Repository.SqlSugar/CallCenter/IvrCategoryRepository.cs
  9. 1 1
      src/Hotline.Repository.SqlSugar/CallCenter/IvrRepository.cs
  10. 1 1
      src/Hotline.Repository.SqlSugar/CallCenter/TelGroupRepository.cs
  11. 1 1
      src/Hotline.Repository.SqlSugar/CallCenter/TelRepository.cs
  12. 1 1
      src/Hotline.Repository.SqlSugar/CallCenter/TelRestRepository.cs
  13. 1 1
      src/Hotline.Repository.SqlSugar/CallCenter/WorkRepository.cs
  14. 95 0
      src/Hotline.Repository.SqlSugar/QueryExtensions.cs
  15. 8 8
      src/Hotline.Repository.SqlSugar/SqlSugarStartupExtensions.cs
  16. 1 1
      src/Hotline.Repository.SqlSugar/System/SystemAuthorityRepository.cs
  17. 1 1
      src/Hotline.Repository.SqlSugar/System/SystemButtonRepository.cs
  18. 1 1
      src/Hotline.Repository.SqlSugar/System/SystemDataAuthorityRepository.cs
  19. 1 1
      src/Hotline.Repository.SqlSugar/System/SystemMenuRepository.cs
  20. 1 1
      src/Hotline.Repository.SqlSugar/System/SystemOrganizeRepository.cs
  21. 1 1
      src/Hotline.Repository.SqlSugar/System/SystemSettingGroupRepository.cs
  22. 1 1
      src/Hotline.Repository.SqlSugar/System/SystemSettingRepository.cs
  23. 1 1
      src/Hotline.Repository.SqlSugar/User/OrgUserRepository.cs
  24. 1 1
      src/Hotline.Repository.SqlSugar/User/UserFastMenuRepository.cs
  25. 1 1
      src/Hotline.Repository.SqlSugar/User/UserRepository.cs
  26. 23 16
      src/XF.Domain.Repository/Entity.cs
  27. 9 4
      src/XF.Domain.Repository/IRepositorySqlSugar.cs
  28. 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);
         }
 

+ 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;
         }

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

@@ -5,15 +5,17 @@ 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 +131,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 +158,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 +185,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);
         }

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

@@ -6,7 +6,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)
         {
         }
     }

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

@@ -6,7 +6,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)
         {
         }
     }

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

@@ -6,7 +6,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)
         {
         }
     }

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

@@ -7,13 +7,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 +21,6 @@ namespace Hotline.Repository.SqlSugar.CallCenter
                 .OrderBy(d => d.CreationTime)
                 .Take(10)
                 .ToListAsync();
-
-            return a;
         }
     }
 }

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

@@ -6,7 +6,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)
         {
         }
 

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

@@ -6,7 +6,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)
         {
         }
 

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

@@ -6,7 +6,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)
     {
     }
 

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

@@ -6,7 +6,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)
         {
         }
 

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

@@ -6,7 +6,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)
         {
         }
     }

+ 1 - 1
src/Hotline.Repository.SqlSugar/CallCenter/WorkRepository.cs

@@ -6,7 +6,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)
     {
     }
 

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

@@ -0,0 +1,95 @@
+using System.Linq.Expressions;
+using SqlSugar;
+using XF.Domain.Authentications;
+using XF.Domain.Dependency;
+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>());
+        }
+    }
+
+    public interface IDataPermissionFilterBuilder
+    {
+        Expression<Func<TEntity, bool>> Build<TEntity>()
+            where TEntity : class, IEntity<string>, IDataPermission, new();
+    }
+
+    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>(userId);
+            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();
+            }
+        }
+    }
+
+    public interface IDataPermissionManager
+    {
+        DataPermissionScheme GetQueryFilter<TEntity>(string userId) where TEntity : class, IEntity<string>, IDataPermission, new();
+    }
+
+    public class DataPermissionScheme
+    {
+        public EQueryFilter QueryFilter { get; set; }
+        public string OrgCode { get; set; }
+        public string AreaId { get; set; }
+    }
+
+    public class DataPermissionManager : IDataPermissionManager
+    {
+        public DataPermissionScheme GetQueryFilter<TEntity>(string userId) where TEntity : class, IEntity<string>, IDataPermission, new()
+        {
+            EQueryFilter? queryFilter = GetCurrentQueryFilter(userId, typeof(TEntity).Name);
+            if (queryFilter == null)
+            {
+                //todo 未配置数据查询权限处理方案
+            }
+
+            if (queryFilter == EQueryFilter.CreatorOnly)
+                return new DataPermissionScheme { QueryFilter = EQueryFilter.CreatorOnly };
+
+            if (queryFilter == EQueryFilter.SelfAndSubDepartment)
+            {
+                //todo 查询对应部门编码
+
+                return new DataPermissionScheme
+                {
+                    QueryFilter = EQueryFilter.SelfAndSubDepartment,
+                    OrgCode = "",
+                };
+            }
+
+            throw new NotImplementedException();
+        }
+
+        private EQueryFilter? GetCurrentQueryFilter(string userId, string entityName)
+        {
+            throw new NotImplementedException();
+        }
+    }
+}

+ 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) =>
                     {

+ 1 - 1
src/Hotline.Repository.SqlSugar/System/SystemAuthorityRepository.cs

@@ -6,7 +6,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)
         {
         }
 

+ 1 - 1
src/Hotline.Repository.SqlSugar/System/SystemButtonRepository.cs

@@ -11,7 +11,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)
         {
         }
     }

+ 1 - 1
src/Hotline.Repository.SqlSugar/System/SystemDataAuthorityRepository.cs

@@ -6,7 +6,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)
         {
         }
     }

+ 1 - 1
src/Hotline.Repository.SqlSugar/System/SystemMenuRepository.cs

@@ -13,7 +13,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)
         {
         }
 

+ 1 - 1
src/Hotline.Repository.SqlSugar/System/SystemOrganizeRepository.cs

@@ -6,7 +6,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)
         {
         }
 

+ 1 - 1
src/Hotline.Repository.SqlSugar/System/SystemSettingGroupRepository.cs

@@ -6,7 +6,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)
         {
         }
     }

+ 1 - 1
src/Hotline.Repository.SqlSugar/System/SystemSettingRepository.cs

@@ -6,7 +6,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)
         {
         }
     }

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

@@ -7,7 +7,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)
         {
         }
 

+ 1 - 1
src/Hotline.Repository.SqlSugar/User/UserFastMenuRepository.cs

@@ -6,7 +6,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)
         {
         }
     }

+ 1 - 1
src/Hotline.Repository.SqlSugar/User/UserRepository.cs

@@ -6,7 +6,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; }
     }
 }