机器人显示名与站点标题可配;多段联运列表投影;协同群监听对账;工单附件落存;模板与工单后台补强

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
linmianxun
2026-10-19 09:41:59 +08:00
co-authored by Cursor
parent 277cdc1c28
commit 2b528758b4
119 changed files with 6760 additions and 3516 deletions
@@ -265,6 +265,64 @@ class ContinueTicketTests(unittest.TestCase):
self.assertTrue(any("已记录为「已成交」" in x for x in replies))
self.assertIn(wo, "\n".join(replies))
def test_resume_lost_with_reason_replays_closed_ack(self) -> None:
"""未成交且原因已记:继续工单只重播关单回执,不再要原因、不问运输方式。"""
from agent.policy.bot_reply import override_catalog
ledger = MemoryLedger()
created = ledger.create_ticket(
sender_id="u-lost-done", business_line="AIR", facts=COMPLETE_AIR
)
wo = created["work_order_no"]
ledger.upsert_quote(
work_order_no=wo,
quote={"total": "USD 1", "eta": "-", "valid_until": "-"},
to_status="已报价",
)
ledger.render_quote(
work_order_no=wo,
business_line="AIR",
facts=COMPLETE_AIR,
quote={"total": "USD 1"},
)
ledger.transition(
work_order_no=wo, to_status="未成交", lost_reason="客人比价了"
)
override_catalog(
{
"lost.reason_ack": (
"已将未成交原因“{{lost_reason}}”记录在后台,"
"工单 {{ticket_no}}已关闭,智能体不再跟进该工单,请悉知。"
)
}
)
flow = AirTextInquiryFlow(ledger)
replies: list[str] = []
def reply(text: str, extra=None) -> None:
replies.append(text)
_ = extra
try:
phase = flow.resume_historical(
sender_id="u-lost-done",
work_order_no=wo,
reply=reply,
text=f"继续工单{wo}",
)
finally:
override_catalog(None)
self.assertEqual(phase, "done")
self.assertEqual(
replies,
[
f"已将未成交原因“客人比价了”记录在后台,"
f"工单 {wo}已关闭,智能体不再跟进该工单,请悉知。"
],
)
self.assertFalse(any("请补充未成交原因" in x for x in replies))
self.assertFalse(any("运输方式" in x for x in replies))
def test_resume_waiting_lost_reason_saves_sentence(self) -> None:
"""等未成交原因时继续工单,下一句要写入原因,不能再要一遍。"""
ledger = MemoryLedger()