# 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 抽 `