using Microsoft.Extensions.Logging; namespace Admin.NET.Plugin.AiDOP.SmartOps; public sealed class LegacyKpiTargetProvider : ILegacyKpiTargetProvider, ITransient { private static readonly HashSet LegacyModules = new(StringComparer.OrdinalIgnoreCase) { "S1", "S2", "S3", "S4" }; private readonly IKpiDailyTargetReader _daily; private readonly ILogger _logger; public LegacyKpiTargetProvider(IKpiDailyTargetReader daily, ILogger logger) { _daily = daily; _logger = logger; } public async Task TryResolveLegacyAsync( long tenantId, long factoryId, string metricCode, string moduleCode, DateTime bizDate, CancellationToken ct = default) { if (!LegacyModules.Contains(moduleCode ?? string.Empty)) return null; var now = DateTime.Now; var current = await _daily.GetCurrentTargetAsync(tenantId, factoryId, moduleCode, metricCode, bizDate.Date, ct); if (current is > 0) { _logger.LogWarning("KPI 兼容命中当天日值 tenant={Tenant} metric={Metric} value={Value}", tenantId, metricCode, current); return new KpiTargetSnapshot(current, null, KpiTargetSnapshotSource.LegacyDailyCurrent, now); } var prior = await _daily.GetPriorTargetAsync(tenantId, factoryId, moduleCode, metricCode, bizDate.Date, ct); if (prior is > 0) { _logger.LogWarning("KPI 兼容命中历史日值 tenant={Tenant} metric={Metric} value={Value}", tenantId, metricCode, prior); return new KpiTargetSnapshot(prior, null, KpiTargetSnapshotSource.LegacyDailyPrior, now); } if (LegacyKpiCodeTargets.TryGet(metricCode, out var codeTarget)) { _logger.LogWarning("KPI 兼容命中代码默认 tenant={Tenant} metric={Metric} value={Value}", tenantId, metricCode, codeTarget); return new KpiTargetSnapshot(codeTarget, null, KpiTargetSnapshotSource.LegacyCode, now); } return null; } }