第二章 工厂模型设计:工厂、车间、产线、工位的数据结构设计,层级关系与编码规则
做MES这么多年,我见过太多项目在工厂模型上栽跟头。说白了,工厂模型就是MES系统的骨架。骨架歪了,后面再怎么填肉都别扭。今天咱们就聊聊这个骨架怎么搭才结实。
2.1 工厂模型的四层架构
工厂模型通常分四层:工厂、车间、产线、工位。这四层不是拍脑袋定的,而是跟实际物理布局和业务流程一一对应。
我习惯把这四层理解成俄罗斯套娃——每一层都包含下一层,但每层又有自己的独立属性。举个例子,一个工厂可能有多个车间,一个车间有多条产线,一条产线又有多个工位。
核心原则:每一层只关心自己这一层的事,不越级管理。工位只管干活,产线管调度,车间管协调,工厂管全局。
这里有个坑,我踩过。有一次项目里,客户非要把工位直接挂在工厂下面,说这样查询快。结果呢?产线调度逻辑全乱了,工单流转根本走不通。后来老老实实改回四层结构,问题才解决。
2.2 数据结构设计
先看每层的数据结构长什么样。我直接给出一套经过实战检验的表结构设计。
2.2.1 工厂表(Factory)
CREATE TABLE Factory (
FactoryID VARCHAR(20) PRIMARY KEY, -- 工厂编码
FactoryName NVARCHAR(100) NOT NULL, -- 工厂名称
Address NVARCHAR(200), -- 地址
Status TINYINT DEFAULT 1, -- 状态:1启用 0停用
CreateTime DATETIME DEFAULT GETDATE()
);
工厂编码我建议用两位字母加两位数字,比如SH01代表上海工厂。为什么这么设计?你想想看,字母代表区域,数字代表序号,一目了然。
2.2.2 车间表(Workshop)
CREATE TABLE Workshop (
WorkshopID VARCHAR(20) PRIMARY KEY, -- 车间编码
WorkshopName NVARCHAR(100) NOT NULL, -- 车间名称
FactoryID VARCHAR(20) NOT NULL, -- 所属工厂
Manager NVARCHAR(50), -- 车间主任
Area DECIMAL(10,2), -- 面积(平方米)
FOREIGN KEY (FactoryID) REFERENCES Factory(FactoryID)
);
车间编码我习惯用工厂编码加两位序号,比如SH01-WK01。这样一看编码就知道是哪个工厂的哪个车间。
2.2.3 产线表(ProductionLine)
CREATE TABLE ProductionLine (
LineID VARCHAR(20) PRIMARY KEY, -- 产线编码
LineName NVARCHAR(100) NOT NULL, -- 产线名称
WorkshopID VARCHAR(20) NOT NULL, -- 所属车间
LineType TINYINT, -- 产线类型:1流水线 2单元线 3柔性线
Capacity INT, -- 设计产能(件/班)
Status TINYINT DEFAULT 1,
FOREIGN KEY (WorkshopID) REFERENCES Workshop(WorkshopID)
);
产线编码我推荐用车间编码加两位字母加两位数字,比如SH01-WK01-AS01。字母代表产线类型,AS是Assembly(装配)的缩写。
2.2.4 工位表(Workstation)
CREATE TABLE Workstation (
StationID VARCHAR(20) PRIMARY KEY, -- 工位编码
StationName NVARCHAR(100) NOT NULL, -- 工位名称
LineID VARCHAR(20) NOT NULL, -- 所属产线
StationType TINYINT, -- 工位类型:1人工 2半自动 3全自动
EquipmentID VARCHAR(20), -- 关联设备编号
SequenceNo INT NOT NULL, -- 工位顺序号
FOREIGN KEY (LineID) REFERENCES ProductionLine(LineID)
);
工位编码我习惯用产线编码加三位数字,比如SH01-WK01-AS01-001。三位数字代表工位在产线上的顺序位置。
我的经验:工位顺序号SequenceNo一定要单独设计字段,不要用编码里的序号代替。为什么?因为产线调整时,工位顺序可能变,但编码最好不变。顺序号单独维护,灵活得多。
2.3 层级关系与数据关联
四层结构的关系,说白了就是一对多的父子关系。工厂下面有多个车间,车间下面有多条产线,产线下面有多个工位。
我画了一张图,帮你理解这个层级关系:
从图上能看出来,每个层级都通过外键关联到上一层。查询的时候,从工位一路往上查,就能找到完整的组织路径。
2.4 编码规则设计
编码规则这事,我吃过不少亏。一开始觉得随便定个规则就行,后来发现编码设计不好,后面报表统计、权限控制、数据追溯全都会出问题。
我总结了一套编码规则,供你参考:
| 层级 | 编码格式 | 示例 | 说明 |
|---|---|---|---|
| 工厂 | AA + NN | SH01 | 2位区域字母 + 2位序号 |
| 车间 | 工厂编码 + "-" + AA + NN | SH01-WK01 | WK=Workshop,后跟序号 |
| 产线 | 车间编码 + "-" + AA + NN | SH01-WK01-AS01 | AS=Assembly,后跟序号 |
| 工位 | 产线编码 + "-" + NNN | SH01-WK01-AS01-001 | 3位数字,代表工位顺序 |
注意:编码一旦确定,尽量不要修改。我曾经有个项目,上线半年后客户要求改编码规则,结果所有历史数据都要重新清洗,工作量巨大。所以编码规则一定要在项目初期就定死。
2.5 实战中的避坑指南
做工厂模型设计,有几个坑我反复踩过,今天一并告诉你:
- 坑一:层级深度不一致。有的工厂只有两层,有的有四层。我建议统一按四层设计,哪怕某层暂时没有数据,也要保留结构。空着比没有强。
- 坑二:编码里带特殊含义。比如用编码表示产线类型、区域、负责人。一旦这些信息变了,编码就得改。我建议编码只做唯一标识,其他属性用字段存。
- 坑三:忽略虚拟工位。有些场景需要虚拟工位,比如质检工位、暂存工位。设计时就要预留虚拟工位的空间,不然后面加不进去。
- 坑四:工位顺序写死在编码里。我前面提过,顺序号单独用字段存,别跟编码绑死。产线调整是常有的事。
我的习惯:每次设计工厂模型,我都会先画一张物理布局图,跟客户确认每个工位的位置和顺序。确认无误后再开始建表。这一步省不了,省了后面全是坑。
2.6 数据查询示例
最后给一个实际查询的例子。假设我们要查某个工位所属的完整组织路径:
SELECT
f.FactoryName,
w.WorkshopName,
pl.LineName,
ws.StationName
FROM Workstation ws
JOIN ProductionLine pl ON ws.LineID = pl.LineID
JOIN Workshop w ON pl.WorkshopID = w.WorkshopID
JOIN Factory f ON w.FactoryID = f.FactoryID
WHERE ws.StationID = 'SH01-WK01-AS01-005';
这个查询返回的结果就是:上海工厂 - 装配车间 - 装配线1 - 包装工位。从工位一路追溯到工厂,路径清晰明了。
嗯,工厂模型设计这块,核心就是结构清晰、编码规范、层级分明。你按这个思路走,基本不会出大问题。