员工岗位可重新启用;调价认空运航线;会话存档跳号补拉;陆运报价按车型列回填
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user