Files
qhmes/yy-admin-master/YY.Admin.Services/Service/Tenant/SysTenantSyncService.cs

165 lines
7.4 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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;
}
}
}