This commit is contained in:
2021-04-28 14:26:21 +08:00
25 changed files with 7456 additions and 33 deletions

View File

@@ -31,5 +31,9 @@
/// 验证码缓存 /// 验证码缓存
/// </summary> /// </summary>
public const string CACHE_KEY_CODE = "vercode_"; public const string CACHE_KEY_CODE = "vercode_";
/// <summary>
/// 区域缓存
/// </summary>
public const string CACHE_AREA_NUMBER = "areaNumber";
} }
} }

View File

@@ -0,0 +1,76 @@
using Ewide.Core.Service.Area;
using Ewide.Core.Service.Area.Dto;
using Furion.DynamicApiController;
using Mapster;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Ewide.Core.Controller
{
/// <summary>
/// 区域代码相关服务
/// </summary>
[ApiDescriptionSettings(Name = "AreaNumber", Order = 160)]
public class AreaNumberController : IDynamicApiController
{
private readonly IAreaNumberService _areaNumberService;
public AreaNumberController(IAreaNumberService areaNumberService)
{
_areaNumberService = areaNumberService;
}
/// <summary>
///
/// </summary>
/// <param name="code"></param>
/// <returns></returns>
[HttpGet("/area/{code}")]
public async Task<AreaNumberOutput> GetAreaNumber([FromRoute]string code)
{
return (await _areaNumberService.GetAreaNumber(code)).Adapt<AreaNumberOutput>();
}
/// <summary>
/// 添加区域信息
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("/area/add")]
public async Task AddAreaNumber(AreaNumberInput input)
{
await _areaNumberService.AddAreaNumber(input);
}
/// <summary>
/// 更新区域信息
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("/area/edit")]
public async Task UpdateAreaNumber(AreaNumberInput input)
{
await _areaNumberService.UpdateAreaNumber(input);
}
/// <summary>
/// 删除区域
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("/area/delete")]
public async Task DeleteAreaNumber(DeleteAreaNumberInput input)
{
await _areaNumberService.DeleteAreaNumber(input);
}
/// <summary>
/// 获取目录树
/// </summary>
/// <returns></returns>
[HttpGet("/area/tree")]
public async Task<List<AreaTreeNode>> GetAreaNumberTree()
{
return await _areaNumberService.GetAreaNumberTree();
}
}
}

View File

@@ -34,13 +34,12 @@ namespace Ewide.Core.Entity
[Required] [Required]
public int LevelType { get; set; } public int LevelType { get; set; }
[Comment("父级区域代码")]
[MaxLength(10)]
public string ParentCode { get; set; }
[Comment("排序")] [Comment("排序")]
public int Sort { get; set; } public int Sort { get; set; }
/// <summary>
/// 父节点就是去掉后面两位
/// </summary>
public string ParentCode => LevelType>1?Code[0..(Code.Length-2)]:string.Empty;
/// <summary> /// <summary>
/// 多个区域有多个用户绑定自定义数据 /// 多个区域有多个用户绑定自定义数据
/// </summary> /// </summary>

View File

@@ -28,6 +28,7 @@
<PackageReference Include="Furion.Extras.Authentication.JwtBearer" Version="1.19.2" /> <PackageReference Include="Furion.Extras.Authentication.JwtBearer" Version="1.19.2" />
<PackageReference Include="Furion.Extras.Logging.Serilog" Version="1.19.2" /> <PackageReference Include="Furion.Extras.Logging.Serilog" Version="1.19.2" />
<PackageReference Include="Furion.Extras.ObjectMapper.Mapster" Version="1.19.2" /> <PackageReference Include="Furion.Extras.ObjectMapper.Mapster" Version="1.19.2" />
<PackageReference Include="Kendo.DynamicLinqCore" Version="3.1.1" />
<PackageReference Include="Quartz" Version="3.3.2" /> <PackageReference Include="Quartz" Version="3.3.2" />
<PackageReference Include="System.Drawing.Common" Version="5.0.2" /> <PackageReference Include="System.Drawing.Common" Version="5.0.2" />
<PackageReference Include="System.Text.Encoding.CodePages" Version="5.0.0" /> <PackageReference Include="System.Text.Encoding.CodePages" Version="5.0.0" />
@@ -41,6 +42,9 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Update="applicationconfig.Development.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="applicationconfig.json"> <None Update="applicationconfig.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None> </None>

View File

