¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.zhitan.Itemizedenergyanalysis.service.impl; |
| | | |
| | | import cn.hutool.core.date.DateTime; |
| | | import cn.hutool.core.date.DateUtil; |
| | | import cn.hutool.core.util.ObjectUtil; |
| | | import com.zhitan.Itemizedenergyanalysis.domain.VO.ItemizedEnergyAnalysisItemVO; |
| | | import com.zhitan.Itemizedenergyanalysis.domain.VO.ItemizedEnergyAnalysisVO; |
| | | import com.zhitan.Itemizedenergyanalysis.dto.ItemizedEnergyAnalysisDTO; |
| | | import com.zhitan.Itemizedenergyanalysis.service.IItemizedEnergyAnalysisService; |
| | | import com.zhitan.common.constant.TimeTypeConst; |
| | | import com.zhitan.common.exception.ServiceException; |
| | | import com.zhitan.common.utils.DateTimeUtil; |
| | | import com.zhitan.common.utils.PropUtils; |
| | | import com.zhitan.common.utils.TypeTime; |
| | | import com.zhitan.dataitem.service.IDataItemService; |
| | | import com.zhitan.model.domain.vo.ModelNodeIndexInfo; |
| | | import com.zhitan.model.mapper.ModelNodeMapper; |
| | | import com.zhitan.realtimedata.domain.DataItem; |
| | | import lombok.AllArgsConstructor; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.math.BigDecimal; |
| | | import java.math.RoundingMode; |
| | | import java.util.*; |
| | | import java.util.stream.Collectors; |
| | | |
| | | |
| | | /** |
| | | * å项ç¨è½åæ |
| | | * |
| | | * @author sys |
| | | * @date 2025-03-25 |
| | | */ |
| | | @Service |
| | | @AllArgsConstructor |
| | | public class ItemizedEnergyAnalysisServiceImpl implements IItemizedEnergyAnalysisService { |
| | | |
| | | @Resource |
| | | private final ModelNodeMapper modelNodeMapper; |
| | | @Resource |
| | | private final IDataItemService dataItemService; |
| | | |
| | | /** |
| | | * @param dto 请æ±åæ° |
| | | * @return ç»æ |
| | | */ |
| | | @Override |
| | | public ItemizedEnergyAnalysisVO getItemizedEnergyAnalysisService(ItemizedEnergyAnalysisDTO dto) { |
| | | |
| | | String timeType = dto.getTimeType(); |
| | | String dataTime = dto.getDataTime(); |
| | | Date beginTime = DateTimeUtil.getTime(timeType, dataTime); |
| | | DateTime endTime = null; |
| | | |
| | | // è·åèç¹ä¿¡æ¯ |
| | | List<ModelNodeIndexInfo> nodeIndexInfo = modelNodeMapper.getModelNodeIndexIdByNodeId(dto.getNodeId(), dto.getEnergyType()); |
| | | List<String> indexList = nodeIndexInfo.stream().map(ModelNodeIndexInfo::getIndexId).collect(Collectors.toList()); |
| | | |
| | | if(ObjectUtil.isEmpty(indexList)){ |
| | | return new ItemizedEnergyAnalysisVO(); |
| | | } |
| | | |
| | | ModelNodeIndexInfo info = nodeIndexInfo.stream().findFirst().get(); |
| | | |
| | | List<TypeTime> dateTimeList; |
| | | // æ ¹æ®æ¶é´ç±»åè°æ´æ¶é´èå´ |
| | | switch (dto.getTimeType()) { |
| | | case TimeTypeConst.TIME_TYPE_DAY: |
| | | timeType = TimeTypeConst.TIME_TYPE_HOUR; |
| | | endTime = DateUtil.endOfDay(beginTime); |
| | | dateTimeList = DateTimeUtil.getDateTimeListSame(TimeTypeConst.TIME_TYPE_DAY, beginTime); |
| | | break; |
| | | case TimeTypeConst.TIME_TYPE_MONTH: |
| | | timeType = TimeTypeConst.TIME_TYPE_DAY; |
| | | endTime = DateUtil.endOfMonth(beginTime); |
| | | dateTimeList = DateTimeUtil.getDateTimeListSame(TimeTypeConst.TIME_TYPE_MONTH, beginTime); |
| | | break; |
| | | case TimeTypeConst.TIME_TYPE_YEAR: |
| | | timeType = TimeTypeConst.TIME_TYPE_MONTH; |
| | | endTime = DateUtil.endOfYear(beginTime); |
| | | dateTimeList = DateTimeUtil.getDateTimeListSame(TimeTypeConst.TIME_TYPE_YEAR, beginTime); |
| | | break; |
| | | default: |
| | | throw new ServiceException("æ¶é´æ ¼å¼é误"); |
| | | } |
| | | // è·åæ°æ®é¡¹å表 |
| | | List<DataItem> dataItemList = dataItemService.getDataItemTimeRangeInforByIndexIds(beginTime, endTime, timeType, indexList); |
| | | |
| | | // è·åæå¤§å¼ãæå°å¼ãå计ãå¹³åå¼ |
| | | ItemizedEnergyAnalysisVO vo = new ItemizedEnergyAnalysisVO(); |
| | | double sum = dataItemList.stream().mapToDouble(DataItem::getValue).sum(); |
| | | double max = dataItemList.stream().mapToDouble(DataItem::getValue).max().getAsDouble(); |
| | | double min = dataItemList.stream().mapToDouble(DataItem::getValue).min().getAsDouble(); |
| | | double avg = dataItemList.stream().mapToDouble(DataItem::getValue).average().getAsDouble(); |
| | | |
| | | vo.setTotal(BigDecimal.valueOf(sum).setScale(2, RoundingMode.HALF_UP).toString()); |
| | | vo.setMax(BigDecimal.valueOf(max).setScale(2, RoundingMode.HALF_UP).toString()); |
| | | vo.setMin(BigDecimal.valueOf(min).setScale(2, RoundingMode.HALF_UP).toString()); |
| | | vo.setAvg(BigDecimal.valueOf(avg).setScale(2, RoundingMode.HALF_UP).toString()); |
| | | if(ObjectUtil.isNotEmpty(info.getUnitId())){ |
| | | vo.setUnit(info.getUnitId()); |
| | | } |
| | | |
| | | List<ItemizedEnergyAnalysisItemVO> voList = new ArrayList<>(); |
| | | ItemizedEnergyAnalysisItemVO itemVO = new ItemizedEnergyAnalysisItemVO(); |
| | | itemVO.setNodeId(info.getNodeId()); |
| | | itemVO.setNodeName(info.getName()); |
| | | itemVO.setTotal(sum); |
| | | |
| | | Map<Date, List<DataItem>> dateListMap = dataItemList.stream().collect(Collectors.groupingBy(DataItem::getDataTime)); |
| | | List<DataItem> results = new ArrayList<>(); |
| | | dateListMap.forEach((key, value) -> { |
| | | DataItem dataItem = new DataItem(); |
| | | dataItem.setDataTime(key); |
| | | //ä¿çåä½å°æ° |
| | | double totalValue = value.stream().map(data -> BigDecimal.valueOf(data.getValue())) |
| | | .reduce(BigDecimal.ZERO, BigDecimal::add).setScale(4, RoundingMode.HALF_UP).doubleValue(); |
| | | dataItem.setValue(totalValue); |
| | | results.add(dataItem); |
| | | }); |
| | | //æ ¹æ®æ¶é´æåº |
| | | results.sort(Comparator.comparing(DataItem::getDataTime)); |
| | | for (int i = 0; i < dateTimeList.size(); i++) { |
| | | TypeTime typeTime = dateTimeList.get(i); |
| | | Optional<DataItem> dataItem = results.stream().filter(result -> result.getDataTime().equals(typeTime.getDateTime())).findFirst(); |
| | | if (dataItem.isPresent()) { |
| | | DataItem item = dataItem.get(); |
| | | PropUtils.setValue(itemVO, "value" + i, item.getValue()); |
| | | } else { |
| | | PropUtils.setValue(itemVO, "value" + i, null); |
| | | } |
| | | } |
| | | |
| | | voList.add(itemVO); |
| | | vo.setDataList(voList); |
| | | |
| | | return vo; |
| | | } |
| | | } |