erp-java/services/report-service/README_EXPORT.md

275 lines
7.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Report Export Module - 报表导出模块
## 概述
报表导出模块是ERP系统的核心组件负责将系统中的各类业务数据订单、商品、库存、供应商等导出为多种格式CSV、Excel、PDF支持同步和异步导出提供定时任务功能。
## 功能特性
### 1. 多格式导出
- **CSV**: 带BOM的UTF-8编码完美兼容Microsoft Excel
- **Excel (XLSX)**: Apache POI生成支持大数据量
- **PDF**: OpenPDF生成适合打印存档
### 2. 导出类型
| 类型 | 说明 | API端点 |
|------|------|---------|
| 订单导出 | 导出订单主信息和明细 | POST /api/v1/exports/orders |
| 商品导出 | 导出商品SKU信息 | POST /api/v1/exports/goods |
| 库存导出 | 导出库存快照数据 | POST /api/v1/exports/inventory |
| 供应商导出 | 导出供应商信息 | POST /api/v1/exports/suppliers |
| 库存报表 | 导出库存统计报表 | POST /api/v1/exports/reports/stock |
| 销售报表 | 导出销售统计报表 | POST /api/v1/exports/reports/sales |
| 订单报表 | 导出订单统计报表 | POST /api/v1/exports/reports/orders |
| 采购报表 | 导出采购统计报表 | POST /api/v1/exports/reports/purchases |
| 资金报表 | 导出资金流水报表 | POST /api/v1/exports/reports/finances |
### 3. 异步导出
- 支持异步导出,提交后立即返回
- 异步任务使用独立线程池处理
- 可查询导出进度和历史记录
### 4. 定时导出
- 支持Cron表达式配置定时任务
- 可按每天/每周/每月等周期自动导出
- 定时任务可取消和管理
### 5. 导出历史管理
- 记录每次导出的元信息
- 支持分页查询导出历史
- 自动清理过期导出文件
## API文档
### 导出订单
```http
POST /api/v1/exports/orders
Content-Type: application/json
{
"tenantId": 1,
"userId": 100,
"format": "CSV",
"platform": "taobao",
"status": "completed",
"warehouseId": 1,
"startDate": "2024-01-01",
"endDate": "2024-01-31",
"keyword": "测试"
}
```
**响应示例:**
```json
{
"code": 200,
"message": "导出成功",
"data": {
"id": 1,
"filename": "orders_1_1704067200000.csv",
"filePath": "/data/exports/1/orders_1_1704067200000.csv",
"fileSize": 102400,
"fileSizeFormatted": "100.00 KB",
"rowCount": 1000,
"status": "COMPLETED",
"downloadUrl": "/api/v1/exports/1/download",
"createdAt": "2024-01-01T12:00:00",
"completedAt": "2024-01-01T12:00:05"
}
}
```
### 异步导出
```http
POST /api/v1/exports/orders/async
Content-Type: application/json
{
"tenantId": 1,
"format": "XLSX",
"startDate": "2024-01-01",
"endDate": "2024-01-31"
}
```
### 查询导出历史
```http
GET /api/v1/exports?tenantId=1&type=ORDERS&status=COMPLETED&page=1&pageSize=20
```
### 下载导出文件
```http
GET /api/v1/exports/{id}/download?tenantId=1
```
### 创建定时导出任务
```http
POST /api/v1/exports/scheduled?cronExpression=0%200%2012%20*%20*%20?
Content-Type: application/json
{
"tenantId": 1,
"type": "ORDERS",
"format": "CSV",
"startDate": "2024-01-01",
"endDate": "2024-01-31"
}
```
## 技术架构
### 核心技术栈
- **Spring Boot 3.x**: 基础框架
- **Spring Scheduling**: 定时任务
- **Apache POI 5.x**: Excel文件生成
- **OpenPDF**: PDF文件生成
- **MyBatis Plus**: 数据访问层
- **Redis**: 缓存和分布式锁
- **Nacos**: 服务发现和配置中心
### 核心组件
```
com.erp.report.export
├── controller/
│ └── ReportExportController.java # REST API控制器
├── service/
│ ├── ReportExportService.java # 服务接口
│ └── ReportExportServiceImpl.java # 服务实现
├── entity/
│ └── DataExportEntity.java # 导出记录实体
├── repository/
│ └── DataExportRepository.java # 数据访问层
├── dto/
│ ├── ExportFormat.java # 导出格式枚举
│ ├── ExportType.java # 导出类型枚举
│ ├── ExportStatus.java # 导出状态枚举
│ ├── ExportRequest.java # 导出请求DTO
│ └── ExportResponse.java # 导出响应DTO
├── scheduler/
│ └── ExportScheduler.java # 定时任务调度器
└── config/
├── AsyncConfig.java # 异步配置
└── ExportWebConfig.java # Web配置
```
### 线程池配置
| 参数 | 值 | 说明 |
|------|------|------|
| corePoolSize | 4 | 核心线程数 |
| maxPoolSize | 8 | 最大线程数 |
| queueCapacity | 100 | 任务队列容量 |
| threadNamePrefix | export- | 线程名前缀 |
### 文件存储
- 默认存储路径: `/data/exports/{tenantId}/`
- 支持NFS等共享存储
- 自动清理7天前的导出文件
## 部署指南
### Docker部署
```bash
# 构建并启动
docker-compose -f deploy/docker-compose.yml up -d
# 查看日志
docker logs -f report-service
# 扩缩容
docker-compose -f deploy/docker-compose.yml scale report-service=3
```
### Kubernetes部署
```bash
# 部署
./deploy/deploy.sh deploy
# 查看状态
kubectl get pods -n erp -l app=report-service
# 扩缩容
kubectl scale deployment/report-service --replicas=4 -n erp
# 查看日志
kubectl logs -f deployment/report-service -n erp
```
## 配置参数
| 参数 | 默认值 | 说明 |
|------|--------|------|
| export.base-path | /data/exports | 导出文件存储基础路径 |
| export.max-rows | 10000 | 单次最大导出行数 |
| export.async.core-pool-size | 4 | 异步导出核心线程数 |
| export.async.max-pool-size | 8 | 异步导出最大线程数 |
| export.cleanup.cron | 0 0 2 * * ? | 清理任务Cron表达式 |
| export.cleanup.retention-days | 7 | 导出文件保留天数 |
## 性能优化
### 1. 大数据量导出
- 使用流式处理,避免内存溢出
- 分批次查询数据库
- 异步处理,不阻塞主线程
### 2. 并发控制
- 限制最大并发导出数
- 使用线程池隔离任务
- 队列缓冲,防止过载
### 3. 存储优化
- 及时清理过期文件
- 使用压缩存储
- 考虑使用对象存储(OSS)
## 监控告警
### 健康检查
- `/actuator/health`: 服务健康状态
- `/actuator/metrics`: 性能指标
### 关键指标
- `export.tasks.total`: 导出任务总数
- `export.tasks.active`: 当前活跃任务数
- `export.tasks.completed`: 已完成任务数
- `export.tasks.failed`: 失败任务数
- `export.file.size`: 导出文件大小
## 常见问题
### Q: 导出文件打不开?
A: 检查CSV文件编码是否为UTF-8-BOMExcel需要使用带BOM的UTF-8编码才能正确显示中文。
### Q: 导出超时怎么办?
A: 建议使用异步导出接口,导出会后台处理,完成后可查询历史记录下载。
### Q: 导出文件在哪里?
A: 默认存储在`/data/exports/{tenantId}/`目录下可通过API下载或直接访问。
### Q: 如何设置定时导出?
A: 使用`/api/v1/exports/scheduled`接口创建定时任务Cron表达式如`0 0 12 * * ?`表示每天中午12点执行。
## 更新日志
### v1.1.0 (2024-01-15)
- 新增PDF导出格式支持
- 新增定时导出任务功能
- 优化大数据量导出性能
- 新增加强监控指标
### v1.0.0 (2024-01-01)
- 初始版本
- 支持CSV/Excel导出
- 支持订单/商品/库存/供应商导出
- 支持异步导出