# 2026 年 1-15 志愿分数线导入经验说明 本文用于明年继续处理上海中考 `1-15志愿` 分数线时快速上手。 ## 目标和表 - 数据库表:`kylx365_db.MPS_Score` - 年份:`ScoreYear = 2026` - 类型:`ScoreType = 1-15志愿` - 关键字段:`DistrictID`、`SchoolTarget`、`SchoolFullName`、`SchoolTargetRemark`、`PlanNum`、`ScoreTotal`、`Score1`、`Score2`、`Score3`、`Score4`、`ScoreTotalDifferenceValue` - 2026 最终库内总量:16 个区,961 行,重复 key 为 0 ## 目录 源文件目录: ```text /Volumes/程杰外接SD盘/上海中考招生计划/2026/分数线/1-15志愿 ``` 计划文件目录: ```text /Volumes/程杰外接SD盘/上海中考招生计划/2026/计划/1-15志愿 ``` 工作目录: ```text /Users/chengjie/Documents/git/miaoguo_system_server/秒过分数线数据导入 ``` ## 主要脚本 - `import_mps_score_1_15_batch_from_json_2026.js` - 通用 JSON 导入器,按学校名和备注匹配数据库计划行。 - 适合文字层 PDF、HTML、MHTML、已人工/OCR 整理后的 JSON。 - `import_mps_score_1_15_xuhui_scores_2026.js` - 徐汇专用,因源 PDF 是扫描图,最终按 3 页 PDF 手工核准。 - `import_mps_score_1_15_baoshan_scores_2026.js` - 宝山专用,处理大量总分-only 行。 - `import_mps_score_1_15_pudong_scores_2026.js` - 浦东专用,处理多页大表和 1 条库有源无计划行。 - `audit_mps_score_1_15_2026_final.js` - 最终抽样审计脚本:比对源报告和数据库、查重复 key、生成高风险抽样清单。 - `generate_mps_score_1_15_2026_full_review_report.js` - 汇总数据库、最新干跑报告、计划交叉核查报告,重写全量复查报告。 - `fix_mps_score_1_15_2026_missing_plan_rows.js` - 专门处理“分数线有、计划图也有、数据库缺计划行”的补库脚本;2026 已补松江区上海创艺高级中学 1 行。 - `ocr_image_text.swift` - macOS Vision OCR 辅助脚本,用于截图/JPEG/扫描 PDF 的文字识别。 ## 2026 源文件处理方式 |区|最终依据|说明| |---|---|---| |黄浦|`黄浦区.pdf`|文字层 PDF,67 行;PDF 无综合测试列,`Score4` 保持空。| |徐汇|`徐汇区.pdf`|扫描 PDF,3 页;曾漏第 3 页,已补齐 68 行。| |长宁|`长宁区.pdf`|文字层 PDF,57 行;库内另有新纪元计划行,源 PDF 未列,保留 0 分。| |静安|`静安区-本区.pdf` + `静安区-外区.pdf`|源有宋庆龄、博华、新纪元 3 行库无;已查计划图 `静安区2.png` 未见,不补库,列入源/计划不一致复查。库有新和停招,按停招保留。| |普陀|`普陀区.pdf`|文字层 PDF,68 行。| |虹口|`虹口区.mhtml`|MHTML 表格,使用简称映射到数据库全称,50 行。| |杨浦|`杨浦区.html`|源有 `复旦大学第二附属中学`,已查 `杨浦区1.png` + `杨浦区2.png` 未见计划,不补库,列入源/计划不一致复查。| |闵行|`闵行区.pdf`|文字层 PDF,80 行;5 行只公布总分。| |宝山|`宝山区.pdf`|PDF 2 页,59 行;17 行只公布总分。| |嘉定|`嘉定区.pdf`|文字层 PDF,54 行;33 行只公布总分。| |浦东|`浦东新区.pdf`|PDF 3 页,106 源行;库内另有川沙中学北校,源未列,保留 0 分。| |金山|`金山区.pdf`|源 40 行,库 42 行;2 条库有源无,列入复查。| |松江|`松江区.mhtml`|源 58 行,匹配 56;计划图确认上海创艺高级中学有 2 个计划,已补入数据库 ID 40207。宝山世外、远东在计划图未见,不补库;5 条库有源无按未投档保留。| |青浦|`青浦区.html`|HTML 54 行;当前 HTML 已复核,changed_rows=0。| |奉贤|`奉贤区.html`|HTML 46 行。| |崇明|`崇明区1.jpeg`|JPEG 单图,29 行;低分段已人工视觉确认。| ## 数据约定 - `ScoreTotal` 为录取最低分。 - `Score1` 为语数外总分。 - `Score2` 为数学。 - `Score3` 为语文。 - `Score4` 为综合测试。 - 源文件只有总分、没有末位考生分项时:录入 `ScoreTotal`,`Score1` 到 `Score4` 留空。 - 源文件为 `/`、无考生达线、线上无人投档、控分线上无考生录取时:录入 `ScoreTotal = 0`,分项通常为 0。 - PDF 没有综合测试列时不要补猜,例如黄浦区 `Score4` 留空。 - `ScoreTotalDifferenceValue` 用当前总分减上一年同 key 总分;无考生/0 分行建议保持空,避免出现误导性的负差。 - 有计划但分数线源未列,是正常未投档/无学生报入,库内计划行保留 0 分,不算错误。 - 分数线源有但数据库没有计划行时,必须查计划图:计划图有才补库,计划图未见则列为源文件/计划文件不一致复查,不要强行补到数据库。 ## 推荐流程 1. 先确认当前库里 2026 年计划行是否已建好: ```sql SELECT DistrictID, COUNT(*), SUM(PlanNum) FROM MPS_Score WHERE ScoreYear = 2026 AND ScoreType = '1-15志愿' GROUP BY DistrictID ORDER BY DistrictID; ``` 2. 对源文件分类: - 文字层 PDF:优先用 `pdfplumber.extract_tables()`。 - HTML/MHTML:用 HTML parser 抽 ``。 - 扫描 PDF/JPEG/PNG:先 `pdftoppm` 渲染,再用 Vision OCR 和人工视觉核对。 3. 抽成统一 JSON,字段用 `schoolName`、`scoreTotal`、`score1`、`score2`、`score3`、`score4`、`officialRemark`。 4. 先干跑: ```bash node import_mps_score_1_15_batch_from_json_2026.js --input=输入.json --dry-run ``` 5. 确认 `problem_rows` 和 `not_in_source_rows`: - `not_in_source_rows`:库有计划、分数线源未列,通常是未投档,保留。 - `problem_rows` / `missing_current_row`:先查计划目录。计划图有则补库,计划图未见则记报告。 6. 正式导入: ```bash node import_mps_score_1_15_batch_from_json_2026.js --input=输入.json ``` 7. 跑最终审计和全量报告: ```bash node generate_mps_score_1_15_2026_full_review_report.js node audit_mps_score_1_15_2026_final.js node generate_mps_score_1_15_2026_full_review_report.js ``` ## 常见坑 - 官方源可能后续更新格式,目录里后来的 PDF/HTML 要优先于早期截图。 - 学校名带括号时,数据库可能拆在 `SchoolTargetRemark`,例如艺术班、英语等。 - 虹口 MHTML 使用简称,要先映射到数据库全称。 - 静安、杨浦、松江等可能出现源文件有学校但计划库无对应行,不能强行写到别的学校;先用计划图核实。 - 低分段常被误判为 OCR 错误,必须看源图:2026 年宝山民一综合 `59`、崇明民一数学 `40` 都是真值。 - `/` 和 `未录满` 不总是等于 0;有些区会写总分 `501` 且无分项,这应作为总分-only,而不是 0。 ## 2026 已知待复查清单 最终详细清单见: - `mps_score_1_15_2026_full_review_report.json` - `mps_score_1_15_2026_full_review_report.md` - `mps_score_1_15_2026_sample_audit_report.json` - `mps_score_1_15_2026_sample_audit_report.md` 重点仍是源文件和计划文件不一致。库有源无按未投档保留,不再作为错误: - 静安:源有宋庆龄、博华、新纪元,计划图未见,库无。 - 杨浦:源有 `复旦大学第二附属中学`,计划图未见,库无。 - 松江:源有宝山世外、远东,计划图未见,库无。 - 松江:源有创艺且计划图有 2 个计划,已补入库,不再是问题。 - 长宁、浦东、金山、松江的库有源无行:有计划但分数线未列,按未投档保留 0 分。 ## 清理原则 - 保留导入脚本、最终源 JSON、最终审计报告和本经验说明。 - 可删除 `*backup*.json`、`tmp/`、`tmp_*.png`、`tmp_*.json`、`__pycache__/`。 - 清理前先确认不再需要回滚数据库;备份文件只用于当次导入回滚。