应付款终版导入:支持 20 万行(流式读取 + 分片导入 + 进度显示) #361

Merged
renshen merged 1 commits from feature/sumu-import-20w-rows into main 2026-10-16 23:54:03 +08:00
Collaborator

背景

20 万行同步导入必然超时/爆内存:整表解析一次 25-30 秒、峰值 430MB,分块读完整表要 9 分钟。

改动

  • 新增流式工作簿读取器 PayablesWorkbookStreamReader:xlsx 用 ZipArchive + XMLReader 逐行解析、共享字符串紧凑存放(几十兆级);支持日期样式单元格、GBK CSV、分隔符识别;xls 回退 PhpSpreadsheet。
  • 新增 PayablesFinalImportRunner:上传时把工作簿转成行缓存(jsonl.gz),前端按片调用;每片 2 万行/25 秒预算;落库改为批量 upsert + 批量审计事件;上限 20 万行;完成后自动清理。
  • 新接口 import-upload / import-chunk(仅终版按表路由);导入弹窗改 AJAX 分片流程,带进度条与新增/更新计数,完成自动刷新。
  • 上传校验放宽到 50MB;php.ini upload_max_filesize 10M→64M(nginx 已是 64m/120s)。

验证

  • 新增 PayablesFinalImportRunnerTest 5 个用例(xlsx 流式读取+日期、GBK CSV、分片续跑与清理、上传/分片接口、页面接线)。
  • 相关回归共 40 个用例全部通过(终版页面、快递终版、导入导出、基础页)。
  • 部署后在生产容器内用真实 20 万行 xlsx 复测时间与内存。
## 背景 20 万行同步导入必然超时/爆内存:整表解析一次 25-30 秒、峰值 430MB,分块读完整表要 9 分钟。 ## 改动 - 新增流式工作簿读取器 `PayablesWorkbookStreamReader`:xlsx 用 ZipArchive + XMLReader 逐行解析、共享字符串紧凑存放(几十兆级);支持日期样式单元格、GBK CSV、分隔符识别;xls 回退 PhpSpreadsheet。 - 新增 `PayablesFinalImportRunner`:上传时把工作簿转成行缓存(jsonl.gz),前端按片调用;每片 2 万行/25 秒预算;落库改为批量 upsert + 批量审计事件;上限 20 万行;完成后自动清理。 - 新接口 `import-upload` / `import-chunk`(仅终版按表路由);导入弹窗改 AJAX 分片流程,带进度条与新增/更新计数,完成自动刷新。 - 上传校验放宽到 50MB;php.ini upload_max_filesize 10M→64M(nginx 已是 64m/120s)。 ## 验证 - 新增 `PayablesFinalImportRunnerTest` 5 个用例(xlsx 流式读取+日期、GBK CSV、分片续跑与清理、上传/分片接口、页面接线)。 - 相关回归共 40 个用例全部通过(终版页面、快递终版、导入导出、基础页)。 - 部署后在生产容器内用真实 20 万行 xlsx 复测时间与内存。
renshen added 1 commit 2026-10-16 23:53:53 +08:00
同步导入在 20 万行规模下必然超时/爆内存:新增 xlsx/csv 流式读取器(共享字符串紧凑存放、支持日期单元格、GBK CSV),上传时把工作簿转成行缓存,之后按片处理(每片 2 万行/25 秒预算),前端显示进度并自动续跑;落库改为批量 upsert + 批量审计事件;上限提升到 20 万行,上传限制放宽到 50MB。
renshen merged commit 656c655c91 into main 2026-10-16 23:54:03 +08:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: WuYongJie/CaiWuXiTong#361
No description provided.