diff --git a/CLAUDE.md b/CLAUDE.md index 1168ef817..128b225d4 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -2,351 +2,195 @@ 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 项目。 +## 变更记录 (Changelog) -**技术栈**: -- 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 (连接池) +### 2026-02-03 11:32:30 +- **增量更新项目架构文档** +- 更新文件统计:600+ Java 文件、80 个 Mapper XML、60 个枚举类 +- 新增各模块 CLAUDE.md 文档(10 个模块) +- 更新模块依赖关系与覆盖率报告 +- 识别 108 个 Controller、80 个 Service 实现类 +- 覆盖率:核心模块 100%,测试模块 90% -## 模块架构 +### 2026-01-30 16:51:50 +- **初始化项目架构文档** +- 完成全仓扫描与模块识别(10 个模块) +- 生成根级 CLAUDE.md 文档 +- 建立模块依赖关系图(Mermaid) +- 识别 500+ Java 文件、85 个 Mapper XML、168 个测试用例 +- 覆盖率:核心模块 100%,测试模块 85% -项目采用多模块分层架构,各模块职责清晰: +--- -``` -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-charger-web) 是一个企业级电动汽车充电桩运营管理系统,旨在为充电站运营商提供完整的解决方案: + +- **设备管理**: 充电桩设备监控、状态管理、远程控制 +- **会员服务**: 会员注册、钱包管理、积分系统、车牌绑定 +- **订单管理**: 充电订单、支付结算、分账清算、退款处理 +- **实时通信**: 基于 Netty 的 TCP/MQTT 协议处理,支持云快充协议 +- **平台互联**: 对接中电联、南瑞、高德地图等第三方平台 +- **支付集成**: 支持微信、支付宝、汇付支付等多种支付方式 + +--- + +## 架构总览 + +### 技术栈 + +| 技术 | 版本 | 用途 | +|------|------|------| +| Java | 1.8 | 开发语言 | +| Spring Boot | 2.5.14 | 应用框架 | +| MyBatis | 2.2.2 | 持久层框架 | +| MyBatis-Plus | 3.4.0 | 增强工具(jsowell-pile 模块) | +| Netty | 4.1.75.Final | 设备通信(TCP/MQTT) | +| Dubbo | 3.3.0 | 微服务框架 | +| Nacos | 2.0.3 | 服务注册与配置中心 | +| Redis | - | 缓存 | +| RabbitMQ | - | 消息队列 | +| MySQL | - | 数据库 | +| Druid | 1.2.11 | 数据库连接池 | +| Swagger | 3.0.0 | API 文档 | +| Quartz | - | 定时任务 | + +### 核心特性 + +1. **多模块分层架构**: 清晰的模块职责划分,便于维护和扩展 +2. **设备实时通信**: 基于 Netty 的 TCP/MQTT 协议处理,支持云快充、电动自行车等多种设备 +3. **微服务架构**: Dubbo + Nacos 实现服务治理与配置管理 +4. **异步消息处理**: RabbitMQ 实现订单结算、积分发放等异步任务 +5. **多支付方式**: 支持微信、支付宝、汇付支付、余额支付、白名单免费等 +6. **第三方平台对接**: 支持中电联、南瑞、新电途、高德地图、停车场系统等 +7. **分账清算**: 完整的商户分账与清算流程,支持汇付支付分账 +8. **积分系统**: 充电奖励积分,异步发放,支持积分抵扣 + +--- + +## 模块结构图 + +```mermaid +graph TD + A["jsowell-charger-web
(根项目)"] --> B["jsowell-admin
(Web 入口)"]; + A --> C["jsowell-framework
(核心框架)"]; + A --> D["jsowell-system
(系统管理)"]; + A --> E["jsowell-common
(通用工具)"]; + A --> F["jsowell-pile
(充电桩业务)"]; + A --> G["jsowell-netty
(设备通信)"]; + A --> H["jsowell-thirdparty
(第三方对接)"]; + A --> I["jsowell-quartz
(定时任务)"]; + A --> J["jsowell-generator
(代码生成)"]; + A --> K["jsowell-settlement
(结算模块)"]; + + B --> C; + B --> F; + B --> G; + B --> H; + C --> D; + C --> E; + D --> E; + F --> C; + G --> F; + G --> H; + H --> F; + I --> F; + I --> G; + I --> H; + K --> F; + J --> E; + + style A fill:#e1f5ff + style B fill:#fff4e1 + style C fill:#ffe1e1 + style F fill:#e1ffe1 + style G fill:#f0e1ff + + click B "./jsowell-admin/CLAUDE.md" "查看 jsowell-admin 模块文档" + click C "./jsowell-framework/CLAUDE.md" "查看 jsowell-framework 模块文档" + click D "./jsowell-system/CLAUDE.md" "查看 jsowell-system 模块文档" + click E "./jsowell-common/CLAUDE.md" "查看 jsowell-common 模块文档" + click F "./jsowell-pile/CLAUDE.md" "查看 jsowell-pile 模块文档" + click G "./jsowell-netty/CLAUDE.md" "查看 jsowell-netty 模块文档" + click H "./jsowell-thirdparty/CLAUDE.md" "查看 jsowell-thirdparty 模块文档" + click I "./jsowell-quartz/CLAUDE.md" "查看 jsowell-quartz 模块文档" + click J "./jsowell-generator/CLAUDE.md" "查看 jsowell-generator 模块文档" + click K "./jsowell-settlement/CLAUDE.md" "查看 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`(基础框架) +--- + +## 模块索引 + +| 模块 | 路径 | 职责 | 主要依赖 | 状态 | +|------|------|------|---------|------| +| **jsowell-admin** | `/jsowell-admin` | Web 服务入口,包含 Controller 层和启动类 | framework, pile, netty, thirdparty | ✅ 活跃 | +| **jsowell-framework** | `/jsowell-framework` | 核心框架,包含安全、权限、登录等基础服务 | system, common | ✅ 活跃 | +| **jsowell-system** | `/jsowell-system` | 系统管理模块,用户、角色、菜单、字典等 | common | ✅ 活跃 | +| **jsowell-common** | `/jsowell-common` | 通用工具模块,工具类、常量、异常、注解等 | - | ✅ 活跃 | +| **jsowell-pile** | `/jsowell-pile` | 充电桩业务核心模块,订单、会员、计费、支付等 | framework | ✅ 活跃 | +| **jsowell-netty** | `/jsowell-netty` | Netty 通信模块,处理充电桩设备 TCP/MQTT 协议 | pile, thirdparty | ✅ 活跃 | +| **jsowell-thirdparty** | `/jsowell-thirdparty` | 第三方平台对接模块,支付宝、微信、高德地图等 | pile | ✅ 活跃 | +| **jsowell-quartz** | `/jsowell-quartz` | 定时任务模块 | pile, netty, thirdparty | ✅ 活跃 | +| **jsowell-generator** | `/jsowell-generator` | 代码生成器模块 | common | ✅ 活跃 | +| **jsowell-settlement** | `/jsowell-settlement` | 结算模块 | pile | ⚠️ 待完善 | --- -## 核心业务功能 +## 运行与开发 -### 1. 会员管理 +### 环境要求 -#### 1.1 会员基本信息 -- **实体类**:`MemberBasicInfo` -- **服务类**:`MemberBasicInfoService` -- **数据表**:`member_basic_info` -- **功能**:会员注册、信息维护、实名认证、车牌绑定 +- **JDK**: 1.8+ +- **Maven**: 3.6+ +- **MySQL**: 5.7+ +- **Redis**: 3.0+ +- **RabbitMQ**: 3.8+ +- **Nacos**: 2.0+ -#### 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 -# 编译整个项目 +# 1. 克隆项目 +git clone +cd jsowell-charger-web + +# 2. 编译项目 mvn clean compile -# 打包(跳过测试) +# 3. 打包(跳过测试) mvn clean package -DskipTests -# 运行主应用(开发环境) +# 4. 运行主应用(开发环境) cd jsowell-admin mvn spring-boot:run -Dspring-boot.run.profiles=dev -# 运行测试 -mvn test +# 或者运行打包后的 jar +java -jar jsowell-admin/target/jsowell-admin.jar --spring.profiles.active=dev ``` -### 数据库相关 +### 环境配置 + +配置文件位置:`jsowell-admin/src/main/resources/` + +- `application.yml` - 主配置文件 +- `application-dev.yml` - 开发环境 +- `application-sit.yml` - 测试环境 +- `application-pre.yml` - 预发布环境 +- `application-prd.yml` - 生产环境 + +切换环境:修改 `application.yml` 中的 `spring.profiles.active` + +### 访问地址 + +- **应用端口**: `http://localhost:8080` +- **Swagger 文档**: `http://localhost:8080/swagger-ui/` +- **Druid 监控**: `http://localhost:8080/druid/` +- **Prometheus 监控**: `http://localhost:8091/actuator/prometheus` + +### 数据库配置 **MyBatis Mapper 位置**: - XML 文件:`src/main/resources/mapper/**/*Mapper.xml` @@ -355,27 +199,52 @@ mvn test **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` 模块 +- API 定义:`charge-common-api` 模块(版本 0.1.7) --- -## 代码规范 +## 测试策略 + +### 测试文件位置 + +- 单元测试:`jsowell-admin/src/test/java/` +- 集成测试:同上 + +### 现有测试 + +| 测试类 | 测试数量 | 说明 | +|--------|---------|------| +| `SpringBootTestController` | 131 | Spring Boot 集成测试 | +| `PaymentTestController` | 20 | 支付功能测试 | +| `JcppMessageControllerTest` | 8 | JCPP 消息测试 | +| `PricingModelConverterTest` | 4 | 计费模型转换测试 | +| `OrderServiceWhitelistCompletionTest` | 3 | 白名单订单测试 | +| `WhitelistOrderCompletionDefaultsTest` | 2 | 白名单默认值测试 | +| `MemberBindingCarNoHttpTest` | - | 会员车牌绑定 HTTP 测试 | + +**总计**: 168 个测试用例 + +### 运行测试 + +```bash +# 运行所有测试 +mvn test + +# 运行指定模块测试 +mvn test -pl jsowell-admin + +# 跳过测试 +mvn clean package -DskipTests +``` + +--- + +## 编码规范 ### 包结构约定 @@ -389,6 +258,7 @@ com.jsowell.{module}/ ├── dto/ # 数据传输对象 ├── vo/ # 视图对象 ├── enums/ # 枚举类 +├── config/ # 配置类 └── mq/ # 消息队列相关 ├── producer/ # 消息生产者 └── consumer/ # 消息消费者 @@ -396,113 +266,112 @@ com.jsowell.{module}/ ### 命名规范 -- **Controller**:`{Entity}Controller`,使用 `@RestController` 或 `@Controller` -- **Service**:接口 `I{Entity}Service` 或 `{Entity}Service`,实现类 `{Entity}ServiceImpl` -- **Mapper**:`{Entity}Mapper`(接口)+ `{Entity}Mapper.xml`(XML) -- **Domain**:实体类名与数据库表名对应(驼峰转下划线) +- **Controller**: `{Entity}Controller`,使用 `@RestController` 或 `@Controller` +- **Service**: 接口 `I{Entity}Service` 或 `{Entity}Service`,实现类 `{Entity}ServiceImpl` +- **Mapper**: `{Entity}Mapper`(接口)+ `{Entity}Mapper.xml`(XML) +- **Domain**: 实体类名与数据库表名对应(驼峰转下划线) +- **Enum**: `{Name}Enum`,放在 `enums` 包下 ### 注解使用 -- **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)` +- **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**: `@RabbitListener`, `@RabbitHandler` + +### 代码质量 + +- 使用 Lombok 减少样板代码(`@Data`, `@Slf4j`, `@Builder` 等) +- 统一异常处理 (`GlobalExceptionHandler`) +- 统一返回结果 (`AjaxResult`, `R`) +- 日志规范:使用 SLF4J + Logback +- 使用 Swagger 注解生成 API 文档 --- -## 关键配置说明 +## AI 使用指引 -### RabbitMQ 配置 +### 常见任务 -**配置类**:`RabbitConfig`、`PointsRabbitConfig` -**常量类**:`RabbitConstants` +#### 1. 添加新的业务功能 -**配置特点**: -- 消息序列化:`Jackson2JsonMessageConverter` -- 应答模式:自动应答(2024年12月26日改为自动) -- 重试机制:指数退避策略 -- 并发消费者:1-20 +``` +请帮我在 jsowell-pile 模块中添加一个新的会员优惠券功能,包括: +- 实体类 MemberCoupon(对应数据库表 member_coupon) +- Mapper 接口和 XML(参考 MemberPointsInfoMapper) +- Service 接口和实现(参考 MemberPointsInfoService) +- Controller API(参考 MemberPointsInfoController) +- 需要支持 CRUD 操作和优惠券发放功能 +``` -### Netty 服务器配置 +#### 2. 修改订单结算逻辑 -Netty 服务器在 `jsowell-netty` 模块中配置,支持: -- TCP 服务器(云快充协议) -- MQTT 服务器(物联网设备) -- 电动自行车专用服务器 +``` +请查看 /Users/autumn/Workspace/jsowell-charger-web/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java +中的 realTimeOrderSplit() 方法,帮我理解当前的分账逻辑,并建议如何优化。 +``` -### 安全与认证 +#### 3. 添加第三方平台对接 -- **JWT Token**:`TokenService` 管理 Token 生成和验证 -- **密码加密**:使用 BCrypt 加密 -- **权限验证**:`PermissionService` 和 `SysPermissionService` -- **登录限制**:密码错误 5 次锁定 10 分钟 +``` +请参考 /Users/autumn/Workspace/jsowell-charger-web/jsowell-thirdparty/src/main/java/com/jsowell/thirdparty/zhongdianlian/service/impl/ZDLServiceImpl.java +的实现,帮我添加一个新的第三方平台对接,平台名称是 XXX,需要实现以下接口:... +``` -### 缓存策略 +#### 4. 调试 Netty 通信问题 -使用 Redis 缓存: -- 用户登录信息 -- 字典数据 -- 配置参数 -- 充电桩在线状态 +``` +充电桩设备无法正常登录,请帮我检查 +/Users/autumn/Workspace/jsowell-charger-web/jsowell-netty/src/main/java/com/jsowell/netty/service/yunkuaichong/impl/YKCBusinessServiceImpl.java +中的登录处理逻辑,并查看相关的 RabbitMQ 消息队列配置。 +``` -### 文件上传 +#### 5. 添加新的枚举类型 -- **本地存储**:配置 `jsowell.profile` 路径 -- **阿里云 OSS**:配置在 `aliyunoss` 节点 -- **Minio**:可选的对象存储方案 +``` +请在 jsowell-common 模块的 enums 包下添加一个新的枚举类 OrderRefundStatusEnum, +用于表示订单退款状态,参考现有的 OrderStatusEnum 的实现方式。 +``` ---- +### 关键文件索引 -## 数据库表结构 +| 功能 | 关键文件 | +|------|---------| +| 启动类 | `/Users/autumn/Workspace/jsowell-charger-web/jsowell-admin/src/main/java/com/jsowell/JsowellApplication.java` | +| 主配置 | `/Users/autumn/Workspace/jsowell-charger-web/jsowell-admin/src/main/resources/application.yml` | +| 订单结算 | `/Users/autumn/Workspace/jsowell-charger-web/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java` | +| 设备通信 | `/Users/autumn/Workspace/jsowell-charger-web/jsowell-netty/src/main/java/com/jsowell/netty/service/yunkuaichong/impl/YKCBusinessServiceImpl.java` | +| 积分系统 | `/Users/autumn/Workspace/jsowell-charger-web/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/MemberPointsInfoServiceImpl.java` | +| 微信支付 | `/Users/autumn/Workspace/jsowell-charger-web/jsowell-pile/src/main/java/com/jsowell/wxpay/config/WechatPayConfig.java` | +| 支付宝支付 | `/Users/autumn/Workspace/jsowell-charger-web/jsowell-pile/src/main/java/com/jsowell/alipay/config/AliPayConfig.java` | +| 汇付支付 | `/Users/autumn/Workspace/jsowell-charger-web/jsowell-pile/src/main/java/com/jsowell/adapay/config/InitializeAdapayConfig.java` | +| RabbitMQ 配置 | `/Users/autumn/Workspace/jsowell-charger-web/jsowell-common/src/main/java/com/jsowell/common/config/mq/RabbitConfig.java` | +| 积分 RabbitMQ | `/Users/autumn/Workspace/jsowell-charger-web/jsowell-common/src/main/java/com/jsowell/common/config/mq/PointsRabbitConfig.java` | +| 安全配置 | `/Users/autumn/Workspace/jsowell-charger-web/jsowell-framework/src/main/java/com/jsowell/framework/config/SecurityConfig.java` | +| Redis 配置 | `/Users/autumn/Workspace/jsowell-charger-web/jsowell-framework/src/main/java/com/jsowell/framework/config/RedisConfig.java` | -### 会员相关表 -| 表名 | 说明 | -|------|------| -| `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` | 授权卡 | +详细的数据库表结构请参考各模块的 `CLAUDE.md` 文档。 -### 订单相关表 -| 表名 | 说明 | -|------|------| -| `order_basic_info` | 订单基本信息 | -| `order_pay_record` | 支付记录 | -| `order_monitor_data` | 监控数据 | -| `order_abnormal_record` | 异常记录 | -| `order_split_record` | 分账记录 | +主要表分类: +- **会员相关**: `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` +- **结算相关**: `clearing_bill_info`, `clearing_bill_detail`, `station_split_config`, `settle_order_report` +- **系统相关**: `sys_user`, `sys_role`, `sys_menu`, `sys_dept`, `sys_dict_type`, `sys_dict_data`, `sys_config` -### 结算相关表 -| 表名 | 说明 | -|------|------| -| `station_split_config` | 分账配置 | -| `clearing_bill_info` | 清算账单 | -| `clearing_bill_detail` | 清算明细 | -| `settle_order_report` | 结算报表 | +### 枚举类索引 ---- +项目中定义了大量枚举类,位于 `jsowell-common/src/main/java/com/jsowell/common/enums/` 目录下: -## 测试说明 - -测试文件位置:`jsowell-admin/src/test/java/` - -现有测试: -- `SpringBootTestController.java`:Spring Boot 集成测试 -- `PaymentTestController.java`:支付功能测试 +- **订单相关**: `OrderStatusEnum`, `OrderPayStatusEnum`, `OrderPayModeEnum`, `OrderTypeEnum` +- **支付相关**: `PayModeEnum`, `PaymentInstitutionsEnum`, `AdapayStatusEnum`, `AdapayPayChannelEnum` +- **充电桩相关**: `PileStatusEnum`, `PileConnectorStatusEnum`, `StartModeEnum`, `StopChargingFailedReasonEnum` +- **会员相关**: `MemberWalletEnum`, `BalanceChangesEnum` +- **第三方平台**: `ThirdPlatformTypeEnum`, `ThirdPartyApiEnum`, `ThirdPartyReturnCodeEnum` --- @@ -510,38 +379,63 @@ Netty 服务器在 `jsowell-netty` 模块中配置,支持: ### Prometheus 监控 -- 监控端口:8091 -- 指标路径:`/actuator/prometheus` -- 配置:`management.metrics.export.prometheus.enabled=true` +- **监控端口**: `8091` +- **指标路径**: `/actuator/prometheus` +- **配置**: `management.metrics.export.prometheus.enabled=true` ### Druid 监控 -- 访问路径:`/druid/*` -- 用户名/密码:配置在 `application-{env}.yml` 中 +- **访问路径**: `/druid/*` +- **用户名/密码**: 配置在 `application-{env}.yml` 中 ### Swagger API 文档 -- 开发环境访问:`http://localhost:8080/swagger-ui/` -- 配置:`swagger.enabled=true` +- **开发环境访问**: `http://localhost:8080/swagger-ui/` +- **配置**: `swagger.enabled=true` + +### 日志 + +- **日志配置**: `logback-spring.xml` +- **日志级别**: + - 开发环境: `com.jsowell: debug` + - 生产环境: `com.jsowell: info` --- ## 注意事项 -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 异步处理,避免影响订单结算主流程 +1. **数据库连接**: 使用 Druid 连接池,主从分离配置在 `application-{env}.yml` +2. **事务管理**: 使用 `@Transactional` 注解,注意事务传播行为 +3. **异步处理**: RabbitMQ 已改为自动应答模式(2024年12月26日) +4. **Netty 线程模型**: 注意 EventLoop 线程安全,避免阻塞操作 +5. **Dubbo 服务**: 启动时不检查提供者(`consumer.check=false`) +6. **积分发放**: 通过 RabbitMQ 异步处理,避免影响订单结算主流程 +7. **热部署**: 开发环境启用 `spring.devtools.restart.enabled=true` +8. **文件上传**: 支持本地存储、阿里云 OSS、Minio 三种方式 +9. **密码安全**: 使用 BCrypt 加密,密码错误 5 次锁定 10 分钟 +10. **Token 管理**: JWT Token 有效期 1440 分钟(1天),接口 Token 有效期 259200 分钟(6个月) --- -## 启动类 +## 相关资源 -主启动类:`com.jsowell.JsowellApplication` -- 位置:`jsowell-admin/src/main/java/com/jsowell/JsowellApplication.java` -- 注解:`@SpringBootApplication`、`@EnableDubbo` -- 排除:`DataSourceAutoConfiguration`(使用自定义数据源配置) +- [Spring Boot 文档](https://spring.io/projects/spring-boot) +- [MyBatis 文档](https://mybatis.org/mybatis-3/) +- [MyBatis-Plus 文档](https://baomidou.com/) +- [Netty 文档](https://netty.io/wiki/) +- [Dubbo 文档](https://dubbo.apache.org/) +- [RabbitMQ 文档](https://www.rabbitmq.com/documentation.html) +- [Nacos 文档](https://nacos.io/zh-cn/docs/what-is-nacos.html) + +--- + +## 联系方式 + +- **项目维护**: jsowell 团队 +- **Git 分支**: + - 主分支: `master` + - 开发分支: `dev`(当前分支) +- **最近提交**: + - `543f989ff` - update CLAUDE.md + - `7c576ca25` - bugfix 查询订单详情字段为空 + - `c1db659cc` - update diff --git a/jsowell-admin/CLAUDE.md b/jsowell-admin/CLAUDE.md new file mode 100644 index 000000000..6f64586c9 --- /dev/null +++ b/jsowell-admin/CLAUDE.md @@ -0,0 +1,187 @@ +[根目录](../CLAUDE.md) > **jsowell-admin** + +# jsowell-admin 模块 + +Web 服务入口模块,包含应用启动类、Controller 层和配置文件。 + +--- + +## 变更记录 (Changelog) + +### 2026-02-03 11:32:30 +- 初始化模块文档 +- 识别 108 个 Controller +- 统计测试用例 168 个 + +--- + +## 模块职责 + +- **应用启动**: Spring Boot 启动类 `JsowellApplication` +- **REST API**: 所有 HTTP 接口的 Controller 层 +- **配置管理**: 多环境配置文件(dev/sit/pre/prd) +- **测试入口**: 单元测试和集成测试 + +--- + +## 入口与启动 + +### 启动类 + +```java +// JsowellApplication.java +@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) +@EnableDubbo +public class JsowellApplication { + public static void main(String[] args) { + SpringApplication.run(JsowellApplication.class, args); + } +} +``` + +### 启动命令 + +```bash +# 开发环境 +mvn spring-boot:run -Dspring-boot.run.profiles=dev + +# 生产环境 +java -jar jsowell-admin.jar --spring.profiles.active=prd +``` + +--- + +## 对外接口 + +### Controller 分类 + +| 包路径 | 数量 | 说明 | +|--------|------|------| +| `com.jsowell.web.controller.system` | 14 | 系统管理(用户、角色、菜单等) | +| `com.jsowell.web.controller.pile` | 22 | 充电桩业务(订单、会员、站点等) | +| `com.jsowell.web.controller.monitor` | 6 | 监控管理(缓存、日志、在线用户) | +| `com.jsowell.api.thirdparty` | 30+ | 第三方平台对接 API | +| `com.jsowell.api.uniapp.customer` | 12 | 小程序用户端 API | +| `com.jsowell.api.uniapp.business` | 5 | 小程序运营端 API | +| `com.jsowell.web.controller.jcpp` | 4 | JCPP 协议接口 | + +### 主要 Controller + +| Controller | 路径 | 说明 | +|------------|------|------| +| `SysLoginController` | `/login`, `/logout` | 登录认证 | +| `SysUserController` | `/system/user/**` | 用户管理 | +| `OrderBasicInfoController` | `/pile/order/**` | 订单管理 | +| `MemberBasicInfoController` | `/pile/member/**` | 会员管理 | +| `PileStationInfoController` | `/pile/station/**` | 站点管理 | +| `PileBasicInfoController` | `/pile/pile/**` | 充电桩管理 | +| `ZDLController` | `/api/zdl/**` | 中电联对接 | + +--- + +## 关键依赖与配置 + +### Maven 依赖 + +```xml + + + com.jsowell + jsowell-framework + + + com.jsowell + jsowell-pile + + + com.jsowell + jsowell-netty + + + com.jsowell + jsowell-thirdparty + + + com.jsowell + jsowell-quartz + + + com.jsowell + jsowell-generator + + +``` + +### 配置文件 + +| 文件 | 说明 | +|------|------| +| `application.yml` | 主配置,环境切换 | +| `application-dev.yml` | 开发环境 | +| `application-sit.yml` | 测试环境 | +| `application-pre.yml` | 预发布环境 | +| `application-prd.yml` | 生产环境 | +| `mybatis/mybatis-config.xml` | MyBatis 配置 | +| `logback-spring.xml` | 日志配置 | + +--- + +## 测试与质量 + +### 测试文件 + +| 测试类 | 说明 | +|--------|------| +| `SpringBootTestController` | 集成测试(131 个用例) | +| `PaymentTestController` | 支付功能测试 | +| `JcppMessageControllerTest` | JCPP 消息测试 | +| `PricingModelConverterTest` | 计费模型测试 | +| `OrderServiceWhitelistCompletionTest` | 白名单订单测试 | + +### 运行测试 + +```bash +mvn test -pl jsowell-admin +``` + +--- + +## 常见问题 (FAQ) + +### Q: 如何切换环境? +修改 `application.yml` 中的 `spring.profiles.active` 或启动时指定 `--spring.profiles.active=xxx` + +### Q: Swagger 文档无法访问? +检查 `swagger.enabled` 配置是否为 `true`,生产环境默认关闭 + +### Q: 启动报数据库连接错误? +检查对应环境配置文件中的数据库连接信息 + +--- + +## 相关文件清单 + +``` +jsowell-admin/ +├── src/main/java/com/jsowell/ +│ ├── JsowellApplication.java # 启动类 +│ ├── JsowellServletInitializer.java # Servlet 初始化 +│ ├── api/ # API 接口 +│ │ ├── feign/ # Feign 客户端 +│ │ ├── thirdparty/ # 第三方平台 API +│ │ └── uniapp/ # 小程序 API +│ ├── service/ # 本模块服务 +│ └── web/controller/ # Web 控制器 +│ ├── common/ # 通用控制器 +│ ├── jcpp/ # JCPP 协议 +│ ├── monitor/ # 监控管理 +│ ├── pile/ # 充电桩业务 +│ ├── system/ # 系统管理 +│ ├── thirdparty/ # 第三方配置 +│ └── tool/ # 工具类 +├── src/main/resources/ +│ ├── application*.yml # 配置文件 +│ ├── mybatis/ # MyBatis 配置 +│ └── logback-spring.xml # 日志配置 +└── src/test/java/ # 测试代码 +``` diff --git a/jsowell-admin/src/main/java/com/jsowell/web/controller/pile/OrderBasicInfoController.java b/jsowell-admin/src/main/java/com/jsowell/web/controller/pile/OrderBasicInfoController.java index 27c259283..93d8329c3 100644 --- a/jsowell-admin/src/main/java/com/jsowell/web/controller/pile/OrderBasicInfoController.java +++ b/jsowell-admin/src/main/java/com/jsowell/web/controller/pile/OrderBasicInfoController.java @@ -12,6 +12,7 @@ import com.jsowell.common.enums.BusinessType; import com.jsowell.common.enums.ykc.ReturnCodeEnum; import com.jsowell.common.exception.BusinessException; import com.jsowell.common.response.RestApiResponse; +import com.jsowell.common.util.SecurityUtils; import com.jsowell.common.util.YKCUtils; import com.jsowell.common.util.poi.ExcelUtil; import com.jsowell.pile.domain.OrderBasicInfo; @@ -33,6 +34,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.math.BigDecimal; import java.util.List; +import java.util.Objects; /** * 订单Controller @@ -94,6 +96,9 @@ public class OrderBasicInfoController extends BaseController { // 为空表示没有权限,返回空数组 return new AjaxResult(); } + if (Objects.nonNull(SecurityUtils.getLoginUser())) { + dto.setParams(ImmutableMap.of("roleId", SecurityUtils.getLoginUser().getUserId())); + } String deptId = authorizedMap.getDeptId(); if (CollectionUtils.isNotEmpty(authorizedMap.getStationDeptIds())) { // 为站点管理员 diff --git a/jsowell-common/CLAUDE.md b/jsowell-common/CLAUDE.md new file mode 100644 index 000000000..56716d3dd --- /dev/null +++ b/jsowell-common/CLAUDE.md @@ -0,0 +1,171 @@ +[根目录](../CLAUDE.md) > **jsowell-common** + +# jsowell-common 模块 + +通用工具模块,提供工具类、常量、异常、注解等基础组件。 + +--- + +## 变更记录 (Changelog) + +### 2026-02-03 11:32:30 +- 初始化模块文档 +- 识别 60 个枚举类 +- 统计 100+ 工具类和数据结构 + +--- + +## 模块职责 + +- **工具类**: 字符串、日期、文件、HTTP 等工具 +- **常量定义**: 系统常量、RabbitMQ 常量 +- **枚举类**: 订单状态、支付方式、设备状态等 +- **注解定义**: 日志、权限、数据源等注解 +- **基础实体**: BaseEntity、AjaxResult、R +- **协议数据**: 云快充协议、电动自行车协议数据结构 +- **MQ 配置**: RabbitMQ 队列、交换机配置 + +--- + +## 入口与启动 + +本模块为基础工具模块,无独立启动入口。 + +--- + +## 对外接口 + +### 核心类 + +| 类 | 说明 | +|-----|------| +| `AjaxResult` | 统一返回结果 | +| `R` | 泛型返回结果 | +| `BaseEntity` | 基础实体类 | +| `BaseController` | 基础控制器 | +| `LoginUser` | 登录用户信息 | + +### 注解 + +| 注解 | 说明 | +|------|------| +| `@Log` | 操作日志 | +| `@DataScope` | 数据权限 | +| `@DataSource` | 数据源切换 | +| `@RateLimiter` | 接口限流 | +| `@RepeatSubmit` | 防重复提交 | +| `@Anonymous` | 匿名访问 | +| `@CostTime` | 耗时统计 | + +### 枚举类(60+) + +**订单相关**: +- `OrderStatusEnum` - 订单状态 +- `OrderPayStatusEnum` - 支付状态 +- `OrderPayModeEnum` - 支付方式 +- `OrderTypeEnum` - 订单类型 + +**支付相关**: +- `PayModeEnum` - 支付方式 +- `PaymentInstitutionsEnum` - 支付机构 +- `AdapayStatusEnum` - 汇付状态 +- `AdapayPayChannelEnum` - 汇付渠道 + +**设备相关**: +- `PileStatusEnum` - 充电桩状态 +- `PileConnectorStatusEnum` - 充电枪状态 +- `StartModeEnum` - 启动方式 + +**第三方平台**: +- `ThirdPlatformTypeEnum` - 平台类型 +- `ThirdPartyApiEnum` - API 类型 +- `ThirdPartyReturnCodeEnum` - 返回码 + +--- + +## 关键依赖与配置 + +### RabbitMQ 配置 + +```java +// RabbitConfig.java - 主配置 +// PointsRabbitConfig.java - 积分队列配置 +// DirectRabbitConfig.java - 直连交换机配置 +// TopicRabbitConfig.java - 主题交换机配置 +``` + +### 常量定义 + +```java +// RabbitConstants.java +public class RabbitConstants { + public static final String ORDER_QUEUE = "order.queue"; + public static final String POINTS_QUEUE = "points.queue"; + // ... +} +``` + +--- + +## 数据模型 + +### 云快充协议数据 + +| 类 | 说明 | +|-----|------| +| `YKCDataProtocol` | 协议数据 | +| `YKCBaseMessage` | 基础消息 | +| `LoginRequestData` | 登录数据 | +| `RealTimeMonitorData` | 实时监控数据 | +| `TransactionRecordsData` | 交易记录 | + +### 设备到平台数据(0x01-0xF1) + +位于 `com.jsowell.common.core.domain.ykc.device2platform/` + +### 平台到设备数据(0x02-0x56) + +位于 `com.jsowell.common.core.domain.ykc.platform2device/` + +--- + +## 常见问题 (FAQ) + +### Q: 如何添加新的枚举? +在 `com.jsowell.common.enums` 包下创建,参考现有枚举实现 + +### Q: 如何添加新的 RabbitMQ 队列? +在 `RabbitConfig` 或新建配置类中定义 Queue、Exchange、Binding + +--- + +## 相关文件清单 + +``` +jsowell-common/ +├── src/main/java/com/jsowell/common/ +│ ├── annotation/ # 注解定义 +│ ├── config/ # 配置类 +│ │ └── mq/ # RabbitMQ 配置 +│ ├── constant/ # 常量定义 +│ ├── core/ +│ │ ├── controller/ # BaseController +│ │ └── domain/ # 基础实体 +│ │ ├── entity/ # 系统实体 +│ │ ├── model/ # 登录模型 +│ │ ├── ykc/ # 云快充协议 +│ │ └── ebike/ # 电动自行车协议 +│ ├── enums/ # 枚举类 (60+) +│ │ ├── adapay/ +│ │ ├── ebike/ +│ │ ├── lianlian/ +│ │ ├── parkplatform/ +│ │ ├── sim/ +│ │ ├── thirdparty/ +│ │ ├── uniapp/ +│ │ └── ykc/ +│ ├── exception/ # 异常类 +│ ├── filter/ # 过滤器 +│ └── utils/ # 工具类 +└── pom.xml +``` diff --git a/jsowell-framework/CLAUDE.md b/jsowell-framework/CLAUDE.md new file mode 100644 index 000000000..722ad8c18 --- /dev/null +++ b/jsowell-framework/CLAUDE.md @@ -0,0 +1,137 @@ +[根目录](../CLAUDE.md) > **jsowell-framework** + +# jsowell-framework 模块 + +核心框架模块,提供安全、权限、登录等基础服务。 + +--- + +## 变更记录 (Changelog) + +### 2026-02-03 11:32:30 +- 初始化模块文档 +- 识别 45 个核心类 + +--- + +## 模块职责 + +- **安全框架**: Spring Security 配置 +- **JWT 认证**: Token 生成与验证 +- **权限控制**: 数据权限、接口权限 +- **数据源管理**: 动态数据源、Druid 配置 +- **AOP 切面**: 日志、限流、数据权限 +- **异常处理**: 全局异常处理 + +--- + +## 入口与启动 + +本模块为基础框架模块,无独立启动入口。 + +--- + +## 对外接口 + +### 核心服务 + +| 服务 | 说明 | +|------|------| +| `TokenService` | JWT Token 服务 | +| `SysLoginService` | 登录服务 | +| `SysPasswordService` | 密码服务 | +| `PermissionService` | 权限服务 | +| `UserDetailsServiceImpl` | 用户详情服务 | + +### 配置类 + +| 配置类 | 说明 | +|--------|------| +| `SecurityConfig` | Spring Security 配置 | +| `RedisConfig` | Redis 配置 | +| `DruidConfig` | Druid 数据源配置 | +| `MyBatisConfig` | MyBatis 配置 | +| `ThreadPoolConfig` | 线程池配置 | + +### AOP 切面 + +| 切面 | 说明 | +|------|------| +| `LogAspect` | 操作日志记录 | +| `DataScopeAspect` | 数据权限过滤 | +| `DataSourceAspect` | 动态数据源切换 | +| `RateLimiterAspect` | 接口限流 | +| `CostTimeAspect` | 耗时统计 | + +--- + +## 关键依赖与配置 + +### Maven 依赖 + +```xml + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-aop + + + com.alibaba + druid-spring-boot-starter + + + com.jsowell + jsowell-system + + +``` + +--- + +## 常见问题 (FAQ) + +### Q: Token 过期如何处理? +Token 有效期配置在 `application.yml` 的 `token.expireTime`,默认 1440 分钟 + +### Q: 如何添加接口白名单? +在 `SecurityConfig` 中配置 `permitAllUrls` 或使用 `@Anonymous` 注解 + +### Q: 数据权限如何配置? +使用 `@DataScope` 注解,配置 `deptAlias` 和 `userAlias` + +--- + +## 相关文件清单 + +``` +jsowell-framework/ +├── src/main/java/com/jsowell/framework/ +│ ├── aspectj/ # AOP 切面 +│ │ ├── LogAspect.java +│ │ ├── DataScopeAspect.java +│ │ ├── DataSourceAspect.java +│ │ ├── RateLimiterAspect.java +│ │ └── CostTimeAspect.java +│ ├── async/ # 异步处理 +│ ├── config/ # 配置类 +│ │ ├── SecurityConfig.java +│ │ ├── RedisConfig.java +│ │ ├── DruidConfig.java +│ │ ├── MyBatisConfig.java +│ │ └── ThreadPoolConfig.java +│ ├── datasource/ # 动态数据源 +│ ├── interceptor/ # 拦截器 +│ ├── manager/ # 管理器 +│ ├── security/ # 安全相关 +│ │ ├── filter/ +│ │ └── handle/ +│ └── web/ +│ ├── domain/ # 服务器信息 +│ ├── exception/ # 异常处理 +│ └── service/ # 核心服务 +└── pom.xml +``` diff --git a/jsowell-generator/CLAUDE.md b/jsowell-generator/CLAUDE.md new file mode 100644 index 000000000..b92ce6645 --- /dev/null +++ b/jsowell-generator/CLAUDE.md @@ -0,0 +1,127 @@ +[根目录](../CLAUDE.md) > **jsowell-generator** + +# jsowell-generator 模块 + +代码生成器模块,基于 Velocity 模板生成 CRUD 代码。 + +--- + +## 变更记录 (Changelog) + +### 2026-02-03 11:32:30 +- 初始化模块文档 +- 识别 13 个 Java 文件 + +--- + +## 模块职责 + +- **代码生成**: 根据数据库表生成 CRUD 代码 +- **模板管理**: Velocity 模板配置 +- **表结构解析**: 数据库表结构读取与解析 + +--- + +## 入口与启动 + +本模块为工具模块,无独立启动入口。 + +--- + +## 对外接口 + +### Controller + +| Controller | 路径 | 说明 | +|------------|------|------| +| `GenController` | `/tool/gen/**` | 代码生成 | + +### Service + +| Service | 说明 | +|---------|------| +| `IGenTableService` | 表信息服务 | +| `IGenTableColumnService` | 列信息服务 | + +--- + +## 关键依赖与配置 + +### Maven 依赖 + +```xml + + + org.apache.velocity + velocity-engine-core + + + com.jsowell + jsowell-common + + +``` + +### 生成配置 + +```java +// GenConfig.java +public class GenConfig { + // 作者、包路径、自动去除表前缀等配置 +} +``` + +--- + +## 数据模型 + +### 核心实体 + +| 实体类 | 数据库表 | 说明 | +|--------|---------|------| +| `GenTable` | `gen_table` | 代码生成表 | +| `GenTableColumn` | `gen_table_column` | 代码生成列 | + +### Mapper XML 文件 + +位置:`src/main/resources/mapper/generator/` + +- `GenTableMapper.xml` (206 行) +- `GenTableColumnMapper.xml` (127 行) + +--- + +## 常见问题 (FAQ) + +### Q: 如何生成代码? +1. 访问 `/tool/gen` 页面 +2. 导入数据库表 +3. 配置生成选项 +4. 点击生成代码 + +--- + +## 相关文件清单 + +``` +jsowell-generator/ +├── src/main/java/com/jsowell/generator/ +│ ├── config/ # 配置 +│ │ └── GenConfig.java +│ ├── controller/ # 控制器 +│ │ └── GenController.java +│ ├── domain/ # 实体类 +│ │ ├── GenTable.java +│ │ └── GenTableColumn.java +│ ├── mapper/ # Mapper 接口 +│ ├── service/ # Service 接口 +│ │ └── impl/ # Service 实现 +│ └── util/ # 工具类 +│ ├── GenUtils.java +│ ├── VelocityInitializer.java +│ └── VelocityUtils.java +├── src/main/resources/ +│ ├── mapper/generator/ # Mapper XML +│ └── vm/ # Velocity 模板 +└── pom.xml +``` diff --git a/jsowell-netty/CLAUDE.md b/jsowell-netty/CLAUDE.md new file mode 100644 index 000000000..47609f22b --- /dev/null +++ b/jsowell-netty/CLAUDE.md @@ -0,0 +1,218 @@ +[根目录](../CLAUDE.md) > **jsowell-netty** + +# jsowell-netty 模块 + +Netty 通信模块,处理充电桩设备的 TCP/MQTT 协议通信。 + +--- + +## 变更记录 (Changelog) + +### 2026-02-03 11:32:30 +- 初始化模块文档 +- 识别云快充协议处理器 70+ 个 +- 识别电动自行车协议处理器 7 个 + +--- + +## 模块职责 + +- **TCP 服务**: 基于 Netty 的 TCP 服务器,处理充电桩设备连接 +- **MQTT 服务**: MQTT 协议支持 +- **协议解析**: 云快充协议、电动自行车协议解析 +- **消息处理**: 设备登录、心跳、充电控制、数据上报 +- **远程控制**: 远程启停充电、参数配置、固件升级 + +--- + +## 入口与启动 + +### Netty 服务器 + +```java +// NettyServer.java - 云快充 TCP 服务器 +@Component +public class NettyServer { + // 启动 TCP 服务器,监听充电桩连接 +} + +// MqttSever.java - MQTT 服务器 +@Component +public class MqttSever { + // 启动 MQTT 服务器 +} +``` + +### 服务管理 + +```java +// NettyServerManager.java +@Component +public class NettyServerManager { + // 管理多个 Netty 服务器实例 +} +``` + +--- + +## 对外接口 + +### 协议处理器(云快充) + +| Handler | 帧类型 | 说明 | +|---------|--------|------| +| `LoginRequestHandler` | 0x01 | 设备登录 | +| `HeartbeatRequestHandler` | 0x03 | 心跳 | +| `BillingTemplateRequestHandler` | 0x05 | 计费模板请求 | +| `RemoteStartChargingRequestHandler` | 0x33 | 远程启动充电 | +| `RemoteStopChargingRequestHandler` | 0x35 | 远程停止充电 | +| `UploadRealTimeMonitorHandler` | 0x13 | 实时监控数据上报 | +| `ChargeEndHandler` | 0x15 | 充电结束 | +| `ConfirmStartChargingRequestHandler` | 0x17 | 确认启动充电 | + +### 协议处理器(电动自行车) + +| Handler | 说明 | +|---------|------| +| `RegistrationHandler` | 设备注册 | +| `HeartbeatHandler` | 心跳 | +| `SettlementUploadHandler` | 结算上报 | +| `PowerHeartbeatHandler` | 电源心跳 | + +### 业务服务 + +```java +// YKCBusinessService.java - 云快充业务服务 +public interface YKCBusinessService { + void handleLogin(LoginRequestData data); + void handleHeartbeat(HeartbeatData data); + void handleChargeEnd(TransactionRecordsData data); + // ... +} + +// EBikeBusinessService.java - 电动自行车业务服务 +public interface EBikeBusinessService { + void handleRegistration(RegistrationData data); + void handleSettlement(SettlementData data); + // ... +} +``` + +--- + +## 关键依赖与配置 + +### Maven 依赖 + +```xml + + + io.netty + netty-all + 4.1.75.Final + + + io.netty + netty-codec-mqtt + 4.1.79.Final + + + com.jsowell + jsowell-pile + + + com.jsowell + jsowell-thirdparty + + +``` + +--- + +## 数据模型 + +### 协议数据结构 + +| 类 | 说明 | +|-----|------| +| `YKCDataProtocol` | 云快充协议数据 | +| `YKCBaseMessage` | 基础消息 | +| `LoginRequestData` | 登录请求数据 | +| `RealTimeMonitorData` | 实时监控数据 | +| `TransactionRecordsData` | 交易记录数据 | +| `EBikeDataProtocol` | 电动自行车协议数据 | + +### 帧类型码 + +定义在 `YKCFrameTypeCode.java`: +- `0x01/0x02` - 登录请求/响应 +- `0x03/0x04` - 心跳请求/响应 +- `0x13/0x14` - 实时数据上报/响应 +- `0x15/0x16` - 充电结束上报/响应 +- `0x33/0x34` - 远程启动/响应 +- `0x35/0x36` - 远程停止/响应 + +--- + +## 测试与质量 + +### 测试客户端 + +```java +// TestNettyClient.java +public class TestNettyClient { + // 用于测试 Netty 服务器的客户端 +} +``` + +--- + +## 常见问题 (FAQ) + +### Q: 设备无法连接? +1. 检查 TCP 端口是否开放 +2. 检查设备 SN 是否已注册 +3. 查看 `YKCBusinessServiceImpl.handleLogin()` 日志 + +### Q: 充电无法启动? +1. 检查设备在线状态 +2. 检查充电枪状态 +3. 查看 `RemoteStartChargingRequestHandler` 处理逻辑 + +### Q: 实时数据不更新? +1. 检查心跳是否正常 +2. 检查 `UploadRealTimeMonitorHandler` 处理 +3. 查看 RabbitMQ 消息队列状态 + +--- + +## 相关文件清单 + +``` +jsowell-netty/ +├── src/main/java/com/jsowell/netty/ +│ ├── client/ # Netty 客户端 +│ ├── decoder/ # 协议解码器 +│ │ ├── YkcProtocolDecoder.java +│ │ ├── YouDianProtocolDecoder.java +│ │ └── YunKuaiChongDecoder.java +│ ├── domain/ # 数据模型 +│ ├── factory/ # 处理器工厂 +│ │ ├── YKCOperateFactory.java +│ │ └── EBikeOperateFactory.java +│ ├── handler/ # 消息处理器 +│ │ ├── yunkuaichong/ # 云快充处理器 (70+) +│ │ └── electricbicycles/ # 电动自行车处理器 +│ ├── server/ # Netty 服务器 +│ │ ├── yunkuaichong/ # 云快充服务器 +│ │ ├── electricbicycles/ # 电动自行车服务器 +│ │ └── mqtt/ # MQTT 服务器 +│ ├── service/ # 业务服务 +│ │ ├── yunkuaichong/ +│ │ ├── electricbicycles/ +│ │ ├── camera/ +│ │ └── rabbitmq/ # RabbitMQ 监听 +│ └── strategy/ # 策略模式 +│ └── ykc/ # 云快充策略 +└── pom.xml +``` diff --git a/jsowell-pile/CLAUDE.md b/jsowell-pile/CLAUDE.md new file mode 100644 index 000000000..6c795e86b --- /dev/null +++ b/jsowell-pile/CLAUDE.md @@ -0,0 +1,184 @@ +[根目录](../CLAUDE.md) > **jsowell-pile** + +# jsowell-pile 模块 + +充电桩业务核心模块,包含订单、会员、计费、支付等核心业务逻辑。 + +--- + +## 变更记录 (Changelog) + +### 2026-02-03 11:32:30 +- 初始化模块文档 +- 识别 80 个 Service 实现类 +- 统计 60+ Mapper XML 文件 + +--- + +## 模块职责 + +- **订单管理**: 充电订单创建、结算、分账、退款 +- **会员服务**: 会员注册、钱包管理、积分系统 +- **计费管理**: 计费模板、时段电价、服务费 +- **支付集成**: 微信支付、支付宝、汇付支付(Adapay) +- **设备管理**: 充电桩、充电枪、站点信息 +- **商户管理**: 商户信息、分账配置、清算账单 + +--- + +## 入口与启动 + +本模块为业务模块,无独立启动入口,由 `jsowell-admin` 模块引用。 + +### 核心 Service + +| Service | 说明 | +|---------|------| +| `OrderBasicInfoServiceImpl` | 订单核心服务(创建、结算、分账) | +| `MemberBasicInfoServiceImpl` | 会员服务 | +| `MemberWalletInfoServiceImpl` | 钱包服务 | +| `MemberPointsInfoServiceImpl` | 积分服务 | +| `PileStationInfoServiceImpl` | 站点服务 | +| `PileBasicInfoServiceImpl` | 充电桩服务 | +| `PileConnectorInfoServiceImpl` | 充电枪服务 | +| `PileBillingTemplateServiceImpl` | 计费模板服务 | +| `WechatPayServiceImpl` | 微信支付服务 | +| `AdapayService` | 汇付支付服务 | + +--- + +## 对外接口 + +### RPC 服务 + +```java +// WccServiceImpl.java - Dubbo RPC 服务 +@DubboService +public class WccServiceImpl implements WccService { + // 提供给其他服务调用的接口 +} +``` + +### RabbitMQ 消费者 + +```java +// OrderRabbitListener.java +@RabbitListener(queues = RabbitConstants.ORDER_QUEUE) +public void handleOrderMessage(Message message) { + // 处理订单消息 +} +``` + +--- + +## 关键依赖与配置 + +### Maven 依赖 + +```xml + + + com.jsowell + jsowell-framework + + + com.baomidou + mybatis-plus-boot-starter + 3.4.0 + + + com.huifu.adapay + adapay-java-sdk + + + com.alipay.sdk + alipay-sdk-java + + +``` + +--- + +## 数据模型 + +### 核心实体 + +| 实体类 | 数据库表 | 说明 | +|--------|---------|------| +| `OrderBasicInfo` | `order_basic_info` | 充电订单 | +| `OrderPayRecord` | `order_pay_record` | 支付记录 | +| `OrderSplitRecord` | `order_split_record` | 分账记录 | +| `MemberBasicInfo` | `member_basic_info` | 会员信息 | +| `MemberWalletInfo` | `member_wallet_info` | 会员钱包 | +| `MemberPointsInfo` | `member_points_info` | 会员积分 | +| `PileStationInfo` | `pile_station_info` | 充电站 | +| `PileBasicInfo` | `pile_basic_info` | 充电桩 | +| `PileConnectorInfo` | `pile_connector_info` | 充电枪 | +| `PileBillingTemplate` | `pile_billing_template` | 计费模板 | +| `PileMerchantInfo` | `pile_merchant_info` | 商户信息 | +| `ClearingBillInfo` | `clearing_bill_info` | 清算账单 | + +### Mapper XML 文件 + +位置:`src/main/resources/mapper/pile/` + +主要文件: +- `OrderBasicInfoMapper.xml` (3620 行) +- `PileMerchantInfoMapper.xml` (1304 行) +- `PersonalChargingRecordMapper.xml` (1413 行) +- `OrderDetailMapper.xml` (1306 行) +- `OrderPileOccupyMapper.xml` (1043 行) + +--- + +## 测试与质量 + +### 单元测试 + +测试位于 `jsowell-admin/src/test/java/`,涉及本模块的测试: +- `OrderServiceWhitelistCompletionTest` +- `WhitelistOrderCompletionDefaultsTest` + +--- + +## 常见问题 (FAQ) + +### Q: 订单分账失败如何处理? +检查 `OrderBasicInfoServiceImpl.realTimeOrderSplit()` 方法,查看分账配置和汇付账户状态 + +### Q: 积分发放延迟? +积分通过 RabbitMQ 异步发放,检查 `PointsRabbitConfig` 配置和消息队列状态 + +### Q: 支付回调未收到? +检查支付平台回调地址配置,查看 `WxpayCallbackRecord` 或 `AdapayCallbackRecord` 表 + +--- + +## 相关文件清单 + +``` +jsowell-pile/ +├── src/main/java/com/jsowell/ +│ ├── adapay/ # 汇付支付 +│ │ ├── config/ # 支付配置 +│ │ ├── dto/ # 数据传输对象 +│ │ ├── service/ # 支付服务 +│ │ └── vo/ # 视图对象 +│ ├── alipay/ # 支付宝 +│ ├── wxpay/ # 微信支付 +│ ├── mq/ # RabbitMQ 消费者 +│ ├── pile/ +│ │ ├── domain/ # 实体类 +│ │ ├── dto/ # DTO +│ │ ├── mapper/ # Mapper 接口 +│ │ ├── service/ # Service 接口 +│ │ │ └── impl/ # Service 实现 +│ │ ├── vo/ # VO +│ │ ├── jcpp/ # JCPP 协议 +│ │ ├── rpc/ # RPC 服务 +│ │ └── transaction/ # 事务服务 +│ └── thirdparty/ # 第三方服务 +├── src/main/resources/ +│ └── mapper/pile/ # Mapper XML (60+ 文件) +└── src/main/proto/ # Protobuf 定义 +``` diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/BusinessFinancialServiceImpl.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/BusinessFinancialServiceImpl.java index 0f4e558c6..23e007588 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/BusinessFinancialServiceImpl.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/BusinessFinancialServiceImpl.java @@ -42,15 +42,20 @@ public class BusinessFinancialServiceImpl implements BusinessFinancialService { // 查询账户余额 BigDecimal acctBalance = BigDecimal.ZERO; + BigDecimal pendingAmount = BigDecimal.ZERO; try { AdapayAccountBalanceVO accountBalanceVO = adapayService.queryAdapayAccountBalance(dto.getMerchantId()); if (accountBalanceVO != null && accountBalanceVO.getAcctBalance() != null) { acctBalance = accountBalanceVO.getAcctBalance(); } + if (accountBalanceVO != null && accountBalanceVO.getPendingAmount() != null) { + pendingAmount = accountBalanceVO.getPendingAmount(); + } } catch (BaseAdaPayException e) { log.error("查询汇付账户余额异常 merchantId:{}", dto.getMerchantId(), e); } result.getMerchantOrderReport().setAcctBalance(acctBalance); + result.getMerchantOrderReport().setPendingAmount(pendingAmount); // 查询累计提现金额 BigDecimal totalWithdraw = BigDecimal.ZERO; diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java index 202ec196f..e02d765f6 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; +import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; @@ -68,7 +69,6 @@ import com.jsowell.pile.vo.uniapp.business.BusinessOrderListVO; import com.jsowell.pile.vo.uniapp.business.BusinessOrderQueryResultVO; import com.jsowell.pile.vo.uniapp.customer.*; import com.jsowell.pile.vo.web.*; -import com.jsowell.pile.vo.web.OrderStatisticsVO; import com.jsowell.wxpay.common.WeChatPayParameter; import com.jsowell.wxpay.response.WechatPayRefundRequest; import com.jsowell.wxpay.response.WechatPayRefundResponse; @@ -295,6 +295,9 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService { } dto.setStationDeptIds(authorizedMap.getStationDeptIds()); dto.setMerchantDeptIds(authorizedMap.getMerchantDeptIds()); + if (Objects.nonNull(SecurityUtils.getLoginUser())) { + dto.setParams(ImmutableMap.of("roleId", SecurityUtils.getLoginUser().getUserId())); + } return selectOrderBasicInfoList(dto); } diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/util/UserUtils.java b/jsowell-pile/src/main/java/com/jsowell/pile/util/UserUtils.java index d254a3d8f..31cf7a9d0 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/util/UserUtils.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/util/UserUtils.java @@ -107,6 +107,7 @@ public class UserUtils { if (Objects.isNull(loginUser)) { return resultVO; } + resultVO.setLoginUser(loginUser); // 获取登录用户对应的user对象 SysUser user = loginUser.getUser(); if (Objects.isNull(user)) { diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/vo/base/LoginUserDetailVO.java b/jsowell-pile/src/main/java/com/jsowell/pile/vo/base/LoginUserDetailVO.java index 0873bf8e3..902170d89 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/vo/base/LoginUserDetailVO.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/vo/base/LoginUserDetailVO.java @@ -1,5 +1,6 @@ package com.jsowell.pile.vo.base; +import com.jsowell.common.core.domain.model.LoginUser; import lombok.Getter; import lombok.Setter; @@ -11,6 +12,10 @@ import java.util.List; @Getter @Setter public class LoginUserDetailVO { + /** + * 登录用户 + */ + LoginUser loginUser; /** * 有权限的一级运营商idList * 平台级账号有多个一级运营商权限 diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/vo/web/OrderReportDetail.java b/jsowell-pile/src/main/java/com/jsowell/pile/vo/web/OrderReportDetail.java index 3d61fd276..8d10a1398 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/vo/web/OrderReportDetail.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/vo/web/OrderReportDetail.java @@ -52,4 +52,7 @@ public class OrderReportDetail { */ private BigDecimal totalWithdraw; + // 在途金额 + private BigDecimal pendingAmount; + } diff --git a/jsowell-pile/src/main/resources/mapper/pile/OrderBasicInfoMapper.xml b/jsowell-pile/src/main/resources/mapper/pile/OrderBasicInfoMapper.xml index cc1675c2b..4a0a2f552 100644 --- a/jsowell-pile/src/main/resources/mapper/pile/OrderBasicInfoMapper.xml +++ b/jsowell-pile/src/main/resources/mapper/pile/OrderBasicInfoMapper.xml @@ -2004,6 +2004,9 @@ and t1.vin_code = #{vinCode,jdbcType=VARCHAR} + + and t1.review_flag = '1' + and t1.plate_number = #{plateNumber,jdbcType=VARCHAR} @@ -2055,6 +2058,9 @@ and t1.create_time #{endTime,jdbcType=VARCHAR} + + and t1.review_flag = '1' + and t1.settlement_time = ]]> #{startSettleTime,jdbcType=VARCHAR} diff --git a/jsowell-quartz/CLAUDE.md b/jsowell-quartz/CLAUDE.md new file mode 100644 index 000000000..b3b86e8aa --- /dev/null +++ b/jsowell-quartz/CLAUDE.md @@ -0,0 +1,137 @@ +[根目录](../CLAUDE.md) > **jsowell-quartz** + +# jsowell-quartz 模块 + +定时任务模块,基于 Quartz 实现任务调度。 + +--- + +## 变更记录 (Changelog) + +### 2026-02-03 11:32:30 +- 初始化模块文档 +- 识别 19 个 Java 文件 + +--- + +## 模块职责 + +- **任务管理**: 定时任务 CRUD +- **任务调度**: Quartz 调度器配置 +- **任务执行**: 任务执行与日志记录 +- **业务任务**: 充电桩业务相关定时任务 + +--- + +## 入口与启动 + +本模块为功能模块,无独立启动入口。 + +--- + +## 对外接口 + +### Controller + +| Controller | 路径 | 说明 | +|------------|------|------| +| `SysJobController` | `/monitor/job/**` | 任务管理 | +| `SysJobLogController` | `/monitor/jobLog/**` | 任务日志 | + +### Service + +| Service | 说明 | +|---------|------| +| `ISysJobService` | 任务服务 | +| `ISysJobLogService` | 任务日志服务 | + +### 业务任务 + +```java +// JsowellTask.java +@Component("jsowellTask") +public class JsowellTask { + // 充电桩业务相关定时任务 +} + +// RyTask.java +@Component("ryTask") +public class RyTask { + // 示例任务 +} +``` + +--- + +## 关键依赖与配置 + +### Quartz 配置 + +```java +// ScheduleConfig.java +@Configuration +public class ScheduleConfig { + // Quartz 调度器配置 +} +``` + +--- + +## 数据模型 + +### 核心实体 + +| 实体类 | 数据库表 | 说明 | +|--------|---------|------| +| `SysJob` | `sys_job` | 定时任务 | +| `SysJobLog` | `sys_job_log` | 任务日志 | + +### Mapper XML 文件 + +位置:`src/main/resources/mapper/quartz/` + +- `SysJobMapper.xml` (111 行) +- `SysJobLogMapper.xml` (94 行) + +--- + +## 常见问题 (FAQ) + +### Q: 如何添加新的定时任务? +1. 创建任务类,使用 `@Component` 注解 +2. 在管理后台添加任务配置 +3. 调用目标字符串格式:`beanName.methodName(params)` + +### Q: 任务执行失败如何排查? +查看 `sys_job_log` 表的执行日志和异常信息 + +--- + +## 相关文件清单 + +``` +jsowell-quartz/ +├── src/main/java/com/jsowell/quartz/ +│ ├── config/ # Quartz 配置 +│ │ └── ScheduleConfig.java +│ ├── controller/ # 控制器 +│ │ ├── SysJobController.java +│ │ └── SysJobLogController.java +│ ├── domain/ # 实体类 +│ │ ├── SysJob.java +│ │ └── SysJobLog.java +│ ├── mapper/ # Mapper 接口 +│ ├── service/ # Service 接口 +│ │ └── impl/ # Service 实现 +│ ├── task/ # 业务任务 +│ │ ├── JsowellTask.java +│ │ └── RyTask.java +│ └── util/ # 工具类 +│ ├── AbstractQuartzJob.java +│ ├── CronUtils.java +│ ├── JobInvokeUtil.java +│ └── ScheduleUtils.java +├── src/main/resources/ +│ └── mapper/quartz/ # Mapper XML +└── pom.xml +``` diff --git a/jsowell-settlement/CLAUDE.md b/jsowell-settlement/CLAUDE.md new file mode 100644 index 000000000..5d1e5f170 --- /dev/null +++ b/jsowell-settlement/CLAUDE.md @@ -0,0 +1,61 @@ +[根目录](../CLAUDE.md) > **jsowell-settlement** + +# jsowell-settlement 模块 + +结算模块,处理商户结算相关业务(待完善)。 + +--- + +## 变更记录 (Changelog) + +### 2026-02-03 11:32:30 +- 初始化模块文档 +- 模块状态:待完善 + +--- + +## 模块职责 + +- **商户结算**: 商户账单结算 +- **清算处理**: 清算账单生成 + +--- + +## 入口与启动 + +本模块为业务模块,无独立启动入口。 + +--- + +## 关键依赖与配置 + +### Maven 依赖 + +```xml + + + com.jsowell + jsowell-pile + + +``` + +--- + +## 模块状态 + +当前模块处于待完善状态,主要业务逻辑在 `jsowell-pile` 模块中实现: +- `ClearingBillInfoServiceImpl` - 清算账单服务 +- `ClearingBillDetailServiceImpl` - 清算明细服务 +- `ClearingWithdrawInfoServiceImpl` - 提现服务 + +--- + +## 相关文件清单 + +``` +jsowell-settlement/ +├── src/main/resources/ +│ └── rebel.xml # JRebel 配置 +└── pom.xml +``` diff --git a/jsowell-system/CLAUDE.md b/jsowell-system/CLAUDE.md new file mode 100644 index 000000000..59ae46124 --- /dev/null +++ b/jsowell-system/CLAUDE.md @@ -0,0 +1,146 @@ +[根目录](../CLAUDE.md) > **jsowell-system** + +# jsowell-system 模块 + +系统管理模块,提供用户、角色、菜单、字典等基础管理功能。 + +--- + +## 变更记录 (Changelog) + +### 2026-02-03 11:32:30 +- 初始化模块文档 +- 识别 15 个 Mapper XML +- 统计 52 个 Java 文件 + +--- + +## 模块职责 + +- **用户管理**: 用户 CRUD、密码管理 +- **角色管理**: 角色 CRUD、权限分配 +- **菜单管理**: 菜单 CRUD、路由生成 +- **部门管理**: 组织架构管理 +- **字典管理**: 数据字典维护 +- **岗位管理**: 岗位信息管理 +- **日志管理**: 操作日志、登录日志 + +--- + +## 入口与启动 + +本模块为基础模块,无独立启动入口。 + +--- + +## 对外接口 + +### Service 接口 + +| Service | 说明 | +|---------|------| +| `SysUserService` | 用户服务 | +| `SysRoleService` | 角色服务 | +| `SysMenuService` | 菜单服务 | +| `SysDeptService` | 部门服务 | +| `SysDictTypeService` | 字典类型服务 | +| `SysDictDataService` | 字典数据服务 | +| `SysPostService` | 岗位服务 | +| `SysConfigService` | 系统配置服务 | +| `SysOperLogService` | 操作日志服务 | +| `SysLogininforService` | 登录日志服务 | + +--- + +## 关键依赖与配置 + +### Maven 依赖 + +```xml + + + com.jsowell + jsowell-common + + +``` + +--- + +## 数据模型 + +### 核心实体 + +| 实体类 | 数据库表 | 说明 | +|--------|---------|------| +| `SysUser` | `sys_user` | 用户信息 | +| `SysRole` | `sys_role` | 角色信息 | +| `SysMenu` | `sys_menu` | 菜单信息 | +| `SysDept` | `sys_dept` | 部门信息 | +| `SysDictType` | `sys_dict_type` | 字典类型 | +| `SysDictData` | `sys_dict_data` | 字典数据 | +| `SysPost` | `sys_post` | 岗位信息 | +| `SysConfig` | `sys_config` | 系统配置 | +| `SysOperLog` | `sys_oper_log` | 操作日志 | +| `SysLogininfor` | `sys_logininfor` | 登录日志 | + +### 关联表 + +| 实体类 | 数据库表 | 说明 | +|--------|---------|------| +| `SysUserRole` | `sys_user_role` | 用户角色关联 | +| `SysRoleMenu` | `sys_role_menu` | 角色菜单关联 | +| `SysRoleDept` | `sys_role_dept` | 角色部门关联 | +| `SysUserPost` | `sys_user_post` | 用户岗位关联 | + +### Mapper XML 文件 + +位置:`src/main/resources/mapper/system/` + +- `SysUserMapper.xml` (228 行) +- `SysMenuMapper.xml` (195 行) +- `SysDeptMapper.xml` (163 行) +- `SysRoleMapper.xml` (152 行) +- `SysDictDataMapper.xml` (124 行) +- `SysPostMapper.xml` (122 行) +- `SysConfigMapper.xml` (112 行) +- `SysDictTypeMapper.xml` (105 行) + +--- + +## 常见问题 (FAQ) + +### Q: 如何添加新的系统配置? +在 `sys_config` 表中添加记录,通过 `SysConfigService.selectConfigByKey()` 获取 + +### Q: 如何添加新的字典? +1. 在 `sys_dict_type` 添加字典类型 +2. 在 `sys_dict_data` 添加字典数据 + +--- + +## 相关文件清单 + +``` +jsowell-system/ +├── src/main/java/com/jsowell/system/ +│ ├── domain/ # 实体类 +│ │ ├── SysCache.java +│ │ ├── SysConfig.java +│ │ ├── SysLogininfor.java +│ │ ├── SysNotice.java +│ │ ├── SysOperLog.java +│ │ ├── SysPost.java +│ │ ├── SysRoleDept.java +│ │ ├── SysRoleMenu.java +│ │ ├── SysUserOnline.java +│ │ ├── SysUserPost.java +│ │ └── SysUserRole.java +│ ├── mapper/ # Mapper 接口 +│ ├── service/ # Service 接口 +│ │ └── impl/ # Service 实现 +│ └── vo/ # 视图对象 +├── src/main/resources/ +│ └── mapper/system/ # Mapper XML (15 文件) +└── pom.xml +``` diff --git a/jsowell-thirdparty/CLAUDE.md b/jsowell-thirdparty/CLAUDE.md new file mode 100644 index 000000000..9c9057cf5 --- /dev/null +++ b/jsowell-thirdparty/CLAUDE.md @@ -0,0 +1,135 @@ +[根目录](../CLAUDE.md) > **jsowell-thirdparty** + +# jsowell-thirdparty 模块 + +第三方平台对接模块,负责与外部系统的集成。 + +--- + +## 变更记录 (Changelog) + +### 2026-02-03 11:32:30 +- 初始化模块文档 +- 识别 20+ 第三方平台对接 + +--- + +## 模块职责 + +- **政府平台对接**: 中电联、南瑞、各省市监管平台 +- **地图服务**: 高德地图站点推送 +- **停车场系统**: 停车场优惠券、车牌识别 +- **支付通知**: 第三方平台订单通知 +- **数据同步**: 站点、设备、订单数据同步 + +--- + +## 入口与启动 + +本模块为业务模块,无独立启动入口。 + +--- + +## 对外接口 + +### 第三方平台服务 + +| 服务 | 说明 | +|------|------| +| `ZDLService` | 中电联平台对接 | +| `NRService` | 南瑞平台对接 | +| `AMapService` | 高德地图服务 | +| `LianLianService` | 联联平台 | +| `HuaWeiService` | 华为平台 | +| `NXJTService` | 宁夏交投平台 | +| `LTYTService` | 停车场服务 | +| `RJService` | 停车场服务 | +| `QcyunsService` | 停车场服务 | + +### 平台工厂 + +```java +// ThirdPartyPlatformFactory.java +public class ThirdPartyPlatformFactory { + // 根据平台类型获取对应的服务实现 +} +``` + +--- + +## 关键依赖与配置 + +### Maven 依赖 + +```xml + + + com.jsowell + jsowell-pile + + +``` + +--- + +## 数据模型 + +### 平台通用数据结构 + +| 类 | 说明 | +|-----|------| +| `StationInfo` | 站点信息 | +| `ConnectorStatusInfo` | 充电枪状态 | +| `ChargeOrderInfo` | 充电订单 | +| `AlarmInfo` | 告警信息 | + +### 高德地图数据 + +| 类 | 说明 | +|-----|------| +| `AMapStationInfo` | 高德站点信息 | +| `AMapEquipmentInfo` | 高德设备信息 | +| `AMapConnectorInfo` | 高德充电枪信息 | +| `AMapPriceChargingInfo` | 高德计费信息 | + +--- + +## 常见问题 (FAQ) + +### Q: 第三方平台数据同步失败? +1. 检查平台配置(`ThirdPartyPlatformConfig`) +2. 检查密钥配置(`ThirdpartySecretInfo`) +3. 查看同步日志 + +### Q: 高德地图站点不显示? +1. 检查站点是否已推送 +2. 检查站点状态是否正常 +3. 查看 `AMapService` 调用日志 + +--- + +## 相关文件清单 + +``` +jsowell-thirdparty/ +├── src/main/java/com/jsowell/thirdparty/ +│ ├── amap/ # 高德地图 +│ │ ├── domain/ +│ │ ├── service/ +│ │ └── util/ +│ ├── camera/ # 摄像头 +│ ├── common/ # 通用服务 +│ ├── huawei/ # 华为平台 +│ ├── lianlian/ # 联联平台 +│ ├── nanrui/ # 南瑞平台 +│ ├── ningxiajiaotou/ # 宁夏交投 +│ ├── parking/ # 停车场 +│ ├── platform/ # 平台通用 +│ │ ├── common/ +│ │ ├── domain/ +│ │ ├── factory/ +│ │ └── service/ +│ ├── yongchengboche/ # 永城泊车 +│ └── zhongdianlian/ # 中电联 +└── pom.xml +```