From 2136d5a8ecaf8a6d2a4f3cef7e7a0c2e06a98529 Mon Sep 17 00:00:00 2001 From: wsb1224 Date: Sat, 27 Jun 2026 10:42:51 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=A1=E6=89=B9=E9=80=9A=E8=BF=87=E5=90=8C?= =?UTF-8?q?=E6=97=B6=E9=80=89=E6=8B=A9=E5=B7=A5=E5=8E=82=E5=92=8C=E5=8F=B8?= =?UTF-8?q?=E6=9C=BA=E6=97=B6=E8=B7=B3=E8=BF=87=E5=BE=85=E5=B7=A5=E5=8E=82?= =?UTF-8?q?=E8=8A=82=E7=82=B9=EF=BC=8C=E7=9B=B4=E6=8E=A5=E8=BF=9B=E5=85=A5?= =?UTF-8?q?=E5=8F=B8=E6=9C=BA=E5=BE=85=E6=8E=A5=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ApproveOrderRequest 增加 factory_id/driver_id 字段(Pydantic 原来会丢弃) - approve_order 中同时有工厂和司机时在同一事务内创建物流任务,直接到 pending_driver - 小程序前端跳过重复的物流任务创建调用 Co-Authored-By: Claude Sonnet 4.6 --- backend/app/schemas/orders.py | 6 ++++++ backend/app/services/order_service.py | 20 ++++++++++++++++++- .../manager/approve-detail/approve-detail.js | 5 +++-- 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/backend/app/schemas/orders.py b/backend/app/schemas/orders.py index 677de66..650c001 100644 --- a/backend/app/schemas/orders.py +++ b/backend/app/schemas/orders.py @@ -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 路由使用。""" diff --git a/backend/app/services/order_service.py b/backend/app/services/order_service.py index 292d229..d57e6d0 100644 --- a/backend/app/services/order_service.py +++ b/backend/app/services/order_service.py @@ -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, diff --git a/frontend/mini-app/pages/manager/approve-detail/approve-detail.js b/frontend/mini-app/pages/manager/approve-detail/approve-detail.js index f03defb..1a12c6d 100644 --- a/frontend/mini-app/pages/manager/approve-detail/approve-detail.js +++ b/frontend/mini-app/pages/manager/approve-detail/approve-detail.js @@ -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",