陆运选项不全时改为复制填空清单,方便销售按编号回填。

停发填写样例图,同群只跟当前工单,重量体积统一为 KG/CBM。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-09-23 17:10:13 +08:00
co-authored by Cursor
parent 2334524bb8
commit 378bb892b3
33 changed files with 1204 additions and 265 deletions
@@ -167,6 +167,20 @@ class AirGroupCollabTests(unittest.TestCase):
self.assertIn("起运地:ZUH", text)
self.assertIn("\n\n协同补充字段:\n是否含电:-", text)
self.assertIn("是否含磁:-", text)
general = copy.air_group_brief(
work_order_no="WO202609230017",
facts={
"起运地": "上海",
"目的地": "洛杉矶",
"品名": "普货",
},
quote=None,
collab_facts={},
has_price=False,
)
self.assertIn("是否含电:否", general)
self.assertIn("是否含磁:否", general)
self.assertNotIn("是否含电:-", general)
self.assertIn("\n\nTMS报价:\nTMS 暂无匹配报价", text)
self.assertNotIn("当前工单:", text)
self.assertNotIn("贸易条款", text)
@@ -402,6 +416,78 @@ class AirGroupCollabTests(unittest.TestCase):
self.assertIn("是否含磁:是", joined)
self.assertIn("是否含电:-", joined)
def test_activate_general_cargo_defaults_battery_and_magnet(self) -> None:
"""品名是普货:群内激活后含电、含磁都是否,报价单也带上。"""
created = self.ledger.create_ticket(
sender_id="sales1",
business_line="AIR",
facts={
"起运地": "上海",
"目的地": "洛杉矶",
"品名": "普货",
"件数": "3",
"毛重": "100",
"体积": "2",
"包装类型": "纸箱",
"报价日期": "2026-09-16",
},
)
wo = created["work_order_no"]
self.ledger.upsert_quote(
work_order_no=wo,
quote={"total": "USD 800", "source": "TMS", "quoteId": "QT-AIR-1"},
to_status="已报价",
)
handle_air_group(
self._msg(sender="sales1", text=wo, chat="wr_air_1", mid="gc1"),
flow=self.flow,
ledger=self.ledger,
)
ticket = self.ledger.get_ticket(work_order_no=wo)
self.assertEqual(ticket.collab_facts.get("是否含电"), "否")
self.assertEqual(ticket.collab_facts.get("是否含磁"), "否")
joined = "\n".join(self._texts())
self.assertIn("是否含电:否", joined)
self.assertIn("是否含磁:否", joined)
fill = dict(getattr(self.ledger, "last_render", {}).get("facts") or {})
self.assertEqual(fill.get("是否含电") or fill.get("has_battery"), "否")
self.assertEqual(fill.get("是否含磁") or fill.get("has_magnet"), "否")
def test_activate_general_cargo_keeps_explicit_battery(self) -> None:
"""普货只补空着的项;私聊已经说含电,激活不能改成否。"""
created = self.ledger.create_ticket(
sender_id="sales1",
business_line="AIR",
facts={
"起运地": "上海",
"目的地": "洛杉矶",
"品名": "普货",
"件数": "3",
"毛重": "100",
"体积": "2",
"包装类型": "纸箱",
"报价日期": "2026-09-16",
"是否含电": "是",
},
)
wo = created["work_order_no"]
self.ledger.upsert_quote(
work_order_no=wo,
quote={"total": "USD 800", "source": "TMS", "quoteId": "QT-AIR-1"},
to_status="已报价",
)
handle_air_group(
self._msg(sender="sales1", text=wo, chat="wr_air_1", mid="gc2"),
flow=self.flow,
ledger=self.ledger,
)
ticket = self.ledger.get_ticket(work_order_no=wo)
self.assertEqual(ticket.collab_facts.get("是否含电"), "是")
self.assertEqual(ticket.collab_facts.get("是否含磁"), "否")
joined = "\n".join(self._texts())
self.assertIn("是否含电:是", joined)
self.assertIn("是否含磁:否", joined)
def test_second_group_occupied(self) -> None:
wo = self._create_air()
handle_air_group(
@@ -460,6 +546,57 @@ class AirGroupCollabTests(unittest.TestCase):
self.assertLess(texts[-1], files[-1])
self.assertEqual(len(files), 2)
def test_collab_after_activate_does_not_use_old_land_ticket(self) -> None:
"""
测服 WO202609230023:空运进原群激活后补含电含磁,
不能写到同群更早的陆运单 WO202609230007,摘要也不能变成空字段。
"""
land = self.ledger.create_ticket(
sender_id="sales1",
business_line="LAND",
facts={
"运输类型": "国内运输整车",
"始发站": "深圳",
"目的站": "上海",
"品名": "配件",
},
)["work_order_no"]
self.ledger.bind_collab_group(
work_order_no=land,
chat_id="wr_air_1",
member_ids=["sales1"],
)
air = self._create_air()
handle_air_group(
self._msg(sender="sales1", text=air, chat="wr_air_1", mid="mix0"),
flow=self.flow,
ledger=self.ledger,
)
self.assertEqual(self.ledger.find_by_collab_chat(chat_id="wr_air_1").work_order_no, air)
self.assertEqual(
str(self.ledger.get_ticket(work_order_no=land).collab_chat_id or ""),
"",
)
self.groups.sent.clear()
phase = handle_air_group(
self._msg(sender="sales1", text="含电 不含磁", chat="wr_air_1", mid="mix1"),
flow=self.flow,
ledger=self.ledger,
injected_intent="collab_fields",
)
self.assertEqual(phase, "fields_saved")
air_ticket = self.ledger.get_ticket(work_order_no=air)
land_ticket = self.ledger.get_ticket(work_order_no=land)
self.assertEqual(air_ticket.collab_facts.get("是否含电"), "是")
self.assertEqual(air_ticket.collab_facts.get("是否含磁"), "否")
self.assertFalse(land_ticket.collab_facts.get("是否含电"))
joined = "\n".join(self._texts())
self.assertIn(f"工单号:{air}", joined)
self.assertNotIn(f"工单号:{land}", joined)
self.assertIn("起运地:上海", joined)
self.assertIn("重量(KG):100", joined)
self.assertNotIn("起运地:-", joined)
def test_sales_quote_rejected(self) -> None:
wo = self._create_air()
handle_air_group(