重启后仍能跳过协同出方案,未成交可同一句带原因;海陆有价卡改为直接生成报价单。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-09-23 18:45:28 +08:00
co-authored by Cursor
parent 378bb892b3
commit 84207bb4e5
18 changed files with 414 additions and 32 deletions
+60 -1
View File
@@ -9,7 +9,11 @@ import unittest
from agent.ledger.memory_ledger import MemoryLedger
from agent.policy import inquiry_copy as copy
from agent.policy.air_text_flow import AirTextInquiryFlow, FlowSession
from agent.policy.deal_outcome import capture_lost_reason, finish_deal_outcome
from agent.policy.deal_outcome import (
capture_lost_reason,
finish_deal_outcome,
harvest_inline_lost_reason,
)
from agent.policy.sea_text_flow import SeaTextInquiryFlow
@@ -144,6 +148,61 @@ class TestDealOutcome(unittest.TestCase):
self.assertEqual(copy.lost_reason_ack("客户不要了"), "已记下未成交原因:客户不要了。")
self.assertEqual(copy.lost_reason_ack("价格高。"), "已记下未成交原因:价格高。")
def test_harvest_inline_lost_reason(self) -> None:
self.assertEqual(harvest_inline_lost_reason("未成交,原因客户不想要了"), "客户不想要了")
self.assertEqual(harvest_inline_lost_reason("未成交,客户不想要了"), "客户不想要了")
self.assertEqual(harvest_inline_lost_reason("未成交:价格太高"), "价格太高")
self.assertEqual(harvest_inline_lost_reason("未成交原因客户不想要了"), "客户不想要了")
self.assertEqual(harvest_inline_lost_reason("未成交"), "")
self.assertEqual(harvest_inline_lost_reason("未成交吗"), "")
self.assertEqual(harvest_inline_lost_reason("成交"), "")
def test_lost_with_inline_reason_finishes(self) -> None:
out = finish_deal_outcome(
ledger=self.ledger,
work_order_no=self.wo,
outcome="未成交",
facts={},
quote={},
business_line="SEA",
lost_reason="客户不想要了",
)
self.assertEqual(out.get("phase"), "done")
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, "")
self.assertEqual(
copy.deal_ack("未成交", self.wo, lost_reason="客户不想要了"),
"已记录为「未成交」。已记下未成交原因:客户不想要了。",
)
def test_private_lost_and_reason_same_message(self) -> None:
flow = AirTextInquiryFlow(self.ledger)
flow._save(
FlowSession(
sender_id="sales1",
thread_id="sales1",
phase="wait_deal",
business_line="SEA",
work_order_no=self.wo,
allowed=(copy.BTN_DEAL, copy.BTN_LOST, copy.BTN_NEGOTIATE),
)
)
replies: list[str] = []
phase = flow.on_text(
sender_id="sales1",
text="未成交,原因客户不想要了",
reply=lambda t, extra=None: replies.append(t),
)
self.assertEqual(phase, "done")
self.assertEqual(
self.ledger.get_ticket(work_order_no=self.wo).lost_reason, "客户不想要了"
)
joined = "\n".join(replies)
self.assertIn("客户不想要了", joined)
self.assertNotIn("请补充未成交原因", joined)
def test_negotiate_ack_names_followup_day(self) -> None:
text = copy.deal_ack("协商中", "WO202609190007", "2026-09-24 09:00:00")
self.assertEqual(