package com.zhitan.home.service; import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.zhitan.basicdata.domain.SysEnergy; import com.zhitan.basicdata.mapper.SysEnergyMapper; import com.zhitan.common.constant.CommonConst; import com.zhitan.common.core.domain.entity.SysDictData; import com.zhitan.common.enums.TimeType; import com.zhitan.consumptionanalysis.domain.vo.RankingEnergyData; import com.zhitan.dataitem.service.IDataItemService; import com.zhitan.home.domain.vo.HomeEnergyConsumptionTrendVO; import com.zhitan.home.domain.vo.HomeEnergyStatisticsVO; import com.zhitan.home.domain.vo.HomePeakValleyVO; import com.zhitan.home.service.impl.IHomePageService; import com.zhitan.model.domain.EnergyIndex; import com.zhitan.model.domain.ModelNode; import com.zhitan.model.domain.vo.ModelNodeIndexInfor; import com.zhitan.model.mapper.ModelNodeMapper; import com.zhitan.model.service.IEnergyIndexService; import com.zhitan.model.service.IModelNodeService; import com.zhitan.peakvalley.domain.ElectricityDataItem; import com.zhitan.peakvalley.mapper.PeakValleyMapper; import com.zhitan.realtimedata.domain.DataItem; import com.zhitan.system.service.ISysDictDataService; import lombok.AllArgsConstructor; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.math.BigDecimal; import java.math.RoundingMode; import java.text.DecimalFormat; import java.util.*; import java.util.stream.Collectors; /** * description todu * * @author hmj * @date 2024-10-31 18:07 */ @Service @AllArgsConstructor public class HomePageServiceImpl implements IHomePageService { private final SysEnergyMapper sysEnergyMapper; private final IModelNodeService modelNodeService; private final IDataItemService dataItemService; private final IEnergyIndexService energyIndexService; private final ISysDictDataService sysDictDataService; @Resource private ModelNodeMapper modelNodeMapper; @Resource private PeakValleyMapper electricityDataItemMapper; @Override public List energyConsumptionSummation(String timeType, String modelcode) { Date currentTime = new Date(); // Date currentTime = DateUtil.parseDateTime("2023-04-11 00:00:00"); DateTime tongbiTime = DateUtil.offsetMonth(currentTime, -12); DateTime huanbiTime = DateUtil.offsetMonth(currentTime, -1); final List current = getEnergyTotalByTime(timeType, modelcode, currentTime); final List tongbi = getEnergyTotalByTime(timeType, modelcode, tongbiTime); final List huanbi = getEnergyTotalByTime(timeType, modelcode, huanbiTime); final Map> tongbiMap = tongbi.stream().collect(Collectors.groupingBy(HomeEnergyStatisticsVO::getEnergyNo)); final Map> huanbiMap = huanbi.stream().collect(Collectors.groupingBy(HomeEnergyStatisticsVO::getEnergyNo)); current.stream().forEach(vo->{ final String energyNo = vo.getEnergyNo(); final Double count = vo.getCount(); final Double tongbiCount = tongbiMap.get(energyNo).stream().map(HomeEnergyStatisticsVO::getCount).mapToDouble(Double::doubleValue).sum(); final Double huanbiCount = huanbiMap.get(energyNo).stream().map(HomeEnergyStatisticsVO::getCount).mapToDouble(Double::doubleValue).sum(); vo.setTonCount(format2Double( vo.getCount() * Double.valueOf(vo.getCoefficient()))); if (tongbiCount != 0) { vo.setTongbi(format2Double( (count - tongbiCount) / tongbiCount * 100)); }else { vo.setTongbi(0D); } if (huanbiCount != 0) { vo.setHuanbi (format2Double((count - huanbiCount) / huanbiCount * 100)); }else { vo.setHuanbi(0D); } }); return current; } private List getEnergyTotalByTime(String timeType, String modelcode, Date queryTime) { List voList = new ArrayList<>(); Date beginTime; Date endTime; String shixuTimeType; if (TimeType.DAY.name().equals(timeType)) { beginTime = DateUtil.beginOfDay(queryTime); endTime = DateUtil.endOfDay(beginTime); shixuTimeType = TimeType.HOUR.name(); // 月 } else if (TimeType.MONTH.name().equals(timeType)) { beginTime = DateUtil.beginOfMonth(queryTime); endTime = DateUtil.endOfMonth(beginTime); shixuTimeType = TimeType.DAY.name(); // 年 } else { beginTime = DateUtil.beginOfYear(queryTime); endTime = DateUtil.endOfYear(beginTime); shixuTimeType = TimeType.MONTH.name(); } // 查询所有能源类型 List sysEnergies = sysEnergyMapper.selectSysEnergyList(new SysEnergy()); voList = sysEnergies.stream().map(dict -> { HomeEnergyStatisticsVO vo = new HomeEnergyStatisticsVO(); vo.setEnergyName(dict.getEnername()); vo.setEnergyNo(dict.getEnersno()); vo.setEnergyUnit(dict.getMuid()); vo.setCount(0D); vo.setTonCount(0D); vo.setCoefficient(dict.getCoefficient().toString()); return vo; }).sorted(Comparator.comparing(HomeEnergyStatisticsVO::getEnergyName)).collect(Collectors.toList()); // 通过code获取modelnode对应index信息 ModelNode modelNode = modelNodeService.getModelNodeByModelCodeByIndexCode(modelcode); if (ObjectUtils.isEmpty(modelNode)) { return voList; } List inforList = modelNodeService.getModelNodeIndexIdRelationInforByNodeId(modelNode.getNodeId()); List indexIds = inforList.stream().map(ModelNodeIndexInfor::getIndexId).collect(Collectors.toList()); // 通过indexIds找data_Item数据 List itemList = dataItemService.getDataItemTimeRangeInforByIndexIds(beginTime, endTime, shixuTimeType, indexIds); // 查询点位详细信息 List energyIndexInforList = energyIndexService.getEnergyIndexByIds(indexIds); // 获取点位能源类型 Map> energyTypeMap = energyIndexInforList.stream() .filter(l -> StringUtils.isNotEmpty(l.getEnergyId())).collect(Collectors.groupingBy( EnergyIndex::getEnergyId, Collectors.mapping(EnergyIndex::getIndexId, Collectors.toList()) )); for (HomeEnergyStatisticsVO ratioVO : voList) { List indexs = energyTypeMap.get(ratioVO.getEnergyNo()); if (CollectionUtils.isEmpty(indexs)) { ratioVO.setCount(0D); }else { // 找到合计值 double doubleCount = itemList.stream().filter(li -> indexs.contains(li.getIndexId())).mapToDouble(DataItem::getValue).sum(); ratioVO.setCount(format2Double(doubleCount)); } } return voList; } private double format2Double(double averageEnergy) { // 创建DecimalFormat对象,设置保留两位小数 DecimalFormat df = new DecimalFormat("#.00"); // 格式化结果 String formattedResult = df.format(averageEnergy); return Double.valueOf(formattedResult); } @Override public List peakValley(String timeType, String modelcode) { List voList = new ArrayList<>(); // 查询器具类型 final List electricityPrice = sysDictDataService.selectDictDataByType("electricity_price"); electricityPrice.stream().forEach(v->{ HomePeakValleyVO vo = new HomePeakValleyVO(); vo.setTimeName(v.getDictLabel()); vo.setTimeType(v.getDictValue()); vo.setCount(0D); vo.setPercentage(0D); voList.add(vo); }); Date queryTime = new Date(); // Date queryTime = DateUtil.parseDateTime("2024-08-28 00:00:00"); Date beginTime; Date endTime; String shixuTimeType; if (TimeType.DAY.name().equals(timeType)) { beginTime = DateUtil.beginOfDay(queryTime); endTime = DateUtil.endOfDay(beginTime); shixuTimeType = TimeType.HOUR.name(); // 月 } else if (TimeType.MONTH.name().equals(timeType)) { beginTime = DateUtil.beginOfMonth(queryTime); endTime = DateUtil.endOfMonth(beginTime); shixuTimeType = TimeType.DAY.name(); // 年 } else { beginTime = DateUtil.beginOfYear(queryTime); endTime = DateUtil.endOfYear(beginTime); shixuTimeType = TimeType.MONTH.name(); } Map> electricityDataMap; // 查询点位信息 final ModelNode firstModeNodeInfo = modelNodeMapper.getFirstModeNodeInfo(modelcode); if(null == firstModeNodeInfo){ return voList; } double totalElectric; // 查询点位信息 List nodeIndexInfoList = modelNodeMapper.selectIndexByModelCodeAndNodeId(modelcode, firstModeNodeInfo.getNodeId()); if (CollectionUtils.isNotEmpty(nodeIndexInfoList)) { Set indexSet = nodeIndexInfoList.stream().map(ModelNodeIndexInfor::getIndexId).collect(Collectors.toSet()); List dataItemList = electricityDataItemMapper.getDataStatistics(indexSet, beginTime, endTime, shixuTimeType); if(null != dataItemList){ totalElectric = dataItemList.stream().map(ElectricityDataItem::getElectricity).mapToDouble(BigDecimal::doubleValue).sum(); } else { totalElectric = 0; } electricityDataMap = dataItemList.stream() .collect(Collectors.groupingBy(ElectricityDataItem::getElectricityType)); } else { totalElectric = 0; electricityDataMap = null; } if(null != electricityDataMap) { voList.stream().forEach(vo -> { final List electricityDataItems = electricityDataMap.get(vo.getTimeType()); if(null != electricityDataItems) { final double sum = electricityDataItems.stream().map(ElectricityDataItem::getElectricity).mapToDouble(BigDecimal::doubleValue).sum(); vo.setCount(format2Double(sum)); if(totalElectric != 0) { vo.setPercentage(format2Double(sum / totalElectric * 100)); } } }); } return voList; } @Override public HomeEnergyConsumptionTrendVO energyConsumptionTrend(String timeType, String modelcode) { HomeEnergyConsumptionTrendVO vo = new HomeEnergyConsumptionTrendVO(); List> ydataList = new ArrayList<>(); List xdataList = new ArrayList<>(); // 查询所有能源类型 List sysEnergies = sysEnergyMapper.selectSysEnergyList(new SysEnergy()); final Map energyCollectMap = sysEnergies.stream().collect(Collectors.toMap(SysEnergy::getEnersno, SysEnergy::getCoefficient)); final Map energyNameMap = sysEnergies.stream().collect(Collectors.toMap(SysEnergy::getEnersno, SysEnergy::getEnername)); Date queryTime = new Date(); // Date queryTime = DateUtil.parseDateTime("2023-03-28 00:00:00"); Date beginTime; Date endTime; String shixuTimeType; String timeFormat; if (TimeType.DAY.name().equals(timeType)) { beginTime = DateUtil.beginOfDay(queryTime); endTime = DateUtil.endOfDay(beginTime); shixuTimeType = TimeType.HOUR.name(); timeFormat = "yyyy-MM-dd HH"; // 月 } else if (TimeType.MONTH.name().equals(timeType)) { beginTime = DateUtil.beginOfMonth(queryTime); endTime = DateUtil.endOfMonth(beginTime); shixuTimeType = TimeType.DAY.name(); timeFormat = "yyyy-MM-dd"; // 年 } else { beginTime = DateUtil.beginOfYear(queryTime); endTime = DateUtil.endOfYear(beginTime); shixuTimeType = TimeType.MONTH.name(); timeFormat = "yyyy-MM"; } // 通过code获取modelnode对应index信息 ModelNode modelNode = modelNodeService.getModelNodeByModelCodeByIndexCode(modelcode); if (ObjectUtils.isEmpty(modelNode)) { return vo; } List inforList = modelNodeService.getModelNodeIndexIdRelationInforByNodeId(modelNode.getNodeId()); List indexIds = inforList.stream().map(ModelNodeIndexInfor::getIndexId).collect(Collectors.toList()); // 通过indexIds找data_Item数据 List itemList = dataItemService.getDataItemTimeRangeInforByIndexIds(beginTime, endTime, shixuTimeType, indexIds); final Map> dataItemMap = itemList.stream().collect(Collectors.groupingBy(li -> DateUtil.format(li.getDataTime(), timeFormat))); // 查询点位详细信息 List energyIndexInforList = energyIndexService.getEnergyIndexByIds(indexIds); // 获取点位能源类型 Map> energyTypeMap = energyIndexInforList.stream() .filter(l -> StringUtils.isNotEmpty(l.getEnergyId())).collect(Collectors.groupingBy( EnergyIndex::getEnergyId, Collectors.mapping(EnergyIndex::getIndexId, Collectors.toList()) )); while (!beginTime.after(endTime)) { final String currentTime = DateUtil.format(beginTime, timeFormat); xdataList.add(currentTime); final List dataItems = dataItemMap.get(currentTime); List energyCount = new ArrayList<>(); energyTypeMap.forEach((energyType,IndexIdList)->{ double sum; if(null == dataItems){ sum = 0; }else { sum = dataItems.stream().filter(li -> IndexIdList.contains(li.getIndexId())).mapToDouble(DataItem::getValue).sum(); } final BigDecimal coefficient = (BigDecimal) energyCollectMap.get(energyType); energyCount.add(sum * coefficient.doubleValue()); }); ydataList.add(energyCount); switch (TimeType.valueOf(timeType)) { case DAY: beginTime = DateUtil.offsetHour(beginTime, 1); break; case MONTH: beginTime = DateUtil.offsetDay(beginTime, 1); break; default: beginTime = DateUtil.offsetMonth(beginTime, 1); break; } } vo.setXdata(xdataList.toArray(new String[0])); Double[][] array = new Double[sysEnergies.size()][xdataList.size()]; List lengList = new ArrayList<>(); energyCollectMap.keySet().forEach(key->{ final String name = energyNameMap.get(key); lengList.add(name); }); for(int i = 0; i < ydataList.size(); i++){ final List doubleList = ydataList.get(i); for(int n = 0; n < doubleList.size(); n++){ array[n][i] = format2Double(doubleList.get(n)); } } vo.setYdata(array); vo.setLegend(lengList.toArray(new String[0])); return vo; } @Override public List energyConsumptionRanking(String modelcode, String timeType) { List energyDataList = new ArrayList<>(); String nodeCategory = "2"; LambdaQueryWrapper modelNodeLambdaQueryWrapper = new LambdaQueryWrapper<>(); modelNodeLambdaQueryWrapper.eq(ModelNode::getModelCode,modelcode); modelNodeLambdaQueryWrapper.eq(ModelNode::getNodeCategory,nodeCategory); List modelNodeList = modelNodeMapper.selectList(modelNodeLambdaQueryWrapper); if(CollectionUtils.isEmpty(modelNodeList)){ return energyDataList; } final List nodeIds = modelNodeList.stream().map(ModelNode::getNodeId).collect(Collectors.toList()); List nodeIndexInforList = modelNodeMapper.selectIndexByNodeIds(modelcode ,nodeIds); final Map nodeNameMap = new HashMap<>(); nodeIndexInforList.forEach(n->{ final String id = n.getNodeId(); final String name = n.getName(); if(!nodeNameMap.containsKey(id)){ nodeNameMap.put(id,name); } }); // 按照点位进行分组 Map> nodeIndexMap = nodeIndexInforList.stream().collect( Collectors.groupingBy(ModelNodeIndexInfor::getNodeId)); final List eneryIdList = nodeIndexInforList.stream().map(ModelNodeIndexInfor::getEnergyId).distinct().collect(Collectors.toList()); final LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.in(CollectionUtils.isNotEmpty(eneryIdList),SysEnergy::getEnersno,eneryIdList); final List sysEnergies = sysEnergyMapper.selectList(queryWrapper); //能源编号和能源折标系数 final Map energyCoefficientMap = sysEnergies.stream().collect(Collectors.toMap(SysEnergy::getEnersno, SysEnergy::getCoefficient)); //index和能源 final Map indexIdEnergyIdMap = new HashMap<>(); nodeIndexInforList.forEach(n->{ final String indexId = n.getIndexId(); final String energyId = n.getEnergyId(); if(!indexIdEnergyIdMap.containsKey(indexId)){ indexIdEnergyIdMap.put(indexId,energyId); } }); List indexIds = nodeIndexInforList.stream().filter(l -> StringUtils.isNotEmpty(l.getIndexId())).map(ModelNodeIndexInfor::getIndexId).collect(Collectors.toList()); Date queryTime = new Date(); // Date queryTime = DateUtil.parseDateTime("2023-03-28 00:00:00"); Date beginTime; Date endTime; String shixuTimeType; if (TimeType.DAY.name().equals(timeType)) { beginTime = DateUtil.beginOfDay(queryTime); endTime = DateUtil.endOfDay(queryTime); shixuTimeType = TimeType.HOUR.name(); // 月 } else if (TimeType.MONTH.name().equals(timeType)) { beginTime = DateUtil.beginOfMonth(queryTime); endTime = DateUtil.endOfMonth(queryTime); shixuTimeType = TimeType.DAY.name(); // 年 } else { beginTime = DateUtil.beginOfYear(queryTime); endTime = DateUtil.endOfYear(queryTime); shixuTimeType = TimeType.MONTH.name(); } // 根据indexId查询dataItem List dataItemList = new ArrayList<>(); if(CollectionUtils.isNotEmpty(indexIds)) { dataItemList = dataItemService.getDataItemTimeRangeInforByIndexIds(beginTime, endTime, shixuTimeType, indexIds); } Map> dataItemMap = dataItemList.stream().collect(Collectors.groupingBy(DataItem::getIndexId)); Map resultMap = new HashMap<>(); nodeIndexMap.forEach((key, value) -> { // 找出indexIds List indexIdList = value.stream().map(ModelNodeIndexInfor::getIndexId).collect(Collectors.toList()); indexIdList.forEach(indexId->{ final List dataItems = dataItemMap.get(indexId); final String energyId = indexIdEnergyIdMap.get(indexId); final BigDecimal coefficient = (BigDecimal) energyCoefficientMap.get(energyId); if(CollectionUtils.isNotEmpty(dataItems) ){ BigDecimal sum = BigDecimal.valueOf(dataItems.stream() .mapToDouble(DataItem::getValue).sum()).setScale(CommonConst.DIGIT_2, RoundingMode.HALF_UP).multiply(coefficient); if (resultMap.containsKey(key)) { resultMap.put(key, resultMap.get(key).add(sum)); } else { resultMap.put(key, sum); } } }); }); resultMap.forEach((key,value)->{ RankingEnergyData rankingEnergyData = new RankingEnergyData(); rankingEnergyData.setNodeId(key); rankingEnergyData.setNodeName(nodeNameMap.get(key)); rankingEnergyData.setEnergyConsumption(value.doubleValue()); energyDataList.add(rankingEnergyData); }); Collections.sort(energyDataList, Comparator.comparingDouble((RankingEnergyData item) -> item.getEnergyConsumption()).reversed()); // 获取前5条记录 List top5Items = energyDataList.subList(0, Math.min(5, energyDataList.size())); return top5Items; } }