3. 电子派工系统核心对象建模
电子派工系统能不能真正跑起来,关键不在界面好不好看,而在于底层对象模型是否立得住。派工的本质,是把“一批要做的事”和“一批能干这些事的人、机、位”在正确的时间窗口里匹配起来。如果工单、工序、工位、设备、人员、班组、班次、技能矩阵这八个对象没有清晰的数据结构和关系,派工就只能靠人工拍脑袋,系统顶多算个电子看板。本节把这八个对象拆开讲清楚,再说明它们之间靠什么字段互相咬合。
一、八个核心对象各自承载什么数据
工单(WorkOrder)是需求源头,代表一次生产任务。核心字段包括:工单号(唯一主键)、产品编码、计划数量、已完工数量、优先级、计划开工/完工时间、状态(待排产、已派工、生产中、暂停、完工、关闭)。工单本身不直接对应某个工位,它是一组工序的容器。
工序(Operation)是派工的最小执行单元,也是整个模型的中枢。一张工单按工艺路线拆成多道工序,每道工序有:工序号、工序名称、标准工时、准备工时、前置工序号(决定先后约束)、可选工位类型、所需技能等级、所需设备类型、数量(可分批)。派工实际派的是“工序”,不是“工单”。
工位(Workstation)是物理作业位置,如装配台、焊接位、检测台。字段有:工位编码、工位名称、所属产线/区域、工位类型、可承载设备、状态(空闲、占用、停用)。工位是“地点”,设备是“装在这个地点上的机器”,两者要分开建模,否则换设备时工位数据会被污染。
设备(Equipment)字段包括:设备编号、设备类型、型号、所在工位、状态(运行、待机、故障、保养)、当前加工能力参数(如节拍、精度等级)。设备与工位是多对一或一对一关系,一台设备同一时刻只能在一个工位。
人员(Employee)字段包括:工号、姓名、所属班组、当前班次、技能矩阵引用、当前状态(在岗、离岗、请假)、当前派工任务。人员是派工中被匹配的“能力载体”。
班组(Team)是人员的组织单元,字段有:班组编码、班组名称、班组长、成员列表、负责工位范围、负责工序类型。派工可以按人派,也可以按班组派,班组派工时由班组长二次分派到人。
班次(Shift)定义时间窗口,字段包括:班次编码(如早班A、中班B、夜班C)、开始时间、结束时间、跨天标志、所属日历。班次决定“什么时候可以派”,是派工的时间约束来源。
技能矩阵(SkillMatrix)是人员与工序能力之间的桥。典型结构是“人员 × 技能项”的二维表,每个交叉点记录等级(如0-未掌握、1-可辅助、2-独立操作、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 的主键是“人员+技能项”,同一技能只保留一条当前有效记录,历史记录归档到另一张表。