# CLAUDE.md

This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.

## 项目概述

万车充运营管理平台 (jsowell-charger-web) - 电动汽车充电桩管理系统，基于 Spring Boot 2.5.14 + MyBatis + Netty 构建的多模块 Maven 项目。

**技术栈**：
- Java 8
- Spring Boot 2.5.14
- MyBatis + MyBatis-Plus 3.4.0
- Netty 4.1.75 (TCP/MQTT 通信)
- Dubbo 3.3.0 + Nacos (微服务)
- Redis (缓存)
- RabbitMQ (消息队列)
- MySQL (数据库)
- Druid (连接池)

## 模块架构

项目采用多模块分层架构，各模块职责清晰：

```
jsowell-charger-web/
├── jsowell-admin/          # Web 服务入口模块，包含 Controller 层和启动类
├── jsowell-framework/      # 核心框架模块，包含安全、权限、登录等基础服务
├── jsowell-system/         # 系统管理模块，用户、角色、菜单、字典等
├── jsowell-common/         # 通用工具模块，工具类、常量、异常、注解等
├── jsowell-pile/           # 充电桩业务核心模块，订单、会员、计费、支付等
├── jsowell-netty/          # Netty 通信模块，处理充电桩设备 TCP/MQTT 协议
├── jsowell-thirdparty/     # 第三方平台对接模块，支付宝、微信、高德地图等
├── jsowell-quartz/         # 定时任务模块
├── jsowell-generator/      # 代码生成器模块
└── jsowell-settlement/     # 结算模块
```

**模块依赖关系**：
- `jsowell-admin` 依赖 `jsowell-framework`、`jsowell-pile`、`jsowell-netty`、`jsowell-thirdparty`
- `jsowell-pile` 依赖 `jsowell-framework`（核心业务逻辑）
- `jsowell-netty` 依赖 `jsowell-pile`、`jsowell-thirdparty`（设备通信）
- `jsowell-framework` 依赖 `jsowell-system`、`jsowell-common`（基础框架）

---

## 核心业务功能

### 1. 会员管理

#### 1.1 会员基本信息
- **实体类**：`MemberBasicInfo`
- **服务类**：`MemberBasicInfoService`
- **数据表**：`member_basic_info`
- **功能**：会员注册、信息维护、实名认证、车牌绑定

#### 1.2 会员钱包
- **实体类**：`MemberWalletInfo`、`MemberWalletLog`
- **服务类**：`MemberWalletInfoService`、`MemberWalletLogService`
- **数据表**：`member_wallet_info`、`member_wallet_log`
- **功能**：
  - 余额管理（本金余额、赠金余额）
  - 充值记录
  - 消费记录
  - 退款处理

#### 1.3 会员积分系统
- **实体类**：`MemberPointsInfo`、`MemberPointsRecord`
- **服务类**：`MemberPointsInfoService`、`MemberPointsRecordService`
- **数据表**：`member_points_info`、`member_points_record`
- **Controller**：`MemberPointsInfoController`（路径：`/points`）

**积分规则**：
- 积分类型：`1-充电奖励`、`2-消费抵扣`
- 发放条件：
  1. 结算金额大于 0
  2. 在线支付（微信支付 payMode=4、支付宝支付 payMode=5）
- 积分计算：积分数量 = 实际结算金额（保留两位小数）
- 异步发放：通过 RabbitMQ 队列 `ykc.pointsReward-topic.member-group` 异步处理

**积分 API**：
| 方法 | 路径 | 说明 | 权限 |
|------|------|------|------|
| GET | `/points/balance` | 查询积分余额 | `member:points:query` |
| GET | `/points/list` | 查询积分明细 | `member:points:list` |
| POST | `/points/add` | 增加积分 | `member:points:add` |
| POST | `/points/deduct` | 扣减积分 | `member:points:deduct` |
| POST | `/points/init` | 初始化积分账户 | `member:points:init` |

**积分相关类**：
- 消息实体：`PointsRewardMessage`
- 消息生产者：`PointsRewardProducer`
- 消息消费者：`PointsRewardConsumer`
- RabbitMQ 配置：`PointsRabbitConfig`

---

### 2. 充电桩管理

#### 2.1 充电站
- **实体类**：`PileStationInfo`
- **服务类**：`PileStationInfoService`
- **数据表**：`pile_station_info`
- **功能**：充电站基本信息、地理位置、营业时间、服务设施

#### 2.2 充电桩设备
- **实体类**：`PileBasicInfo`
- **服务类**：`PileBasicInfoService`
- **数据表**：`pile_basic_info`
- **功能**：充电桩信息、在线状态、功率配置

