feat: 询价流程接入事件异常等待起停

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-09-21 18:28:35 +08:00
co-authored by Cursor
parent fc1b85113d
commit a878b046d2
11 changed files with 131 additions and 5 deletions
+41
View File
@@ -67,6 +67,7 @@ class TestDealOutcome(unittest.TestCase):
ticket = self.ledger.get_ticket(work_order_no=self.wo)
self.assertEqual(ticket.status, "已成交")
self.assertEqual(ticket.next_followup_at, "")
self.assertEqual(ticket.event_wait_kind, "")
def test_deal_notify_card_omits_sales_label(self) -> None:
"""成交通知不要「销售」二字:标题副标和正文都不写。"""
@@ -126,6 +127,7 @@ class TestDealOutcome(unittest.TestCase):
ticket = self.ledger.get_ticket(work_order_no=self.wo)
self.assertEqual(ticket.status, "未成交")
self.assertEqual(ticket.lost_reason, "")
self.assertEqual(ticket.event_wait_kind, "lost_reason")
view = self.ledger.get_for_agent(work_order_no=self.wo, sender_id="sales1")
self.assertEqual(view.get("wait_phase"), "wait_lost_reason")
captured = capture_lost_reason(
@@ -134,6 +136,7 @@ class TestDealOutcome(unittest.TestCase):
self.assertTrue(captured.get("ok"))
ticket = self.ledger.get_ticket(work_order_no=self.wo)
self.assertEqual(ticket.lost_reason, "客人比价了")
self.assertEqual(ticket.event_wait_kind, "")
view = self.ledger.get_for_agent(work_order_no=self.wo, sender_id="sales1")
self.assertEqual(view.get("wait_phase"), "done")
@@ -150,6 +153,7 @@ class TestDealOutcome(unittest.TestCase):
self.assertNotIn("跟进周期已顺延", text)
def test_negotiate_keeps_wait_deal(self) -> None:
self.ledger.start_event_wait(work_order_no=self.wo, wait_kind="deal")
out = finish_deal_outcome(
ledger=self.ledger,
work_order_no=self.wo,
@@ -161,6 +165,7 @@ class TestDealOutcome(unittest.TestCase):
self.assertEqual(out.get("phase"), "wait_deal")
ticket = self.ledger.get_ticket(work_order_no=self.wo)
self.assertEqual(ticket.status, "协商中")
self.assertEqual(ticket.event_wait_kind, "")
self.assertTrue(ticket.next_followup_at)
view = self.ledger.get_for_agent(work_order_no=self.wo, sender_id="sales1")
self.assertEqual(view.get("wait_phase"), "wait_deal")
@@ -245,3 +250,39 @@ class TestDealOutcome(unittest.TestCase):
self.assertEqual(len(rows), 1)
self.assertEqual(rows[0]["work_order_no"], self.wo)
self.assertEqual(self.ledger.get_ticket(work_order_no=self.wo).next_followup_at, "")
def test_reask_starts_deal_wait(self) -> None:
"""协商再问发出后,重新盯销售成交跟进。"""
import importlib.util
import os
path = os.path.join(
os.path.dirname(__file__), "..", "agent", "jobs", "deal_followup_poll.py"
)
spec = importlib.util.spec_from_file_location("deal_followup_poll_ee", path)
self.assertIsNotNone(spec)
self.assertIsNotNone(spec.loader)
mod = importlib.util.module_from_spec(spec)
spec.loader.exec_module(mod)
class Cfg:
wecom_corp_id = ""
wecom_secret = ""
wecom_agent_id = "0"
mod._send_group_reask = lambda **kwargs: True
ok = mod._reask_one(
{
"work_order_no": self.wo,
"collab_chat_id": "wr1",
"sales_name": "吴吉林",
"facts": {},
"quote": {},
"business_line": "SEA",
},
settings=Cfg(),
ledger=self.ledger,
)
self.assertTrue(ok)
ticket = self.ledger.get_ticket(work_order_no=self.wo)
self.assertEqual(ticket.event_wait_kind, "deal")