MdpNeutralSourceGate.cs 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. using Microsoft.Extensions.Logging;
  2. namespace Admin.NET.Plugin.AiDOP.DataPlatform;
  3. /// <summary>
  4. /// 中立层写入闸门。来源未登记或与登记不一致时不写中立层,并记 <c>mdp_source_gate_log</c>。
  5. /// </summary>
  6. public sealed class MdpNeutralSourceGate : ITransient
  7. {
  8. private readonly MdpTenantStdSourceResolver _resolver;
  9. private readonly ISqlSugarClient _db;
  10. private readonly ILogger _logger;
  11. public MdpNeutralSourceGate(MdpTenantStdSourceResolver resolver, ISqlSugarClient db, ILoggerFactory loggerFactory)
  12. {
  13. _resolver = resolver;
  14. _db = db;
  15. _logger = loggerFactory.CreateLogger(nameof(MdpNeutralSourceGate));
  16. }
  17. public async Task<bool> AllowsAsync(
  18. long tenantId,
  19. string stdObject,
  20. string sourceSystem,
  21. int rowCount = 1,
  22. string? sampleKeys = null,
  23. string? syncBatchId = null,
  24. CancellationToken cancellationToken = default)
  25. {
  26. var registered = await _resolver.GetSourceAsync(tenantId, stdObject, cancellationToken);
  27. if (registered != null
  28. && string.Equals(registered.SourceSystem, sourceSystem, StringComparison.OrdinalIgnoreCase))
  29. return true;
  30. var reason = registered == null ? "SOURCE_NOT_REGISTERED" : "SOURCE_MISMATCH";
  31. _logger.LogWarning(
  32. "中立层来源闸门拒绝写入 {Reason} tenant={TenantId} object={StdObject} source={SourceSystem} rows={RowCount}",
  33. reason, tenantId, stdObject, sourceSystem, rowCount);
  34. await _db.Ado.ExecuteCommandAsync(
  35. """
  36. INSERT INTO mdp_source_gate_log
  37. (tenant_id, std_object, source_system, gate_reason, row_count, sample_keys, sync_batch_id)
  38. VALUES (@tenant, @obj, @src, @reason, @rows, @sample, @batch)
  39. """,
  40. new
  41. {
  42. tenant = tenantId,
  43. obj = stdObject,
  44. src = sourceSystem ?? "",
  45. reason,
  46. rows = rowCount,
  47. sample = sampleKeys,
  48. batch = syncBatchId
  49. });
  50. return false;
  51. }
  52. }