package com.zhitan.energydata.service.impl; 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.MeterImplement; import com.zhitan.basicdata.domain.SysEnergy; import com.zhitan.basicdata.mapper.MeterImplementMapper; import com.zhitan.basicdata.mapper.SysEnergyMapper; import com.zhitan.common.constant.CommonConst; import com.zhitan.common.enums.ElectricityTypeEnum; import com.zhitan.common.enums.TimeType; import com.zhitan.common.utils.DateUtils; import com.zhitan.common.utils.bean.BeanUtils; import com.zhitan.consumptionanalysis.domain.vo.RankingEnergyData; import com.zhitan.costmanagement.domain.CostElectricityInput; import com.zhitan.costmanagement.domain.vo.CostPriceRelevancyVo; import com.zhitan.costmanagement.mapper.CostElectricityInputMapper; import com.zhitan.costmanagement.mapper.CostPriceRelevancyMapper; import com.zhitan.dataitem.service.IDataItemService; import com.zhitan.energydata.mapper.EnergyDataStatisticMapper; import com.zhitan.energydata.service.IEnergyDataStatisticService; import com.zhitan.energydata.vo.EnergyChainYoyVO; import com.zhitan.energydata.vo.FactoryEnergyConsumptionItemVo; import com.zhitan.energydata.vo.FactoryEnergyConsumptionVo; import com.zhitan.energydata.vo.PurchaseConsumptionVo; import com.zhitan.home.domain.vo.HomeEnergyStatisticsVO; import com.zhitan.model.domain.EnergyIndex; import com.zhitan.model.domain.ModelNode; import com.zhitan.model.domain.vo.ModelNodeIndexInfo; import com.zhitan.model.mapper.EnergyIndexMapper; 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.domain.dto.PeakValleyDTO; import com.zhitan.peakvalley.domain.vo.peakvalley.*; import com.zhitan.peakvalley.mapper.PeakValleyMapper; import com.zhitan.realtimedata.domain.DataItem; 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 java.math.BigDecimal; import java.math.RoundingMode; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.*; import java.util.concurrent.atomic.AtomicReference; import java.util.stream.Collectors; /** * 综合治理大屏接口实现类 */ @Service @AllArgsConstructor public class EnergyDataStatisticServiceImpl implements IEnergyDataStatisticService { private ModelNodeMapper modelNodeMapper; private PeakValleyMapper electricityDataItemMapper; CostPriceRelevancyMapper costPriceRelevancyMapper; CostElectricityInputMapper electricityInputMapper; private IDataItemService dataItemService; private SysEnergyMapper sysEnergyMapper; private IModelNodeService modelNodeService; private IEnergyIndexService energyIndexService; private EnergyDataStatisticMapper statisticMapper; private EnergyIndexMapper energyIndexMapper; private MeterImplementMapper meterImplementMapper; @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 resultData = new ArrayList<>(); 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->{ EnergyChainYoyVO chainYoyVO = new EnergyChainYoyVO(); 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); } BeanUtils.copyProperties(vo, chainYoyVO); chainYoyVO.setSamePeriodCount(BigDecimal.valueOf(tongbiCount)); chainYoyVO.setCount(BigDecimal.valueOf(vo.getCount())); chainYoyVO.setTongbi(BigDecimal.valueOf(vo.getTongbi())); chainYoyVO.setHuanbi(BigDecimal.valueOf(vo.getHuanbi())); chainYoyVO.setTonCount(BigDecimal.valueOf(vo.getTonCount())); resultData.add(chainYoyVO); }); return resultData; } /** * 用电趋势分析--选择年 * @param dto * @return */ @Override public PeakValleyDayVO segmentAnalysisMonth(PeakValleyDTO dto) { PeakValleyDayVO peakValleyVO = new PeakValleyDayVO(); List reportVOList = new ArrayList<>(); //获取nodeId ModelNode modelNode = modelNodeService.getModelNodeByModelCodeByIndexCode(dto.getModelCode()); dto.setNodeId(modelNode.getNodeId()); // 查询时间范围 Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.DATE, 1); calendar.set(Calendar.HOUR, 0); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); Date endTime =calendar.getTime(); calendar.add(Calendar.MONTH, -12); Date startTime = calendar.getTime(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String timeType = dto.getTimeType(); Map> electricityDataMap = new HashMap<>(); // 查询点位信息 List nodeIndexInfoList = modelNodeMapper.selectIndexByModelCodeAndNodeId(dto.getModelCode(), dto.getNodeId()); if (CollectionUtils.isNotEmpty(nodeIndexInfoList)) { Set indexSet = nodeIndexInfoList.stream().map(ModelNodeIndexInfo::getIndexId).collect(Collectors.toSet()); List dataItemList = electricityDataItemMapper.getDataStatistics(indexSet, startTime, endTime, timeType); electricityDataMap = dataItemList.stream() .collect(Collectors.groupingBy(li -> DateUtil.formatDateTime(li.getDataTime()))); } while (!startTime.after(endTime)) { String mapKey = DateUtil.formatDateTime(startTime); List dataItemList = electricityDataMap.get(mapKey); BigDecimal sharpFee = BigDecimal.ZERO; BigDecimal sharpPower = BigDecimal.ZERO; BigDecimal peakFee = BigDecimal.ZERO; BigDecimal peakPower = BigDecimal.ZERO; BigDecimal flatFee = BigDecimal.ZERO; BigDecimal flatPower = BigDecimal.ZERO; BigDecimal valleyFee = BigDecimal.ZERO; BigDecimal valleyPower = BigDecimal.ZERO; if (CollectionUtils.isNotEmpty(dataItemList)) { for (ElectricityDataItem electricityDataItem : dataItemList) { String electricityType = electricityDataItem.getElectricityType(); if (ElectricityTypeEnum.SHARP.name().equals(electricityType)) { // sharpFee = sharpFee.add(electricityDataItem.getCost()); sharpPower = sharpPower.add(electricityDataItem.getElectricity()); } else if (ElectricityTypeEnum.PEAK.name().equals(electricityType)) { // peakFee = peakFee.add(electricityDataItem.getCost()); peakPower = peakPower.add(electricityDataItem.getElectricity()); } else if (ElectricityTypeEnum.FLAT.name().equals(electricityType)) { // flatFee = flatFee.add(electricityDataItem.getCost()); flatPower = flatPower.add(electricityDataItem.getElectricity()); } else { // valleyFee = valleyFee.add(electricityDataItem.getCost()); valleyPower = valleyPower.add(electricityDataItem.getElectricity()); } } //2024-11-12新增 CostPriceRelevancyVo voS = costPriceRelevancyMapper.selectCostPriceRelevancyByNodeId(dto.getNodeId(),ElectricityTypeEnum.SHARP.name()); if(voS!=null){ sharpFee = voS.getPrice().multiply(sharpPower); } CostPriceRelevancyVo voP = costPriceRelevancyMapper.selectCostPriceRelevancyByNodeId(dto.getNodeId(),ElectricityTypeEnum.PEAK.name()); if(voP!=null){ peakFee = voP.getPrice().multiply(peakPower); } CostPriceRelevancyVo voF = costPriceRelevancyMapper.selectCostPriceRelevancyByNodeId(dto.getNodeId(),ElectricityTypeEnum.FLAT.name()); if(voF!=null){ flatFee = voF.getPrice().multiply(flatPower); } CostPriceRelevancyVo voV = costPriceRelevancyMapper.selectCostPriceRelevancyByNodeId(dto.getNodeId(), ElectricityTypeEnum.VALLEY.name()); if(voV!=null){ valleyFee = voV.getPrice().multiply(valleyPower); } } PeakValleyDayDataVO peakAndValleyReportVO = new PeakValleyDayDataVO(startTime, sharpFee, sharpPower, peakFee, peakPower, flatFee, flatPower, valleyFee, valleyPower); reportVOList.add(peakAndValleyReportVO); startTime = DateUtil.offsetMonth(startTime, 1); } List costList = new ArrayList<>(); List powerConsumptionList = new ArrayList<>(); PeakValleyDayTotalVO peakValleyDayTotalVO = new PeakValleyDayTotalVO(); AtomicReference flatFreeCount = new AtomicReference<>(BigDecimal.ZERO); AtomicReference tipFreeCount = new AtomicReference<>(BigDecimal.ZERO); AtomicReference troughFreeCount = new AtomicReference<>(BigDecimal.ZERO); AtomicReference peakFreeCount = new AtomicReference<>(BigDecimal.ZERO); AtomicReference flatCount = new AtomicReference<>(BigDecimal.ZERO); AtomicReference tipCount = new AtomicReference<>(BigDecimal.ZERO); AtomicReference troughCount = new AtomicReference<>(BigDecimal.ZERO); AtomicReference peakCount = new AtomicReference<>(BigDecimal.ZERO); reportVOList.stream().forEach(r->{ PeakValleyLineChatVO costVO = new PeakValleyLineChatVO(); PeakValleyLineChatVO powerConsumptionVO = new PeakValleyLineChatVO(); /** * 用电量 */ final BigDecimal peakPower = r.getPeakPower(); final BigDecimal valleyPower = r.getValleyPower(); final BigDecimal sharpPower = r.getSharpPower(); final BigDecimal flatPower = r.getFlatPower(); powerConsumptionVO.setXdata(DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD,r.getTime())); powerConsumptionVO.setYtip(sharpPower); powerConsumptionVO.setYpeak(peakPower); powerConsumptionVO.setYtrough(valleyPower); powerConsumptionVO.setYflat(flatPower); powerConsumptionList.add(powerConsumptionVO); /** * 用电费用 */ final BigDecimal peakFee = r.getPeakFee(); final BigDecimal valleyFee = r.getValleyFee(); final BigDecimal sharpFee = r.getSharpFee(); final BigDecimal flatFee = r.getFlatFee(); costVO.setXdata(DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD,r.getTime())); costVO.setYtip(sharpFee); costVO.setYpeak(peakFee); costVO.setYtrough(valleyFee); costVO.setYflat(flatFee); costList.add(costVO); flatCount.set(flatCount.get().add(r.getFlatPower())); tipCount.set(tipCount.get().add(r.getSharpPower())); troughCount.set(troughCount.get().add(r.getValleyPower())); peakCount.set(peakCount.get().add(r.getPeakPower())); flatFreeCount.set(flatFreeCount.get().add(r.getFlatFee())); tipFreeCount.set(tipFreeCount.get().add(r.getSharpFee())); troughFreeCount.set(troughFreeCount.get().add(r.getValleyFee())); peakFreeCount.set(peakFreeCount.get().add(r.getPeakFee())); }); peakValleyDayTotalVO.setPeakPowerCost(peakFreeCount.get().doubleValue()); peakValleyDayTotalVO.setPeakPowerConsumption(peakCount.get().doubleValue()); peakValleyDayTotalVO.setFlatPowerCost(flatFreeCount.get().doubleValue()); peakValleyDayTotalVO.setFlatPowerConsumption(flatCount.get().doubleValue()); peakValleyDayTotalVO.setTipPowerCost(tipFreeCount.get().doubleValue()); peakValleyDayTotalVO.setTipPowerConsumption(tipCount.get().doubleValue()); peakValleyDayTotalVO.setTroughPowerCost(troughFreeCount.get().doubleValue()); peakValleyDayTotalVO.setTroughPowerConsumption(troughCount.get().doubleValue()); BigDecimal powerTotal = peakCount.get().add(tipCount.get()).add(troughCount.get()).add(flatCount.get()); if(powerTotal.compareTo(BigDecimal.ZERO) > 0) { peakValleyDayTotalVO.setPeakPowerProportion(peakCount.get().divide(powerTotal.multiply(new BigDecimal(0.01)), 2, RoundingMode.HALF_UP).doubleValue()); peakValleyDayTotalVO.setFlatPowerProportion(flatCount.get().divide(powerTotal.multiply(new BigDecimal(0.01)), 2, RoundingMode.HALF_UP).doubleValue()); peakValleyDayTotalVO.setTipPowerProportion(tipCount.get().divide(powerTotal.multiply(new BigDecimal(0.01)), 2, RoundingMode.HALF_UP).doubleValue()); peakValleyDayTotalVO.setTroughPowerProportion(troughCount.get().divide(powerTotal.multiply(new BigDecimal(0.01)), 2, RoundingMode.HALF_UP).doubleValue()); }else { peakValleyDayTotalVO.setPeakPowerProportion(0); peakValleyDayTotalVO.setFlatPowerProportion(0); peakValleyDayTotalVO.setTipPowerProportion(0); peakValleyDayTotalVO.setTroughPowerProportion(0); } BigDecimal freeTotal = peakFreeCount.get().add(tipFreeCount.get()).add(troughFreeCount.get()).add(flatFreeCount.get()); if(freeTotal.compareTo(BigDecimal.ZERO) > 0) { peakValleyDayTotalVO.setPeakPowerCostProportion(peakFreeCount.get().divide(freeTotal.multiply(new BigDecimal(0.01)), 2, RoundingMode.HALF_UP).doubleValue()); peakValleyDayTotalVO.setFlatPowerCostProportion(flatFreeCount.get().divide(freeTotal.multiply(new BigDecimal(0.01)), 2, RoundingMode.HALF_UP).doubleValue()); peakValleyDayTotalVO.setTipPowerCostProportion(tipFreeCount.get().divide(freeTotal.multiply(new BigDecimal(0.01)), 2, RoundingMode.HALF_UP).doubleValue()); peakValleyDayTotalVO.setTroughPowerCostProportion(troughFreeCount.get().divide(freeTotal.multiply(new BigDecimal(0.01)), 2, RoundingMode.HALF_UP).doubleValue()); }else { peakValleyDayTotalVO.setPeakPowerCostProportion(0); peakValleyDayTotalVO.setFlatPowerCostProportion(0); peakValleyDayTotalVO.setTipPowerCostProportion(0); peakValleyDayTotalVO.setTroughPowerCostProportion(0); } peakValleyDayTotalVO.setTotalCost(powerTotal.doubleValue()); peakValleyDayTotalVO.setTotalPowerConsumption(freeTotal.doubleValue()); peakValleyVO.setTotalVO(peakValleyDayTotalVO); peakValleyVO.setCostList(costList); peakValleyVO.setPowerConsumptionList(powerConsumptionList); return peakValleyVO; } @Override public PeakValleyDayVO segmentAnalysisDay(PeakValleyDTO dto) { PeakValleyDayVO peakValleyVO = new PeakValleyDayVO(); List reportVOList = new ArrayList<>(); //获取nodeId ModelNode modelNode = modelNodeService.getModelNodeByModelCodeByIndexCode(dto.getModelCode()); dto.setNodeId(modelNode.getNodeId()); // 查询时间范围 Date startTime = DateUtil.beginOfMonth(dto.getQueryTime()); Date endTime = DateUtil.endOfMonth(startTime); String timeType = dto.getTimeType(); Map> electricityDataMap = new HashMap<>(); // 查询点位信息 List nodeIndexInfoList = modelNodeMapper.selectIndexByModelCodeAndNodeId(dto.getModelCode(), dto.getNodeId()); if (CollectionUtils.isNotEmpty(nodeIndexInfoList)) { Set indexSet = nodeIndexInfoList.stream().map(ModelNodeIndexInfo::getIndexId).collect(Collectors.toSet()); List dataItemList = electricityDataItemMapper.getDataStatistics(indexSet, startTime, endTime, timeType); electricityDataMap = dataItemList.stream() .collect(Collectors.groupingBy(li -> DateUtil.formatDateTime(li.getDataTime()))); } while (!startTime.after(endTime)) { String mapKey = DateUtil.formatDateTime(startTime); List dataItemList = electricityDataMap.get(mapKey); BigDecimal sharpFee = BigDecimal.ZERO; BigDecimal sharpPower = BigDecimal.ZERO; BigDecimal peakFee = BigDecimal.ZERO; BigDecimal peakPower = BigDecimal.ZERO; BigDecimal flatFee = BigDecimal.ZERO; BigDecimal flatPower = BigDecimal.ZERO; BigDecimal valleyFee = BigDecimal.ZERO; BigDecimal valleyPower = BigDecimal.ZERO; if (CollectionUtils.isNotEmpty(dataItemList)) { for (ElectricityDataItem electricityDataItem : dataItemList) { String electricityType = electricityDataItem.getElectricityType(); if (ElectricityTypeEnum.SHARP.name().equals(electricityType)) { // sharpFee = sharpFee.add(electricityDataItem.getCost()); sharpPower = sharpPower.add(electricityDataItem.getElectricity()); } else if (ElectricityTypeEnum.PEAK.name().equals(electricityType)) { // peakFee = peakFee.add(electricityDataItem.getCost()); peakPower = peakPower.add(electricityDataItem.getElectricity()); } else if (ElectricityTypeEnum.FLAT.name().equals(electricityType)) { // flatFee = flatFee.add(electricityDataItem.getCost()); flatPower = flatPower.add(electricityDataItem.getElectricity()); } else { // valleyFee = valleyFee.add(electricityDataItem.getCost()); valleyPower = valleyPower.add(electricityDataItem.getElectricity()); } } //2024-11-12新增 CostPriceRelevancyVo voS = costPriceRelevancyMapper.selectCostPriceRelevancyByNodeId(dto.getNodeId(),ElectricityTypeEnum.SHARP.name()); if(voS!=null){ sharpFee = voS.getPrice().multiply(sharpPower); } CostPriceRelevancyVo voP = costPriceRelevancyMapper.selectCostPriceRelevancyByNodeId(dto.getNodeId(),ElectricityTypeEnum.PEAK.name()); if(voP!=null){ peakFee = voP.getPrice().multiply(peakPower); } CostPriceRelevancyVo voF = costPriceRelevancyMapper.selectCostPriceRelevancyByNodeId(dto.getNodeId(),ElectricityTypeEnum.FLAT.name()); if(voF!=null){ flatFee = voF.getPrice().multiply(flatPower); } CostPriceRelevancyVo voV = costPriceRelevancyMapper.selectCostPriceRelevancyByNodeId(dto.getNodeId(), ElectricityTypeEnum.VALLEY.name()); if(voV!=null){ valleyFee = voV.getPrice().multiply(valleyPower); } // CostPriceRelevancyVo voD = costPriceRelevancyMapper.selectCostPriceRelevancyByNodeId(dto.getNodeId(), ElectricityTypeEnum.DEEP.name()); // if(voV!=null){ // DeepFee = voV.getPrice().multiply(valleyPower); // } } PeakValleyDayDataVO peakAndValleyReportVO = new PeakValleyDayDataVO(startTime, sharpFee, sharpPower, peakFee, peakPower, flatFee, flatPower, valleyFee, valleyPower); reportVOList.add(peakAndValleyReportVO); switch (TimeType.valueOf(timeType)) { case HOUR: startTime = DateUtil.offsetHour(startTime, 1); break; case DAY: startTime = DateUtil.offsetDay(startTime, 1); break; case MONTH: startTime = DateUtil.offsetMonth(startTime, 1); break; default: startTime = DateUtil.offsetMonth(startTime, 12); break; } } List costList = new ArrayList<>(); List powerConsumptionList = new ArrayList<>(); PeakValleyDayTotalVO peakValleyDayTotalVO = new PeakValleyDayTotalVO(); AtomicReference flatFreeCount = new AtomicReference<>(BigDecimal.ZERO); AtomicReference tipFreeCount = new AtomicReference<>(BigDecimal.ZERO); AtomicReference troughFreeCount = new AtomicReference<>(BigDecimal.ZERO); AtomicReference peakFreeCount = new AtomicReference<>(BigDecimal.ZERO); AtomicReference flatCount = new AtomicReference<>(BigDecimal.ZERO); AtomicReference tipCount = new AtomicReference<>(BigDecimal.ZERO); AtomicReference troughCount = new AtomicReference<>(BigDecimal.ZERO); AtomicReference peakCount = new AtomicReference<>(BigDecimal.ZERO); reportVOList.stream().forEach(r->{ PeakValleyLineChatVO costVO = new PeakValleyLineChatVO(); PeakValleyLineChatVO powerConsumptionVO = new PeakValleyLineChatVO(); /** * 用电量 */ final BigDecimal peakPower = r.getPeakPower(); final BigDecimal valleyPower = r.getValleyPower(); final BigDecimal sharpPower = r.getSharpPower(); final BigDecimal flatPower = r.getFlatPower(); powerConsumptionVO.setXdata(DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD,r.getTime())); powerConsumptionVO.setYtip(sharpPower); powerConsumptionVO.setYpeak(peakPower); powerConsumptionVO.setYtrough(valleyPower); powerConsumptionVO.setYflat(flatPower); powerConsumptionList.add(powerConsumptionVO); /** * 用电费用 */ final BigDecimal peakFee = r.getPeakFee(); final BigDecimal valleyFee = r.getValleyFee(); final BigDecimal sharpFee = r.getSharpFee(); final BigDecimal flatFee = r.getFlatFee(); costVO.setXdata(DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD,r.getTime())); costVO.setYtip(sharpFee); costVO.setYpeak(peakFee); costVO.setYtrough(valleyFee); costVO.setYflat(flatFee); costList.add(costVO); flatCount.set(flatCount.get().add(r.getFlatPower())); tipCount.set(tipCount.get().add(r.getSharpPower())); troughCount.set(troughCount.get().add(r.getValleyPower())); peakCount.set(peakCount.get().add(r.getPeakPower())); flatFreeCount.set(flatFreeCount.get().add(r.getFlatFee())); tipFreeCount.set(tipFreeCount.get().add(r.getSharpFee())); troughFreeCount.set(troughFreeCount.get().add(r.getValleyFee())); peakFreeCount.set(peakFreeCount.get().add(r.getPeakFee())); }); peakValleyDayTotalVO.setPeakPowerCost(peakFreeCount.get().doubleValue()); peakValleyDayTotalVO.setPeakPowerConsumption(peakCount.get().doubleValue()); peakValleyDayTotalVO.setFlatPowerCost(flatFreeCount.get().doubleValue()); peakValleyDayTotalVO.setFlatPowerConsumption(flatCount.get().doubleValue()); peakValleyDayTotalVO.setTipPowerCost(tipFreeCount.get().doubleValue()); peakValleyDayTotalVO.setTipPowerConsumption(tipCount.get().doubleValue()); peakValleyDayTotalVO.setTroughPowerCost(troughFreeCount.get().doubleValue()); peakValleyDayTotalVO.setTroughPowerConsumption(troughCount.get().doubleValue()); BigDecimal powerTotal = peakCount.get().add(tipCount.get()).add(troughCount.get()).add(flatCount.get()); if(powerTotal.compareTo(BigDecimal.ZERO) > 0) { peakValleyDayTotalVO.setPeakPowerProportion(peakCount.get().divide(powerTotal.multiply(new BigDecimal(0.01)), 2, RoundingMode.HALF_UP).doubleValue()); peakValleyDayTotalVO.setFlatPowerProportion(flatCount.get().divide(powerTotal.multiply(new BigDecimal(0.01)), 2, RoundingMode.HALF_UP).doubleValue()); peakValleyDayTotalVO.setTipPowerProportion(tipCount.get().divide(powerTotal.multiply(new BigDecimal(0.01)), 2, RoundingMode.HALF_UP).doubleValue()); peakValleyDayTotalVO.setTroughPowerProportion(troughCount.get().divide(powerTotal.multiply(new BigDecimal(0.01)), 2, RoundingMode.HALF_UP).doubleValue()); }else { peakValleyDayTotalVO.setPeakPowerProportion(0); peakValleyDayTotalVO.setFlatPowerProportion(0); peakValleyDayTotalVO.setTipPowerProportion(0); peakValleyDayTotalVO.setTroughPowerProportion(0); } BigDecimal freeTotal = peakFreeCount.get().add(tipFreeCount.get()).add(troughFreeCount.get()).add(flatFreeCount.get()); if(freeTotal.compareTo(BigDecimal.ZERO) > 0) { peakValleyDayTotalVO.setPeakPowerCostProportion(peakFreeCount.get().divide(freeTotal.multiply(new BigDecimal(0.01)), 2, RoundingMode.HALF_UP).doubleValue()); peakValleyDayTotalVO.setFlatPowerCostProportion(flatFreeCount.get().divide(freeTotal.multiply(new BigDecimal(0.01)), 2, RoundingMode.HALF_UP).doubleValue()); peakValleyDayTotalVO.setTipPowerCostProportion(tipFreeCount.get().divide(freeTotal.multiply(new BigDecimal(0.01)), 2, RoundingMode.HALF_UP).doubleValue()); peakValleyDayTotalVO.setTroughPowerCostProportion(troughFreeCount.get().divide(freeTotal.multiply(new BigDecimal(0.01)), 2, RoundingMode.HALF_UP).doubleValue()); }else { peakValleyDayTotalVO.setPeakPowerCostProportion(0); peakValleyDayTotalVO.setFlatPowerCostProportion(0); peakValleyDayTotalVO.setTipPowerCostProportion(0); peakValleyDayTotalVO.setTroughPowerCostProportion(0); } // peakValleyDayTotalVO.setTotalCost(powerTotal.doubleValue()); // peakValleyDayTotalVO.setTotalPowerConsumption(freeTotal.doubleValue()); peakValleyDayTotalVO.setTotalCost(freeTotal.doubleValue()); peakValleyDayTotalVO.setTotalPowerConsumption(powerTotal.doubleValue()); peakValleyVO.setTotalVO(peakValleyDayTotalVO); peakValleyVO.setCostList(costList); peakValleyVO.setPowerConsumptionList(powerConsumptionList); return peakValleyVO; } @Override public PeakValleyHourVO segmentAnalysisHour(PeakValleyDTO dto) { PeakValleyHourVO peakValleyVO = new PeakValleyHourVO(); List reportVOList = new ArrayList<>(); //获取nodeId ModelNode modelNode = modelNodeService.getModelNodeByModelCodeByIndexCode(dto.getModelCode()); dto.setNodeId(modelNode.getNodeId()); // 查询时间范围 Date startTime = DateUtil.beginOfDay(dto.getQueryTime()); Date endTime = DateUtil.endOfDay(startTime); String timeType = dto.getTimeType(); Map> electricityDataMap = new HashMap<>(); // 查询点位信息 List nodeIndexInfoList = modelNodeMapper.selectIndexByModelCodeAndNodeId(dto.getModelCode(), dto.getNodeId()); if (CollectionUtils.isNotEmpty(nodeIndexInfoList)) { Set indexSet = nodeIndexInfoList.stream().map(ModelNodeIndexInfo::getIndexId).collect(Collectors.toSet()); List dataItemList = electricityDataItemMapper.getDataStatistics(indexSet, startTime, endTime, timeType); electricityDataMap = dataItemList.stream() .collect(Collectors.groupingBy(li -> DateUtil.formatDateTime(li.getDataTime()))); } while (!startTime.after(endTime)) { String mapKey = DateUtil.formatDateTime(startTime); List dataItemList = electricityDataMap.get(mapKey); BigDecimal sharpFee = BigDecimal.ZERO; BigDecimal sharpPower = BigDecimal.ZERO; BigDecimal peakFee = BigDecimal.ZERO; BigDecimal peakPower = BigDecimal.ZERO; BigDecimal flatFee = BigDecimal.ZERO; BigDecimal flatPower = BigDecimal.ZERO; BigDecimal valleyFee = BigDecimal.ZERO; BigDecimal valleyPower = BigDecimal.ZERO; if (CollectionUtils.isNotEmpty(dataItemList)) { for (ElectricityDataItem electricityDataItem : dataItemList) { String electricityType = electricityDataItem.getElectricityType(); if (ElectricityTypeEnum.SHARP.name().equals(electricityType)) { // sharpFee = sharpFee.add(electricityDataItem.getCost()); sharpPower = sharpPower.add(electricityDataItem.getElectricity()); } else if (ElectricityTypeEnum.PEAK.name().equals(electricityType)) { // peakFee = peakFee.add(electricityDataItem.getCost()); peakPower = peakPower.add(electricityDataItem.getElectricity()); } else if (ElectricityTypeEnum.FLAT.name().equals(electricityType)) { // flatFee = flatFee.add(electricityDataItem.getCost()); flatPower = flatPower.add(electricityDataItem.getElectricity()); } else { // valleyFee = valleyFee.add(electricityDataItem.getCost()); valleyPower = valleyPower.add(electricityDataItem.getElectricity()); } } //2024-11-12新增 CostPriceRelevancyVo voS = costPriceRelevancyMapper.selectCostPriceRelevancyByNodeId(dto.getNodeId(),ElectricityTypeEnum.SHARP.name()); if(voS!=null){ sharpFee = voS.getPrice().multiply(sharpPower); } CostPriceRelevancyVo voP = costPriceRelevancyMapper.selectCostPriceRelevancyByNodeId(dto.getNodeId(),ElectricityTypeEnum.PEAK.name()); if(voP!=null){ peakFee = voP.getPrice().multiply(peakPower); } CostPriceRelevancyVo voF = costPriceRelevancyMapper.selectCostPriceRelevancyByNodeId(dto.getNodeId(),ElectricityTypeEnum.FLAT.name()); if(voF!=null){ flatFee = voF.getPrice().multiply(flatPower); } CostPriceRelevancyVo voV = costPriceRelevancyMapper.selectCostPriceRelevancyByNodeId(dto.getNodeId(), ElectricityTypeEnum.VALLEY.name()); if(voV!=null){ valleyFee = voV.getPrice().multiply(valleyPower); } } PeakValleyHourDataVO peakAndValleyReportVO = new PeakValleyHourDataVO(startTime, sharpFee, sharpPower, peakFee, peakPower, flatFee, flatPower, valleyFee, valleyPower); reportVOList.add(peakAndValleyReportVO); switch (TimeType.valueOf(timeType)) { case HOUR: startTime = DateUtil.offsetHour(startTime, 1); break; case DAY: startTime = DateUtil.offsetDay(startTime, 1); break; case MONTH: startTime = DateUtil.offsetMonth(startTime, 1); break; default: startTime = DateUtil.offsetMonth(startTime, 12); break; } } peakValleyVO.setDataList(reportVOList); List peakValleyLineChatVOS = new ArrayList<>(); AtomicReference flatCount = new AtomicReference<>(BigDecimal.ZERO); AtomicReference tipCount = new AtomicReference<>(BigDecimal.ZERO); AtomicReference troughCount = new AtomicReference<>(BigDecimal.ZERO); AtomicReference peakCount = new AtomicReference<>(BigDecimal.ZERO); reportVOList.stream().forEach(r->{ PeakValleyLineChatVO lineChatVO = new PeakValleyLineChatVO(); lineChatVO.setXdata(DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS,r.getTime())); lineChatVO.setYtip(r.getSharpPower()); lineChatVO.setYflat(r.getFlatPower()); lineChatVO.setYtrough(r.getValleyPower()); lineChatVO.setYpeak(r.getPeakPower()); peakValleyLineChatVOS.add(lineChatVO); BigDecimal flat = flatCount.get().add(r.getFlatPower()); flatCount.set(flat); BigDecimal tip = tipCount.get().add(r.getSharpPower()); tipCount.set(tip); BigDecimal trough = troughCount.get().add(r.getValleyPower()); troughCount.set(trough); BigDecimal peak = peakCount.get().add(r.getPeakPower()); peakCount.set(peak); }); PeakValleyPieChatVO peakValleyPieChatVO = new PeakValleyPieChatVO(); BigDecimal total = peakCount.get().add(tipCount.get()).add(troughCount.get()).add(flatCount.get()).multiply(new BigDecimal(0.01)); if(total.compareTo(BigDecimal.ZERO) > 0) { peakValleyPieChatVO.setPeak(peakCount.get().divide(total, 2, RoundingMode.HALF_UP).toString()); peakValleyPieChatVO.setFlat(flatCount.get().divide(total, 2, RoundingMode.HALF_UP).toString()); peakValleyPieChatVO.setTip(tipCount.get().divide(total, 2, RoundingMode.HALF_UP).toString()); peakValleyPieChatVO.setTrough(troughCount.get().divide(total, 2, RoundingMode.HALF_UP).toString()); }else { peakValleyPieChatVO.setPeak("0"); peakValleyPieChatVO.setFlat("0"); peakValleyPieChatVO.setTip("0"); peakValleyPieChatVO.setTrough("0"); } peakValleyVO.setPieChat(peakValleyPieChatVO); peakValleyVO.setLineChat(peakValleyLineChatVOS); return peakValleyVO; } /** * 能耗科室排名前10 * @param modelCode * @param timeType * @return */ @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(ModelNodeIndexInfo::getNodeId)); final List eneryIdList = nodeIndexInforList.stream().map(ModelNodeIndexInfo::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(ModelNodeIndexInfo::getIndexId).collect(Collectors.toList()); Date queryTime = new Date(); 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(ModelNodeIndexInfo::getIndexId).filter(Objects::nonNull).collect(Collectors.toList()); if (null!=indexIdList &&!indexIdList.isEmpty()){ indexIdList.forEach(indexId -> { final List dataItems = dataItemMap.get(indexId); final String energyId = indexIdEnergyIdMap.get(indexId); BigDecimal coefficient = (BigDecimal) energyCoefficientMap.get(energyId); if (coefficient == null && StringUtils.isBlank(energyId)) { EnergyIndex energyIndex = energyIndexMapper.selectEnergyIndexById(indexId); MeterImplement meterImplement = meterImplementMapper.selectMeterImplementById(energyIndex.getMeterId()); coefficient = (BigDecimal) energyCoefficientMap.get(meterImplement.getEnergyType()); } 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()); // 获取前10条记录 List top5Items = energyDataList.subList(0, Math.min(10, energyDataList.size())); return top5Items; } /** * 各个车间能耗分析 * @param timeType * @param modelCode * @return */ @Override public FactoryEnergyConsumptionVo factoryEnergyConsumption(String timeType, String modelCode) { ModelNode modelNode = modelNodeService.getModelNodeByModelCodeByIndexCode(modelCode); //顶部本月综合能耗 FactoryEnergyConsumptionVo energyConsumptionVo=new FactoryEnergyConsumptionVo(); final List current = energyConsumptionSummation(timeType, modelCode); //本月能耗费用 BigDecimal monthEnergyAmount=getTotalConsumption(modelCode,modelNode.getNodeId(),timeType); energyConsumptionVo.setMonthEnergyAmount(monthEnergyAmount); //各个车间能耗 final List factoryCurrent = factoryEnergyConData(timeType, modelCode); EnergyChainYoyVO homeEnergyStatisticsVO = current.get(0); energyConsumptionVo.setItemVoList(factoryCurrent);// energyConsumptionVo.setMonthConsumption(homeEnergyStatisticsVO.getCount()); energyConsumptionVo.setCEmission(BigDecimal.ZERO); energyConsumptionVo.setUseEnergyIndex(BigDecimal.ZERO); return energyConsumptionVo; } /** * 购入消耗对比 * @param modelCode * @param timeType * @return */ @Override public List purchaseConsumption(String modelCode, String timeType) { ModelNode modelNode = modelNodeService.getModelNodeByModelCodeByIndexCode(modelCode); List voList=new ArrayList<>(); String queryTime=null; if (TimeType.DAY.name().equals(timeType)) { queryTime=DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD,new Date()); // 月 } else if (TimeType.MONTH.name().equals(timeType)) { queryTime=DateUtils.parseDateToStr(DateUtils.YYYY_MM,new Date()); // 年 } else { queryTime=DateUtils.parseDateToStr(DateUtils.YYYY,new Date()); } //获取购入量 LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.like(CostElectricityInput::getType,timeType); queryWrapper.like(CostElectricityInput::getTime,queryTime); List list=electricityInputMapper.selectList(queryWrapper); //获取消耗量 BigDecimal totalConsumption=getTotalConsumption(modelCode,modelNode.getNodeId(),timeType); //写入实体类 PurchaseConsumptionVo vo=new PurchaseConsumptionVo(); vo.setEnergyNo("electric"); vo.setEnergyName("电"); vo.setConsumptionSum(totalConsumption.divide(BigDecimal.valueOf(1000),RoundingMode.HALF_UP)); if (!list.isEmpty()){ vo.setPurchaseSum(list.get(0).getElectricityFee().divide(BigDecimal.valueOf(1000),RoundingMode.HALF_UP)); }else{ vo.setPurchaseSum(BigDecimal.ZERO); } voList.add(vo); return voList; } /** * 能源成本占比 * @param modelCode * @param timeType * @return */ @Override public List costProp(String modelCode, String timeType) { List list=new ArrayList<>(); ModelNode modelNode = modelNodeService.getModelNodeByModelCodeByIndexCode(modelCode); BigDecimal totalConsumption=getTotalConsumption(modelCode, modelNode.getNodeId(), timeType); PurchaseConsumptionVo vo=new PurchaseConsumptionVo(); vo.setEnergyNo("electric"); vo.setEnergyName("电"); vo.setConsumptionSum(totalConsumption.divide(BigDecimal.valueOf(10000),RoundingMode.HALF_UP)); list.add(vo); return list; } /** * 根据尖峰平谷获取消耗电量金额 * @param modelCode * @param nodeId * @param timeType * @return */ public BigDecimal getTotalConsumption(String modelCode,String nodeId,String timeType){ BigDecimal totalConsumption = BigDecimal.ZERO; Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.HOUR, 0); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); Date queryTime =calendar.getTime(); Date startTime =new Date(); Date endTime =new Date(); if (TimeType.DAY.name().equals(timeType)) { startTime = DateUtil.beginOfDay(queryTime); endTime = DateUtil.endOfDay(queryTime); // 月 } else if (TimeType.MONTH.name().equals(timeType)) { calendar.set(Calendar.DATE, 1); startTime = DateUtil.beginOfMonth(queryTime); endTime = DateUtil.endOfMonth(queryTime); // 年 } else { calendar.set(Calendar.DATE, 1); startTime = DateUtil.beginOfYear(queryTime); endTime = DateUtil.endOfYear(queryTime); } Map> electricityDataMap = new HashMap<>(); // 查询点位信息 List nodeIndexInfoList = modelNodeMapper.selectIndexByModelCodeAndNodeId(modelCode, nodeId); if (CollectionUtils.isNotEmpty(nodeIndexInfoList)) { Set indexSet = nodeIndexInfoList.stream().map(ModelNodeIndexInfo::getIndexId).collect(Collectors.toSet()); List dataItemList = electricityDataItemMapper.getDataStatistics(indexSet, startTime,endTime , timeType); electricityDataMap = dataItemList.stream() .collect(Collectors.groupingBy(li -> DateUtil.formatDateTime(li.getDataTime()))); } while (!startTime.after(endTime)) { String mapKey = DateUtil.formatDateTime(startTime); List dataItemList = electricityDataMap.get(mapKey); BigDecimal sharpFee = BigDecimal.ZERO; BigDecimal sharpPower = BigDecimal.ZERO; BigDecimal peakFee = BigDecimal.ZERO; BigDecimal peakPower = BigDecimal.ZERO; BigDecimal flatFee = BigDecimal.ZERO; BigDecimal flatPower = BigDecimal.ZERO; BigDecimal valleyFee = BigDecimal.ZERO; BigDecimal valleyPower = BigDecimal.ZERO; if (CollectionUtils.isNotEmpty(dataItemList)) { for (ElectricityDataItem electricityDataItem : dataItemList) { String electricityType = electricityDataItem.getElectricityType(); if (ElectricityTypeEnum.SHARP.name().equals(electricityType)) { sharpPower = sharpPower.add(electricityDataItem.getElectricity()); } else if (ElectricityTypeEnum.PEAK.name().equals(electricityType)) { peakPower = peakPower.add(electricityDataItem.getElectricity()); } else if (ElectricityTypeEnum.FLAT.name().equals(electricityType)) { flatPower = flatPower.add(electricityDataItem.getElectricity()); } else { valleyPower = valleyPower.add(electricityDataItem.getElectricity()); } } //2024-11-12新增 CostPriceRelevancyVo voS = costPriceRelevancyMapper.selectCostPriceRelevancyByNodeId(nodeId,ElectricityTypeEnum.SHARP.name()); if(voS!=null){ sharpFee = voS.getPrice().multiply(sharpPower); } CostPriceRelevancyVo voP = costPriceRelevancyMapper.selectCostPriceRelevancyByNodeId(nodeId,ElectricityTypeEnum.PEAK.name()); if(voP!=null){ peakFee = voP.getPrice().multiply(peakPower); } CostPriceRelevancyVo voF = costPriceRelevancyMapper.selectCostPriceRelevancyByNodeId(nodeId,ElectricityTypeEnum.FLAT.name()); if(voF!=null){ flatFee = voF.getPrice().multiply(flatPower); } CostPriceRelevancyVo voV = costPriceRelevancyMapper.selectCostPriceRelevancyByNodeId(nodeId, ElectricityTypeEnum.VALLEY.name()); if(voV!=null){ valleyFee = voV.getPrice().multiply(valleyPower); } } totalConsumption = totalConsumption.add(sharpFee).add(peakFee).add(flatFee).add(valleyFee); if (TimeType.DAY.name().equals(timeType)) { startTime = DateUtil.offsetDay(startTime, 1); // 月 } else if (TimeType.MONTH.name().equals(timeType)) { startTime = DateUtil.offsetMonth(startTime, 1); // 年 } else { startTime = DateUtil.offsetMonth(startTime, 12); } } return totalConsumption; } /** * 根据厂区、能源类型分组获取每个厂区、每种能源类型的消耗量 * @param timeType * @param modelCode * @return */ public List factoryEnergyConData(String timeType, String modelCode){ List energyDataList=new ArrayList<>(); //厂区固定为当前6个 List fixedNodeIds=new ArrayList<>(); fixedNodeIds.add("d9a155d2-b2dd-4a70-a00b-f8ab5be91f00");//冶一 fixedNodeIds.add("58dcb139-c943-41fe-a764-7cf79f987c9f");//冶二 fixedNodeIds.add("dca20897-5977-40ae-a28a-88a6acdee335");//冶三 fixedNodeIds.add("4912c751-0611-4f4b-afce-0f58629512b7");//精炼 fixedNodeIds.add("8eef471f-880c-4636-a428-620a4d2ccd5d");//矿业 fixedNodeIds.add("6d6a0412-7c6d-4654-9cb3-0079655e23e5");//新材料 LambdaQueryWrapper nodeLambdaQueryWrapper = new LambdaQueryWrapper<>(); nodeLambdaQueryWrapper.eq(ModelNode::getModelCode,modelCode); nodeLambdaQueryWrapper.in(ModelNode::getNodeId,fixedNodeIds); List nodeList=modelNodeMapper.selectList(nodeLambdaQueryWrapper); if (nodeList.isEmpty()){ throw new RuntimeException("未查询到6个厂区信息!"); } Map nodeMap=nodeList.stream().collect(Collectors.toMap(ModelNode::getNodeId,x->x)); List indexList=statisticMapper.getModelNodeIndexIdByFixedNodeIds(modelCode,fixedNodeIds); // 根据厂区分组 Map> nodeIndexMap = indexList.stream().collect( Collectors.groupingBy(ModelNodeIndexInfo::getNodeId)); //查询所有能源类型 final List eneryIdList = indexList.stream().map(ModelNodeIndexInfo::getEnergyId).distinct().collect(Collectors.toList()); final LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.in(CollectionUtils.isNotEmpty(eneryIdList),SysEnergy::getEnersno,eneryIdList); //index和能源 final Map indexIdEnergyIdMap = new HashMap<>(); indexList.forEach(n->{ final String indexId = n.getIndexId(); final String energyId = n.getEnergyId(); if(!indexIdEnergyIdMap.containsKey(indexId)){ indexIdEnergyIdMap.put(indexId,energyId); } }); List indexIds = indexList.stream().filter(l -> StringUtils.isNotEmpty(l.getIndexId())).map(ModelNodeIndexInfo::getIndexId).collect(Collectors.toList()); // Date queryTime = new Date(); Date queryTime = new Date(); 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)); final List sysEnergies = sysEnergyMapper.selectList(queryWrapper); //能源编号和能源折标系数 final Map energyCoefficientMap = sysEnergies.stream().collect(Collectors.toMap(SysEnergy::getEnersno,x->x)); //获取数据:nodeMap // nodeIndexMap.forEach((key, value) -> { nodeMap.forEach((key,nodeItem)->{ if (!nodeIndexMap.containsKey(key)){ FactoryEnergyConsumptionItemVo voData = new FactoryEnergyConsumptionItemVo(); voData.setNodeId(key); voData.setNodeName(nodeItem.getName()); BigDecimal kgceCount=BigDecimal.ZERO; BigDecimal kgceTonCount=BigDecimal.ZERO; voData.setKgceCount(kgceCount); voData.setKgceTonCount(kgceTonCount); voData.setEnergyItemList(new ArrayList<>()); energyDataList.add(voData); return; } //node和index关联集合 List value=nodeIndexMap.get(key); List itemVo=new ArrayList<>(); //根据能源类型分组 Map> sysEnergyIds = value.stream().collect( Collectors.groupingBy(ModelNodeIndexInfo::getEnergyId)); if (!sysEnergyIds.isEmpty()) { //遍历 for (Map.Entry> entry : sysEnergyIds.entrySet()) { String energyIndex = entry.getKey(); List energyValue = entry.getValue(); if (energyCoefficientMap.containsKey(energyIndex)) { SysEnergy sysEnergy = energyCoefficientMap.get(energyIndex); HomeEnergyStatisticsVO item = new HomeEnergyStatisticsVO(); item.setEnergyNo(sysEnergy.getEnersno()); item.setEnergyName(sysEnergy.getEnername()); item.setEnergyUnit(sysEnergy.getMuid()); item.setCoefficient(sysEnergy.getCoefficient().toString()); BigDecimal totalConsumption = BigDecimal.ZERO; BigDecimal totalCount = BigDecimal.ZERO; //合计值 for (ModelNodeIndexInfo valueItem:entry.getValue()){ List dataItems = dataItemMap.get(valueItem.getIndexId()); if (CollectionUtils.isNotEmpty(dataItems)) { BigDecimal sum = BigDecimal.valueOf(dataItems.stream() .mapToDouble(DataItem::getValue).sum()).setScale(CommonConst.DIGIT_2, RoundingMode.HALF_UP).multiply(sysEnergy.getCoefficient()); totalConsumption = totalConsumption.add(sum); totalCount = totalCount.add(BigDecimal.valueOf(dataItems.stream() .mapToDouble(DataItem::getValue).sum()).setScale(CommonConst.DIGIT_2, RoundingMode.HALF_UP)); } ; } item.setTonCount(totalConsumption.doubleValue()); item.setCount(totalCount.doubleValue()); itemVo.add(item); } } }; FactoryEnergyConsumptionItemVo voData = new FactoryEnergyConsumptionItemVo(); voData.setNodeId(key); voData.setNodeName(nodeItem.getName()); BigDecimal kgceCount=BigDecimal.ZERO; BigDecimal kgceTonCount=BigDecimal.ZERO; if (!itemVo.isEmpty()){ kgceCount=BigDecimal.valueOf(itemVo.stream().mapToDouble(HomeEnergyStatisticsVO::getCount).sum()).setScale(CommonConst.DIGIT_2, RoundingMode.HALF_UP); kgceTonCount=BigDecimal.valueOf(itemVo.stream().mapToDouble(HomeEnergyStatisticsVO::getTonCount).sum()).setScale(CommonConst.DIGIT_2, RoundingMode.HALF_UP); } voData.setKgceCount(kgceCount); voData.setKgceTonCount(kgceTonCount); voData.setEnergyItemList(itemVo); energyDataList.add(voData); }); return energyDataList; } 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(ModelNodeIndexInfo::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); } }