基于优先级分组的患者与个案经理均等分配及增量分配方案问询
患者-个案经理均等分配算法实现方案
核心思路
- 按优先级(LOW/HIGH)拆分患者池与经理池,同优先级内独立执行分配逻辑
- 保留历史分配关系,仅对新增未分配患者执行均衡分配
- 通过追踪经理当前负责的活跃患者数量,确保同优先级内每位经理的负载尽可能均衡
数据表优化方案
1. 新增分配记录表(推荐方案)
不建议直接修改个案经理表,新增独立的PATIENT_ASSIGNMENT分配记录表,避免业务数据耦合:
| 字段名 | 类型 | 说明 |
|---|---|---|
| ASSIGNMENT_ID | 自增主键 | 分配记录唯一标识 |
| PATIENTID | 外键 | 关联患者表PATIENTID |
| CASE_MANAGER_ID | 外键 | 关联个案经理表CASE MANAGER |
| ASSIGN_DATE | 日期时间 | 分配执行时间 |
| IS_ACTIVE | 布尔值 | 标记患者是否仍需跟进(转归后设为FALSE) |
2. 可选:经理表新增统计字段(实时计算优先)
如果一定要在个案经理表添加统计字段,可新增CURRENT_PATIENT_COUNT,但更推荐实时计算(避免数据同步不一致问题):
-- 实时统计LOW优先级经理的当前活跃患者数 SELECT cm.`CASE MANAGER`, COUNT(pa.PATIENTID) AS CURRENT_PATIENT_COUNT FROM `CASE MANAGER` cm LEFT JOIN PATIENT_ASSIGNMENT pa ON cm.`CASE MANAGER` = pa.CASE_MANAGER_ID AND pa.IS_ACTIVE = TRUE WHERE cm.PRIORITY = 'LOW' GROUP BY cm.`CASE MANAGER`;
每周执行的分配算法步骤
1. 筛选新增未分配患者
-- 获取近7天新增、未分配过的患者,按优先级分组 SELECT PATIENTID, PRIORITY FROM PATIENT WHERE PATIENTID NOT IN (SELECT PATIENTID FROM PATIENT_ASSIGNMENT) AND CREATE_DATE >= DATE_SUB(CURDATE(), INTERVAL 7 DAY);
2. 按优先级执行均衡分配
对LOW、HIGH两个优先级分别执行以下逻辑:
- 步骤1:拉取该优先级下所有个案经理,以及他们当前负责的活跃患者数(通过分配表统计)
- 步骤2:将新增患者按顺序分配给当前患者数最少的经理;若多名经理患者数相同,按经理ID升序轮询分配
- 步骤3:将分配结果写入
PATIENT_ASSIGNMENT表
示例伪代码
def assign_new_patients_weekly(): # 获取本周新增未分配患者,按优先级分组 new_patients = query_new_unassigned_patients() grouped_patients = group_patients_by_priority(new_patients) for priority, patients in grouped_patients.items(): # 获取该优先级经理及当前活跃患者数 managers = query_managers_with_patient_count(priority) # 按患者数升序、经理ID升序排序,确保先分配给负载最低的 sorted_managers = sorted(managers, key=lambda x: (x['patient_count'], x['id'])) # 轮询分配新增患者 manager_idx = 0 manager_count = len(sorted_managers) for patient in patients: target_manager = sorted_managers[manager_idx] # 写入分配记录 save_assignment_record(patient['id'], target_manager['id']) # 内存中更新经理负载,避免重复查询数据库 target_manager['patient_count'] += 1 # 重新排序,确保下一位患者分配给当前负载最低的经理 sorted_managers = sorted(sorted_managers, key=lambda x: (x['patient_count'], x['id'])) # 若所有经理当前负载相同,直接轮询即可 # manager_idx = (manager_idx + 1) % manager_count
关键注意事项
- 数据一致性:优先通过分配表实时统计经理负载,若使用存储字段,需在每次分配后同步更新该字段
- 患者转归处理:当患者无需继续跟进时,及时标记
IS_ACTIVE = FALSE,避免统计无效数据影响分配均衡性 - 性能优化:每周执行前可缓存各优先级经理的负载数据,减少数据库查询次数
- 公平性保障:负载相同时采用固定规则(如经理ID升序)轮询,避免随机分配导致的长期负载不均
内容的提问来源于stack exchange,提问作者armsagainstatrophy
相关产品推荐
相关产品推荐