@@ -303,6 +303,55 @@
验证码缓存 验证码缓存
</summary> </summary>
</member> </member>
<member name="F:Ewide.Core.CommonConst.CACHE_AREA_NUMBER">
<summary>
区域缓存
</summary>
</member>
<member name="T:Ewide.Core.Controller.AreaNumberController">
<summary>
区域代码相关服务
</summary>
</member>
<member name="M:Ewide.Core.Controller.AreaNumberController.GetAreaNumber(System.String)">
<summary>
</summary>
<param name="code"></param>
<returns></returns>
</member>
<member name="M:Ewide.Core.Controller.AreaNumberController.AddAreaNumber(Ewide.Core.Service.Area.Dto.AreaNumberInput)">
<summary>
添加区域信息
</summary>
<param name="input"></param>
<returns></returns>
</member>
<member name="M:Ewide.Core.Controller.AreaNumberController.UpdateAreaNumber(Ewide.Core.Service.Area.Dto.AreaNumberInput)">
<summary>
更新区域信息
</summary>
<param name="input"></param>
<returns></returns>
</member>
<member name="M:Ewide.Core.Controller.AreaNumberController.DeleteAreaNumber(Ewide.Core.Service.Area.Dto.DeleteAreaNumberInput)">
<summary>
删除区域
</summary>
<param name="input"></param>
<returns></returns>
</member>
<member name="M:Ewide.Core.Controller.AreaNumberController.GetAreaNumberTree">
<summary>
获取目录树
</summary>
<returns></returns>
</member>
<member name="P:Ewide.Core.Entity.AreaNumber.ParentCode">
<summary>
父节点就是去掉后面两位
</summary>
</member>
<member name="P:Ewide.Core.Entity.AreaNumber.SysUsers"> <member name="P:Ewide.Core.Entity.AreaNumber.SysUsers">
<summary> <summary>
多个区域有多个用户绑定自定义数据 多个区域有多个用户绑定自定义数据
@@ -2442,6 +2491,19 @@
</summary> </summary>
<param name="dict"></param> <param name="dict"></param>
</member> </member>
<member name="T:Ewide.Core.Extension.PageInputOrder">
<summary>
通用输入帮助类
</summary>
</member>
<member name="M:Ewide.Core.Extension.PageInputOrder.OrderBuilder(Ewide.Core.PageInputBase,System.Boolean)">
<summary>
排序方式(默认降序)
</summary>
<param name="pageInput"></param>
<param name="descSort">是否降序</param>
<returns></returns>
</member>
<member name="T:Ewide.Core.XnInputBase"> <member name="T:Ewide.Core.XnInputBase">
<summary> <summary>
通用输入扩展参数(带权限) 通用输入扩展参数(带权限)
@@ -2497,6 +2559,21 @@
搜索结束时间 搜索结束时间
</summary> </summary>
</member> </member>
<member name="P:Ewide.Core.PageInputBase.SortField">
<summary>
排序字段
</summary>
</member>
<member name="P:Ewide.Core.PageInputBase.SortOrder">
<summary>
排序方法,默认升序,否则降序(配合antd前端,约定参数为 Ascend,Dscend)
</summary>
</member>
<member name="P:Ewide.Core.PageInputBase.DescStr">
<summary>
降序排序(不要问我为什么是descend不是desc前端约定参数就是这样)
</summary>
</member>
<member name="T:Ewide.Core.XnPageResult`1"> <member name="T:Ewide.Core.XnPageResult`1">
<summary> <summary>
小诺分页列表结果 小诺分页列表结果
@@ -3050,6 +3127,40 @@
<param name="input"></param> <param name="input"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:Ewide.Core.Service.Area.AreaNumberService.AddAreaNumber(Ewide.Core.Service.Area.Dto.AreaNumberInput)">
<summary>
添加一个区域
</summary>
<param name="input"></param>
<returns></returns>
</member>
<member name="M:Ewide.Core.Service.Area.AreaNumberService.DeleteAreaNumber(Ewide.Core.Service.Area.Dto.DeleteAreaNumberInput)">
<summary>
删除一个区域
</summary>
<param name="input"></param>
<returns></returns>
</member>
<member name="M:Ewide.Core.Service.Area.AreaNumberService.GetAreaNumber(System.String)">
<summary>
根据区域代码获取区域信息
</summary>
<param name="code">区域代码</param>
<returns></returns>
</member>
<member name="M:Ewide.Core.Service.Area.AreaNumberService.GetAreaNumberTree">
<summary>
获取区域目录树
</summary>
<returns></returns>
</member>
<member name="M:Ewide.Core.Service.Area.AreaNumberService.UpdateAreaNumber(Ewide.Core.Service.Area.Dto.AreaNumberInput)">
<summary>
更新区域信息
</summary>
<param name="input"></param>
<returns></returns>
</member>
<member name="T:Ewide.Core.Service.AuthService"> <member name="T:Ewide.Core.Service.AuthService">
<summary> <summary>
登录授权相关服务 登录授权相关服务
@@ -5473,6 +5584,11 @@
状态(字典 0正常 1停用 2删除 状态(字典 0正常 1停用 2删除
</summary> </summary>
</member> </member>
<member name="P:Ewide.Core.Service.OrgInput.AreaNumberCode">
<summary>
机构所在区域
</summary>
</member>
<member name="P:Ewide.Core.Service.AddOrgInput.Name"> <member name="P:Ewide.Core.Service.AddOrgInput.Name">
<summary> <summary>
名称 名称
@@ -5483,6 +5599,11 @@
编码 编码
</summary> </summary>
</member> </member>
<member name="P:Ewide.Core.Service.AddOrgInput.AreaNumberCode">
<summary>
机构所在区域
</summary>
</member>
<member name="P:Ewide.Core.Service.DeleteOrgInput.Id"> <member name="P:Ewide.Core.Service.DeleteOrgInput.Id">
<summary> <summary>
机构Id 机构Id
@@ -7058,7 +7179,7 @@
</summary> </summary>
<typeparam name="T"></typeparam> <typeparam name="T"></typeparam>
</member> </member>
<member name="F:Ewide.Core.TreeBuildUtil`1._rootParentId"> <member name="F:Ewide.Core.TreeBuildUtil`1._rootParentIds">
<summary> <summary>
顶级节点的父节点Id(默认0) 顶级节点的父节点Id(默认0)
</summary> </summary>

View File

@@ -0,0 +1,33 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Ewide.Core.Extension
{
/// <summary>
/// 通用输入帮助类
/// </summary>
public class PageInputOrder
{
/// <summary>
/// 排序方式(默认降序)
/// </summary>
/// <param name="pageInput"></param>
/// <param name="descSort">是否降序</param>
/// <returns></returns>
public static string OrderBuilder(PageInputBase pageInput, bool descSort = true)
{
// 约定默认每张表都有Id排序
var orderStr = descSort ? "Id Desc" : "Id Asc";
// 排序是否可用-排序字段和排序顺序都为非空才启用排序
if (!string.IsNullOrEmpty(pageInput.SortField) && !string.IsNullOrEmpty(pageInput.SortOrder))
{
orderStr = $"{pageInput.SortField} {(pageInput.SortOrder == pageInput.DescStr ? "Desc" : "Asc")}";
}
return orderStr;
}
}
}

View File

@@ -56,5 +56,20 @@ namespace Ewide.Core
/// 搜索结束时间 /// 搜索结束时间
/// </summary> /// </summary>
public virtual string SearchEndTime { get; set; } public virtual string SearchEndTime { get; set; }
/// <summary>
/// 排序字段
/// </summary>
public virtual string SortField { get; set; }
/// <summary>
/// 排序方法,默认升序,否则降序(配合antd前端,约定参数为 Ascend,Dscend)
/// </summary>
public virtual string SortOrder { get; set; }
/// <summary>
/// 降序排序(不要问我为什么是descend不是desc前端约定参数就是这样)
/// </summary>
public virtual string DescStr { get; set; } = "descend";
} }
} }

