- Python 54.5%
- JavaScript 36.2%
- CSS 7.4%
- HTML 1.2%
- PowerShell 0.4%
- Other 0.3%
|
|
||
|---|---|---|
| .idea | ||
| backend | ||
| database | ||
| docs | ||
| frontend | ||
| scripts | ||
| .dockerignore | ||
| .env.example | ||
| .gitignore | ||
| docker-compose.yml | ||
| Dockerfile | ||
| README.md | ||
| requirements.txt | ||
| start.ps1 | ||
| start.py | ||
| start.sh | ||
| start_server.bat | ||
| 修复记录.md | ||
| 第二轮修复记录.md | ||
| 第二轮修复记录.md.bak | ||
智充运营・充电站智能运营决策平台
面向充电站运营商的智能运营决策平台。基于真实生产级充电桩大数据(44 万+ 订单)开发,覆盖「实时监控 → 交易撮合 → 运营分析 → 智能决策 → 健康运维」完整闭环,三方言数据库一键切换,可私有化部署。
功能矩阵
| 模块 | 能力 | 页面 |
|---|---|---|
| 实时监控 | 秒级刷新充电桩状态/告警流 24h 滚动,顶栏一键全屏驾驶舱 | 实时监控 |
| 交易引擎 | 抢桩令牌桶限流 + 异步队列 + 并发零超卖(候补自动补位) | 交易管理 |
| 运营总览 | 营收/能量/订单多维趋势(日/周/月) + 关键 KPI 总览 | 运营总览 |
| 营收分析 | 收入结构、站点排行、订单明细、周报/月报 CSV 导出 | 营收分析 |
| 工单管理 | 工单状态机闭环 pending → processing → completed → closed + 智能自动派单(管理员专属)+ 角色×状态感知按钮 + 舆情分析 | 工单管理 |
| 故障检测 | 故障状态机收敛 pending ↔ processing(resolved 仅由工单闭环触发)+ 一键生成工单 | 故障检测 |
| 负荷预测 | Prophet 回归 + 统计降级双模式、准确率评估、扩容建议 | 负荷预测 |
| 相关性分析 | 温度/天气/时段/站点/桩型/变量矩阵六维分析 | 相关性分析 |
| 健康度评分 | 多因子加权评分 + 预警清单 | 健康度 |
| 运营决策台 | 调价模拟器(需求弹性模型 + 市场电价参考 + 定价优化建议 + 调价试点清单 + 策略保存)+ 设备运维台 + 经营目标/缺口推演 + 经营周月报 | 运营决策台 |
| 结算营收中心 | 站级营收对账、站点盈利诊断、全网盈利作战图、12 个月营收趋势、经营月报;增收测算已收口至运营决策台调价模拟器 | 结算营收中心 |
| 工单看板 | 工作台 + 订单检索 + 站点/桩 CRUD | 工作台 |
| 数据管理 | CSV 上传(编码检测/脏数据过滤/去重)、导出、模拟数据 | 数据管理 |
| 用户权限 | 管理员/运维双角色权限矩阵 + 全量操作审计留痕 | 用户管理 |
| 审计日志 | 所有写操作留痕可追溯 | 审计日志 |
双角色权限:管理员(全部功能)/ 运维(工作台、总览、决策台、预测、故障、健康度、相关性、工单处理等受限功能),未登录访问一律 401 JSON。写操作按 角色×状态 收敛:智能自动派单/关闭工单仅管理员,运维仅能接单(自派)与完成自己负责的工单,越权操作一律 403。
界面语言:顶栏一键中英双语切换(zh/en),覆盖导航/页面标题/登录层,选择持久化到本地。
技术栈
- 后端:Python 3.10+ / Flask 2.3 / SQLAlchemy 2.x
- 数据库:三方言中立——SQLite(演示)/ MySQL 8 / PostgreSQL 16 一键切换
- 前端:原生 HTML/CSS/JavaScript + ECharts 5.x,桌面 + 移动端自适应 + 中英双语
- 预测:Prophet(可选,缺失自动降级统计模式)
项目结构
charging_operation_system/
├── start.py # 启动入口(生产/开发由环境变量控制)
├── start.ps1 / start.sh # 一键启动脚本(venv 自检/依赖安装/端口检查)
├── requirements.txt # 依赖清单(单真相源)
├── .env.example # 环境变量模板(复制为 .env 即生效)
├── Dockerfile # 生产镜像
├── docker-compose.yml # 编排(SQLite 卷模式 + PostgreSQL profile)
├── backend/
│ ├── app.py # Flask 应用工厂 + 演示数据初始化
│ ├── config.py # 配置(自动探测 MySQL → 回退 SQLite,支持 DATABASE_URL)
│ ├── models/ # user/station/pile/order/fault/workorder/health/trading/live/decision/audit
│ ├── routes/ # 15 个 API 蓝图(见功能矩阵)
│ ├── services/ # 业务逻辑层
│ │ ├── trading_service.py # 交易引擎(并发零超卖,真实订单分布驱动)
│ │ ├── live_service.py # 实时引擎(时间片推进/续接)
│ │ └── ... # 分析/预测/决策/故障/健康/关联/审计
│ ├── utils/
│ │ ├── db_dialect.py # ★ 方言中立适配层(SQLite/PG/MySQL 时间函数统一)
│ │ ├── decorators.py # 权限装饰器
│ │ └── helpers.py # 工具函数
│ ├── test_api.py # 管理员角色 API 全量回归(75 项)
│ ├── test_operator.py # 运维角色权限回归
│ └── tests/ # pytest 套件(引擎/权限/审计等)
├── frontend/
│ ├── index.html # 主页面
│ ├── css/main.css # 深色工业运维风格(响应式)
│ └── js/ # app.js + components/ + 14 个功能页面
├── database/ # schema.sql / init.sql / seed.sql / charging.db(SQLite 自动创建)
└── docs/ # 设计与复盘文档
快速开始(演示模式 · 免安装数据库)
# 1. 克隆后进入目录
cd charging_operation_system
# 2. 一键启动(Windows)
.\start.ps1
# 或 (macOS/Linux)
# ./start.sh
# 首次运行自动创建 venv 并安装依赖,随后自动以 SQLite 演示模式启动:
# 自动生成演示数据 + 实时引擎 + 44 万订单基线(如已导入)
启动后访问 http://localhost:5000 ,账号:
| 角色 | 用户名 | 密码 |
|---|---|---|
| 管理员 | admin | admin123 |
| 运维人员 | operator | operator123 |
手动方式:
pip install -r requirements.txt && python start.py
生产部署
数据库选择优先级:DATABASE_URL 环境变量 > MySQL 自动探测 > SQLite 回退。三方言下所有统计 SQL 经 db_dialect.py 统一编译,行为一致。
方式 A:SQLite(单机量产,零运维)
python -m venv venv && venv\Scripts\activate # Windows
pip install -r requirements.txt
python start.py # 或 .\start.ps1
方式 B:MySQL 8
mysql -u root -p < database/schema.sql # 建库建表(README 附初始化脚本)
# Linux/macOS
export MYSQL_HOST=localhost MYSQL_PORT=3306 MYSQL_USER=root MYSQL_PASSWORD=xxx MYSQL_DB=charging_system
# Windows PowerShell
$env:MYSQL_HOST='localhost'; $env:MYSQL_USER='root'; $env:MYSQL_PASSWORD='xxx'; $env:MYSQL_DB='charging_system'
python start.py
方式 C:PostgreSQL 16 / Docker
# SQLite 卷模式(零外部依赖,数据库落在 ./database/)
docker compose up -d
# PostgreSQL 生产模式
docker compose --profile postgres up -d # 应用 :5000,PG 内置实例
环境变量(.env.example)
| 变量 | 说明 | 默认 |
|---|---|---|
DATABASE_URL |
完整连接串,优先级最高,如 postgresql://user:pwd@host:5432/db |
无 |
MYSQL_HOST/PORT/USER/PASSWORD/DB |
MySQL 自动探测参数 | 无 |
PORT |
服务端口 | 5000 |
FLASK_DEBUG |
1 开发模式 / 其他生产模式 |
生产 |
SECRET_KEY |
会话签名密钥(生产务必设置) | 随机生成 |
数据库方言中立(卖点)
所有查询经 backend/utils/db_dialect.py 编译为各方言等价 SQL:
| 逻辑 | SQLite | PostgreSQL | MySQL |
|---|---|---|---|
| 取日期 | date(col) |
to_char(col,'YYYY-MM-DD') |
date_format(col,'%Y-%m-%d') |
| 周聚合 | strftime('%Y-W%W',col) |
to_char(col,'IYYY-"W"IW') |
date_format(col,'%x-W%v') |
| 小时 | CAST(strftime('%H',col) AS INT) |
EXTRACT(HOUR ...) |
HOUR(col) |
| 星期序号 | strftime('%w',col) |
EXTRACT(DOW ...) |
WEEKDAY+1 |
换库 无需改一行业务代码。交易引擎的原子占位采用 SQLAlchemy Query.update(),由类型处理器统一格式化,彻底规避跨方言时间精度差异。
测试与质量门禁
cd backend
python test_api.py # 管理员全量回归 75/75
python test_operator.py # 运维角色权限墙回归 38/38
pytest tests/ -q # 引擎/权限/审计专项套件
性能与可靠性基线(本地 8 核实测,可复现):
| 指标 | 数值 |
|---|---|
| 峰值吞吐 | 521 QPS |
| 延迟 p50 / p95 / p99 | 0.3ms / 86.7ms / 243ms |
| 并发抢桩超卖 | 0 次(令牌桶限流 + 异步队列 + 原子更新) |
| 引擎错误 | 0 |
| 故障告警 | 边创建边派单,全链路留痕 |
CSV 数据导入
- 从 Figshare 下载真实充电交易数据集
- admin 登录 →「数据管理」→ 上传 CSV
- 系统自动处理编码检测、脏数据过滤、重复跳过,并给出导入统计与数据质量报告
数据集引用:
Zhang, Y., Xu, T., Chen, T. et al. A high-resolution electric vehicle charging transaction dataset with multidimensional features in China. Sci Data 12, 643 (2025). https://doi.org/10.1038/s41597-025-04982-1
常见问题
Q: 预测接口慢? A: 未安装 Prophet 时自动走统计降级模式;安装后启用机器学习回归(可选依赖)。
Q: 宿主机已有服务占用 5000?
A: 设置 PORT=5001 或修改 compose 端口映射;启动脚本会自动检测端口占用并提示。
Q: 换了 PostgreSQL 数据库如何迁移存量 SQLite 数据? A: 演示期数据不建议跨库迁移;生产初始化后由 CSV 导入真实数据,推荐直接入库。