|
|
@@ -44,6 +44,7 @@ import com.etotem.cfc.service.BasicQuotaService;
|
|
|
import com.etotem.cfc.service.NutritionDeficiencyService;
|
|
|
import com.etotem.cfc.service.NormalizeIndicatorPipeline;
|
|
|
import com.etotem.cfc.service.PdfParseService;
|
|
|
+import com.etotem.cfc.service.GuheReportPersonalLayerAssert;
|
|
|
import com.etotem.cfc.service.ReportCollectService;
|
|
|
import com.etotem.cfc.service.ReportTransferService;
|
|
|
import com.etotem.cfc.service.ReportBlockAssembler;
|
|
|
@@ -2241,10 +2242,10 @@ public class HealthReportController {
|
|
|
ParsedReportPayload.Indicator ind = new ParsedReportPayload.Indicator();
|
|
|
ind.setCategory(pi.getCategory());
|
|
|
ind.setIndicatorName(pi.getIndicatorName());
|
|
|
- ind.setIndicatorValue(pi.getIndicatorValue());
|
|
|
- ind.setRefRange(pi.getRefRange());
|
|
|
- ind.setStatus(pi.getStatus());
|
|
|
- ind.setSymptoms(pi.getSymptoms());
|
|
|
+ ind.setIndicatorValue(sanitizePersonalLayerValue(pi.getIndicatorName(), pi.getIndicatorValue()));
|
|
|
+ ind.setRefRange(sanitizePersonalLayerValue(pi.getIndicatorName(), pi.getRefRange()));
|
|
|
+ ind.setStatus(sanitizePersonalLayerValue(pi.getIndicatorName(), pi.getStatus()));
|
|
|
+ ind.setSymptoms(sanitizePersonalLayerValue(pi.getIndicatorName(), pi.getSymptoms()));
|
|
|
indicators.add(ind);
|
|
|
}
|
|
|
payload.setIndicators(indicators);
|
|
|
@@ -2303,16 +2304,33 @@ public class HealthReportController {
|
|
|
private ParsedReportPayload.Flora convertFlora(ParsedGutFlora pgf) {
|
|
|
ParsedReportPayload.Flora f = new ParsedReportPayload.Flora();
|
|
|
f.setBacteriaName(pgf.getBacteriaName());
|
|
|
- f.setBacteriaValue(pgf.getBacteriaValue());
|
|
|
- f.setNormalRange(pgf.getNormalRange());
|
|
|
- f.setPopulationLevel(pgf.getPopulationLevel());
|
|
|
- f.setDetectionRate(pgf.getDetectionRate());
|
|
|
- f.setDescription(pgf.getDescription());
|
|
|
+ f.setBacteriaValue(sanitizePersonalLayerValue(pgf.getBacteriaName(), pgf.getBacteriaValue()));
|
|
|
+ f.setNormalRange(sanitizePersonalLayerValue(pgf.getBacteriaName(), pgf.getNormalRange()));
|
|
|
+ f.setPopulationLevel(sanitizePersonalLayerValue(pgf.getBacteriaName(), pgf.getPopulationLevel()));
|
|
|
+ f.setDetectionRate(sanitizePersonalLayerValue(pgf.getBacteriaName(), pgf.getDetectionRate()));
|
|
|
+ f.setDescription(sanitizePersonalLayerValue(pgf.getBacteriaName(), pgf.getDescription()));
|
|
|
f.setCategory(pgf.getCategory());
|
|
|
f.setLevel(pgf.getLevel());
|
|
|
return f;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 写库前个人层内容级断言 + 清洗(能力键 guhe.report.personalAssert,T2 内容级,L2-4)。
|
|
|
+ *
|
|
|
+ * <p>对报告个人层字符串值做全文扫描:不含分页残段({@code \d{1,3}/16\d},样例 {@code 34/167})
|
|
|
+ * 与 {@code ND 参考} 标记时原样返回;含脏数据时写库前清洗(移除残段/标记)并告警,
|
|
|
+ * 避免分页拼接残段混入个人层数据。键名级白名单见 {@link GuheReportPersonalLayerAssert#_PERSONAL_KEYS}。</p>
|
|
|
+ */
|
|
|
+ private String sanitizePersonalLayerValue(String key, String value) {
|
|
|
+ if (value == null || GuheReportPersonalLayerAssert.assertPersonalContent(value)) {
|
|
|
+ return value;
|
|
|
+ }
|
|
|
+ String cleaned = GuheReportPersonalLayerAssert.scrubPersonalContent(value);
|
|
|
+ log.warn("guhe.report.personalAssert: 个人层数据[{}]含分页残段/ND参考,写库前已清洗: '{}' -> '{}'",
|
|
|
+ key, value, cleaned);
|
|
|
+ return cleaned;
|
|
|
+ }
|
|
|
+
|
|
|
private ParsedReportPayload.Payload buildPayloadFromLgData(Map<String, Object> lgData) {
|
|
|
ParsedReportPayload.Payload payload = new ParsedReportPayload.Payload();
|
|
|
|