fix: 已出号后新一轮询价不带上一单字段

点名海运时丢掉旧陆运补问草稿,避免补字段误发填写样例图。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-09-20 18:27:13 +08:00
co-authored by Cursor
parent b3b3cf2903
commit 19acbb9156
8 changed files with 256 additions and 9 deletions
+55 -7
View File
@@ -36,6 +36,44 @@ def _front_bookmark(sess) -> bool:
return phase in {"clarify", "need_mode", "need_land_options", "wait_confirm"}
def _drop_other_mode_drafts(*, owner: str, sender_id: str) -> None:
"""
本句已点名空运/海运/陆运:丢掉其它方式未出号的补问/选项草稿。
测服复现:旧陆运「选项未齐」书签还在,海运补「贸易条款 / 运输分类」会被陆运抢走,
回「参数提取不全」并发送填写样例图。已出号会话留在工单号索引,不当当前草稿。
"""
kind = (owner or "").upper()
sid = (sender_id or "").strip()
if not sid or kind not in {"SEA", "AIR", "LAND"}:
return
land = get_land_text_flow()
air = get_air_text_flow()
sea = get_sea_text_flow()
others = []
if kind != "LAND":
others.append(land)
if kind != "AIR":
others.append(air)
if kind != "SEA":
others.append(sea)
for flow in others:
sess = flow.session_of(sid)
phase = (getattr(sess, "phase", None) or "").strip() if sess else ""
if _front_bookmark(sess) or phase == "need_mode":
flow.drop_current_bookmark(sid)
logger.info(
"text_inquiry 丢掉其它方式草稿 owner=%s dropped_phase=%s sender=%s",
kind,
phase or "-",
sid,
)
if kind != "LAND":
clearer = getattr(land, "_clear_parked_confirm", None)
if callable(clearer):
clearer(sid)
def should_resume_other_as_inquiry(message: InboundMessage) -> bool:
"""
A 把补问短答标成闲聊时,仍续填当前询价。
@@ -63,7 +101,9 @@ def _pick_text_flow(*, sender_id: str, text: str, injected_mode: str = "", prefe
"""
按当前书签或本句运输方式选空运/海运/陆运流程。
陆运核对卡上的确定优先于旧海运书签,避免「确定」被海运/空运吃掉。
陆运核对卡上的「确定」优先于旧海运书签,避免「确定」被海运/空运吃掉。
本句点名海运/空运/陆运时盖掉其它方式的旧补问草稿。
核对卡优先于选项补问;海运/空运补问优先于旧陆运选项草稿,避免补贸易条款发陆运样例图。
正在补问时,补问书签优先于已报价调价,避免第 3 次反问出不了转人工卡。
A 已判成调价且当前不是补问:交给当前已报价工单,避免旧海运书签抢走。
图片识图在 Worker 写下的补问书签,HTTP 必须从 Redis 读到,否则「托盘」会变成再问运输方式。
@@ -82,11 +122,24 @@ def _pick_text_flow(*, sender_id: str, text: str, injected_mode: str = "", prefe
return land
sea = get_sea_text_flow()
air = get_air_text_flow()
spoken = (injected_mode or detect_transport_mode(text) or "").upper()
# 本句点名运输方式:盖掉其它方式的旧补问,避免海运补字段走陆运样例图。
if spoken in {"SEA", "AIR", "LAND"}:
_drop_other_mode_drafts(owner=spoken, sender_id=sender_id)
if spoken == "SEA":
return sea
if spoken == "LAND":
return land
return air
sea_sess = sea.session_of(sender_id)
land_sess = land.session_of(sender_id)
air_sess = air.session_of(sender_id)
# 补问/核对手稿优先于「已报价调价」,避免第 3 次反问被调价路由冲掉、出不了转人工卡。
# 核对卡仍优先:销售正在改体积/点确定,不能被另一方式的补问草稿抢走。
for sess, flow in ((land_sess, land), (air_sess, air), (sea_sess, sea)):
if sess is not None and (sess.phase or "").strip() == "wait_confirm" and not is_handoff_frozen(sess):
return flow
# 补问书签:海运/空运优先于旧陆运选项草稿。陆运「确定」已在上面拦过。
for sess, flow in ((sea_sess, sea), (air_sess, air), (land_sess, land)):
if _front_bookmark(sess):
return flow
if prefer_quoted:
@@ -97,11 +150,6 @@ def _pick_text_flow(*, sender_id: str, text: str, injected_mode: str = "", prefe
return sea
if land_sess and not is_handoff_frozen(land_sess) and (land_sess.business_line or "").upper() == "LAND":
return land
mode = (injected_mode or detect_transport_mode(text) or "").upper()
if mode == "SEA":
return sea
if mode == "LAND":
return land
return air