package com.casic.service.impl; import com.casic.config.DeviceTypesConfig; import com.casic.dao.smartwell.SmartwellDataMapper; import com.casic.dao.spantilt.TiltDataMapper; import org.springframework.stereotype.Component; 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; @Component public class KindsAlarmBulider { private final SmartwellDataMapper smartwellDataMapper; private final TiltDataMapper tiltDataMapper; private final DeviceTypesConfig deviceTypesConfig; private final DecimalFormat df = new DecimalFormat("0.00%"); public KindsAlarmBulider(SmartwellDataMapper smartwellDataMapper, TiltDataMapper tiltDataMapper,DeviceTypesConfig deviceTypesConfig) { this.smartwellDataMapper = smartwellDataMapper; this.tiltDataMapper = tiltDataMapper; this.deviceTypesConfig=deviceTypesConfig; } public List<Map<String, String>> alarmTypeManger(String beginTime, String endTime) { String[] deviceTypeList = deviceTypesConfig.getDeviceTypes().split(","); Map<String, String> typeNameMap = smartwellDeviceType(); List<Map<String, String>> rateDeviceList = calculateRateSmartwell(beginTime, endTime, typeNameMap,deviceTypeList); calculateRateTilt(beginTime, endTime, rateDeviceList, typeNameMap); return rateDeviceList; } private Map<String, String> smartwellDeviceType() { List<Map<String, String>> typeNameList = smartwellDataMapper.getTypeName(); Map<String, String> typeNameMap = typeNameList.stream().collect( Collectors.toMap(e -> String.valueOf(e.get("id")), e -> String.valueOf(e.get("typeName")))); return typeNameMap; } private List<Map<String, String>> calculateRateSmartwell(String beginTime, String endTime, Map<String, String> typeNameMap,String[] deviceTypeList) { List<Map<String, String>> rateDeviceList = new ArrayList<>(); List<Map<String, Integer>> alarmCountList = smartwellDataMapper.countAlarmType(beginTime, endTime); Map<String, Integer> alarmCountMap = alarmCountList.stream().collect( Collectors.toMap( e -> String.valueOf(e.get("deviceType")), e -> Integer.valueOf(String.valueOf(e.get("count"))) ) ); List<Map<String, Integer>> deviceCountList = smartwellDataMapper.countDeviceByType(); Map<String, String> deviceCountMap = deviceCountList.stream().collect( Collectors.toMap(e -> String.valueOf(e.get("deviceType")), e -> String.valueOf(e.get("count")))); for (String deviceType : deviceTypeList) { Map<String, String> rateDeviceMap = new HashMap<>(); Integer totalAlarm = deviceCountMap.containsKey(deviceType)?Integer.valueOf(deviceCountMap.get(deviceType)):0; Integer alarmCount=alarmCountMap.containsKey(deviceType)?Integer.valueOf(alarmCountMap.get(deviceType)):0; rateDeviceMap.put("rate", totalAlarm==0?"0.00%":df.format(Double.valueOf(alarmCount)/totalAlarm)); rateDeviceMap.put("typeName", typeNameMap.get(deviceType)); rateDeviceList.add(rateDeviceMap); } return rateDeviceList; } private void calculateRateTilt(String beginTime, String endTime, List<Map<String, String>> rateDeviceList, Map<String, String> typeNameMap) { Integer alarmCount = tiltDataMapper.countColudAlarm(beginTime, endTime); Integer totalAlarm = tiltDataMapper.countColudDevice(); Map<String, String> rateDeviceMap = new HashMap<>(); rateDeviceMap.put("rate", totalAlarm == 0 ? "0" : df.format(Double.valueOf(alarmCount) / totalAlarm)); rateDeviceMap.put("typeName", "云台"); rateDeviceList.add(rateDeviceMap); } }