方案概述

本文档为梅苑颐养中心培训考核模块的完整方案设计,涵盖轻流表单设计、数据流转、MySQL 表结构及报表查询逻辑。核心设计原则是:

  • 培训与考核解耦:培训记录单和现有 40+ 张考核表单各自独立运行,不直接关联
  • 汇总表作为数据中枢:双方通过「培训场次编号」向同一张汇总表写入数据
  • 人员流动兼容:培训时不预锁参训名单,按实际在岗人员提交,避免脏数据
  • 现有考核表单零改造:仅增加「培训场次编号」一个字段,其余保持原样
设计目标:实现「个人学习记录单」和「院部培训统计表」两张报表的自动化数据支撑,同时兼容养老行业高频人员流动的业务特点。

业务背景与痛点

2.1 现有考核体系

轻流中已存在 40+ 张考核表单,覆盖各类护理技能与操作规范。每张考核表包含:

  • 被考核人、身份证号、所属部门、岗位
  • 10+ 评分维度(如准备工作、操作流程、人文关怀等)
  • 各维度 1-5 分评分 + 轻流自动计算总分
  • 自动合格判定(合格/需补考/不合格)

2.2 核心痛点

痛点描述
数据孤岛考核表单分散在 40+ 张表中,无法快速汇总个人年度学习轨迹或院部培训全貌
人员流动养老行业人员离职率高,提前锁定参训名单会产生大量脏数据
培训缺记录现有体系只有考核、没有培训过程记录,无法统计参训率、缺席人员
手工统计院部培训报表目前依赖人工汇总 Excel,效率低、易出错

整体架构设计

整个体系由 3 张轻流表单(+40张现有考核表改造) + 1 张 MySQL 表 + 2 张前端报表 组成:

培训考核数据中枢架构 培训记录和考核表单各自独立,通过培训场次编号向汇总表写入数据 汇总表中枢架构 — 培训与考核零耦合 培训记录单(新) 培训场次编号 主题 / 形式 / 日期 参训人 + 参训状态 员工姓名 / 身份证号 提交 → 写入汇总表 考核表单(现有x40) 被考核人/身份证号 10+ 评分维度 总分 + 自动合格判定 培训场次编号(新增) 后更新 → 写右半边 培训考核汇总表 左半边: 培训填写 event_no + 日期 + 主题 部门 + 参训状态 右半边: 考核填写 成绩 + 结果 + 补考标记 联合唯一: event_no + id_no sync_training.py → MySQL INSERT ... ON DUPLICATE KEY UPDATE 个人学习记录单 WHERE 身份证号 = 某人 GROUP BY 月份 AVG(成绩) → 平均成绩 COUNT(考核通过) / COUNT(考核) → 考核通过率 院部培训统计表 WHERE 月份 = 2026-06 GROUP BY 部门, 培训主题 COUNT(全部) → 应参训人数 COUNT(已参训) → 实际人数 COUNT(考核结果) → 完成率

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 培训考核汇总表(中枢,被动接收)

不在轻流中直接操作。培训记录单提交后,轻流工作流自动将培训侧字段写入此表;考核表单提交后,工作流按「培训场次编号 + 身份证号」匹配并更新考核字段。

汇总表角色:轻流侧的同步脚本只读这一张表,不再分别读培训记录单和 40+ 张考核表单。所有数据汇聚到此表后,sync_training.py 一键同步到 MySQL。
来源字段类型说明
← 培训记录单写入培训场次编号文本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_idnoevent_no + id_number联合唯一索引:确保同一个人在同一场培训中只有一条记录
idx_monthtraining_month院部报表按月筛选
idx_idnoid_number个人学习记录单查询
idx_deptdept院部报表按部门分组
idx_topictopic按培训主题统计

报表查询逻辑

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 天内完成

1. 登录轻流,进入「培训记录单」

2. 填写培训信息:场次编号(按规则 PX-YYYY-MM-### 生成)、日期、形式、主题、主讲人

3. 按实际到场情况,逐人添加记录

  • 到场人员 → 参训状态 = 已参训
  • 缺席人员 → 参训状态 = 未参训(必须建记录,否则报表算不出应参训人数)

4. 提交。考核字段此时全部留空

8.2 考核部门操作流程

考核完成后 1-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(课时) 占比
学习模块覆盖度个人学习记录单模块热力图各模块累计学时 / 总学时,识别薄弱模块
说明:以上扩展均为纯后端计算 + 前端展示,轻流侧只需保证每次提交培训记录时填写正确的课时数(如 1 课时 = 1 小时,0.5 课时 = 30 分钟)。数据入 MySQL 后即可支持任意时间维度的学时统计。
版本记录:
v1.0 (2026-06-12) — 初始方案设计,涵盖轻流表单、MySQL 表结构、报表查询逻辑
v1.1 (2026-06-12) — 补充课时可扩展功能章节