3. 电子派工系统核心对象建模

电子派工系统能不能真正跑起来,关键不在界面好不好看,而在于底层对象模型是否立得住。派工的本质,是把“一批要做的事”和“一批能干这些事的人、机、位”在正确的时间窗口里匹配起来。如果工单、工序、工位、设备、人员、班组、班次、技能矩阵这八个对象没有清晰的数据结构和关系,派工就只能靠人工拍脑袋,系统顶多算个电子看板。本节把这八个对象拆开讲清楚,再说明它们之间靠什么字段互相咬合。

一、八个核心对象各自承载什么数据

工单(WorkOrder)是需求源头,代表一次生产任务。核心字段包括:工单号(唯一主键)、产品编码、计划数量、已完工数量、优先级、计划开工/完工时间、状态(待排产、已派工、生产中、暂停、完工、关闭)。工单本身不直接对应某个工位,它是一组工序的容器。

工序(Operation)是派工的最小执行单元,也是整个模型的中枢。一张工单按工艺路线拆成多道工序,每道工序有:工序号、工序名称、标准工时、准备工时、前置工序号(决定先后约束)、可选工位类型、所需技能等级、所需设备类型、数量(可分批)。派工实际派的是“工序”,不是“工单”。

工位(Workstation)是物理作业位置,如装配台、焊接位、检测台。字段有:工位编码、工位名称、所属产线/区域、工位类型、可承载设备、状态(空闲、占用、停用)。工位是“地点”,设备是“装在这个地点上的机器”,两者要分开建模,否则换设备时工位数据会被污染。

设备(Equipment)字段包括:设备编号、设备类型、型号、所在工位、状态(运行、待机、故障、保养)、当前加工能力参数(如节拍、精度等级)。设备与工位是多对一或一对一关系,一台设备同一时刻只能在一个工位。

人员(Employee)字段包括:工号、姓名、所属班组、当前班次、技能矩阵引用、当前状态(在岗、离岗、请假)、当前派工任务。人员是派工中被匹配的“能力载体”。

班组(Team)是人员的组织单元,字段有:班组编码、班组名称、班组长、成员列表、负责工位范围、负责工序类型。派工可以按人派,也可以按班组派,班组派工时由班组长二次分派到人。

班次(Shift)定义时间窗口,字段包括:班次编码(如早班A、中班B、夜班C)、开始时间、结束时间、跨天标志、所属日历。班次决定“什么时候可以派”,是派工的时间约束来源。

技能矩阵(SkillMatrix)是人员与工序能力之间的桥。典型结构是“人员 × 技能项”的二维表,每个交叉点记录等级(如0-未掌握、1-可辅助、2-独立操作、3-可带徒)和有效期。技能项通常对应工序类型或设备操作资质。

二、对象之间的关系与关键约束

这八个对象不是平铺的,而是围绕“工序”形成两条链:一条是需求链——工单拆成工序,工序约束前后顺序;另一条是资源链——工位承载设备,班组包含人员,班次限定时间,技能矩阵决定人员能否胜任某工序。派工算法要做的,就是在资源链里找到满足工序约束的组合。

几个必须写进模型的硬约束:一道工序在同一时刻只能被派给一个工位/设备/人员组合;人员在同一班次内不能同时承担两道并行工序;设备故障时,挂在该设备上的工序必须回退到待派工状态;技能等级低于工序要求的人员不能被派工,除非有“师带徒”标记允许降级派工。

电子派工核心对象关系模型 工单 WorkOrder 工单号 · 产品 · 数量 优先级 · 计划时间 · 状态 工序 Operation 工序号 · 标准工时 · 前置工序 技能要求 · 设备类型 · 数量 1 : N 拆分 工位 Workstation 工位编码 · 类型 · 区域 状态 · 可承载设备 匹配工位类型 设备 Equipment 设备编号 · 型号 · 节拍 状态 · 所在工位 1 : N 承载 人员 Employee 工号 · 姓名 · 状态 所属班组 · 当前班次 班组 Team 班组编码 · 班组长 负责工位 · 工序类型 N : 1 归属 班次 Shift 班次编码 · 开始/结束时间 跨天标志 · 所属日历 技能矩阵 SkillMatrix 人员 × 技能项 等级 0-3 · 有效期 能力查询 等级 ≥ 要求 时间窗口约束 班组负责工位范围 派工匹配逻辑:工序 → 按工位类型找工位 → 工位绑定设备 → 按技能矩阵筛人员 → 按班次校验时间窗口 → 生成派工记录 硬约束:同一时刻一人一机一工位只能执行一道工序;技能等级不足不可派工;设备故障工序回退待派工

三、数据结构落地时的几个关键设计

第一,工序与工位类型用“类型匹配”而非“硬编码工位号”。如果工序表里直接写死“派到W03工位”,一旦W03停用,整条工艺路线就断了。正确做法是工序只声明“需要装配类工位”,派工时再动态查可用工位列表。

第二,技能矩阵要带有效期。员工上个月通过了焊接资质,不代表这个月还有效。技能矩阵记录“获得日期”和“失效日期”,派工前先校验当前日期是否在有效期内,过期技能视为等级0。

第三,班次与人员是多对多关系。一个人可能早班在A线、中班在B线,所以人员表里存“当前班次”只是快照,真正的排班关系应单独建“人员排班表”(工号、日期、班次编码、班组编码),派工时按日期+班次查在岗人员。

第四,工单状态与工序状态要分开。工单“生产中”不代表所有工序都在生产,可能第一道工序完工、第二道待派工。工序状态独立流转:待派工→已派工→加工中→完工→质检→关闭。工单状态由工序状态汇总计算得出,而不是手工改。

四、一个可参考的建表示例

以下以关系型数据库为例,给出核心表的关键字段定义(示例,非实际项目最终结构):

-- 工单表
WorkOrder(wo_id PK, product_code, plan_qty, done_qty,
          priority, plan_start, plan_end, status)

-- 工序表(派工最小单元)
Operation(op_id PK, wo_id FK, seq_no, op_name,
          std_hours, setup_hours, prev_op_id,
          ws_type, skill_code, skill_level, equip_type, qty)

-- 工位表
Workstation(ws_id PK, ws_code, ws_name, ws_type,
            area, status)

-- 设备表
Equipment(eq_id PK, eq_code, eq_type, model,
          ws_id FK, status, cycle_time)

-- 人员表
Employee(emp_id PK, emp_code, emp_name,
         team_id FK, status)

-- 班组表
Team(team_id PK, team_code, team_name, leader_id,
     ws_scope, op_type_scope)

-- 班次表
Shift(shift_id PK, shift_code, start_time,
      end_time, cross_day)

-- 人员排班表(人员×日期×班次)
EmpSchedule(emp_id FK, work_date, shift_id FK,
            team_id FK, PK(emp_id, work_date, shift_id))

-- 技能矩阵表
SkillMatrix(emp_id FK, skill_code, skill_level,
            valid_from, valid_to, PK(emp_id, skill_code))

建表时注意:工序表的 prev_op_id 指向同一工单内的上一道工序,形成链式约束;EmpSchedule 的主键是三元组,保证同一人同一天同一班次只有一条排班记录;SkillMatrix 的主键是“人员+技能项”,同一技能只保留一条当前有效记录,历史记录归档到另一张表。

建模自检口诀:工单拆工序、工序找工位、工位绑设备、人员归班组、班组排班次、技能定资格。六句话对应六条外键或关联关系,缺一条派工就会漏判。