using Admin.NET.Plugin.AiDOP.Infrastructure.S8; using Admin.NET.Plugin.AiDOP.Const.S8; using Admin.NET.Plugin.AiDOP.Dto.S8.OrderFlow; using Admin.NET.Plugin.AiDOP.Service.S8.OrderFlow; namespace Admin.NET.Plugin.AiDOP.Controllers.S8; /// /// ORDER-FLOW-S8-INTEGRATED-DOMAIN-RESET-1 t3d:S8 订单执行链路只读 API。 /// 仅 GET endpoint;调用 S8OrderFlowService 5 个方法暴露。 /// 路由:api/aidop/s8/order-flow/*。 /// [ApiController] [Route("api/aidop/s8/order-flow")] [NonUnify] public class AdoS8OrderFlowController : ControllerBase { private readonly S8OrderFlowService _svc; private readonly S8RealOrderArchiveService _realSvc; private readonly S8Stage3ProcurementReadService _stage3Svc; public AdoS8OrderFlowController( S8OrderFlowService svc, S8RealOrderArchiveService realSvc, S8Stage3ProcurementReadService stage3Svc) { _svc = svc; _realSvc = realSvc; _stage3Svc = stage3Svc; } /// /// 订单档案列表 —— REAL runtime:真实销售订单,来源 mdp_std_so /// (按 tenant_id + order_id 聚合为一订单一行),ORDER_REVIEW 事实 LEFT JOIN /// dwd_order_review_kpi。 /// 已由 SEED(ado_s8_order_flow_order)换源;SEED 基线保留在 /// 供 fixture / 回归,两路不混用。 /// [HttpGet("orders")] [S8Permission(S8PermissionCatalog.DashboardRead)] public async Task OrdersAsync([FromQuery] AdoS8OrderFlowOrderQueryDto query) => Ok(await _realSvc.GetRealOrdersAsync(query)); /// /// 真实订单详情(含固定五阶段骨架)。 /// 定位 Authority = 当前租户 + salesOrderId(= crm_seorder.Id), /// 不再用订单号文本定位。 /// [HttpGet("orders/by-id/{salesOrderId}")] [S8Permission(S8PermissionCatalog.DashboardRead)] public async Task RealOrderDetailAsync(long salesOrderId) => Ok(await _realSvc.GetRealOrderAsync(salesOrderId)); /// /// Stage-3(材料采购)只读模型 —— REAL runtime,query-time 组合数据中台标准层: /// mdp_std_purchase_order(采购身份)× mdp_std_purchase_order_completion(WMS 采购完成态) /// × mdp_std_iqc_inspection(来料检验质量)。 /// /// 返回的是 ATTRIBUTED SUBSET:只含经「采购行 → 采购申请 → 销售订单行」唯一归属到本订单 /// 的采购行,dataScope 恒为 ATTRIBUTED_ONLY。归属不到或多义的采购对象不会被塞进任何订单, /// 因此本接口不宣称该订单采购已完整完成,也不输出完成时间与周期天数。 /// /// 定位 Authority = 当前租户 + salesOrderId(= crm_seorder.Id),与上面的订单详情同口径。 /// [HttpGet("orders/by-id/{salesOrderId}/stage3")] [S8Permission(S8PermissionCatalog.DashboardRead)] public async Task RealOrderStage3Async(long salesOrderId, CancellationToken cancellationToken = default) => Ok(await _stage3Svc.GetStage3Async(salesOrderId, cancellationToken)); /// /// 单订单详情(SEED 路径,按 orderCode 定位)。 /// ⚠️ 仅供 SEED fixture / 链路全景等既有消费方;REAL runtime 不得回退到这里 /// [HttpGet("orders/{orderCode}")] [S8Permission(S8PermissionCatalog.DashboardRead)] public async Task OrderDetailAsync(string orderCode) => Ok(await _svc.GetOrderAsync(orderCode)); /// 订单链路(含 lifecycle + L2 substeps + L3 units;ProcurementPivot 留待后续切片注入)。 [HttpGet("orders/{orderCode}/chain")] [S8Permission(S8PermissionCatalog.DashboardRead)] public async Task ChainAsync(string orderCode) => Ok(await _svc.GetChainAsync(orderCode)); /// 链路聚合视图:BASELINE_PPT 走 snapshot;CURRENT_FILTERED 走实时聚合。 [HttpGet("aggregate")] [S8Permission(S8PermissionCatalog.DashboardRead)] public async Task AggregateAsync([FromQuery] AdoS8OrderFlowAggregateQueryDto query) => Ok(await _svc.GetAggregateAsync(query)); /// 采购透视:BASELINE_PPT 读 procurement_pivot 表 baseline 行。 [HttpGet("procurement-pivot")] [S8Permission(S8PermissionCatalog.DashboardRead)] public async Task ProcurementPivotAsync([FromQuery] AdoS8OrderFlowProcurementPivotQueryDto query) => Ok(await _svc.GetProcurementPivotAsync(query)); /// /// S8-ORDER-CHAIN-PRODUCT-DESIGN-DRAWING-PERSIST-1:产品设计图号粒度聚合。 /// orderCodes 为空时默认聚合全 20 单(scope=BASELINE_PPT);非空时按订单子集聚合(scope=CURRENT_FILTERED)。 /// productType 仅过滤 drawings 明细列表,summary.categories 始终返回常规/非标/合计三档。 /// [HttpGet("product-design/drawings")] [S8Permission(S8PermissionCatalog.DashboardRead)] public async Task ProductDesignDrawingsAsync( [FromQuery] AdoS8OrderFlowProductDesignDrawingsQueryDto query) => Ok(await _svc.GetProductDesignDrawingsAsync(query)); /// /// S8-ORDER-CHAIN-BODY-PRODUCTION-ORDER-LEVEL-SEED-FIX-1:本体生产透视。 /// scope=BASELINE_PPT 读三表 baseline 行;scope=CURRENT_FILTERED 按 orderCodes CSV 取订单级行并聚合。 /// orderCodes 为空(CURRENT_FILTERED)时返回空骨架,不静默 fallback baseline。 /// [HttpGet("manufacturing-pivot")] [S8Permission(S8PermissionCatalog.DashboardRead)] public async Task ManufacturingPivotAsync( [FromQuery] AdoS8OrderFlowManufacturingPivotQueryDto query) => Ok(await _svc.GetManufacturingPivotAsync(query)); /// /// S8-ORDER-CHAIN-ASSEMBLY-DELIVERY-DATA-LINEAGE-AUDIT-1:总装发货透视。 /// scope=BASELINE_PPT 读两表 baseline 行(5 门禁 + 4 并行准备); /// scope=CURRENT_FILTERED 按 orderCodes CSV 取订单级行并聚合, /// 末位门禁 SHIPMENT_CONFIRMATION 守恒为 stage.actual_days; /// pending 单不参与聚合;orderCodes 为空时返回空骨架,不 fallback baseline。 /// 与 aggregate.finalAssemblyCollabSummary 通道并存:本 API 给门禁 KPI / 实际 / 偏差 / 齐套率, /// collabSummary 留作 exception 派生补充。 /// [HttpGet("final-assembly-pivot")] [S8Permission(S8PermissionCatalog.DashboardRead)] public async Task FinalAssemblyPivotAsync( [FromQuery] AdoS8FinalAssemblyPivotQueryDto query) => Ok(await _svc.GetFinalAssemblyPivotAsync(query)); }