import { describe, expect, it } from "vitest"; import { classifyMail, isBusinessRelevantMail, } from "@/services/parse/classify"; describe("classifyMail — 四类业务", () => { it("M1 container-only -> WORK_ORDER", () => { const r = classifyMail({ subject: "TIIU8073522-90022 资料", body: "请查收", filenames: [], }); expect(r.mail_type).toBe("WORK_ORDER"); }); it("M2 TRANSFER(转仓候选,不强制工单)", () => { const r = classifyMail({ subject: "MATU2745683 转仓通知", body: "本票转仓", filenames: ["卡派资料.xlsx"], }); expect(r.mail_type).toBe("TRANSFER"); }); it("M3 拆柜清单 → WORK_ORDER(渠道「拦截-N件」不算硬拦截)", () => { const r = classifyMail({ subject: "WHSU5574991 拆柜清单 拦截-209件", body: "拆柜清单 卡转海 留仓", filenames: [], }); expect(r.mail_type).toBe("WORK_ORDER"); expect(r.signals.some((s) => s.matched === "拦截" || s.signal === "工单")).toBe( false, ); expect(r.signals.some((s) => s.signal === "拆柜清单")).toBe(true); }); it("M4 WORK_ORDER(贴标/拍照)", () => { const r = classifyMail({ subject: "Re: 新增预报 MATU2745683 换标指令", body: "请换标并贴好拍照", filenames: ["贴标指令.pdf"], }); // 主题含新增预报优先;若仅测贴标正文用无预报主题 expect(["WORK_ORDER", "NEW_CONTAINER"]).toContain(r.mail_type); }); it("贴标正文无预报主题 → WORK_ORDER", () => { const r = classifyMail({ subject: "操作指令 YT2604021091", body: "请换标并贴好拍照", filenames: ["贴标指令.pdf"], }); expect(r.mail_type).toBe("WORK_ORDER"); }); it("多轮:主题新增预报 + 最新换标 + 历史DO文案 + 数据模版 → WORK_ORDER", () => { const r = classifyMail({ subject: "Fw: 转发:新增预报136:新辰泽+WHLC027G597465+WHSU8127240+提拆派", body: [ "Dear,", "原箱号YT2604021091=FBA199R49LD6-MDW2=76件操作指令", "换标后单号:FBA19HW52S0L-HIA1=76件", "1:覆盖贴FBA标签", "3:贴好拍照回传", "------------------ 原始电子邮件 ------------------", "请查收新增预报:新辰泽+WHSU8127240+提拆派 DO也同步上传至附件", ].join("\n"), filenames: ["数据模版-新辰泽-WHSU8127240.xlsx"], }); expect(r.mail_type).toBe("WORK_ORDER"); }); it("不转仓 negative", () => { const r = classifyMail({ subject: "通知", body: "本票不转仓,保持原计划", filenames: [], }); expect(r.mail_type).not.toBe("TRANSFER"); expect(r.mail_type).not.toBe("WORK_ORDER"); }); it("新增预报优先于贴标工单", () => { const r = classifyMail({ subject: "新增预报136:新辰泽+WHLC027G597465+WHSU8127240+洛杉矶+40HQ", body: "请查收新增预报;另请贴标", filenames: ["清单.xlsx"], }); expect(r.mail_type).toBe("NEW_CONTAINER"); }); it("DO 附件 → DO_UPLOAD", () => { const r = classifyMail({ subject: "WHSU5574991 DO请查收", body: "", filenames: ["WHSU5574991-DO.pdf"], }); expect(r.mail_type).toBe("DO_UPLOAD"); }); it("DO 优先于新增预报(同分冲突取 DO)", () => { const r = classifyMail({ subject: "新增预报 DO请查收 WHSU8127240", body: "DO请查收", filenames: ["柜DO.pdf"], }); expect(r.mail_type).toBe("DO_UPLOAD"); }); it("正文请查收新增预报(无主题词)→ NEW_CONTAINER", () => { const r = classifyMail({ subject: "WHSU8127240 资料", body: "请查收新增预报", filenames: [], }); expect(r.mail_type).toBe("NEW_CONTAINER"); expect(r.scores.NEW_CONTAINER).toBeGreaterThanOrEqual(50); }); }); describe("isBusinessRelevantMail", () => { it("rejects GitHub / Google noise", () => { expect( isBusinessRelevantMail({ subject: "[GitHub] You have used 100% of the included...", body: "Actions minutes", filenames: [], }), ).toBe(false); }); it("accepts M1 container + 资料", () => { expect( isBusinessRelevantMail({ subject: "TIIU8073522-90022 资料", body: "请查收", filenames: [], }), ).toBe(true); }); it("accepts classified TRANSFER", () => { expect( isBusinessRelevantMail({ subject: "MATU2745683 转仓通知", body: "本票转仓", filenames: ["卡派资料.xlsx"], }), ).toBe(true); }); });