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
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.fuzzy.EvalFuzzyResult;
import com.estate.expert.admin.domain.exam.eval.fuzzy.FuzzyResult;
import com.estate.expert.admin.service.DeviceService;
 
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
 
public class DeviceFuzzySummaryResultFormatter extends EvalResultFormatter<EvalFuzzyResult> {
 
    DeviceService deviceService;
 
    public DeviceFuzzySummaryResultFormatter(DeviceService deviceService) {
        this.deviceService = deviceService;
    }
 
    @Override
    public EvalResultTable format(EvalFuzzyResult result) {
        var rows = new ArrayList<Map>();
        var deviceResMap = result.getDeviceResMap();
        for(var entry : deviceResMap.entrySet()) {
            var deviceId = entry.getKey();
            var device = deviceService.get(deviceId);
            if(device == null)
                continue;
 
            var deviceRes = entry.getValue();
            var row = buildRow(device, deviceRes);
            rows.add(row);
        }
 
        var typeRes = new ArrayList<Object>();
        var totalScore = 0.0f;
        for(var type : DeviceType.values()){
            var typeData = buildTypeData(type, rows);
            if(typeData != null) {
                typeRes.add(typeData);
                totalScore += Float.parseFloat((String) typeData.get("评分"));
            }
        }
        var avgScore = typeRes.isEmpty() ? 0 : totalScore / typeRes.size();
        return EvalResultTable.builder()
                .title(result.getProject().getName())
//                .rows(rows)
                .deviceResRoot(Map.of("children", typeRes, "score", avgScore))
                .build();
    }
 
 
    private Map<String, Object> buildTypeData(DeviceType type, ArrayList<Map> rows){
        var totalScore = 0.0f;
        var children = new ArrayList<Map>();
        for(var row : rows){
            var deviceType = (String) row.get("设备类型");
            if(deviceType.equals(type.getDesc())){
                children.add(row);
                totalScore += Float.parseFloat((String) row.get("风险评分"));
            }
        }
 
        if(children.isEmpty())
            return null;
 
        var avgScore = totalScore / children.size();
        var map = new HashMap<String, Object>();
        map.put("设备类型", type.getDesc());
        map.put("评分", "" + avgScore);
        map.put("设备数量", children.size());
        map.put("path", "__TYPE__" + type.getDesc());
        map.put("children", children);
        return map;
 
    }
 
    private Map<String, Object> buildRow(Device device, FuzzyResult result) {
        var data = result.root().getData();
 
        var map = new HashMap<String, Object>();
        map.put("设备编号", device.getManufacturerNumber());
        map.put("设备类型", device.getType().getDesc());
 
        map.put("风险等级", data.getRiskLevel().getDesc());
        map.put("风险评分", formatFloat(data.getScore()));
        map.put("问题数量", Arrays.stream(data.getTotalErrorCounts()).sum() + "");
        map.put("问题P1", data.getTotalErrorCounts()[0] + "");
        map.put("问题P2", data.getTotalErrorCounts()[1] + "");
        map.put("问题P3", data.getTotalErrorCounts()[2] + "");
        map.put("问题P4", data.getTotalErrorCounts()[3] + "");
 
        var ml = data.getMembershipList();
        map.put("可忽略风险", formatFloatAcc(ml[0]));
        map.put("可容忍风险", formatFloatAcc(ml[1]));
        map.put("可接受风险", formatFloatAcc(ml[2]));
        map.put("不可接受风险", formatFloatAcc(ml[3]));
        map.put("拒绝接受风险", formatFloatAcc(ml[3]));
 
        var detailData = new FuzzyResultFormatter().format(result);
        map.put("详情", detailData);
        map.put("path", "__DEVICE__"+device.getManufacturerNumber());
        return map;
    }
}