员工岗位可重新启用;调价认空运航线;会话存档跳号补拉;陆运报价按车型列回填

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
linmianxun
2026-10-28 19:48:47 +08:00
co-authored by Cursor
parent 2b528758b4
commit 56ba8e93b5
62 changed files with 2960 additions and 793 deletions
+5 -2
View File
@@ -117,11 +117,14 @@ def handle_card_action(
wo = copy.work_order_from_card_meta(payload)
code = str((payload or {}).get("response_code") or extra.get("response_code") or "")[:24]
msgtype = str(extra.get("msgtype") or "text")
# 文本 ack 按工单+动作去重;置灰更新仍带 code(每次 ResponseCode 只能用一次)
# 文本/方案卡按工单+动作+waitVersion 去重。
# 调价后再点「生成」时正文前缀相同,若不带 waitVersion,第二次方案卡会被 PG 唯一键吃掉,
# 价格卡已置灰成「已提交」但销售收不到生成 Excel/PDF 的方案卡。
wait_ver = int(getattr(sess, "wait_version", 0) or 0) if sess is not None else 0
if msgtype == "update_template_card":
dedupe_key = f"card-grey:{sender_id}:{wo}:{code}:{action}"
else:
dedupe_key = f"card-ack:{sender_id}:{wo}:{action}:{body[:24]}"
dedupe_key = f"card-ack:{sender_id}:{wo}:{action}:v{wait_ver}:{body[:24]}"
ok, info = msg_store.enqueue_outbound(
touser=sender_id,
content=body,
@@ -19,6 +19,7 @@ from agent.policy.sea_group_ops import (
apply_tms_quote_choice,
capture_group_lost_reason,
dissolve_group,
dissolve_orphan_group,
group_client_of,
handle_group_file,
hydrate_ticket,
@@ -82,6 +83,24 @@ def handle_group_inbound(
ticket = _find_ticket(book, chat_id)
if ticket is None:
logger.info("group_inbound 对不上工单 chat=%s", chat_id)
# 老群/迁库丢绑定:对不上工单时,「解散群」仍按企微当前成员清人。
from agent.routing.group_intent import INTENT_DISSOLVE, classify_group_text
kind_orphan = (message.msg_type or "text").lower()
if kind_orphan in {"", "text"} and (
classify_group_text(message.content or "", injected=injected_intent)
== INTENT_DISSOLVE
):
logger.info(
"group_inbound 无工单仍解散 chat=%s sender=%s",
chat_id,
message.sender_id,
)
return dissolve_orphan_group(
flow=engine,
chat_id=chat_id,
sender_id=message.sender_id or "",
)
return "group_ignore"
if flow is None:
view0 = ticket_view(ticket)
@@ -156,6 +156,7 @@ def _drop_other_mode_drafts(*, owner: str, sender_id: str) -> None:
def _flow_waiting_lost_reason(sender_id: str, sea, air, land):
"""谁在等未成交原因就交给谁。刚记下未成交的那条优先。"""
from agent.policy.deal_outcome import ticket_missing_in_ledger
from agent.policy.handoff_human import is_handoff_frozen
waiting = []
@@ -165,6 +166,20 @@ def _flow_waiting_lost_reason(sender_id: str, sea, air, land):
continue
if (sess.phase or "").strip() != "wait_lost_reason":
continue
# 清数后主账无单:丢掉孤儿书签,不要继续抢走新询价。
if ticket_missing_in_ledger(
getattr(flow, "_ledger", None),
work_order_no=str(getattr(sess, "work_order_no", "") or ""),
sender_id=sender_id,
):
abandon = getattr(flow, "abandon_orphan_lost_wait", None)
if callable(abandon):
abandon(sess)
else:
drop = getattr(flow, "drop_current_bookmark", None)
if callable(drop):
drop(sender_id)
continue
waiting.append((int(getattr(sess, "wait_version", 0) or 0), flow))
if not waiting:
return None