|
|
@@ -1,6 +1,7 @@
|
|
|
package com.etotem.cfc.service;
|
|
|
|
|
|
import com.etotem.cfc.common.Result;
|
|
|
+import com.etotem.cfc.dto.ParsedReportResult;
|
|
|
import com.etotem.cfc.entity.ReportUnknownCluster;
|
|
|
import com.etotem.cfc.entity.ReportUnknownUpload;
|
|
|
import com.etotem.cfc.mapper.ReportUnknownClusterMapper;
|
|
|
@@ -49,6 +50,56 @@ public class ReportParserDispatchService {
|
|
|
|
|
|
private static final int AUTO_LEARN_THRESHOLD = 3;
|
|
|
|
|
|
+ // ==================== guhe_v2 格式版本分流(T8/L1-3) ====================
|
|
|
+
|
|
|
+ /** guhe_v2 专用解析器脚本名(32 键新版标准报告应走此提取器,不落入 unknown→LLM 兜底) */
|
|
|
+ private static final String GUHE_V2_PARSER_SCRIPT = "extract_guhe_v2";
|
|
|
+
|
|
|
+ /** guhe_v2 报告指纹类型标识(32 键新版标准报告) */
|
|
|
+ private static final String GUHE_V2_TYPE_ID = "gut_flora_guhe_v2";
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 按《报告格式版本》分流(计划《2026-11-08-浠艾福平台程序修改计划》§三-T8 / L1-3):
|
|
|
+ * <ul>
|
|
|
+ * <li><b>32 键 guhe_v2</b>({@link ParsedReportResult#FORMAT_GUHE_V2},
|
|
|
+ * {@link ParsedReportResult#GUHE_V2_KEYS_32}):走 {@link #GUHE_V2_PARSER_SCRIPT} 专用提取分支,
|
|
|
+ * <b>不落入</b> unknown→LLM 兜底(禁把 32 键误判成路由错误);</li>
|
|
|
+ * <li>其余格式版本(旧 21 键 guhe {@link ParsedReportResult#LEGACY_KEYS_21} / beijing / null):
|
|
|
+ * 走原 v5 流程 {@link #parseReport},<b>禁止</b>被 guhe_v2 提取器强套。</li>
|
|
|
+ * </ul>
|
|
|
+ *
|
|
|
+ * @param reportFormatVersion 报告格式版本(guhe_v2 为 {@link ParsedReportResult#FORMAT_GUHE_V2};旧版传 null/其它)
|
|
|
+ * @return 解析结果(guhe_v2 走专用提取器;旧版走原 v5 流程)
|
|
|
+ */
|
|
|
+ public Result<Map<String, Object>> routeByFormatVersion(String reportFormatVersion, String pdfPath, String fileName) {
|
|
|
+ if (ParsedReportResult.FORMAT_GUHE_V2.equals(reportFormatVersion)) {
|
|
|
+ log.info("报告格式版本=guhe_v2(32 键新版),走专用提取器 extract_guhe_v2,不落 LLM 兜底");
|
|
|
+ return parseGuheV2(pdfPath, fileName);
|
|
|
+ }
|
|
|
+ log.info("报告格式版本={}(旧 21 键 / beijing / 未知),走原 v5 流程,不强套 guhe_v2",
|
|
|
+ reportFormatVersion == null ? "null(旧版)" : reportFormatVersion);
|
|
|
+ return parseReport(pdfPath, fileName);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 32 键 guhe_v2 专用解析分支:调用 {@link #GUHE_V2_PARSER_SCRIPT} 提取器。
|
|
|
+ * 提取器未就绪时返回明确错误,<b>绝不</b>回退到 unknown→LLM 兜底(T8 禁把 32 键误判成路由错误)。
|
|
|
+ */
|
|
|
+ private Result<Map<String, Object>> parseGuheV2(String pdfPath, String fileName) {
|
|
|
+ Map<String, Object> result = new LinkedHashMap<>();
|
|
|
+ Map<String, Object> parsed = fingerprintService.runParser(GUHE_V2_PARSER_SCRIPT, pdfPath);
|
|
|
+ if (parsed == null) {
|
|
|
+ log.warn("guhe_v2 提取器未就绪({} 缺失),32 键报告保持专用分支状态,不进入 LLM 兜底", GUHE_V2_PARSER_SCRIPT);
|
|
|
+ result.put("typeId", GUHE_V2_TYPE_ID);
|
|
|
+ result.put("parseMethod", "guhe_v2_pending_extractor");
|
|
|
+ return Result.error("guhe_v2 提取器未就绪,请平台装配 extract_guhe_v2 脚本后重试");
|
|
|
+ }
|
|
|
+ result.put("typeId", GUHE_V2_TYPE_ID);
|
|
|
+ result.put("parsedData", parsed);
|
|
|
+ result.put("parseMethod", "dedicated_parser_guhe_v2");
|
|
|
+ return Result.success(result);
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 解析报告:指纹检测 → 专用解析器 或 LLM 兜底
|
|
|
*/
|