SourceDomainTenantResolver.cs 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. using SqlSugar;
  2. namespace Admin.NET.Plugin.AiDOP.Infrastructure;
  3. /// <summary>
  4. /// Domain ↔ Ai-DOP tenant 解析器。
  5. /// 直接查询 sys_tenant 系统租户表验证租户有效性,无需手动维护映射表。
  6. /// Domain 优先取 GeneralizedCodeMaster.SystemConfig.CompanyCode,回落 8010。
  7. /// </summary>
  8. public sealed class SourceDomainTenantResolver : ITransient
  9. {
  10. private readonly ISqlSugarClient _db;
  11. public SourceDomainTenantResolver(ISqlSugarClient db) => _db = db;
  12. /// <summary>
  13. /// 根据 sourceCode + domain 解析 tenant_id。
  14. /// 直接查询 sys_tenant:返回第一个启用租户的 Id。
  15. /// </summary>
  16. public async Task<long> ResolveTenantIdAsync(
  17. string sourceCode,
  18. string domain,
  19. CancellationToken cancellationToken = default)
  20. {
  21. if (string.IsNullOrWhiteSpace(sourceCode) || string.IsNullOrWhiteSpace(domain))
  22. throw new InvalidOperationException("sourceCode/domain 不能为空");
  23. var rows = await _db.Ado.SqlQueryAsync<MapRow>(
  24. """
  25. SELECT Id AS TenantId
  26. FROM SysTenant
  27. WHERE Status = 1
  28. ORDER BY Id
  29. LIMIT 1
  30. """);
  31. if (rows.Count == 0)
  32. throw new InvalidOperationException("未找到启用的系统租户");
  33. if (rows[0].TenantId <= 0)
  34. throw new InvalidOperationException("系统租户 Id 非法");
  35. return rows[0].TenantId;
  36. }
  37. /// <summary>
  38. /// 根据 sourceCode + tenantId 解析 domain。
  39. /// 先在 sys_tenant 验证租户存在且启用,再从 GeneralizedCodeMaster 取公司代码,回落 8010。
  40. /// </summary>
  41. public async Task<string> ResolveDomainAsync(
  42. string sourceCode,
  43. long tenantId,
  44. CancellationToken cancellationToken = default)
  45. {
  46. if (string.IsNullOrWhiteSpace(sourceCode) || tenantId <= 0)
  47. throw new InvalidOperationException("sourceCode/tenantId 非法");
  48. // 验证租户在 sys_tenant 中存在且启用
  49. var tenantExists = await _db.Ado.GetIntAsync(
  50. "SELECT COUNT(1) FROM SysTenant WHERE Id = @TenantId AND Status = 1",
  51. new List<SugarParameter> { new("@TenantId", tenantId) });
  52. if (tenantExists <= 0)
  53. throw new InvalidOperationException($"租户不存在或未启用:tenant={tenantId}");
  54. // 优先从 GeneralizedCodeMaster 取公司代码,回落 8010
  55. var domainRows = await _db.Ado.SqlQueryAsync<DomainRow>(
  56. """
  57. SELECT Domain
  58. FROM GeneralizedCodeMaster
  59. WHERE FldName='SystemConfig' AND Val='CompanyCode'
  60. ORDER BY RecID LIMIT 1
  61. """);
  62. var domain = domainRows.FirstOrDefault()?.Domain;
  63. return string.IsNullOrWhiteSpace(domain) ? "8010" : domain.Trim();
  64. }
  65. private sealed class MapRow
  66. {
  67. public long TenantId { get; set; }
  68. }
  69. private sealed class DomainRow
  70. {
  71. public string? Domain { get; set; }
  72. }
  73. }