zhitan-admin/src/main/java/com/zhitan/web/controller/realtimedata/RealtimeTrendController.java
@@ -5,9 +5,14 @@ import com.zhitan.common.core.domain.AjaxResult; import com.zhitan.common.enums.BusinessType; import com.zhitan.common.utils.poi.ExcelUtil; import com.zhitan.model.domain.EnergyIndex; import com.zhitan.realtimedata.domain.TagValue; import com.zhitan.realtimedata.domain.dto.EnergyIndexMonitorDTO; import com.zhitan.realtimedata.domain.vo.EquipmentMeasuringPointParameters; import com.zhitan.realtimedata.domain.vo.EquipmentPointParametersExcel; import com.zhitan.realtimedata.domain.vo.ExportrealtimeTrendVO; import com.zhitan.realtimedata.service.ISvgTrendService; import com.zhitan.realtimedata.service.RealtimeDatabaseService; import com.zhitan.realtimedata.service.RealtimeTrendService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -15,14 +20,18 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.stream.Collectors; /** * @Description 宿¶çæµæ§å¶ç±» * * @Author zhoubg * @date 2024-10-15 * 宿¶çæµæ§å¶ç±» **/ @RestController @RequestMapping("rtdb/realtimeTrend") @@ -31,11 +40,13 @@ @Autowired private RealtimeTrendService realtimeTrendService; @Resource private ISvgTrendService svgTrendService; @Resource private RealtimeDatabaseService realtimeDatabaseService; /** * è·å模åèç¹å ³èééææ * * @return */ @GetMapping("/list") @ApiOperation(value = "è·å模åèç¹å ³èééææ ") @@ -45,9 +56,6 @@ /** * è·åå岿¨¡åèç¹å ³èééææ æ°æ® * @param tagCode * @param dataTime * @return */ @Log(title = "è·åå岿¨¡åèç¹å ³èééææ æ°æ®", businessType = BusinessType.UPDATE) @GetMapping("/chartByDay") @@ -58,7 +66,6 @@ /** * 导åºå®æ¶çæµExcelä¿¡æ¯ * @return */ @Log(title = "导åºå®æ¶çæµExcelä¿¡æ¯", businessType = BusinessType.EXPORT) @PostMapping("/export") @@ -69,4 +76,50 @@ util.exportExcel(response,list, "宿¶çæµ"); } /** * è·å模åèç¹å ³èééææ */ @Log(title = "è·å模åèç¹å ³èééææ ", businessType = BusinessType.UPDATE) @GetMapping("/svgTrendView/energyIndex/list") @ApiOperation(value = "è·å模åèç¹å ³èééææ ") public AjaxResult getSvgTrendViewSettingIndex(EnergyIndex energyIndex) { try { List<EnergyIndex> infoList = svgTrendService.selectSvgList(energyIndex); if (infoList == null || infoList.isEmpty()){ return AjaxResult.success(Collections.emptyList()); } List<String> codeList = infoList.stream().map(EnergyIndex::getCode).collect(Collectors.toList()); List<TagValue> valList = realtimeDatabaseService.retrieve(codeList); if (valList == null || valList.isEmpty()) { return AjaxResult.success(Collections.emptyList()); } Map<String, List<TagValue>> tagValueMap = valList.stream().collect(Collectors.groupingBy(TagValue::getTagCode)); List<EquipmentMeasuringPointParameters> resultList = infoList.stream().map(index -> { EquipmentMeasuringPointParameters item = new EquipmentMeasuringPointParameters(); item.setCode(index.getCode()); item.setIndexName(index.getName()); item.setIndexUnit(index.getUnitId()); item.setMeteName(index.getMeterName()); item.setyValue("y0"); List<TagValue> tagValueList = tagValueMap.getOrDefault(index.getCode(), Collections.emptyList()); if (!tagValueList.isEmpty()){ Optional<Double> sumOptional = tagValueList.stream() .map(TagValue::getValue) .reduce(Double::sum); sumOptional.ifPresent(sum -> item.setValue(BigDecimal.valueOf(sum) .setScale(2, RoundingMode.HALF_UP).doubleValue())); } return item; }).collect(Collectors.toList()); return AjaxResult.success(resultList); } catch (Exception ex) { logger.error("è·åå ³èééææ åºéï¼", ex); return AjaxResult.error("è·åå ³èææ åºé!"); } } } zhitan-admin/src/main/java/com/zhitan/web/controller/statisticalAnalysis/StatisticalAnalysisController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,129 @@ package com.zhitan.web.controller.statisticalAnalysis; import com.zhitan.common.core.controller.BaseController; import com.zhitan.common.core.domain.AjaxResult; import com.zhitan.common.utils.poi.ExcelUtil; import com.zhitan.statisticalAnalysis.domain.dto.DataAnalysisMoMDTO; import com.zhitan.statisticalAnalysis.domain.vo.DataAnalysisMoMExcel; import com.zhitan.statisticalAnalysis.domain.vo.DataAnalysisMoMVO; import com.zhitan.statisticalAnalysis.domain.vo.DataAnalysisYoYExcel; import com.zhitan.statisticalAnalysis.domain.vo.DataAnalysisYoYVO; import com.zhitan.statisticalAnalysis.service.IStatisticalAnalysisService; import io.swagger.annotations.ApiOperation; import org.apache.commons.collections4.CollectionUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.ArrayList; import java.util.List; /** * ç»è®¡åæ æ§å¶å± */ @RestController @RequestMapping("/statisticalAnalysis") public class StatisticalAnalysisController extends BaseController { @Autowired private IStatisticalAnalysisService analysisService; @PostMapping("/getElectricDataComparisonYoY") @ApiOperation(value = "è·åçµè½èåæ¯æ°æ®", notes = "è·åçµè½èåæ¯æ°æ®") public AjaxResult listElectricDataComparisonYoY(@RequestBody @Validated DataAnalysisMoMDTO dto) { List<DataAnalysisYoYVO> yoyList = analysisService.listElectricDataComparisonYoY(dto); return AjaxResult.success(yoyList); } @PostMapping("/getElectricDataComparisonMoM") @ApiOperation(value = "è·åçµè½èç¯æ¯æ°æ®", notes = "è·åçµè½èç¯æ¯æ°æ®") public AjaxResult listElectricDataComparisonMoM(@RequestBody @Validated DataAnalysisMoMDTO dto) { List<DataAnalysisMoMVO> momList = analysisService.listElectricDataComparisonMoM(dto); return AjaxResult.success(momList); } @PostMapping("/getWaterDataComparisonYoY") @ApiOperation(value = "è·åæ°´è½èåæ¯æ°æ®", notes = "è·åæ°´è½èåæ¯æ°æ®") public AjaxResult listWaterDataComparisonYoY(@RequestBody @Validated DataAnalysisMoMDTO dto) { List<DataAnalysisYoYVO> yoyList = analysisService.listWaterDataComparisonYoY(dto); return AjaxResult.success(yoyList); } @PostMapping("/getWaterDataComparisonMoM") @ApiOperation(value = "è·åæ°´è½èç¯æ¯æ°æ®", notes = "è·åæ°´è½èç¯æ¯æ°æ®") public AjaxResult listWaterDataComparisonMoM(@RequestBody @Validated DataAnalysisMoMDTO dto) { List<DataAnalysisMoMVO> momList = analysisService.listWaterDataComparisonMoM(dto); return AjaxResult.success(momList); } @PostMapping("/exportElectricYoY") @ApiOperation(value = "导åºçµè½èåæ¯æ°æ®", notes = "导åºçµè½èåæ¯æ°æ®") public AjaxResult exportElectricComparisonYoY(@RequestBody @Validated DataAnalysisMoMDTO dto) { List<DataAnalysisYoYExcel> yoYExcelsList = new ArrayList<>(); List<DataAnalysisYoYVO> yoYList = analysisService.listElectricDataComparisonYoY(dto); if (CollectionUtils.isNotEmpty(yoYList)) { for (DataAnalysisYoYVO vo : yoYList) { DataAnalysisYoYExcel excel = new DataAnalysisYoYExcel(); BeanUtils.copyProperties(vo, excel); yoYExcelsList.add(excel); } } ExcelUtil<DataAnalysisYoYExcel> util = new ExcelUtil<>(DataAnalysisYoYExcel.class); return util.exportExcel(yoYExcelsList, "çµç»¼åè½èåæ¯ä¿¡æ¯"); } // @PostMapping("/exportElectricMoM") // @ApiOperation(value = "导åºçµè½èç¯æ¯æ°æ®", notes = "导åºçµè½èç¯æ¯æ°æ®") // public AjaxResult exportElectricComparisonMoM(@RequestBody @Validated DataAnalysisMoMDTO dto) { // List<DataAnalysisMoMExcel> moMExcelsList = new ArrayList<>(); // List<DataAnalysisMoMVO> moMList = analysisService.listElectricDataComparisonMoM(dto); // if (CollectionUtils.isNotEmpty(moMList)) { // for (DataAnalysisMoMVO vo : moMList) { // DataAnalysisMoMExcel excel = new DataAnalysisMoMExcel(); // BeanUtils.copyProperties(vo, excel); // moMExcelsList.add(excel); // } // } // ExcelUtil<DataAnalysisMoMExcel> util = new ExcelUtil<>(DataAnalysisMoMExcel.class); // return util.exportRealTimeDataExcel(moMExcelsList, "çµç»¼åè½èç¯æ¯ä¿¡æ¯"); // } @PostMapping("/exportWaterYoY") @ApiOperation(value = "å¯¼åºæ°´èåæ¯æ°æ®", notes = "å¯¼åºæ°´èåæ¯æ°æ®") public AjaxResult exportWaterComparisonYoY(@RequestBody @Validated DataAnalysisMoMDTO dto) { List<DataAnalysisYoYExcel> yoYExcelsList = new ArrayList<>(); List<DataAnalysisYoYVO> yoYList = analysisService.listWaterDataComparisonYoY(dto); if (CollectionUtils.isNotEmpty(yoYList)) { for (DataAnalysisYoYVO vo : yoYList) { DataAnalysisYoYExcel excel = new DataAnalysisYoYExcel(); BeanUtils.copyProperties(vo, excel); yoYExcelsList.add(excel); } } ExcelUtil<DataAnalysisYoYExcel> util = new ExcelUtil<>(DataAnalysisYoYExcel.class); return util.exportExcel(yoYExcelsList, "水综åè½èèåæ¯ä¿¡æ¯"); } @PostMapping("/exportWaterMoM") @ApiOperation(value = "å¯¼åºæ°´èç¯æ¯æ°æ®", notes = "å¯¼åºæ°´èç¯æ¯æ°æ®") public AjaxResult exportWaterComparisonMoM(@RequestBody @Validated DataAnalysisMoMDTO dto) { List<DataAnalysisMoMExcel> moMExcelsList = new ArrayList<>(); List<DataAnalysisMoMVO> moMList = analysisService.listWaterDataComparisonMoM(dto); if (CollectionUtils.isNotEmpty(moMList)) { for (DataAnalysisMoMVO vo : moMList) { DataAnalysisMoMExcel excel = new DataAnalysisMoMExcel(); BeanUtils.copyProperties(vo, excel); moMExcelsList.add(excel); } } ExcelUtil<DataAnalysisMoMExcel> util = new ExcelUtil<>(DataAnalysisMoMExcel.class); return util.exportExcel(moMExcelsList, "水综åè½èèç¯æ¯ä¿¡æ¯"); } } zhitan-common/src/main/java/com/zhitan/common/constant/TimeTypeConst.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,25 @@ package com.zhitan.common.constant; /** * @Description: å¨æç±»å * @author: yxw * @date: 2022å¹´03æ17æ¥ 12:33 */ public class TimeTypeConst { /** * å¨æç±»å - å°æ¶ */ public static final String TIME_TYPE_HOUR="HOUR"; /** * å¨æç±»å - æ¥ */ public static final String TIME_TYPE_DAY="DAY"; /** * å¨æç±»å - æ */ public static final String TIME_TYPE_MONTH="MONTH"; /** * å¨æç±»å - å¹´ */ public static final String TIME_TYPE_YEAR="YEAR"; } zhitan-system/src/main/java/com/zhitan/dataitem/mapper/DataItemMapper.java
@@ -110,4 +110,16 @@ */ List<CarbonEmission> getDownCarbonEmission(@Param("beginTime") Date beginTime, @Param("endTime") Date endTime, @Param("timeType") String timeType, @Param("indexId") String indexId); /** * æ ¹æ®indexId䏿¶é´èå´æ¥è¯¢å°æ¶çdataitemä¿¡æ¯ * * @param beginTime å¼å§æ¶é´ * @param endTime æªæ¢æ¶é´ * @param timeType æ¶é´ç±»å * @param indexIds ç¹ä½éå * @return */ List<DataItem> getDataItemHourInforByIndexIds(@Param("beginTime") Date beginTime, @Param("endTime") Date endTime, @Param("timeType") String timeType, @Param("indexIds") List<String> indexIds); } zhitan-system/src/main/java/com/zhitan/dataitem/service/IDataItemService.java
@@ -77,4 +77,15 @@ * @return */ BigDecimal getDataItemValueByIndexIds(String timeCode, List<String> indexIds); /** * æ ¹æ®indexId䏿¶é´èå´æ¥è¯¢å°æ¶çdataitemä¿¡æ¯ * * @param beginTime å¼å§æ¶é´ * @param endTime æªæ¢æ¶é´ * @param timeType æ¶é´ç±»å * @param indexIds ç¹ä½éå * @return */ List<DataItem> getDataItemHourInforByIndexIds(Date beginTime, Date endTime, String timeType, List<String> indexIds); } zhitan-system/src/main/java/com/zhitan/dataitem/service/impl/DataItemServiceImpl.java
@@ -103,4 +103,18 @@ public BigDecimal getDataItemValueByIndexIds(String timeCode, List<String> indexIds) { return dataItemMapper.getDataItemValueByIndexIds(timeCode, indexIds); } /** * æ ¹æ®indexId䏿¶é´èå´æ¥è¯¢å°æ¶çdataitemä¿¡æ¯ * * @param beginTime å¼å§æ¶é´ * @param endTime æªæ¢æ¶é´ * @param timeType æ¶é´ç±»å * @param indexIds ç¹ä½éå * @return */ @Override public List<DataItem> getDataItemHourInforByIndexIds(Date beginTime, Date endTime, String timeType, List<String> indexIds) { return dataItemMapper.getDataItemHourInforByIndexIds(beginTime, endTime, timeType, indexIds); } } zhitan-system/src/main/java/com/zhitan/realtimedata/domain/vo/EquipmentMeasuringPointParameters.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,30 @@ package com.zhitan.realtimedata.domain.vo; import lombok.Data; /** * 设å¤çæµåæ°å表对象 */ @Data public class EquipmentMeasuringPointParameters { private String code; private String indexName; private String indexUnit; private Double value; private String yValue; private String meteName; public String getyValue() { return yValue; } public void setyValue(String yValue) { this.yValue = yValue; } } zhitan-system/src/main/java/com/zhitan/realtimedata/mapper/SvgTrendMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,16 @@ package com.zhitan.realtimedata.mapper; import com.zhitan.model.domain.EnergyIndex; import java.util.List; public interface SvgTrendMapper { /** * 宿¶æ£æµ åè½ çå¤ sheet页 å±ç¤º ç»æå¾ æµç¹ æ¥è¦ä¿¡æ¯ * * @param energyIndex * @return */ List<EnergyIndex> selectSvgTrendList(EnergyIndex energyIndex); } zhitan-system/src/main/java/com/zhitan/realtimedata/service/ISvgTrendService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,15 @@ package com.zhitan.realtimedata.service; import com.zhitan.model.domain.EnergyIndex; import java.util.List; public interface ISvgTrendService { /** * 宿¶æ£æµ åè½ çå¤ sheet页 å±ç¤ºè¶å¿å¾ * @param energyIndex * @return */ List<EnergyIndex> selectSvgList(EnergyIndex energyIndex); } zhitan-system/src/main/java/com/zhitan/realtimedata/service/impl/SvgTrendServicelmpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,26 @@ package com.zhitan.realtimedata.service.impl; import com.zhitan.model.domain.EnergyIndex; import com.zhitan.realtimedata.mapper.SvgTrendMapper; import com.zhitan.realtimedata.service.ISvgTrendService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; @Service public class SvgTrendServicelmpl implements ISvgTrendService { @Autowired private SvgTrendMapper svgTrendMapper; /** * æ¥è¯¢ææ ä¿¡æ¯ * * @param energyIndex ææ ä¿¡æ¯ID * @return ææ ä¿¡æ¯ */ @Override public List<EnergyIndex> selectSvgList(EnergyIndex energyIndex) { return svgTrendMapper.selectSvgTrendList(energyIndex); } } zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/domain/dto/DataAnalysisMoMDTO.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,48 @@ package com.zhitan.statisticalAnalysis.domain.dto; import com.fasterxml.jackson.annotation.JsonFormat; import com.zhitan.common.annotation.Excel; import lombok.Data; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import java.util.Date; /** * æ°æ®åæç¯æ¯ 请æ±åæ° * * @Author: Zhujw * @Date: 2023/3/3 */ @Data public class DataAnalysisMoMDTO { /** * ç»è®¡å¼å§æ¶é´ */ @NotNull(message = "è¯·ç»´æ¤æ¥è¯¢æ¶é´") @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss") @Excel(name = "æ¥è¦å¼å§æ¶é´", dateFormat = "yyyy-MM-dd HH:mm:ss") private Date beginTime; /** * ç»è®¡å¼å§æ¶é´ */ @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss") @Excel(name = "æ¥è¦å¼å§æ¶é´", dateFormat = "yyyy-MM-dd HH:mm:ss") @NotNull(message = "è¯·ç»´æ¤æ¥è¯¢æ¶é´") private Date endTime; /** * æ¶é´ç±»å */ @NotBlank(message = "æªæ¾å°æ¶é´ç±»å") private String timeType; /** * 模åèç¹id */ @NotBlank(message = "æªæ¾å°æ¨¡åèç¹ä¿¡æ¯") private String nodeId; } zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/domain/vo/DataAnalysisMoMExcel.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,47 @@ package com.zhitan.statisticalAnalysis.domain.vo; import com.zhitan.common.annotation.Excel; import lombok.Data; import java.math.BigDecimal; /** * æ°æ®åæç¯æ¯ 导åºExcel * * @Author: Zhujw * @Date: 2023/3/3 */ @Data public class DataAnalysisMoMExcel { /** * ç¨è½åå åç§° */ @Excel(name = "ç¨è½åå ") private String energyUnitName; /** * æ¬æå¼ */ @Excel(name = "æ¬æå¼") private BigDecimal currentValue; /** * åæå¼ */ @Excel(name = "åæå¼") private BigDecimal oldValue; /** * åæ¯å¼ */ @Excel(name = "忝å¼") private BigDecimal ratio; /** * åä½ */ @Excel(name = "åä½") private String unit; } zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/domain/vo/DataAnalysisMoMVO.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,42 @@ package com.zhitan.statisticalAnalysis.domain.vo; import lombok.Data; import java.math.BigDecimal; /** * æ°æ®åæç¯æ¯ è¿åvo * * @Author: Zhujw * @Date: 2023/3/3 */ @Data public class DataAnalysisMoMVO { /** * åä½ */ private String unit; /** * ç¨è½åå åç§° */ private String energyUnitName; /** * æ¬æå¼ */ private BigDecimal currentValue; /** * åæå¼ */ private BigDecimal oldValue; /** * åæ¯å¼ */ private BigDecimal ratio; } zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/domain/vo/DataAnalysisYoYExcel.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,47 @@ package com.zhitan.statisticalAnalysis.domain.vo; import com.zhitan.common.annotation.Excel; import lombok.Data; import java.math.BigDecimal; /** * æ°æ®åæåæ¯ å¯¼åºExcel * * @Author: Zhujw * @Date: 2023/3/3 */ @Data public class DataAnalysisYoYExcel { /** * ç¨è½åå åç§° */ @Excel(name = "ç¨è½åå åç§°") private String energyUnitName; /** * æ¬æå¼ */ @Excel(name = "æ¬æå¼") private BigDecimal currentValue; /** * åæå¼ */ @Excel(name = "åæå¼") private BigDecimal oldValue; /** * åæ¯å¼ */ @Excel(name = "忝å¼") private BigDecimal ratio; /** * åä½ */ @Excel(name = "åä½") private String unit; } zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/domain/vo/DataAnalysisYoYVO.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,42 @@ package com.zhitan.statisticalAnalysis.domain.vo; import lombok.Data; import java.math.BigDecimal; /** * æ°æ®åæåæ¯ è¿åvo * * @Author: Zhujw * @Date: 2023/3/3 */ @Data public class DataAnalysisYoYVO { /** * åä½ */ private String unit; /** * ç¨è½åå åç§° */ private String energyUnitName; /** * æ¬æå¼ */ private BigDecimal currentValue; /** * åæå¼ */ private BigDecimal oldValue; /** * åæ¯å¼ */ private BigDecimal ratio; } zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/service/IStatisticalAnalysisService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,36 @@ package com.zhitan.statisticalAnalysis.service; import com.zhitan.statisticalAnalysis.domain.dto.DataAnalysisMoMDTO; import com.zhitan.statisticalAnalysis.domain.vo.DataAnalysisMoMVO; import com.zhitan.statisticalAnalysis.domain.vo.DataAnalysisYoYVO; import java.util.List; /** * ç»è®¡åæ æ¥å£å± * * @Author: Zhujw * @Date: 2023/3/1 */ public interface IStatisticalAnalysisService { /** * è·åçµè½èåæ¯æ°æ® */ List<DataAnalysisYoYVO> listElectricDataComparisonYoY(DataAnalysisMoMDTO dto); /** * è·åçµè½èç¯æ¯æ°æ® */ List<DataAnalysisMoMVO> listElectricDataComparisonMoM(DataAnalysisMoMDTO dto); /** * è·åè½èåæ¯æ°æ® */ List<DataAnalysisYoYVO> listWaterDataComparisonYoY(DataAnalysisMoMDTO dto); /** * è·åè½èç¯æ¯æ°æ® */ List<DataAnalysisMoMVO> listWaterDataComparisonMoM(DataAnalysisMoMDTO dto); } zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/service/impl/StatisticalAnalysisServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,293 @@ package com.zhitan.statisticalAnalysis.service.impl; import cn.hutool.core.date.DateField; import cn.hutool.core.date.DateUtil; import com.zhitan.common.constant.CommonConst; import com.zhitan.common.constant.TimeTypeConst; import com.zhitan.common.enums.TimeType; import com.zhitan.dataitem.service.IDataItemService; import com.zhitan.model.domain.vo.ModelNodeIndexInfor; import com.zhitan.model.service.IModelNodeService; import com.zhitan.realtimedata.domain.DataItem; import com.zhitan.statisticalAnalysis.domain.dto.DataAnalysisMoMDTO; import com.zhitan.statisticalAnalysis.domain.vo.DataAnalysisMoMVO; import com.zhitan.statisticalAnalysis.domain.vo.DataAnalysisYoYVO; import com.zhitan.statisticalAnalysis.service.IStatisticalAnalysisService; import lombok.AllArgsConstructor; import org.apache.commons.collections4.CollectionUtils; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.*; import java.util.stream.Collectors; /** * ç»è®¡åæ æ¥å£å±å®ç°å± */ @Service @AllArgsConstructor public class StatisticalAnalysisServiceImpl implements IStatisticalAnalysisService { private final IDataItemService dataItemService; private final IModelNodeService modelNodeService; /** * è·åçµè½èåæ¯æ°æ® */ @Override public List<DataAnalysisYoYVO> listElectricDataComparisonYoY(DataAnalysisMoMDTO dto) { List<DataAnalysisYoYVO> yoyList = new ArrayList<>(); // æ¥è¯¢ç¹ä½ä¸ç¨è½åå ä¿¡æ¯ List<ModelNodeIndexInfor> nodeInforList = listModelNodeIndexIdRelationInfor(dto.getNodeId()); if (CollectionUtils.isEmpty(nodeInforList)) { return yoyList; } List<String> indexIds = nodeInforList.stream().map(ModelNodeIndexInfor::getIndexId).collect(Collectors.toList()); // æç §ç¹ä½è¿è¡åç» Map<String, List<ModelNodeIndexInfor>> nodeIndexMap = nodeInforList.stream().collect( Collectors.groupingBy(ModelNodeIndexInfor::getNodeId)); // è·åæ¥è¯¢æ¶é´ Date beginTime = dto.getBeginTime(); Date endTime = dto.getEndTime(); // 忝æ¶é´ Date lastTime = DateUtil.offset(beginTime, DateField.YEAR, CommonConst.DIGIT_MINUS_1); Date lastEndTime = DateUtil.offset(endTime, DateField.YEAR, CommonConst.DIGIT_MINUS_1); // æ¥è¯¢å¯¹åºindexIdsï¼æ¾å°å¯¹åºdataItemä¿¡æ¯ List<DataItem> dataItemList = dataItemService.getDataItemHourInforByIndexIds(beginTime, endTime, TimeType.HOUR.name(), indexIds); List<DataItem> lastDataItemList = dataItemService.getDataItemHourInforByIndexIds(lastTime, lastEndTime, TimeType.HOUR.name(), indexIds); // åç BigDecimal multiple = BigDecimal.valueOf(CommonConst.DIGIT_100); nodeIndexMap.forEach((key, value) -> { DataAnalysisYoYVO yoyVO = new DataAnalysisYoYVO(); Optional<ModelNodeIndexInfor> first = value.stream().findFirst(); first.ifPresent(modelNodeIndexInfor -> yoyVO.setEnergyUnitName(modelNodeIndexInfor.getName())); // èµå¼åä½ yoyVO.setUnit("kWh"); // æ¾åºindexIds List<String> indexIdList = value.stream().map(ModelNodeIndexInfor::getIndexId).collect(Collectors.toList()); // æ±å BigDecimal sum = BigDecimal.valueOf(dataItemList.stream().filter(li -> indexIdList.contains(li.getIndexId())) .mapToDouble(DataItem::getValue).sum()).setScale(CommonConst.DIGIT_2, RoundingMode.HALF_UP); BigDecimal lastSum = BigDecimal.valueOf(lastDataItemList.stream().filter(li -> indexIdList.contains(li.getIndexId())) .mapToDouble(DataItem::getValue).sum()).setScale(CommonConst.DIGIT_2, RoundingMode.HALF_UP); yoyVO.setCurrentValue(sum); yoyVO.setOldValue(lastSum); // åæ¯å¼ BigDecimal ratio = BigDecimal.ZERO; if (lastSum.compareTo(BigDecimal.ZERO) != 0) { ratio = sum.subtract(lastSum).divide(lastSum, CommonConst.DIGIT_2, RoundingMode.HALF_UP).multiply(multiple); } yoyVO.setRatio(ratio); yoyList.add(yoyVO); }); return yoyList; } /** * è·åçµè½èç¯æ¯æ°æ® */ @Override public List<DataAnalysisMoMVO> listElectricDataComparisonMoM(DataAnalysisMoMDTO dto) { List<DataAnalysisMoMVO> momList = new ArrayList<>(); // æ ¹æ®idæ¥è¯¢ç¹ä½ä¿¡æ¯ List<ModelNodeIndexInfor> nodeIndexInforList = listModelNodeIndexIdRelationInfor(dto.getNodeId()); if (CollectionUtils.isEmpty(nodeIndexInforList)) { return momList; } List<String> indexIds = nodeIndexInforList.stream().map(ModelNodeIndexInfor::getIndexId).collect(Collectors.toList()); Date beginTime = dto.getBeginTime(); Date endTime = dto.getEndTime(); Date lastTime; Date lastEndTime; String queryTimeType = dto.getTimeType(); // å°æ¶ if (TimeTypeConst.TIME_TYPE_HOUR.equals(queryTimeType)) { lastTime = DateUtil.offsetHour(beginTime, CommonConst.DIGIT_MINUS_1); lastEndTime = DateUtil.offsetHour(endTime, CommonConst.DIGIT_MINUS_1); // 天 } else if (TimeTypeConst.TIME_TYPE_DAY.equals(queryTimeType)) { lastTime = DateUtil.offsetDay(beginTime, CommonConst.DIGIT_MINUS_1); lastEndTime = DateUtil.offsetDay(endTime, CommonConst.DIGIT_MINUS_1); // æ } else if (TimeTypeConst.TIME_TYPE_MONTH.equals(queryTimeType)) { lastTime = DateUtil.offsetMonth(beginTime, CommonConst.DIGIT_MINUS_1); lastEndTime = DateUtil.offsetMonth(endTime, CommonConst.DIGIT_MINUS_1); // å¹´ } else { lastTime = DateUtil.offset(beginTime, DateField.YEAR, CommonConst.DIGIT_MINUS_1); lastEndTime = DateUtil.offset(endTime, DateField.YEAR, CommonConst.DIGIT_MINUS_1); } // æç §ç¹ä½è¿è¡åç» Map<String, List<ModelNodeIndexInfor>> nodeIndexMap = nodeIndexInforList.stream().collect( Collectors.groupingBy(ModelNodeIndexInfor::getNodeId)); // æ ¹æ®indexIdæ¥è¯¢dataItem List<DataItem> dataItemList = dataItemService.getDataItemHourInforByIndexIds(beginTime, endTime, TimeType.HOUR.name(), indexIds); List<DataItem> lastDataItemList = dataItemService.getDataItemHourInforByIndexIds(lastTime, lastEndTime, TimeType.HOUR.name(), indexIds); // åç BigDecimal multiple = BigDecimal.valueOf(CommonConst.DIGIT_100); nodeIndexMap.forEach((key, value) -> { DataAnalysisMoMVO momVO = new DataAnalysisMoMVO(); Optional<ModelNodeIndexInfor> first = value.stream().findFirst(); first.ifPresent(modelNodeIndexInfor -> momVO.setEnergyUnitName(modelNodeIndexInfor.getName())); // èµå¼åä½ momVO.setUnit("kWh"); // æ¾åºindexIds List<String> indexIdList = value.stream().map(ModelNodeIndexInfor::getIndexId).collect(Collectors.toList()); // æ±å BigDecimal sum = BigDecimal.valueOf(dataItemList.stream().filter(li -> indexIdList.contains(li.getIndexId())) .mapToDouble(DataItem::getValue).sum()).setScale(CommonConst.DIGIT_2, RoundingMode.HALF_UP); BigDecimal lastSum = BigDecimal.valueOf(lastDataItemList.stream().filter(li -> indexIdList.contains(li.getIndexId())) .mapToDouble(DataItem::getValue).sum()).setScale(CommonConst.DIGIT_2, RoundingMode.HALF_UP); momVO.setCurrentValue(sum); momVO.setOldValue(lastSum); // åæ¯å¼ BigDecimal ratio = BigDecimal.ZERO; if (lastSum.compareTo(BigDecimal.ZERO) != 0) { ratio = sum.subtract(lastSum).divide(lastSum, CommonConst.DIGIT_2, RoundingMode.HALF_UP).multiply(multiple); } momVO.setRatio(ratio); momList.add(momVO); }); return momList; } /** * è·åè½èåæ¯æ°æ® */ @Override public List<DataAnalysisYoYVO> listWaterDataComparisonYoY(DataAnalysisMoMDTO dto) { List<DataAnalysisYoYVO> yoyList = new ArrayList<>(); // æ¥è¯¢ç¹ä½ä¸ç¨è½åå ä¿¡æ¯ List<ModelNodeIndexInfor> nodeInforList = listModelNodeIndexIdRelationInfor(dto.getNodeId()); if (CollectionUtils.isEmpty(nodeInforList)) { return yoyList; } List<String> indexIds = nodeInforList.stream().map(ModelNodeIndexInfor::getIndexId).collect(Collectors.toList()); // æç §ç¹ä½è¿è¡åç» Map<String, List<ModelNodeIndexInfor>> nodeIndexMap = nodeInforList.stream().collect( Collectors.groupingBy(ModelNodeIndexInfor::getNodeId)); // æ¶é´ç±»å // è·åæ¥è¯¢æ¶é´ Date beginTime = dto.getBeginTime(); Date endTime = dto.getEndTime(); // 忝æ¶é´ Date lastTime = DateUtil.offset(beginTime, DateField.YEAR, CommonConst.DIGIT_MINUS_1); Date lastEndTime = DateUtil.offset(endTime, DateField.YEAR, CommonConst.DIGIT_MINUS_1); // æ¥è¯¢å¯¹åºindexIdsï¼æ¾å°å¯¹åºdataItemä¿¡æ¯ List<DataItem> dataItemList = dataItemService.getDataItemHourInforByIndexIds(beginTime, endTime, TimeType.HOUR.name(), indexIds); List<DataItem> lastDataItemList = dataItemService.getDataItemHourInforByIndexIds(lastTime, lastEndTime, TimeType.HOUR.name(), indexIds); // åç BigDecimal multiple = BigDecimal.valueOf(CommonConst.DIGIT_100); nodeIndexMap.forEach((key, value) -> { DataAnalysisYoYVO yoyVO = new DataAnalysisYoYVO(); Optional<ModelNodeIndexInfor> first = value.stream().findFirst(); first.ifPresent(modelNodeIndexInfor -> yoyVO.setEnergyUnitName(modelNodeIndexInfor.getName())); // èµå¼åä½ yoyVO.setUnit("m³"); // æ¾åºindexIds List<String> indexIdList = value.stream().map(ModelNodeIndexInfor::getIndexId).collect(Collectors.toList()); // æ±å BigDecimal sum = BigDecimal.valueOf(dataItemList.stream().filter(li -> indexIdList.contains(li.getIndexId())) .mapToDouble(DataItem::getValue).sum()).setScale(CommonConst.DIGIT_2, RoundingMode.HALF_UP); BigDecimal lastSum = BigDecimal.valueOf(lastDataItemList.stream().filter(li -> indexIdList.contains(li.getIndexId())) .mapToDouble(DataItem::getValue).sum()).setScale(CommonConst.DIGIT_2, RoundingMode.HALF_UP); yoyVO.setCurrentValue(sum); yoyVO.setOldValue(lastSum); // åæ¯å¼ BigDecimal ratio = BigDecimal.ZERO; if (lastSum.compareTo(BigDecimal.ZERO) != 0) { ratio = sum.subtract(lastSum).divide(lastSum, CommonConst.DIGIT_2, RoundingMode.HALF_UP).multiply(multiple); } yoyVO.setRatio(ratio); yoyList.add(yoyVO); }); return yoyList; } /** * è·åè½èç¯æ¯æ°æ® */ @Override public List<DataAnalysisMoMVO> listWaterDataComparisonMoM(DataAnalysisMoMDTO dto) { List<DataAnalysisMoMVO> momList = new ArrayList<>(); // æ ¹æ®idæ¥è¯¢ç¹ä½ä¿¡æ¯ List<ModelNodeIndexInfor> nodeIndexInforList = listModelNodeIndexIdRelationInfor(dto.getNodeId()); if (CollectionUtils.isEmpty(nodeIndexInforList)) { return momList; } List<String> indexIds = nodeIndexInforList.stream().map(ModelNodeIndexInfor::getIndexId).collect(Collectors.toList()); Date beginTime = dto.getBeginTime(); Date endTime = dto.getEndTime(); Date lastTime; Date lastEndTime; String queryTimeType = dto.getTimeType(); // å°æ¶ if (TimeTypeConst.TIME_TYPE_HOUR.equals(queryTimeType)) { lastTime = DateUtil.offsetHour(beginTime, CommonConst.DIGIT_MINUS_1); lastEndTime = DateUtil.offsetHour(endTime, CommonConst.DIGIT_MINUS_1); // 天 } else if (TimeTypeConst.TIME_TYPE_DAY.equals(queryTimeType)) { lastTime = DateUtil.offsetDay(beginTime, CommonConst.DIGIT_MINUS_1); lastEndTime = DateUtil.offsetDay(endTime, CommonConst.DIGIT_MINUS_1); // æ } else if (TimeTypeConst.TIME_TYPE_MONTH.equals(queryTimeType)) { lastTime = DateUtil.offsetMonth(beginTime, CommonConst.DIGIT_MINUS_1); lastEndTime = DateUtil.offsetMonth(endTime, CommonConst.DIGIT_MINUS_1); // å¹´ } else { lastTime = DateUtil.offset(beginTime, DateField.YEAR, CommonConst.DIGIT_MINUS_1); lastEndTime = DateUtil.offset(endTime, DateField.YEAR, CommonConst.DIGIT_MINUS_1); } // æç §ç¹ä½è¿è¡åç» Map<String, List<ModelNodeIndexInfor>> nodeIndexMap = nodeIndexInforList.stream().collect( Collectors.groupingBy(ModelNodeIndexInfor::getNodeId)); // æ¥è¯¢å¯¹åºindexIdsï¼æ¾å°å¯¹åºdataItemä¿¡æ¯ List<DataItem> dataItemList = dataItemService.getDataItemHourInforByIndexIds(beginTime, endTime, TimeType.HOUR.name(), indexIds); List<DataItem> lastDataItemList = dataItemService.getDataItemHourInforByIndexIds(lastTime, lastEndTime, TimeType.HOUR.name(), indexIds); // åç BigDecimal multiple = BigDecimal.valueOf(CommonConst.DIGIT_100); nodeIndexMap.forEach((key, value) -> { DataAnalysisMoMVO momVO = new DataAnalysisMoMVO(); Optional<ModelNodeIndexInfor> first = value.stream().findFirst(); first.ifPresent(modelNodeIndexInfor -> momVO.setEnergyUnitName(modelNodeIndexInfor.getName())); // èµå¼åä½ momVO.setUnit("m³"); // æ¾åºindexIds List<String> indexIdList = value.stream().map(ModelNodeIndexInfor::getIndexId).collect(Collectors.toList()); // æ±å BigDecimal sum = BigDecimal.valueOf(dataItemList.stream().filter(li -> indexIdList.contains(li.getIndexId())) .mapToDouble(DataItem::getValue).sum()).setScale(CommonConst.DIGIT_2, RoundingMode.HALF_UP); BigDecimal lastSum = BigDecimal.valueOf(lastDataItemList.stream().filter(li -> indexIdList.contains(li.getIndexId())) .mapToDouble(DataItem::getValue).sum()).setScale(CommonConst.DIGIT_2, RoundingMode.HALF_UP); momVO.setCurrentValue(sum); momVO.setOldValue(lastSum); // åæ¯å¼ BigDecimal ratio = BigDecimal.ZERO; if (lastSum.compareTo(BigDecimal.ZERO) != 0) { ratio = sum.subtract(lastSum).divide(lastSum, CommonConst.DIGIT_2, RoundingMode.HALF_UP).multiply(multiple); } momVO.setRatio(ratio); momList.add(momVO); }); return momList; } /** * æ¥è¯¢ç¹ä½ä¸ç¨è½åå ä¿¡æ¯ */ private List<ModelNodeIndexInfor> listModelNodeIndexIdRelationInfor(String nodeId) { List<ModelNodeIndexInfor> nodeInforList = modelNodeService.listModelNodeIndexIdRelationInforByParentId(nodeId); // 妿æ¯ç©ºåå¨ä¸¤ç§æ åµï¼1ï¼idæé®é¢ï¼2ï¼æåºå± if (CollectionUtils.isEmpty(nodeInforList)) { List<ModelNodeIndexInfor> inforList = modelNodeService.getModelNodeIndexIdRelationInforByNodeId(nodeId); if (CollectionUtils.isNotEmpty(inforList)) { nodeInforList.addAll(inforList); } } return nodeInforList; } } zhitan-system/src/main/resources/mapper/dataitem/DataItemMapper.xml
@@ -199,4 +199,20 @@ AND di.data_time BETWEEN #{beginTime} AND #{endTime} AND di.time_type = #{timeType} </select> <select id="getDataItemHourInforByIndexIds" resultType="com.zhitan.realtimedata.domain.DataItem"> SELECT index_id indexId, data_time dataTime, "value" FROM "data_item" WHERE index_id IN <foreach collection="indexIds" item="indexId" open="(" separator="," close=")"> #{indexId} </foreach> AND ( begin_time BETWEEN #{beginTime} AND #{endTime} ) AND time_type = #{timeType} </select> </mapper> zhitan-system/src/main/resources/mapper/realtimedata/SvgTrendMapper.xml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,37 @@ <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.zhitan.realtimedata.mapper.SvgTrendMapper"> <resultMap type="com.zhitan.model.domain.EnergyIndex" id="EnergyIndexResult"> <result property="indexId" column="index_id"/> <result property="name" column="name"/> <result property="code" column="code"/> <result property="indexType" column="index_type"/> <result property="indexCategory" column="index_category"/> <result property="remark" column="remark"/> <result property="unitId" column="unit_id"/> <result property="meterId" column="meter_id"/> <result property="meterName" column="meter_name"/> </resultMap> <select id="selectSvgTrendList" parameterType="com.zhitan.model.domain.EnergyIndex" resultMap="EnergyIndexResult"> select ei.index_id, name, ei.code, index_type, ei.remark, ei.unit_id, index_category,meter_name from energy_index ei, sys_svg_info svg, meter_implement as me <where> ei.code = svg.tag and ei.meter_id = me.id <if test="name != null and name != ''">and name like concat('%', #{name}, '%')</if> <if test="code != null and code != ''">and ei.code like concat('%', #{code}, '%')</if> <if test="indexType != null">and index_type = #{indexType}</if> <if test="nodeId != null and nodeId != ''">and svg.node_id = #{nodeId}</if> <if test="indexCategory != null and indexCategory != ''">and index_category = #{indexCategory} </if> </where> </select> </mapper>