feat(mapping): 优化ICD到XML转换服务支持未匹配规则详情
- 实现convertFromJsonWithResult方法返回完整的转换结果 - 添加未匹配规则详细信息到生成结果的问题列表中 - 新增ConversionResult、RuleMatchingResult和UnmatchedRuleDetail数据结构 - 扩展应用规则逻辑以跟踪和报告未匹配的规则变体 - 重构buildXmlFromMapping方法以支持结果详情返回 - 更新控制台日志输出以显示规则匹配统计信息
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user