=== API Validator & Transform Test === 1. StaticCountryService 国家字典(严格二字码契约)... ✓ 二字码 CN → China ✓ 二字码小写 cn(不区分大小写)→ China ✓ 二字码 GB → United Kingdom(字典错拼 United Kiongdom 归一) ✓ 二字码 HK → Hong Kong(字典旧称 Hongkong 归一) ✓ 二字码 US → United States(字典全称归一) ✓ 二字码 VN → Viet Nam(字典旧称 Vietnam 归一) ✓ 未知国家 XX → null ✓ 空字符串 → null ✓ 旧格式 中文名 中国 → null(严格二字码) ✓ 旧格式 英文名 China → null(严格二字码) ✓ isValidCountry(中国) = false(严格二字码) ✓ isValidCountry(CN) = true ✓ isValidCountry(Atlantis) = false ✓ isValidCountryCode(DE) = true ✓ 二字码 CH → Swiss Confederation(表内规范名) ✓ 二字码 KR → Republic of Korea(表内规范名) ✓ 二字码 NI → Northern Ireland(表内规范名,非字典 Nicaragua) ✓ 英文名 Nicaragua → null(表内 NI=北爱尔兰语义冲突) ✓ 二字码 EU → European Union ✓ 二字码 JE → Jersey Island(表内规范名) ✓ 字典缺失码 CI → ISO 兜底 Cote d'Ivoire ✓ 字典独有码 MAD → Madrid 2. VatRecordTransform 纯转换工具... ✓ parseDate 2024-03-22 → [22,3,2024] ✓ parseDate 空 → 全 null ✓ parseDate 非法 → 全 null ✓ parseFullName ZHENHUA LIU → 名 ZHENHUA / 姓 LIU ✓ parseFullName 单词 → 姓为该词 ✓ parseFullName 多词 → 末词为姓 ✓ parseFullName 空 → 全 null ✓ cleanPhone 去空格/+/- → 8618117939375 ✓ cleanPhone 无数字 → null ✓ cleanPhone 空 → null ✓ calculateSubmissionMonth 2025-11 → January ✓ calculateSubmissionMonth 跨年 2025-12 → February ✓ calculateSubmissionMonth 空 → null ✓ isUkCompany(GB) = true ✓ isUkCompany(CN) = false ✓ parseFileField JSON 字符串 → 取第一项 ✓ parseFileField 原生数组 → 取第一项 ✓ parseFileField 非法 JSON → null ✓ parseFileField 空 → null ✓ parseFileField 空数组 → null ✓ parseFileFieldList JSON 字符串 → 全部项(匹配多个则多个递交) ✓ parseFileFieldList 非法 JSON → 空数组 ✓ parseFileFieldList 空 → 空数组 ✓ parseFileFieldList 缺 fileUrl 的项跳过且不阻断其余项 2.5 FileService 文件关键词分类(source / API 共用)... ✓ 法人证件 passport → path1 ✓ 支持文件1 → path2(bank statement) ✓ 支持文件2 → path3(electricity bill,匹配多个则多个递交) ✓ type 保存文件名(小写) ✓ 证件槽位无关:identity card 在第二个位置仍分类到 path1 ✓ 支持文件 → path2,path3 为空(只有一个支持文件不强制) ✓ 未命中关键词 → 三个槽位全空 ✓ passport → legal ✓ national identity card translate.pdf → legal(包含匹配) ✓ drive license.pdf → legal ✓ BANK STATEMENT.PDF → other(大小写不敏感) ✓ electricity bill .pdf → other(包含匹配,见生产数据空格变体) ✓ receipt.pdf → null ✓ getLegalKeywords 含 passport/identity card/drive license ✓ getSupportingKeywords 含 11 项且含 bank statement/电费/房产证 ✓ 1 证件 + 2 支持文件 → 无超容量错误 ✓ 3 个支持文件 → 报超容量(仅前2个递交) ✓ 2 个法人证件 → 报超容量(仅第一个递交) ✓ 未命中关键词文件不参与计数(不触发超容量) 3. DataValidator::validateApiRecord 校验... ✓ 合法记录(无 Attachment)通过校验 ✓ 公司名缺失 → Company name is required ✓ 公司国家为英国 → 拒绝 ✓ 法人姓名缺姓 → Legal person last name is required ✓ 法人姓名缺名 → Legal person first name is required ✓ 新旧字段混合 → 按两字段校验通过 ✓ validate() 旧全名字段 → 不报姓名必需错误 ✓ validate() 旧全名字段 → 仍报 Attachment ID is required(同步模式回归保护) ✓ 文件1缺失 → Legal document file (upload_file_path1) is required ✓ 文件2缺失 → Supporting document file (upload_file_path2) is required ✓ 文件3缺失 → 不再报 Additional document file(path3 可选,仅第二个支持文件命中时填写) ✓ 仅 path1+path2(无第三个支持文件)→ 通过校验 ✓ 电话超 13 位 → Phone number too long ✓ VAT 生效日期过早 → 拒绝 ✓ 空记录聚合 ≥ 10 项错误 ✓ getErrorMessage 以 ; 分隔聚合 4. getApiErrorMessage 中文提示... ✓ 中文提示包含公司名称必填 + 字段括号(NameEng) ✓ 中文提示包含年GMV必填 + 字段括号(AnnualGMV) ✓ 中文提示包含城市必填 + 字段括号(CityEngName) ✓ 中文提示包含法人国家必填 + 字段括号(LegalPersonCountry) ✓ 中文提示包含产品范围必填 + 字段括号(ProductsRange) ✓ 中文提示动态 VAT 日期信息(最早日期 + 字段括号) ✓ 中文提示国家不在字典(法人国家 + 字段括号) ✓ 中文提示文件1必填 → 没有拿到符合法人证件的信息 ✓ 中文提示文件2必填 → 没有拿到符合支持文件的信息 ✓ 中文提示文件3 → 不再报必填(path3 可选) ✓ 同步 validate() 无 Attachment → 报 Attachment ID is required ======================================== 通过: 92 失败: 0 ======================================== === All tests completed successfully! ===