调价后的新价格写入报价单;多段段前的货物带到各段,协同群不再把体积里的星号吃掉。海运字段齐了先核对再查价。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-10-03 22:39:54 +08:00
co-authored by Cursor
parent 0a14b4cc15
commit 7c77e45e03
32 changed files with 1384 additions and 75 deletions
@@ -1091,6 +1091,31 @@ class AirGroupCollabTests(unittest.TestCase):
self.assertTrue(any(f"工单{wo}的1个附件已保存到后台工单" in t for t in self._texts()))
self.assertTrue(any("报价单已发送,请确认成交状态" in t for t in self._texts()))
def test_reactivate_after_airline_file_is_deal_not_blank_sheet(self) -> None:
"""航线附件已报价后,再发工单号回到成交跟进,不再要航线报价。"""
wo = self._create_air()
handle_air_group(
self._msg(sender="air1", text=wo, chat="wr_air_1", mid="af3b"),
flow=self.flow,
ledger=self.ledger,
)
handle_air_group(
self._file(sender="air1", filename="航线报价.pdf", chat="wr_air_1", mid="af4b"),
flow=self.flow,
ledger=self.ledger,
)
before = len(self.groups.sent)
phase = handle_air_group(
self._msg(sender="sales1", text=wo, chat="wr_air_1", mid="af4c"),
flow=self.flow,
ledger=self.ledger,
)
self.assertEqual(phase, "activated_deal")
added = self.groups.sent[before:]
texts = "\n".join(x.get("content") or "" for x in added)
self.assertIn("请确认成交状态", texts)
self.assertFalse(any(x.get("kind") == "file" for x in added))
def test_image_rejected(self) -> None:
wo = self._create_air()
handle_air_group(
@@ -1376,6 +1401,45 @@ class AirGroupCollabTests(unittest.TestCase):
self.assertIn("锁舱失败的原因:该航班日期不存在可锁定的配载记录", joined)
self.assertNotIn("TMS接口异常,IT运维排查中", joined)
def test_paused_after_lock_still_records_lost_reason(self) -> None:
"""锁舱失败标了暂停后,未成交和原因仍要入账,不能回 TMS 异常。"""
wo = self._create_air()
handle_air_group(
self._msg(sender="sales1", text=wo, chat="wr_air_paused_lost", mid="pl0"),
flow=self.flow,
ledger=self.ledger,
injected_intent="air_activate",
)
self.ledger.mark_system_exception(
work_order_no=wo,
system_exception="TMS",
system_exception_reason="空运锁舱接口调用失败",
step="tms_lock",
payload={},
)
self.groups.sent.clear()
phase = handle_air_group(
self._msg(sender="sales1", text="未成交", chat="wr_air_paused_lost", mid="pl1"),
flow=self.flow,
ledger=self.ledger,
injected_intent="deal_lost",
)
self.assertEqual(phase, "wait_lost_reason")
self.assertNotIn("TMS接口异常", "\n".join(self._texts()))
self.groups.sent.clear()
phase = handle_air_group(
self._msg(sender="sales1", text="客户不需要了", chat="wr_air_paused_lost", mid="pl2"),
flow=self.flow,
ledger=self.ledger,
injected_intent="other",
)
self.assertEqual(phase, "done")
joined = "\n".join(self._texts())
self.assertIn("已记下未成交原因:客户不需要了", joined)
self.assertNotIn("TMS接口异常", joined)
ticket = self.ledger.get_ticket(work_order_no=wo)
self.assertEqual(ticket.lost_reason, "客户不需要了")
def test_release_fail_tells_operator_and_tms_reason(self) -> None:
"""释放失败同理:操作人、原因、已通知IT,不要系统异常兜底。"""
wo = self._create_air()