package com.tievd.jyz.service.impl; import cn.hutool.core.date.DateUtil; import com.tievd.jyz.dto.AlarmStatDTO; import com.tievd.jyz.dto.AlarmTypeStatDTO; import com.tievd.jyz.dto.DeviceStatusStatDTO; import com.tievd.jyz.entity.vo.AlarmEventVO; import com.tievd.jyz.entity.vo.AlarmOverviewVO; import com.tievd.jyz.entity.vo.OrgAlarmCountVO; import com.tievd.jyz.entity.vo.PartitionAlarmStatVO; import com.tievd.jyz.mapper.CameraMapper; import com.tievd.jyz.mapper.DeviceMapper; import com.tievd.jyz.mapper.OilEventMapper; import com.tievd.jyz.mapper.OiloutEventMapper; import com.tievd.jyz.service.AlarmDataService; import com.tievd.jyz.util.PercentUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; /** * @author yang'zhi'shui */ @Service public class AlarmDataServiceImpl implements AlarmDataService { @Autowired private OilEventMapper oilEventMapper; @Autowired private OiloutEventMapper oiloutEventMapper; @Autowired private CameraMapper cameraMapper; @Autowired private DeviceMapper deviceMapper; @Override public AlarmOverviewVO overview(String today, String orgCode) { int oilMonthlyAlarmCount = oilEventMapper.monthlyAlarmCount(DateUtil.format(new Date(), "yyyy-MM"), orgCode); int oiloutMonthlyAlarmCount = oiloutEventMapper.monthlyAlarmCount(DateUtil.format(new Date(), "yyyy-MM"), orgCode); AlarmOverviewVO oilAlarmOverviewVO = oilEventMapper.alarmStat(today, orgCode); AlarmOverviewVO oiloutAlarmOverviewVO = oiloutEventMapper.alarmStat(today, orgCode); AlarmOverviewVO alarmOverviewVO = new AlarmOverviewVO(); alarmOverviewVO.setMonthlyAlarmCount(oilMonthlyAlarmCount + oiloutMonthlyAlarmCount); alarmOverviewVO.setAlarmCount(oilAlarmOverviewVO.getAlarmCount() + oiloutAlarmOverviewVO.getAlarmCount()); alarmOverviewVO.setDealedAlarmCount(oilAlarmOverviewVO.getDealedAlarmCount() + oiloutAlarmOverviewVO.getDealedAlarmCount()); alarmOverviewVO.setConfirmedAlarmCount(oilAlarmOverviewVO.getConfirmedAlarmCount() + oiloutAlarmOverviewVO.getConfirmedAlarmCount()); return alarmOverviewVO; } @Override public Map alarmStat(int intervalDay, String endDay, String orgCode) { List oilEventAlarmStatList = oilEventMapper.alarmStatRange(intervalDay, endDay, orgCode); List oiloutEventAlarmStatList = oiloutEventMapper.alarmStatRange(intervalDay, endDay, orgCode); Map oiloutMap = oiloutEventAlarmStatList.stream().collect(Collectors.toMap(AlarmStatDTO::getDate, Function.identity())); List dateList = new ArrayList(); List alarmCountList = new ArrayList(); List confirmedCountList = new ArrayList(); for (int i = 0; i < oilEventAlarmStatList.size(); i++) { AlarmStatDTO oildto = oilEventAlarmStatList.get(i); AlarmStatDTO oiloutDTO = oiloutMap.get(oildto.getDate()); dateList.add(i, oildto.getDate()); alarmCountList.add(i, oildto.getAlarmCount() + oiloutDTO.getAlarmCount()); confirmedCountList.add(i, oildto.getConfirmedAlarmCount() + oiloutDTO.getConfirmedAlarmCount()); } Map result = new HashMap<>(); result.put("dateArr", dateList); result.put("alarmCountArr", alarmCountList); result.put("confirmedCountArr", confirmedCountList); return result; } @Override public List regionAlarmStat(String today, String orgCode, Integer limit) { List oilList = oilEventMapper.regionAlarmStat(today, orgCode, limit); return oilList; } @Override public Map alarmTypeStat(Integer freq, String orgCode) { List list; List algorithmNameList = new ArrayList(); List alarmCountList = new ArrayList(); List alarmProportionList = new ArrayList(); Map result = new HashMap<>(); result.put("algorithmNameArr", algorithmNameList); result.put("alarmCountArr", alarmCountList); result.put("alarmProportionArr", alarmProportionList); if (freq == 0) { //当天 list = oilEventMapper.alarmTypeStatByDay(orgCode, DateUtil.today()); } else { //当月 list = oilEventMapper.alarmTypeStatByMonth(orgCode, DateUtil.format(new Date(), "yyyy-MM")); } if (list.isEmpty()) { return result; } int alarmSum = list.stream().mapToInt(AlarmTypeStatDTO::getAlarmCount).sum(); for (int i = 0; i < list.size(); i++) { AlarmTypeStatDTO dto = list.get(i); algorithmNameList.add(i, dto.getAlgorithmName()); alarmCountList.add(i, dto.getAlarmCount()); alarmProportionList.add(i, BigDecimal.valueOf((float) dto.getAlarmCount() / alarmSum).doubleValue()); } // 百分比校准 result.put("alarmProportionArr", PercentUtil.getPercentValue(alarmProportionList, 1, 0)); return result; } @Override public List latestAlarm(String date, String orgCode, Integer limit) { return oilEventMapper.getLatestAlarm(date, orgCode, limit); } @Override public Map deviceStatusStat(String orgCode, Integer type) { DeviceStatusStatDTO dto; if (type == 0) { dto = cameraMapper.cameraStatusStat(orgCode); } else { dto = deviceMapper.cameraStatusStat(orgCode); } List statusList = new ArrayList(); List countList = new ArrayList(); Map result = new HashMap<>(); result.put("statusArr", statusList); result.put("countArr", countList); countList.add(0, dto.getOnlineCount()); statusList.add(0, "在线"); countList.add(1, dto.getOfflineCount()); statusList.add(1, "离线"); return result; } @Override public Map alarmTrendStat(int intervalDay, String endDay, String orgCode) { List oilEventAlarmStatList = oilEventMapper.alarmTrendStatRange(intervalDay, endDay, orgCode); List oiloutEventAlarmStatList = oiloutEventMapper.alarmTrendStatRange(intervalDay, endDay, orgCode); Map oiloutMap = oiloutEventAlarmStatList.stream().collect(Collectors.toMap(AlarmStatDTO::getDate, Function.identity())); List dateList = new ArrayList(); List oiloutEventAlarmCountList = new ArrayList(); List oilEventAlarmCountList = new ArrayList(); for (int i = 0; i < oilEventAlarmStatList.size(); i++) { AlarmStatDTO oildto = oilEventAlarmStatList.get(i); AlarmStatDTO oiloutDTO = oiloutMap.get(oildto.getDate()); dateList.add(i, oildto.getDate()); oiloutEventAlarmCountList.add(i, oiloutDTO.getOiloutEventAlarmCount()); oilEventAlarmCountList.add(i, oildto.getOilEventAlarmCount()); } Map result = new HashMap<>(); result.put("dateArr", dateList); result.put("oiloutEventAlarmCountArr", oiloutEventAlarmCountList); result.put("oilEventAlarmCountArr", oilEventAlarmCountList); return result; } @Override public List alarmRanking(String orgCode, Integer freq, Integer limit) { List result; if (freq == 0) { //当天 result = oilEventMapper.getAlarmRankingByDay(DateUtil.today(), orgCode, limit); } else { //当月 result = oilEventMapper.getAlarmRankingByMonth(DateUtil.format(new Date(), "yyyy-MM"), orgCode, limit); } return result; } @Override public Map partitionAlarmStat(String date, String orgCode) { List list = oilEventMapper.getPartirionAlarmStat(date, orgCode); Map collect = list.stream().collect(Collectors.toMap(PartitionAlarmStatVO::getPartitionName, Function.identity())); String[] partitionArr = new String[]{"1", "2", "3"}; for (int i = 0; i < partitionArr.length; i++) { PartitionAlarmStatVO vo = collect.get(partitionArr[i]); if (vo == null) { vo = new PartitionAlarmStatVO(partitionArr[i],0 ,0 , 0.00d); collect.put(partitionArr[i], vo); } else { if (vo.getAlarmCount()==0){ vo.setConfirmedProportion(0.00d); } else { vo.setConfirmedProportion(BigDecimal.valueOf((float)vo.getConfirmedAlarmCount()/vo.getAlarmCount()).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue()); } } } return collect; } }