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 mc = NormalizeDynamicDashboardModule(moduleCode);
if (mc == null) return BadRequest(new { message = "moduleCode 仅支持 S1/S2/S3/S4/S5/S6/S7/S9" });
var tenantId = AidopTenantHelper.GetTenantId(HttpContext);
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 l1Metrics = kpis.Where(x => x.MetricLevel == 1).OrderBy(x => x.SortNo).ToList();
var root = ResolveDiagnosisRoot(l1Metrics, values, metricCode);
if (root == null) return Ok(new { moduleCode = mc, metricCode, title = $"{mc} 智慧诊断", stages = Array.Empty