#### 2.3 充电枪（连接器）
- **实体类**：`PileConnectorInfo`
- **服务类**：`PileConnectorInfoService`
- **数据表**：`pile_connector_info`
- **功能**：充电枪状态、充电功率、故障信息

#### 2.4 计费模板
- **实体类**：`PileBillingTemplate`
- **服务类**：`PileBillingTemplateService`
- **数据表**：`pile_billing_template`
- **功能**：分时电价、服务费配置、计费规则

---

### 3. 订单管理

#### 3.1 充电订单
- **实体类**：`OrderBasicInfo`
- **服务类**：`OrderBasicInfoService`
- **数据表**：`order_basic_info`
- **Mapper**：`OrderBasicInfoMapper`

**订单状态**（`OrderStatusEnum`）：
- `0` - 待支付
- `1` - 充电中
- `2` - 充电完成
- `3` - 已取消
- `4` - 异常结束

**支付状态**：
- `0` - 待支付
- `1` - 支付完成
- `2` - 无需支付
- `3` - 待补缴

**支付方式**（`OrderPayModeEnum`）：
- `1` - 余额支付（本金）
- `2` - 赠金支付
- `3` - 白名单支付（免费）
- `4` - 微信支付
- `5` - 支付宝支付
- `6` - ETC 支付

#### 3.2 订单支付记录
- **实体类**：`OrderPayRecord`
- **服务类**：`OrderPayRecordService`
- **数据表**：`order_pay_record`
- **功能**：记录每笔支付的详细信息，支持多次支付

#### 3.3 订单监控数据
- **实体类**：`OrderMonitorData`
- **服务类**：`OrderMonitorDataService`
- **数据表**：`order_monitor_data`
- **功能**：充电过程实时数据（电压、电流、功率、SOC）

#### 3.4 订单异常记录
- **实体类**：`OrderAbnormalRecord`
- **服务类**：`OrderAbnormalRecordService`
- **数据表**：`order_abnormal_record`
- **功能**：记录充电异常情况

---

### 4. 支付与结算

#### 4.1 支付方式

**微信支付**：
- 服务类：`WxAppletRemoteService`
- 配置类：`WechatPayConfig`
- 使用微信支付 V3 API
- 支持小程序支付

**支付宝支付**：
- 服务类：`AliAppletRemoteService`
- 支持支付宝小程序支付

**汇付支付**：
- 服务类：`AdapayService`、`AdapayMemberAccountService`
- 配置类：`AdapayConfig`
- 用于分账和清算

#### 4.2 订单结算流程

**结算入口**：`OrderBasicInfoServiceImpl.realTimeOrderSplit()`

**结算流程**：
1. 校验订单支付金额、消费金额、退款金额
2. 白名单支付直接返回（不做处理）
3. 余额支付校验：消费金额 - 折扣金额 + 退款金额 = 支付金额
4. 在线支付校验：结算金额 + 退款金额 = 支付金额
5. 执行退款（如有）
6. 执行分账
7. 发放积分奖励（异步）

**分账逻辑**：`splittingMethod()`
- 根据站点分账配置计算各方分成
- 支持电费和服务费分别计算
- 调用汇付支付接口执行分账

#### 4.3 分账配置
- **实体类**：`StationSplitConfig`
- **服务类**：`StationSplitConfigService`
- **数据表**：`station_split_config`
- **功能**：配置各参与方的分账比例

#### 4.4 分账记录
- **实体类**：`OrderSplitRecord`
- **服务类**：`OrderSplitRecordService`
- **数据表**：`order_split_record`
- **功能**：记录每笔订单的分账详情

#### 4.5 清算账单
- **实体类**：`ClearingBillInfo`、`ClearingBillDetail`
- **服务类**：`ClearingBillInfoService`、`ClearingBillDetailService`
- **数据表**：`clearing_bill_info`、`clearing_bill_detail`
- **功能**：商户清算账单管理

---

### 5. 充电桩通信

#### 5.1 通信架构
- **模块**：`jsowell-netty`
- **协议**：云快充协议（TCP）、MQTT 协议
- **服务器**：Netty TCP Server

#### 5.2 云快充协议处理器
位置：`com.jsowell.netty.handler.yunkuaichong`

主要处理器：
- `PileLoginHandler` - 充电桩登录
- `HeartBeatHandler` - 心跳检测
- `RealTimeDataHandler` - 实时数据上报
- `TransactionRecordHandler` - 交易记录上报
- `StartChargeHandler` - 启动充电
- `StopChargeHandler` - 停止充电

#### 5.3 业务服务
- `YKCBusinessService` - 云快充业务逻辑
- `EBikeBusinessService` - 电动自行车业务逻辑
- `CameraBusinessService` - 摄像头业务逻辑

