@@ -205,6 +205,9 @@ class AirGroupCollabTests(unittest.TestCase):
|
||||
ledger=self.ledger,
|
||||
)
|
||||
self.assertEqual(phase, "activated")
|
||||
ticket = self.ledger.get_ticket(work_order_no=wo1)
|
||||
self.assertEqual(ticket.event_wait_kind, "air_quote")
|
||||
self.assertTrue(ticket.event_wait_started_at)
|
||||
joined = "\n".join(self._texts())
|
||||
self.assertIn(f"工单号:{wo1}", joined)
|
||||
self.assertIn("询价字段:", joined)
|
||||
@@ -386,6 +389,8 @@ class AirGroupCollabTests(unittest.TestCase):
|
||||
)
|
||||
self.assertEqual(phase, "quoted")
|
||||
ticket = self.ledger.get_ticket(work_order_no=wo)
|
||||
self.assertEqual(ticket.event_wait_kind, "deal")
|
||||
self.assertTrue(ticket.event_wait_started_at)
|
||||
self.assertEqual(ticket.status, "已报价")
|
||||
self.assertEqual(ticket.quote.get("total"), "USD 900")
|
||||
joined = "\n".join(self._texts())
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -676,6 +676,9 @@ class SeaSkipAndPullTests(unittest.TestCase):
|
||||
card_meta={"response_code": "rc-sea-1"},
|
||||
)
|
||||
self.assertEqual(phase, "wait_adopt")
|
||||
ticket = self.ledger.get_ticket(work_order_no=self.flow.session_of("s1").work_order_no)
|
||||
self.assertEqual(ticket.event_wait_kind, "adopt")
|
||||
self.assertTrue(ticket.event_wait_started_at)
|
||||
self.assertIn("已跳过内部协同", "\n".join(self.replies))
|
||||
scheme = "\n".join(x for x in self.replies if "报价方案" in x)
|
||||
self.assertIn("运输方式:海运", scheme)
|
||||
@@ -722,6 +725,9 @@ class SeaSkipAndPullTests(unittest.TestCase):
|
||||
card_meta={"response_code": "rc-pull-1"},
|
||||
)
|
||||
self.assertEqual(phase, "collab_group")
|
||||
ticket = self.ledger.get_ticket(work_order_no=wo)
|
||||
self.assertEqual(ticket.event_wait_kind, "product_quote")
|
||||
self.assertTrue(ticket.event_wait_started_at)
|
||||
joined = "\n".join(self.replies)
|
||||
self.assertIn("协同群已创建", joined)
|
||||
self.assertIn(wo, joined)
|
||||
@@ -1587,6 +1593,8 @@ class SeaGroupOpsTests(unittest.TestCase):
|
||||
)
|
||||
self.assertEqual(phase, "product_file_quote")
|
||||
ticket = self.ledger.get_ticket(work_order_no=wo)
|
||||
self.assertEqual(ticket.event_wait_kind, "deal")
|
||||
self.assertTrue(ticket.event_wait_started_at)
|
||||
self.assertEqual(ticket.attachments[0]["file_name"], "产品报价.pdf")
|
||||
self.assertEqual(ticket.status, "已报价")
|
||||
texts = [x.get("content") or "" for x in self.groups.sent if x.get("kind") == "text"]
|
||||
|
||||
Reference in New Issue
Block a user