admin-server/src/main/java/com/estate/expert/admin/stat/report/builder/SystemReportBuilder.java
@@ -123,12 +123,8 @@ var evalResult = data.getJSONObject("评估结果"); var checkCategories = evalResult.getJSONArray("检查项"); if(checkCategories == null) return; var safetyCategories = new JSONArray(); for (var c : checkCategories){ var co = (JSONObject)c; var name = co.getString("名称"); if(name != null && name.contains("安全")) safetyCategories.add(co); var pieChart = buildPieChart(co); if(pieChart!=null) co.put("问题分布饼图", pieChart); @@ -136,9 +132,8 @@ if(barChart!=null) co.put("问题分布直方图", barChart); } if(safetyCategories.isEmpty() && !checkCategories.isEmpty()) safetyCategories.add(checkCategories.get(0)); evalResult.put("安全检查项", safetyCategories); // 新版模板的“隐患分布情况”使用此字段,需覆盖安全检查和管理行为。 evalResult.put("安全检查项", checkCategories); } /** admin-server/src/main/java/com/estate/expert/admin/stat/report/data/ReportDataBase.java
@@ -150,26 +150,40 @@ */ protected JSONObject buildErrorLevel(TreeNode<FuzzyValue> node) { JSONObject result = new JSONObject(); if(node == null) if(node == null || node.getData() == null) return result; int totalErrors = Arrays.stream(node.getData().getTotalErrorCounts()).sum(); return buildErrorLevel(node.getData().getTotalErrorCounts()); } /** * 根据隐患等级计数构建汇总信息。 * * @param errorCounts 按一级至四级隐患排列的数量 * @return 隐患等级汇总 */ protected JSONObject buildErrorLevel(int[] errorCounts) { JSONObject result = new JSONObject(); if (errorCounts == null || errorCounts.length < ErrorLevel.values().length) return result; int totalErrors = Arrays.stream(errorCounts).sum(); result.put("隐患数量", totalErrors); List<Object> errorInfos = new ArrayList<>(); for (int i = 0; i<4 ; i++) { var level = ErrorLevel.values()[i]; var count = node.getData().getTotalErrorCounts()[i]; var count = errorCounts[i]; var info = new JSONObject(); info.put("隐患等级", level.getDesc()); info.put("隐患程度", level.getDesc2()); info.put("数量", count); info.put("比例", formatPercent(count * 1.0 / totalErrors)); info.put("比例", formatPercent(totalErrors == 0 ? 0 : count * 1.0 / totalErrors)); errorInfos.add(info); } result.put("一级隐患数量", node.getData().getTotalErrorCounts()[0]); result.put("二级隐患数量", node.getData().getTotalErrorCounts()[1]); result.put("三级隐患数量", node.getData().getTotalErrorCounts()[2]); result.put("四级隐患数量", node.getData().getTotalErrorCounts()[3]); result.put("一级隐患数量", errorCounts[0]); result.put("二级隐患数量", errorCounts[1]); result.put("三级隐患数量", errorCounts[2]); result.put("四级隐患数量", errorCounts[3]); result.put("分项", errorInfos); return result; } admin-server/src/main/java/com/estate/expert/admin/stat/report/data/SystemReportData.java
@@ -46,12 +46,24 @@ evalInfo.put("综合信息", buildAbstractInfo()); evalInfo.put("检查项", buildCheckItems()); evalInfo.put("隐患等级分布", buildErrorLevel(getFuzzyRoot())); evalInfo.put("隐患等级分布", buildErrorLevel(getErrorLevelCounts())); return evalInfo; } /** * 获取报告使用的隐患等级计数。 * 默认使用模糊结果,评分报告可按需使用评分结果。 */ protected int[] getErrorLevelCounts() { var root = getFuzzyRoot(); if (root == null || root.getData() == null) { return null; } return root.getData().getTotalErrorCounts(); } /** * 获取模糊根节点 * @return 模糊根节点 */ admin-server/src/main/java/com/estate/expert/admin/stat/report/data/impl/SystemScoreReportData.java
@@ -13,6 +13,18 @@ public class SystemScoreReportData extends SystemReportData { /** * 评分报告的隐患汇总应与项目得分使用同一棵评分树,确保管理行为等分支被计入。 */ @Override protected int[] getErrorLevelCounts() { var root = getScoreRoot(); if (root != null && root.getData() != null && root.getData().getTotalErrorCounts() != null) { return root.getData().getTotalErrorCounts(); } return super.getErrorLevelCounts(); } /** * 构建摘要信息 * @return 摘要信息 */ admin-server/src/test/java/com/estate/expert/admin/stat/report/data/SystemReportDataTest.java
New file @@ -0,0 +1,95 @@ package com.estate.expert.admin.stat.report.data; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.estate.expert.admin.domain.exam.eval.fuzzy.FuzzyResult; import com.estate.expert.admin.domain.exam.eval.fuzzy.FuzzyRiskLevel; import com.estate.expert.admin.domain.exam.eval.fuzzy.FuzzyValue; import com.estate.expert.admin.domain.exam.eval.score.ScoreResult; import com.estate.expert.admin.domain.exam.eval.score.ScoreValue; import com.estate.expert.admin.domain.project.Project; import com.estate.expert.admin.domain.project.enums.ProjectType; import com.estate.expert.admin.domain.report.ReportTemplate; import com.estate.expert.admin.stat.report.builder.SystemReportBuilder; import com.estate.expert.admin.stat.report.data.impl.SystemScoreReportData; import com.estate.expert.admin.utils.tree.TreeNode; import org.junit.jupiter.api.Test; import java.lang.reflect.Method; import java.util.HashMap; import java.util.List; import static org.junit.jupiter.api.Assertions.assertEquals; class SystemReportDataTest { @Test void scoreReportUsesScoreTreeForHazardSummary() { var project = new Project(); project.setName("测试项目"); project.setType(ProjectType.HOUSE_CONSTRUCTION); var template = new ReportTemplate(); template.setNumber("TEST"); var scoreRoot = new TreeNode<>("root", ScoreValue.builder() .score(80) .totalErrorCounts(new int[]{1, 2, 3, 4}) .build()); var fuzzyRoot = new TreeNode<>("root", FuzzyValue.builder() .riskLevel(FuzzyRiskLevel.P4) .totalErrorCounts(new int[]{9, 9, 9, 9}) .build()); var report = SystemScoreReportData.builder() .reportId(1) .project(project) .template(template) .devices(List.of()) .scoreResult(new ScoreResult(scoreRoot)) .sysResult(new FuzzyResult(fuzzyRoot)) .build() .generate(); var summary = report.getJSONObject("评估结果").getJSONObject("隐患等级分布"); assertEquals(10, summary.getIntValue("隐患数量")); assertEquals(1, summary.getIntValue("一级隐患数量")); assertEquals(4, summary.getIntValue("四级隐患数量")); } @Test void hazardDistributionIncludesManagementBehavior() throws Exception { var evalResult = new JSONObject(); var checkItems = new JSONArray(); checkItems.add(checkItem("安全检查")); checkItems.add(checkItem("管理行为")); evalResult.put("检查项", checkItems); var data = new JSONObject(); data.put("评估结果", evalResult); Method initChart = SystemReportBuilder.class.getDeclaredMethod( "initChart", JSONObject.class, java.util.Map.class); initChart.setAccessible(true); initChart.invoke(new SystemReportBuilder(null), data, new HashMap<>()); assertEquals(2, evalResult.getJSONArray("安全检查项").size()); assertEquals("管理行为", evalResult.getJSONArray("安全检查项") .getJSONObject(1).getString("名称")); } private JSONObject checkItem(String name) { var item = new JSONObject(); item.put("类别", "测试类别"); item.put("问题数量", 1); item.put("问题百分比", "100.00%"); var category = new JSONObject(); category.put("分项", new JSONArray(List.of(item))); var result = new JSONObject(); result.put("名称", name); result.put("分项评估", new JSONArray(List.of(category))); return result; } }