merge 冲突合并

This commit is contained in:
2021-04-28 13:52:10 +08:00
54 changed files with 23287 additions and 91 deletions

View File

@@ -40,5 +40,28 @@ namespace Ewide.Core.Entity
[Comment("排序")]
public int Sort { get; set; }
/// <summary>
/// 多个区域有多个用户绑定自定义数据
/// </summary>
public ICollection<SysUser> SysUsers { get; set; }
/// <summary>
/// 中间表
/// </summary>
public List<SysUserArea> SysUserAreas { get; set; }
/// <summary>
/// 多个区域有多个角色绑定权限数据
/// </summary>
public ICollection<SysRole> SysRoles { get; set; }
/// <summary>
/// 中间表
/// </summary>
public List<SysRoleArea> SysRoleAreas { get; set; }
/// <summary>
/// 一个区域有多个组织
/// </summary>
public ICollection<SysOrg> SysOrgs { get; set; }
}
}

View File

@@ -1,4 +1,5 @@
using Furion.DatabaseAccessor;
using Ewide.Core.Entity;
using Furion.DatabaseAccessor;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using System;
@@ -70,6 +71,10 @@ namespace Ewide.Core
/// </summary>
public List<SysRoleDataScope> SysRoleDataScopes { get; set; }
public ICollection<AreaNumber> AreaNumbers { get; set; }
public List<SysRoleArea> SysRoleAreas { get; set; }
/// <summary>
/// 多对多(菜单)
/// </summary>
@@ -97,7 +102,15 @@ namespace Ewide.Core
{
u.HasKey(c => new { c.SysRoleId, c.SysOrgId });
});
entityBuilder.HasMany(p => p.AreaNumbers)
.WithMany(p => p.SysRoles)
.UsingEntity<SysRoleArea>(
u => u.HasOne(c => c.AreaNumber).WithMany(c => c.SysRoleAreas).HasForeignKey(c => c.AreaNumberCode),
u => u.HasOne(c => c.SysRole).WithMany(c => c.SysRoleAreas).HasForeignKey(c => c.SysRoleId),
u =>
{
u.HasKey(c => new { c.SysRoleId, c.AreaNumberCode });
});
entityBuilder.HasMany(p => p.SysMenus)
.WithMany(p => p.SysRoles)
.UsingEntity<SysRoleMenu>(

View File

@@ -1,4 +1,5 @@
using Furion.DatabaseAccessor;
using Ewide.Core.Entity;
using Furion.DatabaseAccessor;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using System;
@@ -127,6 +128,11 @@ namespace Ewide.Core
/// </summary>
public List<SysUserDataScope> SysUserDataScopes { get; set; }
public ICollection<AreaNumber> AreaNumbers { get; set; }
/// <summary>
/// 多对多中间表(用户-区域 数据范围)
/// </summary>
public List<SysUserArea> SysUserAreas { get; set; }
/// <summary>
/// 配置多对多关系
/// </summary>
@@ -150,6 +156,13 @@ namespace Ewide.Core
{
u.HasKey(c => new { c.SysUserId, c.SysOrgId });
});
entityBuilder.HasMany(p => p.AreaNumbers).WithMany(p => p.SysUsers).UsingEntity<SysUserArea>(
u => u.HasOne(c => c.AreaNumber).WithMany(c => c.SysUserAreas).HasForeignKey(c => c.AreaNumberCode),
u => u.HasOne(c => c.SysUser).WithMany(c => c.SysUserAreas).HasForeignKey(c => c.SysUserId),
u =>
{
u.HasKey(c => new { c.SysUserId, c.AreaNumberCode });
});
}
}
}

View File

@@ -303,6 +303,31 @@
验证码缓存
</summary>
</member>
<member name="P:Ewide.Core.Entity.AreaNumber.SysUsers">
<summary>
多个区域有多个用户绑定自定义数据
</summary>
</member>
<member name="P:Ewide.Core.Entity.AreaNumber.SysUserAreas">
<summary>
中间表
</summary>
</member>
<member name="P:Ewide.Core.Entity.AreaNumber.SysRoles">
<summary>
多个区域有多个角色绑定权限数据
</summary>
</member>
<member name="P:Ewide.Core.Entity.AreaNumber.SysRoleAreas">
<summary>
中间表
</summary>
</member>
<member name="P:Ewide.Core.Entity.AreaNumber.SysOrgs">
<summary>
一个区域有多个组织
</summary>
</member>
<member name="P:Ewide.Core.Entity.SysRoleArea.SysRoleId">
<summary>
角色Id
@@ -1683,6 +1708,11 @@
多对多中间表(用户-机构 数据范围)
</summary>
</member>
<member name="P:Ewide.Core.SysUser.SysUserAreas">
<summary>
多对多中间表(用户-区域 数据范围)
</summary>
</member>
<member name="M:Ewide.Core.SysUser.Configure(Microsoft.EntityFrameworkCore.Metadata.Builders.EntityTypeBuilder{Ewide.Core.SysUser},Microsoft.EntityFrameworkCore.DbContext,System.Type)">
<summary>
配置多对多关系
@@ -2432,6 +2462,11 @@
授权数据
</summary>
</member>
<member name="P:Ewide.Core.XnInputBase.GrantAreaCodeList">
<summary>
授权区域
</summary>
</member>
<member name="T:Ewide.Core.PageInputBase">
<summary>
通用分页输入参数
@@ -5508,10 +5543,11 @@
上一级Id
</summary>
</member>
<member name="M:Ewide.Core.Service.ISysOrgService.GetAreaDataScopeIdList(System.String)">
<member name="M:Ewide.Core.Service.ISysOrgService.GetAreaDataScopeIdList(System.Int32,System.String)">
<summary>
根据区域信息获取单位id
</summary>
<param name="dataScopeType">代表区域范围的类型</param>
<param name="areaNumberCode">区域代码</param>
<returns></returns>
</member>

