AdoS8OrderFlowController.cs 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  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. private readonly S8Stage3ProcurementReadService _stage3Svc;
  19. public AdoS8OrderFlowController(
  20. S8OrderFlowService svc,
  21. S8RealOrderArchiveService realSvc,
  22. S8Stage3ProcurementReadService stage3Svc)
  23. {
  24. _svc = svc;
  25. _realSvc = realSvc;
  26. _stage3Svc = stage3Svc;
  27. }
  28. /// <summary>
  29. /// 订单档案列表 —— <b>REAL runtime</b>:真实销售订单,来源 <c>mdp_std_so</c>
  30. /// (按 <c>tenant_id + order_id</c> 聚合为一订单一行),ORDER_REVIEW 事实 LEFT JOIN
  31. /// <c>dwd_order_review_kpi</c>。
  32. /// <para>已由 SEED(<c>ado_s8_order_flow_order</c>)换源;SEED 基线保留在
  33. /// <see cref="S8OrderFlowService"/> 供 fixture / 回归,两路不混用。</para>
  34. /// </summary>
  35. [HttpGet("orders")]
  36. [S8Permission(S8PermissionCatalog.DashboardRead)]
  37. public async Task<IActionResult> OrdersAsync([FromQuery] AdoS8OrderFlowOrderQueryDto query)
  38. => Ok(await _realSvc.GetRealOrdersAsync(query));
  39. /// <summary>
  40. /// 真实订单详情(含固定五阶段骨架)。
  41. /// <para><b>定位 Authority = 当前租户 + salesOrderId</b>(= <c>crm_seorder.Id</c>),
  42. /// 不再用订单号文本定位。</para>
  43. /// </summary>
  44. [HttpGet("orders/by-id/{salesOrderId}")]
  45. [S8Permission(S8PermissionCatalog.DashboardRead)]
  46. public async Task<IActionResult> RealOrderDetailAsync(long salesOrderId)
  47. => Ok(await _realSvc.GetRealOrderAsync(salesOrderId));
  48. /// <summary>
  49. /// Stage-3(材料采购)只读模型 —— <b>REAL runtime</b>,query-time 组合数据中台标准层:
  50. /// <c>mdp_std_purchase_order</c>(采购身份)× <c>mdp_std_purchase_order_completion</c>(WMS 采购完成态)
  51. /// × <c>mdp_std_iqc_inspection</c>(来料检验质量)。
  52. ///
  53. /// <para><b>返回的是 ATTRIBUTED SUBSET</b>:只含经「采购行 → 采购申请 → 销售订单行」唯一归属到本订单
  54. /// 的采购行,<c>dataScope</c> 恒为 <c>ATTRIBUTED_ONLY</c>。归属不到或多义的采购对象不会被塞进任何订单,
  55. /// 因此本接口<b>不宣称</b>该订单采购已完整完成,也不输出完成时间与周期天数。</para>
  56. ///
  57. /// <para>定位 Authority = 当前租户 + salesOrderId(= <c>crm_seorder.Id</c>),与上面的订单详情同口径。</para>
  58. /// </summary>
  59. [HttpGet("orders/by-id/{salesOrderId}/stage3")]
  60. [S8Permission(S8PermissionCatalog.DashboardRead)]
  61. public async Task<IActionResult> RealOrderStage3Async(long salesOrderId, CancellationToken cancellationToken = default)
  62. => Ok(await _stage3Svc.GetStage3Async(salesOrderId, cancellationToken));
  63. /// <summary>
  64. /// 单订单详情(SEED 路径,按 orderCode 定位)。
  65. /// <para>⚠️ 仅供 SEED fixture / 链路全景等既有消费方;<b>REAL runtime 不得回退到这里</b>。</para>
  66. /// </summary>
  67. [HttpGet("orders/{orderCode}")]
  68. [S8Permission(S8PermissionCatalog.DashboardRead)]
  69. public async Task<IActionResult> OrderDetailAsync(string orderCode)
  70. => Ok(await _svc.GetOrderAsync(orderCode));
  71. /// <summary>订单链路(含 lifecycle + L2 substeps + L3 units;ProcurementPivot 留待后续切片注入)。</summary>
  72. [HttpGet("orders/{orderCode}/chain")]
  73. [S8Permission(S8PermissionCatalog.DashboardRead)]
  74. public async Task<IActionResult> ChainAsync(string orderCode)
  75. => Ok(await _svc.GetChainAsync(orderCode));
  76. /// <summary>链路聚合视图:BASELINE_PPT 走 snapshot;CURRENT_FILTERED 走实时聚合。</summary>
  77. [HttpGet("aggregate")]
  78. [S8Permission(S8PermissionCatalog.DashboardRead)]
  79. public async Task<IActionResult> AggregateAsync([FromQuery] AdoS8OrderFlowAggregateQueryDto query)
  80. => Ok(await _svc.GetAggregateAsync(query));
  81. /// <summary>采购透视:BASELINE_PPT 读 procurement_pivot 表 baseline 行。</summary>
  82. [HttpGet("procurement-pivot")]
  83. [S8Permission(S8PermissionCatalog.DashboardRead)]
  84. public async Task<IActionResult> ProcurementPivotAsync([FromQuery] AdoS8OrderFlowProcurementPivotQueryDto query)
  85. => Ok(await _svc.GetProcurementPivotAsync(query));
  86. /// <summary>
  87. /// S8-ORDER-CHAIN-PRODUCT-DESIGN-DRAWING-PERSIST-1:产品设计图号粒度聚合。
  88. /// orderCodes 为空时默认聚合全 20 单(scope=BASELINE_PPT);非空时按订单子集聚合(scope=CURRENT_FILTERED)。
  89. /// productType 仅过滤 drawings 明细列表,summary.categories 始终返回常规/非标/合计三档。
  90. /// </summary>
  91. [HttpGet("product-design/drawings")]
  92. [S8Permission(S8PermissionCatalog.DashboardRead)]
  93. public async Task<IActionResult> ProductDesignDrawingsAsync(
  94. [FromQuery] AdoS8OrderFlowProductDesignDrawingsQueryDto query)
  95. => Ok(await _svc.GetProductDesignDrawingsAsync(query));
  96. /// <summary>
  97. /// S8-ORDER-CHAIN-BODY-PRODUCTION-ORDER-LEVEL-SEED-FIX-1:本体生产透视。
  98. /// scope=BASELINE_PPT 读三表 baseline 行;scope=CURRENT_FILTERED 按 orderCodes CSV 取订单级行并聚合。
  99. /// orderCodes 为空(CURRENT_FILTERED)时返回空骨架,不静默 fallback baseline。
  100. /// </summary>
  101. [HttpGet("manufacturing-pivot")]
  102. [S8Permission(S8PermissionCatalog.DashboardRead)]
  103. public async Task<IActionResult> ManufacturingPivotAsync(
  104. [FromQuery] AdoS8OrderFlowManufacturingPivotQueryDto query)
  105. => Ok(await _svc.GetManufacturingPivotAsync(query));
  106. /// <summary>
  107. /// S8-ORDER-CHAIN-ASSEMBLY-DELIVERY-DATA-LINEAGE-AUDIT-1:总装发货透视。
  108. /// scope=BASELINE_PPT 读两表 baseline 行(5 门禁 + 4 并行准备);
  109. /// scope=CURRENT_FILTERED 按 orderCodes CSV 取订单级行并聚合,
  110. /// 末位门禁 SHIPMENT_CONFIRMATION 守恒为 stage.actual_days;
  111. /// pending 单不参与聚合;orderCodes 为空时返回空骨架,不 fallback baseline。
  112. /// 与 aggregate.finalAssemblyCollabSummary 通道并存:本 API 给门禁 KPI / 实际 / 偏差 / 齐套率,
  113. /// collabSummary 留作 exception 派生补充。
  114. /// </summary>
  115. [HttpGet("final-assembly-pivot")]
  116. [S8Permission(S8PermissionCatalog.DashboardRead)]
  117. public async Task<IActionResult> FinalAssemblyPivotAsync(
  118. [FromQuery] AdoS8FinalAssemblyPivotQueryDto query)
  119. => Ok(await _svc.GetFinalAssemblyPivotAsync(query));
  120. }