using Admin.NET.Plugin.AiDOP.Entity;
using Admin.NET.Plugin.AiDOP.Infrastructure;
namespace Admin.NET.Plugin.AiDOP.Controllers;
public partial class AidopKanbanController
{
///
/// 智慧诊断:按模块和当前 L1 指标返回 L2/L3/L4 诊断矩阵。
///
[HttpGet("smart-diagnosis/{moduleCode}")]
public async Task GetSmartDiagnosis(
string moduleCode,
[FromQuery] string? metricCode = null,
[FromQuery] long factoryId = 1,
[FromQuery] string? dateStart = null,
[FromQuery] string? dateEnd = null,
[FromQuery] string? product = null,
[FromQuery] string? orderNo = null,
[FromQuery] string? productionLine = null,
[FromQuery] string? customer = null,
[FromQuery] string? supplier = null,
[FromQuery] string? material = null,
[FromQuery] string? poNo = null,
[FromQuery] string? warehouse = null,
[FromQuery] string? workOrder = null,
[FromQuery] string? equipment = null,
[FromQuery] string? outboundNo = null)
{
var requested = (moduleCode ?? "").Trim().ToUpperInvariant();
if (requested == "S8")
return await GetSmartDiagnosisFromS8ExceptionsAsync(factoryId, dateStart, dateEnd, orderNo);
var mc = NormalizeDynamicDashboardModule(moduleCode);
if (mc == null) return BadRequest(new { message = "moduleCode 仅支持 S1/S2/S3/S4/S5/S6/S7/S8/S9" });
var scope = await _trustedScope.ResolveAsync(factoryId);
var tenantId = scope.TenantId;
factoryId = scope.FactoryId;
var filter = ParseDashboardFilter(
dateStart, dateEnd, product, orderNo, productionLine,
customer, supplier, material, poNo, warehouse, workOrder, equipment, outboundNo);
var kpis = await _db.Queryable()
.Where(x => x.TenantId == tenantId && x.ModuleCode == mc && x.IsEnabled)
.OrderBy(x => x.MetricLevel)
.OrderBy(x => x.SortNo)
.ToListAsync();
var valueBundle = await ResolveDashboardValuesBundleAsync(tenantId, factoryId, mc, filter, kpis);
var values = valueBundle.Values;
var snaps = values.ToDictionary(
x => x.Key,
x => new SmartDiagnosisTree.ValueSnap(x.Value.MetricValue, x.Value.TargetValue),
StringComparer.OrdinalIgnoreCase);
var l1Metrics = kpis.Where(x => x.MetricLevel == 1).OrderBy(x => x.SortNo).ToList();
var resolved = SmartDiagnosisTree.ResolveRoot(l1Metrics, snaps, metricCode);
if (resolved.Error != null)
return BadRequest(new { message = resolved.Error });
var root = resolved.Root;
if (root == null)
return Ok(new { moduleCode = mc, metricCode, title = $"{mc} 智慧诊断", stages = Array.Empty