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 f521985..0b0f6b0 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 @@ -8,7 +8,13 @@ import java.time.LocalDateTime; import java.time.LocalTime; import java.time.ZoneId; import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.Calendar; import java.util.Date; +import java.util.List; + import org.apache.commons.lang3.time.DateFormatUtils; /** @@ -188,4 +194,67 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils ZonedDateTime zdt = localDateTime.atZone(ZoneId.systemDefault()); return Date.from(zdt.toInstant()); } + + /** + * 生成两个日期之间的每个时间点(支持小时、日、月、年) + * 假设:输入格式与粒度匹配: + * HOURS -> yyyy-MM-dd HH:mm:ss + * DAYS -> yyyy-MM-dd + * MONTHS -> yyyy-MM + * YEARS -> yyyy + * + * @param startDateStr 开始时间字符串 + * @param endDateStr 结束时间字符串 + * @param unit 时间粒度(支持 HOURS, DAYS, MONTHS, YEARS) + */ + public static List getTimeIntervals(String startDateStr, String endDateStr, String unit) { + String pattern; + int calendarField; + switch (unit) { + case "19": + pattern = "yyyy-MM-dd HH:mm:ss"; + calendarField = Calendar.HOUR_OF_DAY; + break; + case "10": + pattern = "yyyy-MM-dd"; + calendarField = Calendar.DAY_OF_MONTH; + break; + case "7": + pattern = "yyyy-MM"; + calendarField = Calendar.MONTH; + break; + case "4": + pattern = "yyyy"; + calendarField = Calendar.YEAR; + break; + default: + throw new IllegalArgumentException("Unsupported unit: " + unit); + } + + SimpleDateFormat sdf = new SimpleDateFormat(pattern); + List intervals = new ArrayList<>(); + + try { + Calendar start = Calendar.getInstance(); + start.setTime(sdf.parse(startDateStr)); + + Calendar end = Calendar.getInstance(); + end.setTime(sdf.parse(endDateStr)); + + while (!start.after(end)) { + intervals.add(sdf.format(start.getTime())); + start.add(calendarField, 1); + } + } catch (ParseException e) { + throw new RuntimeException("日期解析失败: " + e.getMessage(), e); + } + + return intervals; + } + + + + + + } diff --git a/os-ems/src/main/java/com/os/ems/base/domain/EmsBaseWorkUnit.java b/os-ems/src/main/java/com/os/ems/base/domain/EmsBaseWorkUnit.java index fe6365d..1bfe3b0 100644 --- a/os-ems/src/main/java/com/os/ems/base/domain/EmsBaseWorkUnit.java +++ b/os-ems/src/main/java/com/os/ems/base/domain/EmsBaseWorkUnit.java @@ -80,6 +80,16 @@ public class EmsBaseWorkUnit extends BaseEntity private String ancestors; + private List workUnitCodeList; + + public List getWorkUnitCodeList() { + return workUnitCodeList; + } + + public void setWorkUnitCodeList(List workUnitCodeList) { + this.workUnitCodeList = workUnitCodeList; + } + public List getChildren() { return children; } 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 5aa6639..33ce9f3 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 @@ -85,4 +85,16 @@ public class EmsReportController extends BaseController { } + /** + * 能源对比分析接口 + * @param hashMap + * @return + */ + @GetMapping("/comparativeAnalysisReport") + @ResponseBody + public AjaxResult comparativeAnalysisReport(@RequestParam(required = false) Map hashMap) { + Map list = emsReportService.comparativeAnalysisReport(hashMap); + return success(list); + } + } 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 ad091d0..3149fc3 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 @@ -35,4 +35,12 @@ public interface IEmsReportService { * @return */ List> energyPreviewReportList(Map hashMap); + + /** + * 能源对比分析接口 + * @param hashMap + * @return + */ + Map comparativeAnalysisReport(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 7ef1d71..b8a105f 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 @@ -1,5 +1,6 @@ package com.os.ems.report.service.impl; +import com.os.common.utils.DateUtils; import com.os.common.utils.StringUtils; import com.os.ems.base.domain.EmsBaseMonitorWorkUnit; import com.os.ems.base.domain.EmsBaseWorkUnit; @@ -16,6 +17,8 @@ import java.math.BigDecimal; import java.util.*; import java.util.stream.Collectors; +import static com.os.common.utils.DateUtils.getTimeIntervals; + /** * 能源报表Service业务层处理 @@ -49,7 +52,7 @@ public class EmsReportServiceImpl implements IEmsReportService { hashMap.put("timeSub", Integer.parseInt(String.valueOf(hashMap.get("dateType")))); List reportList = new ArrayList<>(); - if (Objects.equals(String.valueOf(hashMap.get("energyType")), "2")){ + if (Objects.equals(String.valueOf(hashMap.get("energyType")), "2")) { reportList = emsReportMapper.energyStatisticalDnbReportList(hashMap); } return reportList; @@ -115,4 +118,83 @@ public class EmsReportServiceImpl implements IEmsReportService { return resultList; } + /** + * 能源对比分析接口 + * + * @param hashMap + * @return + */ + @Override + public Map comparativeAnalysisReport(Map hashMap) { + Map result = new HashMap<>(); + if (!hashMap.containsKey("beginCollectTime") || !hashMap.containsKey("endCollectTime") || !hashMap.containsKey("workUnitCodeList")) { + return result; + } + String beginCollectTime = String.valueOf(hashMap.get("beginCollectTime")); + String endCollectTime = String.valueOf(hashMap.get("endCollectTime")); + String dateType = String.valueOf(hashMap.get("dateType")); + String workUnitCodeList = String.valueOf(hashMap.get("workUnitCodeList")); + String monitorType = String.valueOf(hashMap.get("monitorType")); + //时间范围 + List timeIntervalList = getTimeIntervals(beginCollectTime, endCollectTime, dateType); + //已勾选的统计单元 + List workUnitCodeSplitList = Arrays.asList(workUnitCodeList.split(",")); + + EmsBaseWorkUnit workUnit = new EmsBaseWorkUnit(); + workUnit.setWorkUnitCodeList(workUnitCodeSplitList); + List workUnitList = emsBaseWorkUnitMapper.selectEmsBaseWorkUnitList(workUnit); + //已勾选的统计单元名称 + List workUnitNameList = workUnitList.stream().map(EmsBaseWorkUnit::getWorkUnitName).collect(Collectors.toList()); + //查询耗量 + hashMap.put("workUnitCodeList", workUnitCodeSplitList); + hashMap.put("energyType", monitorType); + hashMap.put("beginCollectTime", beginCollectTime + " 00:00:00"); + hashMap.put("endCollectTime", endCollectTime + " 23:59:59"); + List statisticalReportList = this.energyStatisticalReportList(hashMap); + // 按照 workUnitCode 分组 + Map> groupedByWorkUnitCode = + statisticalReportList.stream() + .collect(Collectors.groupingBy(EnergyStatisticalReport::getWorkUnitCode)); + // 生成柱状图系列数据 + List> seriesBar = new ArrayList<>(); + // 生成折线图系列数据 + List> seriesLine = new ArrayList<>(); + + for (EmsBaseWorkUnit unit : workUnitList) { + List reportList = groupedByWorkUnitCode.get(unit.getWorkUnitCode()); + if (reportList == null) { + reportList = new ArrayList<>(); + } + + List expendList = new ArrayList<>(); + for (String time : timeIntervalList) { + BigDecimal initExpend = new BigDecimal(0); + for (EnergyStatisticalReport report : reportList) { + BigDecimal expend = report.getExpend(); + if (time.equals(report.getBeginTime())){ + initExpend = initExpend.add(expend); + } + } + expendList.add(initExpend); + } + + Map barSeries = new HashMap<>(); + barSeries.put("type", "bar"); + barSeries.put("name", unit.getWorkUnitName()); + barSeries.put("data", expendList); + seriesBar.add(barSeries); + Map lineSeries = new HashMap<>(); + lineSeries.put("type", "line"); + lineSeries.put("name", unit.getWorkUnitName()); + lineSeries.put("data", expendList); + seriesLine.add(lineSeries); + } + + result.put("times", timeIntervalList); + result.put("deviceNames", workUnitNameList); + result.put("seriesBar", seriesBar); + result.put("seriesLine", seriesLine); + return result; + } + } diff --git a/os-ems/src/main/resources/mapper/ems/base/EmsBaseWorkUnitMapper.xml b/os-ems/src/main/resources/mapper/ems/base/EmsBaseWorkUnitMapper.xml index c2c4e67..fb47d04 100644 --- a/os-ems/src/main/resources/mapper/ems/base/EmsBaseWorkUnitMapper.xml +++ b/os-ems/src/main/resources/mapper/ems/base/EmsBaseWorkUnitMapper.xml @@ -43,6 +43,12 @@ and work_unit_code = #{workUnitCode} + + and work_unit_code IN + + #{workUnitCode} + + and parent_id = #{parentId} and work_unit_name like concat('%', #{workUnitName}, '%') diff --git a/os-ems/src/main/resources/mapper/ems/report/EmsReportMapper.xml b/os-ems/src/main/resources/mapper/ems/report/EmsReportMapper.xml index 6b465c2..73d7f97 100644 --- a/os-ems/src/main/resources/mapper/ems/report/EmsReportMapper.xml +++ b/os-ems/src/main/resources/mapper/ems/report/EmsReportMapper.xml @@ -24,6 +24,12 @@ and FORMAT(RPD.BEGIN_TIME, 'yyyy-MM-dd HH:mm:ss') between #{beginCollectTime} and #{endCollectTime} and WU.WORK_UNIT_CODE = #{workUnitCode} + + and WU.WORK_UNIT_CODE IN + + #{workUnitCode} + + GROUP BY WU.WORK_UNIT_CODE, WU.WORK_UNIT_NAME, SUBSTRING(FORMAT(RPD.BEGIN_TIME, 'yyyy-MM-dd HH:mm:ss'), 1, DT.TIMESUB) ORDER BY beginTime, workUnitCode