# 任务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. 导出任务异步执行,不阻塞请求