SYSTEM ARCHITECTURE · V1.0

鑫潼智电系统 · 实现架构设计

基于《鑫潼智电系统需求分析报告 V1.0》,按功能模块拆解为后端、前端、小程序、APP 的完整系统实现架构。覆盖 ICC 平台 API 对接、数据隔离、权限控制等关键设计决策。

运营主体:鑫潼科技(单一运营方) 后端:Midway.js + TypeORM 前端:Vue3 + Ant Design Vue APP/小程序:uni-app 数据库:PostgreSQL
01

架构总览框图

五层架构 · 一图全局
运营管理平台 Web
运营管理 APP(业务员)
共享电工 APP
客户微信小程序
大华 ICC 外部
后端服务 Midway
权限控制
L1 客户端层 — 五端入口 不同角色访问不同端,运营方双端(Web + APP)
PC
运营管理平台
Vue3 + Ant Design Vue
  • 用户:运营管理员
  • 审批/配置/报表/系统设置
  • 全量数据查看与管理
  • RBAC 菜单级权限
APP
运营管理 APP
uni-app → iOS / Android
  • 用户:业务员(运营方)
  • 客户管理 / 项目跟进
  • 勘察/回访/现场巡查
  • 共享 sys_user 表 + 角色区分
APP
共享电工 APP
uni-app → iOS / Android
  • 用户:共享电工
  • 五类派单接单处理
  • 现场水印拍照取证上传
  • 领料管理 / 报酬查询
WX
客户微信小程序
uni-app → 微信小程序
  • 用户:客户(学校/医院)
  • 设备状态 / 用电统计查看
  • 报警信息 / 月度报告下载
  • 水电报修 / 服务评分
ICC
大华 ICC 平台
外部系统 · API 对接
  • 设备数据采集平台(厂家)
  • 网关/探测器设备管理
  • 设备运行状态 / 报警
  • 用电采集数据
▼
L2 接入网关层 — 统一入口 认证 · 路由 · 限流 · 数据权限拦截

统一鉴权

JWT 双 Token
多端统一登录态

API 路由分发

/admin · /ops · /worker
/customer 分组路由

接口数据权限

Interceptor 注入过滤
给什么数据看什么

限流与日志

rate-limiter
操作审计 winston

▼
L3 业务服务层 — Midway.js(Node.js + TypeScript + TypeORM) 10 个核心服务模块
👥

客户管理

客户/部门
建筑/房间
账号分配

📋

项目管理

勘察/方案
合同/安装
验收/回访

📡

设备管理

ICC 设备同步
线路分配
部门/房间映射

📮

派单管理

勘察/安装
报警/报修/维保
全生命周期

🔄

ICC 数据采集

定时拉取
队列缓冲
清洗映射

📊

统计报表

多维用电统计
月度报告生成
报酬计算

📸

取证文件

水印拍照取证
合同/验收存档
月报文件

🔔

消息通知

APP 推送
微信订阅消息
短信(按需)

⚙️

系统管理

用户/角色/菜单
数据字典
日志审计

🔐

认证授权

JWT 签发校验
微信 openid 登录
RBAC 权限

▼
L4 数据层 — 存储与缓存 逻辑隔离 + 时序分区 · 不做物理分库
🐘

PostgreSQL 主库

业务数据(customer_id 逻辑隔离)
用电采集数据(按月分区)
TypeORM + 声明式分区

⚡

Redis 缓存

JWT 会话 Token
数据字典/热点配置
BullMQ 队列底层

📁

对象存储 RustFS

取证照片(水印)
合同/验收/方案文件
月度报告文档
国产 · S3 兼容 · Apache 2.0

📬

BullMQ 消息队列

ICC 拉取数据缓冲
报警事件异步处理
基于 Redis 轻量级

▼
L5 外部系统对接层 仅 API 对接 · 不直接操作硬件
ICC
大华 ICC OpenAPI
HTTP REST · 主动拉取
  • 客户信息接口 → 每小时/事件触发
  • 设备信息接口(网关/探测器)→ 每小时
  • 用电采集数据接口 → 5~15 分钟
  • 设备报警数据接口 → 1 分钟
