feat: 异步解析大文件WPS报备资料

This commit is contained in:
hectorzhao
2026-09-04 22:51:07 +08:00
parent aaf96db2d0
commit 5925cf493b
22 changed files with 720 additions and 80 deletions
+21
View File
@@ -4478,3 +4478,24 @@ git diff --check
- 测试环境发布前为`bb435fb0ac1e7812fcdb59950a4b13757899ab39`。发布包大小2766696字节,本地和服务器SHA-256均为`2d3c9a022ba1b6494a51e2ee0f3eb04eabb2513af25ba3631dae5ea70ea68783`;恢复点为`/opt/cmpp-platform-backups/import-review-fix-20260904T122649Z`,包含PostgreSQL custom dump、原运行目录、系统配置及发布包,四项SHA、`pg_restore --list`和两份tar可读性通过。95项migration齐全且无待执行项,没有执行迁移;最终`.deployed-commit=41962e7a6e6cfd34b4313c8bf52d9345d37d8e10`,旧运行目录为`/opt/cmpp-platform.previous-import-review-20260904T122649Z`
- 使用自行生成的标准Excel Drawing工作簿`签名导入全流程测试-含图片.xlsx`走真实HTTP API:解析得到6列、1张图片,导入批次`cmtmxvjuh000xluleh38c4sjy`审核结果`approved / approvedCount=1 / failedCount=0`;生成签名`cmtmxvjyh0014lule5o2t16m9``approved`,四项系统身份字段、图片`FileObject`及6个通道图片材料均在PostgreSQL存在。报备批次`cmtmxvk8c0043lules3upx5f2`完成并生成6个真实通道文件,下载ZIP中的首个XLSX包含`xl/media`图片。批次生成后签名`pendingReport=false`,没有发送、补发、重投或重新入队短信。
- API验收使用本轮临时平台管理员,登录、近期认证、导入、审核、生成和下载均经过真实HTTP会话;结束时调用登出并删除临时账号,查询剩余数为0。浏览器已读取测试环境登录页、验证码控件和页面标题,控制台无warning/error;登录后页面交互需按浏览器安全规则由用户确认验证码后继续,不将当前登录页检查冒充已完成登录后验收。
## 2026-09-04 WPS报备兼容与导入审核修复(预生产发布完成)
- 用户明确授权发布预生产。发布前重新核验本地与`origin/main`均为`aaf96db2d018cfcea79b6cdbf553cee9cb982fa2`,预生产原标记为`dada0d978bb05d7046469c1ec77371ddb2fb03bc`;累计范围为9个提交、44个文件,包含运营看板、报备字段配置、WPS单元格图片导入导出、100MiB上传限制、字段卡片固定高度及导入审核系统身份字段补齐。没有新增migration,既有未跟踪补救方案文档未进入发布归档。
- 发布前数据盘UUID`ef4ee3bb-a19b-4aeb-b00c-aa2b995611c2`、PostgreSQL/Redis/MinIO绑定挂载、存储保护脚本、systemd drop-in和固定备份入口全部通过;95项migration齐全,相关服务健康,三条Redis Stream均`pending=0 / lag=0`,供应商连接为`desired=9 / connected=9`
- 首次恢复点`/opt/cmpp-platform-backups/preprod-wps-import-20260904T211224Z-before-aaf96db``pg_dump`不接受Prisma连接串的`schema`查询参数而在数据库导出阶段安全停止;当时尚未构建、迁移、切换、重启或修改Nginx。改用去除查询参数的数据库连接后重新建立有效恢复点`/opt/cmpp-platform-backups/preprod-wps-import-20260904T211255Z-before-aaf96db`,约613MiB,包含PostgreSQL custom dump、Redis RDB、原运行目录、环境/systemd/Nginx/Fail2ban/nftables及数据盘保护配置、原标记和发布基线。
- 有效恢复点的8项最终SHA-256全部通过,`pg_restore --list`包含825项,运行目录tar包含52641项、系统配置tar包含370项;精确Git归档大小2768402字节,SHA-256为`d984c79d0deef1a83ec418b4806875eca210343bb76e03f174887614ba6517c1`,服务器回读一致。候选版本通过依赖安全、部署契约、Prisma生成与迁移状态、前端/API/Gateway/Security Agent生产构建以及`cmpp-api`用户运行文件可读/可执行门禁。
- 最终`.deployed-commit=aaf96db2d018cfcea79b6cdbf553cee9cb982fa2`,上一运行目录保留为`/opt/cmpp-platform.previous-preprod-dada0d9-20260904T211255Z`。95项migration仍齐全且无待执行项,本轮未执行数据库迁移。Nginx仅将`sms.lisglo.com`和兼容端口12026的两个`client_max_body_size 50m`精确调整为`110m`API专用域名保持`10m``nginx -t`通过后reload,没有修改数据盘、fstab、UUID、存储保护脚本或systemd存储drop-in。
- API、Send Worker、Submit Outbox、Gateway Callback、Protocol Log Worker、Gateway、Security Agent、Nginx、PostgreSQL、Redis、MinIO、Node Exporter和Prometheus均为`active`,相关应用服务`NRestarts=0 / Result=success`API、Callback、Gateway、PostgreSQL和Redis健康通过。`12026``sms.lisglo.com/api/health``api.lisglo.com/api/health`均为HTTP 200,主JS`index-CFz3CyND.js`及CSS`index-C3z6fQED.css`的公网下载SHA-256与服务器产物逐项一致。
- 发布后三条Stream的`last-delivered-id / entries-read`与发布前一致:commands为`1788517020869-2 / 84015`results为`1788527156466-0 / 45876`protocol logs为`1788527156467-0 / 32227`;全部保持`pending=0 / lag=0`。本轮未发送、补发、重投、重新入队或手工ACK短信,也没有修改余额、通道、客户或签名业务资料。
- 一条富泷供应商通道在重启后首次鉴权失败,连接短暂为`8/9`,系统按既有计划于21:20:25自动重试并恢复`9/9`,未修改通道配置或凭据。真实下游客户端受旧心跳租约影响的重复连接被连接数门禁拒绝,并记录3次既有`close of closed channel`连接协程panic;Gateway进程未退出、下游心跳持续、systemd error级journal为0,该已知重启恢复缺陷不由本次报备功能引入,继续保留专项治理。
- 浏览器控制在读取预生产运营登录页时连续两次超时,因此本轮没有取得可复核的DOM、截图或控制台证据,也未输入账号、密码或验证码;只把真实HTTP、资源哈希和服务端证据记为通过,不将其冒充登录后浏览器验收。
## 2026-09-04 大文件WPS报备异步解析与真实进度(本地验证完成)
- 40MB以上WPS文件同步解析会让单个HTTP请求同时承担上传、两轮ZIP/图片展开和ExcelJS解析,预生产证据已出现约126秒后由入口断开的499;单纯展示前端动画进度不能延长代理读超时。本轮将接口改为文件入MinIO并创建PostgreSQL任务后返回202,由独立`cmpp-report-material-worker`单并发解析,页面轮询租户隔离的真实任务状态。
- 新增`queued/analyzing/analyzed/failed`状态、0–100进度、阶段、错误、开始和心跳时间;Worker启动时将心跳超过5分钟的解析任务恢复为排队状态,领取时使用状态条件更新防止重复占用。该变更新增1项Prisma migration和1个systemd服务,发布时必须同时迁移数据库、安装并验证Worker,不涉及短信队列、通道、余额或客户配置。
- 报备导入使用独立100MiB上限,普通文件仍为10MiB、图片仍为2MiB。文件类型、扩展名和ZIP签名在入库前校验;工作簿公式、外部对象、解压体积、图片格式及图片数量关系在后台解析或提交阶段明确失败,不静默吞错。
- 分析阶段读取WPS`cellimages.xml`关系、单元格位置、扩展名和ZIP声明大小,不展开图片Buffer,并在交给ExcelJS前从临时解析副本剥离WPS媒体;提交导入时仍重新下载原文件并完整读取、签名校验和上传图片,没有放宽DISPIMG白名单或20MiB单图/300MiB图片总量限制。
- 真实样本`行业报备.xlsx`仍得到工作表“行业”、17行、13列和43张图片。相同进程环境下原完整图片模式约5522ms/RSS 259MiB,新分析模式约1899ms/RSS 227MiB,耗时下降约66%,结果计数一致;样本只读,未覆盖或写回。
- 定向API 3套25项、API全量54套616项、前端全量13文件64项通过;前后端TypeScript、API/Vite生产构建、依赖与安全门禁、部署契约、结构质量、入口包体积和`git diff --check`通过。测试环境部署及真实HTTP/MinIO/PostgreSQL/浏览器验收将在本提交推送后执行,预生产不在本轮范围内。