先确认问题落在哪一层
后台显示全部实体商品已发货,订单仍是Processing。不要直接UPDATE state/status为complete,先找出Magento为什么仍判断canInvoice或canShip。
查询每个order_item的qty_ordered、qty_invoiced、qty_shipped、qty_refunded、qty_canceled以及product_type。父子商品要看实际可发货行,不能简单相加。
若canInvoice仍为真,检查支付动作是Authorize还是Authorize and Capture,以及是否缺Invoice。虚拟商品不需要Shipment,但通常需要完成开票。
SELECT item_id,parent_item_id,sku,product_type,qty_ordered,qty_invoiced,qty_shipped,qty_refunded,qty_canceled FROM sales_order_item WHERE order_id=:order_id;
SELECT increment_id,state,status,total_invoiced,total_paid FROM sales_order WHERE entity_id=:order_id;实际修复
- Shipment数量不足时,检查Bundle/Configurable父子行、自定义创建Shipment代码是否使用错误item_id,或小数数量被取整。
- 修复缺失业务单据后调用Order Repository保存,让状态机自行计算。只有所有可开票/可发货动作结束时才应Complete。
怎样才算修好
覆盖纯实体、纯虚拟、可配置和Bundle订单;完成Invoice/Shipment后自动Complete,仍有未开票或未发货数量的订单继续保持Processing。

