charging-cabinet/tasks/006-charge-records-and-logs.md

114 lines
3.2 KiB
Markdown
Raw Normal View History

# 任务006充电记录与设备日志
## 目标
实现充电记录查询/导出、设备日志查看、异步导出下载中心。
## 后端API
### 充电记录
```
GET /api/charge-records # 充电记录列表
?cabinet_id=xxx&cabin_board_id=xxx&compartment_id=xxx
&start_time=xxx&end_time=xxx&page=1&page_size=20
GET /api/charge-records/export # 导出充电记录(异步)
?cabinet_id=xxx&start_time=xxx&end_time=xxx
```
### 设备日志
```
GET /api/device-logs # 设备日志列表
?cabinet_id=xxx&log_type=xxx
&start_time=xxx&end_time=xxx&page=1&page_size=20
```
### 下载中心
```
GET /api/downloads # 下载任务列表
GET /api/downloads/:id # 获取下载链接
POST /api/downloads/cleanup # 清理过期文件
```
## 异步导出流程
```
1. 用户点击"导出" → POST /api/charge-records/export
2. 后端创建下载任务返回任务ID
3. 后台异步生成Excel文件
4. 用户到"下载中心"查看进度
5. 完成后点击下载
```
### 下载任务表
```sql
CREATE TABLE download_tasks (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
user_id BIGINT NOT NULL,
task_type VARCHAR(50) NOT NULL COMMENT 'charge_records/energy_stats',
status TINYINT DEFAULT 0 COMMENT '0排队 1处理中 2完成 3失败',
file_path VARCHAR(500) COMMENT '文件路径',
file_name VARCHAR(200) COMMENT '文件名',
progress INT DEFAULT 0 COMMENT '进度百分比',
error_message TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
completed_at TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
```
### 文件名智能生成
```
充电记录_项目A_20260701-20260731.xlsx
能耗统计_组织B_2026年7月.xlsx
设备日志_柜子10-00000001_20260701.xlsx
```
## 前端页面
### 充电记录页
**顶部过滤:**
- 柜子下拉(可选)
- 仓板下拉(可选,依赖柜子)
- 通道下拉(可选,依赖仓板)
- 时间范围选择器
- 查询按钮 + 导出按钮
**列表显示:**
| 柜子ID | 仓板 | 通道 | 开始时间 | 结束时间 | 充电量 | 最高温度 | 状态 |
|--------|------|------|----------|----------|--------|----------|------|
**分页:** 每页20条
### 设备日志页
**顶部过滤:**
- 柜子下拉
- 日志类型(状态上报/故障/告警/停电)
- 时间范围
**列表显示:**
| 柜子ID | 类型 | 内容摘要 | 时间 |
|--------|------|----------|------|
### 下载中心
**位置:** 充电记录页/能耗管理页的"导出"按钮旁
**弹窗显示:**
| 任务名称 | 状态 | 进度 | 操作 |
|----------|------|------|------|
| 充电记录_项目A... | 处理中 | 65% | 等待... |
| 能耗统计_组织B... | 完成 | 100% | [下载] |
## 质量约束
1. 完成代码后执行 `cargo check` + `tsc --noEmit`,零报错零警告
2. 分层拆分单函数≤80行命名语义化完整注释
3. 所有外部IO/网络请求异常捕获禁止裸panic
4. 分支逻辑全覆盖,不遗漏兜底分支
5. 常量抽离不使用废弃API
6. Rust内存安全React函数组件+Hooks
7. 导出任务异步执行,不阻塞请求