WX
微信开放平台
小程序登录 + 订阅消息
  • openid 登录授权
  • 订阅消息推送
  • 客户账号绑定
SMS
短信服务
阿里云短信(可选)
  • 客户初始密码通知
  • 报警短信提醒

🔒 权限控制方案(贯穿 L1 → L3)

运营管理平台(Web)— RBAC 菜单级
运营管理员:审批/配置/报表/系统设置,全量数据,全部菜单
运营管理 APP — 角色 + 数据权限
业务员:客户管理/项目跟进/勘察回访,按 salesman_id 过滤自己负责的数据
共享电工 APP — 接口级数据权限
接口按 worker_id 过滤:仅自己接的派单、个人报酬明细,给什么看什么
客户小程序 — 接口级数据权限
接口按 customer_id 过滤:仅本客户设备/用电/报警/月报/报修记录
02

总体分层架构(详细)

五层架构 · 自上而下数据流转
CLIENT客户端层 · 五端入口运营方双端(Web+APP),统一鉴权

运营管理平台(Web)

运营管理员使用:审批、配置、报表、系统设置

Vue3 + Ant Design Vue

运营管理 APP

业务员移动办公:客户管理、项目跟进、现场勘察回访

uni-app (iOS / Android)

共享电工 APP

共享电工接单、现场拍照取证、报酬查询

uni-app (iOS / Android)

客户微信小程序

客户查看用电/报警/月报、报修申请、评分

uni-app → 微信小程序

大华 ICC 管理平台

设备数据采集平台(厂家后台,非自研)· API 对接

外部系统 · HTTP REST
▼
GATEWAY接入网关层 · 统一入口认证、路由、限流、日志

统一鉴权服务

JWT Token 签发与校验,多端统一登录态

Midway Guard + JWT

API 路由分发

按端区分路由前缀:/admin · /ops · /worker · /customer

Midway Controller 分组

接口级数据权限

接口决定可见数据范围,APP/小程序给什么看什么

Guard + Interceptor

限流与日志

常规 ERP 并发量,请求日志与操作审计

rate-limiter + winston
▼
SERVICE业务服务层 · Midway.js 核心模块按业务域划分,模块化服务

客户与项目模块

客户/部门/建筑/房间、勘察/方案/合同/验收/回访

Customer · Project Service

运营派单模块

报警派单、报修派单、维保派单、安装派单

Dispatch Service

设备与线路模块

设备信息同步、线路分配、设备状态管理

Device · Line Service

统计与报表模块

多维度用电统计、月度报告、共享电工报酬

Report Service

ICC 数据采集模块

定时拉取设备/报警/用电数据,缓冲写入

ICC Sync Service + 定时任务

取证与文件模块

现场拍照取证、合同/验收/方案文件存档

File Service + 对象存储

系统管理模块

用户、角色、菜单权限(RBAC)、字典、日志

System Service

消息通知模块

报警推送到 APP、派单提醒、微信消息

Notify Service
▼
DATA数据层 · 存储与缓存逻辑隔离 + 时序分区,不做物理分库

PostgreSQL 主库

业务数据(逻辑隔离)+ 用电采集数据(按月分区)

TypeORM + 声明式分区

Redis 缓存

会话 Token、数据字典、热点配置、限流计数

ioredis

对象存储

取证照片、合同/验收/方案电子文件、月度报告

RustFS(国产 · S3 兼容)

消息队列

ICC 拉取数据缓冲、报警事件异步处理

BullMQ (Redis 队列)
▼
EXTERNAL外部系统对接层仅 API 对接,不直接操作硬件

大华 ICC OpenAPI

设备信息、设备状态、报警数据、用电采集数据

HTTP REST · 主动拉取

微信开放平台

小程序登录授权(openid)、消息订阅推送

微信登录 + 订阅消息

短信服务(可选)

客户账号初始密码、报警短信通知(按需)

阿里云短信

智电终端设备

网关/探测器 → ICC 平台采集 → 鑫潼系统拉取

不直接对接

架构设计要点

