From 73e524bdcaacf0d179296ef300066cecc58d8e2e Mon Sep 17 00:00:00 2001 From: wsb1224 Date: Sat, 4 Jul 2026 10:28:22 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=89=B9=E9=87=8F=E5=8C=B9=E9=85=8D?= =?UTF-8?q?=E7=89=A9=E6=B5=81=E6=94=AF=E6=8C=81=E8=BF=90=E5=8D=95=E5=8F=B7?= =?UTF-8?q?=E5=8C=B9=E9=85=8D=E5=92=8C=E6=94=B6=E4=BB=B6=E4=BA=BA=E6=A8=A1?= =?UTF-8?q?=E7=B3=8A=E5=8C=B9=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 匹配优先运单号精确匹配,未命中再按收件人模糊匹配 2. _match_orders_by_name改为LIKE模糊匹配,支持部分姓名匹配 3. 限制最多返回10条候选避免过多结果 Co-Authored-By: Claude Sonnet 4.6 --- backend/app/api/orders.py | 31 +++++++++++++++++++++------ backend/app/services/order_service.py | 14 +++++++++--- 2 files changed, 35 insertions(+), 10 deletions(-) diff --git a/backend/app/api/orders.py b/backend/app/api/orders.py index 4c7acfe..41325d8 100644 --- a/backend/app/api/orders.py +++ b/backend/app/api/orders.py @@ -446,14 +446,31 @@ def batch_match_logistics( else: raise AppException(code=ErrorCode.PARAM_ERROR, message=f"不支持的模式: {payload.mode}", status_code=400) - # 2. 对有收件人的条目自动匹配订单 + # 2. 对有收件人或运单号的条目自动匹配订单 + from backend.app.models.business import SalesOrder for item in items: - recipient = item.get("recipient_name") - if recipient: - candidates = order_service._match_orders_by_name(recipient, session) - item["candidates"] = candidates - else: - item["candidates"] = [] + candidates = [] + # 先尝试运单号精确匹配 + tn = (item.get("tracking_number") or "").strip() + if tn: + order = session.query(SalesOrder).filter( + SalesOrder.tracking_number == tn, + SalesOrder.deleted == 0, + ).first() + if order: + candidates = [{ + "order_id": order.id, + "order_no": order.order_no, + "customer_name": order.customer_name, + "order_status": order.order_status, + "tracking_number": order.tracking_number, + }] + # 运单号未匹配到,尝试按收件人模糊匹配 + if not candidates: + recipient = (item.get("recipient_name") or "").strip() + if recipient: + candidates = order_service._match_orders_by_name(recipient, session) + item["candidates"] = candidates return success_payload({"items": items}) diff --git a/backend/app/services/order_service.py b/backend/app/services/order_service.py index ea64e7f..2a74771 100644 --- a/backend/app/services/order_service.py +++ b/backend/app/services/order_service.py @@ -2598,12 +2598,20 @@ class OrderService: return results def _match_orders_by_name(self, name, session): - """Match orders by exact customer_name.""" + """模糊匹配客户姓名,返回候选订单列表。""" from backend.app.models.business import SalesOrder + from sqlalchemy import or_ + if not name or not name.strip(): + return [] + name = name.strip() orders = session.query(SalesOrder).filter( - SalesOrder.customer_name == name, + or_( + SalesOrder.customer_name == name, + SalesOrder.customer_name.like(f"%{name}%"), + name.like(f"%{SalesOrder.customer_name}%"), + ), SalesOrder.deleted == 0, - ).all() + ).limit(10).all() return [ { "order_id": o.id,