fix: 批量匹配物流支持运单号匹配和收件人模糊匹配

1. 匹配优先运单号精确匹配,未命中再按收件人模糊匹配
2. _match_orders_by_name改为LIKE模糊匹配,支持部分姓名匹配
3. 限制最多返回10条候选避免过多结果

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
wsb1224 2026-07-04 10:28:22 +08:00
parent 8948c452c2
commit 73e524bdca
2 changed files with 35 additions and 10 deletions

View File

@ -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")
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
else:
item["candidates"] = []
return success_payload({"items": items})

View File

@ -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(
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,