借助 AI 和算法引擎,
让科室排班计算时长从 1 星期缩短到 30 分钟。

PILLAR 01

业务规则

预排班锁定、同一天只能排一个班次、夜班后必须休息、每月夜班上限、节假日分配公平 —— 21 条规则沉淀在数据库里,按科室生效、可调权重、可解释。

PILLAR 02

求解算法

首次适配递减生成初始解,延迟接受做局部搜索,另有模拟退火、禁忌搜索、变邻域下降等共 7 种接受器,在「硬分 + 软分」体系下迭代寻优。

PILLAR 03

AI 对话

「把王药师周三夜班换成李药师」「周五早班别排张药师」「下周三夜班先锁住」—— 改完用真实约束引擎前后各打一次分,确认后才落库。

01 / SYSTEM

系统介绍

面向医院药房与医药机构的排班管理系统,服务于药师排班 —— 早 / 中 / 夜班轮转、夜班后休息、连班上限、节假日均衡,配合排班规则、夜班配置与工作量均衡。

排班员 / 药房组长

反复试排,夜班总落在几个人头上

一键求解,公平性由约束保证,不必手工掰平。

科室管理员

规则散在文档和口头约定里

规则集中管理,带生效范围、优先级与版本。

审批员 / 员工

换班靠打电话,员工看不到自己的班

两级审批的线上换班;移动端「我的排班」。

平台运营方

多家院区数据混在一起

工作区(租户)隔离,机构与账号统一管理。