View File

@@ -21,6 +21,10 @@ namespace Ewide.Core
/// 授权数据
/// </summary>
public virtual List<string> GrantOrgIdList { get; set; } = new List<string>();
/// <summary>
/// 授权区域
/// </summary>
public virtual List<string> GrantAreaCodeList { get; set; } = new List<string>();
}
/// <summary>

View File

@@ -0,0 +1,52 @@
using Ewide.Core.Entity;
using Ewide.Core.Service.Area.Dto;
using Furion.DatabaseAccessor;
using Furion.DatabaseAccessor.Extensions;
using Furion.DependencyInjection;
using Mapster;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Ewide.Core.Service.Area
{
public class AreaNumberService : IAreaNumberService, ITransient
{
private readonly IRepository<AreaNumber> _areaNumberRep;
private readonly ISysCacheService _sysCacheService;
public AreaNumberService(IRepository<AreaNumber> areaNumberRep, ISysCacheService sysCacheService)
{
_areaNumberRep = areaNumberRep;
_sysCacheService = sysCacheService;
}
public async Task AddAreaNumber(AreaNumberInput input)
{
await _areaNumberRep.InsertAsync(input.Adapt<AreaNumber>());
}
public async Task DeleteAreaNumber(DeleteAreaNumberInput input)
{
var areaNumber= await _areaNumberRep.FirstOrDefaultAsync(p=>p.Code==input.Code);
await areaNumber.DeleteAsync();
}
public async Task<AreaNumber> GetAreaNumber(string code)
{
return await _areaNumberRep.DetachedEntities.FirstOrDefaultAsync(a => a.Code == code);
}
public async Task<List<AreaNumber>> GetAreaNumberWithChildren(string code)
{
return await _areaNumberRep.DetachedEntities.Where(a => a.Code.StartsWith(code)).ToListAsync();
}
public async Task UpdateAreaNumber(AreaNumberInput input)
{
await _areaNumberRep.UpdateAsync(input.Adapt<AreaNumber>());
}
}
}

View File

@@ -0,0 +1,24 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Ewide.Core.Service.Area.Dto
{
public class AreaNumberInput
{
public string Code { get; set; }
public string ShowCode { get; set; }
public string Name { get; set; }
public int LevelType { get; set; }
public string Note { get; set; }
public int Sort { get; set; }
}
public class DeleteAreaNumberInput
{
[Required(ErrorMessage ="区域代码不可为空")]
public string Code { get; set; }
}
}

View File

@@ -0,0 +1,19 @@
using Ewide.Core.Entity;
using Ewide.Core.Service.Area.Dto;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Ewide.Core.Service.Area
{
public interface IAreaNumberService
{
Task AddAreaNumber(AreaNumberInput input);
Task DeleteAreaNumber(DeleteAreaNumberInput input);
Task UpdateAreaNumber(AreaNumberInput input);
Task<AreaNumber> GetAreaNumber(string code);
Task<List<AreaNumber>> GetAreaNumberWithChildren(string code);
}
}

View File

@@ -18,9 +18,10 @@ namespace Ewide.Core.Service
/// <summary>
/// 根据区域信息获取单位id
/// </summary>
/// <param name="dataScopeType">代表区域范围的类型</param>
/// <param name="areaNumberCode">区域代码</param>
/// <returns></returns>
Task<List<string>> GetAreaDataScopeIdList(string areaNumberCode);
Task<List<string>> GetAreaDataScopeIdList(int dataScopeType,string areaNumberCode);
/// <summary>
/// 当前区域信息不包括子区域
/// </summary>

View File

