编辑 | blame | 历史 | 原始文档

功能测试报告_网约车订单报告 WordML 兼容导入_2026-09-18

一、功能说明

背景(用户报障):把《湖北网络预约出租汽车2025年09月分析报告.docx》放到桌面后用「网约车订单报告」导入,一直失败。

定位结论:该文件**不是真正的 docx**。它是 Word 2003 XML(WordML 平铺 XML,单文件)被改名成了 .docx:
- 文件头是 <?xml version="1.0" ...?> <?mso-application progid="Word.Document"?> <w:wordDocument xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml" ...>
- 3.1MB 纯 XML,**不是 zip 包**;POI 的 XWPFDocument 只能读 OPC(zip) 包,于是抛 File is not a zip file。
- 这类文件是 WPS/Word「Word 2003 XML 文档」格式,网约车监管平台/同事之间流转很常见,会反复出现。

改动:traffic-audit-server/src/main/java/com/trafficaudit/dataimport/service/DataImportService.java

  1. importWycOrderReport() 入口先按文件头嗅探格式,再分派:
  • PK 开头 → docx(zip):原 XWPFDocument 路径;
  • <w:wordDocument + wordml → WordML 平铺 XML:新增解析路径;
  • D0CF11E0 → OLE2 老 .doc:给出「请另存为 docx」的明确提示;
  • 其它 → 「无法识别的文件格式」。
  1. 新增 isWordPackage():zip 但包内没有 word/document.xml(如 xlsx 改名)时,直接提示「这不是 Word 文档……多半是 Excel 或其它格式」,不再抛出 XMLBeans 的英文堆栈。
  2. 新增 parseXmlSafely():DOM 解析并**关闭外部实体/DTD**(报告来自外部平台,防 XXE)。
  3. 表格匹配逻辑抽成与格式无关的 matchWycOrderTable(tables, orders, sumHolder):
  • docx 路径把 XWPFTable 文本化后调用;
  • WordML 路径把 <w:tbl>/<w:tr>/<w:tc> 文本化后调用;
  • 表头识别、17 市州取值、合计行识别**完全复用同一套逻辑**,两条路径不会出现口径分叉。
  1. 报表期识别抽成 periodOfParagraphs(List<String>),两种格式共用(标题 网约车行业YYYY年M月 优先,取不到回退「前 10 段任意 YYYY年M月」)。

二、测试环境

  • 后端 8090(mvn -o compile 后重启,加载新类;启动日志 Started TrafficAuditApplication);数据库 traffic_audit(127.0.0.1:3308)。
  • 接口:POST /api/import/wycOrderReport(file + period,period 可为空 → 由报告标题推断)。
  • 测试文件:D:\桌面\湖北网络预约出租汽车2025年09月分析报告.docx(WordML,3,145,560 字节);D:\05_数据分类\城市客运\8月\湖北网络预约出租汽车2026年08月分析报告0910最终版.docx(真 docx)。
  • 证据文件:_tmp/_qa_out/(命令输出见本报告表格;数据核对见 _wyc_2025_09_row.txt)。

三、用例表

编号 类型 输入 预期 实际 结论
1 正向 WordML「2025年09月」报告,period=2025-09 解析出 17 市州订单,写入 2025-09 导入成功:报表期 2025-09,订单合计 17,652,159 单,已写入 17 个市州 通过
2 正向 同上,period= 留空 由标题 网约车行业2025年9月 推断出 2025-09 报表期 2025-09,结果与用例 1 一致 通过
3 正向 真 docx「2026年08月」报告重导 与库内既有值一致(幂等,不改变结果) 订单合计 30,508,652、武汉 11,550,551,与导入前完全相同 通过
4 正向 2026年06月报告 订单合计 = 报告正文「全省订单总数 2684.30 万单」 库内 2026-06 = 26,843,037 通过
5 负向 .doc(OLE2 复合文档,Word 97-2003) 明确提示改用 docx 这是 Word 97-2003 老格式(.doc),请用 WPS/Word 打开后「另存为」docx 格式再导入 通过
6 负向 xlsx 改名成 .docx 上传 明确提示不是 Word 这不是 Word 文档(压缩包里没有 word/document.xml),多半是 Excel 或其它格式…… 通过
7 负向 非网约车报告的 docx(《投资表之间的关系.docx》) 提示未解析到订单数 未解析到任何市州订单数,请确认上传的是《网约车行业YYYY年M月运行监测情况分析报告》 通过
8 边界 WordML 中表格含 16 列、表头在第 1 行、市州名用简称(武汉/林区) 简称能映射到规范名(武汉市/神农架林区) 17 市州全部识别,无缺失 通过

入库抽查(报表期 2025-09,与报告附件1逐项对齐)

项 报告附件1 库内 wyc_order_monthly 结论
订单合计 17,652,159 17,652,159 一致
武汉 8,076,610 8,076,610 一致
黄石 676,644 676,644 一致
十堰 1,048,593 1,048,593 一致
恩施 804,736 804,736 一致
神农架林区 1,424 1,424 一致
全省 pin(B~E) 报告无 2794.31 / 2522.54 / 16394.73 / 12998.74(从 wyc_total_monthly 同期复制) 符合设计

四、发现的问题与处置

  1. 格式兼容缺口(本次修复):WordML 报告无法导入。已加解析路径;两种格式共用同一套表格匹配逻辑,避免口径分叉。
  2. 错误信息不友好(本次修复):xlsx 改名后报 org.apache.xmlbeans.XmlException: Element workbook@... is not a valid document@...。已改为中文业务提示。
  3. 20XX 年前后报告标题格式不同:2025 年报告标题是「湖北**网约车行业 2025年9月** 运行情况分析报告」,2026 年是「网约车行业2026年6月运行监测情况分析报告」。同一套正则均可命中,无需再改。
  4. 数据缺口已由用户补齐:2026-01~06(14:21 导入 6 份)、2025-01(14:47)、2025-10~12(14:49)均已入库;2025-09 由本次修复后补入(14:59 首次、15:04 复核)。
  • 全部 2025-01~12、2026-01~08 的订单与 pin 现已齐全。
  • 影响:中口径维度 4(城际城乡网约车)1~6 月由「无源」变为「可算」,**中口径排名件与中口径明细件累计口径自动归一**(此前差值 2063.45 = 1~6 月网约车城乡)。

五、结论

  • WordML(Word 2003 XML 改名 .docx)报告现已可直接导入,17 市州 + 合计解析正确、入库逐项对齐;真 docx 路径无回归。
  • 3 条负向用例均给出中文可操作提示(.doc / 非 Word 包 / 非本报告)。
  • 8 例用例全部通过;docs/功能测试报告/ 下已归档本报告。