看板平均响应按协同分发统计;查价失败可从主账恢复;报价模板匹配与填表更稳,后台改名运营后台。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
linmianxun
2026-10-05 18:00:08 +08:00
co-authored by Cursor
parent e95e8869a6
commit 58df358577
28 changed files with 1493 additions and 245 deletions
@@ -0,0 +1,63 @@
import { buildDemandFields, quantitySummary } from "/@/views/inquiry/workOrder/demandFields";
test("land FTL shows vehicle not pieces", () => {
const rows = buildDemandFields({
businessLine: "LAND",
bizTypeLabel: "陆运",
origin: "上海",
destination: "春疆货场",
goodsName: "茶叶",
factsJson: JSON.stringify({
运输类型: "国内运输整车",
线路类别: "国内长途/零担",
运输分类: "普件",
"车型/数量": "53尺(16.5厢车)",
起运港: "上海",
目的港: "春疆货场",
品名: "茶叶",
报价日期: "2026-10-03",
}),
});
const map = Object.fromEntries(rows.map((r) => [r.label, r.value]));
expect(map["运输方式"]).toBe("陆运");
expect(map["运输类型"]).toBe("国内运输整车");
expect(map["车型/数量"]).toBe("53尺(16.5厢车)");
expect(map["始发站"]).toBe("上海");
expect(map["货物品名"]).toBe("茶叶");
expect(map["件数"]).toBeUndefined();
});
test("sea shows container spec", () => {
const rows = buildDemandFields({
businessLine: "SEA",
bizTypeLabel: "海运",
factsJson: JSON.stringify({
起运港: "上海",
目的港: "汉堡",
品名: "配件",
货量: "1x40HQ",
整柜或拼柜: "整柜",
箱型箱量: "40HQ*1",
贸易条款: "FOB",
运输分类: "Port to Port",
报价日期: "2026-10-03",
}),
});
const map = Object.fromEntries(rows.map((r) => [r.label, r.value]));
expect(map["箱型箱量"]).toBe("40HQ*1");
expect(map["整柜或拼柜"]).toBe("整柜");
expect(map["件数"]).toBeUndefined();
});
test("land LTL quantity summary uses volume", () => {
const qty = quantitySummary({
businessLine: "LAND",
factsJson: JSON.stringify({
运输类型: "国内运输拼车",
体积: "10CBM",
毛重: "50kg",
}),
});
expect(qty).toContain("体积(CBM) 10CBM");
expect(qty).not.toContain("车型");
});