All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m55s
2.9 KiB
2.9 KiB
统一导出任务功能总结
1. 功能概览
本次交付新增统一导出任务系统,提供全局任务入口,支持:
- 创建导出任务(
scene=device/iot_card,format=xlsx/csv) - 导出任务列表与详情
- 导出任务取消(待处理/处理中)
- 异步三段式执行:
dispatch -> shard -> finalize - 分片产物与最终产物上传 OSS
- 详情接口直出下载链接(固定 24 小时)
2. 新增接口
POST /api/admin/export-tasks:创建导出任务GET /api/admin/export-tasks:导出任务列表(支持scene/status/time过滤)GET /api/admin/export-tasks/:id:导出任务详情(已完成时返回download_url)POST /api/admin/export-tasks/:id/cancel:取消导出任务
3. 状态机
3.1 主任务状态
1待处理2处理中3已完成4已失败5已取消
3.2 分片状态
1待处理2处理中3已成功4已失败5已取消
4. 核心设计
4.1 模型与迁移
新增两张表:
tb_export_task:主任务tb_export_shard_task:分片任务
关键点:
- 无外键,仅使用
task_id做逻辑关联 - 主任务保留进度、分片统计、权限快照、产物信息
- 分片任务保留游标范围、分片产物、执行状态
4.2 场景策略注册中心
新增 internal/exporter 场景注册中心与策略接口,首批接入:
device场景策略iot_card场景策略
统一定义:
Headers():导出表头NextShardBoundary():按 keyset 方式计算分片边界QueryRows():按分片边界查询行数据
4.3 执行链路
export:dispatch:构建分片并入队export:shardexport:shard:按分片查询数据、写文件、上传 OSS、回写分片结果export:finalize:汇总分片结果并生成最终文件,更新主任务状态
4.4 幂等与重试安全
- dispatch/shard/finalize 增加 Redis 锁,避免并发重复执行
- 分片状态条件更新,重复消费不会重复计数
- shard/finalize 利用 Asynq 重试上下文,在最终重试失败时才落库失败状态
4.5 取消语义
- 待处理:直接更新为已取消
- 处理中:仅设置
cancel_requested=true,由 Worker 检查点协作停止 - dispatch/shard/finalize 均增加取消检查点
4.6 下载链接
- 仅
status=已完成返回download_url - 链接有效期固定
24h(常量ExportDownloadURLExpire) - URL 由详情接口实时生成,过期后再次访问可刷新
5. 权限与可见性
- 平台/超管:可见全部导出任务
- 代理:仅可见其店铺范围内创建的导出任务
- 详情越权统一返回:
无权限操作该资源或资源不存在
6. 文档与生成器更新
已同步更新:
- 路由文档(新增
导出任务Tag 的 4 个接口) - 文档构建 Handler 集合(
pkg/openapi/handlers.go新增ExportTask) - OpenAPI 文件重新生成:
docs/admin-openapi.yaml