能源科技充电桩业务管理系统

技术方案设计文档 v1.1 2026-03-21 状态:待开发

1系统架构

1.1 整体架构图

Spring Cloud 微服务架构

flowchart TB
    subgraph Client["客户端层"]
        MiniApp["微信小程序
(用户端)"] WebAdmin["管理后台 Web
(运营管理)"] OCPP["外部平台
(OCPP设备通信)"] end subgraph Gateway["网关层 / Nginx"] Nginx["SSL卸载
负载均衡
路由分发"] end subgraph MicroServices["Spring Cloud 微服务"] subgraph Core["核心业务服务"] User["用户服务
User"] Order["订单服务
Order"] Device["设备服务
Device"] Settlement["结算服务
Settle"] end subgraph Support["支撑服务"] Operation["运营服务
Operation"] System["系统服务
System"] Task["定时任务
Task"] end Gateway_Svc["网关服务
Gateway"] end subgraph Infrastructure["基础设施层"] Nacos["Nacos
服务注册/配置中心"] RocketMQ["RocketMQ
消息队列"] MySQL["MySQL 8.0
主数据库"] Redis["Redis 7.x
缓存"] MinIO["MinIO/OSS
文件存储"] end MiniApp -->|HTTPS/REST| Nginx WebAdmin -->|HTTPS/REST| Nginx OCPP -->|WebSocket/HTTP| Nginx Nginx --> Gateway_Svc Gateway_Svc --> User Gateway_Svc --> Order Gateway_Svc --> Device Gateway_Svc --> Settlement Gateway_Svc --> Operation Gateway_Svc --> System User --> Nacos Order --> Nacos Device --> Nacos Settlement --> Nacos Operation --> Nacos System --> Nacos Order --> RocketMQ Device --> RocketMQ User --> MySQL Order --> MySQL Device --> MySQL Settlement --> MySQL Operation --> MySQL User --> Redis Order --> Redis Device --> Redis Settlement --> Redis Operation --> MinIO System --> MinIO style Client fill:#e0f2fe,stroke:#0077b6,stroke-width:2px style Gateway fill:#fef3c7,stroke:#f59e0b,stroke-width:2px style MicroServices fill:#dcfce7,stroke:#16a34a,stroke-width:2px style Infrastructure fill:#f3e8ff,stroke:#9333ea,stroke-width:2px style Core fill:#fff,stroke:#0077b6,stroke-width:1px style Support fill:#fff,stroke:#0077b6,stroke-width:1px

1.2 技术栈选型

层级技术选型说明
小程序原生开发 + Vant Weapp微信生态,成熟稳定
管理后台前端Vue 3 + Element Plus响应式,生态完善
后端框架Spring Boot 2.7 / Spring Cloud 2022主流微服务框架
服务注册Nacos 2.x配置中心 + 注册中心一体化
网关Spring Cloud Gateway统一入口,路由 + 鉴权
数据库MySQL 8.0主业务数据存储
缓存Redis 7.x会话、热点数据、分布式锁
消息队列RocketMQ 5.x设备事件异步处理
文件存储MinIO / 阿里OSS发票、合同等文件
日志ELK Stack (可选)日志采集与分析
监控Prometheus + Grafana指标监控

1.3 项目模块划分

微服务模块依赖关系

flowchart LR
    subgraph Base["基础设施层"]
        Common["energy-common
公共模块"] Gateway["energy-gateway
网关服务"] end subgraph Domain["业务域服务"] User["energy-user
用户服务"] Device["energy-device
设备服务"] Order["energy-order
订单服务"] Settlement["energy-settlement
结算服务"] end subgraph Support["支撑服务"] Operation["energy-operation
运营服务"] System["energy-system
系统服务"] Task["energy-task
定时任务"] end Gateway --> Common User --> Common Device --> Common Order --> Common Settlement --> Common Operation --> Common System --> Common Task --> Common User --> Gateway Device --> Gateway Order --> Gateway Settlement --> Gateway Operation --> Gateway System --> Gateway Task --> Gateway Order --> User Order --> Device Settlement --> Order Settlement --> User Settlement --> Device Operation --> User Operation --> Device Operation --> Order Task --> Order Task --> Settlement style Base fill:#fef3c7,stroke:#f59e0b,stroke-width:2px style Domain fill:#dcfce7,stroke:#16a34a,stroke-width:2px style Support fill:#e0f2fe,stroke:#0077b6,stroke-width:2px
energy-charging 项目根目录
energy-common 公共模块(工具类、常量、异常、DTO基类)
├── config/ # 全局配置
├── exception/ # 统一异常处理
├── util/ # 工具类
├── dto/ # 数据传输对象
└── constant/ # 常量定义
energy-gateway 网关服务(路由、鉴权、限流)
├── filter/ # 过滤器(认证、限流)
├── route/ # 路由配置
└── config/ # 网关配置
energy-user 用户服务(端口:8081 | 数据库:user_db)
├── controller/ # 用户接口
├── service/ # 用户、企业、员工
├── mapper/ # MyBatis映射
└── entity/ # 用户/企业/员工实体
energy-device 设备服务(端口:8082 | 数据库:device_db)
├── controller/ # 设备接口
├── service/ # 区域、站点、桩、枪
├── mapper/ # MyBatis映射
└── entity/ # 设备相关实体
energy-order 订单服务(端口:8083 | 数据库:order_db)
├── controller/ # 订单接口
├── service/ # 订单、计费、支付
├── pricing/ # 计费引擎
├── mapper/ # MyBatis映射
└── entity/ # 订单/计费规则实体
energy-settlement 结算服务(端口:8084 | 数据库:settlement_db)
├── controller/ # 结算接口
├── service/ # 分账、结算单、对账
├── mapper/ # MyBatis映射
└── entity/ # 分账/结算实体
energy-operation 运营服务(端口:8085 | 数据库:operation_db)
├── controller/ # 运营接口
├── service/ # 工单、报表、消息
├── mapper/ # MyBatis映射
└── entity/ # 工单/报表实体
energy-system 系统服务(端口:8086 | 数据库:system_db)
├── controller/ # 系统接口
├── service/ # 权限、角色、菜单
├── security/ # 安全认证
├── mapper/ # MyBatis映射
└── entity/ # 权限实体
energy-task 定时任务服务(端口:8087)
├── job/ # 定时任务
│ ├── DailySettlementJob # 日结算任务
│ ├── ReportGenerateJob # 报表生成任务
│ └── DeviceSyncJob # 设备同步任务
└── config/ # 任务调度配置
模块端口主要职责数据库
energy-gateway8080统一入口,路由、鉴权、限流-
energy-user8081用户注册登录、企业账户、员工绑定user_db
energy-device8082区域、站点、充电桩、充电枪管理device_db
energy-order8083充电订单、实时计费、支付order_db
energy-settlement8084分账规则、结算单、对账核销settlement_db
energy-operation8085运维工单、运营报表、消息通知operation_db
energy-system8086权限管理、角色配置、操作日志system_db
energy-task8087日结算、数据报表、定时任务-

2数据库设计

2.1 ER 关系总览

设备域实体关系

erDiagram
    REGION ||--o{ SITE : "管辖"
    SITE ||--o{ STATION : "包含"
    STATION ||--o{ GUN : "拥有"
    GUN }o--o| PRICING_RULE : "应用"
    SITE ||--o| AGENT : "归属"
    
    REGION {
        bigint id PK
        varchar code UK
        varchar name
        bigint parent_id
        bigint agent_id
        tinyint status
    }
    
    SITE {
        bigint id PK
        varchar code UK
        varchar name
        bigint region_id FK
        bigint agent_id FK
        varchar address
        decimal latitude
        decimal longitude
        tinyint status
    }
    
    STATION {
        bigint id PK
        varchar code UK
        bigint site_id FK
        varchar manufacturer
        varchar model
        decimal power_rate
        int gun_count
        tinyint status
    }
    
    GUN {
        bigint id PK
        bigint station_id FK
        varchar gun_no
        tinyint status
        decimal current_power
        bigint pricing_rule_id FK
    }
    
    PRICING_RULE {
        bigint id PK
        varchar name
        varchar rule_type
        varchar scope_type
        bigint scope_id
        tinyint status
    }
    
    AGENT {
        bigint id PK
        varchar name
        varchar level
        bigint parent_id
        decimal balance
        tinyint status
    }
          

用户域实体关系

erDiagram
    USER ||--o| COMPANY : "绑定"
    USER ||--o{ EMPLOYEE : "关联"
    COMPANY ||--o{ EMPLOYEE : "拥有"
    
    USER {
        bigint id PK
        varchar openid UK
        varchar unionid
        varchar nickname
        varchar phone
        bigint company_id FK
        tinyint status
    }
    
    COMPANY {
        bigint id PK
        varchar name
        varchar credit_code
        decimal balance
        decimal credit_limit
        tinyint status
    }
    
    EMPLOYEE {
        bigint id PK
        bigint user_id FK
        bigint company_id FK
        varchar employee_no
        varchar department
        tinyint status
    }
          

订单与结算域实体关系

erDiagram
    USER ||--o{ CHARGING_ORDER : "下单"
    GUN ||--o{ CHARGING_ORDER : "使用"
    CHARGING_ORDER ||--o| INVOICE : "开具"
    CHARGING_ORDER ||--o{ ORDER_SPLIT : "分账"
    ORDER_SPLIT ||--o| STATEMENT : "汇总"
    AGENT ||--o{ STATEMENT : "关联"
    
    CHARGING_ORDER {
        bigint id PK
        varchar order_no UK
        bigint user_id FK
        bigint company_id FK
        bigint gun_id FK
        datetime start_time
        datetime end_time
        int total_seconds
        decimal charged_kwh
        decimal electricity_fee
        decimal service_fee
        decimal total_amount
        varchar status
        varchar pay_status
        varchar split_status
    }
    
    ORDER_SPLIT {
        bigint id PK
        bigint order_id FK
        varchar split_type
        bigint target_id
        decimal split_ratio
        decimal split_amount
        tinyint status
    }
    
    STATEMENT {
        bigint id PK
        varchar statement_no UK
        bigint agent_id FK
        date settle_date
        decimal total_amount
        decimal order_count
        varchar status
        datetime audit_time
    }
    
    INVOICE {
        bigint id PK
        varchar invoice_no UK
        bigint order_id FK
        bigint user_id FK
        decimal amount
        varchar status
    }
          

运维工单实体关系

erDiagram
    WORK_ORDER ||--|| USER : "报修人"
    WORK_ORDER ||--o| STATION : "关联设备"
    WORK_ORDER ||--o| USER : "处理人"
    
    WORK_ORDER {
        bigint id PK
        varchar order_no UK
        bigint reporter_id FK
        bigint station_id FK
        bigint handler_id FK
        varchar type
        varchar priority
        varchar description
        varchar status
        datetime handle_time
        varchar result
    }
    
    USER ||--o{ MESSAGE : "接收"
    
    MESSAGE {
        bigint id PK
        bigint user_id FK
        varchar type
        varchar title
        varchar content
        tinyint is_read
        datetime create_time
    }
          

2.2 核心数据表

2.2.1 区域表 (region)

字段名
类型
约束
说明
id
BIGINT
PK, AUTO
主键
code
VARCHAR(32)
NOT NULL, UNIQUE
区域编码
name
VARCHAR(64)
NOT NULL
区域名称
parent_id
BIGINT
DEFAULT 0
父区域ID(树形结构)
agent_id
BIGINT
FK
归属代理商ID
status
TINYINT
DEFAULT 1
状态:0禁用 1启用
created_at
DATETIME
创建时间
updated_at
DATETIME
更新时间
-- 区域表
CREATE TABLE region (
    id              BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键',
    code            VARCHAR(32) NOT NULL UNIQUE COMMENT '区域编码',
    name            VARCHAR(64) NOT NULL COMMENT '区域名称',
    parent_id       BIGINT DEFAULT 0 COMMENT '父区域ID(树形结构)',
    agent_id        BIGINT COMMENT '归属代理商ID',
    status          TINYINT DEFAULT 1 COMMENT '状态:0禁用 1启用',
    created_at      DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    updated_at      DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='区域表';

2.2.2 站点表 (site)

字段名
类型
约束
说明
id
BIGINT
PK, AUTO
主键
code
VARCHAR(32)
NOT NULL, UNIQUE
站点编码
name
VARCHAR(128)
NOT NULL
站点名称
region_id
BIGINT
NOT NULL, FK
所属区域
agent_id
BIGINT
FK
归属代理商
address
VARCHAR(256)
详细地址
latitude
DECIMAL(10,6)
纬度
longitude
DECIMAL(10,6)
经度
status
TINYINT
DEFAULT 1
状态:0关闭 1营业
-- 站点表
CREATE TABLE site (
    id              BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键',
    code            VARCHAR(32) NOT NULL UNIQUE COMMENT '站点编码',
    name            VARCHAR(128) NOT NULL COMMENT '站点名称',
    region_id       BIGINT NOT NULL COMMENT '所属区域',
    agent_id        BIGINT COMMENT '归属代理商ID',
    address         VARCHAR(256) COMMENT '详细地址',
    latitude        DECIMAL(10, 6) COMMENT '纬度',
    longitude       DECIMAL(10, 6) COMMENT '经度',
    status          TINYINT DEFAULT 1 COMMENT '状态:0关闭 1营业',
    created_at      DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    updated_at      DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    INDEX idx_region_id (region_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='站点表';

2.2.3 充电桩表 (station)

字段名
类型
约束
说明
id
BIGINT
PK, AUTO
主键
code
VARCHAR(64)
NOT NULL, UNIQUE
设备编码/桩号
site_id
BIGINT
NOT NULL, FK
所属站点
manufacturer
VARCHAR(64)
设备厂商
model
VARCHAR(64)
设备型号
power_rate
DECIMAL(6,2)
额定功率(kW)
gun_count
INT
DEFAULT 2
枪数量
status
TINYINT
DEFAULT 1
状态:0离线 1空闲 2充电 3故障
-- 充电桩表
CREATE TABLE station (
    id              BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键',
    code            VARCHAR(64) NOT NULL UNIQUE COMMENT '设备编码/桩号',
    site_id         BIGINT NOT NULL COMMENT '所属站点',
    manufacturer    VARCHAR(64) COMMENT '设备厂商',
    model           VARCHAR(64) COMMENT '设备型号',
    power_rate      DECIMAL(6, 2) COMMENT '额定功率(kW)',
    gun_count       INT DEFAULT 2 COMMENT '枪数量',
    status          TINYINT DEFAULT 1 COMMENT '状态:0离线 1空闲 2充电 3故障',
    created_at      DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    updated_at      DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    INDEX idx_site_id (site_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='充电桩表';

2.2.4 充电枪表 (gun)

字段名
类型
约束
说明
id
BIGINT
PK, AUTO
主键
station_id
BIGINT
NOT NULL, FK
所属充电桩
gun_no
VARCHAR(8)
NOT NULL
枪口号:A/B/C
status
TINYINT
DEFAULT 1
状态:0离线 1空闲 2充电 3故障
current_power
DECIMAL(6,2)
DEFAULT 0
当前功率(kW)
pricing_rule_id
BIGINT
FK
关联计费规则
uk_station_gun
UNIQUE(station_id, gun_no)
唯一索引
-- 充电枪表
CREATE TABLE gun (
    id              BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键',
    station_id      BIGINT NOT NULL COMMENT '所属充电桩',
    gun_no          VARCHAR(8) NOT NULL COMMENT '枪口号:A/B/C',
    status          TINYINT DEFAULT 1 COMMENT '状态:0离线 1空闲 2充电 3故障',
    current_power   DECIMAL(6, 2) DEFAULT 0 COMMENT '当前功率(kW)',
    pricing_rule_id BIGINT COMMENT '关联计费规则ID',
    created_at      DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    updated_at      DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    UNIQUE KEY uk_station_gun (station_id, gun_no)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='充电枪表';

2.2.5 用户表 (user)

字段名
类型
约束
说明
id
BIGINT
PK, AUTO
主键
openid
VARCHAR(64)
NOT NULL, UNIQUE
微信openid
unionid
VARCHAR(64)
微信unionid
nickname
VARCHAR(64)
昵称
phone
VARCHAR(20)
手机号
company_id
BIGINT
FK
绑定企业ID
status
TINYINT
DEFAULT 1
状态:0禁用 1正常
-- 用户表(小程序用户)
CREATE TABLE user (
    id              BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键',
    openid          VARCHAR(64) NOT NULL UNIQUE COMMENT '微信openid',
    unionid         VARCHAR(64) COMMENT '微信unionid',
    nickname        VARCHAR(64) COMMENT '昵称',
    phone           VARCHAR(20) COMMENT '手机号',
    company_id      BIGINT COMMENT '绑定企业ID',
    status          TINYINT DEFAULT 1 COMMENT '状态:0禁用 1正常',
    created_at      DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    updated_at      DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';

2.2.6 企业账户表 (company)

字段名
类型
约束
说明
id
BIGINT
PK, AUTO
主键
name
VARCHAR(128)
NOT NULL
企业名称
credit_code
VARCHAR(32)
统一社会信用代码
balance
DECIMAL(12,2)
DEFAULT 0
账户余额
credit_limit
DECIMAL(12,2)
DEFAULT 0
透支额度
status
TINYINT
DEFAULT 1
状态:0禁用 1启用
-- 企业账户表
CREATE TABLE company (
    id              BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键',
    name            VARCHAR(128) NOT NULL COMMENT '企业名称',
    credit_code     VARCHAR(32) COMMENT '统一社会信用代码',
    balance         DECIMAL(12, 2) DEFAULT 0 COMMENT '账户余额',
    credit_limit    DECIMAL(12, 2) DEFAULT 0 COMMENT '透支额度',
    status          TINYINT DEFAULT 1 COMMENT '状态:0禁用 1启用',
    created_at      DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    updated_at      DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='企业账户表';

2.2.7 员工绑定表 (employee)

字段名
类型
约束
说明
id
BIGINT
PK, AUTO
主键
user_id
BIGINT
NOT NULL, FK
用户ID
company_id
BIGINT
NOT NULL, FK
企业ID
employee_no
VARCHAR(32)
员工工号
department
VARCHAR(64)
部门
status
TINYINT
DEFAULT 1
状态:0解绑 1绑定
uk_user_company
UNIQUE(user_id, company_id)
唯一索引
-- 员工绑定表
CREATE TABLE employee (
    id              BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键',
    user_id         BIGINT NOT NULL COMMENT '用户ID',
    company_id      BIGINT NOT NULL COMMENT '企业ID',
    employee_no     VARCHAR(32) COMMENT '员工工号',
    department     VARCHAR(64) COMMENT '部门',
    status          TINYINT DEFAULT 1 COMMENT '状态:0解绑 1绑定',
    created_at      DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    UNIQUE KEY uk_user_company (user_id, company_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='员工绑定表';

2.2.8 充电订单表 (charging_order)

字段名
类型
约束
说明
id
BIGINT
PK, AUTO
主键
order_no
VARCHAR(32)
NOT NULL, UNIQUE
订单号
user_id
BIGINT
NOT NULL, FK
用户ID
company_id
BIGINT
FK
企业ID(可空)
gun_id
BIGINT
NOT NULL, FK
充电枪ID
start_time
DATETIME
开始充电时间
end_time
DATETIME
结束时间
total_seconds
INT
DEFAULT 0
充电时长(秒)
charged_kwh
DECIMAL(10,3)
DEFAULT 0
充电电量(kWh)
electricity_fee
DECIMAL(10,2)
DEFAULT 0
电费
service_fee
DECIMAL(10,2)
DEFAULT 0
服务费
total_amount
DECIMAL(10,2)
DEFAULT 0
订单总金额
status
VARCHAR(16)
NOT NULL
订单状态
pay_status
VARCHAR(16)
DEFAULT 'UNPAID'
支付状态
split_status
VARCHAR(16)
DEFAULT 'UNSPLIT'
分账状态
idx_user_id
INDEX
用户ID索引
idx_gun_id
INDEX
充电枪ID索引
-- 充电订单表
CREATE TABLE charging_order (
    id              BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键',
    order_no        VARCHAR(32) NOT NULL UNIQUE COMMENT '订单号',
    user_id         BIGINT NOT NULL COMMENT '用户ID',
    company_id      BIGINT COMMENT '企业ID(可空)',
    gun_id          BIGINT NOT NULL COMMENT '充电枪ID',
    start_time      DATETIME COMMENT '开始充电时间',
    end_time        DATETIME COMMENT '结束时间',
    total_seconds   INT DEFAULT 0 COMMENT '充电时长(秒)',
    charged_kwh     DECIMAL(10, 3) DEFAULT 0 COMMENT '充电电量(kWh)',
    electricity_fee DECIMAL(10, 2) DEFAULT 0 COMMENT '电费',
    service_fee     DECIMAL(10, 2) DEFAULT 0 COMMENT '服务费',
    total_amount    DECIMAL(10, 2) DEFAULT 0 COMMENT '订单总金额',
    status          VARCHAR(16) NOT NULL COMMENT '订单状态',
    pay_status      VARCHAR(16) DEFAULT 'UNPAID' COMMENT '支付状态',
    split_status    VARCHAR(16) DEFAULT 'UNSPLIT' COMMENT '分账状态',
    created_at      DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    INDEX idx_user_id (user_id),
    INDEX idx_gun_id (gun_id),
    INDEX idx_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='充电订单表';

2.2.9 计费规则表 (pricing_rule)

字段名
类型
约束
说明
id
BIGINT
PK, AUTO
主键
name
VARCHAR(64)
NOT NULL
规则名称
rule_type
VARCHAR(16)
NOT NULL
规则类型:TIME时段/BASIC基础
scope_type
VARCHAR(16)
NOT NULL
适用范围:GLOBAL/REGION/SITE
scope_id
BIGINT
关联范围ID
status
TINYINT
DEFAULT 1
状态:0禁用 1启用
-- 计费规则表
CREATE TABLE pricing_rule (
    id              BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键',
    name            VARCHAR(64) NOT NULL COMMENT '规则名称',
    rule_type       VARCHAR(16) NOT NULL COMMENT '规则类型:TIME时段/BASIC基础',
    scope_type      VARCHAR(16) NOT NULL COMMENT '适用范围:GLOBAL/REGION/SITE',
    scope_id        BIGINT COMMENT '关联范围ID',
    status          TINYINT DEFAULT 1 COMMENT '状态:0禁用 1启用',
    created_at      DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='计费规则表';

3API 接口设计

3.1 接口规范

项目说明
基础路径https://api.energy-charging.com
协议HTTPS
数据格式JSON
字符编码UTF-8

请求头

Content-Type: application/json Authorization: Bearer {token} X-Request-Id: {uuid} X-Timestamp: {unix_timestamp} X-Nonce: {random_string}

统一响应格式

{ "code": 0, // 0=成功,非0=失败 "message": "success", "data": { }, // 数据体 "timestamp": 1677654321 }

3.2 小程序接口

模块接口方法说明
认证/api/mini/auth/loginPOST微信code登录
认证/api/mini/auth/phonePOST绑定手机号
站点/api/mini/site/listGET附近站点列表
站点/api/mini/site/detail/{id}GET站点详情
充电/api/mini/charge/qrcodePOST解析充电桩二维码
充电/api/mini/charge/startPOST启动充电
充电/api/mini/charge/stopPOST停止充电
充电/api/mini/charge/status/{orderId}GET充电状态(轮询)
订单/api/mini/order/listGET订单列表
订单/api/mini/order/detail/{id}GET订单详情
发票/api/mini/invoice/applyPOST申请发票

3.3 管理后台接口

模块接口方法说明
登录/api/admin/auth/loginPOST后台登录
登录/api/admin/auth/sms/sendPOST发送短信验证码
仪表盘/api/admin/dashboard/statsGET运营统计数据
设备/api/admin/device/region/*CRUD区域管理
设备/api/admin/device/site/*CRUD站点管理
设备/api/admin/device/station/*CRUD充电桩管理
设备/api/admin/device/gun/*CRUD充电枪管理
用户/api/admin/user/personal/*CRUD个人用户管理
用户/api/admin/user/company/*CRUD企业用户管理
订单/api/admin/order/listGET订单列表
计费/api/admin/pricing/rule/*CRUD计费规则
结算/api/admin/settlement/statement/*CRUD结算单
工单/api/admin/workorder/*CRUD运维工单
报表/api/admin/report/*GET运营/财务报表
系统/api/admin/system/role/*CRUD角色管理
系统/api/admin/system/admin/*CRUD管理员账号
系统/api/admin/system/logGET操作日志

3.4 关键接口详细设计

启动充电接口

POST /api/mini/charge/start Content-Type: application/json Authorization: Bearer {token} { "gunId": 12345, "pricingRuleId": null }
{ "code": 0, "message": "success", "data": { "orderId": 987654321, "orderNo": "CH2026032120000001", "status": "CHARGING", "startTime": "2026-03-21 20:00:00", "currentKwh": 0.0, "currentFee": 0.0 } }

充电状态轮询接口

GET /api/mini/charge/status/{orderId} Authorization: Bearer {token}
{ "code": 0, "data": { "orderId": 987654321, "status": "CHARGING", "elapsedSeconds": 1800, "currentKwh": 45.5, "currentFee": 28.50, "currentPower": 15.2, "currentVoltage": 380, "currentAmpere": 40 } }

4核心业务流程

4.1 充电全流程

用户端充电完整流程

flowchart TD
    subgraph 用户操作["用户端"]
        A[用户扫码] --> B[解析二维码获取枪ID]
    end

    subgraph 系统检查["系统检查"]
        B --> C{设备状态?}
        C -->|忙| D[返回设备忙]
        C -->|空闲| E{账户余额?}
        E -->|不足| F[返回余额不足]
        E -->|充足| G[创建订单WAITING]
    end

    subgraph 设备交互["设备交互"]
        G --> H[通知设备启动]
        H --> I{启动成功?}
        I -->|失败| J[订单EXCEPTION]
        I -->|成功| K[订单CHARGING]
        K --> L[启动实时会话]
        L --> M[设备定时上报状态]
        M --> N{心跳超时?}
        N -->|2分钟| O[更新设备离线]
        N -->|正常| P{停止充电?}
        P -->|用户主动| Q[停止充电]
        P -->|设备上报| Q
        Q --> R[停止充电计算费用]
        R --> S[订单FINISHED]
    end

    subgraph 支付分账["支付与分账"]
        S --> T{发起微信支付}
        T -->|成功| U[更新PAID → 分账]
        T -->|失败| V[标记欠费催款]
    end

    U --> W[订单完成]
    J --> X[异常处理]

    style A fill:#0077b6,color:#fff
    style W fill:#166534,color:#fff
    style D fill:#dc2626,color:#fff
    style F fill:#dc2626,color:#fff
    style X fill:#f59e0b,color:#fff
          

4.2 分账流程

订单分账处理流程

flowchart LR
    subgraph 触发["分账触发"]
        A[订单支付完成
T+0 或 T+1] end subgraph 计算["分账计算"] B[查询站点分账规则] --> C[计算分账金额] C --> D[平台分成
订单金额 × 平台比例] C --> E[代理分成
订单金额 × 代理比例] C --> F[场地分成
订单金额 × 场地比例] end subgraph 记录["分账记录"] D --> G[记录分账流水] E --> G F --> G G --> H[更新订单状态
SPLITTED] end A --> B style A fill:#0077b6,color:#fff style H fill:#166534,color:#fff

4.3 日结算流程

每日定时结算流程

flowchart TD
    subgraph 定时任务["定时任务 - 每日凌晨 02:00"]
        A[T+1结算任务启动]
    end

    subgraph 数据汇总["数据汇总"]
        A --> B[查询昨日所有已支付订单]
        B --> C[按站点分组汇总]
        C --> D[按分账方分组]
    end

    subgraph 生成结算单["结算单生成"]
        D --> E[生成代理结算单]
        D --> F[生成场地结算单]
        E --> G[状态: PENDING待审核]
        F --> G
    end

    subgraph 审核["人工审核"]
        G --> H{审核通过?}
        H -->|通过| I[状态: APPROVED]
        H -->|驳回| J[填写驳回原因]
        J --> K[返回重新核对]
        K --> B
    end

    subgraph 打款["线下打款"]
        I --> L[运营人员线下打款]
        L --> M[登记打款信息]
        M --> N[状态: PAID]
    end

    subgraph 通知["通知相关方"]
        G --> O[发送结算单给代理/场地确认]
        N --> P[发送结算完成通知]
    end

    style A fill:#0077b6,color:#fff
    style N fill:#166534,color:#fff
    style J fill:#f59e0b,color:#fff
          

4.4 计费流程

分时段计费计算流程

flowchart TD
    A[充电开始] --> B[获取充电开始时间]

    B --> C[确定适用计费规则
枪 → 桩 → 站点优先级] C --> D{当前时段类型?} D -->|峰时| E[获取峰时电价
获取峰时服务费] D -->|平时| F[获取平时电价
获取平时服务费] D -->|谷时| G[获取谷时电价
获取谷时服务费] E --> H[计算当前费用] F --> H G --> H H --> I[更新实时会话
current_kwh / current_fee] I --> J{充电中?} J -->|是| K[继续计费] K --> B J -->|停止| L[结束计费
汇总总费用] L --> M[更新订单
电费 + 服务费] M --> N[计费完成] style A fill:#0077b6,color:#fff style N fill:#166534,color:#fff

5关键技术方案

5.1 分布式 Session

  • 使用 Redis 存储 Session
  • Token 有效期:7天(可配置)
  • 自动续期机制

5.2 设备状态同步

  • 外部平台通过 WebSocket/HTTP 推送设备状态
  • 后台接收后写入 Redis(实时状态)和 MySQL(持久化)
  • 小程序端 5 秒轮询一次充电状态

5.3 订单防重复支付

  • 使用 Redis 分布式锁:order:pay:lock:{orderId}
  • 锁超时时间:30秒
  • 支付回调先查状态,再更新

5.4 计费引擎

  • 计费规则可绑定:站点 → 充电桩 → 枪(优先级递增)
  • 按充电开始时间确定适用时段
  • 支持按月结算的协议价

5.5 数据权限控制

  • 代理商角色只能看自己区域的数据
  • 实现方式:WHERE region_id IN (SELECT region_ids FROM admin_user WHERE agent_id = ?)
  • 数据权限注解 + AOP 拦截

5.6 高并发优化

场景方案
充电状态查询Redis 缓存,热点数据 5 秒过期
订单创建Redis 分布式锁 + 唯一索引防重
支付回调消息队列异步处理,防止重复提交
报表导出异步任务 + 文件下载

6部署架构

6.1 环境规划

环境用途规模
DEV开发测试单机
TEST功能测试2节点
UAT用户验收2节点
PROD生产环境4节点+

6.2 Docker Compose 本地开发

# docker-compose.yml version: '3.8' services: nacos: image: nacos/nacos-server:v2.2.0 ports: - "8848:8848" mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: root123 MYSQL_DATABASE: energy_charging redis: image: redis:7-alpine ports: - "6379:6379" minio: image: minio/minio command: server /data --console-address ":9001" ports: - "9000:9000" - "9001:9001"

7待确认事项

  • 服务器选型:腾讯云
    确认使用腾讯云服务器,具体配置待定
  • ?
    OCPP 对接:待明确
    外部平台暂未确定,先按默认方案设计,待明确后调整接入层
  • ?
    微信支付:暂未申请
    微信商户号暂未申请,先按默认方案设计,申请后补充配置信息
  • ?
    短信服务:先默认
    短信服务商暂未选定,先按通用接口设计
  • ?
    小程序 AppID:先默认
    微信小程序 AppID 暂未申请,先按通用配置设计
  • 上线时间:本月底
    目标 2026-03-31 前完成上线
  • 开发团队:1人 + AI
    核心开发者 1 人 + AI 辅助(你和我),前端后端全栈开发
状态说明:
  • 已确认事项 - 技术方案已按此设计
  • ? 待明确事项 - 技术方案按默认方案设计,明确后调整

文档版本记录

版本日期修改内容
v1.12026-03-21明确7项待确认事项:服务器选型(腾讯云)、OCPP对接(待明确)、微信支付(暂未申请)、短信服务(先默认)、小程序AppID(先默认)、上线时间(本月底)、开发团队(1人+AI)
v1.0.22026-03-21核心数据表增加SQL建表语句,放在表格结构图下方
v1.0.12026-03-21优化可视化展示:系统架构图改为Mermaid流程图、目录树改为动态可折叠JavaScript、ER关系图改为Mermaid ER Diagram、数据表改为可视化表格结构图
v1.02026-03-21初始版本
湘ICP备2021017731号-1