|
|
@@ -10,6 +10,20 @@ from app.parsers.pdf_parser import parse_report_pdf_with_fallback
|
|
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
+# 算法解析器使用中文键名(与 extract_full_report_v5.py 一致),
|
|
|
+# Java 消费端期望英文键名;在此做双向映射,Java 读取英文键即可。
|
|
|
+_CN_TO_EN_OVERVIEW: dict[str, str] = {
|
|
|
+ '健康总分': 'overallScore',
|
|
|
+ '菌群健康': 'gutHealthScore',
|
|
|
+ '慢病控制': 'chronicDiseaseScore',
|
|
|
+ '营养均衡': 'nutritionScore',
|
|
|
+ '肠道菌群平衡': 'balanceScore',
|
|
|
+ '菌群多样性': 'diversityScore',
|
|
|
+ '有益菌': 'beneficialScore',
|
|
|
+ '有害菌': 'harmfulScore',
|
|
|
+ '核心菌属': 'coreGenusScore',
|
|
|
+}
|
|
|
+
|
|
|
|
|
|
class ReportParseAgent:
|
|
|
"""报告解析 Agent"""
|
|
|
@@ -17,6 +31,16 @@ class ReportParseAgent:
|
|
|
def __init__(self):
|
|
|
self.llm_api_key = getattr(settings, 'llm_api_key', '')
|
|
|
|
|
|
+ @staticmethod
|
|
|
+ def _normalize_overview_keys(result: dict) -> None:
|
|
|
+ """将 overview 中的中文键名映射为英文键名(双向写入),兼容 Java 消费端。"""
|
|
|
+ overview = result.get('overview')
|
|
|
+ if not overview:
|
|
|
+ return
|
|
|
+ for _cn, _en in _CN_TO_EN_OVERVIEW.items():
|
|
|
+ if _cn in overview and _en not in overview:
|
|
|
+ overview[_en] = overview[_cn]
|
|
|
+
|
|
|
async def parse(self, file_path: str) -> dict:
|
|
|
"""解析 PDF 报告,算法解析 + LLM 兜底"""
|
|
|
# 1. 算法解析
|
|
|
@@ -24,6 +48,9 @@ class ReportParseAgent:
|
|
|
logger.info("算法解析完成: format=%s, overview_keys=%d",
|
|
|
result.get('format'), len(result.get('overview', {})))
|
|
|
|
|
|
+ # 1.5 归一化 overview 键名:中文 → 英文(Java 消费端兼容)
|
|
|
+ self._normalize_overview_keys(result)
|
|
|
+
|
|
|
# 2. 如果解析不完整,LLM 兜底
|
|
|
if result.get('_parse_incomplete') or not result.get('disease_risks'):
|
|
|
logger.info("算法解析不完整,尝试 LLM 兜底")
|