View File

@@ -3,7 +3,10 @@ using Ewide.Core.Service.Area.Dto;
using Furion.DatabaseAccessor; using Furion.DatabaseAccessor;
using Furion.DatabaseAccessor.Extensions; using Furion.DatabaseAccessor.Extensions;
using Furion.DependencyInjection; using Furion.DependencyInjection;
using Furion.DynamicApiController;
using Furion.FriendlyException;
using Mapster; using Mapster;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
@@ -16,37 +19,103 @@ namespace Ewide.Core.Service.Area
public class AreaNumberService : IAreaNumberService, ITransient public class AreaNumberService : IAreaNumberService, ITransient
{ {
private readonly IRepository<AreaNumber> _areaNumberRep; private readonly IRepository<AreaNumber> _areaNumberRep;
private readonly IRepository<SysOrg> _sysOrgRep;
private readonly ISysCacheService _sysCacheService; private readonly ISysCacheService _sysCacheService;
public AreaNumberService(IRepository<AreaNumber> areaNumberRep, ISysCacheService sysCacheService) public AreaNumberService(IRepository<AreaNumber> areaNumberRep, ISysCacheService sysCacheService, IRepository<SysOrg> sysOrgRep)
{ {
_areaNumberRep = areaNumberRep; _areaNumberRep = areaNumberRep;
_sysCacheService = sysCacheService; _sysCacheService = sysCacheService;
_sysOrgRep = sysOrgRep;
} }
/// <summary>
/// 添加一个区域
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public async Task AddAreaNumber(AreaNumberInput input) public async Task AddAreaNumber(AreaNumberInput input)
{ {
await _areaNumberRep.InsertAsync(input.Adapt<AreaNumber>()); CheckInput(input);
await _areaNumberRep.InsertNowAsync(input.Adapt<AreaNumber>());
await _sysCacheService.SetAreaNumber(await _areaNumberRep.DetachedEntities.ToListAsync());
} }
/// <summary>
/// 删除一个区域
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public async Task DeleteAreaNumber(DeleteAreaNumberInput input) public async Task DeleteAreaNumber(DeleteAreaNumberInput input)
{ {
var areaNumber= await _areaNumberRep.FirstOrDefaultAsync(p=>p.Code==input.Code); var areaNumber = await _areaNumberRep.FirstOrDefaultAsync(p => p.Code == input.Code);
await areaNumber.DeleteAsync(); if (await _sysOrgRep.DetachedEntities.AnyAsync(o => o.AreaNumberCode == input.Code))
{
throw Oops.Oh("不能删除已包含区域的组织");
}
await areaNumber.DeleteNowAsync();
await _sysCacheService.SetAreaNumber(await _areaNumberRep.DetachedEntities.ToListAsync());
} }
/// <summary>
/// 根据区域代码获取区域信息
/// </summary>
/// <param name="code">区域代码</param>
/// <returns></returns>
public async Task<AreaNumber> GetAreaNumber(string code) public async Task<AreaNumber> GetAreaNumber(string code)
{ {
return await _areaNumberRep.DetachedEntities.FirstOrDefaultAsync(a => a.Code == code); var cachedAreaNumbers = await _sysCacheService.GetAreaNumber();
if (cachedAreaNumbers == null || cachedAreaNumbers.Count < 0)
{
cachedAreaNumbers = await _areaNumberRep.DetachedEntities.ToListAsync();
await _sysCacheService.SetAreaNumber(cachedAreaNumbers);
}
return cachedAreaNumbers.FirstOrDefault(a => a.Code == code);
}
/// <summary>
/// 获取区域目录树
/// </summary>
/// <returns></returns>
public async Task<List<AreaTreeNode>> GetAreaNumberTree()
{
var cachedAreaNumbers = await _sysCacheService.GetAreaNumber();
if (cachedAreaNumbers == null || cachedAreaNumbers.Count < 0)
{
cachedAreaNumbers = await _areaNumberRep.DetachedEntities.ToListAsync();
await _sysCacheService.SetAreaNumber(cachedAreaNumbers);
}
return new TreeBuildUtil<AreaTreeNode>().DoTreeBuild(cachedAreaNumbers.Select(u => new AreaTreeNode
{
Code = u.Code,
ParentCode = u.ParentCode,
Name = u.Name,
LevelType = u.LevelType,
Note = u.Note
}).ToList());
} }
public async Task<List<AreaNumber>> GetAreaNumberWithChildren(string code) public async Task<List<AreaNumber>> GetAreaNumberWithChildren(string code)
{ {
return await _areaNumberRep.DetachedEntities.Where(a => a.Code.StartsWith(code)).ToListAsync(); return await _areaNumberRep.DetachedEntities.Where(a => a.Code.StartsWith(code)).ToListAsync();
} }
/// <summary>
/// 更新区域信息
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public async Task UpdateAreaNumber(AreaNumberInput input) public async Task UpdateAreaNumber(AreaNumberInput input)
{ {
await _areaNumberRep.UpdateAsync(input.Adapt<AreaNumber>()); CheckInput(input);
var area = input.Adapt<AreaNumber>();
await area.UpdateNowAsync();
await _sysCacheService.SetAreaNumber(await _areaNumberRep.DetachedEntities.ToListAsync());
}
private bool CheckInput(AreaNumberInput input)
{
//检查level和区域长度
if (false)
{
throw Oops.Oh("数据异常");
}
//检查是否有子节点
return true;
} }
} }
} }

