using Microsoft.Extensions.Logging; namespace Admin.NET.Plugin.AiDOP.DataPlatform; /// /// 中立层写入闸门。来源未登记或与登记不一致时不写中立层,并记 mdp_source_gate_log。 /// public sealed class MdpNeutralSourceGate : ITransient { private readonly MdpTenantStdSourceResolver _resolver; private readonly ISqlSugarClient _db; private readonly ILogger _logger; public MdpNeutralSourceGate(MdpTenantStdSourceResolver resolver, ISqlSugarClient db, ILoggerFactory loggerFactory) { _resolver = resolver; _db = db; _logger = loggerFactory.CreateLogger(nameof(MdpNeutralSourceGate)); } public async Task AllowsAsync( long tenantId, string stdObject, string sourceSystem, int rowCount = 1, string? sampleKeys = null, string? syncBatchId = null, CancellationToken cancellationToken = default) { var registered = await _resolver.GetSourceAsync(tenantId, stdObject, cancellationToken); if (registered != null && string.Equals(registered.SourceSystem, sourceSystem, StringComparison.OrdinalIgnoreCase)) return true; var reason = registered == null ? "SOURCE_NOT_REGISTERED" : "SOURCE_MISMATCH"; _logger.LogWarning( "中立层来源闸门拒绝写入 {Reason} tenant={TenantId} object={StdObject} source={SourceSystem} rows={RowCount}", reason, tenantId, stdObject, sourceSystem, rowCount); await _db.Ado.ExecuteCommandAsync( """ INSERT INTO mdp_source_gate_log (tenant_id, std_object, source_system, gate_reason, row_count, sample_keys, sync_batch_id) VALUES (@tenant, @obj, @src, @reason, @rows, @sample, @batch) """, new { tenant = tenantId, obj = stdObject, src = sourceSystem ?? "", reason, rows = rowCount, sample = sampleKeys, batch = syncBatchId }); return false; } }