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,