预排班锁定、同一天只能排一个班次、夜班后必须休息、每月夜班上限、节假日分配公平 —— 21 条规则沉淀在数据库里,按科室生效、可调权重、可解释。
首次适配递减生成初始解,延迟接受做局部搜索,另有模拟退火、禁忌搜索、变邻域下降等共 7 种接受器,在「硬分 + 软分」体系下迭代寻优。
「把王药师周三夜班换成李药师」「周五早班别排张药师」「下周三夜班先锁住」—— 改完用真实约束引擎前后各打一次分,确认后才落库。
面向医院药房与医药机构的排班管理系统,服务于药师排班 —— 早 / 中 / 夜班轮转、夜班后休息、连班上限、节假日均衡,配合排班规则、夜班配置与工作量均衡。
一键求解,公平性由约束保证,不必手工掰平。
规则集中管理,带生效范围、优先级与版本。
两级审批的线上换班;移动端「我的排班」。
工作区(租户)隔离,机构与账号统一管理。
科室 → 员工 → 技能 → 班次 → 班次成员授权 → 节假日 → 夜班配置
管理员锁定个别固定安排,求解时受硬约束保护,不会被改动
权重、适用范围、生效期、优先级
指定科室与日期范围
约束求解器生成方案,进度经 WebSocket 实时回推
偏差贪心调优:把偏高的夜班 / 工时往低了挪
校验通过后发布为正式排班
写入排班表,进入日历、分析与统计
用一句话调整,改动经真实约束引擎复核后落库
规则不是凭空写在代码里的,它由一组业务实体承载,并最终被翻译成求解器能执行的 21 条约束。下面的演示逐条展示每一条约束到底在拦什么。
员工(技能、不可用时段、工时上限、偏好、历史夜班/早班/周末计数)、技能、班次(起止时间、需求人数、必需技能、工作日与节假日人数)、班次成员授权、预排班、排班规则、节假日、夜班配置。
排班规则表按权重类规则读取 → 生成约束权重表 → 随方案一起交给求解器, 在本次求解中覆盖约束的默认权重。改一个权重,下一次排班立刻按新权重算,不需要重启服务。
公平性约束会把员工的历史累计量作为基线做「注水式」均衡 —— 避免同一个人月复一月被多排夜班,而不是简单粗暴地按当月平均一刀切。
| # | 约束名 | 业务含义 |
|---|
| # | 约束名 | 业务含义 |
|---|
ONE_HARD 罚分(违反即不可行),软约束用 ONE_SOFT 罚分或加分。
注意「夜班次日必须休息」与「排班窗口夜班上限」虽然名字像偏好,实际都是硬约束。
21 条约束按判定机制分成 9 组原型,同一原型的多条约束共用一张动画图,靠参数(阈值、人数、班次名、时段)区分具体场景。点击左侧任意一条规则即可切换动画。
求解器把 21 条规则拆成硬约束与软约束,在统一的「硬分 + 软分」体系下搜索。它不是逐个班次填表,而是从整体上权衡谁该多上夜班、谁的工时该少一点。下面的动画演示求解的两阶段,以及各类算法各自的工作方式。
快速生成一个可行的初始排班
在初始解附近不断改进分数
硬 14 软 7
队列 400 / 接受上限 1000,单次求解单线程
它不是一个通用聊天机器人,而是一个受规则约束的排班编辑器。排班员用自然语言提出诉求,系统把它翻译成具体的排班改动,先用真实的约束引擎验证这个改动是否可接受,然后把「改了什么、改动前后分数如何、违反了哪几条规则」摊开给人看,人确认了才写进数据库。
| 改预排班 | 改已生成方案 | |
|---|---|---|
| 改什么 | 管理员预设的预排班表 | 已求解并保存的排班分配 |
| 典型说法 | 「周三的早班就定张药师」 「这几天的夜班先别动」 「下周三的夜班先锁住」 | 「把王药师周三夜班换成李药师」 「锁定李药师周五的白班」 「这周五早班别排给张药师」 |
| 选择范围 | 指定科室 + 日期区间 | 指定一个已保存的排班方案 |
| 校验方式 | 服务端逐行校验 | 用约束引擎对改动前后各打一次分 |
| 动作 | 含义 |
|---|---|
SWAP | 两人班次互换 |
REASSIGN | 把某个班次改派给别人 |
PIN | 锁定某个安排(求解时不再变动) |
UNPIN | 解除锁定 |
所有 ID 由服务端根据上下文解析,模型无法凭空构造不存在的记录,也无法越权改动当前视图之外的数据。
请求只能作用于用户明确选定的科室与日期区间,超出范围的诉求会被直接拒绝。
改动不是直接落库,而是交给与正式求解完全相同的约束引擎打分。分数变差 → 拦下;不变或变好 → 进入预览。AI 永远无法提交一个会让排班违反硬约束的方案。
应用前核对数据快照,期间数据被他人改动则要求重新预览;每次落库写入审计记录,记录是谁、何时、改了什么。
同一块排班板在四代引擎下呈现出不同的样子:红色是硬约束违规,蓝色虚线是软约束偏差,圆点标记出局部搜索正在评估的候选 Move。