本文档为项目技术设计说明,供新加入的开发者快速了解系统全貌。
FranklinWH-ToolBox Service 是 FranklinWH 家庭储能系统的内部运维工具平台后端,为运维团队提供站点监控、数据下载、设备管理、告警分析、OTA 升级配置等核心能力。
| 层级 | 技术选型 |
|---|---|
| 语言 | Go 1.25 |
| Web 框架 | Fiber v2 |
| ORM | GORM + Gen(代码生成) |
| 数据库 | PostgreSQL + MongoDB + MySQL(只读) |
| 缓存 | Redis(go-redis v9) |
| 对象存储 | MinIO |
| 消息通信 | MQTT(Paho) |
| 异步任务 | Asynq + 自研 Redis Stream 队列 |
| 定时任务 | robfig/cron + Asynq Scheduler |
| 认证 | Casdoor SSO + JWT |
| 日志 | Zap(结构化日志) |
| 配置 | Viper(.env 文件 + 环境变量) |
| API 文档 | Swagger(swaggo 自动生成) |
| 网络事件 | Evio(高性能事件驱动) |
┌─────────────────────────────────────────────────────────────────────────┐
│ 客户端(Web 前端) │
└───────────────────────────────────┬─────────────────────────────────────┘
│ HTTP / WebSocket
▼
┌─────────────────────────────────────────────────────────────────────────┐
│ Fiber HTTP 服务 (:8301) │
│ ┌──────────┐ ┌──────────────┐ ┌──────────┐ ┌────────────────────┐ │
│ │ Swagger │ │ Auth Route │ │ /ping │ │ /api/* (Protected)│ │
│ └──────────┘ └──────────────┘ └──────────┘ └────────────────────┘ │
└───────────────────────────────────┬─────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────────┐
│ Middleware 层 │
│ Casdoor JWT 认证 │ 请求日志 │ Panic 恢复 │
└───────────────────────────────────┬─────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────────┐
│ Controller 层 │
│ 解析请求参数,调用 Service,返回响应 │
└───────────────────────────────────┬─────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────────┐
│ Service 层(业务逻辑) │
│ │ │
│ ┌────────────────────┼────────────────────┐ │
│ ▼ ▼ ▼ │
│ 直通 CRUD 模式 任务触发模式 缓存优先模式 │
│ (入队异步执行) (Redis → DB) │
└──────────────┬────────────────────┬────────────────────┬─────────────────┘
│ │ │
│ ┌─────▼──────┐ │
│ │ Task Queue │ │
│ │ (FWH队列) │ │
│ │ (SimCard队列) │
│ └─────┬──────┘ │
│ │ │
│ ┌─────▼──────┐ │
│ │ Jobs 层 │ │
│ │ (后台作业) │ │
│ └─────┬──────┘ │
│ │ │
▼ ▼ ▼
┌─────────────────────────────────────────────────────────────────────────┐
│ Repository 层(数据访问聚合) │
│ ┌────────┐ ┌──────┐ ┌───────┐ ┌───────┐ ┌──────┐ ┌──────┐ ┌───────┐ │
│ │MongoDB │ │PgSQL │ │ MySQL │ │ Redis │ │MinIO │ │ MQTT │ │FWH API│ │
│ └────────┘ └──────┘ └───────┘ └───────┘ └──────┘ └──────┘ └───────┘ │
└─────────────────────────────────────────────────────────────────────────┘
Client (HTTP Request)
│
▼
Route (Fiber 路由匹配)
│
▼
Middleware (JWT 认证 / 日志记录)
│
▼
Controller (参数解析、校验)
│
▼
Service (业务逻辑) ──────────────────────────────┐
│ ▼
│ Task (实时任务) / Scheduler (定时任务)
│ │
│ ▼
│ Jobs (后台作业)
▼ │
Repository (数据访问聚合) ◀──────────────────────┘
│
▼
Database / Cache / 外部服务 (FWH API / MQTT / MinIO)
┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐
│ MySQL (只读) │ │ PostgreSQL │ │ MongoDB │
│ FWH Pro 生产库 │ │ 本地业务数据 │ │ 文档型业务数据 │
│ - iot_gateway │ │ - 告警快照 │ │ - 站点信息 │
│ │ │ - 原始数据存储 │ │ - 批量下载配置 │
│ │ │ │ │ - 升级配置 │
│ │ │ │ │ - SIM卡数据 │
└──────────────────┘ └──────────────────┘ └──────────────────┘
┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐
│ Redis │ │ MinIO │ │ MQTT │
│ - 会话缓存 │ │ - 下载文件存储 │ │ - 设备通信 │
│ - 任务队列 │ │ - 升级配置文件 │ │ - Xlog 使能 │
│ - 分布式锁 │ │ │ │ - 故障录波 │
│ - Dashboard缓存 │ │ │ │ │
└──────────────────┘ └──────────────────┘ └──────────────────┘
service/
├── main.go # 应用入口(初始化所有组件 + 启动服务)
├── .env # 环境变量配置文件
├── config.env # 备选配置文件
├── go.mod / go.sum # Go 模块依赖
├── DESIGN.md # 本设计文档
├── README.md # 项目简介
│
├── config/ # 配置管理
│ └── config.go # Viper 加载配置,定义 Config/AppConfig/FwhApiConfig 等结构体
│
├── logger/ # 日志系统
│ └── logger.go # Zap 初始化,环境区分(dev/pro),全局 Logger
│
├── database/ # 数据库连接
│ ├── database.go # 统一初始化入口(PostgreSQL + MongoDB)
│ ├── postgresql.go # GORM PostgreSQL 连接 + 自定义 Logger
│ ├── mysql.go # GORM MySQL 连接(当前未启用)
│ └── mongodb.go # MongoDB 连接 + GetCollection
│
├── cache/ # 缓存封装
│ ├── cache.go # 统一 API 暴露(Set/Get/HSet/XAdd/TryLock 等)
│ ├── cache_aside.go # Cache-Aside 模式(GetOrSet/GetOrSetMany)
│ ├── stale.go # Stale 异步刷新模式
│ ├── options.go # 可选配置(TTL/锁/前缀等)
│ └── redisx/ # Redis 底层操作封装
│ ├── stringx.go # String 操作
│ ├── hashx.go # Hash 操作
│ ├── listx.go # List 操作
│ ├── setx.go # Set 操作
│ ├── zsetx.go # ZSet 操作
│ ├── streamx.go # Stream 操作(任务队列核心)
│ ├── jsonx.go # 泛型 JSON 序列化操作
│ ├── lockx.go # 分布式锁(SET NX + Lua)
│ ├── pipelinex.go # Pipeline 管道
│ ├── pubsubx.go # 发布/订阅
│ └── scriptx.go # Lua 脚本
│
├── routes/ # 路由注册
│ ├── routes.go # 主路由入口 Setup()
│ ├── authRoutes.go # 认证路由(/auth)
│ ├── batchDownloadRoutes.go
│ ├── sitesMonitorRoutes.go
│ ├── sitesAnalysisRoutes.go
│ ├── autoUpdateConfigRoutes.go
│ ├── siteInfoManageRoutes.go
│ ├── shutdownRoutes.go
│ ├── simCardManageRoutes.go
│ └── ... # 各业务模块独立路由文件
│
├── middleware/ # 中间件
│ └── auth.go # Casdoor JWT 认证 + 角色检查
│
├── controllers/ # 控制器层
│ ├── batchDownloadControllers.go
│ ├── autoUpdateConfigControllers.go
│ ├── siteInfoManageControllers.go
│ ├── sitesMonitorControllers.go
│ ├── sitesAnalysisControllers.go
│ ├── authControllers.go
│ └── ... # 各业务模块控制器
│
├── services/ # 业务逻辑层
│ ├── batchDownloadServices.go
│ ├── siteInfoManageServices.go
│ ├── sitesAnalysisServices.go
│ ├── authServices.go
│ ├── simCardManageServices.go
│ └── ... # 各业务模块服务
│
├── repositories/ # 数据访问层(聚合模式)
│ ├── repositories.go # 统一入口,暴露所有子模块方法
│ ├── mongo/ # MongoDB 数据操作
│ ├── redis/ # Redis 数据操作(Session/缓存/队列)
│ ├── pgsql/ # PostgreSQL 数据操作(告警快照)
│ ├── mysql/ # MySQL 数据操作(FWH Pro 只读)
│ ├── api/ # 外部 API 调用
│ │ ├── fwh_pro/ # FWH Pro 平台 API
│ │ ├── smartHub/ # SmartHub SIM 卡 API
│ │ └── acceleronix/ # Acceleronix SIM 卡 API
│ ├── mqtt/ # MQTT 通信
│ │ └── fwh_mqtt/ # FWH MQTT 客户端
│ └── events/ # Xlog 事件管理
│
├── domain/ # 领域对象(业务核心模型)
│ ├── siteInfo.go # 站点信息 Domain
│ ├── batchDownload.go # 批量下载配置/数据
│ ├── siteAnalysis.go # 站点分析配置/数据
│ ├── autoUpdate.go # 自动升级配置
│ ├── simCard.go # SIM 卡信息
│ ├── shutdown.go # 停机统计
│ ├── auth.go # 认证信息
│ ├── mqttLogTypes.go # MQTT 日志类型定义(201/357 等)
│ └── ... # 其他领域对象
│
├── models/ # GORM 数据库模型(Gen 生成)
│ ├── model_pgsql/ # PostgreSQL 表模型
│ ├── query_alarm_snapshot/ # 告警快照 Query 层
│ ├── query_fwh_pro/ # FWH Pro MySQL Query 层
│ └── fwh_pro/ # FWH Pro 模型定义
│
├── dto/ # 数据传输对象(API 请求/响应)
│ ├── siteInfo.go # 站点信息 DTO
│ ├── batchDownload.go # 批量下载 DTO
│ ├── simCard.go # SIM 卡 DTO
│ ├── powerFlow.go # 功率流 DTO
│ ├── common.go # 通用 DTO(ResPage 等)
│ └── ...
│
├── task/ # 异步任务系统
│ ├── task.go # 任务系统入口 InitTask()
│ ├── core/ # TaskCore 核心封装
│ ├── plugin/ # SchedulerManager + AggregatorManager
│ └── queue/ # 业务队列
│ ├── fwhQueue/ # FWH 主任务队列(Redis Stream)
│ └── simCardQueue/ # SIM 卡采集队列(Asynq)
│
├── scheduler/ # 定时任务(robfig/cron)
│ └── scheduler.go # Cron 初始化 + 任务注册
│
├── jobs/ # 后台作业(任务具体执行逻辑)
│ ├── callFwhFile.go # FWH 文件召唤(EMS日志/故障录波)
│ ├── saveBatchDownloadData.go # 批量下载数据保存(Excel/图表 → MinIO)
│ ├── analysisSiteData.go # 站点数据分析(时间线/运行时)
│ ├── statisticsShutdown.go # 停机统计
│ ├── statisticsAlarm.go # 告警统计
│ ├── getAlarmSnapshot.go # 告警快照获取与解析
│ └── createAutoUpdateConfigFile.go # 升级配置文件生成
│
├── utils/ # 工具函数
│ ├── httpClient/ # HTTP 客户端封装(自动 reLogin)
│ ├── mqttClient/ # MQTT 客户端封装(自动重连)
│ ├── minio/ # MinIO 对象存储客户端
│ ├── snowflakeID/ # 分布式 ID 生成
│ ├── casdoor/ # Casdoor 认证集成
│ ├── files/ # 文件操作(压缩/解压/下载)
│ ├── mimetype/ # MIME 类型检测
│ ├── echart/ # 图表生成封装
│ ├── emspara/ # EMS 参数同步
│ ├── xlog/ # Xlog 协议解析
│ ├── networkEvents/ # Evio 网络事件监听
│ └── global/ # 全局工具函数(Ternary/Deref)
│
├── pkg/ # 自定义通用包
├── docs/ # Swagger 文档(自动生成)
└── cmd/ # 脚本与工具
├── gen/ # GORM Gen 代码生成
├── deploy.sh # 部署脚本
├── only_build.sh # 仅编译脚本
├── showLog.sh # 日志查看
├── showTodayLog.sh # 今日日志
└── showTodayErrorLog.sh # 今日错误日志
| 依赖包 | 版本 | 用途 |
|---|---|---|
go |
1.25.0 | 编程语言 |
gofiber/fiber/v2 |
v2.52.9 | 高性能 Web 框架 |
gorm.io/gorm |
v1.30.1 | ORM 框架 |
gorm.io/driver/mysql |
v1.6.0 | MySQL 驱动 |
gorm.io/driver/postgres |
v1.6.0 | PostgreSQL 驱动 |
gorm.io/gen |
v0.3.27 | GORM 代码生成工具 |
go.mongodb.org/mongo-driver |
v1.17.4 | MongoDB 官方驱动 |
redis/go-redis/v9 |
v9.21.0 | Redis 客户端 |
spf13/viper |
v1.20.1 | 配置管理 |
go.uber.org/zap |
v1.27.0 | 结构化日志 |
robfig/cron/v3 |
v3.0.1 | 定时任务 |
hibiken/asynq |
v0.26.0 | 异步任务队列 |
hibiken/asynqmon |
v0.7.2 | 任务队列监控 UI |
eclipse/paho.mqtt.golang |
v1.5.1 | MQTT 客户端 |
minio/minio-go/v7 |
v7.0.95 | 对象存储客户端 |
casdoor/casdoor-go-sdk |
v1.21.0 | SSO/鉴权 SDK |
gofiber/swagger |
v1.1.1 | Swagger UI 集成 |
swaggo/swag |
v1.16.4 | Swagger 文档生成 |
xuri/excelize/v2 |
v2.10.0 | Excel 文件读写 |
tidwall/evio |
v1.0.8 | 高性能事件网络库 |
go-echarts/go-echarts/v2 |
v2.6.6 | 图表生成(功率流图) |
bwmarrin/snowflake |
v0.3.0 | 分布式 ID 生成 |
tiendc/go-deepcopy |
v1.7.1 | 结构体深拷贝 |
配置来源优先级(高 → 低):
环境变量 (os.Getenv)
↑ AutomaticEnv() 自动覆盖
./.env 文件
↑ 未找到则尝试
./config.env 文件
↑ 未找到则使用
缺省默认值
type Config struct {
App AppConfig // 应用基础设施配置
FwhApi FwhApiConfig // FWH 平台 API 配置
FwhMqtt FwhMqttConfig // MQTT Broker 配置
FwhMqttTest FwhMqttConfig // MQTT 测试环境配置
}
| 字段 | 环境变量 | 说明 | 默认值 |
|---|---|---|---|
| AppEnv | APP_ENV |
运行环境 (dev/pro) | dev |
| AppPort | APP_PORT |
HTTP 监听端口 | 8301 |
| RedisAddr | REDIS_ADDR |
Redis 地址 | localhost:6379 |
| MySQLDSN | MYSQL_DSN |
MySQL 连接串 | — |
| PostgresDSN | POSTGRES_DSN |
PostgreSQL 连接串 | — |
| MongoDSN | MONGO_DSN |
MongoDB 连接串 | — |
| MinIoEndpoint | MINIO_ENDPOINT |
MinIO 端点 | localhost:9198 |
| MinioAccessKey | MINIO_ACCESS_KEY |
MinIO 访问密钥 | — |
| MinioSecretKey | MINIO_SECRET_KEY |
MinIO 密钥 | — |
| MinioBucketName | MINIO_BUCKET_NAME |
MinIO 存储桶 | — |
| AsynqmonPort | ASYNQMON_PORT |
Asynqmon 监控端口 | 8081 |
| 字段 | 说明 |
|---|---|
| FwhEnergy | FWH 能源管理 API 域名 |
| FwhOss | FWH OSS 文件服务域名 |
| FwhUser | 登录用户名 |
| FwhPassword | 登录密码(MD5 加密存储) |
| 字段 | 说明 |
|---|---|
| Broker | MQTT Broker 地址 |
| Ca | CA 证书路径 |
| Cert | 客户端证书路径 |
| Key | 客户端私钥路径 |
| 特性 | dev(开发) | pro(生产) |
|---|---|---|
| 日志级别 | Debug | Warn |
| 日志格式 | Console(可读) | JSON(结构化) |
| 日志采样 | 无 | 100/100 |
| 堆栈追踪 | Error 级别 | Error 级别 |
Fiber App
├── /swagger/* → Swagger 文档 UI
├── /ping → 健康检查
├── /auth/* → 认证(公开,无需 Token)
│ ├── POST /auth/login → OAuth Code 登录
│ ├── GET /auth/session → 获取会话信息
│ ├── POST /auth/refreshToken → 刷新 Token
│ └── POST /auth/logout → 登出
│
└── /api/* [AuthMiddleware] → 受保护路由(需 JWT)
├── /api/userInfo/* → 用户配置
├── /api/shutdownStatistics/* → 停机统计
├── /api/shutdownManage/* → 停机管理
├── /api/sitesMonitor/* → 站点监控
├── /api/sitesAnalysis/* → 站点分析
├── /api/batchDownload/* → 批量下载
├── /api/backgroundTask/* → 后台任务
├── /api/autoUpdateConfig/* → 自动升级配置
├── /api/xlog/* → 设备日志
├── /api/siteInfoManage/* → 站点信息管理
├── /api/despatchConfig/* → 调度配置
├── /api/faultRecord/* → 故障录波
├── /api/simCardManage/* → SIM 卡管理
└── WebSocket → 全局 WebSocket
独立服务:
└── Asynqmon (:8081) → 异步任务监控面板
/auth)| 方法 | 路径 | 说明 |
|---|---|---|
| POST | /auth/login |
Casdoor OAuth Code 换 Token 登录 |
| GET | /auth/session |
获取当前会话信息 |
| POST | /auth/refreshToken |
刷新 Access Token |
| POST | /auth/logout |
登出(清除 Session) |
/api/batchDownload)| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /batchDownload/manage/list |
分页查询下载任务列表 |
| POST | /batchDownload/manage/config |
创建批量下载任务 |
| POST | /batchDownload/manage/description/:id |
更新任务描述 |
| POST | /batchDownload/manage/owner/:id |
更新任务归属 |
| DELETE | /batchDownload/manage/config/:id |
删除下载任务 |
| GET | /batchDownload/data/:id |
流式 ZIP 下载任务数据 |
| GET | /batchDownload/manage/path |
获取目录树结构 |
| GET | /batchDownload/manage/fileTree |
获取 tar.gz 内部目录 |
| GET | /batchDownload/manage/fileDownload |
单文件下载 |
/api/autoUpdateConfig)| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /autoUpdateConfig/option |
获取配置选项 |
| GET | /autoUpdateConfig/packageInfo |
获取升级包信息列表 |
| POST | /autoUpdateConfig/packageInfo/create/:type |
创建升级包 |
| POST | /autoUpdateConfig/packageInfo/update/:id |
更新升级包 |
| DELETE | /autoUpdateConfig/packageInfo/delete/:type/:id |
删除升级包 |
| GET | /autoUpdateConfig/aPowerVersion |
获取 aPower 版本列表 |
| POST | /autoUpdateConfig/aPowerVersion/:version |
更新 aPower 版本 |
| DELETE | /autoUpdateConfig/aPowerVersion/:version |
删除 aPower 版本 |
| GET | /autoUpdateConfig/config |
获取升级配置 |
| POST | /autoUpdateConfig/config/:aGate |
更新升级配置 |
| DELETE | /autoUpdateConfig/config/:aGate |
删除升级配置 |
| POST | /autoUpdateConfig/config/special/:aGate |
创建特殊设备配置 |
| DELETE | /autoUpdateConfig/config/special/:aGate/:id |
删除特殊设备配置 |
| GET | /autoUpdateConfig/configFile |
获取配置文件信息 |
| POST | /autoUpdateConfig/configFile/create |
生成配置文件(Excel) |
| GET | /autoUpdateConfig/configFile/download/:fileName |
下载配置文件 |
/api/siteInfoManage)| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /siteInfoManage/manage/update |
获取站点信息更新状态 |
| POST | /siteInfoManage/manage/update |
触发全量同步 |
| POST | /siteInfoManage/dataList |
分页查询站点列表 |
| POST | /siteInfoManage/dataListExport |
导出站点 Excel |
| GET | /siteInfoManage/siteInfo/query?sn= |
按 SN 查询站点详情 |
| POST | /siteInfoManage/operate/enableXlog |
使能站点 Xlog |
/api/sitesMonitor)| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /sitesMonitor/manage/nameList |
获取监控配置名列表 |
| GET | /sitesMonitor/manage/config/:name |
获取指定监控配置 |
| POST | /sitesMonitor/manage/config/:name |
更新监控配置 |
| POST | /sitesMonitor/manage/pageConfig/:name |
更新页面配置 |
| DELETE | /sitesMonitor/manage/config/:name |
删除监控配置 |
| GET | /sitesMonitor/manage/config |
获取所有监控配置 |
| POST | /sitesMonitor/manage/config |
创建监控配置 |
| POST | /sitesMonitor/site/infoList |
批量查询站点信息 |
| GET | /sitesMonitor/site/:site/info |
单站点详细信息 |
| GET | /sitesMonitor/site/:site/modeInfo |
站点工作模式 |
| GET | /sitesMonitor/site/:site/powerFlow/:day |
站点功率流(按天) |
| GET | /sitesMonitor/site/:site/alarmList |
站点告警列表 |
/api/sitesAnalysis)| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /sitesAnalysis/manage/analysisList |
分析任务列表 |
| POST | /sitesAnalysis/manage/config |
创建分析任务 |
| GET | /sitesAnalysis/manage/config/:id |
获取分析配置 |
| POST | /sitesAnalysis/manage/config/:id |
更新分析配置 |
| POST | /sitesAnalysis/manage/description/:id |
更新描述 |
| DELETE | /sitesAnalysis/manage/config/:id |
删除分析任务 |
| GET | /sitesAnalysis/data/:id |
获取分析结果数据 |
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /simCardManage/info |
SIM 卡批量信息 |
| GET | /simCardManage/monthly |
SIM 卡月度数据 |
| GET | /shutdownStatistics/date |
停机统计日期 |
| GET | /shutdownStatistics |
停机统计数据 |
| GET | /shutdownManage/date |
停机管理日期 |
| GET | /shutdownManage/infoMap |
停机详情映射 |
| GET | /alarmManage/infoMap |
告警统计映射 |
| POST | /faultRecord/paramSetting |
故障录波参数设置 |
| GET | /despatchConfig/touTemplatePro/list |
TOU 模板列表 |
| GET | /despatchConfig/touTemplatePro/info |
TOU 模板详情 |
| GET | /userInfo/config |
获取用户配置 |
| POST | /userInfo/config |
更新用户配置 |
| GET | /backgroundTask/info |
后台任务列表 |
| GET | /xlog/manage/siteList |
Xlog 站点列表 |
| POST | /xlog/terminal/:uuid |
发送终端命令 |
┌─────────────────────────────────────────────────────────────┐
│ FWH ToolBox 业务模块 │
├─────────────────┬───────────────────┬───────────────────────┤
│ 数据采集类 │ 运维管理类 │ 监控分析类 │
├─────────────────┼───────────────────┼───────────────────────┤
│ • 批量数据下载 │ • 自动升级配置 │ • 站点监控 │
│ • 站点信息同步 │ • 故障录波 │ • 站点分析 │
│ • SIM卡信息采集 │ • 调度配置 │ • 停机统计 │
│ │ • Xlog 管理 │ • 告警统计 │
│ │ • 用户配置 │ │
└─────────────────┴───────────────────┴───────────────────────┘
功能描述:批量抓取指定站点在指定时间段内的各类运行数据,异步处理后打包为 ZIP 文件供下载。
数据类型支持:
处理流程:
用户创建任务 → Service 写入 MongoDB(状态: pending)
→ 入队 FWH 任务队列(Redis Stream)
→ Worker 消费任务(状态: running)
→ 按 SN 遍历:
→ 按数据类型调用 FWH API 获取数据
→ Jobs 层处理(生成 Excel/图表)
→ 存入 MinIO 对象存储
→ 全部完成(状态: complete)/ 部分失败(状态: failed)
用户下载 → 流式读取 MinIO 文件 → ZIP 打包 → HTTP Stream 响应
关键技术:
SetBodyStreamWriter),避免内存溢出功能描述:管理 aGate/aPower 设备的 OTA 固件升级策略。
核心概念:
数据存储:MongoDB(配置数据) + MinIO(配置文件) + Redis(文件列表缓存)
功能描述:从 FWH Pro 平台全量同步站点信息到本地 MongoDB,提供多维度查询和 Excel 导出。
核心流程:
触发全量同步 → 入队任务 → 分页调用 FWH API
→ 逐条写入/更新 MongoDB(SiteInfoDomain)
→ 完成后通知前端
查询站点 → MongoDB 聚合查询(支持多种过滤器类型)
→ Domain → DTO 转换(标签ID展开为详情)
→ 分页返回
导出 Excel → 查询全部匹配数据 → excelize 生成工作表 → 流式响应
筛选器支持:等于(整数/浮点/字符串)、包含、范围(整数/浮点/时间)、字段存在
功能描述:配置监控面板,实时查询站点功率流、告警、工作模式。
特性:
功能描述:分析站点历史 MQTT 日志,生成时间线事件和运行时数据。
分析数据源:
输出结果:
Timeline[]):离线、上线、告警、模式切换等事件序列Runtime[]):各时段运行状态数据功能描述:统计每日停机站点,生成按区域(ALL/US/AU)的周报和年报。
统计维度:
触发方式:定时任务(每日执行)+ 手动触发
功能描述:定时从第三方平台采集 SIM 卡状态和流量数据。
数据源:
采集模式:
定时调度(每天 UTC 23:00)→ 创建首页任务
→ 链式分页查询(Page 0 → Page 1 → ... → 最后一页)
→ 聚合器收集多页数据
→ 批量写入 MongoDB
功能描述:通过 MQTT 协议向设备下发故障录波参数设置指令。
通信流程:
API 请求 → Service → MQTT 发送 cmdType=377(参数设置)
→ 等待设备回复 cmdType=378
→ 返回结果
| 模块 | 说明 |
|---|---|
| 调度配置 (DespatchConfig) | 代理查询 FWH Pro 的 TOU 调度模板列表和详情 |
| 用户配置 (UserInfo) | 管理用户个性化设置(表格列过滤器、自定义查询条件) |
| 后台任务 (BackgroundTask) | 查询 Redis Stream 中后台任务执行状态 |
| Xlog 管理 | 管理站点 Xlog 连接,通过 WebSocket 转发终端命令 |
| 全局 WebSocket | 维护 WebSocket 连接池,支持心跳检测和消息广播 |
本项目采用三层数据对象设计,各层职责明确:
┌─────────────────────────────────────────────────────────────┐
│ DTO 层 (dto/) │
│ 面向 API 接口,定义请求/响应结构 │
│ 标签: json ID类型: string (Hex) │
└─────────────────────────────┬───────────────────────────────┘
│ 转换函数
┌─────────────────────────────▼───────────────────────────────┐
│ Domain 层 (domain/) │
│ 业务核心对象,内部逻辑处理和 MongoDB 存储 │
│ 标签: bson ID类型: primitive.ObjectID │
└─────────────────────────────┬───────────────────────────────┘
│
┌─────────────────────────────▼───────────────────────────────┐
│ Model 层 (models/) │
│ GORM 模型,映射 PostgreSQL/MySQL 表结构 │
│ 标签: gorm ID类型: int64/string │
└─────────────────────────────────────────────────────────────┘
外部数据源 内部存储 API 响应
──────────── ──────── ────────
FWH Pro API
(FwhSiteInfo) → domain.SiteInfoDomain → dto.SiteInfoDTO
(MongoDB 存储) (标签展开为详情)
FWH Pro MySQL
(IotGateway) → domain.FwhSiteInfo → dto.MonitorSiteInfo
(API 响应映射) (精简字段)
SmartHub API
(SimCardResponse) → domain.SimCardInfo → dto.SimCardInfo
(MongoDB 存储) (增加关联SN)
type Progress string // pending | running | failed | error | complete
type Trigger string // auto | manual
type SiteInfoDomain struct {
Sn string `bson:"_id"` // aGate 序列号(主键)
Name *string // 站点名称
ActiveStatus int // 0-未激活 1-已激活
Status int // 0-离线 1-在线
RunStatus int // 0-待机 1-充电 2-放电 3-故障
EmsModel *int // EMS 调度模式
Version string // 固件版本
FhpSn string // aPower SN(逗号分割)
ConnType int // 网络类型
TimeZone float32 // 时区
Country string // 国家
ExtTags *[]string // 扩展标签 ID 列表
// ... 更多字段
}
type BatchDownloadConfig struct {
Id primitive.ObjectID
Sn []string // 目标 SN 列表
TimePeriod [2]string // 时间范围 [开始, 结束]
Options BatchDownloadOptions // 下载选项
Progress Progress // 任务进度
Data map[string]BatchDownloadData // SN → 数据映射
FailReasons []string // 失败原因
}
type BatchDownloadOptions struct {
PowerFlow bool // 功率流图
MqttLogs []string // MQTT 日志类型列表
EventAlarm bool // 事件告警
AlarmSnapshot bool // 告警快照
EmsLogs []string // EMS 日志类型
FaultRecord bool // 故障录波
UpdateLog bool // 升级记录
Settings bool // 站点设置
}
type SiteAnalysisConfig struct {
Id primitive.ObjectID
Sn string
TimePeriod [2]string
Options SiteAnalysisOptions
Progress Progress
Trigger Trigger // auto(定时触发) / manual(手动)
Data SiteAnalysisData
}
type SiteAnalysisData struct {
Timeline []TimelineItem // 时间线事件
Runtime []RuntimeItem // 运行时数据
}
type TimelineType string // offline | online | mode_change | event | alarm
type ShutdownStatisticsItem struct {
Date string
Status ShutdownStatisticsStatus
Count ShutdownStatisticsArea[uint] // 泛型按区域统计
SiteMap map[string]ShutdownStatisticsInfo
}
type ShutdownStatisticsArea[T any] struct {
ALL T
US T
AU T
}
// 表: alarm_snapshot.site_alarm_snapshot_file_record
type SiteAlarmSnapshotFileRecord struct {
ID int64 `gorm:"primaryKey;autoIncrement"`
CodeType int32
FileName string `gorm:"not null"`
FileURL string `gorm:"not null"`
Sn string `gorm:"not null"`
LogTime time.Time
State int16 // 0-分析中 1-完成 -1-失败
}
// 表: alarm_snapshot.site_alarm_snapshot_data
type SiteAlarmSnapshotData struct {
ID int64 `gorm:"primaryKey;autoIncrement"`
Sn string `gorm:"not null"`
FileRecordID int64 // 外键关联 FileRecord
LogTime time.Time
JSONData string `gorm:"type:jsonb"` // JSON 格式数据
ZoneInfo string
}
// 表: original.site_original_data
type SiteOriginalDataModel struct {
ID int64 `gorm:"primaryKey"` // 雪花 ID
DataType DataTypes // "API" 或 "MQTT"
ChildType string // API 路径名 或 MQTT cmdType
SN string
DataTime time.Time
JsonData datatypes.JSON `gorm:"type:jsonb"`
}
// 表: iot_gateway (FWH Pro 生产库)
type IotGateway struct {
ID string `gorm:"primaryKey"` // 网关 SN
Name string
Version string // 固件版本
ActiveStatus int32 // 激活状态
Status int32 // 在线状态
RunStatus int32 // 运行状态
EmsModel int32 // EMS 模式
FhpSn string // aPower 编号
TimeZone float32
Country string
// ... 60+ 字段,完整映射生产数据库
}
type ResPage[T any] struct {
Data []T `json:"data"`
PageSize uint `json:"pageSize"`
PageNum uint `json:"pageNum"`
Total uint `json:"total"`
}
type SiteInfoDTO struct {
// 与 Domain 基本一致,区别:
// - json 标签(非 bson)
// - ExtTags 展开为 []SiteTagDTO(含名称、颜色等详情)
ExtTags []SiteTagDTO `json:"extTags,omitempty"`
}
type SiteInfoRequest struct {
Search string `json:"search"`
Filter *domain.SiteInfoFilter `json:"filter"`
PageSize uint `json:"pageSize"`
PageNum uint `json:"pageNum"`
}
type SitePowerFlow struct {
Index uint
DeviceTimeArray []string // 时间轴
PowerFhpArray []float32 // aPower 功率
PowerGenArray []float32 // 发电功率
PowerLoadArray []float32 // 负载功率
PowerSunArray []float32 // 光伏功率
PowerUtiArray []float32 // 电网功率
SocArray []float32 // SOC 曲线
}
| 数据库 | 访问模式 | 存储内容 |
|---|---|---|
| MongoDB | 读写 | 站点信息、SIM卡、批量下载任务/配置、站点分析、升级配置、用户配置、监控配置、统计数据、标签 |
| PostgreSQL | 读写 | 告警快照(文件记录+数据)、原始数据存储(API/MQTT 日志) |
| MySQL | 只读 | FWH Pro 生产库 iot_gateway 表(站点基础信息) |
| Redis | 读写 | 会话、Dashboard 缓存、任务队列、分布式锁、EMS 参数缓存 |
| MinIO | 读写 | 批量下载文件、升级配置 Excel 文件 |
database.Init(cfg *config.AppConfig)
├── InitPostgreSQL(cfg.PostgresDSN) // GORM + postgres driver
├── InitMongo(cfg.MongoDSN) // mongo-driver
└── InitMySQL(cfg.MySQLDSN) // 当前已注释
| 配置项 | 值 |
|---|---|
| 驱动 | gorm.io/driver/postgres |
| 日志 | 自定义 GormZapLogger(桥接 Zap) |
| 慢查询阈值 | 200ms |
| 代码生成 | GORM Gen(query_alarm_snapshot) |
| 配置项 | 值 |
|---|---|
| 驱动 | go.mongodb.org/mongo-driver |
| 连接超时 | 10s |
| 数据库名 | 从 URI 末段解析 |
| 对外接口 | GetCollection(collName) |
将 GORM 的 SQL 日志、慢查询告警、错误信息全部桥接到 Zap 结构化日志:
上层 API (cache/)
│ 统一暴露:Set/Get/HSet/LPush/ZAdd/XAdd/TryLock...
│ 高级模式:GetOrSet/GetOrSetMany/GetOrSetStale
▼
底层封装 (cache/redisx/)
│ 按数据结构分文件:stringx/hashx/listx/setx/zsetx/streamx
│ 特殊能力:jsonx(泛型序列化)/lockx(分布式锁)/scriptx(Lua)
▼
Redis Client (redis.UniversalClient)
│ 支持单机/哨兵/集群模式
▼
Redis Server (DB=12)
// 单键缓存(防击穿 + 防雪崩)
result, err := cache.GetOrSet[T](ctx, key, loaderFunc, opts...)
// 执行流程:
// 1. GET key → 命中则返回
// 2. 未命中 → 尝试获取分布式锁
// 3. 获取锁成功 → double check → 调用 loader → 写缓存
// 4. 获取锁失败 → 等待缓存更新 or fallback 直接调用 loader
// 批量模式
results, err := cache.GetOrSetMany[T](ctx, keys, batchLoaderFunc, opts...)
// TTL 即将过期时返回旧值 + 后台刷新
result, err := cache.GetOrSetStale[T](ctx, key, loaderFunc, opts...)
// stale 阈值默认 30s,即 TTL < 30s 时触发后台刷新
| 选项 | 默认值 | 说明 |
|---|---|---|
| TTL | 5min | 缓存过期时间 |
| AsyncWrite | true | 异步写入缓存 |
| LockEnabled | true | 是否启用分布式锁 |
| LockTTL | 5s | 锁过期时间 |
| WaitCacheTimeout | 500ms | 等待缓存更新超时 |
| StaleThreshold | 30s | Stale 刷新阈值 |
基于 SET key value NX PX timeout + Lua 脚本安全释放:
lock, ok, err := cache.TryLock(ctx, key, ttl) // 尝试获取
cache.LockRelease(ctx, key, token) // 安全释放(Lua 校验 token)
func AuthMiddleware(requiredRoles ...string) fiber.Handler
处理流程:
请求 → 提取 Authorization: Bearer <token>
→ casdoorsdk.ParseJwtToken(token) 验证签名
→ 提取用户信息 → 存入 c.Locals("user")
→ (可选) 检查角色权限
→ 通过 / 返回 401
用户信息结构:
type AuthUserInfo struct {
Owner string
Name string // 用户名
DisplayName string // 显示名
Id string
IsAdmin bool
Roles []RoleInfo // 角色列表
Permissions []PermInfo // 权限列表(含 Actions + Effect)
Groups []string // 用户组
}
辅助函数:
AuthGetUserInfo(c) — 获取完整用户信息AuthGetUserName(c) — 获取用户名AuthIsAdmin(c) — 判断管理员AuthGetRoleNameList(c) — 角色名列表AuthGetPermissionNameList(c) — 权限名列表logger.Init(env string)
// 全局变量:
// logger.Log *zap.Logger — 结构化日志
// logger.Sugar *zap.SugaredLogger — Sugar 风格日志
// logger.Std *log.Logger — 标准库兼容
| 配置 | dev | pro |
|---|---|---|
| 编码器 | Console | JSON |
| 级别 | Debug | Warn |
| 采样 | 无 | Initial=100, Thereafter=100 |
| 堆栈 | Error+ | Error+ |
| 输出 | stderr | stderr |
zap.ReplaceGlobals(Log)
// 之后可通过 zap.L() / zap.S() 全局访问
系统包含两套独立的任务队列,各自服务不同业务场景:
┌─────────────────────────────────────────────────────────────────┐
│ 任务系统架构 │
├────────────────────────────┬────────────────────────────────────┤
│ FWH 队列(自研) │ SimCard 队列(Asynq) │
│ 基于 Redis Stream │ 基于 hibiken/asynq │
├────────────────────────────┼────────────────────────────────────┤
│ • 批量数据下载 │ • SIM 卡信息采集 │
│ • 站点分析 │ • 聚合写入 │
│ • 站点信息同步 │ │
│ • 停机统计 │ │
│ • 告警统计 │ │
├────────────────────────────┼────────────────────────────────────┤
│ 单 Worker 顺序执行 │ 单线程 + 分组聚合器 │
│ 分布式锁保证唯一性 │ 唯一性(5min 内不重复) │
│ 自动重试(最大3次) │ 成功任务保留7天 │
└────────────────────────────┴────────────────────────────────────┘
基于 Redis Stream + Consumer Group 的自研任务队列:
生产端 消费端
────── ──────
EnqueueTask(type, payload) startTaskQueueWorker()
│ │
▼ ▼
Redis XADD ──────────────→ XREADGROUP (阻塞读取)
(stream: fwh_task_queue) │
▼
handleTaskQueueMsg()
│ (按 type 路由)
▼
handleTaskBatchDownload()
handleTaskSiteAnalysis()
handleTaskSiteInfoUpdate()
handleTaskShutdownStatistics()
handleTaskAlarmStatistics()
| 特性 | 说明 |
|---|---|
| 单 Worker | 顺序执行,避免任务冲突 |
| 唯一任务锁 | EnqueueUniqueTask 通过 Redis 分布式锁保证同类任务不重复 |
| 自动重试 | 最大 3 次,通过 XAutoClaim 检测滞留消息 |
| 状态管理 | pending → running → complete/failed/error |
| 进度追踪 | MongoDB 记录 Progress 字段 |
| 常量 | 处理函数 | 描述 |
|---|---|---|
task_BatchDownload |
handleTaskBatchDownload |
批量数据下载 |
task_SiteAnalysis |
handleTaskSiteAnalysis |
站点数据分析 |
task_SiteInfoUpdate |
handleTaskSiteInfoUpdate |
全量同步站点信息 |
task_ShutdownStatistics |
handleTaskShutdownStatistics |
停机统计 |
task_AlarmStatistics |
handleTaskAlarmStatistics |
告警统计 |
┌─────────┐ 入队 ┌─────────┐ Worker消费 ┌─────────┐
│ 创建 │ ─────────→ │ Pending │ ──────────────→ │ Running │
└─────────┘ └─────────┘ └────┬────┘
│
┌──────────────────────────┼──────────────────┐
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│ Complete │ │ Failed │ │ Error │
│ (全部成功) │ │ (部分失败) │ │ (异常) │
└──────────┘ └──────────┘ └──────────┘
基于 hibiken/asynq 的分布式任务队列:
定时调度 (每天 UTC 23:00)
│
▼
SyncOnePage(page=0) → 处理数据 → 创建聚合任务
│ │
▼ ▼
SyncOnePage(page=1) → 处理数据 → 创建聚合任务
│ │
... ▼ (聚合器收集)
│ ┌──────────────────┐
▼ │ AggregatorManager│
最后一页完成 │ (30s宽限/5min最大)│
└────────┬─────────┘
│
▼
Bulk Write → MongoDB
| 参数 | 值 | 说明 |
|---|---|---|
| Concurrency | 1 | 单线程串行,控制 API 调用频率 |
| GracePeriod | 30s | 聚合宽限期 |
| MaxDelay | 5min | 最大等待时间 |
| MaxSize | 100 | 单次聚合最大任务数 |
| Uniqueness | 5min | 任务唯一性窗口 |
| Retention | 7d | 成功任务保留时间 |
// 处理第 N 页后自动创建第 N+1 页任务
func handleSyncOnePage(ctx, task) error {
data := fetchPage(page) // 调用外部 API
createAggregateTask(data) // 创建聚合任务
if hasNextPage {
enqueue(SyncOnePage{page+1}) // 链式创建下一页任务
}
return nil
}
type SchedulerManager struct {
utc *asynq.Scheduler // UTC
zh *asynq.Scheduler // Asia/Shanghai
sg *asynq.Scheduler // Asia/Singapore
la *asynq.Scheduler // America/Los_Angeles
ny *asynq.Scheduler // America/New_York
}
| Cron 表达式 | 时区 | 任务 | 状态 |
|---|---|---|---|
0 23 * * * |
UTC | SmartHub SIM 卡同步 | 启用 |
0 23 * * * |
UTC | Acceleronix SIM 卡同步 | 启用 |
0 5 * * * |
— | 告警统计 | 启用 |
35 15 * * * |
— | 停机统计 | 暂停 |
Jobs 层包含任务的具体执行逻辑:
callFwhFile.go)按 SN 分组 → 每个 SN 独立 Redis Stream 队列
→ 并行下载(EMS 日志需先"召唤"再下载)
→ 最大召唤重试 3 次
→ 下载完成写入 MinIO
saveBatchDownloadData.go)| 数据类型 | 输出格式 | 存储路径 |
|---|---|---|
| 功率流 | Excel + ECharts 图 | BatchDownloadData/{SN}/PowerFlow/{Date}.* |
| MQTT 日志 | Excel | BatchDownloadData/{SN}/MqttLog/{Type}/{Date}.xlsx |
| 事件告警 | Excel | BatchDownloadData/{SN}/EventAlarm/{Date}.xlsx |
| 告警快照 | Excel | BatchDownloadData/{SN}/AlarmSnapshot/{Date}.xlsx |
| 升级记录 | Excel | BatchDownloadData/{SN}/UpdateLog/... |
analysisSiteData.go)AnalysisSiteTimeline() — 生成时间线(离线/上线/告警/模式切换事件)AnalysisSiteRuntime() — 运行时数据分析(功率、SOC 趋势)StatisticsShutdown() — 停机统计(按 ALL/US/AU 区域分类)StatisticsAlarm() — 告警码统计(触发站点分析回调)8081FWH Pro 是 FranklinWH 核心业务平台,本系统通过 HTTP API 获取站点数据。
| 配置项 | 说明 |
|---|---|
| 域名 | 通过代理 energy.fwh-toolbox.top 访问 |
| OSS 域名 | energy-oss.fwh-toolbox.top(文件下载) |
| 认证 | 用户名 + MD5 密码登录,获取 Logintoken |
| 超时 | 3 分钟 |
| 重试 | 401 时自动 reLogin 后重试 |
// 泛型反序列化
FwhHttpGetUnmarshal[T](url, params) (*T, error)
FwhHttpPostUnmarshalPage[T](url, body) (*PageResult[T], error)
// 自动 Token 管理
// 请求头: Logintoken: <token>
// 401 响应 → 自动调用 Login() → 重新发送请求
| 分类 | 接口示例 | 说明 |
|---|---|---|
| 站点信息 | selectIotFirmwareGatewayList |
分页查询站点基础信息 |
selectIotGatewayList |
站点完整信息列表 | |
getGatewayTouListV2 |
站点 TOU 模式信息 | |
| 功率流 | 功率流查询接口 | 按天查询站点功率数据 |
| 告警 | QuerySiteAlarmList |
站点告警列表 |
QueryAlarmStatistics |
告警码统计 | |
QueryAlarmSnapshotInfo |
告警快照文件信息 | |
| 日志 | QueryMqttLogListOnTimeRange |
MQTT 日志(类型 0/101/201/357) |
QueryEventOrAlarmListOnTimeRange |
事件/告警日志 | |
QueryCallEmsLog |
召唤 EMS 日志 | |
QueryDownloadEmsLogFile |
下载 EMS 日志文件 | |
| 故障录波 | QueryFaultRecordList |
故障录波列表 |
QueryDownloadFaultRecordData |
下载录波数据 | |
| 升级 | QuerySystemUpdateLog |
系统升级记录 |
QueryAHubUpdateLog |
aHub 升级记录 | |
| TOU 模板 | QueryTouTemplateInfoList |
调度策略模板列表 |
QueryTouTemplateDetailInfo |
模板详情 | |
| Shutdown | QuerySiteShutdownList |
停机站点列表 |
// 批量查询 SIM 卡信息
smartHub.QueryBatchSimCardInfo(page, size) → []SmartHubSimCardInfo
| 字段 | 说明 |
|---|---|
| ICCID | SIM 卡标识 |
| IMEI/IMSI | 设备标识 |
| Status | 状态(TEST_READY/ACTIVATE_READY/ACTIVATED/DEACTIVATED/RETIRED) |
| DataUsage | 流量使用量 |
// SIM 卡列表
acceleronix.QuerySimCardList(page, size) → []AcceleronixSimCard
// 批量数据用量
acceleronix.QueryBatchSimCardDataInfo(ids, month) → []DataUsageInfo
外部平台数据经转换后统一存储为内部 domain.SimCardInfo 格式:
// 转换函数
SmartHubSimCardInfoToStorage(info) → domain.SimCardInfo
AcceleronixSimCardToStorage(info) → domain.SimCardInfo
| 方向 | 主题模式 | 说明 |
|---|---|---|
| 下行 | fwh/c2s/mng/{sn} |
服务端 → 设备(管理指令) |
| 上行 | fwh/s2c/mng/{sn} |
设备 → 服务端(响应) |
// Xlog 使能
fwh_mqtt.EnableXlog(ctx, sn string) error
// 主题: fwh/c2s/mng/{sn}
// 作用: 使能设备 Xlog 功能
// 故障录波参数设置
fwh_mqtt.FaultRecordParamSetting(ctx, para FaultRecordParamInfo) error
// 发送: cmdType=377 (参数设置指令)
// 等待: cmdType=378 (设备确认响应)
| 场景 | 存储路径 | 文件类型 |
|---|---|---|
| 批量下载数据 | BatchDownloadData/{SN}/{Type}/{Date}.* |
Excel、图表、tar.gz |
| 升级配置文件 | 配置的 Bucket + Key | Excel |
minio.Upload(bucket, key, filePath) error // 上传文件
minio.UploadFromReader(bucket, key, reader) error // 流式上传
minio.Download(bucket, key) (io.Reader, error) // 下载文件
minio.List(bucket, prefix) ([]ObjectInfo, error) // 列出文件
minio.Delete(bucket, key) error // 删除文件
minio.ExistsObject(bucket, key) (bool, error) // 检查存在
minio.PresignedURL(bucket, key, expires) (string, error) // 预签名URL
前端 → Casdoor 登录页 → 获取 Authorization Code
→ POST /auth/login {code, state}
→ 后端调用 casdoor.GetOAuthToken(code, state)
→ 获取 AccessToken + RefreshToken
→ 存入 Redis Session
→ 返回 SessionId + Tokens
main.go 启动流程:
1. config.LoadConfig() 加载 .env 配置
2. logger.Init(env) 初始化 Zap 日志
3. database.Init(&cfg.App) 连接 PostgreSQL + MongoDB
4. cache.Init(redisAddr) 连接 Redis (DB=12)
5. minio.InitClient(&cfg.App) 连接 MinIO 对象存储
6. repositories.FwhHttpInit() 初始化 FWH API 客户端
7. scheduler.Init() 注册 Cron 定时任务
8. task.InitTask(redisOpt) 启动 Asynq 异步任务系统
9. casdoor.InitAuthConfig() 配置 SSO 认证
10. repositories.FwhMqttInit() 连接 MQTT Broker
11. routes.Setup(app) 注册 Fiber 路由
12. networkEvents.InitEvio() 启动网络事件监听 (goroutine)
13. Asynqmon HTTP 服务 启动任务监控面板 (:8081)
14. fwh_pro.Login() 预登录 FWH 平台
15. app.Listen(":8301") 启动 HTTP 服务
16. Signal 监听 优雅关闭 (SIGTERM/SIGINT)
| 服务 | 用途 | 开发环境地址 |
|---|---|---|
| PostgreSQL | 本地业务数据 | 本地 |
| MongoDB | 文档型数据存储 | 127.0.0.1:27017 |
| Redis | 缓存 + 任务队列 | localhost:6379 |
| MinIO | 对象存储 | localhost:9198 |
| MySQL (FWH Pro) | 站点数据(只读) | AWS RDS |
| Casdoor | SSO 认证 | 独立部署 |
| MQTT Broker | 设备通信 | TLS 连接 |
# 编译 + 部署
cmd/deploy.sh
# 仅编译
cmd/only_build.sh
# 查看日志
cmd/showLog.sh # 全部日志
cmd/showTodayLog.sh # 今日日志
cmd/showTodayErrorLog.sh # 今日错误日志
| 端口 | 服务 | 说明 |
|---|---|---|
| 8301 | Fiber HTTP | 主 API 服务 |
| 8081 | Asynqmon | 异步任务监控面板 |
| — | Evio | 网络事件监听(自定义端口) |
// 监听系统信号
quit := make(chan os.Signal, 1)
signal.Notify(quit, syscall.SIGTERM, syscall.SIGINT)
<-quit
// 关闭顺序:
// 1. 停止接收新请求
// 2. 等待进行中请求完成
// 3. 关闭数据库连接
// 4. 关闭 Redis 连接
// 5. 关闭 MQTT 连接
// 6. 停止定时任务
// 7. 停止异步任务 Worker
domain/ 中定义业务领域对象dto/ 中定义 API 请求/响应结构repositories/ 对应子目录中实现数据访问repositories/repositories.go 中暴露新方法services/ 中编写业务逻辑controllers/ 中处理 HTTP 请求routes/ 中创建路由文件并在 Setup() 中注册swag init 更新 Swagger 文档repositorieslogger.Log 或 zap.L() 记录结构化日志{模块名}{层级}.go(如 batchDownloadServices.go)GetBatchDownloadList)c.Context().SetBodyStreamWriter(func(w *bufio.Writer) {
// ZIP 打包 / 文件转发 / Excel 写入
io.Copy(writer, source)
w.Flush()
})
lock, ok, err := cache.TryLock(ctx, "task:"+taskType+":"+id, 2*time.Hour)
if !ok { return ErrTaskAlreadyRunning }
defer cache.LockRelease(ctx, key, lock.Token)
// 执行任务...
result, err := cache.GetOrSet[dto.SitePowerFlow](ctx, cacheKey,
func() (*dto.SitePowerFlow, error) {
return repositories.QuerySitePowerFlow(sn, date)
},
cache.WithTTL(24*time.Hour),
)
| cmdType | 方向 | 说明 |
|---|---|---|
| 0 | 上报 | 设备离线通知 |
| 101 | 上报 | 设备上线通知 |
| 201 | 上报 | 运行数据(功率/SOC/模式等 30+ 参数) |
| 357 | 上报 | 模式切换事件 |
| 377 | 下行 | 故障录波参数设置 |
| 378 | 上行 | 故障录波参数设置响应 |
| 数据库 | Schema/Database | 表/集合 |
|---|---|---|
| PostgreSQL | alarm_snapshot |
site_alarm_snapshot_file_record、site_alarm_snapshot_data |
| PostgreSQL | original |
site_original_data |
| MongoDB | FwhToolboxDbDev |
site_info、batch_download、site_analysis、auto_update_config、sim_card_info、shutdown_statistics、user_info、sites_monitor、site_tags 等 |
| MySQL | home_energy_storage_server |
iot_gateway(只读) |
| Redis | DB=12 | 会话(Hash)、缓存(String)、任务队列(Stream)、锁(String NX) |