海运补问保留贸易条款;陆运多车型价表按列回填,车型码不进起始地
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -518,6 +518,41 @@ class SeaTextInquiryTests(unittest.TestCase):
|
||||
self.assertNotIn("1.贸易条款(必填)", body)
|
||||
self.assertNotEqual(phase, "need_mode")
|
||||
|
||||
def test_clarify_qty_keeps_gangdaogang_and_accepts_full_box_qty(self) -> None:
|
||||
"""已有港到港时只补「装满」货量:不再追问货物数量和贸易条款。"""
|
||||
inq = "东莞到新西兰利特尔顿港和奥克兰港!报一下40HQ和20GP的价格,产品是装奶粉的罐子,条款港到港"
|
||||
facts = {
|
||||
"起运港": "东莞",
|
||||
"目的港": "利特尔顿港",
|
||||
"品名": "奶粉罐子",
|
||||
"整柜或拼柜": "整柜",
|
||||
"箱型箱量": "40HQ、20GP",
|
||||
"贸易条款": "港到港",
|
||||
"运输分类": "Port to Port",
|
||||
}
|
||||
phase = self.flow.on_text(
|
||||
sender_id="s-full-box",
|
||||
text=inq,
|
||||
reply=self._reply,
|
||||
injected_facts=facts,
|
||||
injected_mode="SEA",
|
||||
)
|
||||
self.assertEqual(phase, "clarify")
|
||||
self.replies.clear()
|
||||
phase = self.flow.on_text(
|
||||
sender_id="s-full-box",
|
||||
text="1.货物数量(必填):40HQ、20GP 装满,报价2个价格\n(如:20吨)",
|
||||
reply=self._reply,
|
||||
)
|
||||
self.assertEqual(phase, "wait_confirm")
|
||||
sess = self.flow.session_of("s-full-box")
|
||||
self.assertEqual(sess.facts.get("贸易条款"), "港到港")
|
||||
self.assertIn("装满", str(sess.facts.get("货量") or ""))
|
||||
body = "\n".join(self.replies)
|
||||
self.assertIn("贸易条款(必填):港到港", body)
|
||||
self.assertNotIn("1.货物数量(必填):\n", body)
|
||||
self.assertNotIn("贸易条款(必填):\n(如:门到门、港到港)", body)
|
||||
|
||||
def test_harvest_class_from_reply_then_quotes(self) -> None:
|
||||
first = dict(COMPLETE_SEA)
|
||||
first.pop("运输分类")
|
||||
@@ -1341,6 +1376,45 @@ class SeaGroupCollabFieldTests(unittest.TestCase):
|
||||
self.assertEqual(str(rows["海运费"].get("amount") or ""), "100.00")
|
||||
self.assertEqual(str(rows["燃油附加费"].get("amount") or ""), "15.00")
|
||||
|
||||
def test_land_multi_vehicle_rates_not_hq_fee(self) -> None:
|
||||
"""陆运整车多车型价:不能抽成 HQ=19500;要拆成 5T/8T/10T/40HQ/45HQ 价表。"""
|
||||
from agent.llm.extract_text import extract_product_quote
|
||||
|
||||
quote = extract_product_quote(
|
||||
"太原富士康--春疆\n车型:\n5T/8T:13000\n10T:14000\n40HQ/45HQ:19500\n 含0点税",
|
||||
business_line="LAND",
|
||||
transport_mode="陆运",
|
||||
)
|
||||
rates = dict(quote.get("vehicleRates") or {})
|
||||
self.assertEqual(rates.get("5T"), "13000")
|
||||
self.assertEqual(rates.get("8T"), "13000")
|
||||
self.assertEqual(rates.get("10T"), "14000")
|
||||
self.assertEqual(rates.get("40HQ"), "19500")
|
||||
self.assertEqual(rates.get("45HQ"), "19500")
|
||||
self.assertEqual(str(quote.get("remark") or ""), "含0点税")
|
||||
names = {str(x.get("name") or "") for x in (quote.get("fee_rows") or [])}
|
||||
self.assertNotIn("HQ", names)
|
||||
self.assertNotIn("5T", names)
|
||||
self.assertNotIn("40HQ", names)
|
||||
self.assertIn("陆运费", names)
|
||||
veh_names = {str(x.get("name") or "") for x in (quote.get("vehicle_fee_rows") or [])}
|
||||
self.assertIn("5T", veh_names)
|
||||
self.assertIn("40HQ", veh_names)
|
||||
|
||||
def test_land_multi_vehicle_40_slash_45hq(self) -> None:
|
||||
"""口语 40/45HQ 19500 要拆成 40HQ+45HQ,不能只认 45HQ。"""
|
||||
from agent.llm.extract_text import extract_product_quote
|
||||
|
||||
quote = extract_product_quote(
|
||||
"车型:5T/8T:13000 10T:14000 40/45HQ 19500 含0点 国六车提货",
|
||||
business_line="LAND",
|
||||
)
|
||||
rates = dict(quote.get("vehicleRates") or {})
|
||||
self.assertEqual(rates.get("40HQ"), "19500")
|
||||
self.assertEqual(rates.get("45HQ"), "19500")
|
||||
self.assertEqual(rates.get("5T"), "13000")
|
||||
self.assertIn("含0点", str(quote.get("remark") or ""))
|
||||
|
||||
def test_land_weight_band_unit_price_and_rates(self) -> None:
|
||||
"""陆运集拼:2-500KG 单价 + 燃油附加费率/税率,不能把档下限 2 当成燃油附加费。"""
|
||||
from agent.llm.extract_text import extract_product_quote
|
||||
@@ -1379,6 +1453,24 @@ class SeaGroupCollabFieldTests(unittest.TestCase):
|
||||
self.assertEqual(str(rows["空运费"].get("quantity") or ""), "100")
|
||||
self.assertEqual(str(quote.get("total") or ""), "199.0")
|
||||
|
||||
def test_air_unit_qty_without_amount_multiplies(self) -> None:
|
||||
"""WO028:只写单价+数量、不写金额时,行金额必须是单价×数量,不能落成单价。"""
|
||||
from agent.llm.extract_text import extract_product_quote
|
||||
|
||||
quote = extract_product_quote(
|
||||
"空运费单价CNY17.00 数量3500@智价通AIQ\n备注:1:250+ 吨上\nWO202610230028",
|
||||
business_line="AIR",
|
||||
transport_mode="空运",
|
||||
)
|
||||
rows = {str(x.get("name") or ""): x for x in (quote.get("fee_rows") or [])}
|
||||
self.assertIn("空运费", rows)
|
||||
self.assertEqual(str(rows["空运费"].get("unit_price") or ""), "17.00")
|
||||
self.assertEqual(str(rows["空运费"].get("quantity") or ""), "3500")
|
||||
self.assertEqual(str(rows["空运费"].get("amount") or ""), "59500")
|
||||
self.assertEqual(str(rows["空运费"].get("currency") or ""), "CNY")
|
||||
self.assertEqual(str(rows["空运费"].get("remark") or ""), "1:250+ 吨上")
|
||||
self.assertEqual(str(quote.get("total") or ""), "59500.0")
|
||||
|
||||
def test_air_fee_priced_with_unit_between_name_and_unit_price(self) -> None:
|
||||
"""WO003:空运费, KG, 单价…数量…金额… 中间夹单位时不能把单价当行金额。"""
|
||||
from agent.llm.extract_text import extract_product_quote
|
||||
|
||||
Reference in New Issue
Block a user