View File

@@ -16,6 +16,14 @@ namespace Ewide.Core.Service.Area.Dto
public string Note { get; set; } public string Note { get; set; }
public int Sort { get; set; } public int Sort { get; set; }
} }
public class UpdateAreaNumberInput
{
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 public class DeleteAreaNumberInput
{ {
[Required(ErrorMessage ="区域代码不可为空")] [Required(ErrorMessage ="区域代码不可为空")]

View File

@@ -0,0 +1,33 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Ewide.Core.Service.Area.Dto
{
public class AreaNumberOutput:AreaNumberInput
{
public string ParentCode { get; set; }
}
public class AreaTreeNode : AreaNumberOutput, ITreeNode
{
public List<AreaTreeNode> Children { get; set; } = new List<AreaTreeNode>();
public string GetId()
{
return Code;
}
public string GetPid()
{
return ParentCode;
}
public void SetChildren(IList children)
{
Children = (List<AreaTreeNode>)children;
}
}
}

View File

@@ -15,5 +15,7 @@ namespace Ewide.Core.Service.Area
Task UpdateAreaNumber(AreaNumberInput input); Task UpdateAreaNumber(AreaNumberInput input);
Task<AreaNumber> GetAreaNumber(string code); Task<AreaNumber> GetAreaNumber(string code);
Task<List<AreaNumber>> GetAreaNumberWithChildren(string code); Task<List<AreaNumber>> GetAreaNumberWithChildren(string code);
Task<List<AreaTreeNode>> GetAreaNumberTree();
} }
} }

