package com.superbiz.agent.service; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.util.LinkedHashMap; import java.util.Map; /** * 统一维护 diagnosis_session.self_evaluation JSON 容器。 */ @Slf4j @Service public class SelfEvaluationMergeService { private static final TypeReference> MAP_TYPE = new TypeReference<>() {}; private final ObjectMapper objectMapper = new ObjectMapper(); public String mergeRuleEvaluation(String existingJson, Map ruleEvaluation) { return merge(existingJson, "rule_evaluation", ruleEvaluation); } public String mergeVerifierEvaluation(String existingJson, Map verifierEvaluation) { return merge(existingJson, "verifier_evaluation", verifierEvaluation); } private String merge(String existingJson, String key, Map value) { try { Map root = parseRoot(existingJson); root.put(key, value); return objectMapper.writeValueAsString(root); } catch (Exception e) { log.error("合并 self_evaluation 失败: key={}", key, e); return fallbackJson(key, value); } } private Map parseRoot(String existingJson) throws Exception { if (existingJson == null || existingJson.isBlank()) { return new LinkedHashMap<>(); } Map parsed = objectMapper.readValue(existingJson, MAP_TYPE); if (parsed.containsKey("rule_evaluation") || parsed.containsKey("verifier_evaluation")) { return new LinkedHashMap<>(parsed); } LinkedHashMap wrapped = new LinkedHashMap<>(); if (parsed.containsKey("evidence_score") || parsed.containsKey("source") || parsed.containsKey("factors")) { wrapped.put("rule_evaluation", parsed); return wrapped; } if (parsed.containsKey("verdict") || parsed.containsKey("groundedness_score") || parsed.containsKey("facts_checked")) { wrapped.put("verifier_evaluation", parsed); return wrapped; } return new LinkedHashMap<>(parsed); } private String fallbackJson(String key, Map value) { try { return objectMapper.writeValueAsString(Map.of(key, value)); } catch (Exception ex) { log.error("兜底序列化 self_evaluation 失败", ex); return "{}"; } } }