package com.casic.service.impl; import com.alibaba.druid.util.StringUtils; import com.casic.dao.smartwell.SmartwellDataMapper; import com.casic.dao.spantilt.TiltDataMapper; import org.springframework.stereotype.Service; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @Service public class HealthIndicatorsBuilder { private final SmartwellDataMapper smartwellDataMapper; private final TiltDataMapper tiltDataMapper; private final DecimalFormat df = new DecimalFormat("0.00%"); public HealthIndicatorsBuilder(SmartwellDataMapper smartwellDataMapper, TiltDataMapper tiltDataMapper) { this.smartwellDataMapper = smartwellDataMapper; this.tiltDataMapper = tiltDataMapper; } public List<Map<String, Object>> healthIndicatorProvider(String beginTime, String endTime) { List<Map<String, Object>> healthIndictorList = new ArrayList<>(); healthIndictorList.add(smartwellHealthIndicator(beginTime, endTime)); healthIndictorList.add(tiltHealthIndicator(beginTime, endTime)); return healthIndictorList; } public List<Map<String, Object>> deptIndicatorProvider(String beginTime, String endTime) { List<Map<String, Integer>> deviceDeptNumberList = smartwellDataMapper.countDeviceNumberByDept(); List<Map<String, Integer>> alarmDeptList = smartwellDataMapper.countAlarmDeviceByDept(beginTime, endTime); List<Map<String, Object>> deptIndicatorList = MergeDeviceCalculateIndicator(deviceDeptNumberList, alarmDeptList); return deptIndicatorList; } public Map<String, Object> healthRoadIndicatorProvider(String isSort,String limitNum,String beginTime, String endTime) { return smartwellHealthRoadIndicator(isSort,limitNum,beginTime, endTime); } private Map<String, Object> smartwellHealthIndicator(String beginTime, String endTime) { Map<String, Object> smartwellHealth = new HashMap<>(); Integer deviceNumber = smartwellDataMapper.countDeviceNumber(); Integer alarmDevice = smartwellDataMapper.countAlarmDevice(beginTime, endTime); smartwellHealth.put("typeName", "管网健康指数"); smartwellHealth.put("count", df.format((deviceNumber - alarmDevice) / deviceNumber)); return smartwellHealth; } private Map<String, Object> tiltHealthIndicator(String beginTime, String endTime) { Map<String, Object> smartwellHealth = new HashMap<>(); Integer deviceNumber = tiltDataMapper.countColudDevice(); Integer alarmDevice = tiltDataMapper.countColudAlarm(beginTime, endTime); smartwellHealth.put("typeName", "场站健康指数"); smartwellHealth.put("count", df.format(Double.valueOf(deviceNumber - alarmDevice) / deviceNumber)); return smartwellHealth; } private Map<String, Object> smartwellHealthRoadIndicator(String isSort,String limitNum,String beginTime, String endTime) { Map<String, Object> smartwellHealth = new HashMap<>(); Integer roadNumber = smartwellDataMapper.countRoadNumber(); Integer alarmRoad = smartwellDataMapper.countAlarmRoad(isSort,limitNum,beginTime, endTime); smartwellHealth.put("typeName", "道路健康指数"); smartwellHealth.put("count", df.format((Double.valueOf(roadNumber - alarmRoad)) / roadNumber)); return smartwellHealth; } private List<Map<String, Object>> MergeDeviceCalculateIndicator(List<Map<String, Integer>> deviceDeptNumberList, List<Map<String, Integer>> alarmDeptList) { Map<String, String> alarmDeptMap = alarmDeptList.stream().collect( Collectors.toMap(e -> String.valueOf(e.get("deptid")), e -> String.valueOf(e.get("counts"))) ); List<Map<String, String>> deptNameList = smartwellDataMapper.getDeptNameList(); Map<String, Object> deptNameMap = deptNameList.stream().collect( Collectors.toMap(e -> String.valueOf(e.get("id")), e -> String.valueOf(e.get("name"))) ); List<Map<String, Object>> deptIndicatorList = new ArrayList<>(); deviceDeptNumberList.forEach( deptNameNumberMap -> { Map<String, Object> deptIndicatorMap = new HashMap<>(); int deviceNumber = Integer.valueOf(String.valueOf(deptNameNumberMap.get("counts"))); String alarmDeviceNumber = alarmDeptMap.get(deptNameNumberMap.get("deptid")); int alarmDevice = StringUtils.isEmpty(alarmDeviceNumber) ? 0 : Integer.valueOf(String.valueOf(alarmDeviceNumber)); deptIndicatorMap.put("typeName", deptNameMap.get(String.valueOf(deptNameNumberMap.get("deptid"))).toString()); deptIndicatorMap.put("count", df.format((deviceNumber - alarmDevice) / deviceNumber)); deptIndicatorList.add(deptIndicatorMap); } ); return deptIndicatorList; } }