# 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`(使用自定义数据源配置)