空运「货交」只记提货地址,不再当成起运地。舱位旧说法「释放」先问航线是否取消,陆运通关口岸示例改为友谊关。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-10-11 20:45:53 +08:00
co-authored by Cursor
parent b070a9b7a7
commit 185abbf45e
16 changed files with 533 additions and 49 deletions
+85 -4
View File
@@ -20,6 +20,7 @@ from agent.policy import inquiry_copy as copy
from agent.routing.air_group_intent import (
INTENT_LOCK,
INTENT_RELEASE,
INTENT_RELEASE_ASK,
classify_air_group_text,
)
from agent.routing.dispatch import dispatch_inbound
@@ -201,7 +202,12 @@ class AirGroupCollabTests(unittest.TestCase):
def test_intent_lock_is_not_hardcoded(self) -> None:
self.assertEqual(classify_air_group_text("帮我锁舱 WO202609160001", allow_network=False), INTENT_LOCK)
self.assertEqual(classify_air_group_text("WO202609160001释放舱位", allow_network=False), INTENT_RELEASE)
self.assertEqual(classify_air_group_text("WO202609160001取消舱位", allow_network=False), INTENT_RELEASE)
self.assertEqual(classify_air_group_text("放舱", allow_network=False), INTENT_RELEASE)
self.assertEqual(classify_air_group_text("解锁舱", allow_network=False), INTENT_RELEASE)
self.assertEqual(classify_air_group_text("取消锁舱", allow_network=False), INTENT_RELEASE)
self.assertEqual(classify_air_group_text("WO202609160001释放舱位", allow_network=False), INTENT_RELEASE_ASK)
self.assertEqual(classify_air_group_text("把舱位释放了", allow_network=False), INTENT_RELEASE_ASK)
def test_airline_fee_wording_is_quote_not_adjust(self) -> None:
"""航线写「空运费改为900」是手工报价,不能先判成调价。比例和改总价仍是调价。"""
@@ -1278,9 +1284,84 @@ class AirGroupCollabTests(unittest.TestCase):
)
self.assertEqual(phase, "release_ok")
added = "\n".join(self._texts()[before:])
self.assertIn("释放", added)
self.assertIn("取消舱位", added)
self.assertNotIn("请确认成交状态", added)
def test_release_wording_asks_before_cancel(self) -> None:
"""说出释放舱位只提问。销售回「是」不算,航线确认后才取消。"""
wo = self._create_air()
handle_air_group(
self._msg(sender="air1", text=f"{wo}锁舱", chat="wr_air_ask", mid="ask0"),
flow=self.flow,
ledger=self.ledger,
injected_intent="air_lock",
)
self.groups.sent.clear()
phase = handle_air_group(
self._msg(sender="air1", text=f"{wo}释放舱位", chat="wr_air_ask", mid="ask1"),
flow=self.flow,
ledger=self.ledger,
)
self.assertEqual(phase, "release_ask")
self.assertIn("是否需要取消舱位?", "\n".join(self._texts()))
self.assertNotIn("已通知TMS执行空运取消舱位成功", "\n".join(self._texts()))
phase = handle_air_group(
self._msg(sender="sales1", text="是", chat="wr_air_ask", mid="ask2"),
flow=self.flow,
ledger=self.ledger,
)
self.assertEqual(phase, "not_airline")
self.assertNotIn("已通知TMS执行空运取消舱位成功", "\n".join(self._texts()))
phase = handle_air_group(
self._msg(sender="air1", text="是", chat="wr_air_ask", mid="ask3"),
flow=self.flow,
ledger=self.ledger,
)
self.assertEqual(phase, "release_ok")
self.assertIn("已通知TMS执行空运取消舱位成功", "\n".join(self._texts()))
def test_release_wording_can_be_declined(self) -> None:
wo = self._create_air()
handle_air_group(
self._msg(sender="air1", text=f"{wo}锁舱", chat="wr_air_ask_no", mid="no0"),
flow=self.flow,
ledger=self.ledger,
injected_intent="air_lock",
)
self.groups.sent.clear()
handle_air_group(
self._msg(sender="air1", text=f"{wo}把舱位释放了", chat="wr_air_ask_no", mid="no1"),
flow=self.flow,
ledger=self.ledger,
)
phase = handle_air_group(
self._msg(sender="air1", text="不用", chat="wr_air_ask_no", mid="no2"),
flow=self.flow,
ledger=self.ledger,
)
self.assertEqual(phase, "release_ask_dropped")
self.assertIn("已取消这次操作", "\n".join(self._texts()))
self.assertNotIn("已通知TMS执行空运取消舱位成功", "\n".join(self._texts()))
def test_cancel_cabin_words_release_immediately(self) -> None:
wo = self._create_air()
handle_air_group(
self._msg(sender="air1", text=f"{wo}锁舱", chat="wr_air_now", mid="now0"),
flow=self.flow,
ledger=self.ledger,
injected_intent="air_lock",
)
self.groups.sent.clear()
phase = handle_air_group(
self._msg(sender="air1", text=f"{wo}取消舱位", chat="wr_air_now", mid="now1"),
flow=self.flow,
ledger=self.ledger,
)
self.assertEqual(phase, "release_ok")
joined = "\n".join(self._texts())
self.assertIn("已通知TMS执行空运取消舱位成功", joined)
self.assertNotIn("是否需要取消舱位?", joined)
def test_sales_cannot_lock(self) -> None:
wo = self._create_air()
phase = handle_air_group(
@@ -1825,9 +1906,9 @@ class AirGroupCollabTests(unittest.TestCase):
)
self.assertEqual(phase, "system_exception")
joined = "\n".join(self._texts())
self.assertIn(f"工单{wo} 空运释放舱位失败。", joined)
self.assertIn(f"工单{wo} 空运取消舱位失败。", joined)
self.assertIn("操作人:HangXian", joined)
self.assertIn("释放舱位失败的原因:舱位不存在", joined)
self.assertIn("取消舱位失败的原因:舱位不存在", joined)
self.assertIn("已通知IT运维排查,请稍等。", joined)
self.assertNotIn("TMS接口异常,IT运维排查中", joined)