AdoS8OrderFlowController.cs 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. using Admin.NET.Plugin.AiDOP.Infrastructure.S8;
  2. using Admin.NET.Plugin.AiDOP.Const.S8;
  3. using Admin.NET.Plugin.AiDOP.Dto.S8.OrderFlow;
  4. using Admin.NET.Plugin.AiDOP.Service.S8.OrderFlow;
  5. namespace Admin.NET.Plugin.AiDOP.Controllers.S8;
  6. /// <summary>
  7. /// ORDER-FLOW-S8-INTEGRATED-DOMAIN-RESET-1 t3d:S8 订单执行链路只读 API。
  8. /// 仅 GET endpoint;调用 S8OrderFlowService 5 个方法暴露。
  9. /// 路由:api/aidop/s8/order-flow/*。
  10. /// </summary>
  11. [ApiController]
  12. [Route("api/aidop/s8/order-flow")]
  13. [NonUnify]
  14. public class AdoS8OrderFlowController : ControllerBase
  15. {
  16. private readonly S8OrderFlowService _svc;
  17. private readonly S8RealOrderArchiveService _realSvc;
  18. public AdoS8OrderFlowController(S8OrderFlowService svc, S8RealOrderArchiveService realSvc)
  19. {
  20. _svc = svc;
  21. _realSvc = realSvc;
  22. }
  23. /// <summary>
  24. /// 订单档案列表 —— <b>REAL runtime</b>:真实销售订单,来源 <c>mdp_std_so</c>
  25. /// (按 <c>tenant_id + order_id</c> 聚合为一订单一行),ORDER_REVIEW 事实 LEFT JOIN
  26. /// <c>dwd_order_review_kpi</c>。
  27. /// <para>已由 SEED(<c>ado_s8_order_flow_order</c>)换源;SEED 基线保留在
  28. /// <see cref="S8OrderFlowService"/> 供 fixture / 回归,两路不混用。</para>
  29. /// </summary>
  30. [HttpGet("orders")]
  31. [S8Permission(S8PermissionCatalog.DashboardRead)]
  32. public async Task<IActionResult> OrdersAsync([FromQuery] AdoS8OrderFlowOrderQueryDto query)
  33. => Ok(await _realSvc.GetRealOrdersAsync(query));
  34. /// <summary>
  35. /// 真实订单详情(含固定五阶段骨架)。
  36. /// <para><b>定位 Authority = 当前租户 + salesOrderId</b>(= <c>crm_seorder.Id</c>),
  37. /// 不再用订单号文本定位。</para>
  38. /// </summary>
  39. [HttpGet("orders/by-id/{salesOrderId}")]
  40. [S8Permission(S8PermissionCatalog.DashboardRead)]
  41. public async Task<IActionResult> RealOrderDetailAsync(long salesOrderId)
  42. => Ok(await _realSvc.GetRealOrderAsync(salesOrderId));
  43. /// <summary>
  44. /// 单订单详情(SEED 路径,按 orderCode 定位)。
  45. /// <para>⚠️ 仅供 SEED fixture / 链路全景等既有消费方;<b>REAL runtime 不得回退到这里</b>。</para>
  46. /// </summary>
  47. [HttpGet("orders/{orderCode}")]
  48. [S8Permission(S8PermissionCatalog.DashboardRead)]
  49. public async Task<IActionResult> OrderDetailAsync(string orderCode)
  50. => Ok(await _svc.GetOrderAsync(orderCode));
  51. /// <summary>订单链路(含 lifecycle + L2 substeps + L3 units;ProcurementPivot 留待后续切片注入)。</summary>
  52. [HttpGet("orders/{orderCode}/chain")]
  53. [S8Permission(S8PermissionCatalog.DashboardRead)]
  54. public async Task<IActionResult> ChainAsync(string orderCode)
  55. => Ok(await _svc.GetChainAsync(orderCode));
  56. /// <summary>链路聚合视图:BASELINE_PPT 走 snapshot;CURRENT_FILTERED 走实时聚合。</summary>
  57. [HttpGet("aggregate")]
  58. [S8Permission(S8PermissionCatalog.DashboardRead)]
  59. public async Task<IActionResult> AggregateAsync([FromQuery] AdoS8OrderFlowAggregateQueryDto query)
  60. => Ok(await _svc.GetAggregateAsync(query));
  61. /// <summary>采购透视:BASELINE_PPT 读 procurement_pivot 表 baseline 行。</summary>
  62. [HttpGet("procurement-pivot")]
  63. [S8Permission(S8PermissionCatalog.DashboardRead)]
  64. public async Task<IActionResult> ProcurementPivotAsync([FromQuery] AdoS8OrderFlowProcurementPivotQueryDto query)
  65. => Ok(await _svc.GetProcurementPivotAsync(query));
  66. /// <summary>
  67. /// S8-ORDER-CHAIN-PRODUCT-DESIGN-DRAWING-PERSIST-1:产品设计图号粒度聚合。
  68. /// orderCodes 为空时默认聚合全 20 单(scope=BASELINE_PPT);非空时按订单子集聚合(scope=CURRENT_FILTERED)。
  69. /// productType 仅过滤 drawings 明细列表,summary.categories 始终返回常规/非标/合计三档。
  70. /// </summary>
  71. [HttpGet("product-design/drawings")]
  72. [S8Permission(S8PermissionCatalog.DashboardRead)]
  73. public async Task<IActionResult> ProductDesignDrawingsAsync(
  74. [FromQuery] AdoS8OrderFlowProductDesignDrawingsQueryDto query)
  75. => Ok(await _svc.GetProductDesignDrawingsAsync(query));
  76. /// <summary>
  77. /// S8-ORDER-CHAIN-BODY-PRODUCTION-ORDER-LEVEL-SEED-FIX-1:本体生产透视。
  78. /// scope=BASELINE_PPT 读三表 baseline 行;scope=CURRENT_FILTERED 按 orderCodes CSV 取订单级行并聚合。
  79. /// orderCodes 为空(CURRENT_FILTERED)时返回空骨架,不静默 fallback baseline。
  80. /// </summary>
  81. [HttpGet("manufacturing-pivot")]
  82. [S8Permission(S8PermissionCatalog.DashboardRead)]
  83. public async Task<IActionResult> ManufacturingPivotAsync(
  84. [FromQuery] AdoS8OrderFlowManufacturingPivotQueryDto query)
  85. => Ok(await _svc.GetManufacturingPivotAsync(query));
  86. /// <summary>
  87. /// S8-ORDER-CHAIN-ASSEMBLY-DELIVERY-DATA-LINEAGE-AUDIT-1:总装发货透视。
  88. /// scope=BASELINE_PPT 读两表 baseline 行(5 门禁 + 4 并行准备);
  89. /// scope=CURRENT_FILTERED 按 orderCodes CSV 取订单级行并聚合,
  90. /// 末位门禁 SHIPMENT_CONFIRMATION 守恒为 stage.actual_days;
  91. /// pending 单不参与聚合;orderCodes 为空时返回空骨架,不 fallback baseline。
  92. /// 与 aggregate.finalAssemblyCollabSummary 通道并存:本 API 给门禁 KPI / 实际 / 偏差 / 齐套率,
  93. /// collabSummary 留作 exception 派生补充。
  94. /// </summary>
  95. [HttpGet("final-assembly-pivot")]
  96. [S8Permission(S8PermissionCatalog.DashboardRead)]
  97. public async Task<IActionResult> FinalAssemblyPivotAsync(
  98. [FromQuery] AdoS8FinalAssemblyPivotQueryDto query)
  99. => Ok(await _svc.GetFinalAssemblyPivotAsync(query));
  100. }