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));
}