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;
}
}