@@ -346,11 +346,15 @@ namespace Ewide.Core.Service
return await App.GetService<ISysUserService>().GetUserDataScopeIdList();
}
public async Task<List<string>> GetAreaDataScopeIdList(string areaNumberCode)
public async Task<List<string>> GetAreaDataScopeIdList(int dataScopeType, string orgId)
{
return await _sysOrgRep.DetachedEntities.Where(p => p.AreaNumberCode.StartsWith(areaNumberCode)).Select(p=>p.Id).ToListAsync();
var org = await _sysOrgRep.FirstOrDefaultAsync(o => o.Id == orgId);
if (dataScopeType == (int)DataScopeType.AREA_WITH_CHILD)
return await _sysOrgRep.DetachedEntities.Where(p => p.AreaNumberCode.StartsWith(org.Code)).Select(p => p.Id).ToListAsync();
if (dataScopeType == (int)DataScopeType.AREA)
return await _sysOrgRep.DetachedEntities.Where(p => p.AreaNumberCode == org.Code).Select(p => p.Id).ToListAsync();
return new List<string>();
}
public async Task<List<string>> GetAreaDataScopeIdListWithoutChildrenArea(string areaNumberCode)
{
return await _sysOrgRep.DetachedEntities.Where(p => p.AreaNumberCode == areaNumberCode).Select(p => p.Id).ToListAsync();

View File

@@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Ewide.Core.Service.Role
{
public interface ISysRoleAreaService
{
Task DeleteRoleAreaListByAreaCodeList(List<string> areaCodeList);
Task DeleteRoleAreaListByRoleId(string roleId);
Task<List<string>> GetRoleAreaCodeList(List<string> roleIdList);
Task GrantArea(UpdateRoleInput input);
}
}

View File

@@ -0,0 +1,66 @@
using Ewide.Core.Entity;
using Ewide.Core.Service.User;
using Furion.DatabaseAccessor;
using Furion.DatabaseAccessor.Extensions;
using Furion.DependencyInjection;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Ewide.Core.Service.Role
{
public class SysRoleAreaService : ISysRoleAreaService,ITransient
{
public readonly IRepository<SysRoleArea> _sysRoleAreaRep;
public SysRoleAreaService(IRepository<SysRoleArea> sysRolleAreaRep)
{
_sysRoleAreaRep = sysRolleAreaRep;
}
public async Task DeleteRoleAreaListByAreaCodeList(List<string> areaCodeList)
{
var dataScopes = await _sysRoleAreaRep.DetachedEntities.Where(u => areaCodeList.Contains(u.AreaNumberCode)).ToListAsync();
dataScopes.ForEach(u =>
{
u.Delete();
});
}
public async Task DeleteRoleAreaListByRoleId(string roleId)
{
var dataScopes = await _sysRoleAreaRep.DetachedEntities.Where(u => roleId==u.SysRoleId).ToListAsync();
dataScopes.ForEach(u =>
{
u.Delete();
});
}
public async Task<List<string>> GetRoleAreaCodeList(List<string> roleIdList)
{
return await _sysRoleAreaRep.DetachedEntities.Where(u => roleIdList.Contains(u.SysRoleId)).Select(u=>u.AreaNumberCode).Distinct().ToListAsync();
}
public async Task GrantArea(UpdateRoleInput input)
{
var dataScopes = await _sysRoleAreaRep.Where(u => u.SysRoleId == input.Id).ToListAsync();
dataScopes.ForEach(u =>
{
u.Delete();
});
input.GrantAreaCodeList.ForEach(u =>
{
new SysRoleArea
{
SysRoleId = input.Id,
AreaNumberCode = u
}.Insert();
});
}
}
}

View File

@@ -243,6 +243,7 @@ namespace Ewide.Core.Service
{
// 定义角色中最大数据范围的类型目前按最大范围策略来如果你同时拥有ALL和SELF的权限最后按ALL返回
int strongerDataScopeType = (int)DataScopeType.SELF;
int strongerAreaType = (int)DataScopeType.SELF;
var customDataScopeRoleIdList = new List<string>();
if (roleIdList != null && roleIdList.Count > 0)
@@ -252,6 +253,10 @@ namespace Ewide.Core.Service
{
if (u.DataScopeType == (int)DataScopeType.DEFINE)
customDataScopeRoleIdList.Add(u.Id);
if ((u.DataScopeType == (int)DataScopeType.AREA || u.DataScopeType == (int)DataScopeType.AREA_WITH_CHILD) && strongerAreaType < u.DataScopeType)
{
strongerDataScopeType = u.DataScopeType;
}
else if (u.DataScopeType <= strongerDataScopeType)
strongerDataScopeType = u.DataScopeType;
});
@@ -262,8 +267,9 @@ namespace Ewide.Core.Service
// 角色中拥有最大数据范围类型的数据范围
var dataScopeIdList = await _sysOrgService.GetDataScopeListByDataScopeType(strongerDataScopeType, orgId);
return roleDataScopeIdList.Concat(dataScopeIdList).Distinct().ToList(); //并集
//角色区域数据范围
var areaOrgIdList = await _sysOrgService.GetAreaDataScopeIdList(strongerAreaType, orgId);
return roleDataScopeIdList.Concat(dataScopeIdList).Concat(areaOrgIdList).Distinct().ToList(); //并集
}
/// <summary>

