菌群报告和 DAN 测评报告的 Python 解析脚本(docs/参考资料/)是离线数据预处理工具。Java 运行时(cfc-backend/)已有部分实现但覆盖不全。
| 解析器 | Java 现状 | Python 覆盖 | 差距 |
|---|---|---|---|
菌群报告 PdfParseService |
✅ 868行,PDFBox,完整 | extract_full_report_v5.py 1393行 |
持平,Java 已可用于生产 |
| DAN A2 (mind) | ✅ 已完成 | extract_a2_data() |
持平 |
| DAN B4 (wisdom) | ✅ 已完成 | extract_b4_data() |
持平 |
| DAN A1 儿童认知 | ❌ 未实现 | extract_a1_data() |
需移植 |
| DAN B2 儿童行为 | ❌ 未实现 | extract_b2_data() |
需移植 |
| DAN B3 学习能力 | ❌ 未实现 | extract_b3_data() |
需移植 |
| DAN B5 青春期 | ❌ 未实现 | extract_b5_data()(含仪表盘图片分析) |
需移植 |
| DAN B6 职业发展 | ❌ 未实现 | extract_b6_data() |
需移植 |
| DAN C1 校园版 | ❌ 未实现 | extract_c1_data() |
需移植 |
菌群报告:Java 已满足生产需求,不做变动。Python 脚本保留为离线参考。
DAN 报告:分3波迁移。每波包含:解析逻辑 → 新增 Controller 端点 → 测试验证。
目标:纯文本正则提取,无图片分析,约 140 行 Python → Java
Python: extract_a1_data() ~43 行
{维度名_pct, 维度名_score}Java 实现方案:
DanReportParseService 中新增 parseA1Report(List<String> lines, String fullText) 方法DataItem 和 DanParsedReport 结构dan_assessment_results 表的 attention_score, memory_score, perception_score, spatial_score, processing_speed_score, logic_score 字段dimension="cognition" 路由分支(parseText() 中)Python: extract_b3_data() ~74 行
Java 实现方案:
parseB3Report() 方法findSectionStart() + parseScorePairs() 模式dimension="learning" 路由分支DanReportParseService.java
├── parseText(): 新增 "cognition" / "learning" 路由
├── parseA1Report() ← 新增,~60 行
├── parseB3Report() ← 新增,~80 行
├── parseScorePairs() ← 新增辅助方法,复用正则
└── DataItem / DanParsedReport 结构不变
DanAssessmentController.java
├── parsePreview(): 放开 dimension 校验(当前只允许 mind/wisdom)
└── dimension 映射表: cognition→A1, learning→B3
schema.sql / DatabaseInitializer
└── 无需新增表(dan_assessment_results 已有 JSON 字段 structured_analysis)
Python: extract_b2_data() ~74 行
Java 实现方案:
parseB2Report() 方法parseSelfConcept()(已存在于 B4 解析中)dimension="behavior" 路由Python: extract_b6_data() ~77 行
Java 实现方案:
parseB6Report() 方法dimension="career" 路由Python: extract_c1_data() ~91 行
Java 实现方案:
parseC1Report() 方法parseA1Report() 的认知维度提取 + A2 的大五人格提取dimension="campus" 路由DanReportParseService.java
├── parseText(): 新增 "behavior"/"career"/"campus" 路由
├── parseB2Report() ← 新增,~80 行
├── parseB6Report() ← 新增,~80 行
├── parseC1Report() ← 新增,~60 行(复用现有方法)
├── parseFamilyEnvironment() ← 新增辅助方法
├── parseHollandInterest() ← 新增辅助方法
└── parseMultipleIntelligence() ← 新增辅助方法
DanAssessmentController.java
└── 路由映射扩展
schema.sql / DatabaseInitializer
└── 无需新增表
Python: extract_b5_data() + 罗盘仪表盘图片分析 ~150 行
Java 实现方案:
parseB5Report(),正则提取各维度分数,这覆盖 80% 的数据PDImageXObjectBufferedImage 做像素颜色分析(替代 Python 的 PIL 角度测量)dimension="adolescent" 路由谨慎意见:B5 指南针仪表盘是 PNG 嵌入图像,PDFBox 可以提取,但像素级别的指针角度分析在 Java 中更啰嗦(需用 BufferedImage.getRGB() 手动实现)。可以考虑:
DanReportParseService.java
├── parseText(): 新增 "adolescent" 路由
├── parseB5Report() ← 新增,~120 行(文本部分)
├── parseB5CompassImage() ← 可选,降级优先
└── extractImageFromPDF() ← 新增辅助(PDFBox→BufferedImage)
DanAssessmentController.java
└── 路由映射扩展 + 处理 B5 图片分析结果
schema.sql / DatabaseInitializer
└── 无需新增表
每波完成后验证:
cfc-backend/src/test/java/.../DanReportParseServiceTest.java
├── testParseA1Report() — 用真实 A1 PDF 测试 6 维度提取
├── testParseB3Report() — 用真实 B3 PDF 测试
├── testParseA2Report() — 已有,确认回归
├── testParseB4Report() — 已有,确认回归
├── testParseB2Report() — Wave 2
├── testParseB6Report() — Wave 2
├── testParseC1Report() — Wave 2
└── testParseB5Report() — Wave 3
HealthReportControllerTest.java
└── testUploadGutFloraReport() — 回归确认菌群报告不受影响
测试用 PDF:docs/参考资料/dan_reports/ 下已有各类型真实 PDF 样本。
验证命令:
cd cfc-backend && mvn clean compile test -Dtest=DanReportParseServiceTest
extract_full_report_v5.py:保留为离线参考dan_reports/:完整保留,不删除PdfParseService.java:不做任何改动HealthReportController.java:不做任何改动dan_assessment_results.structured_analysis(JSON 字段)已支持所有 DAN 报告类型的结构化数据存储| Wave | 新增 Java 行数 | 类型数 | 复杂度 | 估计工时 |
|---|---|---|---|---|
| Wave 1 (A1+B3) | ~140 | 2 | 低 | 1-2 天 |
| Wave 2 (B2+B6+C1) | ~220 | 3 | 中 | 2-3 天 |
| Wave 3 (B5) | ~150 | 1 | 高 | 1-2 天(文本)/ +2天(图像) |
| 合计 | ~510 | 6 | — | 4-7 天 |
| Risk | 影响 | 缓解措施 |
|---|---|---|
| Python 正则与 PDF 实际格式强耦合,不同 PDF 版本格式不同 | 提取失败/漏数据 | 测试覆盖多种 PDF 样本;Java 中用多模式回退(Python 已有多模式模式,直接移植) |
| PDFBox 文本提取顺序和 PyMuPDF 不同 | 正则不匹配 | parseText() 中增加行合并预处理;对比 5+ 份 PDF 输出 |
| B5 图片分析在 PDFBox 中比 PyMuPDF 更复杂 | 开发成本翻倍 | Wave 3 先做文本部分,图片分析延后独立 |
DanAssessmentController 现有接口调用方依赖 mind/wisdom |
前端不兼容 | 向后兼容:老 dimension 值保持可用,新值只影响解析路径 |