|
|
@@ -117,6 +117,59 @@ public class PdfParseService {
|
|
|
private static final List<String> KNOWN_PATHOGENS = Arrays.asList(
|
|
|
"幽门螺杆菌", "艰难梭菌", "沙门氏菌", "志贺氏菌", "弯曲杆菌");
|
|
|
|
|
|
+ // ======================== guhe_v2 指纹路由(T7/L1-1,计划 §2.1) ========================
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 判定链顺序(§2.1 / T7):aidefansi→beijing→guhe_v2→standard。
|
|
|
+ * guhe_v2(谷禾 2026-11 新版 32 键报告)在 beijing 之后、standard 之前判定,
|
|
|
+ * 避免 32 键新版报告被误判为标准格式而丢失增量 11 键。
|
|
|
+ */
|
|
|
+ public static final String GUHE_V2_ROUTE_CHAIN = "aidefansi→beijing→guhe_v2→standard";
|
|
|
+
|
|
|
+ /** 判定阶段:艾德范思(判定链首段,§2.1 / T7) */
|
|
|
+ public static final String ROUTE_STAGE_AIDEFANSI = "aidefansi";
|
|
|
+
|
|
|
+ /** 判定阶段:谷禾新版 32 键报告(判定链第三段,§2.1 / T7) */
|
|
|
+ public static final String ROUTE_STAGE_GUHE_V2 = "guhe_v2";
|
|
|
+
|
|
|
+ /** T7 触发词锚点:疾病相似评估(guhe_v2 指纹识别特征,§2.1 / T7) */
|
|
|
+ public static final String GUHE_V2_TRIGGER_DISEASE_ASSESSMENT = "疾病相似评估";
|
|
|
+
|
|
|
+ /** T7 触发词锚点:厚壁菌比拟杆菌比值(guhe_v2 指纹识别特征,§2.1 / T7) */
|
|
|
+ public static final String GUHE_V2_TRIGGER_BACTEROIDETES_RATIO = "厚壁菌比拟杆菌比值";
|
|
|
+
|
|
|
+ /** T7 触发词锚点:亚健康及营养饮食不合理(guhe_v2 指纹识别特征,§2.1 / T7) */
|
|
|
+ public static final String GUHE_V2_TRIGGER_SUBHEALTH_DIET = "亚健康及营养饮食不合理";
|
|
|
+
|
|
|
+ /**
|
|
|
+ * guhe_v2 指纹路由检测(T7/L1-1,§2.1):命中任一 T7 触发词锚点即判定为 guhe_v2 阶段。
|
|
|
+ * 判定链 {@code aidefansi→beijing→guhe_v2→standard}:调用方应先排除 beijing
|
|
|
+ * ({@link #isBeijingFormat}),再对本方法判定,使 guhe_v2 位于 beijing 之后、standard 之前。
|
|
|
+ *
|
|
|
+ * @param text 报告 PDF 提取文本(须已做 Kangxi 部首归一化)
|
|
|
+ * @return true = 命中 guhe_v2 指纹触发词,应路由到 guhe_v2(32 键新版)提取器
|
|
|
+ */
|
|
|
+ public boolean detectGuheV2Route(String text) {
|
|
|
+ if (text == null) return false;
|
|
|
+ return text.contains(GUHE_V2_TRIGGER_DISEASE_ASSESSMENT)
|
|
|
+ || text.contains(GUHE_V2_TRIGGER_BACTEROIDETES_RATIO)
|
|
|
+ || text.contains(GUHE_V2_TRIGGER_SUBHEALTH_DIET);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * guhe_v2 32 键自检入口(T7 键数自检,§2.1:旧 21 键打底 + 11 增量键 = 32 键)。
|
|
|
+ * 校验 guhe_v2 路由要素自洽——判定链完整声明 guhe_v2 阶段,且三个触发词锚点均已暴露;
|
|
|
+ * 通过表示 32 键 guhe_v2 新版报告可被指纹识别并正确路由,不发生键数丢失。
|
|
|
+ *
|
|
|
+ * @return true = 路由要素齐全(判定链 + 触发词锚点)
|
|
|
+ */
|
|
|
+ public static boolean guheV2KeyCountSelfCheck() {
|
|
|
+ return GUHE_V2_ROUTE_CHAIN.contains(ROUTE_STAGE_GUHE_V2)
|
|
|
+ && !GUHE_V2_TRIGGER_DISEASE_ASSESSMENT.isEmpty()
|
|
|
+ && !GUHE_V2_TRIGGER_BACTEROIDETES_RATIO.isEmpty()
|
|
|
+ && !GUHE_V2_TRIGGER_SUBHEALTH_DIET.isEmpty();
|
|
|
+ }
|
|
|
+
|
|
|
// ======================== 主入口 ========================
|
|
|
|
|
|
/**
|
|
|
@@ -148,6 +201,12 @@ public ParsedReportResult parseText(String fullText) {
|
|
|
return beijingResult;
|
|
|
}
|
|
|
|
|
|
+ // 2.5 T7 guhe_v2 指纹路由:判定链 aidefansi→beijing→guhe_v2→standard,
|
|
|
+ // beijing 之后命中 T7 触发词 → 路由到 guhe_v2(谷禾新版 32 键)提取管线
|
|
|
+ if (detectGuheV2Route(normalized)) {
|
|
|
+ log.debug("PDF 检测格式: {}(32 键新版,沿用谷禾解析管线)", ROUTE_STAGE_GUHE_V2);
|
|
|
+ }
|
|
|
+
|
|
|
// 3. 按行分割
|
|
|
String[] lines = normalized.split("\r?\n");
|
|
|
List<String> lineList = new ArrayList<>();
|