feat(mapping): 优化ICD到XML转换服务支持未匹配规则详情

- 实现convertFromJsonWithResult方法返回完整的转换结果
- 添加未匹配规则详细信息到生成结果的问题列表中
- 新增ConversionResult、RuleMatchingResult和UnmatchedRuleDetail数据结构
- 扩展应用规则逻辑以跟踪和报告未匹配的规则变体
- 重构buildXmlFromMapping方法以支持结果详情返回
- 更新控制台日志输出以显示规则匹配统计信息
This commit is contained in:
周宇 蔡
2026-05-06 15:43:19 +08:00
parent ddadf26837
commit 8a92ff3be0
2 changed files with 377 additions and 281 deletions

View File

@@ -27,7 +27,7 @@ public class IcdToXmlTaskAppService {
private final FileStorageService fileStorageService; private final FileStorageService fileStorageService;
private final IcdToXmlMappingService icdToXmlMappingService; private final IcdToXmlMappingService icdToXmlMappingService;
private final JsonToXmlConversionService jsonToXmlConversionService; private final JsonToXmlConversionService jsonToXmlConversionService;
public IcdToXmlTaskAppService(IcdParserService icdParserService, public IcdToXmlTaskAppService(IcdParserService icdParserService,
DefaultTemplateLoader defaultTemplateLoader, DefaultTemplateLoader defaultTemplateLoader,
IndexAnalysisService indexAnalysisService, IndexAnalysisService indexAnalysisService,
@@ -54,14 +54,13 @@ public class IcdToXmlTaskAppService {
IcdToXmlGenerateResult result = new IcdToXmlGenerateResult(); IcdToXmlGenerateResult result = new IcdToXmlGenerateResult();
try { try {
// ========== 第一步ICD → JSON ========== // ========== 第一步ICD → JSON ==========
// 1. 解析 ICD // 1. 解析 ICD
IcdDocument icdDocument = icdParserService.parse(command.getFileBytes(), command.getFileName()); IcdDocument icdDocument = icdParserService.parse(command.getFileBytes(), command.getFileName());
result.setIedName(icdDocument.getIedName()); result.setIedName(icdDocument.getIedName());
result.setLdInst(icdDocument.getLdInst()); result.setLdInst(icdDocument.getLdInst());
// 2. 加载 DefaultCfg.txt和默认配置 // 2. 加载 DefaultCfg.txt和默认配置
//DefaultTemplate template = defaultTemplateLoader.loadDefaultTemplateToXml();
DefaultTemplate template = defaultTemplateLoader.load(); DefaultTemplate template = defaultTemplateLoader.load();
result.getProblems().addAll(template.verify()); result.getProblems().addAll(template.verify());
@@ -102,24 +101,33 @@ public class IcdToXmlTaskAppService {
command.getAuthor() command.getAuthor()
); );
result.setMappingDocument(mappingDocument); result.setMappingDocument(mappingDocument);
// 7. 序列化为JSON字符串中间产物 // 7. 序列化为JSON字符串中间产物
String mappingJson = mappingDocumentSerializer.toPrettyJson(mappingDocument); String mappingJson = mappingDocumentSerializer.toPrettyJson(mappingDocument);
// ========== 第二步JSON → XML ========== // ========== 第二步JSON → XML ==========
// 8. 重新绑定正确索引 // 8. 重新绑定正确索引
IcdToXmlMappingService.IndexMappingConfig mappingConfig = icdToXmlMappingService.buildIndexMappingFromSelection(command.getIndexSelection()); IcdToXmlMappingService.IndexMappingConfig mappingConfig = icdToXmlMappingService.buildIndexMappingFromSelection(command.getIndexSelection());
icdToXmlMappingService.setIndexMapping(mappingConfig); icdToXmlMappingService.setIndexMapping(mappingConfig);
// 9. 从JSON转换为XML // 9. 从JSON转换为XML(带未匹配规则信息)
String xmlPath = jsonToXmlConversionService.convertFromJson( JsonToXmlConversionService.ConversionResult conversionResult =
mappingJson, jsonToXmlConversionService.convertFromJsonWithResult(
templateStream, mappingJson,
ruleStreams, templateStream,
icdToXmlMappingService.getIndexMapping() ruleStreams,
); icdToXmlMappingService.getIndexMapping()
result.setSavedPath(xmlPath); );
result.setSavedPath(conversionResult.getXmlContent());
// 10. 将未匹配的规则详细信息添加到 problems 中
if (conversionResult.getUnmatchedRuleDetails() != null && !conversionResult.getUnmatchedRuleDetails().isEmpty()) {
for (JsonToXmlConversionService.UnmatchedRuleDetail detail : conversionResult.getUnmatchedRuleDetails()) {
String problemMsg = "规则匹配失败: " + detail.getRuleKey() + " [" + detail.getRuleVariants() + "]";
result.getProblems().add(problemMsg);
}
}
result.setStatus(GenerateStatus.SUCCESS); result.setStatus(GenerateStatus.SUCCESS);
result.setMessage("映射生成成功"); result.setMessage("映射生成成功");
@@ -134,9 +142,6 @@ public class IcdToXmlTaskAppService {
/** /**
* 直接从 JSON 字符串生成 XML 文件。 * 直接从 JSON 字符串生成 XML 文件。
*
* @param mappingJson MMS 映射 JSON 字符串(由 getIcdMmsJson 接口返回)
* @return XML 生成结果
*/ */
public IcdToXmlGenerateResult generateXmlFromJson(String mappingJson){ public IcdToXmlGenerateResult generateXmlFromJson(String mappingJson){
IcdToXmlGenerateResult result = new IcdToXmlGenerateResult(); IcdToXmlGenerateResult result = new IcdToXmlGenerateResult();
@@ -149,7 +154,7 @@ public class IcdToXmlTaskAppService {
result.setMessage("XML 生成失败缺少默认xml配置文件"); result.setMessage("XML 生成失败缺少默认xml配置文件");
return result; return result;
} }
List<InputStream> ruleStreams = ruleBasedXmlMappingService.loadDefaultRuleFile(); List<InputStream> ruleStreams = ruleBasedXmlMappingService.loadDefaultRuleFile();
if (ruleStreams == null) { if (ruleStreams == null) {
result.setStatus(GenerateStatus.FAILED); result.setStatus(GenerateStatus.FAILED);
@@ -158,16 +163,25 @@ public class IcdToXmlTaskAppService {
return result; return result;
} }
// 2. 从 JSON 转换为 XML带未匹配规则信息
JsonToXmlConversionService.ConversionResult conversionResult =
jsonToXmlConversionService.convertFromJsonWithResult(
mappingJson,
templateStream,
ruleStreams,
icdToXmlMappingService.getIndexMapping()
);
result.setMappingXml(conversionResult.getXmlContent());
// 3. 将未匹配的规则详细信息添加到 problems 中
if (conversionResult.getUnmatchedRuleDetails() != null && !conversionResult.getUnmatchedRuleDetails().isEmpty()) {
for (JsonToXmlConversionService.UnmatchedRuleDetail detail : conversionResult.getUnmatchedRuleDetails()) {
String problemMsg = "规则匹配失败: " + detail.getRuleKey() + " [" + detail.getRuleVariants() + "]";
result.getProblems().add(problemMsg);
}
}
// 3. 从 JSON 转换为 XML
String xmlContent = jsonToXmlConversionService.convertFromJson(
mappingJson,
templateStream,
ruleStreams,
icdToXmlMappingService.getIndexMapping()
);
result.setMappingXml(xmlContent);
result.setStatus(GenerateStatus.SUCCESS); result.setStatus(GenerateStatus.SUCCESS);
result.setMessage("XML 生成成功"); result.setMessage("XML 生成成功");
return result; return result;