feat(mms-mapping): test中添加XML字符串返回功能并优化JSON转XML性能测试

- 在IcdToXmlGenerateResult和IcdToXmlResponse中新增mappingXml字段存储生成的XML字符串
- 修改IcdToXmlResponseConverter将XML内容从savedPath改为mappingXml字段
- 更新IcdToXmlTaskAppService将XML转换结果从保存路径改为直接返回XML内容
- 重构JsonToXmlConversionService移除临时文件创建,直接返回XML字符串
- 在JsonToXmlConversionService中添加性能监控日志输出
- 新增JsonToXmlDebugRunner用于本地调试JSON转XML功能
This commit is contained in:
周宇 蔡
2026-05-06 14:31:18 +08:00
parent b3e679249b
commit ddadf26837
6 changed files with 341 additions and 19 deletions

View File

@@ -20,7 +20,7 @@ public class IcdToXmlResponseConverter {
response.setLdInst(result.getLdInst());
response.setSavedPath(result.getSavedPath());
response.getProblems().addAll(result.getProblems());
response.setMappingXml(result.getMappingXml());
if (result.getIndexAnalysis() != null && result.getIndexAnalysis().getCandidates() != null) {
for (IndexCandidate candidate : result.getIndexAnalysis().getCandidates()) {
IndexCandidateResponse candidateResponse = new IndexCandidateResponse();

View File

@@ -55,37 +55,58 @@ public class JsonToXmlConversionService {
List<InputStream> ruleStreams,
IcdToXmlMappingService.IndexMappingConfig indexMapping) throws Exception {
// 1. 反序列化JSON为MappingDocument对象
MappingDocument mappingDocument = objectMapper.readValue(mappingJson, MappingDocument.class);
long startTime = System.currentTimeMillis();
System.out.println("[JSON转XML] 开始转换...");
// 2. 使用现有的规则引擎生成XML
// 注意这里复用RuleBasedXmlMappingService的核心逻辑
// 但数据来源从ICD直接解析改为从MappingDocument提取
String xmlContent = buildXmlFromMapping(mappingDocument, templateStream, ruleStreams, indexMapping);
// 3. 保存为临时文件
Path tempPath = Files.createTempFile("converted_", ".xml");
Files.write(tempPath, xmlContent.getBytes(StandardCharsets.UTF_8));
return tempPath.toString();
try {
MappingDocument mappingDocument = objectMapper.readValue(mappingJson, MappingDocument.class);
long parseTime = System.currentTimeMillis();
System.out.println("[JSON转XML] JSON解析完成耗时: " + (parseTime - startTime) + " ms");
String xmlContent = buildXmlFromMapping(mappingDocument, templateStream, ruleStreams, indexMapping);
long totalTime = System.currentTimeMillis() - startTime;
System.out.println("[JSON转XML] 转换完成,总耗时: " + totalTime + " ms");
return xmlContent;
} catch (Exception e) {
long totalTime = System.currentTimeMillis() - startTime;
System.err.println("[JSON转XML] 转换失败,已耗时: " + totalTime + " ms错误: " + e.getMessage());
throw e;
}
}
/**
* 从MappingDocument构建XML内容
*/
private String buildXmlFromMapping(MappingDocument mappingDocument,
InputStream templateStream,
List<InputStream> ruleStreams,
IcdToXmlMappingService.IndexMappingConfig indexMapping) throws Exception {
long stepStart = System.currentTimeMillis();
String templateContent = readInputStreamToString(templateStream);
long templateTime = System.currentTimeMillis();
System.out.println(" [步骤1] 读取模板完成,耗时: " + (templateTime - stepStart) + " ms");
String xmlContent = fillIedInfo(templateContent, mappingDocument);
long iedTime = System.currentTimeMillis();
System.out.println(" [步骤2] 填充IED信息完成耗时: " + (iedTime - templateTime) + " ms");
xmlContent = fillReportControlsFromMapping(xmlContent, mappingDocument);
long reportTime = System.currentTimeMillis();
System.out.println(" [步骤3] 填充ReportControl完成耗时: " + (reportTime - iedTime) + " ms");
xmlContent = applyRulesFromMapping(xmlContent, mappingDocument, ruleStreams, indexMapping);
long rulesTime = System.currentTimeMillis();
System.out.println(" [步骤4] 应用规则完成,耗时: " + (rulesTime - reportTime) + " ms");
long totalStepTime = System.currentTimeMillis() - stepStart;
System.out.println(" [buildXmlFromMapping] 总计耗时: " + totalStepTime + " ms");
return xmlContent;
}
@@ -219,21 +240,40 @@ public class JsonToXmlConversionService {
List<InputStream> ruleStreams,
IcdToXmlMappingService.IndexMappingConfig indexMapping) throws Exception {
long stepStart = System.currentTimeMillis();
var mergedRules = mergeAllRulesDesc(ruleStreams, indexMapping);
long mergeTime = System.currentTimeMillis();
System.out.println(" [规则合并] 耗时: " + (mergeTime - stepStart) + " ms规则数: " + mergedRules.size());
var mappingMetrics = extractMetricsFromMapping(mappingDocument);
long extractTime = System.currentTimeMillis();
System.out.println(" [指标提取] 耗时: " + (extractTime - mergeTime) + " ms指标数: " + mappingMetrics.size());
System.out.println("========== 开始从JSON匹配规则 ==========");
System.out.println("规则总数: " + mergedRules.size());
System.out.println("JSON中指标总数: " + mappingMetrics.size());
var applicableRules = findApplicableRulesDesc(mergedRules, mappingMetrics);
long matchTime = System.currentTimeMillis();
System.out.println(" [规则匹配] 耗时: " + (matchTime - extractTime) + " ms");
System.out.println("匹配成功: " + applicableRules.size() + " 条规则");
System.out.println("匹配失败: " + (mergedRules.size() - applicableRules.size()) + " 条规则");
String resultXml = applyRulesToXml(xmlContent, applicableRules);
long applyTime = System.currentTimeMillis();
System.out.println(" [规则应用] 耗时: " + (applyTime - matchTime) + " ms");
long totalApplyTime = System.currentTimeMillis() - stepStart;
System.out.println(" [applyRulesFromMapping] 总计耗时: " + totalApplyTime + " ms");
System.out.println("========== JSON规则匹配结束 ==========\n");
return applyRulesToXml(xmlContent, applicableRules);
return resultXml;
}
/**

View File

@@ -18,6 +18,17 @@ public class IcdToXmlGenerateResult {
private MappingDocument mappingDocument;
private String savedPath;
private List<String> problems = new ArrayList<String>();
/** 生成成功后的 Xml 字符串。 */
private String mappingXml;
public String getMappingXml() {
return mappingXml;
}
public void setMappingXml(String mappingXml) {
this.mappingXml = mappingXml;
}
public GenerateStatus getStatus() { return status; }
public void setStatus(GenerateStatus status) { this.status = status; }

View File

@@ -16,6 +16,16 @@ public class IcdToXmlResponse {
private MappingDocumentResponse mappingDocument;
private List<IndexCandidateResponse> indexCandidates = new ArrayList<IndexCandidateResponse>();
private List<String> problems = new ArrayList<String>();
/** 生成成功后的 Xml 字符串。 */
private String mappingXml;
public String getMappingXml() {
return mappingXml;
}
public void setMappingXml(String mappingXml) {
this.mappingXml = mappingXml;
}
public GenerateStatus getStatus() { return status; }
public void setStatus(GenerateStatus status) { this.status = status; }
public String getMessage() { return message; }

View File

@@ -160,14 +160,14 @@ public class IcdToXmlTaskAppService {
// 3. 从 JSON 转换为 XML
String xmlPath = jsonToXmlConversionService.convertFromJson(
String xmlContent = jsonToXmlConversionService.convertFromJson(
mappingJson,
templateStream,
ruleStreams,
icdToXmlMappingService.getIndexMapping()
);
result.setSavedPath(xmlPath);
result.setMappingXml(xmlContent);
result.setStatus(GenerateStatus.SUCCESS);
result.setMessage("XML 生成成功");
return result;