1、订单预审![img.png](img.png) 各环节时间默认值从 计算定制履约预计完成时间
从接口获取
POST /admin/sale-order/calculateCustomFulfillmentNodeTime

用于按当前订单的定制履约项、部件、工序和公司 SLA 配置，实时计算各阶段预计完成时间。该接口只计算返回，不写入数据库。

请求参数

{
"id": 123
}

也兼容：

{
"sale_order_id": 123
}

字段说明：

- id / sale_order_id：销售订单 ID，二选一，必填。

返回结构

{
"code": 0,
"msg": "",
"data": {
"sale_order_id": 123,
"sale_order_code": "XS-xxx",
"base_time": "2026-08-10 10:00:00",
"calculated_at": "2026-08-10 12:00:00",
"total": 1,
"items": [
{
"custom_order_item_id": 1,
"sale_order_detail_id": 10,
"item_no": 1,
"product_id": 100,
"product_code": "P001",
"product_title": "商品标题",
"quantity": 1,
"status": 0,
"base_time": "2026-08-10 10:00:00",
"sla_hours": {
"frame_stock_ready_hours": 0,
"frame_purchase_hours": 72,
"frame_production_hours": 168,
"frame_unknown_hours": 120,
"lens_production_hours": 72,
"assemble_hours": 24,
"qc_hours": 8,
"finished_stock_in_hours": 4,
"ship_hours": 24,
"outsource_assemble_accept_hours": 24,
"outsource_assemble_produce_hours": 48,
"outsource_assemble_stock_in_hours": 72
},
"current_node_times": {
"frame_ready_plan_time": "2026-08-10 10:00:00",
"lens_finish_plan_time": "2026-08-13 10:00:00",
"glasses_qc_plan_time": "2026-08-14 18:00:00",
"logistics_ship_plan_time": "2026-08-15 22:00:00",
"node_time_calculated_at": "2026-08-10 10:01:00"
},
"calculated_node_times": {
"frame_ready_plan_time": "2026-08-10 10:00:00",
"lens_finish_plan_time": "2026-08-13 10:00:00",
"glasses_qc_plan_time": "2026-08-14 18:00:00",
"logistics_ship_plan_time": "2026-08-15 22:00:00"
},
"component_list": [],
"process_list": []
}
]
}
}

核心字段说明

- base_time：计算基准时间，优先取订单 audit_time，没有则取订单 create_time，再没有取当前时间。
- sla_hours：本次使用的 SLA 小时配置。
- current_node_times：数据库当前已保存的预计时间。
- calculated_node_times：接口按当前数据实时计算出的预计时间。
- component_list[].current_expected_finish_time：部件当前保存的预计完成时间。
- component_list[].calculated_expected_finish_time：按当前 SLA 计算出的部件预计完成时间。
- component_list[].effective_expected_finish_time：前端展示建议优先用这个字段，逻辑是“已有保存值优先，否则使用本次计算值”。
- process_list[].current_plan_finish_time：工序当前保存的计划完成时间。
- process_list[].calculated_plan_finish_time：按当前 SLA 计算出的工序计划完成时间。
- process_list[].effective_plan_finish_time：前端展示建议优先用这个字段。

阶段含义

- frame_ready_plan_time：镜框准备完成预计时间。
- lens_finish_plan_time：镜片完成预计时间。
- glasses_qc_plan_time：成镜质检完成预计时间。
- logistics_ship_plan_time：物流发货预计时间。

错误情况

- 缺少订单 ID：返回参数错误，提示 缺少订单ID。
- 订单不存在：返回 NOT_FOUND_ERROR。
- 无权限查看订单：返回 DATA_CROSS_THE_LINE。

2、订单的暂停与恢复
已按 SaleOrderController 层面加了订单暂停/恢复接口。

接口：

POST /admin/sale-order/pause
POST /admin/sale-order/resume

请求示例：

{
"id": 123,
"reason": "客户要求确认处方，暂停处理"
}

实现方式：通过销售订单找到所有关联的 custom_order_item，在 custom_process_log 写入 target_type = sale_order、target_id
= sale_order.id 的 pause/resume 日志。这样现有 hasOpenPause($saleOrderId) 阻断逻辑可以直接识别，同时不会覆盖部件/工序
自己的暂停状态。

3、