liujie
2026-01-21 8d1d546ad729da0e809e17e8161376adcc662c96
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
package com.estate.expert.admin.domain.exam.eval.formatter.impl;
 
import com.estate.expert.admin.domain.business.device.Device;
import com.estate.expert.admin.domain.business.device.DeviceType;
import com.estate.expert.admin.domain.exam.eval.formatter.EvalResultFormatter;
import com.estate.expert.admin.domain.exam.eval.formatter.EvalResultTable;
import com.estate.expert.admin.domain.exam.eval.score.EvalScoreResult;
import com.estate.expert.admin.domain.exam.eval.score.ScoreResult;
import com.estate.expert.admin.service.DeviceService;
import com.estate.expert.admin.utils.tree.helper.TreeHelper;
 
import java.util.*;
 
public class DeviceScoreResultSummaryFormatter extends EvalResultFormatter<EvalScoreResult> {
 
    DeviceService deviceService;
 
    public DeviceScoreResultSummaryFormatter(DeviceService deviceService) {
        this.deviceService = deviceService;
    }
 
    @Override
    public EvalResultTable format(EvalScoreResult result) {
        var typeRes = new ArrayList<>();
 
        var deviceResMap = result.getDeviceResMap();
        var deviceMap = new HashMap<Device, ScoreResult>();
        for(var entry : deviceResMap.entrySet()) {
            var deviceId = entry.getKey();
            var device = deviceService.get(deviceId);
            if(device == null)
                continue;
            deviceMap.put(device, entry.getValue());
        }
 
        // 按照设备类型分类进行输出
        float totalScore = 0;
        for(var type : DeviceType.values())
        {
            // select devices of the same type
            var devices = deviceMap.keySet().stream().filter(d -> d.getType() == type).toArray(Device[]::new);
            if(devices.length == 0)
                continue;
            var typeData = buildTypeData(type, devices, deviceMap);
            if(typeData!= null) {
                typeRes.add(typeData);
                totalScore += Float.parseFloat((String) typeData.get("评分"));
            }
        }
 
        var avgScore = typeRes.isEmpty() ? 0 : totalScore / typeRes.size();
 
        // 求取平均分
//        float totalScore = 0;
//        for(var entry : deviceMap.entrySet())
//        {
//            totalScore += entry.getValue().root().getData().getScore();
//        }
//        float avgScore = !deviceMap.isEmpty() ? totalScore / deviceMap.size() : 0;
 
        return EvalResultTable.builder()
                .title(result.getProject().getName())
                .deviceResRoot(Map.of("children", typeRes,
                        "score", avgScore))
                .build();
    }
 
    private Map<String, Object> buildTypeData(DeviceType type, Device[] devices, Map<Device, ScoreResult> deviceMap)
    {
        var rows = new ArrayList<Map<String, Object>>();
        float totalScore = 0;
        int counter = 0;
        for(var device : devices)
        {
            if(type != device.getType())
                continue;
 
            var result = deviceMap.get(device);
            var row = buildRow(device, result);
            rows.add(row);
 
            totalScore += result.root().getData().getScore();
            counter ++;
        }
 
        if(counter == 0)
            return null;
 
        var score = totalScore / devices.length;
 
        return Map.of("设备类型", type.getDesc(),
                "评分", formatFloat(score),
                "path", "__TYPE__"+type.getDesc(),
                "children", rows);
    }
 
    private Map<String, Object> buildRow(Device device, ScoreResult result) {
        var data = result.root().getData();
 
        var map = new HashMap<String, Object>();
        map.put("设备编号", device.getManufacturerNumber());
        map.put("单台设备评分", formatFloat(data.getScore()));
 
        // 展示特定的层级
        var newTree = TreeHelper.pruneTreeByLevels(result.root(), List.of(2, 4));
        TreeHelper.travel(newTree, node -> {
            node.setPath(device.getId() + node.getPath());
        });
        map.put("children", newTree.getChildren());
        map.put("path", "__DEVICE__"+device.getManufacturerNumber());
        return map;
    }
 
}