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