165 lines
7.4 KiB
C#
165 lines
7.4 KiB
C#
|
|
using Microsoft.Extensions.Configuration;
|
|||
|
|
using SqlSugar;
|
|||
|
|
using System.Text.Json;
|
|||
|
|
using YY.Admin.Core.Session;
|
|||
|
|
using YY.Admin.Services.Service.Jeecg;
|
|||
|
|
|
|||
|
|
namespace YY.Admin.Services.Service.Tenant
|
|||
|
|
{
|
|||
|
|
public class SysTenantSyncService : ISysTenantSyncService, ISingletonDependency
|
|||
|
|
{
|
|||
|
|
private readonly ISqlSugarClient _dbContext;
|
|||
|
|
private readonly IConfiguration _configuration;
|
|||
|
|
private readonly ISysCacheService _sysCacheService;
|
|||
|
|
private readonly IJeecgBackendGateway _jeecgGateway;
|
|||
|
|
|
|||
|
|
public SysTenantSyncService(
|
|||
|
|
ISqlSugarClient dbContext,
|
|||
|
|
IConfiguration configuration,
|
|||
|
|
ISysCacheService sysCacheService,
|
|||
|
|
IJeecgBackendGateway jeecgGateway)
|
|||
|
|
{
|
|||
|
|
_dbContext = dbContext;
|
|||
|
|
_configuration = configuration;
|
|||
|
|
_sysCacheService = sysCacheService;
|
|||
|
|
_jeecgGateway = jeecgGateway;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public async Task<SqlSugarPagedList<TenantOutput>> PageAsync(PageTenantInput input)
|
|||
|
|
{
|
|||
|
|
var status = input.Status;
|
|||
|
|
var statusValue = status.GetValueOrDefault();
|
|||
|
|
var query = _dbContext.Queryable<SysTenant>().ClearFilter()
|
|||
|
|
.WhereIF(!string.IsNullOrWhiteSpace(input.Name), t => t.Title!.Contains(input.Name!))
|
|||
|
|
.WhereIF(status.HasValue, t => t.Status == statusValue)
|
|||
|
|
.OrderBy(t => t.Id);
|
|||
|
|
|
|||
|
|
RefAsync<int> total = 0;
|
|||
|
|
var list = await query.ToPageListAsync(input.Page, input.PageSize, total);
|
|||
|
|
var items = list.Select(t => new TenantOutput
|
|||
|
|
{
|
|||
|
|
Id = t.Id,
|
|||
|
|
Title = t.Title,
|
|||
|
|
Logo = t.Logo,
|
|||
|
|
Status = t.Status,
|
|||
|
|
CreateTime = t.CreateTime,
|
|||
|
|
UpdateTime = t.UpdateTime
|
|||
|
|
}).ToList();
|
|||
|
|
|
|||
|
|
return new SqlSugarPagedList<TenantOutput>
|
|||
|
|
{
|
|||
|
|
Page = input.Page,
|
|||
|
|
PageSize = input.PageSize,
|
|||
|
|
Total = total,
|
|||
|
|
TotalPages = input.PageSize > 0 ? (int)Math.Ceiling(total / (double)input.PageSize) : 0,
|
|||
|
|
HasNextPage = input.PageSize > 0 && input.Page < (int)Math.Ceiling(total / (double)input.PageSize),
|
|||
|
|
HasPrevPage = input.Page > 1,
|
|||
|
|
Items = items
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public async Task<int> SyncFromJeecgAsync()
|
|||
|
|
{
|
|||
|
|
var userId = AppSession.CurrentUser?.Id;
|
|||
|
|
if (!userId.HasValue || userId.Value <= 0) return 0;
|
|||
|
|
|
|||
|
|
var tokenKey = $"jeecg:token:{userId.Value}";
|
|||
|
|
var token = _sysCacheService.Get<string>(tokenKey);
|
|||
|
|
if (string.IsNullOrWhiteSpace(token)) return 0;
|
|||
|
|
|
|||
|
|
var baseUrl = _configuration.GetValue<string>("JeecgIntegration:BaseUrl")?.TrimEnd('/');
|
|||
|
|
if (string.IsNullOrWhiteSpace(baseUrl)) return 0;
|
|||
|
|
|
|||
|
|
var tenantListPath = _configuration.GetValue<string>("JeecgIntegration:TenantListPath") ?? "/sys/tenant/list";
|
|||
|
|
var requestUrl = $"{baseUrl}{tenantListPath}?pageNo=1&pageSize=200";
|
|||
|
|
var headers = new Dictionary<string, string> { ["X-Access-Token"] = token };
|
|||
|
|
var json = await _jeecgGateway.ExecuteGetStringAsync(requestUrl, headers);
|
|||
|
|
if (string.IsNullOrWhiteSpace(json)) return 0;
|
|||
|
|
using var doc = JsonDocument.Parse(json);
|
|||
|
|
var root = doc.RootElement;
|
|||
|
|
if (!(root.TryGetProperty("success", out var successEl) && successEl.GetBoolean())) return 0;
|
|||
|
|
if (!root.TryGetProperty("result", out var resultEl) || resultEl.ValueKind != JsonValueKind.Object) return 0;
|
|||
|
|
if (!resultEl.TryGetProperty("records", out var recordsEl) || recordsEl.ValueKind != JsonValueKind.Array) return 0;
|
|||
|
|
|
|||
|
|
var templateTenant = await _dbContext.Queryable<SysTenant>().ClearFilter().OrderBy(t => t.Id).FirstAsync();
|
|||
|
|
if (templateTenant == null) return 0;
|
|||
|
|
|
|||
|
|
var synced = 0;
|
|||
|
|
foreach (var tenantEl in recordsEl.EnumerateArray())
|
|||
|
|
{
|
|||
|
|
if (!tenantEl.TryGetProperty("id", out var idEl) || !idEl.TryGetInt64(out var tenantId) || tenantId <= 0) continue;
|
|||
|
|
var name = tenantEl.TryGetProperty("name", out var nameEl) ? nameEl.GetString() : null;
|
|||
|
|
var logo = tenantEl.TryGetProperty("companyLogo", out var logoEl) ? logoEl.GetString() : null;
|
|||
|
|
var status = ResolveTenantStatus(tenantEl);
|
|||
|
|
|
|||
|
|
var exists = await _dbContext.Queryable<SysTenant>().ClearFilter().Where(t => t.Id == tenantId).AnyAsync();
|
|||
|
|
if (exists)
|
|||
|
|
{
|
|||
|
|
await _dbContext.Updateable<SysTenant>()
|
|||
|
|
.SetColumns(t => t.Title == (string.IsNullOrWhiteSpace(name) ? t.Title : name))
|
|||
|
|
.SetColumns(t => t.Logo == logo)
|
|||
|
|
.SetColumns(t => t.Status == status)
|
|||
|
|
.SetColumns(t => t.UpdateTime == DateTime.Now)
|
|||
|
|
.Where(t => t.Id == tenantId)
|
|||
|
|
.ExecuteCommandAsync();
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
var entity = new SysTenant
|
|||
|
|
{
|
|||
|
|
Id = tenantId,
|
|||
|
|
UserId = templateTenant.UserId,
|
|||
|
|
OrgId = templateTenant.OrgId,
|
|||
|
|
TenantType = templateTenant.TenantType,
|
|||
|
|
DbType = templateTenant.DbType,
|
|||
|
|
Connection = templateTenant.Connection,
|
|||
|
|
ConfigId = templateTenant.ConfigId,
|
|||
|
|
SlaveConnections = templateTenant.SlaveConnections,
|
|||
|
|
EnableReg = templateTenant.EnableReg,
|
|||
|
|
RegWayId = templateTenant.RegWayId,
|
|||
|
|
Logo = logo,
|
|||
|
|
Title = string.IsNullOrWhiteSpace(name) ? $"租户{tenantId}" : name,
|
|||
|
|
ViceTitle = templateTenant.ViceTitle,
|
|||
|
|
ViceDesc = templateTenant.ViceDesc,
|
|||
|
|
Watermark = templateTenant.Watermark,
|
|||
|
|
Copyright = templateTenant.Copyright,
|
|||
|
|
Icp = templateTenant.Icp,
|
|||
|
|
IcpUrl = templateTenant.IcpUrl,
|
|||
|
|
OrderNo = templateTenant.OrderNo,
|
|||
|
|
Remark = templateTenant.Remark,
|
|||
|
|
Status = status,
|
|||
|
|
CreateTime = DateTime.Now,
|
|||
|
|
UpdateTime = DateTime.Now
|
|||
|
|
};
|
|||
|
|
await _dbContext.Insertable(entity).ExecuteCommandAsync();
|
|||
|
|
}
|
|||
|
|
synced++;
|
|||
|
|
}
|
|||
|
|
return synced;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 安全解析Jeecg租户状态,避免null或字符串导致异常
|
|||
|
|
/// </summary>
|
|||
|
|
private static StatusEnum ResolveTenantStatus(JsonElement tenantEl)
|
|||
|
|
{
|
|||
|
|
if (!tenantEl.TryGetProperty("status", out var statusEl))
|
|||
|
|
{
|
|||
|
|
return StatusEnum.Disable;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (statusEl.ValueKind == JsonValueKind.Number && statusEl.TryGetInt32(out var numStatus))
|
|||
|
|
{
|
|||
|
|
return numStatus == 1 ? StatusEnum.Enable : StatusEnum.Disable;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (statusEl.ValueKind == JsonValueKind.String && int.TryParse(statusEl.GetString(), out var strStatus))
|
|||
|
|
{
|
|||
|
|
return strStatus == 1 ? StatusEnum.Enable : StatusEnum.Disable;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return StatusEnum.Disable;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|