View File

@@ -1,4 +1,5 @@
using System.Collections.Generic; using Ewide.Core.Entity;
using System.Collections.Generic;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace Ewide.Core.Service namespace Ewide.Core.Service
@@ -14,6 +15,8 @@ namespace Ewide.Core.Service
Task SetDataScope(string userId, List<string> dataScopes); Task SetDataScope(string userId, List<string> dataScopes);
Task SetMenu(string userId, string appCode, List<AntDesignTreeNode> menus); Task SetMenu(string userId, string appCode, List<AntDesignTreeNode> menus);
Task SetPermission(string userId, List<string> permissions); Task SetPermission(string userId, List<string> permissions);
Task<List<AreaNumber>> GetAreaNumber();
Task SetAreaNumber(List<AreaNumber> areaNumbers);
Task<bool> SetAsync(string key, object value); Task<bool> SetAsync(string key, object value);
Task<string> GetAsync(string key); Task<string> GetAsync(string key);
Task<T> GetAsync<T>(string key); Task<T> GetAsync<T>(string key);

View File

@@ -1,4 +1,5 @@
using Furion.DependencyInjection; using Ewide.Core.Entity;
using Furion.DependencyInjection;
using Furion.DynamicApiController; using Furion.DynamicApiController;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
@@ -165,5 +166,14 @@ namespace Ewide.Core.Service
{ {
return _cache.GetAsync<T>(key); return _cache.GetAsync<T>(key);
} }
public Task<List<AreaNumber>> GetAreaNumber()
{
return _cache.GetAsync<List<AreaNumber>>(CommonConst.CACHE_AREA_NUMBER);
}
public async Task SetAreaNumber(List<AreaNumber> areaNumbers)
{
await _cache.SetAsync(CommonConst.CACHE_AREA_NUMBER,areaNumbers);
}
} }
} }

View File

