feat 基地/租户tree
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
using Dlhis.User.Api.Response;
|
||||
using Dlhis.Sys.Api.Response;
|
||||
using Kurisu.Core.Result;
|
||||
using Kurisu.RemoteCall.Attributes;
|
||||
|
||||
@@ -18,6 +18,11 @@ public interface ITenantApi
|
||||
[Get("/api/tenants/list")]
|
||||
Task<DefaultApiResult<List<TenantResponse>>> GetTenantsAsync();
|
||||
|
||||
|
||||
[Auth]
|
||||
[Get("/api/tenants/tree")]
|
||||
Task<DefaultApiResult<List<TenantTreeResponse>>> GetTenantTreeAsync();
|
||||
|
||||
/// <summary>
|
||||
/// 获取所有租户(内部使用)
|
||||
/// </summary>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
namespace Dlhis.User.Api.Response;
|
||||
namespace Dlhis.Sys.Api.Response;
|
||||
|
||||
public class TenantResponse
|
||||
{
|
||||
|
||||
12
Src/Dlhis.Sys.Api/Response/TenantTreeResponse.cs
Normal file
12
Src/Dlhis.Sys.Api/Response/TenantTreeResponse.cs
Normal file
@@ -0,0 +1,12 @@
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace Dlhis.Sys.Api.Response;
|
||||
|
||||
public class TenantTreeResponse : TenantResponse
|
||||
{
|
||||
/// <summary>
|
||||
/// 下级
|
||||
/// </summary>
|
||||
[JsonProperty(Order = 99)]
|
||||
public List<TenantTreeResponse> Next { get; set; }
|
||||
}
|
||||
@@ -51,6 +51,16 @@ public class TenantsController : ControllerBase
|
||||
return await _tenantService.GetListAsync();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 租户树
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[HttpGet("tree")]
|
||||
public async Task<List<TenantTreeResponse>> GetTreeAsync()
|
||||
{
|
||||
return await _tenantService.GetTreeAsync();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取租户
|
||||
/// </summary>
|
||||
|
||||
@@ -6,6 +6,11 @@ public class TenantSaveRequest
|
||||
{
|
||||
public int? Id { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 上级
|
||||
/// </summary>
|
||||
public string PCode { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 代码
|
||||
/// </summary>
|
||||
|
||||
12
Src/Dlhis.Sys/Identity/Response/TenantTreeResponse.cs
Normal file
12
Src/Dlhis.Sys/Identity/Response/TenantTreeResponse.cs
Normal file
@@ -0,0 +1,12 @@
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace Dlhis.Sys.Identity.Response;
|
||||
|
||||
public class TenantTreeResponse : TenantResponse
|
||||
{
|
||||
/// <summary>
|
||||
/// 下级
|
||||
/// </summary>
|
||||
[JsonProperty(Order = 99)]
|
||||
public List<TenantTreeResponse> Next { get; set; }
|
||||
}
|
||||
@@ -10,6 +10,8 @@ public interface ITenantService : IScopeDependency
|
||||
|
||||
Task<List<TenantResponse>> GetListAsync();
|
||||
|
||||
Task<List<TenantTreeResponse>> GetTreeAsync();
|
||||
|
||||
Task<TenantResponse> GetTenantByCode(string code);
|
||||
|
||||
Task<List<TenantResponse>> GetMyTenantsAsync();
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using Dlhis.Entity.Sys.Entities;
|
||||
using Dlhis.Entity.Basic.Entity;
|
||||
using Dlhis.Entity.Sys.Entities;
|
||||
using Dlhis.Sys.Identity.Request;
|
||||
using Dlhis.Sys.Identity.Response;
|
||||
using Kurisu.AspNetCore.Utils.Extensions;
|
||||
@@ -14,11 +15,9 @@ public class TenantService : ITenantService
|
||||
private readonly IDbContext _dbContext;
|
||||
private readonly ICurrentUser _currentUser;
|
||||
|
||||
public TenantService(IDbContext dbContext, IConfiguration configuration, ICurrentUser currentUser)
|
||||
public TenantService(IDbContext dbContext, ICurrentUser currentUser)
|
||||
{
|
||||
var identityConnection = configuration.GetSection("SqlSugarOptions:IdentityConnectionString").Value;
|
||||
dbContext.Client.CurrentConnectionConfig.ConnectionString = identityConnection;
|
||||
_dbContext = dbContext;
|
||||
_dbContext = dbContext.ChangeDb("identity");
|
||||
_currentUser = currentUser;
|
||||
}
|
||||
|
||||
@@ -52,6 +51,7 @@ public class TenantService : ITenantService
|
||||
{
|
||||
await _dbContext.InsertAsync(new TenantEntity
|
||||
{
|
||||
PCode = request.PCode,
|
||||
Code = request.Code,
|
||||
Name = request.Name,
|
||||
});
|
||||
@@ -89,4 +89,29 @@ public class TenantService : ITenantService
|
||||
|
||||
return myTenants;
|
||||
}
|
||||
|
||||
public async Task<List<TenantTreeResponse>> GetTreeAsync()
|
||||
{
|
||||
var tenants = await _dbContext.Queryable<TenantEntity>()
|
||||
.Select<TenantTreeResponse>()
|
||||
.ToListAsync();
|
||||
|
||||
var tops = tenants.Where(x => x.PCode.IsEmpty()).ToList();
|
||||
foreach (var item in tops)
|
||||
{
|
||||
RecursionGetNext(item, tenants);
|
||||
}
|
||||
return tops;
|
||||
}
|
||||
|
||||
|
||||
private void RecursionGetNext(TenantTreeResponse current, List<TenantTreeResponse> data)
|
||||
{
|
||||
var next = data.Where(x => x.PCode == current.Code).ToList();
|
||||
current.Next = next;
|
||||
foreach (var item in next)
|
||||
{
|
||||
RecursionGetNext(item, data);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@ using Dlhis.Sys.Menu.Services;
|
||||
using Dlhis.Sys.Menu.Response;
|
||||
using Dlhis.Sys.Menu.Request;
|
||||
using Dlhis.Entity.Sys.Enums;
|
||||
using Kurisu.AspNetCore.DataAccess.SqlSugar.Aop;
|
||||
|
||||
namespace Dlhis.Sys.Menu.Controllers;
|
||||
|
||||
|
||||
@@ -1,8 +1,5 @@
|
||||
using Kurisu.AspNetCore.Startup;
|
||||
using Kurisu.Core.DataAccess.Entity;
|
||||
using Kurisu.SqlSugar.Extensions;
|
||||
using Kurisu.SqlSugar.Services;
|
||||
using Microsoft.AspNetCore.Mvc.Filters;
|
||||
using SqlSugar;
|
||||
|
||||
namespace Dlhis.Sys;
|
||||
@@ -37,102 +34,3 @@ public class SqlSugarPack : BaseAppPack
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 日志
|
||||
/// </summary>
|
||||
[AttributeUsage(AttributeTargets.Method)]
|
||||
public class LogAttribute : Attribute, IAsyncActionFilter
|
||||
{
|
||||
public LogAttribute(string title)
|
||||
{
|
||||
Title = title;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public string Title { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 是否处理差异
|
||||
/// </summary>
|
||||
public bool Diff { get; set; }
|
||||
|
||||
|
||||
public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
|
||||
{
|
||||
PreSetting(context.HttpContext);
|
||||
await next();
|
||||
}
|
||||
|
||||
private void PreSetting(HttpContext httpContext)
|
||||
{
|
||||
var options = httpContext.RequestServices.GetService<ISqlSugarOptionsService>();
|
||||
|
||||
options.Title = Title;
|
||||
options.Diff = Diff;
|
||||
options.BatchNo = Guid.NewGuid();
|
||||
options.RoutePath = httpContext.Request.Path.Value;
|
||||
options.RaiseTime = DateTime.Now;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 事务
|
||||
/// </summary>
|
||||
[AttributeUsage(AttributeTargets.Method)]
|
||||
public class TransactionalAttribute : Attribute, IAsyncActionFilter
|
||||
{
|
||||
public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
|
||||
{
|
||||
var dbContext = context.HttpContext.RequestServices.GetRequiredService<ISqlSugarClient>();
|
||||
await dbContext.Ado.BeginTranAsync();
|
||||
try
|
||||
{
|
||||
var result = await next();
|
||||
if (result.Exception != null)
|
||||
{
|
||||
throw result.Exception;
|
||||
}
|
||||
else
|
||||
{
|
||||
await dbContext.Ado.CommitTranAsync();
|
||||
}
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
await dbContext.Ado.RollbackTranAsync();
|
||||
throw;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 忽略租户
|
||||
/// </summary>
|
||||
[AttributeUsage(AttributeTargets.Method)]
|
||||
public class IgnoreTenantAttribute : Attribute, IAsyncActionFilter
|
||||
{
|
||||
public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
|
||||
{
|
||||
var dbContext = context.HttpContext.RequestServices.GetRequiredService<ISqlSugarClient>();
|
||||
var options = context.HttpContext!.RequestServices.GetService<ISqlSugarOptionsService>();
|
||||
try
|
||||
{
|
||||
dbContext.QueryFilter.ClearAndBackup<ITenantId>();
|
||||
options.IgnoreTenant = true;
|
||||
await next();
|
||||
}
|
||||
finally
|
||||
{
|
||||
options.IgnoreTenant = false;
|
||||
dbContext.QueryFilter.Restore();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user