From 42077728ba60f5f30c36358c046f9d223ec051ff Mon Sep 17 00:00:00 2001 From: yinq Date: Tue, 9 Sep 2025 14:13:24 +0800 Subject: [PATCH] =?UTF-8?q?add=20=E8=83=BD=E6=BA=90=E5=90=8C=E6=AF=94?= =?UTF-8?q?=E5=88=86=E6=9E=90=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/os/common/utils/DateUtils.java | 16 +++- .../controller/EmsReportController.java | 13 ++- .../os/ems/report/domain/RealTimeDataBo.java | 12 +++ .../ems/report/service/IEmsReportService.java | 7 ++ .../service/impl/EmsReportServiceImpl.java | 84 +++++++++++++++++++ .../ems/record/EmsRecordDnbInstantMapper.xml | 1 + 6 files changed, 130 insertions(+), 3 deletions(-) diff --git a/os-common/src/main/java/com/os/common/utils/DateUtils.java b/os-common/src/main/java/com/os/common/utils/DateUtils.java index 5c01875..8e57b67 100644 --- a/os-common/src/main/java/com/os/common/utils/DateUtils.java +++ b/os-common/src/main/java/com/os/common/utils/DateUtils.java @@ -297,6 +297,20 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils return timeMap; } - + /** + * 获取去年同时间的日期字符串 + * @param dateTimeStr 格式必须为 "yyyy-MM-dd HH:mm:ss" + * @return 去年同时间的字符串,格式相同 + */ + public static String getLastYearDateTime(String dateTimeStr) { + // 定义日期时间格式 + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + // 解析字符串为 LocalDateTime + LocalDateTime dateTime = LocalDateTime.parse(dateTimeStr, formatter); + // 减去一年 + LocalDateTime lastYearDateTime = dateTime.minusYears(1); + // 格式化为字符串返回 + return lastYearDateTime.format(formatter); + } } diff --git a/os-ems/src/main/java/com/os/ems/report/controller/EmsReportController.java b/os-ems/src/main/java/com/os/ems/report/controller/EmsReportController.java index 9836efc..e2184e1 100644 --- a/os-ems/src/main/java/com/os/ems/report/controller/EmsReportController.java +++ b/os-ems/src/main/java/com/os/ems/report/controller/EmsReportController.java @@ -96,8 +96,17 @@ public class EmsReportController extends BaseController { return success(list); } - - + /** + * 能源同比分析接口 + * @param hashMap + * @return + */ + @GetMapping("/yoyAnalysisReport") + @ResponseBody + public AjaxResult yoyAnalysisReport(@RequestParam(required = false) Map hashMap) { + Map list = emsReportService.yoyAnalysisReport(hashMap); + return success(list); + } } diff --git a/os-ems/src/main/java/com/os/ems/report/domain/RealTimeDataBo.java b/os-ems/src/main/java/com/os/ems/report/domain/RealTimeDataBo.java index af6ae0d..9bde6aa 100644 --- a/os-ems/src/main/java/com/os/ems/report/domain/RealTimeDataBo.java +++ b/os-ems/src/main/java/com/os/ems/report/domain/RealTimeDataBo.java @@ -42,6 +42,10 @@ public class RealTimeDataBo extends BaseEntity { */ private String monitorName; + /** 是否虚拟(0是 1否) */ + @Excel(name = "是否虚拟", readConverterExp = "0=是,1=否") + private String isAmmeter; + /** 采集时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date collectTime; @@ -108,6 +112,14 @@ public class RealTimeDataBo extends BaseEntity { /** 纯度 */ private BigDecimal purity; + public String getIsAmmeter() { + return isAmmeter; + } + + public void setIsAmmeter(String isAmmeter) { + this.isAmmeter = isAmmeter; + } + public BigDecimal getPurity() { return purity; } diff --git a/os-ems/src/main/java/com/os/ems/report/service/IEmsReportService.java b/os-ems/src/main/java/com/os/ems/report/service/IEmsReportService.java index 3149fc3..dc982a9 100644 --- a/os-ems/src/main/java/com/os/ems/report/service/IEmsReportService.java +++ b/os-ems/src/main/java/com/os/ems/report/service/IEmsReportService.java @@ -43,4 +43,11 @@ public interface IEmsReportService { */ Map comparativeAnalysisReport(Map hashMap); + /** + * 能源同比分析接口 + * @param hashMap + * @return + */ + Map yoyAnalysisReport(Map hashMap); + } diff --git a/os-ems/src/main/java/com/os/ems/report/service/impl/EmsReportServiceImpl.java b/os-ems/src/main/java/com/os/ems/report/service/impl/EmsReportServiceImpl.java index b8a105f..9e851ca 100644 --- a/os-ems/src/main/java/com/os/ems/report/service/impl/EmsReportServiceImpl.java +++ b/os-ems/src/main/java/com/os/ems/report/service/impl/EmsReportServiceImpl.java @@ -14,6 +14,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.*; import java.util.stream.Collectors; @@ -197,4 +198,87 @@ public class EmsReportServiceImpl implements IEmsReportService { return result; } + /** + * 能源同比分析接口 + * @param hashMap + * @return + */ + @Override + public Map yoyAnalysisReport(Map hashMap) { + Map result = new HashMap<>(); + if (!hashMap.containsKey("beginCollectTime") || !hashMap.containsKey("endCollectTime") || !hashMap.containsKey("workUnitCode")) { + return result; + } + String beginCollectTime = String.valueOf(hashMap.get("beginCollectTime")); + String endCollectTime = String.valueOf(hashMap.get("endCollectTime")); + String dateType = String.valueOf(hashMap.get("dateType")); + //时间范围 + List timeIntervalList = getTimeIntervals(beginCollectTime, endCollectTime, dateType); + List statisticalReportList = this.energyStatisticalReportList(hashMap); + //同比增长率=(本期数值−去年同期数值)/去年同期数值×100% + String beginYearDateTime = DateUtils.getLastYearDateTime(beginCollectTime); + String endYearDateTime = DateUtils.getLastYearDateTime(endCollectTime); + hashMap.put("beginCollectTime", beginYearDateTime); + hashMap.put("endCollectTime", endYearDateTime); + List lastDateReportList = this.energyStatisticalReportList(hashMap); + + List thisDataList = new ArrayList<>(); + List contrastDataList = new ArrayList<>(); + List rateList = new ArrayList<>(); + for (String time : timeIntervalList) { + BigDecimal nowExpend = new BigDecimal(0); + BigDecimal lastInitExpend = new BigDecimal(0); + BigDecimal rate = new BigDecimal(0); + for (EnergyStatisticalReport report : statisticalReportList) { + BigDecimal expend = report.getExpend(); + if (time.equals(report.getBeginTime())){ + nowExpend = nowExpend.add(expend); + } + } + for (EnergyStatisticalReport report : lastDateReportList) { + BigDecimal expend = report.getExpend(); + if (time.equals(report.getBeginTime())){ + lastInitExpend = lastInitExpend.add(expend); + } + } + thisDataList.add(nowExpend); + contrastDataList.add(lastInitExpend); + BigDecimal decimal = calculateYearOverYearGrowth(nowExpend, lastInitExpend, 2, RoundingMode.HALF_UP); + rateList.add(decimal); + } + result.put("time", timeIntervalList); + result.put("thisData", thisDataList); + result.put("contrastData", contrastDataList); + result.put("rate", rateList); + BigDecimal thisSum = thisDataList.stream().filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal contrastSum = contrastDataList.stream().filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add); + result.put("thisSum", thisSum); + result.put("contrastSum", contrastSum); + return result; + } + + /** + * 计算同比增长率(百分比) + * @param currentValue 本期数值 + * @param lastYearValue 去年同期数值 + * @param scale 结果保留小数位数 + * @param roundingMode 舍入模式(默认四舍五入) + * @return 增长率百分比(如 15.25 表示 15.25%) + * @throws IllegalArgumentException 如果去年同期数值为0 + */ + public BigDecimal calculateYearOverYearGrowth( BigDecimal currentValue, BigDecimal lastYearValue, int scale, RoundingMode roundingMode) { + // 验证参数 + if (lastYearValue.compareTo(BigDecimal.ZERO) == 0) { + return new BigDecimal(0); + } + // 计算差值:本期 - 去年同期 + BigDecimal difference = currentValue.subtract(lastYearValue); + // 计算比率:(差值 / 去年同期值) + BigDecimal ratio = difference.divide(lastYearValue, scale + 2, roundingMode); + // 转换为百分比:× 100 + return ratio.multiply(new BigDecimal("100")).setScale(scale, roundingMode); + } + + + } diff --git a/os-ems/src/main/resources/mapper/ems/record/EmsRecordDnbInstantMapper.xml b/os-ems/src/main/resources/mapper/ems/record/EmsRecordDnbInstantMapper.xml index c827dce..40bfe14 100644 --- a/os-ems/src/main/resources/mapper/ems/record/EmsRecordDnbInstantMapper.xml +++ b/os-ems/src/main/resources/mapper/ems/record/EmsRecordDnbInstantMapper.xml @@ -165,6 +165,7 @@ ebli.monitor_code monitorCode, ebmi.monitor_name monitorName, ebmi.monitor_type monitorType, + ebmi.is_ammeter isAmmeter, rk.collect_time collectTime, rk.v_a vA, rk.v_b vB,