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;
|
}
|
}
|