@@ -1,4 +1,5 @@
using Furion.DatabaseAccessor; using Ewide.Core.Extension;
using Furion.DatabaseAccessor;
using Furion.DatabaseAccessor.Extensions; using Furion.DatabaseAccessor.Extensions;
using Furion.DependencyInjection; using Furion.DependencyInjection;
using Furion.DynamicApiController; using Furion.DynamicApiController;
@@ -7,6 +8,7 @@ using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using System; using System;
using System.Linq; using System.Linq;
using System.Linq.Dynamic.Core;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace Ewide.Core.Service namespace Ewide.Core.Service
@@ -41,7 +43,7 @@ namespace Ewide.Core.Service
.Where(success, u => u.Success == input.Success.Value) .Where(success, u => u.Success == input.Success.Value)
.Where(searchBeginTime, u => u.OpTime >= DateTime.Parse(input.SearchBeginTime.Trim()) && .Where(searchBeginTime, u => u.OpTime >= DateTime.Parse(input.SearchBeginTime.Trim()) &&
u.OpTime <= DateTime.Parse(input.SearchEndTime.Trim())) u.OpTime <= DateTime.Parse(input.SearchEndTime.Trim()))
.OrderByDescending(u => u.Id) .OrderBy(PageInputOrder.OrderBuilder(input)) // 封装了任意字段排序示例
.Select(u => u.Adapt<OpLogOutput>()) .Select(u => u.Adapt<OpLogOutput>())
.ToPagedListAsync(input.PageNo, input.PageSize); .ToPagedListAsync(input.PageNo, input.PageSize);
return XnPageResult<OpLogOutput>.PageResult(opLogs); return XnPageResult<OpLogOutput>.PageResult(opLogs);

View File

@@ -46,6 +46,10 @@ namespace Ewide.Core.Service
/// 状态(字典 0正常 1停用 2删除 /// 状态(字典 0正常 1停用 2删除
/// </summary> /// </summary>
public int Status { get; set; } public int Status { get; set; }
/// <summary>
/// 机构所在区域
/// </summary>
public virtual string AreaNumberCode { get; set; }
} }
public class AddOrgInput : OrgInput public class AddOrgInput : OrgInput
@@ -61,6 +65,11 @@ namespace Ewide.Core.Service
/// </summary> /// </summary>
[Required(ErrorMessage = "机构编码不能为空")] [Required(ErrorMessage = "机构编码不能为空")]
public override string Code { get; set; } public override string Code { get; set; }
/// <summary>
/// 机构所在区域
/// </summary>
[Required(ErrorMessage = "机构所在区域不能为空")]
public override string AreaNumberCode { get; set; }
} }
public class DeleteOrgInput public class DeleteOrgInput

View File

@@ -83,5 +83,9 @@ namespace Ewide.Core.Service
public class GrantRoleDataInput : GrantRoleMenuInput public class GrantRoleDataInput : GrantRoleMenuInput
{ {
}
public class GrantAreaDataInput : GrantRoleMenuInput
{
} }
} }

View File

@@ -11,6 +11,6 @@ namespace Ewide.Core.Service.Role
Task DeleteRoleAreaListByAreaCodeList(List<string> areaCodeList); Task DeleteRoleAreaListByAreaCodeList(List<string> areaCodeList);
Task DeleteRoleAreaListByRoleId(string roleId); Task DeleteRoleAreaListByRoleId(string roleId);
Task<List<string>> GetRoleAreaCodeList(List<string> roleIdList); Task<List<string>> GetRoleAreaCodeList(List<string> roleIdList);
Task GrantArea(UpdateRoleInput input); Task GrantArea(GrantAreaDataInput input);
} }
} }

View File