#### 5.4 消息队列处理
- **监听器**：`OrderRabbitListener`、`PileRabbitListener`
- **队列常量**：`RabbitConstants`

主要队列：
| 队列名称 | 用途 |
|----------|------|
| `ykc.pileLogin-topic.device-group` | 充电桩登录 |
| `ykc.heartBeat-topic.device-group` | 心跳消息 |
| `ykc.realtimeData-topic.device-group` | 实时数据 |
| `ykc.chargeOrderData-topic.device-group` | 订单结算 |
| `ykc.pointsReward-topic.member-group` | 积分奖励 |

---

### 6. 第三方平台对接

#### 6.1 地图服务
- **高德地图**：`AMapService` - 充电站信息同步到高德

#### 6.2 停车场系统
- `QcyunsService` - 青城云停车
- `LTYTService` - 蓝天云停
- `RJService` - 睿捷停车

#### 6.3 充电平台互联互通
- `ZDLService` - 中电联平台
- `NRService` - 南瑞平台
- `XDTService` - 新电途平台

#### 6.4 第三方关系映射
- **实体类**：`ThirdpartySnRelation`
- **服务类**：`IThirdpartySnRelationService`
- **功能**：管理本地设备与第三方平台设备的映射关系

---

### 7. 商户管理

#### 7.1 商户信息
- **实体类**：`PileMerchantInfo`
- **服务类**：`PileMerchantInfoService`
- **数据表**：`pile_merchant_info`
- **功能**：商户基本信息、资质认证、结算账户

#### 7.2 商户汇付账户
- **实体类**：`MemberAdapayRecord`
- **服务类**：`MemberAdapayRecordService`、`AdapayMemberAccountService`
- **功能**：商户在汇付的分账账户管理

---

### 8. 白名单管理

- **实体类**：`PileStationWhitelist`
- **服务类**：`PileStationWhitelistService`
- **数据表**：`pile_station_whitelist`
- **功能**：
  - 免费充电白名单
  - 支持按车牌、会员、卡号设置
  - 白名单用户充电不扣费

---

### 9. 授权卡管理

- **实体类**：`PileAuthCard`
- **服务类**：`PileAuthCardService`
- **数据表**：`pile_auth_card`
- **功能**：
  - 刷卡充电授权
  - 卡号与会员绑定
  - 卡片状态管理

---

## 常用开发命令

### 构建与运行

```bash
# 编译整个项目
mvn clean compile

# 打包（跳过测试）
mvn clean package -DskipTests

# 运行主应用（开发环境）
cd jsowell-admin
mvn spring-boot:run -Dspring-boot.run.profiles=dev

# 运行测试
mvn test
```

### 数据库相关

**MyBatis Mapper 位置**：
- XML 文件：`src/main/resources/mapper/**/*Mapper.xml`
- Java 接口：`src/main/java/**/mapper/*Mapper.java`
- 配置：`mybatis-config.xml`（在 `jsowell-admin/src/main/resources/mybatis/`）

**MyBatis-Plus**：`jsowell-pile` 模块使用 MyBatis-Plus 3.4.0，支持 Lambda 查询和代码生成。

### 环境配置

**配置文件位置**：`jsowell-admin/src/main/resources/`
- `application.yml`：主配置文件
- `application-dev.yml`：开发环境
- `application-sit.yml`：测试环境
- `application-pre.yml`：预发布环境
- `application-prd.yml`：生产环境

**切换环境**：修改 `application.yml` 中的 `spring.profiles.active`

### Dubbo 服务

项目使用 Dubbo 3.3.0 + Nacos 作为微服务框架：
- 注册中心：Nacos
- 协议：dubbo（动态端口）
- API 定义：`charge-common-api` 模块

---

## 代码规范

### 包结构约定

```
com.jsowell.{module}/
├── controller/         # REST API 控制器
├── service/           # 业务逻辑接口
│   └── impl/         # 业务逻辑实现
├── mapper/           # MyBatis Mapper 接口
├── domain/           # 实体类（对应数据库表）
├── dto/              # 数据传输对象
├── vo/               # 视图对象
├── enums/            # 枚举类
└── mq/               # 消息队列相关
    ├── producer/     # 消息生产者
    └── consumer/     # 消息消费者
```

### 命名规范

- **Controller**：`{Entity}Controller`，使用 `@RestController` 或 `@Controller`
- **Service**：接口 `I{Entity}Service` 或 `{Entity}Service`，实现类 `{Entity}ServiceImpl`
- **Mapper**：`{Entity}Mapper`（接口）+ `{Entity}Mapper.xml`（XML）
- **Domain**：实体类名与数据库表名对应（驼峰转下划线）

### 注解使用

