第二章 工厂模型设计:工厂、车间、产线、工位的数据结构设计,层级关系与编码规则

做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 层级关系与数据关联

四层结构的关系,说白了就是一对多的父子关系。工厂下面有多个车间,车间下面有多条产线,产线下面有多个工位。

我画了一张图,帮你理解这个层级关系:

工厂模型四层架构图 工厂 (Factory) 编码: SH01 | 名称: 上海工厂 车间 (Workshop) 编码: SH01-WK01 | 装配车间 车间 (Workshop) 编码: SH01-WK02 | 机加车间 产线 (Line) 编码: ...AS01 | 装配线1 产线 (Line) 编码: ...AS02 | 装配线2 产线 (Line) 编码: ...MC01 | 机加线1 产线 (Line) 编码: ...MC02 | 机加线2 工位001 上料 工位002 装配 工位003 焊接 工位004 检测 工位005 包装 工位006 下料 工位007 清洗 工位008 入库 工厂 车间 产线 工位

从图上能看出来,每个层级都通过外键关联到上一层。查询的时候,从工位一路往上查,就能找到完整的组织路径。

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 - 包装工位。从工位一路追溯到工厂,路径清晰明了。

嗯,工厂模型设计这块,核心就是结构清晰、编码规范、层级分明。你按这个思路走,基本不会出大问题。