You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
mail-yubao/tests/unit/cc-hold-split-outstock.test.ts

145 lines
4.3 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import { describe, expect, it } from "vitest";
import { buildCcHoldFormValue } from "@/components/CcHoldMoveTypePanel";
import { buildCcOutStockFormValue } from "@/components/CcOutStockPanel";
import { buildCcSplitFormValue } from "@/components/CcSplitForm";
import {
isHoldSplitOpsMail,
resolveHoldSplitSubIntent,
} from "@/services/parse/mail-intent";
import { resolveOpsChannelCounts } from "@/services/parse/ops-subject-template";
import type { ShipmentRow } from "@/types/mail";
const MAIL3_SUBJECT =
"Fw: 转发:派送要求更新: 拆柜清单更新: DO请查收+拆柜清单更新: WHSU5574991+WHL063G550810+船名航次:OOCL SINGAPORE / 065W+ETA:6/28+FedEx-29件+UPS-102件+亚马逊卡派-289件+私人地址-166件+拦截-209件+拆柜清单";
describe("resolveHoldSplitSubIntent", () => {
it("defaults mail3 拆柜清单 to hold (no 拆分 keyword)", () => {
expect(
resolveHoldSplitSubIntent({ subject: MAIL3_SUBJECT }),
).toBe("hold");
});
it("maps 拆分 keyword to split", () => {
expect(
resolveHoldSplitSubIntent({
subject: "请拆分货件 WHSU5574991",
}),
).toBe("split");
});
it("maps 出库 keyword / filename to outbound", () => {
expect(
resolveHoldSplitSubIntent({
subject: "作业通知",
filenames: ["YT2604021091=76件换标走HIA1卡派出库操作指令.xlsx"],
}),
).toBe("outbound");
});
it("priority: 出库 wins over 拆分", () => {
expect(
resolveHoldSplitSubIntent({
subject: "拆分后出库",
}),
).toBe("outbound");
});
});
describe("isHoldSplitOpsMail", () => {
it("detects mail3 style subject", () => {
expect(
isHoldSplitOpsMail({
mailType: "WORK_ORDER",
subject: MAIL3_SUBJECT,
isForecast: false,
isTransfer: false,
}),
).toBe(true);
});
it("excludes forecast and transfer", () => {
expect(
isHoldSplitOpsMail({
mailType: "NEW_CONTAINER",
subject: MAIL3_SUBJECT,
isForecast: true,
isTransfer: false,
}),
).toBe(false);
});
});
describe("resolveOpsChannelCounts", () => {
it("re-parses channels from subject when record empty", () => {
const ch = resolveOpsChannelCounts({ subject: MAIL3_SUBJECT });
expect(ch).toEqual(
expect.arrayContaining([
{ channel: "FedEx", ctns: 29 },
{ channel: "拦截", ctns: 209 },
]),
);
});
});
describe("buildCcHoldFormValue", () => {
it("builds hold rows from mail3 channels", () => {
const channels = resolveOpsChannelCounts({ subject: MAIL3_SUBJECT });
const { value, rows } = buildCcHoldFormValue({
containerNo: "WHSU5574991",
modules: { container_no: "WHSU5574991" },
channels,
});
expect(value.F_Transporter).toBe("留仓");
expect(value.F_ContainerNo).toBe("WHSU5574991");
expect(rows.length).toBeGreaterThanOrEqual(5);
expect(rows.some((r) => /拦截|扣货/.test(r.F_Transporter))).toBe(true);
expect(value.selectedKeys.length).toBeGreaterThan(0);
});
});
describe("buildCcSplitFormValue", () => {
it("prefills qty fields from first shipment", () => {
const shipments: ShipmentRow[] = [
{
row_index: 0,
row_status: "VALID",
F_FBACode: "MDW2",
F_CTNS: 76,
F_CBM: 1.2,
F_Weight: 300,
},
];
const v = buildCcSplitFormValue({
containerNo: "WHSU5574991",
shipments,
});
expect(v.F_FBACode).toBe("MDW2");
expect(v.F_CTNS).toBe("76");
expect(v.maxCTNS).toBe(76);
expect(v.F_CBM).toBe("1.2");
});
});
describe("buildCcOutStockFormValue", () => {
it("guesses TRUCK outstock from 卡派出库 filename and prefills SplitCTNS", () => {
const shipments: ShipmentRow[] = [
{
row_index: 0,
row_status: "VALID",
F_FBACode: "HIA1",
F_CTNS: 76,
F_FBAID: "FBA199R49LD6",
},
];
const v = buildCcOutStockFormValue({
containerNo: "TCLU1234567",
shipments,
filenames: ["YT2604021091=76件换标走HIA1卡派出库操作指令.xlsx"],
});
expect(v.header.F_OutStockType).toBe("TRUCK");
expect(v.shipments[0].SplitCTNS).toBe("76");
expect(v.shipments[0].F_FBACode).toBe("HIA1");
expect(v.header.F_FBACode).toBe("HIA1");
});
});