审批通过同时选择工厂和司机时跳过待工厂节点,直接进入司机待接单

- ApproveOrderRequest 增加 factory_id/driver_id 字段(Pydantic 原来会丢弃)
- approve_order 中同时有工厂和司机时在同一事务内创建物流任务,直接到 pending_driver
- 小程序前端跳过重复的物流任务创建调用

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
wsb1224 2026-06-27 10:42:51 +08:00
parent 2df8341cd3
commit 2136d5a8ec
3 changed files with 28 additions and 3 deletions

View File

@ -269,6 +269,12 @@ class ApproveOrderRequest(BaseModel):
approve_opinion: str | None = None
"""审批意见"""
factory_id: int | None = None
"""下发工厂 ID审批通过时可选同时选择工厂和司机可跳过待工厂节点"""
driver_id: int | None = None
"""司机 ID审批通过时可选同时选择工厂和司机可跳过待工厂节点"""
class SupplierTextRequest(BaseModel):
"""获取供应商对账文本请求体。被 POST /api/orders/supplier-text 路由使用。"""

View File

@ -633,8 +633,26 @@ class OrderService:
else:
target_status = "rejected"
# 如果有工厂ID设置到订单上
if payload.get("factory_id") and target_status == "pending_factory":
if payload.get("factory_id") and target_status in ("pending_factory",):
order.factory_id = payload["factory_id"]
# 同时选择了工厂和司机:在同一个事务内创建物流任务,直接进入待司机接单
if payload.get("factory_id") and payload.get("driver_id") and target_status == "pending_factory":
task = self.logistics_repository.create_task(
session,
{
"task_no": f"LT{datetime.now().strftime('%Y%m%d%H%M%S')}",
"order_id": order.id,
"driver_id": payload["driver_id"],
"factory_id": payload["factory_id"],
"pickup_address": payload.get("pickup_address", ""),
"delivery_address": payload.get("delivery_address", ""),
"pickup_content": payload.get("pickup_content", ""),
"quantity": payload.get("quantity", 1),
"status": "pending",
"created_by": current_user.get("user_id") if current_user else None,
},
)
target_status = "pending_driver"
self.order_repository.update_order_status(session, order, target_status)
self.order_approve_log_repository.create_log(
session,

View File

@ -317,8 +317,9 @@ Page({
url: targetUrl, method: "POST",
data: payload,
}).then(function () {
// approve pass + driver_id: create logistics task (mirrors web flow)
if (payload.approve_result === "pass" && payload.driver_id) {
// 同时选择了工厂和司机时,后端已在审批事务内创建物流任务,无需再调用
// 仅在未选工厂但选了司机的场景下才单独创建(理论上不会出现)
if (payload.approve_result === "pass" && payload.driver_id && !payload.factory_id) {
var orderData = that.data.orderInfo;
return app.request({
url: "/api/logistics/tasks",