- **Swagger**：使用 `@Api`、`@ApiOperation`、`@ApiParam` 生成 API 文档
- **权限控制**：`@PreAuthorize("@ss.hasPermi('system:user:list')")`
- **日志记录**：`@Log(title = "用户管理", businessType = BusinessType.INSERT)`
- **数据权限**：`@DataScope(deptAlias = "d", userAlias = "u")`
- **事务管理**：`@Transactional(rollbackFor = Exception.class)`

---

## 关键配置说明

### RabbitMQ 配置

**配置类**：`RabbitConfig`、`PointsRabbitConfig`
**常量类**：`RabbitConstants`

**配置特点**：
- 消息序列化：`Jackson2JsonMessageConverter`
- 应答模式：自动应答（2024年12月26日改为自动）
- 重试机制：指数退避策略
- 并发消费者：1-20

### Netty 服务器配置

Netty 服务器在 `jsowell-netty` 模块中配置，支持：
- TCP 服务器（云快充协议）
- MQTT 服务器（物联网设备）
- 电动自行车专用服务器

### 安全与认证

- **JWT Token**：`TokenService` 管理 Token 生成和验证
- **密码加密**：使用 BCrypt 加密
- **权限验证**：`PermissionService` 和 `SysPermissionService`
- **登录限制**：密码错误 5 次锁定 10 分钟

### 缓存策略

使用 Redis 缓存：
- 用户登录信息
- 字典数据
- 配置参数
- 充电桩在线状态

### 文件上传

- **本地存储**：配置 `jsowell.profile` 路径
- **阿里云 OSS**：配置在 `aliyunoss` 节点
- **Minio**：可选的对象存储方案

---

## 数据库表结构

### 会员相关表
| 表名 | 说明 |
|------|------|
| `member_basic_info` | 会员基本信息 |
| `member_wallet_info` | 会员钱包 |
| `member_wallet_log` | 钱包流水 |
| `member_points_info` | 会员积分 |
| `member_points_record` | 积分流水 |
| `member_plate_number_relation` | 车牌绑定 |

### 充电桩相关表
| 表名 | 说明 |
|------|------|
| `pile_station_info` | 充电站信息 |
| `pile_basic_info` | 充电桩信息 |
| `pile_connector_info` | 充电枪信息 |
| `pile_billing_template` | 计费模板 |
| `pile_merchant_info` | 商户信息 |
| `pile_station_whitelist` | 白名单 |
| `pile_auth_card` | 授权卡 |

### 订单相关表
| 表名 | 说明 |
|------|------|
| `order_basic_info` | 订单基本信息 |
| `order_pay_record` | 支付记录 |
| `order_monitor_data` | 监控数据 |
| `order_abnormal_record` | 异常记录 |
| `order_split_record` | 分账记录 |

### 结算相关表
| 表名 | 说明 |
|------|------|
| `station_split_config` | 分账配置 |
| `clearing_bill_info` | 清算账单 |
| `clearing_bill_detail` | 清算明细 |
| `settle_order_report` | 结算报表 |

---

## 测试说明

测试文件位置：`jsowell-admin/src/test/java/`

现有测试：
- `SpringBootTestController.java`：Spring Boot 集成测试
- `PaymentTestController.java`：支付功能测试

---

## 监控与运维

### Prometheus 监控

- 监控端口：8091
- 指标路径：`/actuator/prometheus`
- 配置：`management.metrics.export.prometheus.enabled=true`

### Druid 监控

- 访问路径：`/druid/*`
- 用户名/密码：配置在 `application-{env}.yml` 中

### Swagger API 文档

- 开发环境访问：`http://localhost:8080/swagger-ui/`
- 配置：`swagger.enabled=true`

---

## 注意事项

1. **数据库连接**：使用 Druid 连接池，主从分离配置在 `application-{env}.yml`
2. **事务管理**：使用 `@Transactional` 注解，注意事务传播行为
3. **异步处理**：RabbitMQ 已改为自动应答模式
4. **Netty 线程模型**：注意 EventLoop 线程安全，避免阻塞操作
5. **Dubbo 服务**：启动时不检查提供者（`consumer.check=false`）
6. **日志级别**：开发环境 `com.jsowell: debug`，生产环境建议 `info`
7. **热部署**：开发环境启用 `spring.devtools.restart.enabled=true`
8. **积分发放**：通过 RabbitMQ 异步处理，避免影响订单结算主流程

---

## 启动类

主启动类：`com.jsowell.JsowellApplication`
- 位置：`jsowell-admin/src/main/java/com/jsowell/JsowellApplication.java`
- 注解：`@SpringBootApplication`、`@EnableDubbo`
- 排除：`DataSourceAutoConfiguration`（使用自定义数据源配置）