View File

@@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Ewide.Core.Service.Role
{
public interface ISysUserAreaService
{
Task DeleteUserAreaListByAreaCodeList(List<string> areaCodeList);
Task DeleteUserAreaListByUserId(string userId);
Task<List<string>> GetUserAreaIdList(string userId);
Task GrantData(UpdateUserInput input);
}
}

View File

@@ -0,0 +1,65 @@
using Ewide.Core.Entity;
using Ewide.Core.Service.Role;
using Furion.DatabaseAccessor;
using Furion.DatabaseAccessor.Extensions;
using Furion.DependencyInjection;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Ewide.Core.Service.User
{
public class SysUserAreaService : ISysUserAreaService,ITransient
{
public readonly IRepository<SysUserArea> _sysUserAreaRep;
public SysUserAreaService(IRepository<SysUserArea> sysUserAreaRep)
{
_sysUserAreaRep = sysUserAreaRep;
}
public async Task DeleteUserAreaListByAreaCodeList(List<string> areaCodeList)
{
var areaList = await _sysUserAreaRep.DetachedEntities.Where(ua => areaCodeList.Contains(ua.AreaNumberCode)).ToListAsync();
foreach (var area in areaList)
{
area.Delete();
}
}
public async Task DeleteUserAreaListByUserId(string userId)
{
var areaList = await _sysUserAreaRep.DetachedEntities.Where(ua => ua.SysUserId == userId).ToListAsync();
foreach (var area in areaList)
{
area.Delete();
}
}
public async Task<List<string>> GetUserAreaIdList(string userId)
{
return await _sysUserAreaRep.DetachedEntities.Where(ua => ua.SysUserId == userId).Select(ua => ua.AreaNumberCode).ToListAsync();
}
public async Task GrantData(UpdateUserInput input)
{
var dataScopes = await _sysUserAreaRep.Where(u => u.SysUserId == input.Id).ToListAsync();
dataScopes.ForEach(u =>
{
u.Delete();
});
input.GrantAreaCodeList.ForEach(u =>
{
new SysUserArea
{
SysUserId = input.Id,
AreaNumberCode = u
}.Insert();
});
}
}
}

View File

@@ -1,4 +1,5 @@
using Furion.DatabaseAccessor;
using Ewide.Core.Entity;
using Furion.DatabaseAccessor;
using Furion.DatabaseAccessor.Extensions;
using Furion.DependencyInjection;
using Microsoft.EntityFrameworkCore;
@@ -14,10 +15,13 @@ namespace Ewide.Core.Service
public class SysUserDataScopeService : ISysUserDataScopeService, ITransient
{
private readonly IRepository<SysUserDataScope> _sysUserDataScopeRep; // 用户数据范围表仓储
public SysUserDataScopeService(IRepository<SysUserDataScope> sysUserDataScopeRep)
private readonly IRepository<SysUserArea> _sysUserAreaRep;
private readonly IRepository<SysOrg> _sysOrgRep;
public SysUserDataScopeService(IRepository<SysUserDataScope> sysUserDataScopeRep, IRepository<SysUserArea> sysUserAreaRep, IRepository<SysOrg> sysOrgRep)
{
_sysUserDataScopeRep = sysUserDataScopeRep;
_sysUserAreaRep = sysUserAreaRep;
_sysOrgRep = sysOrgRep;
}
/// <summary>
@@ -51,9 +55,18 @@ namespace Ewide.Core.Service
/// <returns></returns>
public async Task<List<string>> GetUserDataScopeIdList(string userId)
{
return await _sysUserDataScopeRep.DetachedEntities
var areaList = await _sysUserAreaRep.DetachedEntities.Where(u => u.SysUserId == userId).Select(u => u.AreaNumberCode).ToListAsync();
//用户自定义的区域权限所对应的全部组织机构id
List<string> areaDataScopeIdList = new List<string>();
foreach (var areaNumberCode in areaList)
{
areaDataScopeIdList.AddRange(await _sysOrgRep.DetachedEntities.Where(p => p.AreaNumberCode == areaNumberCode).Select(p => p.Id).ToListAsync());
}
//用户自定义的组织权限
var orgIdList = await _sysUserDataScopeRep.DetachedEntities
.Where(u => u.SysUserId == userId)
.Select(u => u.SysOrgId).ToListAsync();
return areaDataScopeIdList.Concat(orgIdList).Distinct().ToList();
}
/// <summary>