Files
jsowell-charger-web/doc/Web项目充电桩同步功能实现总结.md
2025-12-30 15:59:34 +08:00

273 lines
7.0 KiB
Markdown
Raw 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.
# Web 项目充电桩数据同步功能实现总结
> 完成时间2025-12-30
> 状态:✅ Web 项目部分已完成,等待 JCPP 项目配合
---
## 一、已完成功能
### 1. DTO 数据传输对象 ✅
**位置**`jsowell-pile/src/main/java/com/jsowell/pile/jcpp/dto/sync/`
| 文件名 | 说明 |
|--------|------|
| `JcppPileSyncDTO.java` | 充电桩同步数据 DTO |
| `JcppGunSyncDTO.java` | 充电枪同步数据 DTO |
| `JcppSyncRequest.java` | 同步请求 DTO |
| `JcppSyncResponse.java` | 同步响应 DTO |
| `JcppSyncResult.java` | 单个同步结果 DTO |
### 2. 数据库表和 Mapper ✅
**建表 SQL**`sql/jcpp_sync_record.sql`
**Domain 实体**`jsowell-pile/src/main/java/com/jsowell/pile/domain/JcppSyncRecord.java`
**Mapper 接口**`jsowell-pile/src/main/java/com/jsowell/pile/mapper/JcppSyncRecordMapper.java`
**Mapper XML**`jsowell-pile/src/main/resources/mapper/pile/JcppSyncRecordMapper.xml`
### 3. 同步服务 ✅
**服务接口**`jsowell-pile/src/main/java/com/jsowell/pile/jcpp/service/IJcppPileSyncService.java`
**服务实现**`jsowell-pile/src/main/java/com/jsowell/pile/jcpp/service/impl/JcppPileSyncServiceImpl.java`
**核心功能**
- ✅ 全量同步充电桩数据
- ✅ 增量同步充电桩数据(基于 update_time
- ✅ 单个充电桩同步
- ✅ 数据格式转换Web → JCPP
- ✅ 调用 JCPP 同步接口
- ✅ 同步记录管理
### 4. Controller 接口 ✅
**控制器**`jsowell-admin/src/main/java/com/jsowell/web/controller/jcpp/JcppPileSyncController.java`
**API 接口**
| 方法 | 路径 | 说明 | 权限 |
|------|------|------|------|
| POST | `/jcpp/sync/full` | 全量同步 | `jcpp:sync:full` |
| POST | `/jcpp/sync/incremental` | 增量同步 | `jcpp:sync:incremental` |
| POST | `/jcpp/sync/pile/{pileSn}` | 单个充电桩同步 | `jcpp:sync:single` |
| GET | `/jcpp/sync/records` | 查询同步记录列表 | `jcpp:sync:list` |
| GET | `/jcpp/sync/records/{id}` | 查询同步记录详情 | `jcpp:sync:query` |
### 5. 配置项 ✅
**配置文件**`jsowell-admin/src/main/resources/application-sit.yml`
```yaml
jcpp:
sync:
# JCPP 同步接口地址
api-url: http://localhost:8080/api/sync
# 批量同步大小
batch-size: 100
# 超时时间(毫秒)
timeout: 60000
# 是否启用自动增量同步
auto-sync-enabled: false
# 自动同步间隔(分钟)
auto-sync-interval: 30
```
---
## 二、核心实现逻辑
### 1. 数据转换逻辑
#### 充电桩数据转换
```java
Web (pile_basic_info) JCPP (t_pile)
- sn pileCode
- name pileName
- software_protocol protocol
- business_type type (1OPERATION, 2PERSONAL)
- 其他字段 additionalInfo (JSON)
- station_id 固定值 '88bca8da-cdbf-6587-aecc-75784838c501'
```
#### 充电枪数据转换
```java
Web (pile_connector_info) JCPP (t_gun)
- pile_connector_code gunCode
- name gunName
- pile_sn pileCode
- 最后2位 gunNo
- 其他字段 additionalInfo (JSON)
- station_id 固定值 '88bca8da-cdbf-6587-aecc-75784838c501'
```
### 2. 同步流程
#### 全量同步
1. 创建同步记录状态RUNNING
2. 查询所有未删除的充电桩和充电枪
3. 转换数据格式
4. 调用 JCPP 同步接口
- 先同步充电桩POST /api/sync/piles
- 再同步充电枪POST /api/sync/guns
5. 更新同步记录状态SUCCESS/FAILED
#### 增量同步
1. 获取上次同步时间(参数或查询最后一次成功记录)
2. 查询 update_time > lastSyncTime 的数据
3. 其他步骤同全量同步
#### 单个充电桩同步
1. 查询指定充电桩及其所有充电枪
2. 转换数据格式
3. 调用 JCPP 同步接口
### 3. 错误处理
- ✅ 接口调用异常捕获
- ✅ 单个数据失败不影响其他数据
- ✅ 详细的错误信息记录
- ✅ 同步记录状态管理
---
## 三、使用说明
### 1. 数据库初始化
执行建表 SQL
```bash
mysql -u username -p database_name < sql/jcpp_sync_record.sql
```
### 2. 配置 JCPP 接口地址
修改 `application-sit.yml`
```yaml
jcpp:
sync:
api-url: http://jcpp-server:8080/api/sync # 修改为实际地址
```
### 3. API 调用示例
#### 全量同步
```bash
curl -X POST http://localhost:8080/jcpp/sync/full \
-H "Authorization: Bearer {token}"
```
#### 增量同步
```bash
curl -X POST "http://localhost:8080/jcpp/sync/incremental?lastSyncTime=2025-12-30 10:00:00" \
-H "Authorization: Bearer {token}"
```
#### 单个充电桩同步
```bash
curl -X POST http://localhost:8080/jcpp/sync/pile/20231212000010 \
-H "Authorization: Bearer {token}"
```
#### 查询同步记录
```bash
curl -X GET "http://localhost:8080/jcpp/sync/records?pageNum=1&pageSize=10" \
-H "Authorization: Bearer {token}"
```
---
## 四、待完成事项
### 1. JCPP 项目需要实现 ⏳
请参考文档:`doc/JCPP项目配合实现Prompt.md`
需要实现的接口:
- [ ] POST /api/sync/piles - 充电桩同步接口
- [ ] POST /api/sync/guns - 充电枪同步接口
**重要提醒**
- 所有充电桩和充电枪的 station_id 统一使用固定值:`88bca8da-cdbf-6587-aecc-75784838c501`
- 确保 JCPP 数据库中已存在该 station_id 的充电站记录
### 2. 联调测试 ⏳
- [ ] 测试全量同步功能
- [ ] 测试增量同步功能
- [ ] 测试单个充电桩同步
- [ ] 测试异常场景(网络异常、数据异常等)
- [ ] 性能测试(大批量数据同步)
### 3. 优化项(可选)
- [ ] 添加按 update_time 查询的 Mapper 方法(提升增量同步性能)
- [ ] 添加重试机制(网络异常时自动重试)
- [ ] 添加同步进度查询(异步任务)
- [ ] 添加定时自动同步(基于配置)
- [ ] 添加同步数据校验(数据完整性检查)
---
## 五、技术要点
### 1. 固定 station_id 方案
**优势**
- ✅ 简化实现,无需维护映射表
- ✅ 减少接口调用次数
- ✅ 降低系统复杂度
**注意事项**
- Web 的原始 station_id 保存在 additionalInfo.webStationId 中
- 便于后续追溯和数据分析
### 2. 数据转换
**business_type 映射**
- "1" → "OPERATION"(运营桩)
- "2" → "PERSONAL"(个人桩)
**gun_no 提取**
- pile_connector_code: "2023121200001001"
- gun_no: "01"(最后 2 位)
### 3. 同步记录
**状态**
- RUNNING进行中
- SUCCESS成功
- FAILED失败
**统计信息**
- 总数、成功数、失败数(充电桩和充电枪分别统计)
- 错误信息列表
---
## 六、相关文档
- [充电桩数据同步需求.md](./充电桩数据同步需求.md) - 原始需求
- [充电桩数据同步实现计划.md](./充电桩数据同步实现计划.md) - 详细实现计划
- [JCPP项目配合实现Prompt.md](./JCPP项目配合实现Prompt.md) - 给 JCPP 项目的实现指南
- [JCPP对接进度文档.md](./JCPP对接进度文档.md) - JCPP 整体对接进度
---
## 七、问题反馈
如有任何问题,请及时反馈:
1. 接口调用异常
2. 数据转换错误
3. 性能问题
4. 其他技术问题
---
**文档版本**v1.0
**最后更新**2025-12-30
**维护人员**jsowell 团队