# 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-BOM，Excel需要使用带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导出
- 支持订单/商品/库存/供应商导出
- 支持异步导出
