落地多段联运私聊:齐了才建单拉群,附件只收格子值,核对改正不再整单重开。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-09-23 15:08:15 +08:00
co-authored by Cursor
parent 6e3e09a316
commit 2334524bb8
30 changed files with 4033 additions and 40 deletions
+109
View File
@@ -327,5 +327,114 @@ class OralExtractTests(unittest.TestCase):
self.assertNotIn("【询价卡片】", joined)
class ImageOptionalClipTests(unittest.TestCase):
def test_numbered_extra_lines_do_not_enter_fields(self) -> None:
oral = """
运输方式:空运
目的地:印尼巴淡
件数:1PLT
重量:55.8KGS
体积:1.23CBM
包装类型:托盘
报价日期:2026-09-23
起运地:深圳坪山保税仓
货好时间:今天货好
4. 希望送到目的地工厂时间: 尽快
5.
提货地址:深圳市坪山区龙田街道大工业区绿荫北路7号601、
602、603 (保税仓库)
6. 送货地址: PT SAT NUSAPERSADA TBK----JL. PELITA VI NO.99
"""
snap = extract_inquiry_snapshot(oral, allow_b=False)
facts = snap["facts"]
self.assertEqual(facts.get("货好时间"), "今天货好")
self.assertIn("坪山区", facts.get("提货地址") or "")
self.assertNotIn("希望送到", facts.get("货好时间") or "")
self.assertNotIn("希望送到", facts.get("提货地址") or "")
self.assertNotIn("送货地址", facts.get("提货地址") or "")
self.assertIn("PT SAT", facts.get("收货地址") or "")
from agent.policy import inquiry_copy as copy
card = copy.ask_clarify(
facts=facts,
missing_keys=["品名"],
transport_mode="空运",
)
self.assertNotIn("希望送到", card)
self.assertNotIn("4.", card)
self.assertIn("收货地址", card)
# 测服手工海运报价单:表头和格子在同一行,还带 POL/POD/Terms。
SEA_SHEET_ORAL = """
起运港/POL(有指定起运港口的必填) 纽约港
*品名/Commodity: 机器设备 目的港/POD(有指定目的港口的必填) 巴生西港
*货物数量/Quantity (或提供装箱单/Packing List) 18
整柜或拼柜:FCL
箱型箱量:40HQ*1
贸易条款/Terms: CIF 要求运输时效/Requested Transit Time
运输分类:其他
报价日期:2026-09-07
"""
class SeaSheetHeaderClipTests(unittest.TestCase):
def test_quote_sheet_headers_do_not_stick_to_values(self) -> None:
"""报价单表头不能进补问:起运港只要纽约港,贸易条款只要 CIF。"""
snap = extract_inquiry_snapshot(SEA_SHEET_ORAL, allow_b=False)
facts = snap["facts"]
self.assertEqual(facts.get("起运港"), "纽约港")
self.assertEqual(facts.get("目的港"), "巴生西港")
self.assertEqual(facts.get("品名"), "机器设备")
self.assertEqual(str(facts.get("货量") or facts.get("货物数量") or ""), "18")
self.assertEqual(facts.get("整柜或拼柜"), "FCL")
self.assertEqual(facts.get("箱型箱量"), "40HQ*1")
self.assertEqual(facts.get("贸易条款"), "CIF")
self.assertNotIn("必填", facts.get("起运港") or "")
self.assertNotIn("Terms", facts.get("贸易条款") or "")
self.assertNotIn("Commodity", facts.get("品名") or "")
self.assertNotIn("时效", facts.get("贸易条款") or "")
from agent.policy import inquiry_copy as copy
card = "\n".join(
copy.inquiry_field_lines(
work_order_no="",
facts=facts,
transport_mode="海运",
)
)
self.assertIn("纽约港", card)
self.assertNotIn("口的必填", card)
self.assertNotIn("Commodity", card)
self.assertNotIn("Requested Transit", card)
def test_next_column_header_is_not_the_value(self) -> None:
"""
手工海运单同一行是「字段、格子、下一列表头」。
目的港只要巴生西港,不能收成费用汇总/POD Local Charges。
"""
oral = """
起运港/POL(有指定起运港口的必填) 纽约港 目的港/POD(有指定目的港口的必填) 巴生西港 费用汇总/POD Local Charges
*品名/Commodity: 机器设备 *货物数量/Quantity (或提供装箱单/Packing List) 18 提货地址/Place of Receipt
整柜或拼柜:FCL 箱型箱量:40HQ*1 送货地址/Place of Delivery
贸易条款/Terms: CIF 要求货物抵达时间/Requested Arrival Time
运输分类:其他
报价日期:2026-09-07
"""
facts = extract_inquiry_snapshot(oral, allow_b=False)["facts"]
self.assertEqual(facts.get("起运港"), "纽约港")
self.assertEqual(facts.get("目的港"), "巴生西港")
self.assertEqual(facts.get("品名"), "机器设备")
self.assertEqual(str(facts.get("货量") or facts.get("货物数量") or ""), "18")
self.assertEqual(facts.get("整柜或拼柜"), "FCL")
self.assertEqual(facts.get("箱型箱量"), "40HQ*1")
self.assertEqual(facts.get("贸易条款"), "CIF")
self.assertNotIn("费用汇总", facts.get("目的港") or "")
self.assertNotIn("提货地址", facts.get("货量") or facts.get("货物数量") or "")
self.assertNotIn("送货地址", facts.get("整柜或拼柜") or "")
self.assertNotIn("抵达", facts.get("箱型箱量") or "")
if __name__ == "__main__":
unittest.main()