AdoS8DashboardController.cs 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. using Admin.NET.Plugin.AiDOP.Infrastructure.S8;
  2. using Admin.NET.Plugin.AiDOP.Const.S8;
  3. using Admin.NET.Plugin.AiDOP.Dto.S8;
  4. using Admin.NET.Plugin.AiDOP.Infrastructure;
  5. using Admin.NET.Plugin.AiDOP.Service.S8;
  6. namespace Admin.NET.Plugin.AiDOP.Controllers.S8;
  7. [ApiController]
  8. [Route("api/aidop/s8/dashboard")]
  9. [NonUnify]
  10. public class AdoS8DashboardController : ControllerBase
  11. {
  12. private readonly S8DashboardService _svc;
  13. private readonly S8DashboardCellDataService _cellSvc;
  14. private readonly S8DashboardCellConfigService _cfgSvc;
  15. private readonly S8TrustedScopeResolver _scope;
  16. public AdoS8DashboardController(
  17. S8DashboardService svc,
  18. S8DashboardCellDataService cellSvc,
  19. S8DashboardCellConfigService cfgSvc,
  20. S8TrustedScopeResolver scope)
  21. {
  22. _svc = svc;
  23. _cellSvc = cellSvc;
  24. _cfgSvc = cfgSvc;
  25. _scope = scope;
  26. }
  27. // S8-TENANT-FACTORY-P0-CLOSURE-1:以下 tenantId / factoryId 入参
  28. // Compatibility-only. Security scope is resolved server-side.
  29. [HttpGet("overview")]
  30. [S8Permission(S8PermissionCatalog.DashboardRead)]
  31. public async Task<IActionResult> OverviewAsync(
  32. [FromQuery] long tenantId = 1,
  33. [FromQuery] long factoryId = 1,
  34. [FromQuery] DateTime? beginTime = null,
  35. [FromQuery] DateTime? endTime = null,
  36. [FromQuery] string? severity = null,
  37. [FromQuery] string? period = null)
  38. {
  39. _ = tenantId; _ = factoryId;
  40. var scope = await _scope.ResolveAsync();
  41. return Ok(await _svc.GetOverviewAsync(scope.TenantId, scope.FactoryId, beginTime, endTime, severity, period));
  42. }
  43. [HttpGet("trends")]
  44. [S8Permission(S8PermissionCatalog.DashboardRead)]
  45. public async Task<IActionResult> TrendsAsync([FromQuery] long tenantId = 1, [FromQuery] long factoryId = 1,
  46. [FromQuery] int days = 14, [FromQuery] string? period = null)
  47. {
  48. _ = tenantId; _ = factoryId;
  49. var scope = await _scope.ResolveAsync();
  50. return Ok(await _svc.GetTrendsAsync(scope.TenantId, scope.FactoryId, days, period));
  51. }
  52. [HttpGet("distributions")]
  53. [S8Permission(S8PermissionCatalog.DashboardRead)]
  54. public async Task<IActionResult> DistributionsAsync([FromQuery] long tenantId = 1, [FromQuery] long factoryId = 1, [FromQuery] string? period = null)
  55. {
  56. _ = tenantId; _ = factoryId;
  57. var scope = await _scope.ResolveAsync();
  58. return Ok(await _svc.GetDistributionsAsync(scope.TenantId, scope.FactoryId, period));
  59. }
  60. [HttpGet("quick-exceptions")]
  61. [S8Permission(S8PermissionCatalog.DashboardRead)]
  62. public async Task<IActionResult> QuickExceptionsAsync([FromQuery] long tenantId = 1, [FromQuery] long factoryId = 1,
  63. [FromQuery] string mode = "latest")
  64. {
  65. _ = tenantId; _ = factoryId;
  66. var scope = await _scope.ResolveAsync();
  67. return Ok(await _svc.GetQuickExceptionsAsync(scope.TenantId, scope.FactoryId, mode));
  68. }
  69. [HttpGet("dept-backlog")]
  70. [S8Permission(S8PermissionCatalog.DashboardRead)]
  71. public async Task<IActionResult> DeptBacklogAsync([FromQuery] long tenantId = 1, [FromQuery] long factoryId = 1, [FromQuery] string? period = null)
  72. {
  73. _ = tenantId; _ = factoryId;
  74. var scope = await _scope.ResolveAsync();
  75. return Ok(await _svc.GetDeptBacklogAsync(scope.TenantId, scope.FactoryId, period));
  76. }
  77. [HttpGet("dim-trends")]
  78. [S8Permission(S8PermissionCatalog.DashboardRead)]
  79. public async Task<IActionResult> DimTrendsAsync(
  80. [FromQuery] long tenantId = 1,
  81. [FromQuery] long factoryId = 1,
  82. [FromQuery] string dim = "object",
  83. [FromQuery] int days = 14,
  84. [FromQuery] string? period = null)
  85. {
  86. _ = tenantId; _ = factoryId;
  87. var scope = await _scope.ResolveAsync();
  88. return Ok(await _svc.GetDimTrendsAsync(scope.TenantId, scope.FactoryId, dim, days, period));
  89. }
  90. /// <summary>
  91. /// 按配置获取单个大屏卡片的数据。配置来源 ado_s8_dashboard_cell_config。
  92. /// </summary>
  93. [HttpGet("cell-data")]
  94. [S8Permission(S8PermissionCatalog.DashboardRead)]
  95. public async Task<IActionResult> CellDataAsync([FromQuery] AdoS8CellDataQueryDto q)
  96. {
  97. try
  98. {
  99. var scope = await _scope.ResolveAsync();
  100. q.TenantId = scope.TenantId;
  101. q.FactoryId = scope.FactoryId;
  102. return Ok(await _cellSvc.GetAsync(q));
  103. }
  104. catch (S8BizException ex) { return BadRequest(new { message = ex.Message }); }
  105. }
  106. /// <summary>
  107. /// 按页面编码获取大屏页面结构配置(G-09 一期:四屏启动渲染入口)。
  108. /// 只返回 enabled=true 的 cell,按 layout_area + sort_no 排序。
  109. /// 不替代 cell-data,不触发 ado_s8_exception 查询。
  110. /// </summary>
  111. [HttpGet("page-config")]
  112. [S8Permission(S8PermissionCatalog.DashboardRead)]
  113. public async Task<IActionResult> PageConfigAsync([FromQuery] AdoS8PageConfigQueryDto q)
  114. {
  115. try
  116. {
  117. var scope = await _scope.ResolveAsync();
  118. q.TenantId = scope.TenantId;
  119. q.FactoryId = scope.FactoryId;
  120. return Ok(await _cfgSvc.GetPageConfigAsync(q));
  121. }
  122. catch (S8BizException ex) { return BadRequest(new { message = ex.Message }); }
  123. }
  124. }