来源:变更 common-crud-async-export 时间:2026-06-27
通用 CRUD 导出一次性查全量、直接写 HTTP 响应,大数据量超时且 OOM。改为异步任务后,后台线程脱离了 HTTP 会话和登录态,必须保证导出不绕过租户/数据权限边界,否则会退化成全量查询导致越权。
<= sys.export.async.threshold(默认 5000)走同步文件流;超过则建持久任务返回 async=true / taskId。异步执行按 sys.export.batch.size(默认 1000)分页 + EasyExcel writer 分批写入,禁止把完整数据集或文件放内存。DynamicDataScopeService),后台 worker 执行时恢复。否则后台线程丢登录态后,FOLLOW_SYSTEM 等数据权限会退化为全量查询。ai_crud_export_task 只存 file_id 等元数据,文件先上传文件中心,前端复用 /api/file/download/{fileId} 下载。任务查询按 tenant_id + 当前用户 + configKey 三重隔离。FileManager 需补充“已知大小的 InputStream 流式上传”入口(原只暴露 MultipartFile)。FAILED;临时文件在 finally 删除;writer / 流显式关闭防句柄泄漏。forge-plugin-generator:DynamicCrudAsyncExportWorker.java、DynamicCrudExcelService.java、DynamicCrudService.java、DynamicDataScopeService.java、AiCrudExportTaskMapper.xmlforge-starter-file:FileManager.java、FileStorage.javaforge/db/migration/V1.0.23__add_common_crud_async_export.sql