① 不直接对接硬件:所有设备数据通过大华 ICC 平台 API 拉取,鑫潼系统只做数据消费方。② 五端共享一套后端:Midway.js 统一提供 /admin(Web管理台)、/ops(运营APP)、/worker(电工APP)、/customer(小程序)四组路由,避免重复开发。③ 运营方双端同一套账号:运营管理平台(Web)和运营管理 APP(业务员)共用 sys_user 表,通过角色区分权限,共用 RBAC 体系。④ ICC 内部虽实时推送,但鑫潼侧采用主动拉取,通过定时任务按采集频次拉取,进入 BullMQ 队列缓冲后写入分区表。

03

技术栈选型

含数据库选型建议
层级技术选型版本/说明选型理由
后端框架Midway.jsNode.js · IoC + TypeORM阿里出品,TypeScript 原生支持,装饰器风格,模块化清晰
前端框架Vue 3 + Ant Design VueComposition APIAntDV 组件丰富,适合中后台 ERP 型管理系统
共享电工 APPuni-app跨 iOS / Android一套代码多端发布,共享电工端仅需移动 App
运营管理 APPuni-app跨 iOS / Android业务员移动办公,共用 sys_user 表,复用 uni-app 技术栈
小程序uni-app → 微信小程序客户端使用复用 uni-app 技术栈,降低学习成本
数据库PostgreSQL15+时序数据分区成熟、多维聚合分析强、JSONB 灵活(详见下方对比)
ORMTypeORMMidway 内置集成与 Midway 深度集成,支持 PostgreSQL 分区表
缓存Redis7.x会话、字典缓存、限流、BullMQ 队列底层
消息队列BullMQ基于 Redis轻量级,无需额外引入 Kafka,满足常规 ERP 并发
对象存储RustFS(国产)S3 兼容 · Apache 2.0取证照片、合同/验收文件、月度报告存档,替代 MinIO
鉴权JWT双 Token 刷新多端统一,无状态易扩展

数据库选型对比:PostgreSQL vs MySQL

基于本系统的数据特征(时序用电数据 + 多维统计报表 + ICC 灵活设备数据)进行对比。

推荐

PostgreSQL

v15+ · 开源 · 对象关系型
  • ✓声明式分区成熟,用电采集数据按月分区查询性能优
  • ✓窗口函数/CTE/物化视图,多维统计(部门/楼栋/楼层/房间)能力强
  • ✓JSONB 类型存储 ICC 灵活设备数据,支持索引查询
  • ✓Midway + TypeORM 完整支持,迁移成本低
  • ✓行级安全(RLS)可选,未来可做更细数据隔离

MySQL

v8.x · 开源 · 关系型
  • △分区功能有但不如 PG 灵活,大表管理偏弱
  • △聚合分析能力可用,但复杂多维统计不如 PG
  • △JSON 类型有但查询和索引能力弱于 JSONB
  • ✓国内团队更熟悉,运维资源好找
  • △月度报告按部门/楼栋统计时性能不如 PG

结论:推荐 PostgreSQL

本系统最核心的数据特征是用电采集数据持续增长(时序)和月度报告多维统计。PostgreSQL 的声明式分区能直接解决您担心的"数据量暴涨"问题——按月分区后,单表数据被切分为多个物理子表,查询只扫描相关分区,性能稳定。配合物化视图预聚合月度统计,即使客户和设备数量增长,报表查询依然高效。

04

五端功能模块拆解

后端 · Web前端 · 运营APP · 电工APP · 小程序
BE

后端服务(Midway.js)

五端共享 · 统一 API

客户管理服务

客户信息(省市县分类)、客户部门、客户访问账号分配

项目管理服务

建筑/房间、勘察派单、智电方案、合同、安装、验收、回访

设备管理服务

ICC 设备信息同步、智电设备/网关/探测器、线路分配(部门/房间)

派单管理服务

勘察/安装/报警/报修/维保五类派单全生命周期管理

ICC 数据采集服务

定时拉取设备/报警/用电数据,队列缓冲,写入分区表

统计报表服务

按部门/楼栋/楼层/房间维度用电统计,月度报告生成,报酬计算

取证文件服务

现场拍照取证(水印)、合同/验收/方案/月报文件存档

消息通知服务

APP 推送(报警/派单)、微信订阅消息、短信(按需)

系统管理服务

用户/角色/菜单(RBAC)、数据字典、操作日志、定时任务

认证授权服务

JWT 签发校验、微信 openid 登录、接口级数据权限拦截

PC

运营管理平台(Web 前端)

运营管理员

运营工作台

全局数据概览、报警总览、派单总览、待办事项

审批与配置

方案审批、合同审批、派单规则配置、数据字典

运营派单

报警派单(从 ICC 拉取报警)、报修派单、维保派单、评分管理

设备监控

设备列表、线路分配(部门/房间)、设备状态、报警查询

统计报表

多维度用电统计、月度报告生成下载、共享电工报酬统计

系统管理

用户/角色/菜单权限配置、员工管理、日志审计

APP

运营管理 APP(uni-app)

业务员(运营方)

客户管理

客户档案查看、联系人管理、客户项目列表(和后台功能一致,移动端适配)

项目管理

项目跟进、勘察任务、方案查看、合同查看、验收与回访

派单查看

负责客户的派单进度跟踪、报警处理进度、报修处理进度

现场巡查

现场拍照记录、巡查日志提交、问题上报

消息通知

派单提醒、报警推送、客户消息、系统通知

我的

个人信息、修改密码、负责客户统计、业绩查看

APP

共享电工 APP(uni-app)

共享电工

派单接收

勘察/安装/报警/报修/维保五类派单推送与接单确认

领料管理

安装派单自动生成设备/耗材领用单,领料确认

现场处理

配电井/箱位置记录、按标准流程处置、水印拍照取证上传

任务提交

处理完成后照片上传、提交派单、查看历史任务

报酬查询

月度派单完成统计、单笔/月度收入明细查询

客户回访

业务员回访记录上传(拍照+意见)

WX

客户微信小程序(uni-app)

客户(学校/医院等)

设备状态查看

所属设备在线状态、线路用电实时数据

报警信息

设备报警记录查询、处理进度跟踪

用电统计

按部门/楼栋/楼层/房间多维度用电查询、节电情况

月度报告

当月用电统计查看、用电及改善报告文件下载

报修申请

水电问题报修提交(描述+拍照)、报修进度查询

服务评分

报修/维保派单完成后对共享电工评分

ICC

大华 ICC 平台(外部)

API 对接 · 非自研

客户信息接口

ICC 录入意向客户 → 推送到运营管理平台

设备信息接口

网关/探测器设备数据同步到运营管理平台

设备数据采集接口

用电实时数据按采集频次同步拉取

设备报警接口

设备运行状态、预警类型、报警数值拉取

05

ICC 平台对接架构

主动拉取 · 队列缓冲 · 分区写入

对接方式说明

ICC 平台内部是实时推送机制,但鑫潼系统侧采用主动拉取(定时任务调 ICC OpenAPI)。ICC 接口文档待研究,当前按通用 REST API 模式设计,后续接入时按实际文档调整鉴权方式(AppKey/Token)和接口字段。

flowchart LR subgraph ICC ["大华 ICC 平台(外部)"] A1["客户信息"] A2["设备信息
网关/探测器"] A3["用电采集数据
(按频次)"] A4["设备报警数据"] end subgraph SYNC ["鑫潼 ICC 采集服务"] T1["定时任务调度
不同频次拉取"] Q1[("BullMQ 队列
数据缓冲")] P1["数据清洗与映射
设备码 → 线路 → 客户"] end subgraph DB ["数据层"] D1[("业务表
设备/线路/客户")] D2[("用电采集分区表
按月分区")] D3[("报警表")] end subgraph BIZ ["业务消费"] B1["报警派单服务
实时推送 APP"] B2["统计报表服务
多维聚合"] B3["月度报告生成"] end A1 -->|"HTTP API 拉取"| T1 A2 -->|"HTTP API 拉取"| T1 A3 -->|"HTTP API 拉取
高频(如5分钟)"| T1 A4 -->|"HTTP API 拉取
中频(如1分钟)"| T1 T1 --> Q1 Q1 --> P1 P1 --> D1 P1 --> D2 P1 --> D3 D3 --> B1 D2 --> B2 D2 --> B3 style ICC fill:#f1f5f9,stroke:#475569,stroke-width:2px style SYNC fill:#ecfdf5,stroke:#0d9488,stroke-width:2px style DB fill:#fffbeb,stroke:#e0852b,stroke-width:2px style BIZ fill:#eff6ff,stroke:#1d6fff,stroke-width:2px
拉取数据拉取频次(建议)写入目标消费方
客户信息事件触发 / 每小时业务表客户管理模块
设备信息(网关/探测器)每小时设备表 + 线路表设备管理模块
用电采集数据5~15 分钟(按 ICC 采集频次)用电采集分区表(按月)统计报表 / 月度报告
设备报警数据1 分钟报警表报警派单服务 → APP 推送
06

数据隔离方案

逻辑隔离 + 时序分区 · 不做物理分库

核心决策:是否需要多租户 / 分库?

鑫潼是唯一运营主体,客户(学校/医院)是平台上的数据主体而非独立租户,因此不需要严格多租户架构。采用逻辑隔离(customer_id 行级隔离)+ 时序数据按月分区的混合方案,兼顾性能与运维成本。

业务数据 · 逻辑隔离 customer_id

客户、合同、派单、设备等业务表数据量有限,通过 customer_id 字段 + 索引隔离。

C001 客户A · 合同 · 派单 · 设备
C002 客户B · 合同 · 派单 · 设备
C003 客户C · 合同 · 派单 · 设备
... 共享同一张表,行级隔离

用电采集数据 · 按月分区 RANGE BY 采集时间

数据量增量大头。按采集时间分区,查询只扫描相关月份分区,性能稳定。

electricity_2026_05 · 分区子表
electricity_2026_06 · 分区子表
electricity_2026_07 · 分区子表
electricity_2026_08 · 分区子表(当前)
历史分区可归档,不影响热数据查询
方案是否采用适用数据理由
逻辑隔离(customer_id 行级)采用业务数据(客户/合同/派单/设备)数据量有限,索引隔离足够,支持跨客户运营统计
时序数据按月分区采用用电采集数据解决数据量暴涨问题,查询只扫相关分区
物理分库(每客户独立库)不采用—运维成本高,跨客户统计困难,无合规强制要求
独立 Schema 隔离不采用—增加复杂度但收益有限,逻辑隔离已满足
严格多租户(Tenant 模型)不采用—鑫潼是单一运营方,客户非独立租户

关于"数据量暴涨影响性能"的回应

数据增长的大头是用电采集数据(每条线路按采集频次持续写入),而非业务数据。业务数据(客户/合同/派单)即使客户增长到上千家,数据量仍在百万级以内,逻辑隔离 + 索引完全够用。用电采集数据通过按月分区 + 物化视图预聚合月度统计,即使积累数年数据,查询也只扫描目标月份分区,性能可控。不需要物理分库。

07

权限控制方案

后台 RBAC 菜单级 · APP/小程序接口级

权限设计原则

现阶段权限粗放管理:运营方双端(Web + APP)共用 sys_user 表,采用 RBAC 菜单级权限(角色绑定菜单/按钮);共享电工 APP 和客户小程序的数据权限由接口定义——接口返回什么数据,端上就只能看到什么数据,不在端上做复杂权限判断。

权限流转链路

STEP 1

用户登录

运营方双端:账号密码(sys_user)
电工APP:账号密码(worker)
小程序:微信 openid

→
STEP 2

JWT 签发

Token 携带:userId、user_type、role、customerId
双 Token 刷新

→
STEP 3

菜单/路由权限

运营方双端:RBAC 角色 → 菜单
电工APP/小程序:固定功能页

→
STEP 4

接口数据权限

接口根据 user_type + role 过滤数据
给什么看什么

角色与权限矩阵

角色使用端账号表菜单权限(RBAC)接口数据权限
运营管理员运营管理平台(Web)sys_user全部菜单:工作台/审批/派单/设备/报表/系统管理全量数据,所有客户和派单
业务员运营管理平台(Web)+ 运营管理 APPsys_user客户/项目/派单查看/报表查看(按需配置)仅自己负责的客户(salesman_id 过滤)
共享电工共享电工 APPworker—(APP 固定功能页)仅分配给自己的派单、个人报酬明细
客户微信小程序customer_account—(小程序固定功能页)仅本客户设备/用电/报警/月报/报修记录

接口级数据权限实现要点

① 共享电工:查询派单接口自动按 worker_id = 当前用户 过滤;报酬接口只返回本人数据。② 客户:查询设备/用电/报警接口自动按 customer_id = 当前客户 过滤;报修只能提交本客户的。③ 业务员(运营管理 APP + Web):查询客户/项目/派单接口按 salesman_id = 当前用户 过滤,只能看自己负责的客户数据(运营管理员不受限)。④ 运营方双端共用一套 RBAC:Web 管理台和运营管理 APP 共用 sys_user 表 + 角色体系,菜单权限由后端统一返回,前端/APP 根据返回动态渲染。通过 Midway Interceptor 统一注入过滤条件,避免每个接口手动处理。

08

关键业务数据流

端到端数据流转
flowchart TB subgraph PHASE1 ["项目阶段"] P1["ICC 录入客户"] --> P2["运营平台配置建筑/房间"] P2 --> P3["APP 勘察派单
现场拍照"] P3 --> P4["运营平台制定方案"] P4 --> P5["签订合同"] P5 --> P6["APP 安装派单
设备配置指向 ICC"] P6 --> P7["ICC 同步设备信息
到运营平台"] P7 --> P8["线路分配部门/房间"] P8 --> P9["分配客户访问账号"] P9 --> P10["项目验收"] end subgraph PHASE2 ["运营阶段"] O1["ICC 报警数据"] -->|"定时拉取"| O2["运营平台生成报警派单"] O2 --> O3["APP 推送接单"] O3 --> O4["现场处置拍照"] O4 --> O5["运营管理员评分"] M1["客户小程序报修"] --> M2["运营平台生成报修派单"] M2 --> M3["APP 接单处理"] M3 --> M4["客户小程序评分"] R1["ICC 用电数据"] -->|"定时拉取"| R2["分区表存储"] R2 --> R3["多维统计聚合"] R3 --> R4["月度报告生成"] R4 --> R5["小程序下载查看"] end P10 --> O1 P10 --> M1 P10 --> R1 style PHASE1 fill:#eff6ff,stroke:#1d6fff,stroke-width:2px style PHASE2 fill:#ecfdf5,stroke:#0d9488,stroke-width:2px
09

设计假设清单

已采用的假设 · 如需调整请告知
假设项假设内容来源
运营主体鑫潼为唯一运营方,不做白标输出用户确认
多租户不需要严格多租户,采用逻辑隔离用户确认 + 架构建议
分库不做物理分库,用电数据按月分区架构建议(解决数据量问题)
ICC 对接主动拉取(定时任务),非 ICC 推送用户确认
ICC 接口文档待研究,按通用 REST API 模式预留用户确认
后台权限RBAC 菜单级,现阶段粗放管理用户确认
APP/小程序数据权限接口定义数据范围,给什么看什么用户确认
共享电工 APP 技术栈uni-app 跨 iOS/Android用户确认
运营管理 APPuni-app,业务员使用,功能与后台一致,共用 sys_user 表用户确认
客户小程序微信小程序,运营后台分配账号用户确认
子账号待定,当前按单账号预留扩展用户确认(待定)
电子签章不需要,但需取证拍照(水印)用户确认
并发量常规 ERP 级,无需特殊高并发架构用户确认
数据库PostgreSQL(架构建议,用户待定)架构建议
消息队列BullMQ(Redis 基础),不引入 Kafka架构建议(匹配并发量)
后端框架Midway.js + TypeORM用户确认
前端框架Vue3 + Ant Design Vue用户确认