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