liujie
2026-09-20 25999c575dd42b4715e49d3fe57e73c2c3204ccb
update
1个文件已添加
4个文件已修改
160 ■■■■■ 已修改文件
admin-server/src/main/java/com/estate/expert/admin/stat/report/builder/SystemReportBuilder.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin-server/src/main/java/com/estate/expert/admin/stat/report/data/ReportDataBase.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin-server/src/main/java/com/estate/expert/admin/stat/report/data/SystemReportData.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin-server/src/main/java/com/estate/expert/admin/stat/report/data/impl/SystemScoreReportData.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin-server/src/test/java/com/estate/expert/admin/stat/report/data/SystemReportDataTest.java 95 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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;
    }
}