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:
parent
8948c452c2
commit
73e524bdca
@ -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})
|
||||
|
||||
|
||||
@ -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,
|
||||
|
||||
Loading…
Reference in New Issue
Block a user