补齐成交跟进:按线路推成交通知、收下未成交原因、协商中按工作日再问。

成交走询价消息服务;陆运/海运私聊下一句能记下原因;协商中回执写明顺延三个工作日和下次 9:00。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-09-19 16:08:48 +08:00
co-authored by Cursor
parent 9bb69ae72e
commit 1a2e1d6cb2
31 changed files with 1638 additions and 30 deletions
+94 -2
View File
@@ -1732,12 +1732,104 @@ def group_deal_mention(*, sales_name: str, work_order_no: str) -> str:
return group_deal_followup(sales_name=sales_name, work_order_no=work_order_no)
def deal_ack(outcome: str, work_order_no: str) -> str:
def deal_ack(outcome: str, work_order_no: str, next_followup_at: str = "") -> str:
"""成交三态回执。协商中写明顺延三个工作日和下次再问的月日 9:00。"""
if outcome == "已成交":
return f"已记录为「已成交」。工单 {work_order_no} 已关闭智能体跟进。"
if outcome == "未成交":
return "已记录为「未成交」。请补充未成交原因。"
return f"已记录为「协商中」。工单 {work_order_no} 跟进周期已顺延。"
when = _followup_month_day(next_followup_at)
if when:
return f"已记录为「协商中」。已顺延三个工作日,{when}的9:00再次发起成交状态询问。"
return "已记录为「协商中」。已顺延三个工作日,第四个工作日早上9:00再次发起成交状态询问。"
def _followup_month_day(raw: str) -> str:
"""把主账再问时刻收成「9月24日」。"""
from datetime import datetime
text = (raw or "").strip()
if not text:
return ""
for fmt, n in (("%Y-%m-%d %H:%M:%S", 19), ("%Y-%m-%d", 10)):
try:
dt = datetime.strptime(text[:n], fmt)
return f"{dt.month}月{dt.day}日"
except ValueError:
continue
return ""
def lost_reason_ack(reason: str = "") -> str:
"""收下未成交原因后回显原句,不再追问。"""
text = (reason or "").strip()
if text.endswith(("。", ".", "!", "!", "?", "?")):
return f"已记下未成交原因:{text}"
return f"已记下未成交原因:{text}。" if text else "已记下未成交原因。"
def deal_notify_card(
*,
work_order_no: str,
sales_name: str,
facts: dict[str, str] | None,
quote: dict[str, Any] | None,
business_line: str,
) -> str:
"""成交通知文字兜底:方案卡压缩。不写销售,避免标题出现「销售 销售」。"""
no = (work_order_no or "").strip()
_ = sales_name
mode = scheme_transport_mode(business_line)
rows = scheme_horizontal_rows(
work_order_no=no,
facts=dict(facts or {}),
quote=dict(quote or {}),
transport_mode=mode,
)
lines = [f"成交通知 工单 {no}"]
lines.extend(f"{row['keyname']}:{row['value']}" for row in rows)
return "\n".join(lines)
def deal_notify_wecom_payload(
*,
work_order_no: str,
sales_name: str,
facts: dict[str, str] | None,
quote: dict[str, Any] | None,
business_line: str,
) -> dict[str, Any]:
"""
成交通知卡:走询价消息服务,不走询价小助手。
字段按报价方案卡压缩,避免超过 6 格。标题不写销售。
"""
no = (work_order_no or "").strip()
_ = sales_name
mode = scheme_transport_mode(business_line)
rows = scheme_horizontal_rows(
work_order_no=no,
facts=dict(facts or {}),
quote=dict(quote or {}),
transport_mode=mode,
)
from agent.config import get_settings
base = str(getattr(get_settings(), "public_base_url", "") or "").strip().rstrip("/")
action_url = base or "https://work.weixin.qq.com"
return {
"msgtype": "template_card",
"wecom_app": "notify",
"template_card": {
"card_type": "text_notice",
"source": {"desc": "成交通知", "desc_color": 0},
"main_title": {
"title": f"成交通知 工单 {no}",
},
"horizontal_content_list": rows,
"card_action": {"type": 1, "url": action_url},
},
}
def air_need_work_order() -> str: