搅拌站ERP系统 — 系统总览与架构
本文档为某混凝土搅拌站ERP系统的总览与架构说明。
阅读顺序:01总览 → 02业务流程 → 03模块详解 → 04数据库分析
一、系统基本信息
| 项目 |
说明 |
| 系统名称 |
某混凝土搅拌站ERP系统 |
| 系统类型 |
SaaS多租户平台 |
| 数据库 |
MySQL(云RDS),每租户独立数据库 |
| 后端技术 |
C# .NET Framework 4.8,OWIN/Katana自托管HTTP服务 |
| 前端技术 |
React 15 + Redux + Ant Design 2.9 + Immutable.js |
| 实时通信 |
SignalR 2.3(ASP.NET SignalR) |
| 报表引擎 |
FastReport |
| 定时任务 |
Quartz.NET 2.3 |
| 移动端 |
微信企业号集成 + 移动APP接口 |
| 部署方式 |
后端Windows服务(WinForms宿主),前端Webpack构建静态资源 |
| 项目版本 |
Backend-2.0.6(后端),Frontend-2.0.6(前端) |
二、系统定位
本系统是一套面向混凝土搅拌站(商品混凝土企业)的综合管理平台,覆盖从销售签约、生产计划、拌合站调度、原材料采购、车辆运输、质量试验到财务结算的全业务链。系统采用SaaS架构,通过多租户数据库隔离方式为多家搅拌站提供服务。
行业术语
- 砼(tóng):混凝土的简称
- 配比:混凝土配合比,各原材料的用量比例
- 拌台:搅拌站的混凝土搅拌设备
- 砼令:混凝土生产任务单(生产指令)
- 回单:送货车辆返回后的签收确认单
三、技术架构
┌─────────────────────────────────────────────────────────────────────────┐
│ 用户层 (浏览器 - 仅支持Chrome) │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ 普通客户 │ │ 现场调度 │ │ 集团版本 │ │ 平台管理 │ │
│ │ (Full UI)│ │ (调度专用)│ │ (多站汇总)│ │ (Manager) │ │
│ └────┬─────┘ └────┬─────┘ └────┬─────┘ └────┬─────┘ │
│ └──────────────┴──────────────┴──────────────┘ │
│ Frontend-2.0.6 │
│ React 15 + Redux + Ant Design │
│ Immutable.js + ECharts + jQuery │
├─────────────────────────────────────────────────────────────────────────┤
│ 通信层 │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────────┐ │
│ │ REST API │ │ SignalR Hub │ │ 微信企业号API │ │
│ │ (jQuery AJAX)│ │ (WebSocket) │ │ (消息推送) │ │
│ └──────┬───────┘ └──────┬───────┘ └────────┬─────────┘ │
├──────────┴──────────────────┴──────────────────┴────────────────────────┤
│ Backend-2.0.6 后端服务 │
│ ┌────────────────────────────────────────────────────────────┐ │
│ │ SAPIServer (WinForms 宿主程序) │ │
│ │ ┌─────────┐ ┌──────────┐ ┌─────────┐ ┌───────────┐ │ │
│ │ │ 路由引擎 │ │ Session │ │ 文件服务 │ │ Cookie认证│ │ │
│ │ │(SAPIServ)│ │ (内存) │ │ (上传) │ │ (6h过期) │ │ │
│ │ └─────────┘ └──────────┘ └─────────┘ └───────────┘ │ │
│ ├────────────────────────────────────────────────────────────┤ │
│ │ Handler 层 │ │
│ │ Frame/ │ Headquarters/ │ Manufacture/ │ Market/ │ Bizz/ │ │
│ │ 核心框架 │ 平台管理 │ 生产制造 │ 销售 │ 业务 │ │
│ │ Lab/ │ General/ │ Special/ │ API/ │ │ │
│ │ 试验室 │ 报表统计 │ 特殊功能 │ 外部接口│ │ │
│ ├────────────────────────────────────────────────────────────┤ │
│ │ BLL 业务逻辑层 │ │
│ │ 定价策略(IPriceStrategy) │ 表达式解析器 │ 任务工作流 │ │
│ ├────────────────────────────────────────────────────────────┤ │
│ │ RE (Runtime Environment) 运行时环境 │ │
│ │ ┌──────────┐ ┌────────────┐ ┌──────────────┐ │ │
│ │ │ Battalion │ │ DataPool │ │ PollingRWD │ │ │
│ │ │ (租户实例)│ │ (数据缓存) │ │ (砼令调度) │ │ │
│ │ └──────────┘ └────────────┘ └──────────────┘ │ │
│ ├────────────────────────────────────────────────────────────┤ │
│ │ SignalR Hub │ Quartz.NET │ WeChat Connector │ │
│ │ (实时推送) │ (定时任务) │ (企业号集成) │ │
│ └────────────────────────────────────────────────────────────┘ │
├─────────────────────────────────────────────────────────────────────────┤
│ 数据层 │
│ ┌─────────────┐ ┌─────────────────────────────────────┐ │
│ │ 管理数据库 │ │ 租户数据库 (每个客户独立) │ │
│ │ mgt-main │ │ biz-cs-A / biz-cs-B / biz-cs-C │ │
│ │ mgt-bak │ │ biz-cs-D / biz-cs-E / ... │ │
│ │ (x008租户表) │ │ (~340张业务表) │ │
│ └─────────────┘ └─────────────────────────────────────┘ │
│ MySQL (云RDS) │
└─────────────────────────────────────────────────────────────────────────┘
四、多租户SaaS架构
4.1 租户管理
系统采用数据库级别的租户隔离,核心设计:
| 概念 |
说明 |
| 管理数据库 |
mgt-main / mgt-bak,存储平台级配置(租户列表、用户、权限、元数据等) |
| 租户数据库 |
每个搅拌站客户一个独立数据库(如 biz-cs-A A站、biz-cs-B B站) |
| 租户映射表 |
x008 表,存储租户ID→数据库连接的完整映射 |
| 租户实例 |
Battalion 对象,运行时为每个租户维护独立的连接池和数据缓存 |
4.2 x008 租户映射表核心字段
| 字段 |
含义 |
示例 |
| FID |
租户ID |
1, 2, 3 |
| FKhno |
客户编号 |
"0011", "cs01", "cs02" |
| FKhmc |
客户名称 |
具体搅拌站名称 |
| ENT |
企业类型 |
0=普通, 1=集团, 2=协会, 3=现场版 |
| FIp |
数据库服务器IP |
rm-xxxxx.mysql.rds.cloud.com |
| FDk |
数据库端口 |
3306 |
| FSjkmc |
数据库名称 |
biz-cs-A, biz-cs-B |
| FYhm |
数据库用户名 |
db-user |
| FMm |
数据库密码 |
(加密存储) |
| corpid |
微信企业号ID |
wxxxxxxxxxxxxxxxxx |
| secret |
微信企业号密钥 |
(加密) |
| Gpsx/Gpsy |
GPS坐标 |
经度/纬度 |
x008 实际数据示例:
| FID |
FKhno |
ENT |
FDk |
FSjkmc |
FYhm |
Gpsx |
Gpsy |
| 1 |
0011 |
0(普通) |
3306 |
mgt-main |
db-user |
NULL |
NULL |
| 2 |
cs01 |
0(普通) |
3306 |
biz-cs-A |
db-user |
1xx.xx |
3x.xx |
| 63 |
cs02 |
2(协会) |
3306 |
biz-cs-B |
db-user |
1xx.xx |
3x.xx |
| 81 |
cs03 |
1(集团) |
3306 |
biz-cs-C |
db-user |
0 |
0 |
4.3 ENT企业类型与前端视图映射
| ENT值 |
类型 |
前端视图 |
说明 |
| 0 |
普通客户 |
Full UI |
完整的任务+调度+管理界面 |
| 1 |
集团/协会 |
AssIndex |
多站点地图总览+汇总报表+预警 |
| 2 |
协会版 |
AssIndex |
同集团版 |
| 3 |
现场版 |
DispatchComp |
仅生产调度界面(拌台控制+车辆排队+发货) |
| Manager |
管理员 |
Manager |
平台管理后台(租户管理+权限+报表配置) |
4.4 运行时初始化流程
SAPIServer 启动
├── 读取 App.config 获取管理库连接
├── 启动 OWIN/Katana HTTP 服务
├── 启动 SignalR Hub (pushHub, taskHub)
├── RE.Main.Application_Start()
│ ├── 从 x008 加载所有租户记录
│ └── 为每个租户创建 Battalion 实例(独立线程)
│ ├── 建立MySQL连接
│ ├── 加载 BattalionDataPool (用户/部门/字典缓存)
│ └── 初始化微信连接器
├── 启动 Quartz.NET 定时任务
│ ├── 每日 4:00 AM 日报生成
│ ├── 每日 6:00 PM 晚间批处理
│ ├── 每日 00:01 日切操作
│ ├── 每30分钟 搅拌站速度计算
│ └── 每30分钟 订单统计
└── 启动 PollingRWD (砼令调度引擎)
五、后端架构详解
5.1 HTTP服务框架
服务使用自定义的 CustomSAPIService 框架,类似ASP.NET MVC但更轻量:
- 基于
[Action] 特性标注的方法路由
- Handler 基类提供
DbConn、Session、Parameters 等上下文
- URL模式:
/sapi/{handler}/{action}
5.2 Handler分组
系统将Handler按业务域分为以下组:
| 分组 |
说明 |
核心Handler |
| Frame |
核心框架 |
MainHandler, UserHandler, TaskHandler, FlowHandler, PermissionHandler, ClientHandler |
| Headquarters |
平台管理 |
BattalionHandler(租户生命周期), AuthorizeHandler, DeptHandler |
| Manufacture |
生产制造 |
CarHandler(车辆), TRwdHandler(砼令), TscjhHandler(生产计划), BCldHandler(称量), TJlbHandler(计量) |
| Market |
销售管理 |
XHtHandler(销售合同), XKhHandler(客户), XGcHandler(工程), XCpHandler(产品), XSkHandler(收款) |
| Bizz |
采购/物资 |
MaterialHandler, ProductHandler, BRkdHandler(入库), BCkdHandler(出库), TKcHandler(库存) |
| Laboratory |
试验管理 |
ScglHandler(试验管理), SfmhHandler(配比), ShntksHandler(抗渗), ShntkyHandler(抗压) |
| General |
报表统计 |
ReportHandler(日报), StatisticsHandler(统计), PrintHandler(打印), AnalysisHandler(分析) |
| API |
外部接口 |
ApiHandler(移动端), TcApiHandler(数据同步), DataReceiverHandler(拌站数据接收) |
5.3 核心中间件
| 组件 |
说明 |
| TaskManager |
任务工作流引擎,LRU缓存(最大10000条),支持创建/查询/锁定 |
| PriceBLL |
定价策略引擎,支持多因子定价(IPriceStrategy接口) |
| PollingRWD |
砼令调度引擎,管理生产任务排队、拌台分配、车辆调度 |
| FileLogger |
文件日志系统 |
| DataCacheTable |
自研数据缓存框架 |
5.4 SignalR实时通信
| Hub |
名称 |
功能 |
| pushHub |
推送Hub |
MCSC(满车生产)、SCSC(首车砂浆)、TDPP(拖动匹配)、通用设置推送 |
| taskHub |
任务Hub |
新任务通知、任务回退通知、生产调整通知、称重消息、刷新信号 |
5.5 外部集成
| 集成项 |
说明 |
| 微信企业号 |
消息推送、用户同步、部门管理、菜单管理 |
| 搅拌站PLC |
通过DataReceiverHandler接收拌站实时数据 |
| 移动APP |
ApiHandler提供Token认证的移动端接口 |
| 外部ERP |
TcApiHandler支持工程、合同、任务、回单数据同步 |
六、前端架构详解
6.1 技术栈
| 技术 |
版本 |
用途 |
| React |
15.3 |
UI框架 |
| Redux |
3.6 |
状态管理 |
| Immutable.js |
3.8 |
不可变数据,优化渲染性能 |
| Ant Design |
2.9 |
UI组件库 |
| ECharts |
3.6 |
图表可视化 |
| jQuery |
(外部) |
AJAX请求、DOM操作、SignalR客户端 |
| Webpack |
1.x |
构建打包 |
| react-loadable |
4.0 |
代码分割/懒加载 |
6.2 应用结构
Frontend-2.0.6/src/
├── entry/ # 入口 (index.js → container.jsx)
├── redux/
│ ├── store/ # Redux Store配置 (47个reducer)
│ ├── constants/ # Action Type常量 (6个文件)
│ └── actions/ # Action Creators (46个文件,异步thunk)
├── common/ # 公共工具
│ ├── common.js # AJAX封装(ajaxPost/ajaxGet)、Cookie、URL
│ ├── signalr.js # SignalR连接管理
│ ├── elements.js # 动态表单生成(元数据驱动)
│ ├── validator.js # 表单验证策略
│ └── getTaskDeatilFunc.jsx # 任务类型→组件映射
├── components/
│ ├── login/ # 登录页
│ └── index/ # 主界面
│ ├── client/ # 客户端视图
│ │ ├── header/ # 顶部导航、搜索、消息
│ │ ├── body/ # 主体内容
│ │ │ ├── myTask.jsx # 我的任务
│ │ │ ├── dispatchComp/ # 生产调度(4个子页)
│ │ │ ├── addTask/ # 新建任务
│ │ │ ├── setting/ # 系统设置
│ │ │ └── ...
│ │ ├── other/ # 38个业务类型组件
│ │ ├── productDispatch/ # 生产调度视图
│ │ ├── TX/ # 试验室模块(12个)
│ │ ├── association/ # 集团版(多站汇总)
│ │ └── board/ # 看板
│ └── manager/ # 平台管理后台
└── views/ # (未使用)
6.3 导航模式
系统不使用React Router,而是通过Redux状态驱动页面切换:
Redux State: currentComponent
├── 'Login' → <Login />
└── 'Index' → <Index />
├── ENT=Manager → <Manager /> (管理后台)
├── ENT=3 → <DispatchComp /> (现场调度)
├── ENT=1/2 → <AssIndex /> (集团版)
└── 普通 → Full UI (任务+列表+内容)
6.4 动态表单系统
系统采用元数据驱动的动态表单生成:
- 后端
x004 表定义任务类型(编号→名称→所属模块)
- 后端
t149 表定义每个任务类型的字段列表(字段名、类型、SQL数据源等)
- 前端
elements.js 根据元数据自动渲染表单控件
- 前端
getTaskDeatilFunc.jsx 将任务类型名称映射到对应的React组件
6.5 实时功能
| 功能 |
实现方式 |
| 新任务提醒 |
SignalR taskHub → 浏览器通知 + 百度TTS语音播报 |
| 生产数据推送 |
SignalR pushHub → 实时更新称重/车辆/生产状态 |
| 调度看板 |
ECharts + SignalR实时数据 → 产量/车辆/设备状态看板 |
七、部署架构
┌──────────────────────────────────┐
│ 用户浏览器(Chrome) │
│ http://xxx:9900 │
└──────────┬───────────────────────┘
│ HTTP/WebSocket
┌──────────▼───────────────────────┐
│ Nginx/静态文件服务 │
│ :9900 │
│ ┌────────────────────────────┐ │
│ │ 前端静态资源 │ │
│ │ (HTML/JS/CSS/图片) │ │
│ └────────────────────────────┘ │
└──────────┬───────────────────────┘
│ API代理
┌──────────▼───────────────────────┐
│ SapiServer (C#后端) │
│ :8885 │
│ /sapi/* → REST API │
│ /signalr → SignalR Hub │
└──────────┬───────────────────────┘
│ MySQL
┌──────────▼───────────────────────┐
│ MySQL (云RDS) │
│ :3306 │
│ 管理库: mgt-main, mgt-bak │
│ 租户库: biz-cs-* │
└──────────────────────────────────┘
八、关键技术特点
| 特点 |
说明 |
| 多租户数据隔离 |
每个搅拌站客户独立数据库,管理库统一管理租户注册信息 |
| 任务工作流引擎 |
可配置的多步骤审批流(新建→执行→审核),支持角色权限和并发锁控制 |
| 元数据驱动表单 |
通过数据库元数据配置动态生成前端表单,无需修改代码即可新增业务类型 |
| 实时调度系统 |
SignalR推送+轮询结合,实现生产看板、车辆调度、称重数据的实时展示 |
| 砼令调度引擎 |
PollingRWD自动化混凝土生产任务排队,基于拌台产能和区域车辆分配 |
| 多版本适配 |
同一前端代码支持普通版/现场版/集团版/管理版四种界面模式 |
| 微信企业号集成 |
消息推送、用户同步,支持移动端操作审批 |
| 定价策略模式 |
灵活的多因子定价引擎,支持不同客户/产品/项目的差异化定价 |
九、已发现的数据库列表
管理库
| 数据库 |
说明 |
| mgt-main |
管理库(主) |
| mgt-bak |
管理库(备) |
租户库
| 数据库 |
说明 |
| biz-cs-A |
A站 |
| biz-cs-B |
B站 |
| biz-cs-C |
C站 |
| biz-cs-D |
D站(集团) |
| biz-cs-E |
E站 |
| biz-cs-F |
F站 |
| biz-cs-G |
G站(协会) |
| biz-cs-H |
H站(协会) |
| biz-cs-I |
I站 |
| biz-cs-J |
J站 |
十、技术依赖一览
后端 (Backend-2.0.6)
| 依赖 |
版本 |
用途 |
| .NET Framework |
4.8 |
运行时 |
| Microsoft.Owin.SelfHost |
2.1.0 |
自托管HTTP |
| Microsoft.AspNet.SignalR |
2.3.0 |
实时通信 |
| MySql.Data |
6.9.8 |
MySQL连接 |
| Newtonsoft.Json |
8.0.3 |
JSON序列化 |
| Quartz |
2.3.3 |
定时任务 |
| Microsoft.Owin.Cors |
3.1.0 |
跨域支持 |
| CustomSAPIService |
(自研) |
HTTP路由框架 |
| CustomServiceUnit |
(自研) |
数据缓存 |
| FastReport |
(商业) |
报表生成 |
前端 (Frontend-2.0.6)
| 依赖 |
版本 |
用途 |
| React |
15.3 |
UI框架 |
| Redux |
3.6 |
状态管理 |
| Immutable.js |
3.8 |
不可变数据 |
| Ant Design |
2.9 |
UI组件 |
| ECharts |
3.6 |
图表 |
| jQuery |
(外部) |
AJAX/DOM |
| SignalR.JS |
2.2 |
实时通信客户端 |
| Webpack |
1.x |
构建打包 |
| Babel |
6.x |
ES6+转译 |