4. 设备效率数据模型设计

多工厂对标分析最容易失败的地方,不是指标算不出来,而是各工厂的“设备、产线、工厂、班次、产品”口径不一致:A厂把换型时间算进停机,B厂算进计划损失;A厂按自然班统计,B厂按生产班统计;同一台设备在MES里叫“CNC-01”,在报表里叫“加工中心1号”。因此,数据模型设计的目标不是先建一张大宽表,而是先建立一套可对齐、可追溯、可扩展的星型模型,让OEE及其损失项在统一语义下计算。

一、事实表:把OEE拆成可加与不可加两类度量

面向多工厂对标的事实表,建议以“设备-班次-产品”为最细粒度,命名为 fact_equipment_shift_oee。它记录的是某台设备在某班次生产某产品时的效率事件。核心字段包括:

  • 维度外键:factory_key、line_key、equipment_key、shift_key、product_key、date_key;
  • 可加度量:planned_time_min、run_time_min、down_time_min、setup_time_min、good_count、scrap_count、ideal_cycle_time_sec;
  • 不可加度量:availability_rate、performance_rate、quality_rate、oee_rate。

这里的关键设计是:比率类指标不落库为可加字段,而由可加度量在查询时计算。例如某工厂某班次:计划时间480 min,停机45 min,换型30 min,实际运行405 min,理论节拍12 s,实际产出1820件,其中不良36件。则:

可用率 = (480 - 45 - 30) / 480 = 84.38%
性能率 = (1820 × 12 / 60) / 405 = 89.88%
合格率 = (1820 - 36) / 1820 = 98.02%
OEE   = 84.38% × 89.88% × 98.02% ≈ 74.34%

如果直接存储74.34%,跨工厂汇总时会出现“比率平均”的错误;而保留分钟数和件数,就能按任意维度重新聚合。

二、维度表与层级关系:从集团到设备

维度表要解决“同一对象在不同系统中的编码统一”。建议建立五张主维度:dim_factory、dim_line、dim_equipment、dim_shift、dim_product。其中工厂-产线-设备构成三层层级,产线可跨工厂复用编码规则,但必须带工厂前缀。例如统一编码:

层级编码规则示例
工厂F + 两位序号F01、F02
产线工厂码 + L + 两位序号F01-L03
设备产线码 + E + 三位序号F01-L03-E007
班次工厂码 + S + 班次号F01-S1(白班)
产品P + 物料族 + 四位序号P-CNC-1024

层级关系必须显式写入维度表,而不是靠字符串截取。例如 dim_equipment 中保留 line_key 和 factory_key,这样即使设备调拨到新产线,也能通过缓慢变化维(SCD Type 2)保留历史归属,避免“设备现在属于哪条线”覆盖“当时属于哪条线”。

设备效率多工厂对标星型模型 事实表 fact_equipment_shift_oee planned_time / run_time down_time / setup_time good_count / scrap_count ideal_cycle_time_sec 工厂维度 dim_factory F01 / F02 / F03 产线维度 dim_line F01-L03 设备维度 dim_equipment F01-L03-E007 班次维度 dim_shift F01-S1 / F01-S2 产品维度 dim_product P-CNC-1024 日期维度 dim_date 2025-06-18 层级关系(SCD Type 2) 工厂 F01 └ 产线 F01-L03  └ 设备 F01-L03-E007   └ 班次 F01-S1    └ 产品 P-CNC-1024 时间模型 计划时间 480 min − 停机 45 min − 换型 30 min = 运行时间 405 min 统一编码:工厂→产线→设备→班次→产品

三、时间模型:计划时间、运行时间与班次边界

时间模型是OEE计算的地基。多工厂对标时,必须先定义“计划时间”的边界:是设备可用时间,还是排产时间?建议统一采用“计划生产时间 = 班次时长 − 计划停机(用餐、交接、保养)”,并明确换型时间属于计划损失还是停机损失。若A厂把换型算作停机,B厂算作计划损失,可用率会系统性偏差。因此,事实表中应把 setup_time_min 单独列出,而不是混入 down_time_min,这样对标时可按需重分类。

班次维度要支持跨零点。例如夜班22:00至次日06:00,应归属到开始日期,而不是自然日。否则同一班次会被拆到两天,导致设备效率日汇总失真。建议在 dim_shift 中记录 shift_start_time、shift_end_time、cross_midnight_flag,并在ETL中按“班次开始时间”落日期键。

四、主数据编码统一:从映射表到黄金记录

统一编码不是把各工厂编码改掉,而是建立“源编码→黄金编码”的映射。建议增加一张 map_equipment_code 表,字段包括:source_system、source_code、golden_equipment_key、effective_from、effective_to。例如MES中的“CNC-01”和报表中的“加工中心1号”都映射到 F01-L03-E007。当设备调拨时,通过 effective_from/to 保留历史归属,避免历史数据被新产线“污染”。

对标前先做一次“维度一致性检查”:同一设备在事实表中的 factory_key 是否与维度表当前归属一致;同一班次的计划时间是否等于班次时长减去计划停机;同一产品的理论节拍是否在各工厂间可比。这三项检查通过后,OEE差异才具备分析意义。

五、可落地的建表示例

以下给出事实表与设备维度的核心DDL片段,可直接作为建模起点:

CREATE TABLE fact_equipment_shift_oee (
  date_key            INT NOT NULL,
  factory_key         INT NOT NULL,
  line_key            INT NOT NULL,
  equipment_key       INT NOT NULL,
  shift_key           INT NOT NULL,
  product_key         INT NOT NULL,
  planned_time_min    DECIMAL(10,2),
  run_time_min        DECIMAL(10,2),
  down_time_min       DECIMAL(10,2),
  setup_time_min      DECIMAL(10,2),
  good_count          INT,
  scrap_count         INT,
  ideal_cycle_time_sec DECIMAL(10,3),
  PRIMARY KEY (date_key, equipment_key, shift_key, product_key)
);

CREATE TABLE dim_equipment (
  equipment_key       INT PRIMARY KEY,
  golden_code         VARCHAR(32) UNIQUE,
  equipment_name      VARCHAR(64),
  line_key            INT,
  factory_key         INT,
  equipment_type      VARCHAR(32),
  effective_from      DATE,
  effective_to        DATE,
  is_current          TINYINT
);

这样设计后,多工厂对标查询可以写成:按 factory_key 分组,用 SUM(run_time_min)/SUM(planned_time_min - setup_time_min) 计算可用率,用 SUM(good_count*ideal_cycle_time_sec/60)/SUM(run_time_min) 计算性能率,再相乘得到OEE。所有工厂在同一套语义下计算,差异才来自真实效率,而不是口径。

不要为了“看起来统一”而强行把各工厂的班次时长改成一样。班次时长是业务事实,应保留原值;统一的是计算口径和维度编码,而不是数据本身。对标时若发现某工厂计划时间明显偏低,应先核查其计划停机定义,再判断是否为真实效率差异。