培训考核模块 — 方案设计文档
一方案概述
▼本文档为梅苑颐养中心培训考核模块的完整方案设计,涵盖轻流表单设计、数据流转、MySQL 表结构及报表查询逻辑。核心设计原则是:
- 培训与考核解耦:培训记录单和现有 40+ 张考核表单各自独立运行,不直接关联
- 汇总表作为数据中枢:双方通过「培训场次编号」向同一张汇总表写入数据
- 人员流动兼容:培训时不预锁参训名单,按实际在岗人员提交,避免脏数据
- 现有考核表单零改造:仅增加「培训场次编号」一个字段,其余保持原样
二业务背景与痛点
▼2.1 现有考核体系
轻流中已存在 40+ 张考核表单,覆盖各类护理技能与操作规范。每张考核表包含:
- 被考核人、身份证号、所属部门、岗位
- 10+ 评分维度(如准备工作、操作流程、人文关怀等)
- 各维度 1-5 分评分 + 轻流自动计算总分
- 自动合格判定(合格/需补考/不合格)
2.2 核心痛点
| 痛点 | 描述 |
|---|---|
| 数据孤岛 | 考核表单分散在 40+ 张表中,无法快速汇总个人年度学习轨迹或院部培训全貌 |
| 人员流动 | 养老行业人员离职率高,提前锁定参训名单会产生大量脏数据 |
| 培训缺记录 | 现有体系只有考核、没有培训过程记录,无法统计参训率、缺席人员 |
| 手工统计 | 院部培训报表目前依赖人工汇总 Excel,效率低、易出错 |
三整体架构设计
▼整个体系由 3 张轻流表单(+40张现有考核表改造) + 1 张 MySQL 表 + 2 张前端报表 组成:
3.1 组件清单
| 组件 | 类型 | 作用 |
|---|---|---|
| 培训计划表 | 轻流(新) | 管理视角:每月计划培训什么、覆盖哪些岗位(不列具体人) |
| 培训记录单 | 轻流(新) | 培训部门操作入口:按实际到场人员逐人录入参训信息 |
| 培训考核汇总表 | 轻流(新) | 被动接收中枢:培训记录单 + 考核表单数据汇聚于此,同步脚本读取这张表 |
| 考核表单 | 轻流(现有) | 技能考核:10+ 维度评分 + 总分 + 合格判定(仅加一个字段) |
| 培训考核汇总表 | MySQL | 数据中枢:培训写左半边,考核写右半边 |
| 个人学习记录单 | 前端报表 | 按人维度统计:参训次数、考核通过率、平均成绩 |
| 院部培训统计表 | 前端报表 | 按月份/部门维度统计:参训率、考核完成率、补考人数 |
四数据流转设计
▼4.1 培训侧数据流
Step 1 培训结束后,培训负责人在轻流「培训记录单」中创建记录
Step 2 填写培训信息(场次编号、日期、形式、主题、主讲人、部门)
Step 3 按实际到场/缺席情况,一人提交一条记录
Step 4 到场 → 参训状态 = 已参训;缺席 → 参训状态 = 未参训
Step 5 考核字段(成绩、结果等)暂时留空
4.2 考核侧数据流
Step 1 考核完成后,考核老师在现有考核表单中提交评分
Step 2 填写「培训场次编号」(新增字段,关联到本次培训)
Step 3 轻流自动计算总分和合格判定
Step 4 同步脚本读取考核表单数据,按 event_no + 身份证号 匹配汇总表
Step 5 更新汇总表右半边:成绩、考核结果、补考标记
4.3 同步脚本机制
# sync_training.py 核心逻辑(伪代码)
# 1. 从轻流 OpenAPI 拉取培训记录单数据
training_data = fetch_qingliu(appKey="培训记录单appKey")
# 2. 插入或更新汇总表(培训侧)
for row in training_data:
sql = """
INSERT INTO biz_training_records
(event_no, id_number, name, org, dept, training_month,
training_date, form, topic, speaker, attend_status,
created_at, updated_at)
VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, NOW(), NOW())
ON DUPLICATE KEY UPDATE
name=VALUES(name), org=VALUES(org), dept=VALUES(dept),
attend_status=VALUES(attend_status), updated_at=NOW()
"""
execute(sql, row)
# 3. 从轻流 OpenAPI 拉取考核表单数据(40+张表批量)
for appKey in assessment_appKeys:
assess_data = fetch_qingliu(appKey=appKey)
for row in assess_data:
if row.event_no: # 只处理关联了培训的考核
sql = """
UPDATE biz_training_records
SET exam_date=%s, exam_score=%s, exam_result=%s,
is_retake=%s, updated_at=NOW()
WHERE event_no=%s AND id_number=%s
"""
execute(sql, row)
ON DUPLICATE KEY UPDATE 机制确保培训和考核可以分两次写入同一条记录,互不冲突。
五轻流表单字段清单
▼5.1 培训计划表(管理视角,可选)
用于院长/主任查看月度培训安排,不直接参与报表统计。纯管理备忘用途。
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| 计划月份 | 日期(月) | 是 | 如 2026-06 |
| 培训形式 | 单选 | 是 | 技能 / 理论 / 演练 / 选修 |
| 培训主题 | 文本 | 是 | 如「膀胱冲洗」 |
| 目标部门 | 多选 | 是 | 护理部(照护师)/ 护理部(护士)/ 医务部 / 后勤 |
| 目标岗位 | 多选 | 否 | 照护师 / 护士 / 医生 / 康复师 / 后勤等 |
| 主讲人 | 文本 | 否 | 培训讲师姓名 |
| 关联考核表 | 文本 | 否 | 考核老师填写考核表单时参考 |
| 备注 | 多行文本 | 否 | 特殊情况说明 |
5.2 培训记录单(培训部门操作入口)
培训结束后,培训负责人按实际到场/缺席逐人录入,一人提交一条。提交后轻流工作流自动将数据写入汇总表。
| 字段 | 类型 | 必填 | 说明 / 选项 |
|---|---|---|---|
| 培训场次编号 | 文本 | 是 | 规则:PX-YYYY-MM-###,如 PX-2026-06-003 |
| 培训月份 | 日期(月) | 是 | 如 2026-06,用于报表按月分组 |
| 培训日期 | 日期 | 是 | 实际培训日期 |
| 培训形式 | 单选 | 是 | 技能 / 理论 / 演练 / 选修 |
| 培训主题 | 文本 | 是 | 如「膀胱冲洗」「鼻饲护理」 |
| 主讲人 | 文本 | 否 | 培训讲师 |
| 学习模块 | 单选 | 否 | 基础护理 / 安全管理 / 制度规范 / 专科护理 / 急救技能 / 用药管理 |
| 员工姓名 | 文本 | 是 | 参训人姓名 |
| 身份证号 | 文本 | 是 | 关联花名册,自动带出机构/岗位 |
| 机构 | 文本 | 是 | 从花名册自动带出,锁定 |
| 部门 | 单选 | 是 | 护理部(照护师)/ 护理部(护士)/ 医务部 / 后勤 |
| 岗位 | 文本 | 否 | 从花名册自动带出 |
| 参训状态 | 单选 | 是 | 已参训 / 未参训 |
5.3 培训考核汇总表(中枢,被动接收)
不在轻流中直接操作。培训记录单提交后,轻流工作流自动将培训侧字段写入此表;考核表单提交后,工作流按「培训场次编号 + 身份证号」匹配并更新考核字段。
| 来源 | 字段 | 类型 | 说明 |
|---|---|---|---|
| ← 培训记录单写入 | 培训场次编号 | 文本 | PX-YYYY-MM-###,联合唯一键之一 |
| 培训月份 | 文本 | 如 2026-06 | |
| 培训日期 | 日期 | 实际培训日期 | |
| 培训形式 | 单选 | 技能 / 理论 / 演练 / 选修 | |
| 培训主题 | 文本 | 如「膀胱冲洗」 | |
| 主讲人 | 文本 | 培训讲师 | |
| 学习模块 | 单选 | 基础护理 / 安全管理 / 专科护理等 | |
| 员工姓名 | 文本 | 参训人 | |
| 身份证号 | 文本 | 联合唯一键之一 | |
| 机构 | 文本 | 所属机构 | |
| 部门 | 文本 | 照护师 / 护士 / 医务 / 后勤 | |
| 岗位 | 文本 | 从花名册带出 | |
| 参训状态 | 单选 | 已参训 / 未参训 | |
| ← 考核表单更新 | 考核日期 | 日期 | 考核实际发生的日期 |
| 考核成绩 | 数字 | 总分 0-100 | |
| 考核结果 | 单选 | 通过 / 未通过 / 补考通过 / 免考 | |
| 是否补考 | 是/否 | 补考通过时为「是」 |
5.4 考核表单(现有表单改造)
现有 40+ 张考核表单仅需新增一个字段,其余保持原样。
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| 培训场次编号 | 文本 | 建议填 | 新增字段。关联到本次培训的编号,用于向汇总表写入考核数据 |
| 其余字段(被考核人、评分维度、总分、合格判定等)全部保持现有设计不变 | |||
六MySQL 表结构设计
▼6.1 biz_training_records(培训考核汇总表)
CREATE TABLE `biz_training_records` (
`id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
`event_no` VARCHAR(32) NOT NULL COMMENT '培训场次编号,如 PX-2026-06-003',
`id_number` VARCHAR(18) NOT NULL COMMENT '身份证号,关联花名册',
`name` VARCHAR(50) NOT NULL COMMENT '员工姓名',
`org` VARCHAR(100) DEFAULT NULL COMMENT '所属机构',
`dept` VARCHAR(50) DEFAULT NULL COMMENT '部门',
`post` VARCHAR(50) DEFAULT NULL COMMENT '岗位',
`training_month` VARCHAR(7) NOT NULL COMMENT '培训月份,如 2026-06',
`training_date` DATE DEFAULT NULL COMMENT '培训日期',
`form` VARCHAR(20) NOT NULL COMMENT '培训形式:技能/理论/演练/选修',
`topic` VARCHAR(100) NOT NULL COMMENT '培训主题',
`speaker` VARCHAR(50) DEFAULT NULL COMMENT '主讲人',
`module` VARCHAR(50) DEFAULT NULL COMMENT '学习模块分类',
`attend_status` VARCHAR(10) NOT NULL COMMENT '参训状态:已参训/未参训',
`exam_date` DATE DEFAULT NULL COMMENT '考核日期(考核后补填)',
`exam_score` DECIMAL(5,1) DEFAULT NULL COMMENT '考核成绩(0-100)',
`exam_result` VARCHAR(20) DEFAULT NULL COMMENT '考核结果:通过/未通过/补考通过/免考',
`is_retake` TINYINT(1) DEFAULT 0 COMMENT '是否补考:0=否 1=是',
`remark` VARCHAR(500) DEFAULT NULL COMMENT '备注',
`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY `uk_event_idno` (`event_no`, `id_number`),
KEY `idx_month` (`training_month`),
KEY `idx_idno` (`id_number`),
KEY `idx_dept` (`dept`),
KEY `idx_topic` (`topic`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='培训考核汇总表';
6.2 索引设计说明
| 索引名 | 字段 | 用途 |
|---|---|---|
uk_event_idno | event_no + id_number | 联合唯一索引:确保同一个人在同一场培训中只有一条记录 |
idx_month | training_month | 院部报表按月筛选 |
idx_idno | id_number | 个人学习记录单查询 |
idx_dept | dept | 院部报表按部门分组 |
idx_topic | topic | 按培训主题统计 |
七报表查询逻辑
▼7.1 个人学习记录单
按员工身份证号查询,统计个人全年学习情况。
-- 个人统计卡片数据
SELECT
COUNT(*) AS total_attend, -- 累计参训次数
COUNT(CASE WHEN form='技能' THEN 1 END) AS skill_cnt,
COUNT(CASE WHEN form='演练' THEN 1 END) AS drill_cnt,
COUNT(CASE WHEN form='理论' THEN 1 END) AS theory_cnt,
COUNT(CASE WHEN exam_result IN ('通过','补考通过') THEN 1 END) AS pass_cnt,
COUNT(CASE WHEN exam_result IS NOT NULL THEN 1 END) AS total_exam,
AVG(exam_score) AS avg_score, -- 平均成绩
MAX(exam_score) AS max_score,
MIN(exam_score) AS min_score,
COUNT(DISTINCT module) AS module_covered -- 学习模块覆盖数
FROM biz_training_records
WHERE id_number = 'xxx'
AND attend_status = '已参训'
AND form != '选修';
-- 个人培训明细(按月份分组)
SELECT
training_month,
training_date,
form,
topic,
speaker,
attend_status,
exam_score,
exam_result,
is_retake
FROM biz_training_records
WHERE id_number = 'xxx'
AND form != '选修'
ORDER BY training_date DESC;
7.2 院部培训统计表
按月份查询,按部门和培训主题分组统计。
-- 月度统计卡片
SELECT
COUNT(DISTINCT event_no) AS total_sessions, -- 培训场次
COUNT(*) AS total_plan, -- 应参训人次
COUNT(CASE WHEN attend_status='已参训' THEN 1 END) AS total_actual,
COUNT(CASE WHEN exam_result IS NOT NULL THEN 1 END) AS exam_plan,
COUNT(CASE WHEN exam_result IN ('通过','补考通过') THEN 1 END) AS exam_done,
COUNT(CASE WHEN is_retake=1 THEN 1 END) AS retake_cnt
FROM biz_training_records
WHERE training_month = '2026-06'
AND form != '选修';
-- 按部门+主题分组的明细
SELECT
dept,
form,
topic,
speaker,
COUNT(*) AS plan_count, -- 应参训人数
COUNT(CASE WHEN attend_status='已参训' THEN 1 END) AS actual_count,
COUNT(CASE WHEN exam_result IS NOT NULL THEN 1 END) AS exam_plan,
COUNT(CASE WHEN exam_result IN ('通过','补考通过') THEN 1 END) AS exam_done,
COUNT(CASE WHEN is_retake=1 THEN 1 END) AS retake_cnt,
GROUP_CONCAT(DISTINCT CASE WHEN attend_status='未参训' THEN name END) AS absent_list,
GROUP_CONCAT(DISTINCT CASE WHEN exam_result='未通过' THEN name END) AS fail_list
FROM biz_training_records
WHERE training_month = '2026-06'
AND form != '选修'
GROUP BY dept, form, topic, speaker
ORDER BY dept, form;
form != '选修' 排除选修类培训。选修不设强制参训、不设考核,只记录实际参加的人,不纳入参训率和考核完成率统计。
八操作规范与流程
▼8.1 培训部门操作流程
1. 登录轻流,进入「培训记录单」
2. 填写培训信息:场次编号(按规则 PX-YYYY-MM-### 生成)、日期、形式、主题、主讲人
3. 按实际到场情况,逐人添加记录:
- 到场人员 → 参训状态 = 已参训
- 缺席人员 → 参训状态 = 未参训(必须建记录,否则报表算不出应参训人数)
4. 提交。考核字段此时全部留空
8.2 考核部门操作流程
1. 打开对应主题的考核表单(现有 40+ 张表之一)
2. 填写「培训场次编号」(关联到本次培训)
3. 选择被考核人,逐维度评分
4. 轻流自动计算总分和合格判定
5. 提交。同步脚本自动将考核数据写入汇总表
8.3 培训场次编号生成规则
格式: PX-YYYY-MM-###
示例:
PX-2026-06-001 -- 6月第1场培训
PX-2026-06-002 -- 6月第2场培训
PX-2026-06-003 -- 6月第3场培训
规则:
- PX: 培训固定前缀
- YYYY-MM: 培训所在年月
- ###: 当月流水号,从 001 开始递增
注意:
- 同一场培训(同一主题、同一天)不管多少人参加,只用一个编号
- 补考视为新的考核事件,但培训编号不变(考核侧更新原记录)
- 若同一个人同一场培训有多次考核(首次+补考),更新原记录即可
8.4 同步脚本运行时机
| 脚本 | 频率 | 作用 |
|---|---|---|
sync_training.py | 每日 1 次(Cron) | 同步培训记录单 + 考核表单数据到 MySQL |
九边界场景与注意事项
▼9.1 已识别的边界场景
| 场景 | 处理方案 |
|---|---|
| 人员流动 | 培训时不预锁名单,按实际在岗人员提交。已离职人员的历史记录保留在汇总表中,不影响在住人员统计 |
| 演练类无考核 | 演练类培训只需提交培训记录单,考核表单不提交。汇总表中考核字段留空,报表自动排除 |
| 补考 | 同一人同一场培训,首次未通过后补考:更新原记录,改 exam_result='补考通过',is_retake=1。报表通过 is_retake 统计补考人数 |
| 选修培训 | 选修不设强制参训和考核,只给实际参加的人建记录(参训状态=已参训,考核=免考)。所有报表查询排除 form='选修' |
| 考核未关联培训 | 现有考核表单中「培训场次编号」为选填。未填编号的考核记录不进入汇总表,仅在原表单中保留 |
| 同主题多场次 | 同一主题(如「膀胱冲洗」)可能在不同月份多次开展,每次使用不同的培训场次编号,互不影响 |
9.2 注意事项
- 缺席人员必须建记录:只有全部人员(含缺席)都有记录,报表才能准确计算应参训人数和参训率
- 身份证号是关联键:确保轻流中填写的身份证号与花名册一致,否则无法自动带出机构/岗位/职级
- 培训场次编号全局唯一:同一场培训的所有参训人必须使用同一个编号
- 考核表单仅需加 1 个字段:不要在现有考核表单中做其他改造,保持原有评分逻辑不变
- 同步脚本需处理分页:轻流 OpenAPI pageSize 上限 200,pageNum 从 1 开始递增
9.3 课时可扩展功能(v1.1 预留)
轻流表单已包含课时字段(培训记录单),当前报表暂未使用。后续可按以下方向扩展,无需改动轻流侧数据结构:
| 扩展方向 | 报表体现 | 计算逻辑 |
|---|---|---|
| 个人累计学时 | 个人学习记录单统计卡片 | 筛选期内 SUM(课时) WHERE 参训状态='已参训' |
| 人均培训学时 | 院部培训统计表月度汇总 | 月度 SUM(课时) / 部门人数(按花名册在册人数) |
| 年度学时达标率 | 新增「年度培训达标」报表 | 个人年度累计学时 / 机构设定目标学时(如 40 学时/年) |
| 培训形式时长分布 | 院部报表新增饼图/柱状图 | 按培训形式 GROUP BY,SUM(课时) 占比 |
| 学习模块覆盖度 | 个人学习记录单模块热力图 | 各模块累计学时 / 总学时,识别薄弱模块 |
v1.0 (2026-06-12) — 初始方案设计,涵盖轻流表单、MySQL 表结构、报表查询逻辑
v1.1 (2026-06-12) — 补充课时可扩展功能章节