@@ -45,7 +45,7 @@ namespace Ewide.Core.Service.Role
} }
public async Task GrantArea(UpdateRoleInput input) public async Task GrantArea(GrantAreaDataInput input)
{ {
var dataScopes = await _sysRoleAreaRep.Where(u => u.SysRoleId == input.Id).ToListAsync(); var dataScopes = await _sysRoleAreaRep.Where(u => u.SysRoleId == input.Id).ToListAsync();
dataScopes.ForEach(u => dataScopes.ForEach(u =>

View File

@@ -1,6 +1,8 @@
using Furion.DatabaseAccessor; using Ewide.Core.Service.Role;
using Furion.DatabaseAccessor;
using Furion.DatabaseAccessor.Extensions; using Furion.DatabaseAccessor.Extensions;
using Furion.DependencyInjection; using Furion.DependencyInjection;
using Mapster;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
@@ -14,10 +16,11 @@ namespace Ewide.Core.Service
public class SysRoleDataScopeService : ISysRoleDataScopeService, ITransient public class SysRoleDataScopeService : ISysRoleDataScopeService, ITransient
{ {
private readonly IRepository<SysRoleDataScope> _sysRoleDataScopeRep; // 角色数据范围表仓储 private readonly IRepository<SysRoleDataScope> _sysRoleDataScopeRep; // 角色数据范围表仓储
private readonly ISysRoleAreaService _sysRoleAreaService;
public SysRoleDataScopeService(IRepository<SysRoleDataScope> sysRoleDataScopeRep) public SysRoleDataScopeService(IRepository<SysRoleDataScope> sysRoleDataScopeRep, ISysRoleAreaService sysRoleAreaService)
{ {
_sysRoleDataScopeRep = sysRoleDataScopeRep; _sysRoleDataScopeRep = sysRoleDataScopeRep;
_sysRoleAreaService = sysRoleAreaService;
} }
/// <summary> /// <summary>
@@ -28,6 +31,11 @@ namespace Ewide.Core.Service
[UnitOfWork] [UnitOfWork]
public async Task GrantDataScope(GrantRoleDataInput input) public async Task GrantDataScope(GrantRoleDataInput input)
{ {
if (new[] { (int)DataScopeType.AREA, (int)DataScopeType.AREA_WITH_CHILD }.Contains(input.DataScopeType))
{
await _sysRoleAreaService.GrantArea(input.Adapt<GrantAreaDataInput>());
return;
}
var dataScopes = await _sysRoleDataScopeRep.DetachedEntities.Where(u => u.SysRoleId == input.Id).ToListAsync(); var dataScopes = await _sysRoleDataScopeRep.DetachedEntities.Where(u => u.SysRoleId == input.Id).ToListAsync();
dataScopes.ForEach(u => dataScopes.ForEach(u =>
{ {

View File

@@ -46,6 +46,22 @@ namespace Ewide.Core.Service
SysOrgId = u SysOrgId = u
}.Insert(); }.Insert();
}); });
var areas = await _sysUserAreaRep.Where(u => u.SysUserId == input.Id).ToListAsync();
areas.ForEach(u =>
{
u.Delete();
});
input.GrantAreaCodeList.ForEach(u =>
{
new SysUserArea
{
SysUserId = input.Id,
AreaNumberCode = u
}.Insert();
});
} }
/// <summary> /// <summary>

View File

@@ -1,4 +1,5 @@
using System.Collections; using System;
using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
namespace Ewide.Core namespace Ewide.Core
@@ -36,7 +37,7 @@ namespace Ewide.Core
/// <summary> /// <summary>
/// 顶级节点的父节点Id(默认0) /// 顶级节点的父节点Id(默认0)
/// </summary> /// </summary>
private readonly string _rootParentId = System.Guid.Empty.ToString().ToLower(); private readonly List<string> _rootParentIds = new List<string> {string.Empty,Guid.Empty.ToString() };
/// <summary> /// <summary>
/// 构造树节点 /// 构造树节点
@@ -50,7 +51,7 @@ namespace Ewide.Core
var results = new List<T>(); var results = new List<T>();
nodes.ForEach(u => nodes.ForEach(u =>
{ {
if (_rootParentId == u.GetPid()) if (_rootParentIds.Contains(u.GetPid()))
results.Add(u); results.Add(u);
}); });
return results; return results;

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,25 @@
using Microsoft.EntityFrameworkCore.Migrations;
namespace Ewide.Database.Migrations.Migrations
{
public partial class removeAreaNumberParent : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "ParentCode",
table: "ewide_area_number");
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<string>(
name: "ParentCode",
table: "ewide_area_number",
type: "varchar(10) CHARACTER SET utf8mb4",
maxLength: 10,
nullable: true,
comment: "父级区域代码");
}
}
}

View File

@@ -102,11 +102,6 @@ namespace Ewide.Database.Migrations.Migrations
.HasColumnType("longtext CHARACTER SET utf8mb4") .HasColumnType("longtext CHARACTER SET utf8mb4")
.HasComment("备注"); .HasComment("备注");
b.Property<string>("ParentCode")
.HasMaxLength(10)
.HasColumnType("varchar(10) CHARACTER SET utf8mb4")
.HasComment("父级区域代码");
b.Property<string>("ShowCode") b.Property<string>("ShowCode")
.HasMaxLength(10) .HasMaxLength(10)
.HasColumnType("varchar(10) CHARACTER SET utf8mb4") .HasColumnType("varchar(10) CHARACTER SET utf8mb4")

View File

@@ -144,7 +144,7 @@ export default {
onCloseContentWindow(key) { onCloseContentWindow(key) {
key = key || this.tabActived; key = key || this.tabActived;
const i = this.$_.findIndex(this.panes, (p) => p.key === key); const i = this.$_.findIndex(this.panes, (p) => p.key === key && p.closable);
this.panes.splice(i, 1); this.panes.splice(i, 1);
if (this.panes.length) { if (this.panes.length) {