Newer
Older
zq-big-sreen / src / main / java / com / casic / service / impl / KindsAlarmBulider.java
chaizhuang on 19 Oct 2022 3 KB 没有改变
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);
    }
}