落地陆运群内协同:按填写样例拉群并只列本单协同项,进群把私聊已抽到的字段带上。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-09-18 13:38:02 +08:00
co-authored by Cursor
parent be95d823a2
commit 982b3a2317
25 changed files with 1451 additions and 315 deletions
+47 -6
View File
@@ -47,9 +47,11 @@ class LandTextInquiryFrontTests(unittest.TestCase):
self.ledger = CountingLedger()
self.flow = LandTextInquiryFlow(self.ledger)
self.replies: list[str] = []
self.extras: list[dict] = []
def _reply(self, text: str, extra=None) -> str:
self.replies.append(text)
self.extras.append(dict(extra or {}))
return ""
def _joined(self) -> str:
@@ -69,7 +71,12 @@ class LandTextInquiryFrontTests(unittest.TestCase):
self.assertIn("国内运输拼车", text)
self.assertIn("线路类别", text)
self.assertIn("运输分类", text)
self.assertIn("中港整车", text)
self.assertIn("填写样例见图", text)
self.assertNotIn("请补充陆运类型:", text)
img = [x for x in self.extras if x.get("msgtype") == "image"]
self.assertEqual(len(img), 1)
self.assertTrue(os.path.isfile(str(img[0].get("filepath") or "")))
def test_known_type_does_not_reask_type(self) -> None:
phase = self.flow.on_text(
@@ -82,8 +89,10 @@ class LandTextInquiryFrontTests(unittest.TestCase):
self.assertEqual(phase, "need_land_options")
self.assertNotIn("请选择运输类型", self._joined())
self.assertIn("国内长途/零担", self._joined())
self.assertIn("填写样例见图", self._joined())
self.assertTrue(any(x.get("msgtype") == "image" for x in self.extras))
def test_wrong_route_keeps_type(self) -> None:
def test_unlinked_route_still_keeps_type(self) -> None:
phase = self.flow.on_text(
sender_id="u1",
text="国内运输拼车,线路东南亚",
@@ -92,14 +101,16 @@ class LandTextInquiryFrontTests(unittest.TestCase):
injected_mode="LAND",
)
self.assertEqual(phase, "need_land_options")
self.assertIn("国内长途/零担", self._joined())
self.assertIn("运输分类", self._joined())
self.assertNotIn("填写样例", self._joined())
sess = self.flow.session_of("u1")
self.assertEqual(sess.facts.get("运输类型"), "国内运输拼车")
self.assertEqual(sess.facts.get("线路类别"), "东南亚")
def test_hk_lcl_asks_vehicle(self) -> None:
phase = self.flow.on_text(
sender_id="u1",
text="中港 东南亚 急件 零担",
text="中港零担/集拼 东南亚 急件",
reply=self._reply,
injected_facts={
"起运港": "广州",
@@ -119,7 +130,7 @@ class LandTextInquiryFrontTests(unittest.TestCase):
def test_hk_full_truck_skips_vehicle(self) -> None:
phase = self.flow.on_text(
sender_id="u1",
text="中港 东南亚 急件 整车",
text="中港整车 东南亚 急件",
reply=self._reply,
injected_facts={
"起运港": "广州",
@@ -403,7 +414,7 @@ class LandTextConfirmTests(unittest.TestCase):
self.replies.clear()
phase = self.flow.on_text(
sender_id="u1",
text="国内城配/拖车/打包;普件,常用线路/常规车型",
text="国内城配/拖车/打包;普件(东南亚、中港常用线路/常规车型)",
reply=self._reply,
injected_facts={"品名": "通信机柜及线缆配件", "运输类型": "陆运"},
injected_mode="LAND",
@@ -413,7 +424,7 @@ class LandTextConfirmTests(unittest.TestCase):
self.assertNotIn("请一次选择:运输类型", text)
self.assertIn("国内运输拼车", text)
self.assertIn("国内城配/拖车/打包", text)
self.assertIn("普件,常用线路/常规车型", text)
self.assertIn("普件(东南亚、中港常用线路/常规车型)", text)
class FakeGroupClient:
@@ -513,6 +524,36 @@ class LandTextPullTests(unittest.TestCase):
self.assertEqual(self.groups.created, [])
self.assertEqual(phase, "wait_collab")
def test_pull_rejects_unlisted_pair(self) -> None:
self.ledger.set_land_staff(
[
{"roleCode": "land", "status": "active", "wecomId": "p_sea", "name": "甲", "routes": "东南亚"},
]
)
self.flow.on_text(
sender_id="u1",
text="国内运输拼车 东南亚 急件",
reply=self._reply,
injected_facts={
"起运港": "广州",
"目的港": "河内",
"品名": "衣服",
"体积": "100CBM",
"毛重": "50kg",
},
injected_mode="LAND",
)
self.flow.on_text(sender_id="u1", text="确定", reply=self._reply)
self.replies.clear()
phase = self.flow.on_button(
sender_id="u1",
action=copy.BTN_PULL_COLLAB,
reply=self._reply,
)
self.assertEqual(self.groups.created, [])
self.assertIn("拉群失败,请排查填写内容,并重新发起工单。", "\n".join(self.replies))
self.assertNotEqual(phase, "collab_group")
def test_land_role_is_product_in_group(self) -> None:
from agent.policy.sea_group_ops import is_product