系统架构
业务页面排班 / 规则 / 换班 / 分析
AI 对话排班视图 / AiSchedule
▼
REST 控制器 · 33 个/api/**
WebSocket/ws · STOMP
▼
规则服务约束权重 / 夜班 / 节假日
排班服务solve → optimize → apply → save
AI 对话服务解析 → 接地 → 校验 → 落库
▼
约束求解引擎硬约束 / 软约束评分
大模型自然语言理解与排班编辑
▼
MySQL 817 张业务表 + 租户隔离
求解进度与统计数据经 WebSocket 实时回推前端
一次排班的完整生命周期
9 个步骤
STEP 01

准备数据

科室 → 员工 → 技能 → 班次 → 班次成员授权 → 节假日 → 夜班配置

STEP 02

设置预排班

管理员锁定个别固定安排,求解时受硬约束保护,不会被改动

STEP 03

配置排班规则

权重、适用范围、生效期、优先级

STEP 04

创建计划

指定科室与日期范围

STEP 05

启动求解

约束求解器生成方案,进度经 WebSocket 实时回推

STEP 06

调优

偏差贪心调优:把偏高的夜班 / 工时往低了挪

STEP 07

应用方案

校验通过后发布为正式排班

STEP 08

保存

写入排班表,进入日历、分析与统计

STEP 09

AI 微调

用一句话调整,改动经真实约束引擎复核后落库

02 / PILLAR 01

业务规则:把排班经验变成机器可执行的条款

规则不是凭空写在代码里的,它由一组业务实体承载,并最终被翻译成求解器能执行的 21 条约束。下面的演示逐条展示每一条约束到底在拦什么。

规则的来源

员工(技能、不可用时段、工时上限、偏好、历史夜班/早班/周末计数)、技能、班次(起止时间、需求人数、必需技能、工作日与节假日人数)、班次成员授权、预排班、排班规则、节假日、夜班配置。

规则怎么进求解器

排班规则表按权重类规则读取 → 生成约束权重表 → 随方案一起交给求解器, 在本次求解中覆盖约束的默认权重。改一个权重,下一次排班立刻按新权重算,不需要重启服务。

历史数据的作用

公平性约束会把员工的历史累计量作为基线做「注水式」均衡 —— 避免同一个人月复一月被多排夜班,而不是简单粗暴地按当月平均一刀切。

约束总表 · 21 条
14 条硬约束 + 7 条软约束
硬约束 14 条 违反即不可行 · 必须 100% 满足
#约束名业务含义
软约束 7 条 违反只扣分 · 尽量优化
#约束名业务含义
硬软约束按实际计分类型划分:硬约束用 ONE_HARD 罚分(违反即不可行),软约束用 ONE_SOFT 罚分或加分。 注意「夜班次日必须休息」与「排班窗口夜班上限」虽然名字像偏好,实际都是硬约束。
约束机制演示
21 条约束 · 9 组判定机制

21 条约束按判定机制分成 9 组原型,同一原型的多条约束共用一张动画图,靠参数(阈值、人数、班次名、时段)区分具体场景。点击左侧任意一条规则即可切换动画。

—

03 / PILLAR 02

求解算法:在规则边界内求全局最优

求解器把 21 条规则拆成硬约束与软约束,在统一的「硬分 + 软分」体系下搜索。它不是逐个班次填表,而是从整体上权衡谁该多上夜班、谁的工时该少一点。下面的动画演示求解的两阶段,以及各类算法各自的工作方式。

构造启发式
6 种

快速生成一个可行的初始排班

局部搜索接受器
7 种

在初始解附近不断改进分数

约束规则
21 条

硬 14 软 7

当前默认引擎
首次适配递减 + 延迟接受

队列 400 / 接受上限 1000,单次求解单线程

一、求解的两阶段
构造启发式 → 局部搜索 → 最优解
构造启发式 6 种 · 生成初始解 初始解 可行 局部搜索 7 种接受器 · 反复改进 最优解 硬约束 0 违规 迭代 -5hard/-120soft -2hard/-90soft 0hard/-60soft
构造阶段 局部搜索阶段 求解结果 令牌沿流程前进,环上的分数逐轮变好
构造启发式负责「先求一个可行解」,局部搜索负责「在可行解附近不断改进」,两者串联才是完整的求解过程。

三个阶段

  1. 构造启发式 —— 按固定规则把每个班次塞进某位员工的产能,得到一个可行但未必好的初始解。
  2. 局部搜索 —— 反复提出候选解并按接受准则取舍,把硬约束违规降到 0,同时优化软约束。
  3. 终止 —— 到达求解时限,或超过「无改进时限」仍未找到更好的解,就输出当前最优解。
建模方式:规划实体是「某天某班次排给某人」的一条安排,可锁定;规划解是整份排班方案,同时携带约束权重、节假日事实、夜班配置与历史排班记录。
二、构造启发式(6 种)
生成初始解
构造阶段只关心「硬约束能不能满足」,不评价好坏:6 种规则的差别只在于 —— 轮到某个班次时,先把它交给谁。带「递减」的会先把班次按工时从大到小排序,再依次放置。
待排班次 已放入的班次 本次选中
构造启发式只负责把每个班次「塞进」某个人的产能里,它不看偏好、不看公平性 —— 真正的优化发生在随后的局部搜索阶段。
三、局部搜索接受器(7 种)
改进解的核心
04 / PILLAR 03

AI 对话排班:让排班员用一句话完成微调

它不是一个通用聊天机器人,而是一个受规则约束的排班编辑器。排班员用自然语言提出诉求,系统把它翻译成具体的排班改动,先用真实的约束引擎验证这个改动是否可接受,然后把「改了什么、改动前后分数如何、违反了哪几条规则」摊开给人看,人确认了才写进数据库。

两种工作模式
改预排班改已生成方案
改什么管理员预设的预排班表已求解并保存的排班分配
典型说法「周三的早班就定张药师」
「这几天的夜班先别动」
「下周三的夜班先锁住」
「把王药师周三夜班换成李药师」
「锁定李药师周五的白班」
「这周五早班别排给张药师」
选择范围指定科室 + 日期区间指定一个已保存的排班方案
校验方式服务端逐行校验用约束引擎对改动前后各打一次分
两种模式共用同一个会话、同一个模型客户端和同一套 预览 → 确认 → 落库 流程。
它能执行的动作
四类操作
动作含义
SWAP两人班次互换
REASSIGN把某个班次改派给别人
PIN锁定某个安排(求解时不再变动)
UNPIN解除锁定
除了执行操作,它还会回答关于当前排班的问题,并在信息不足时主动反问(缺哪个员工、哪个日期、哪个班次),而不是硬猜一个答案。 超出范围的要求(例如直接重跑求解)会引导到对应页面处理。
一次对话背后发生了什么
自然语言 → 可执行排班改动
① 排班员输入一句话「把王药师周三夜班换成李药师」
▼
② 组装提示词注入当前排班表 / 员工名单 / 班次名单 / 日期区间 / 21 条约束说明 / 固定的 JSON 输出格式提示词组装
▼
③ 调用大模型接入大语言模型;返回结构化 JSON(回复文本 / 待澄清 / 操作列表)大模型调用
▼
④ 服务端接地模型只能给姓名与日期,所有 ID 一律由服务端解析 —— 模型无法指定 ID,也就无法越权改动视图之外的数据服务端解析
▼
⑤ 用真实约束引擎打分把改动应用到内存中的方案副本,对改动前后各打一次分,逐条列出违规项变化约束引擎复核
▼
⑥ 差异预览 → 用户确认 → 落库逐行列出将要发生的改动;确认后写入数据库,并留下可追溯的审计记录预览与落库

为什么它的建议可以信

① 模型无权指定任何对象 ID

所有 ID 由服务端根据上下文解析,模型无法凭空构造不存在的记录,也无法越权改动当前视图之外的数据。

② 改动范围被限定

请求只能作用于用户明确选定的科室与日期区间,超出范围的诉求会被直接拒绝。

③ 改动由真实约束引擎复核

改动不是直接落库,而是交给与正式求解完全相同的约束引擎打分。分数变差 → 拦下;不变或变好 → 进入预览。AI 永远无法提交一个会让排班违反硬约束的方案。

④ 落库前并发校验 + 全程审计

应用前核对数据快照,期间数据被他人改动则要求重新预览;每次落库写入审计记录,记录是谁、何时、改了什么。

模型与配置:接入大语言模型 · temperature 0.1 · max-tokens 4096 · 超时 120s · 会话保留 10 轮 · 每个客户工作区可单独配置自己的模型与密钥(经 AES-256-GCM 加密存储)。
注意区分两个「AI」:智能排班页上的「AI 算法引擎 · 求解器」指的是第 3 章的约束求解器,与本章的大模型对话是两套独立能力。
05 / EVOLUTION

求解器四代演进

同一块排班板在四代引擎下呈现出不同的样子:红色是硬约束违规,蓝色虚线是软约束偏差,圆点标记出局部搜索正在评估的候选 Move。

← 返回首页