高职课程标准评价
一、技能用途
对高职院校课程标准文件实施逐条量化评价。核心逻辑:先判定课程类型(纯理论课 / 含实践课程),再加载对应规则集,对每一条检查点做二值判定(达标 / 不达标),累加各维度得分,最终输出可交付的 Excel 评价报告与重点整改清单。
规则集来源为学校现行《课程标准评价规则》:
| 规则文件 | 适用课程 | 条目数 | 满分 |
|---|---|---|---|
references/rules-01-theory.md |
纯理论课(A 类,无实践学时) | 81 | 100 |
references/rules-02-practice.md |
含实践课程(B 类理实一体 / C 类纯实践) | 100 | 100 |
二、触发条件
用户表达下列任一意图时启用本技能:课程标准评价、课标评价、评价课程标准、课程标准评估、课标审核,或提交课程标准文件要求打分。
三、输入材料
| 材料 | 必要性 | 说明 |
|---|---|---|
| 课程标准文件 | 必需 | .docx / .doc / .pdf / .md 均可。岗位能力图谱以表格形式内嵌于本文件内(含实践课程必备),不作为独立材料索取 |
| 人才培养方案 | 可选 | 用于交叉校验(基础信息、课程性质、先修/后续课程)与课程类别判定;未提供时标注「材料缺失」 |
> 关于岗位能力图谱:该图谱是课程标准的一个组成部分(内含实践课程的正式表格),不是外部输入材料。评价时从课程标准文件中直接定位并解析,无需另行索要。
四、执行流程
步骤 1 · 读取课程标准文件
读取课程标准全文,保留章节结构。重点定位以下六块内容:课程基本信息(首页非封面页)、课程性质与作用、课程设计理念与思路、课程目标(素质/能力/知识)、课程教学单元设计表、教学建议与教学条件(教师要求、硬件环境、教学资源、考评方式)。
若判定为含实践课程,还须在课程标准文件内定位「岗位能力图谱」表格,并完整解析其五级结构(项目 / 典型工作任务 / 工作流程 / 可考核能力点 / 支撑知识点)及学时数、考评方式列,供 rules-02-practice.md 序号 1–13、69–71 判定使用。
读取通道与全文获取(先判断,再取文)
.docx 优先走 tencent-docs-routing → tencent-local-office-edit(editor_sdk MCP)。但该 MCP 的结构类工具只回「预览」而非全文,实测:doc_resolve_document_structure 段落 text_preview 被截断在约 64 字符(text_preview_length 上限 200 也不起作用),表格单元格 text_preview 同样被截断。逐条判定要求「依据定位」给出原文片段,截断文本不满足取证要求。可用的是 doc_get_outline、doc_list_tables、doc_get_table_info。
判定顺序:
- 先用
doc_get_outline+doc_list_tables摸清章节骨架与表格清单(轻量、够用); - 若段落/单元格正文超过约 64 字符(课标几乎必然超过),直接改用 Python 解析
.docx源文件取全文,并在回复中向用户说明「因 MCP 段落读取截断,改用源文件解析」; - 表格若已由 MCP 完整取得,可与源文件解析结果交叉校验行数/列数/合并区域,确认一致后再判定。
Python 取全文的最小实现(标准库即可,无需 python-docx):
import zipfile
from xml.etree import ElementTree as ET
W = '{http://schemas.openxmlformats.org/wordprocessingml/2006/main}'
z = zipfile.ZipFile(src)
body = ET.fromstring(z.read('word/document.xml')).find(W + 'body')
# 遍历 body 子节点:W+'p' 为段落,W+'tbl'/'W+tr'/'W+tc' 为表格
# 段落样式名取自 pPr/pStyle@val;样式显示名需另查 word/styles.xml 的 w:style[@w:styleId]/w:name@val
样式名必须核对 word/styles.xml:pStyle@val 是 styleId,不等于显示名。实测某课标中 styleId 2 的显示名是 heading 2,导致参考书目两条被误套标题样式 —— 这类缺陷(写入序号 100 的「结构清晰」判定)只能靠核对样式名发现。
不要依赖的通道:含大量中文路径的 find / head / tail / mkdir 等 coreutils 在某些 Bash 环境缺 /usr/bin 而不可用,目录创建改用 Python os.makedirs。
步骤 2 · 读取人才培养方案(可选)
若已提供,抽取:课程类别(A/B/C 类)、课程性质(必修/选修及环节归属或专业归属)、课程体系中的先修/后续/平行课程名称、学时学分。未提供则在报告中标注「人才培养方案未提供,相关条目按材料缺失处理」(01 表序号 17、02 表序号 29 除外,改按课程标准文内表述判定)。
步骤 3 · 判定课程类型并选择规则集
按下列优先级判定:
- 人才培养方案标注的课程类别:A 类 → 纯理论课;B 类 → 理实一体;C 类 → 纯实践。
- 文件名:文件名或所在目录名中包含“理论”、常见思政类课程名称(例如:形势与政策、马克思等)、常见非技能类课程名称(例如:英语、数学等)→纯理论课;文件名中包含有“含图谱”等的意思时→理实一体;文件名中包含有“实训、实操、实践”等意思时→纯实践。
- 课程标准的实践学时:实践学时 = 0 → 纯理论课;理论、实践学时均 > 0 → 理实一体;全部为实践学时 → 纯实践。
- 教学单元设计表的课堂模式:全部为「项目实训课」→ 纯实践。
选择规则:
- 纯理论课(A 类)→ 加载
references/rules-01-theory.md - 含实践课程(B 类 / C 类)→ 加载
references/rules-02-practice.md
歧义兜底:若两类证据冲突或均缺失,先向用户确认;用户仍无法确认时,从严选用 rules-02-practice.md(条目更多、要求更严),并在报告「评价总览」中注明该假设。
步骤 4 · 采集条件豁免所需的课程属性
所选规则集中含条件性豁免条目(条件不成立时视为默认达标)。判定前必须先采集下列属性,采集结果写入报告「条件豁免与属性判定」工作表:
| 属性 | 用途 |
|---|---|
| 课程类别(A / B / C 类) | 序号 64、65、67(02 表)〔01 表 2026-09-26 修订后已无 B/C 类相关条目〕 |
| 是否专业基础课 / 专业核心课 | 序号 17、18(02 表) |
| 是否语言类 / 音乐类 / 体育类 | 序号 4(01 表) |
| 是否通识课 / 纯讲授类 | 序号 6(01 表);19(02 表) |
| 专业类别(护理/空乘/导游 / 营销/法律/医学/管理) | 序号 7(01 表);20(02 表) |
| 必修 / 选修 | 序号 10(01 表) |
| 是否数学 / 英语等常见公共类课程 | 序号 2、13(01 表)——公共类课程两条均默认达标;02 表不适用(含实践课程必须提供人才培养方案) |
> 另有一类「条件型」条目(非豁免,但条件不成立即无缺陷):02 表序号 21(仅当教学模式含「成果导向模式」时才要求「预期学习成果」清单非空)。此类条目条件不成立时判「达标」,并在「依据定位」中写明条件不触发;不要计入「默认达标」统计,也不要因清单为空而扣分。
步骤 5 · 逐条判定
对所选规则集的每一条检查点独立判定,判定取值仅三种:
- 达标 — 计满该条分值(01 表为 1 或 2 分;02 表全部为 1 分)
- 默认达标 — 条件豁免条目且豁免条件成立,计满该条分值,并注明豁免依据
- 不达标 — 计 0 分
判定证据要求:每条判定必须给出依据定位(课程标准中的章节名称 + 原文片段,不超过 60 字),不得仅给结论。原文中无对应内容时,依据定位填「未检索到」。
材料缺失处理:人才培养方案未提供时,01 表序号 2、13 与 02 表序号 15、26 判定为「不达标」并计 0 分,扣分原因注明「材料缺失」,报告中单独统计该类条目数。但若课程为数学、英语等常见公共类课程,01 表序号 2、13 属条件豁免条目,一律判「默认达标」(豁免依据注明「常见公共类课程」),不得因材料缺失扣分,亦不再比对课程标准文内表述。02 表序号 15、26 不设该豁免——本表适用于含实践课程(B/C 类),此类课程必须提供人才培养方案,未提供时一律判「不达标」并计 0 分(扣分原因注明「材料缺失」),与 01 表序号 2、13 有意不同。01 表序号 17 与 02 表序号 29 属另一类例外(降级判定):人才培养方案未提供时,只要课程标准中有先修、后续课程的表述即判定「达标」(平行课程为非必须项),扣分原因留空并注明「按文内表述判定」。
岗位能力图谱缺失的处理:图谱内嵌于课程标准文件,不属于材料缺失情形。若课程标准中确无图谱表或图谱内容残缺,属课程标准的实质缺陷,rules-02-practice.md 序号 1–13、69–71 按实际判定为「不达标」并给出整改要点。
序号 80 的例外(01 表):A 类纯理论课中允许出现实践活动表述——「理实共生、实践活动、项目驱动」等表述不构成「逻辑矛盾或前后不一致」,不得据此将序号 80 判为不达标,也不得据此叠加扣减序号 79、81 的分值。判定时须区分「设置实践活动」与「前后自相矛盾」:前者是受鼓励的表述,后者才是不达标。
须比对的条目:
| 比对基准 | 基准来源 | 01 表序号 | 02 表序号 |
|---|---|---|---|
| 人才培养方案 | 课程标准之外(外部材料) | 2、13、17(2、13 为数学/英语等公共课时默认达标;17 未提供时可降级为文内判定) | 15、26、29(29 未提供时可降级为文内判定) |
| 课程首页总学时 | 课程标准文内 | 46 | 57 |
| 岗位能力图谱表 | 课程标准文内 | — | 69、70、71 |
条件化阈值(须逐行读取单元设计表的「课堂模式」列):01 表序号 45 / 02 表序号 56 —— 每个教学单元的
学时数 ≤ 16;当该单元「课堂模式」为「指导学习」(指导学习课 / 指导学习单元)时,该单元学时数 ≤ 4。
判定须逐单元比对:既不得只取全表 16 学时上限、放过超限的指导学习单元,也不得对全部单元一律按 4 学时判定。
02 表单元设计末端安排的两级校验(序号 64、65):B 类专业课最后 1 个单元只能填「项目案例课」或「答辩/展评」等评审类内容(序号 64);若最后 1 个单元为「答辩/展评」等评审类内容,则倒数第 2 个单元必须为「项目案例课」(序号 65)。非 B 类课程两条均默认达标;违反时序号 64、65 分别判定,不得合并为一条扣分。
02 表专有编码校验(序号 6–10):按五级结构正则校验,命名为不合规即不达标。
典型工作任务 ^\d+\..+$ 且不含「学习」字眼
工作流程 ^\d+-\d+\..+$ 多条以 -> 连接
能力点 ^\d+-\d+-\d+\..+$
知识点 ^\d+-\d+-\d+-\d+\..+$
步骤 6 · 汇总得分
- 按一级评价维度累加「分值小计」「得分」「得分率」。
- 累加总分,与规则集满分(100)比对,计算得分率。
- 统计四项条目数:达标(含默认达标)、不达标、材料缺失、条件豁免生效。
步骤 7 · 生成 Excel 报告
Excel 文件生成本身不是本技能的职责范围,须先加载 tencent-docs-routing 技能,再由其路由至 tencent-docs-sheet-generation 技能创建 xlsx(本场景无源表格文件,属从零生成)。
报告包含 4 个工作表:
Sheet 1「评价总览」
- 基本信息区:课程名称 / 课程代码 / 开课学院 / 适用专业 / 总学时 / 课程类别(A/B/C)/ 评价日期 / 所用规则文件 / 规则条目数 / 满分 / 评价人
- 结果区:得分合计 / 满分 / 得分率 / 达标条目数 / 不达标条目数 / 材料缺失条目数 / 默认达标条目数
- 维度得分矩阵:
| 一级评价维度 | 条目数 | 分值小计 | 得分 | 得分率 |
|---|---|---|---|---|
- 若存在类型判定假设,在末行注明「判定假设」。
Sheet 2「逐条判定明细」(覆盖规则集全部条目,按序号升序)
| 序号 | 评价维度 | 检查点 | 达标标准 | 分值 | 判定结果 | 得分 | 依据定位 | 扣分原因 | 整改建议 |
|---|---|---|---|---|---|---|---|---|---|
- 「判定结果」取值:达标 / 默认达标 / 不达标。
- 「达标标准」原文照录,保证报告可独立复核。
- 「依据定位」为课程标准中的章节 + 原文片段。
实现要点(避免返工):
- 「达标标准」不要手敲 —— 用脚本解析
references/rules-02-practice.md的规则明细表自动提取(5 列行的第 2 列是评价维度、4 列行的维度取自其上级###小节标题),既保证原文照录又零抄写误差。 - 本表末尾须追加一列「汇总维度」,逐行写入与 Sheet 1 维度矩阵完全一致的维度键(如「岗位能力图谱」「课程基本信息-教学模式」「课程教学单元设计」)。Sheet 1 的条目数/分值小计/得分一律用
COUNTIF/SUMIF引用本列,不得手填或硬编码;仅靠 B 列「评价维度」做匹配会因两级命名(岗位能力图谱-结构)与拆分维度(课程基本信息-基础信息/-教学模式)而失配。 - 「得分」写成公式
=IF($F2="不达标",0,$E2),不要写死;「判定结果」列加条件格式(不达标→红底红字#FFC7CE/#9C0006;默认达标→绿底绿字#C6EFCE/#006100)。 - Sheet 1 的结果区同样全部公式化:得分合计
=SUM(逐条判定明细!G2:G{末行});达标条目数=COUNTIF(...,"达标")+COUNTIF(...,"默认达标");材料缺失条目数=COUNTIF(逐条判定明细!I2:I{末行},"材料缺失*")(依赖「扣分原因」列以「材料缺失」开头);得分率为比率公式,须带分母空值+0 值保护。「末行」随所用规则集变动,不得硬编码:02 表为101,01 表为82(= 1 + 条目数)。 - 公式必须经 recalc 产出缓存值后方可交付;Excel 未装 LibreOffice 时可由纯 Python 引擎降级补齐(本机依赖装在隔离 venv
C:\Users\Sean\.workbuddy\binaries\python\envs\default)。
Sheet 3「重点整改清单」(仅含不达标与材料缺失条目)
| 序号 | 评价维度 | 检查点 | 分值 | 依据定位 | 整改要点 |
|---|---|---|---|---|---|
- 排序规则:按分值降序;分值相同按序号升序。
- 表尾给出合计扣分。
Sheet 4「条件豁免与属性判定」
- 属性判定区:属性项 / 判定值 / 来源依据
- 豁免条目区:
| 序号 | 检查点 | 豁免条件 | 本次是否适用 | 处理方式 |
|---|---|---|---|---|
表文件名建议:课程标准评价报告-<课程名称>-<YYYYMMDD>.xlsx,保存至当前工作目录或用户指定位置。
步骤 8 · 呈现结果
生成报告后,必须通过文件呈现工具将 xlsx 交付给用户,并在回复中给出:总分与得分率、维度得分薄弱项、重点整改条目数及主要问题概述、类型判定假设(如有)。
五、硬性约束
- 规则集与课程类型必须严格对应,不得跨表混用条目。
- 不得增删检查点,不得改写达标标准语义;规则集全部条目均须出现在「逐条判定明细」中。
- 每条判定必须有依据定位,禁止无证据判定。
- 不得臆造阈值。所有数值判据以规则集「可直接编码的判定阈值」表为准。
- 不得自行设定合格线。「得分率」仅为参考指标;是否合格由学校规定或用户指定,技能不得擅自作合格/不合格结论。
- 条件豁免的判定顺序:先判定属性 → 再决定该条是「实评」还是「默认达标」,避免误扣分。
六、参考文件索引
| 文件 | 内容 |
|---|---|
references/rules-01-theory.md |
纯理论课评价规则全文:81 条明细、维度分值分布、判定阈值表、技能化复用要点、修订记录 |
references/rules-02-practice.md |
含实践课程评价规则全文:100 条明细、图谱五级编码规范、判定阈值表、技能化复用要点、修订记录 |
scripts/verify_rules.py |
规则稿校验工具(纯标准库,零依赖):内部一致性自检 + 与源 Excel 逐条比对 |
scripts/repair_xlsx_parts.py |
源表回写后的部件修复与体检工具:恢复批注/VML/自定义属性、重建关系、清理孤儿共享字符串 |
scripts/patch_shared_strings.py |
轻量回写:定向替换共享串文本,仅改文字时用——其余部件字节级不动,无需部件修复 |
两份参考文件体量较大(27 KB / 35 KB),按需加载:先据步骤 3 确定课程类型,仅加载所需的那一份,无需同时载入两份。
规则稿维护(每次修订规则后必做)
规则稿可能经人工修订而与源 Excel 产生差异,差异一律登记在规则稿文末「§七 修订记录」。修订后运行:
python scripts/verify_rules.py --all # 两份全跑(自检 + 与桌面源表比对)
python scripts/verify_rules.py --md references/rules-01-theory.md # 仅内部一致性自检
自检覆盖:序号连续性、分值合计 = 100、§三 维度分布表与明细表交叉核对、序号区间与条目数一致、§五/§六/§七 引用的序号存在、2 分条目清单完备。自检项失败时不得交付;与源表的差异项属信息性输出,需确认已登记入「§七 修订记录」。
> 评价报告若基于修订过的规则稿,须在报告基本信息区注明所用规则稿版本及「与源表存在差异」字样。
源表回写(规则稿 → 桌面 Excel)
规则稿定稿后需回写桌面源表,使 xlsx 与规则稿一致、成为事实标准。先按改动性质选路径:
| 改动性质 | 推荐路径 | 说明 |
|---|---|---|
| 仅改文字(改检查点/达标标准的措辞、阈值、示例;不增删行、不改结构) | 定向 XML 替换(首选) | 只替换 xl/sharedStrings.xml 中对应 <si> 的 <t> 文本,其余 zip 条目字节级原样保留(批注、VML、自定义属性、全部关系与命名空间),从根上规避下方三个坑,无需部件修复 |
| 删整行 / 增行 / 改单元格结构 | editor_sdk + 部件修复 | 见下方完整流程 |
定向 XML 替换要点(实测流程,专治「只改文字」):
- 共享串形如
<si><t>……</t></si>,按索引被单元格引用(<c t="s"><v>索引</v></c>);替换前先断言目标串全文唯一(count == 1)且该索引处原文与预期逐字符一致,否则中止——改错一处会连带污染其它单元格; - 只改文本节点,不新增、不删除
<si>,count/uniqueCount属性不受影响; - 重打包时对每个条目
writestr(原 ZipInfo, 原字节),仅sharedStrings.xml换新字节,保持条目顺序与压缩方式; - 写盘用「同目录 tmp + 覆盖」:
os.replace在本环境存在 WinError 5 瞬时拒绝,失败须降级shutil.copyfile并重试; - 收尾断言:相对改动前的备份,应当只有
xl/sharedStrings.xml一个条目的内容不同;并复核<f>公式单元格的数值缓存(如合计行=SUM(E2:E82)缓存 100)未被触及。
一条命令完成(含自动备份、写盘降级、收尾断言):
python scripts/patch_shared_strings.py \
--src "C:/Users/Sean/Desktop/01纯理论课的课程标准评价规则.xlsx" \
--set "旧文本=>新文本" --set "旧文本2=>新文本2" [--dry-run]
旧文本给整格全文(推荐)或格内片段(须在全表唯一,工具会校验并给出候选项);幂等,重复执行自动跳过;备份落在 <src 同目录>/_xlsx_backup/。
> 该路径下不产生批注丢失、锚点错位、dimension 异常、孤儿串四类问题,因此不必进入下面的修复流程。
改行/改结构时:用 editor_sdk 写值/删行后必须做部件修复,否则会:
- 丢掉批注正文(
xl/comments1.xml)、批注形状(xl/drawings/vmlDrawing1.vml)、工作表关系(xl/worksheets/_rels/sheet1.xml.rels)、自定义属性(docProps/custom.xml)——本项目批注含作者撰写的实质性说明与教学示例,属必须恢复的内容,不是可选项; - 删整行后
<legacyDrawing>、批注锚点、VML 形状行号与实际行错位(批注浮标跑到别的行); - 在
sharedStrings.xml残留孤儿串(被替换掉的旧措辞),事实标准文件不应内嵌已废弃表述。
流程:
- 先备份原件到
backup/(保留批注/自定义属性等全部部件)。回写前的原件就是修复所需的部件来源,必须留存。 - 回写数据:删行用
sheet_delete_dimension,写值用sheet_set_cell_value(批量sheet_set_range_value需带value_type,且部分环境报workbook is not open,失败即退回逐格写)。删行后序号列必须整体重编号,并同步改规则稿。 - 一键修复 + 结构体检:
python scripts/repair_xlsx_parts.py all \
--src "C:/Users/Sean/Desktop/01纯理论课的课程标准评价规则.xlsx" \
--origin "backup/01_原始_20260926.xlsx" \
--remap-comment B59:B55 # 仅删行导致锚点位移时给出,可多次
脚本执行:恢复批注 / VML / custom → 重建工作表关系 → 补 xmlns:r 与 [Content_Types] 覆盖 → 按新锚点重映射 VML 行号 → 清理孤儿串 → 结构体检(zip 完整性 / XML 良构 / 关系图 / 内容类型 / 越界与孤儿索引 / 批注锚点对齐)。
也可分步:repair / clean / verify。
- 必须再跑内容比对,确认回写无损:
python scripts/verify_rules.py --all
自检项与「与源表逐条比对」全绿才算交付。
> 回写通道的三个坑(均实测踩过;脚本已内置规避,改脚本时勿回退):
> ① 跨目录 os.rename / os.replace 会被沙箱拦截(WinError 5 / 32)→ 必须「同目录 tmp + os.replace」并对瞬时占用重试;
> ② 注入 r:id 后若工作表根元素缺 xmlns:r,XML 出现未绑定前缀,Excel 报错打不开;
> ③ 清理 sst 时切分单元格的正则必须用惰性 [^>]*?:贪婪会把自闭合标签 <c r="B83" s="14" t="s"/> 的 / 吃进 [^>]*,使 /> 分支失配、退回 >... 分支,从自闭合单元格一路跨段匹配到后面的公式单元格 <c r="E83" s="13"><f>=SUM(E2:E82)</f><v>100</v></c>,把公式的数值缓存当成共享串索引改写(实测把合计 100 改成 99)。脚本内置「公式单元格指纹」强校验,被动即中止。