From 47691c3e41d367c757f57fff50f201476454e7b6 Mon Sep 17 00:00:00 2001
From: letsgocoding <sdxt_0802@163.com>
Date: 星期四, 13 二月 2025 11:56:01 +0800
Subject: [PATCH] !69 成本趋势分析/分时能耗消耗页面接口。 Merge pull request !69 from 潘晓明/pxm_from_develop1.0
---
zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/common/DateTimeUtil.java | 750 ++++++++++++++++++++++++++++++
zhitan-system/src/main/java/com/zhitan/dataitem/mapper/DataItemMapper.java | 12
zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/domain/vo/EnergyConsumeVO.java | 43 +
zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/service/impl/EnergyConsumeDataServiceImpl.java | 308 ++++++++++++
zhitan-system/src/main/resources/mapper/peakvalley/ElectricityDataItemMapper.xml | 26 +
zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/domain/vo/EnergyConsumeTrendDetailItem.java | 83 +++
zhitan-system/src/main/java/com/zhitan/peakvalley/mapper/PeakValleyMapper.java | 12
zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/domain/vo/EnergyCostTrendPage.java | 22
zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/domain/vo/CostTrendEnergyTypeItem.java | 47 +
zhitan-admin/src/main/java/com/zhitan/web/controller/statisticalAnalysis/EnergyConsumeDataController.java | 69 ++
zhitan-system/src/main/resources/mapper/dataitem/DataItemMapper.xml | 18
zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/domain/vo/EnergyCostTrendItem.java | 51 ++
zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/service/IEnergyConsumeDataService.java | 35 +
13 files changed, 1,476 insertions(+), 0 deletions(-)
diff --git a/zhitan-admin/src/main/java/com/zhitan/web/controller/statisticalAnalysis/EnergyConsumeDataController.java b/zhitan-admin/src/main/java/com/zhitan/web/controller/statisticalAnalysis/EnergyConsumeDataController.java
new file mode 100644
index 0000000..e91dc45
--- /dev/null
+++ b/zhitan-admin/src/main/java/com/zhitan/web/controller/statisticalAnalysis/EnergyConsumeDataController.java
@@ -0,0 +1,69 @@
+package com.zhitan.web.controller.statisticalAnalysis;
+
+import com.zhitan.common.annotation.Log;
+import com.zhitan.common.core.domain.AjaxResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import com.zhitan.statisticalAnalysis.service.IEnergyConsumeDataService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+
+/**
+ * @Description: 鑳芥簮娑堣�楃粺璁″垎鏋�
+ * @author: yxw
+ * @date: 2022骞�04鏈�12鏃� 14:11
+ */
+@Api(tags = "鑳借�楃粺璁″垎鏋�")
+@RestController
+@RequestMapping("/energyTypeAnalysis")
+@Slf4j
+public class EnergyConsumeDataController {
+ @Autowired
+ private IEnergyConsumeDataService energyConsumeDataService;
+
+ /**
+ * 鎴愭湰瓒嬪娍鍒嗘瀽锛堣兘婧愭秷鑰楁垚鏈級- 鑾峰彇琛ㄦ牸鍒楄〃鏁版嵁
+ *
+ * @param pageNo 椤电爜鏁�
+ * @param pageSize 姣忛〉鏁版嵁澶氬皯
+ * @param timeCode 鏃堕棿鍊� 涓庢椂闂寸被鍨嬪搴旓細2022-03-21/2022-03/2022
+ * @param timeType 鏃堕棿绫诲瀷 DAY/MONTH/YEAR
+ * @param energyType 鑳芥簮绫诲瀷
+ * @param modelCode 妯″瀷Code
+ * @return
+ */
+ @Log(title = "鑳借�楃粺璁″垎鏋�-鎴愭湰瓒嬪娍鍒嗘瀽锛堣兘婧愭秷鑰楁垚鏈級- 鑾峰彇琛ㄦ牸鍒楄〃鏁版嵁")
+ @ApiOperation(value = "鑳借�楃粺璁″垎鏋�-鎴愭湰瓒嬪娍鍒嗘瀽锛堣兘婧愭秷鑰楁垚鏈級- 鑾峰彇琛ㄦ牸鍒楄〃鏁版嵁", notes = "鑳借�楃粺璁″垎鏋�-鎴愭湰瓒嬪娍鍒嗘瀽锛堣兘婧愭秷鑰楁垚鏈級- 鑾峰彇琛ㄦ牸鍒楄〃鏁版嵁")
+ @GetMapping(value = "/listEnergyCostTrend")
+ public AjaxResult listEnergyCostTrend(@RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+ @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+ @RequestParam(name = "timeCode") String timeCode,
+ @RequestParam(name = "timeType") String timeType,
+ @RequestParam(name = "energyType",required = false) String energyType,
+ @RequestParam(name = "modelCode") String modelCode) {
+ return AjaxResult.success(energyConsumeDataService.listEnergyCostTrend(pageNo, pageSize, timeCode, timeType,energyType,
+ modelCode));
+ }
+
+ /**
+ * 鎴愭湰瓒嬪娍鍒嗘瀽锛堣兘婧愭秷鑰楁垚鏈級
+ *
+ * @param timeCode 鏃堕棿鍊� 涓庢椂闂寸被鍨嬪搴旓細2022-03-21/2022-03/2022
+ * @param timeType 鏃堕棿绫诲瀷 DAY/MONTH/YEAR
+ * @param modelCode 妯″瀷Code
+ * @param energyType 鑳芥簮绫诲瀷
+ * @return
+ */
+ @Log(title = "鑳借�楃粺璁″垎鏋�-鎴愭湰瓒嬪娍鍒嗘瀽锛堣兘婧愭秷鑰楁垚鏈級")
+ @ApiOperation(value = "鑳借�楃粺璁″垎鏋�-鎴愭湰瓒嬪娍鍒嗘瀽锛堣兘婧愭秷鑰楁垚鏈級", notes = "鑳借�楃粺璁″垎鏋�-鎴愭湰瓒嬪娍鍒嗘瀽锛堣兘婧愭秷鑰楁垚鏈級")
+ @GetMapping(value = "/listEnergyCostTrendDetail")
+ public AjaxResult listEnergyCostTrendDetail(@RequestParam(name = "timeCode") String timeCode,
+ @RequestParam(name = "timeType") String timeType,
+ @RequestParam(name = "modelCode") String modelCode,
+ @RequestParam(name = "energyType",required = false) String energyType) {
+ return AjaxResult.success(energyConsumeDataService.listEnergyCostTrendDetail(timeCode, timeType, modelCode, energyType));
+ }
+
+}
diff --git a/zhitan-system/src/main/java/com/zhitan/dataitem/mapper/DataItemMapper.java b/zhitan-system/src/main/java/com/zhitan/dataitem/mapper/DataItemMapper.java
index 94f00fe..99d5317 100644
--- a/zhitan-system/src/main/java/com/zhitan/dataitem/mapper/DataItemMapper.java
+++ b/zhitan-system/src/main/java/com/zhitan/dataitem/mapper/DataItemMapper.java
@@ -123,4 +123,16 @@
*/
List<DataItem> getDataItemHourInforByIndexIds(@Param("beginTime") Date beginTime, @Param("endTime") Date endTime,
@Param("timeType") String timeType, @Param("indexIds") List<String> indexIds);
+
+ /**
+ * 鏌ヨ鑳芥簮绫诲瀷闈炵數鐨勭敤閲�
+ * @param beginTime
+ * @param endTime
+ * @param timeType 鏃堕棿绫诲瀷
+ * @param nodeId 鑺傜偣Id
+ * @param energyType 鑳芥簮绫诲瀷
+ * @return
+ */
+ BigDecimal getDataItemTimeRangeValueByNodeId(@Param("beginTime") Date beginTime, @Param("endTime") Date endTime,
+ @Param("timeType") String timeType, @Param("nodeId") String nodeId, @Param("energyType") String energyType);
}
diff --git a/zhitan-system/src/main/java/com/zhitan/peakvalley/mapper/PeakValleyMapper.java b/zhitan-system/src/main/java/com/zhitan/peakvalley/mapper/PeakValleyMapper.java
index b11d097..98b4e01 100644
--- a/zhitan-system/src/main/java/com/zhitan/peakvalley/mapper/PeakValleyMapper.java
+++ b/zhitan-system/src/main/java/com/zhitan/peakvalley/mapper/PeakValleyMapper.java
@@ -38,4 +38,16 @@
List<ElectricityDataItem> getDataStatisticsDeviationAnalysis(@Param("indexIdSet") Set<String> indexIdSet,
@Param("timeType") String timeType);
+ /**
+ * 鏌ヨ鎴愭湰瓒嬪娍
+ * @param beginTime
+ * @param endTime
+ * @param timeType 鏃堕棿绫诲瀷
+ * @param nodeId 鑺傜偣Id
+ * @param energyType 鑳芥簮绫诲瀷
+ * @return
+ */
+ List<ElectricityDataItem> getCostTrends(@Param("beginTime") Date beginTime, @Param("endTime") Date endTime,
+ @Param("timeType") String timeType, @Param("nodeId") String nodeId,@Param("energyType") String energyType);
+
}
diff --git a/zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/common/DateTimeUtil.java b/zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/common/DateTimeUtil.java
new file mode 100644
index 0000000..d38bfce
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/common/DateTimeUtil.java
@@ -0,0 +1,750 @@
+package com.zhitan.statisticalAnalysis.common;
+
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.zhitan.common.constant.CommonConst;
+import com.zhitan.common.constant.TimeTypeConst;
+import com.zhitan.common.utils.IntegerUtil;
+import com.zhitan.common.utils.StringUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.time.DateUtils;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
+
+/**
+ * @Description: 鏃堕棿宸ュ叿绫�
+ * @author: yxw
+ * @date: 2022骞�02鏈�02鏃� 12:23
+ */
+@Slf4j
+public class DateTimeUtil {
+ /**
+ * 鏃ユ湡甯哥敤鏍煎紡
+ */
+ public static final String COMMON_PATTERN = "yyyy-MM-dd HH:mm:ss";
+ /**
+ * 鏍煎紡鍖栨棩鏈熷埌鍒嗛挓
+ */
+ public static final String COMMON_PATTERN_END_WITH_MINUTE = "yyyy-MM-dd HH:mm";
+ /**
+ * 鏃ユ湡鏍煎紡 - 灏忔椂:鍒嗛挓
+ */
+ public static final String COMMON_PATTERN_HOUR_MINUTE = "HH:mm";
+ /**
+ * 鏃ユ湡甯哥敤鏍煎紡 - 骞翠唤
+ */
+ public static final String COMMON_PATTERN_YEAR = "yyyy";
+ /**
+ * 鏃ユ湡甯哥敤鏍煎紡 - 鏌愪竴骞�,
+ */
+ public static final String COMMON_PATTERN_CERTAIN_YEAR = "yy";
+
+ /**
+ * 鏃ユ湡甯哥敤鏍煎紡 - 鏈堜唤
+ */
+ public static final String COMMON_PATTERN_MONTH = "yyyyMM";
+ /**
+ * 鏃ユ湡甯哥敤鏍煎紡 - 鏈堜唤
+ */
+ public static final String COMMON_PATTERN_TO_MONTH = "yyyy-MM";
+ /**
+ * 鏃ユ湡甯哥敤鏍煎紡 - 鏈堜唤
+ */
+ public static final String COMMON_PATTERN_TO_MONTH_WORD = "yyyy-MM鏈�";
+ /**
+ * 鏃ユ湡甯哥敤鏍煎紡 - 鏈堜唤
+ */
+ public static final String COMMON_PATTERN_TO_MONTH_ZH = "yyyy骞碝M鏈�";
+ /**
+ * 鏃ユ湡甯哥敤鏍煎紡 - 澶�
+ */
+ public static final String COMMON_PATTERN_DAY = "yyyyMMdd";
+ /**
+ * 鏃ユ湡甯哥敤鏍煎紡 - 澶�
+ */
+ public static final String COMMON_PATTERN_TO_DAY = "yyyy-MM-dd";
+ /**
+ * 鏃ユ湡甯哥敤鏍煎紡 - 澶�
+ */
+ public static final String COMMON_PATTERN_TO_DAY_WORD = "yyyy-MM-dd鏃�";
+ /**
+ * 鏃ユ湡甯哥敤鏍煎紡 - 鏈堟棩
+ */
+ public static final String COMMON_PATTERN_MONTH_DAY = "MM-dd";
+ /**
+ * 鏃ユ湡甯哥敤鏍煎紡 - 澶╂煇涓�澶�,
+ */
+ public static final String COMMON_PATTERN_DAY_OF_MONTH = "dd";
+ /**
+ * 鏃ユ湡甯哥敤鏍煎紡 - 灏忔椂
+ */
+ public static final String COMMON_PATTERN_HOUR = "yyyyMMddHH";
+ /**
+ * 鏃ユ湡甯哥敤鏍煎紡 - 灏忔椂
+ */
+ public static final String COMMON_PATTERN_TO_HOUR = "yyyy-MM-dd HH";
+ /**
+ * 鏃ユ湡甯哥敤鏍煎紡 - 灏忔椂
+ */
+ public static final String COMMON_PATTERN_TO_HOUR_WORD = "yyyy-MM-dd HH鏃�";
+ /**
+ * 鏃ユ湡甯哥敤鏍煎紡 - 灏忔椂
+ */
+ public static final String COMMON_PATTERN_TO_HOUR_TEXT = "yyyy骞碝M鏈坉d鏃� HH鏃�";
+
+ /**
+ * 鑾峰彇褰撳墠鏃堕棿,鏃堕棿鏍煎紡锛歽yyy-MM-dd HH:mm:ss
+ *
+ * @return
+ */
+ public static String getNowDateTime() {
+ return getNowDateTime(COMMON_PATTERN);
+ }
+
+ /**
+ * 鑾峰彇褰撳墠鏃堕棿
+ *
+ * @param pattern 鏃堕棿鏍煎紡
+ * @return
+ */
+ public static String getNowDateTime(String pattern) {
+ //璁剧疆鏃ユ湡鏍煎紡
+ SimpleDateFormat df = new SimpleDateFormat(pattern);
+ String dateTime = df.format(new Date());
+ return dateTime;
+ }
+
+ /**
+ * 鑾峰彇浠婂勾鐨勫勾浠藉��
+ *
+ * @return
+ */
+ public static String getNowYear() {
+ return getNowDateTime(COMMON_PATTERN_YEAR);
+ }
+
+ /**
+ * 鑾峰彇浠婂勾鐨勬湀浠藉��
+ *
+ * @return
+ */
+ public static String getNowMonth() {
+ return getNowDateTime(COMMON_PATTERN_MONTH);
+ }
+
+ /**
+ * 瀛楃涓茶浆鎴愭椂闂寸被鍨�,榛樿鏍煎紡锛歽yyy-MM-dd HH:mm:ss
+ *
+ * @param dateTimeStr
+ * @return
+ */
+ public static Date toDateTime(String dateTimeStr) {
+ DateTime dt = null;
+ try {
+ dt = DateTime.of(dateTimeStr, COMMON_PATTERN);
+ } catch (Exception e) {
+
+ }
+ return dt;
+ }
+
+ /**
+ * 瀛楃涓茶浆鎴愭椂闂寸被鍨�
+ *
+ * @param dateTimeStr
+ * @return
+ */
+ public static Date toDateTime(String dateTimeStr, String pattern) {
+ DateTime dt = null;
+ try {
+ dt = DateTime.of(dateTimeStr, pattern);
+ } catch (Exception e) {
+
+ }
+ return dt;
+ }
+
+ /**
+ * 瀛楃涓茶浆鎴愮壒瀹氭牸寮忕殑鏃堕棿瀛楃涓茬被鍨�
+ *
+ * @param dateTimeStr 鏃堕棿瀛楃涓�
+ * @param sourcePattern 瀛楃涓叉椂闂存牸寮�
+ * @param toPattern 瑕佽浆鎴愪粈涔堟牸寮忕殑鏃堕棿
+ * @return
+ */
+ public static String toDateTimeStr(String dateTimeStr, String sourcePattern, String toPattern) {
+ String str = CommonConst.EMPTY;
+ try {
+ DateTime dt = DateTime.of(dateTimeStr, sourcePattern);
+ str = getDateTime(dt, toPattern);
+ } catch (Exception e) {
+
+ }
+ return str;
+ }
+
+ /**
+ * 鏃堕棿杞垚鎸囧畾鐨勬牸寮�
+ *
+ * @param pattern 鏃堕棿鏍煎紡
+ * @return
+ */
+ public static String getDateTime(Date dt, String pattern) {
+ //璁剧疆鏃ユ湡鏍煎紡
+ SimpleDateFormat df = new SimpleDateFormat(pattern);
+ return df.format(dt);
+ }
+
+ /**
+ * 鏃堕棿杞垚yyyy-MM-dd HH:mm:ss鏍煎紡
+ *
+ * @return
+ */
+ public static String getDateTime(Date dt) {
+ if (ObjectUtil.isEmpty(dt)) {
+ return CommonConst.EMPTY;
+ }
+ return getDateTime(dt, COMMON_PATTERN);
+ }
+
+ /**
+ * 鑾峰彇褰撳墠鏃堕棿鎵�灞炴湀浠界殑鏈�鍚庝竴澶�
+ *
+ * @return
+ */
+ public static int getDateTimeLastDay(Date dt) {
+ String month = getMonth(dt);
+ String firstDate = month + "01";
+ Date nextMonthFirstDate = addMonths(toDateTime(firstDate, COMMON_PATTERN_DAY), CommonConst.DIGIT_1);
+ Date currentMonthLastDate = addDays(nextMonthFirstDate, CommonConst.DIGIT_MINUS_1);
+ int day = IntegerUtil.toInt(getDateTime(currentMonthLastDate, COMMON_PATTERN_DAY_OF_MONTH));
+ return day;
+ }
+
+ /**
+ * 鑾峰彇骞翠唤鍊�
+ *
+ * @return
+ */
+ public static String getYear(Date dt) {
+ return getDateTime(dt, COMMON_PATTERN_YEAR);
+ }
+
+ /**
+ * 鑾峰彇鏈堜唤鍊� 202202
+ *
+ * @return
+ */
+ public static String getMonth(Date dt) {
+ return getDateTime(dt, COMMON_PATTERN_MONTH);
+ }
+
+ /**
+ * 鑾峰彇澶�,鏍煎紡锛歽yyyMMdd
+ *
+ * @return
+ */
+ public static String toDay(Date dt) {
+ return getDateTime(dt, COMMON_PATTERN_DAY);
+ }
+
+ /**
+ * 鑾峰彇灏忔椂:yyyyMMddHH
+ *
+ * @return
+ */
+ public static String toHour(Date dt) {
+ return getDateTime(dt, COMMON_PATTERN_HOUR);
+ }
+
+ /**
+ * 杞垚瀛楃涓茬被鍨嬪��
+ *
+ * @return
+ */
+ public static String toString(Date dt) {
+ return getDateTime(dt, COMMON_PATTERN);
+ }
+
+ /**
+ * 鏃堕棿澧炲姞瀵瑰簲鐨勫勾鏁�
+ *
+ * @param dateTime
+ * @param years
+ * @return
+ */
+ public static Date addYears(Date dateTime, int years) {
+ return calcDate(dateTime, years, Calendar.YEAR);
+ }
+
+ /**
+ * 鏃堕棿澧炲姞瀵瑰簲鐨勬湀鏁�
+ *
+ * @param dateTime
+ * @param months
+ * @return
+ */
+ public static Date addMonths(Date dateTime, int months) {
+ return calcDate(dateTime, months, Calendar.MONTH);
+ }
+
+ /**
+ * 鏃堕棿澧炲姞瀵瑰簲鐨勫ぉ鏁�
+ *
+ * @param dateTime
+ * @param days
+ * @return
+ */
+ public static Date addDays(Date dateTime, int days) {
+ return calcDate(dateTime, days, Calendar.DATE);
+ }
+
+ /**
+ * 鏃堕棿澧炲姞瀵瑰簲鐨勫皬鏃舵暟
+ *
+ * @param dateTime
+ * @param hours
+ * @return
+ */
+ public static Date addHours(Date dateTime, int hours) {
+ return calcDate(dateTime, hours, Calendar.HOUR);
+ }
+
+ /**
+ * 鏃堕棿澧炲姞瀵瑰簲鐨勫垎閽熸暟
+ *
+ * @param dateTime
+ * @param minutes
+ * @return
+ */
+ public static Date addMinutes(Date dateTime, int minutes) {
+ return calcDate(dateTime, minutes, Calendar.MINUTE);
+ }
+
+ /**
+ * 鏃堕棿澧炲姞瀵瑰簲鐨勫皬鏃舵暟
+ *
+ * @param dateTime
+ * @param seconds
+ * @return
+ */
+ public static Date addSeconds(Date dateTime, int seconds) {
+ return calcDate(dateTime, seconds, Calendar.SECOND);
+ }
+
+ /**
+ * 璁$畻鏃ユ湡閫氱敤鏂规硶
+ *
+ * @param dateTime
+ * @param addValue
+ * @param calendarType 璁$畻绫诲瀷锛欳alendar.YEAR锛孋alendar.MONTH,Calendar.DAY
+ * @return
+ */
+ private static Date calcDate(Date dateTime, int addValue, int calendarType) {
+ Date dt = null;
+ try {
+ Calendar calendar = new GregorianCalendar();
+ calendar.setTime(dateTime);
+ //鎶婃棩鏈熷線鍚庡鍔犱竴骞达紝鏁存暟寰�鍚庢帹锛岃礋鏁板線鍓嶇Щ
+ calendar.add(calendarType, addValue);
+ // 鑾峰彇鐩稿姞鎴栬�呯浉鍑忎箣鍚庣殑鏃堕棿鍊�
+ Date tempDt = calendar.getTime();
+ // 鎶婃椂闂磋浆鎴愭墍闇�瑕佺殑鏍煎紡
+ String temp = getDateTime(tempDt, COMMON_PATTERN);
+ dt = toDateTime(temp);
+ } catch (Exception e) {
+
+ }
+ return dt;
+ }
+
+ /**
+ * 鑾峰彇璇ユ椂闂村睘浜庡綋澶╃殑绗嚑涓皬鏃�
+ *
+ * @param dateTime
+ * @return
+ */
+ public static int getHourOfDay(Date dateTime) {
+ return getDateValue(dateTime, Calendar.HOUR_OF_DAY);
+ }
+
+ /**
+ * 鑾峰彇璇ユ椂闂村睘浜庡綋鏈堢殑绗嚑澶�
+ *
+ * @param dateTime
+ * @return
+ */
+ public static int getDayOfMonth(Date dateTime) {
+ return getDateValue(dateTime, Calendar.DAY_OF_MONTH);
+ }
+
+ /**
+ * 鑾峰彇璇ユ椂闂村睘浜庡綋鍛ㄧ殑绗嚑澶�
+ * 涓�鍛ㄧ殑绗竴澶╂槸鍛ㄦ棩
+ *
+ * @param dateTime
+ * @return
+ */
+ public static int getDayOfWeek(Date dateTime) {
+ return getDateValue(dateTime, Calendar.DAY_OF_WEEK);
+ }
+
+ /**
+ * 鑾峰彇璇ユ椂闂村睘浜庡勾鐨勭鍑犱釜鏈�
+ * 鏈堜唤鍊�+1鏄湡瀹炵殑褰撳墠鏈�
+ *
+ * @param dateTime
+ * @return 宸茬粡鍦ㄧ郴缁熶腑鑾峰彇鍊肩殑鍩虹涓婂姞1浜嗭紝鐜板湪鏄湡瀹炵殑褰撳墠鏈堜唤鍊�
+ */
+ public static int getMonthOfYear(Date dateTime) {
+ return getDateValue(dateTime, Calendar.MONTH) + 1;
+ }
+
+ /**
+ * 鑾峰彇褰撳ぉ鐨勭鍑犱釜灏忔椂/褰撴湀鐨勭鍑犲ぉ/褰撳勾鐨勭鍑犱釜鏈�
+ *
+ * @param dateTime 濡傛灉鏃堕棿鍊间负绌猴紝榛樿褰撳墠鏃堕棿
+ * @param calendarType
+ * @return
+ */
+ private static int getDateValue(Date dateTime, int calendarType) {
+ int value = 0;
+ try {
+ if (ObjectUtil.isEmpty(dateTime)) {
+ dateTime = new Date();
+ }
+ Calendar calendar = new GregorianCalendar();
+ calendar.setTime(dateTime);
+ value = calendar.get(calendarType);
+ } catch (Exception e) {
+
+ }
+ return value;
+ }
+
+ /**
+ * 瀵规瘮time1 鍜� time2 鐨勫ぇ灏�
+ *
+ * @param time1
+ * @param time2
+ * @return -1:time1灏忎簬time2;0:time1绛変簬time2;1:time1澶т簬time2;
+ */
+ public static int compareDateDiff(Date time1, Date time2) {
+ long diff = time1.getTime() - time2.getTime();
+ int res = 0;
+ if (diff > 0) {
+ res = 1;
+ } else if (diff < 0) {
+ res = -1;
+ }
+ return res;
+ }
+
+ /**
+ * 鑾峰彇鏌ヨdata_item鎵�闇�瑕佺殑timecode鍊�
+ *
+ * @param timeType 鏃ユ湡绫诲瀷
+ * @param date 鏃堕棿
+ * @return
+ */
+ public static String getTimeCode(String timeType, Date date) {
+ String timeCode = CommonConst.EMPTY;
+ if (ObjectUtil.isEmpty(date)) {
+ date = new Date();
+ }
+ timeType = StringUtil.ifEmptyOrNullReturnValue(timeType).toUpperCase();
+ switch (timeType) {
+ case TimeTypeConst.TIME_TYPE_HOUR:
+ timeCode = CommonConst.WORD_H + getDateTime(date, COMMON_PATTERN_HOUR);
+ break;
+ case TimeTypeConst.TIME_TYPE_DAY:
+ timeCode = CommonConst.WORD_D + getDateTime(date, COMMON_PATTERN_DAY);
+ break;
+ case TimeTypeConst.TIME_TYPE_MONTH:
+ timeCode = CommonConst.WORD_M + getDateTime(date, COMMON_PATTERN_MONTH);
+ break;
+ case TimeTypeConst.TIME_TYPE_YEAR:
+ timeCode = CommonConst.WORD_Y + getDateTime(date, COMMON_PATTERN_YEAR);
+ break;
+ default:
+ break;
+ }
+ return timeCode;
+ }
+
+ /**
+ * 鑾峰彇鏌ヨ鏃ユ湀骞存姤琛ㄦ墍闇�瑕佺殑timecode鍊�
+ *
+ * @param timeType 鏃ユ湡绫诲瀷
+ * @param date 鏃堕棿
+ * @return
+ */
+ public static String getReportTimeCode(String timeType, Date date) {
+ String timeCode = CommonConst.EMPTY;
+ if (ObjectUtil.isEmpty(date)) {
+ date = new Date();
+ }
+ timeType = StringUtil.ifEmptyOrNullReturnValue(timeType).toUpperCase();
+ switch (timeType) {
+ case TimeTypeConst.TIME_TYPE_HOUR:
+ timeCode = getDateTime(date, COMMON_PATTERN_TO_HOUR);
+ break;
+ case TimeTypeConst.TIME_TYPE_DAY:
+ timeCode = getDateTime(date, COMMON_PATTERN_TO_DAY);
+ break;
+ case TimeTypeConst.TIME_TYPE_MONTH:
+ timeCode = getDateTime(date, COMMON_PATTERN_TO_MONTH);
+ break;
+ case TimeTypeConst.TIME_TYPE_YEAR:
+ timeCode = getDateTime(date, COMMON_PATTERN_YEAR);
+ break;
+ default:
+ break;
+ }
+ return timeCode;
+ }
+
+ /**
+ * 鑾峰彇鏃堕棿瀵瑰簲鐨勭幆姣旀椂闂�
+ *
+ * @param timeType HOUR/DAY/MONTH/YEAR
+ * @param date 鏃堕棿鍊�
+ * @return
+ */
+ public static Date getLoopTime(String timeType, Date date) {
+ Date dt = null;
+ if (ObjectUtil.isEmpty(date)) {
+ date = new Date();
+ }
+ timeType = StringUtil.ifEmptyOrNullReturnValue(timeType).toUpperCase();
+ switch (timeType) {
+ case TimeTypeConst.TIME_TYPE_HOUR:
+ dt = addHours(date, CommonConst.DIGIT_MINUS_1);
+ break;
+ case TimeTypeConst.TIME_TYPE_DAY:
+ dt = addDays(date, CommonConst.DIGIT_MINUS_1);
+ break;
+ case TimeTypeConst.TIME_TYPE_MONTH:
+ dt = addMonths(date, CommonConst.DIGIT_MINUS_1);
+ break;
+ case TimeTypeConst.TIME_TYPE_YEAR:
+ dt = addYears(date, CommonConst.DIGIT_MINUS_1);
+ break;
+ default:
+ break;
+ }
+ return dt;
+ }
+
+ /**
+ * 鑾峰彇鏁寸偣鏃堕棿
+ *
+ * @param timeType HOUR/DAY/MONTH/YEAR
+ * @param date 鏃堕棿鍊�
+ * @return
+ */
+ public static Date getHourTime(String timeType, Date date) {
+ Date dt = null;
+ if (ObjectUtil.isEmpty(date)) {
+ date = new Date();
+ }
+ String tempStr = null;
+ timeType = StringUtil.ifEmptyOrNullReturnValue(timeType).toUpperCase();
+ switch (timeType) {
+ case TimeTypeConst.TIME_TYPE_HOUR:
+ tempStr = getDateTime(date, COMMON_PATTERN_TO_HOUR);
+ dt = toDateTime(tempStr, COMMON_PATTERN_TO_HOUR);
+ break;
+ case TimeTypeConst.TIME_TYPE_DAY:
+ tempStr = getDateTime(date, COMMON_PATTERN_TO_DAY);
+ dt = toDateTime(tempStr, COMMON_PATTERN_TO_DAY);
+ break;
+ case TimeTypeConst.TIME_TYPE_MONTH:
+ tempStr = getDateTime(date, COMMON_PATTERN_TO_MONTH);
+ dt = toDateTime(tempStr, COMMON_PATTERN_TO_MONTH);
+ break;
+ case TimeTypeConst.TIME_TYPE_YEAR:
+ tempStr = getDateTime(date, COMMON_PATTERN_YEAR);
+ dt = toDateTime(tempStr, COMMON_PATTERN_YEAR);
+ break;
+ default:
+ break;
+ }
+ return dt;
+ }
+
+ /**
+ * 璁$畻涓や釜鏃堕棿闂撮殧澶╂暟锛堟棩鏈熸牸寮忔瘮杈冿級
+ *
+ * @param beginTime
+ * @param endTime
+ * @return
+ */
+ public static int daysBetween(Date beginTime, Date endTime) {
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTime(beginTime);
+ long beginStamp = calendar.getTimeInMillis();
+ calendar.setTime(endTime);
+ long endStamp = calendar.getTimeInMillis();
+ long betweenDays = (endStamp - beginStamp) / (1000 * 3600 * 24);
+ return Integer.parseInt(String.valueOf(betweenDays));
+ }
+
+ /**
+ * 璁$畻涓や釜鏃堕棿闂撮殧澶╂暟锛堝瓧绗︿覆鏍煎紡姣旇緝锛�
+ *
+ * @param beginTime
+ * @param endTime
+ * @return
+ */
+ public static int daysBetween(String beginTime, String endTime) {
+ try {
+ SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+ Date begin = format.parse(beginTime);
+ Date end = format.parse(endTime);
+ return daysBetween(begin, end);
+ } catch (ParseException exception) {
+ log.error("璁$畻涓や釜鏃堕棿闂撮殧澶╂暟" + exception.getMessage());
+ return 0;
+ }
+ }
+
+ /**
+ * 鏍规嵁鏃堕棿绫诲瀷鎶婂瓧绗︿覆杞垚瀵瑰簲鐨勬椂闂�
+ *
+ * @param timeType 鏃堕棿绫诲瀷
+ * @param time 鏃堕棿瀛楃涓�
+ * @return
+ */
+ public static Date getTime(String timeType, String time) {
+ Date dt = null;
+ timeType = StringUtil.ifEmptyOrNullReturnValue(timeType).toUpperCase();
+ switch (timeType) {
+ case TimeTypeConst.TIME_TYPE_HOUR:
+ dt = toDateTime(time, COMMON_PATTERN_TO_HOUR);
+ break;
+ case TimeTypeConst.TIME_TYPE_DAY:
+ dt = toDateTime(time, COMMON_PATTERN_TO_DAY);
+ break;
+ case TimeTypeConst.TIME_TYPE_MONTH:
+ dt = toDateTime(time, COMMON_PATTERN_TO_MONTH);
+ break;
+ case TimeTypeConst.TIME_TYPE_YEAR:
+ dt = toDateTime(time, COMMON_PATTERN_YEAR);
+ break;
+ default:
+ break;
+ }
+ return dt;
+ }
+
+ /**
+ * 鏍规嵁鏃堕棿绫诲瀷鎶婅繛缁殑鏃ユ湡瀛楃涓茶浆鎴愬搴旂殑鏃堕棿 锛�202303銆�20230303銆�2023030301銆�202303030101锛�
+ *
+ * @param timeType 鏃堕棿绫诲瀷
+ * @param time 鏃堕棿瀛楃涓�
+ * @return
+ */
+ public static Date getTimeByContinuousTimeCode(String timeType, String time) {
+ Date dt = null;
+ timeType = StringUtil.ifEmptyOrNullReturnValue(timeType).toUpperCase();
+ switch (timeType) {
+ case TimeTypeConst.TIME_TYPE_HOUR:
+ dt = toDateTime(time, COMMON_PATTERN_HOUR);
+ break;
+ case TimeTypeConst.TIME_TYPE_DAY:
+ dt = toDateTime(time, COMMON_PATTERN_DAY);
+ break;
+ case TimeTypeConst.TIME_TYPE_MONTH:
+ dt = toDateTime(time, COMMON_PATTERN_MONTH);
+ break;
+ case TimeTypeConst.TIME_TYPE_YEAR:
+ dt = toDateTime(time, COMMON_PATTERN_YEAR);
+ break;
+ default:
+ break;
+ }
+ return dt;
+ }
+
+ /**
+ * 鏍规嵁鏃堕棿绫诲瀷杩斿洖澶┿�佹湀銆佸勾鏈�鍚庣殑鏃堕棿
+ *
+ * @param timeType 鏃堕棿绫诲瀷
+ * @param time 鏃堕棿
+ * @return
+ */
+ public static Date getEndTimeByType(String timeType, Date time) {
+ Date dt = null;
+ switch (timeType) {
+ case TimeTypeConst.TIME_TYPE_DAY:
+ dt = DateUtil.endOfDay(time);
+ break;
+ case TimeTypeConst.TIME_TYPE_MONTH:
+ dt = DateUtil.endOfMonth(time);
+ break;
+ case TimeTypeConst.TIME_TYPE_YEAR:
+ dt = DateUtil.endOfYear(time);
+ break;
+ default:
+ break;
+ }
+ return dt;
+ }
+
+ /**
+ * 鏍规嵁鍛ㄦ湡绫诲瀷瀵圭敓浜у懆鏈熻繘琛屽姞鍑忚绠�
+ * 濉姤鍛ㄦ湡绫诲瀷锛圚OUR灏忔椂銆丏AY澶┿�丮ONTH鏈堛�乊EAR骞达級
+ *
+ * @param date 鐢熶骇鍛ㄦ湡
+ * @param cycleType 鐢熶骇鍛ㄦ湡绫诲瀷
+ * @param cycleType 鐢熶骇鍛ㄦ湡绫诲瀷
+ * @param val 璁$畻鍊�
+ * @return
+ */
+ public static Date productionCycleCal(Date date, String cycleType,int val) {
+ Date momDate = date;
+ switch (cycleType) {
+ case TimeTypeConst.TIME_TYPE_HOUR:
+ momDate = DateUtils.addHours(date, val);
+ break;
+ case TimeTypeConst.TIME_TYPE_DAY:
+ momDate = DateUtils.addDays(date, val);
+ break;
+ case TimeTypeConst.TIME_TYPE_MONTH:
+ momDate = DateUtils.addMonths(date, val);
+ break;
+ }
+ return momDate;
+ }
+
+ /**
+ * 鏍规嵁鍛ㄦ湡绫诲瀷瀵圭敓浜у懆鏈熻繘琛屽姞鍑忚绠� 骞朵笖杩涗綅 渚嬪锛� HOUR +1杩涗綅灏辨槸 鍔犱竴澶�
+ * 濉姤鍛ㄦ湡绫诲瀷锛圚OUR灏忔椂銆丏AY澶┿�丮ONTH鏈堛�乊EAR骞达級
+ *
+ * @param date 鐢熶骇鍛ㄦ湡
+ * @param cycleType 鐢熶骇鍛ㄦ湡绫诲瀷
+ * @param val 璁$畻鍊�
+ * @return
+ */
+ public static Date productionCycleCalCarry(Date date, String cycleType,int val) {
+ Date momDate = date;
+ switch (cycleType) {
+ case TimeTypeConst.TIME_TYPE_HOUR:
+ momDate = DateUtils.addDays(date, val);
+ break;
+ case TimeTypeConst.TIME_TYPE_DAY:
+ momDate = DateUtils.addMonths(date, val);
+ break;
+ case TimeTypeConst.TIME_TYPE_MONTH:
+ momDate = DateUtils.addYears(date, val);
+ break;
+ }
+ return momDate;
+ }
+}
diff --git a/zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/domain/vo/CostTrendEnergyTypeItem.java b/zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/domain/vo/CostTrendEnergyTypeItem.java
new file mode 100644
index 0000000..6ccf9a9
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/domain/vo/CostTrendEnergyTypeItem.java
@@ -0,0 +1,47 @@
+package com.zhitan.statisticalAnalysis.domain.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+
+/**
+ * 鎴愭湰瓒嬪娍-鑳芥簮绫诲瀷
+ *
+ * @Author: Zhujw
+ * @Date: 2023/2/14
+ */
+@Data
+@ApiModel(value = "鎴愭湰瓒嬪娍-鑳芥簮绫诲瀷", description = "鎴愭湰瓒嬪娍-鑳芥簮绫诲瀷")
+public class CostTrendEnergyTypeItem implements Serializable {
+
+ /**
+ * 鑳芥簮绫诲瀷
+ */
+ @ApiModelProperty(value = "鑳芥簮绫诲瀷")
+ private String energyType;
+
+ /**
+ * 鑳芥簮鍚嶇О
+ */
+ @ApiModelProperty(value = "鑳芥簮鍚嶇О")
+ private String energyName;
+
+ /**
+ * 绱Н閲�
+ */
+ @ApiModelProperty(value = "绱Н閲�")
+ @JsonFormat(shape = JsonFormat.Shape.STRING)
+ private BigDecimal accumulation;
+
+ /**
+ * 璐圭敤
+ */
+ @ApiModelProperty(value = "璐圭敤")
+ @JsonFormat(shape = JsonFormat.Shape.STRING)
+ private BigDecimal cost;
+}
\ No newline at end of file
diff --git a/zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/domain/vo/EnergyConsumeTrendDetailItem.java b/zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/domain/vo/EnergyConsumeTrendDetailItem.java
new file mode 100644
index 0000000..ccc4a25
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/domain/vo/EnergyConsumeTrendDetailItem.java
@@ -0,0 +1,83 @@
+package com.zhitan.statisticalAnalysis.domain.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+
+/**
+ * 璐圭敤鍒嗘瀽-鎴愭湰瓒嬪娍鍒嗘瀽缁熻鍥捐繑鍥炲�间俊鎭�
+ *
+ * @Author: Zhujw
+ * @Date: 2023/2/14
+*/
+@Data
+@ApiModel(value = "璐圭敤鍒嗘瀽-鎴愭湰瓒嬪娍鍒嗘瀽缁熻鍥捐繑鍥炲�间俊鎭�", description = "璐圭敤鍒嗘瀽-鎴愭湰瓒嬪娍鍒嗘瀽缁熻鍥捐繑鍥炲�间俊鎭�")
+public class EnergyConsumeTrendDetailItem {
+
+ /**
+ * 鑳芥簮绫诲瀷
+ */
+ @ApiModelProperty(value = "鑳芥簮绫诲瀷")
+ private String energyType;
+
+ /**
+ * 鑳芥簮鍗曚綅
+ */
+ @ApiModelProperty(value = "鑳芥簮鍗曚綅")
+ private String energyUnit;
+
+ /**
+ * 绱Н閲忔爣绛�
+ */
+ @ApiModelProperty(value = "绱Н閲忔爣绛�")
+ private String accumulationLabel;
+
+ /**
+ * 璐圭敤鏍囩
+ */
+ @ApiModelProperty(value = "璐圭敤鏍囩")
+ private String costLabel;
+
+ /**
+ * 绱Н閲�
+ */
+ @ApiModelProperty(value = "绱Н閲�")
+ @JsonFormat(shape = JsonFormat.Shape.STRING)
+ private BigDecimal accumulation;
+
+ /**
+ * 璐圭敤
+ */
+ @ApiModelProperty(value = "璐圭敤")
+ @JsonFormat(shape = JsonFormat.Shape.STRING)
+ private BigDecimal cost;
+
+ /**
+ * 绱Н閲弅ey闆嗗悎
+ */
+ @ApiModelProperty(value = "绱Н閲弅ey闆嗗悎")
+ private List<String> accumulationKeyList;
+
+ /**
+ * 绱Н閲弙alue闆嗗悎
+ */
+ @ApiModelProperty(value = "绱Н閲弙alue闆嗗悎")
+ private List<BigDecimal> accumulationValueList;
+
+ /**
+ * 璐圭敤key闆嗗悎
+ */
+ @ApiModelProperty(value = "璐圭敤key闆嗗悎")
+ private List<String> costKeyList;
+
+ /**
+ * 璐圭敤value闆嗗悎
+ */
+ @ApiModelProperty(value = "璐圭敤value闆嗗悎")
+ private List<BigDecimal> costValueList;
+}
diff --git a/zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/domain/vo/EnergyConsumeVO.java b/zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/domain/vo/EnergyConsumeVO.java
new file mode 100644
index 0000000..c38a70e
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/domain/vo/EnergyConsumeVO.java
@@ -0,0 +1,43 @@
+package com.zhitan.statisticalAnalysis.domain.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+
+/**
+ * 鑳借�楀疄浣撶被
+ *
+ * @Author: Zhujw
+ * @Date: 2023/1/28
+ */
+@Data
+public class EnergyConsumeVO implements Serializable {
+
+ /**
+ * 璁¢噺鍣ㄥ叿id
+ */
+ private String deviceId;
+
+ /**
+ * 鑳芥簮绫诲瀷
+ */
+ private String energyType;
+
+ /**
+ * 鏃堕棿缂栫爜
+ */
+ private Date dataTime;
+
+ /**
+ * 璐圭敤
+ */
+ private BigDecimal costValue;
+
+ /**
+ * 绱閲�
+ */
+ private BigDecimal accumulationValue;
+}
diff --git a/zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/domain/vo/EnergyCostTrendItem.java b/zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/domain/vo/EnergyCostTrendItem.java
new file mode 100644
index 0000000..2d5b8d4
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/domain/vo/EnergyCostTrendItem.java
@@ -0,0 +1,51 @@
+package com.zhitan.statisticalAnalysis.domain.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 鎴愭湰瓒嬪娍鍒嗘瀽-琛ㄦ牸淇℃伅
+ *
+ * @Author: Zhujw
+ * @Date: 2023/2/14
+ */
+@Data
+@ApiModel(value = "鎴愭湰瓒嬪娍鍒嗘瀽-琛ㄦ牸淇℃伅", description = "鎴愭湰瓒嬪娍鍒嗘瀽-琛ㄦ牸淇℃伅")
+public class EnergyCostTrendItem {
+
+ /**
+ * 鐢ㄨ兘鍗曞厓id
+ */
+ @ApiModelProperty(value = "鐢ㄨ兘鍗曞厓id")
+ private String energyUnitId;
+
+ /**
+ * 鐢ㄨ兘鍗曞厓鍚嶇О
+ */
+ @ApiModelProperty(value = "鐢ㄨ兘鍗曞厓鍚嶇О")
+ private String energyUnitName;
+
+ /**
+ * 鎬昏垂鐢�
+ */
+ @ApiModelProperty(value = "鎬昏垂鐢�")
+ @JsonFormat(shape = JsonFormat.Shape.STRING)
+ private BigDecimal total;
+
+ /**
+ * 鏃堕棿
+ */
+ @ApiModelProperty(value = "鏃堕棿")
+ private String dateCode;
+
+ /**
+ * 鑳芥簮绫诲瀷
+ */
+ @ApiModelProperty(value = "鑳芥簮绫诲瀷")
+ private List<CostTrendEnergyTypeItem> itemList;
+}
diff --git a/zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/domain/vo/EnergyCostTrendPage.java b/zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/domain/vo/EnergyCostTrendPage.java
new file mode 100644
index 0000000..a865034
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/domain/vo/EnergyCostTrendPage.java
@@ -0,0 +1,22 @@
+package com.zhitan.statisticalAnalysis.domain.vo;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @Description: TODO
+ * @author: yxw
+ * @date: 2022骞�04鏈�15鏃� 10:07
+ */
+@Data
+public class EnergyCostTrendPage {
+ /**
+ * 鏁版嵁鍒楄〃
+ */
+ private List<EnergyCostTrendItem> itemList;
+ /**
+ * 璁板綍鎬绘暟閲�
+ */
+ private long total;
+}
diff --git a/zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/service/IEnergyConsumeDataService.java b/zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/service/IEnergyConsumeDataService.java
new file mode 100644
index 0000000..e7c0174
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/service/IEnergyConsumeDataService.java
@@ -0,0 +1,35 @@
+package com.zhitan.statisticalAnalysis.service;
+
+import com.zhitan.statisticalAnalysis.domain.vo.*;
+
+import java.util.List;
+
+/**
+ * 鑳芥簮娑堣�楃粺璁$浉鍏虫煡璇�
+ */
+public interface IEnergyConsumeDataService {
+
+ /**
+ * 鎴愭湰瓒嬪娍鍒嗘瀽锛堣兘婧愭秷鑰楁垚鏈級- 鑾峰彇琛ㄦ牸鍒楄〃鏁版嵁
+ *
+ * @param pageNo 椤电爜鏁�
+ * @param pageSize 姣忛〉鏁版嵁澶氬皯
+ * @param timeCode 鏃堕棿鍊� 涓庢椂闂寸被鍨嬪搴旓細2022-03-21/2022-03/2022
+ * @param timeType 鏃堕棿绫诲瀷 DAY/MONTH/YEAR
+ * @param energyType 鑳芥簮绫诲瀷
+ * @param modelCode 妯″瀷Code
+ * @return
+ */
+ EnergyCostTrendPage listEnergyCostTrend(int pageNo, int pageSize, String timeCode, String timeType,String energyType, String modelCode);
+
+ /**
+ * 鎴愭湰瓒嬪娍鍒嗘瀽锛堣兘婧愭秷鑰楁垚鏈級
+ *
+ * @param timeCode 鏃堕棿鍊� 涓庢椂闂寸被鍨嬪搴旓細2022-03-21/2022-03/2022
+ * @param timeType 鏃堕棿绫诲瀷 DAY/MONTH/YEAR
+ * @param modelCode 妯″瀷Code
+ * @param energyType 鑳芥簮绫诲瀷
+ * @return
+ */
+ List<EnergyConsumeTrendDetailItem> listEnergyCostTrendDetail(String timeCode, String timeType, String modelCode, String energyType);
+}
diff --git a/zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/service/impl/EnergyConsumeDataServiceImpl.java b/zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/service/impl/EnergyConsumeDataServiceImpl.java
new file mode 100644
index 0000000..5819d02
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/service/impl/EnergyConsumeDataServiceImpl.java
@@ -0,0 +1,308 @@
+package com.zhitan.statisticalAnalysis.service.impl;
+
+import cn.hutool.core.date.DateUtil;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.zhitan.basicdata.domain.SysEnergy;
+import com.zhitan.basicdata.mapper.SysEnergyMapper;
+import com.zhitan.carbonemission.domain.CarbonEmission;
+import com.zhitan.common.constant.CommonConst;
+import com.zhitan.common.constant.TimeTypeConst;
+import com.zhitan.common.utils.StringUtils;
+import com.zhitan.dataitem.mapper.DataItemMapper;
+import com.zhitan.model.domain.ModelNode;
+import com.zhitan.model.domain.NodeIndex;
+import com.zhitan.model.mapper.ModelNodeMapper;
+import com.zhitan.model.mapper.NodeIndexMapper;
+import com.zhitan.peakvalley.domain.ElectricityDataItem;
+import com.zhitan.peakvalley.mapper.PeakValleyMapper;
+import com.zhitan.statisticalAnalysis.common.DateTimeUtil;
+import lombok.AllArgsConstructor;
+import org.apache.commons.lang3.ObjectUtils;
+import com.zhitan.statisticalAnalysis.domain.vo.*;
+import com.zhitan.statisticalAnalysis.service.IEnergyConsumeDataService;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @Description: TODO
+ * @author: yxw
+ * @date: 2022骞�04鏈�12鏃� 14:15
+ */
+@Service
+@AllArgsConstructor
+public class EnergyConsumeDataServiceImpl implements IEnergyConsumeDataService {
+
+ private DataItemMapper dataItemMapper;
+ private ModelNodeMapper modelNodeMapper;
+ private NodeIndexMapper nodeIndexMapper;
+ private PeakValleyMapper peakValleyMapper;
+ private SysEnergyMapper sysEnergyMapper;
+
+ /**
+ * 鎴愭湰瓒嬪娍鍒嗘瀽锛堣兘婧愭秷鑰楁垚鏈級- 鑾峰彇琛ㄦ牸鍒楄〃鏁版嵁
+ *
+ * @param pageNo 椤电爜鏁�
+ * @param pageSize 姣忛〉鏁版嵁澶氬皯
+ * @param timeCode 鏃堕棿鍊� 涓庢椂闂寸被鍨嬪搴旓細2022-03-21/2022-03/2022
+ * @param timeType 鏃堕棿绫诲瀷 DAY/MONTH/YEAR
+ * @param energyType 鑳芥簮绫诲瀷
+ * @param modelCode 妯″瀷Code
+ * @return
+ */
+ @Override
+ public EnergyCostTrendPage listEnergyCostTrend(int pageNo, int pageSize, String timeCode, String timeType, String energyType,
+ String modelCode) {
+ //鑳芥簮绫诲瀷淇℃伅
+ SysEnergy sysEnergy = new SysEnergy();
+ if (StringUtils.isNotEmpty(energyType)) {
+ sysEnergy.setEnersno(energyType);
+ }
+ List<SysEnergy> sysEnergies = sysEnergyMapper.selectSysEnergyList(sysEnergy);
+ if (sysEnergies.isEmpty()) {
+ throw new RuntimeException("鏈煡璇㈠埌鑳芥簮淇℃伅");
+ }
+ //鑺傜偣淇℃伅
+ List<ModelNode> modelNodes = modelNodeMapper.selectList(Wrappers.<ModelNode>lambdaQuery().eq(ModelNode::getModelCode, modelCode)
+ .isNull(ModelNode::getParentId));
+ if (ObjectUtils.isEmpty(modelNodes)) {
+ throw new RuntimeException("鏈煡璇㈠埌鑺傜偣淇℃伅");
+ }
+ ModelNode modelNodeInfo = modelNodes.stream().findFirst().get();
+ //鐐逛綅淇℃伅
+ List<NodeIndex> nodeIndices = nodeIndexMapper.selectList(Wrappers.<NodeIndex>lambdaQuery()
+ .eq(NodeIndex::getNodeId, modelNodeInfo.getNodeId()));
+ if (nodeIndices.isEmpty()) {
+ throw new RuntimeException("鏈煡璇㈠埌鐐逛綅淇℃伅");
+ }
+
+ // 鎬昏垂鐢�
+ BigDecimal totalCost = BigDecimal.ZERO;
+ // 閬嶅巻鑳芥簮绫诲瀷
+ List<CostTrendEnergyTypeItem> itemList = new ArrayList<>();
+ for (SysEnergy sysEnergyInfo : sysEnergies) {
+ CostTrendEnergyTypeItem item = new CostTrendEnergyTypeItem();
+ item.setEnergyType(sysEnergyInfo.getEnersno());
+ item.setEnergyName(sysEnergyInfo.getEnername());
+ // 澶勭悊鏃堕棿
+ Date bsTime = DateTimeUtil.getTime(timeType, timeCode);
+ Date endTime = DateTimeUtil.getEndTimeByType(timeType, bsTime);
+ totalCost = getEnergyUnitCostTrendAnalysisValueInfo(timeType, bsTime, endTime, totalCost, nodeIndices, modelNodeInfo.getNodeId(), sysEnergyInfo, item);
+ itemList.add(item);
+ }
+ // 閬嶅巻鐢ㄨ兘鍗曞厓鑾峰彇琛ㄦ牸涓殑鏁版嵁
+ List<EnergyCostTrendItem> trendItemList = new ArrayList<>();
+ EnergyCostTrendItem energyCostTrendItem = new EnergyCostTrendItem();
+ energyCostTrendItem.setDateCode(timeCode);
+ energyCostTrendItem.setTotal(totalCost.setScale(CommonConst.DIGIT_2, RoundingMode.HALF_UP));
+ energyCostTrendItem.setItemList(itemList);
+ trendItemList.add(energyCostTrendItem);
+
+ EnergyCostTrendPage energyCostTrendPage = new EnergyCostTrendPage();
+ energyCostTrendPage.setTotal(1);
+ energyCostTrendPage.setItemList(trendItemList);
+ return energyCostTrendPage;
+ }
+
+ /**
+ * 鑾峰彇鐢ㄨ兘鍗曞厓鎴愭湰瓒嬪娍鍒嗘瀽绱Н閲忋�佽垂鐢ㄤ俊鎭�
+ *
+ * @param timeType 鏃堕棿绫诲瀷
+ * @param bsTime 寮�濮嬫椂闂�
+ * @param endTime 缁撴潫鏃堕棿
+ * @param totalCost 鎬昏垂鐢�
+ * @param nodeIndices 鑺傜偣鐐逛綅闆嗗悎
+ * @param nodeId 鑺傜偣id
+ * @param sysEnergyInfo 鑳芥簮绫诲瀷淇℃伅
+ * @param item 杩斿洖瀵硅薄
+ * @return
+ */
+ private BigDecimal getEnergyUnitCostTrendAnalysisValueInfo(String timeType, Date bsTime, Date endTime, BigDecimal totalCost,
+ List<NodeIndex> nodeIndices, String nodeId, SysEnergy sysEnergyInfo,
+ CostTrendEnergyTypeItem item) {
+ BigDecimal costValue = BigDecimal.ZERO;
+ BigDecimal accumulationValue = BigDecimal.ZERO;
+ switch (sysEnergyInfo.getEnersno()) {
+ case "electric":
+ List<ElectricityDataItem> electricityDataItems = peakValleyMapper.getDataStatistics(nodeIndices.stream().map(NodeIndex::getIndexId).collect(Collectors.toSet()), bsTime, endTime, timeType);
+ costValue = electricityDataItems.stream().map(ElectricityDataItem::getCost).reduce(BigDecimal.ZERO, BigDecimal::add);
+ accumulationValue = electricityDataItems.stream().map(ElectricityDataItem::getElectricity).reduce(BigDecimal.ZERO, BigDecimal::add);
+ break;
+ default:
+ accumulationValue = dataItemMapper.getDataItemTimeRangeValueByNodeId(bsTime, endTime, timeType, nodeId, sysEnergyInfo.getEnersno());
+ costValue = accumulationValue.multiply(sysEnergyInfo.getPrice());
+ break;
+ }
+ costValue = costValue.setScale(CommonConst.DIGIT_2, RoundingMode.HALF_UP);
+ totalCost = totalCost.add(costValue);
+ item.setCost(costValue);
+ item.setAccumulation(accumulationValue.setScale(CommonConst.DIGIT_2, RoundingMode.HALF_UP));
+ return totalCost;
+ }
+
+ /**
+ * 鎴愭湰瓒嬪娍鍒嗘瀽锛堣兘婧愭秷鑰楁垚鏈級
+ *
+ * @param timeCode 鏃堕棿鍊� 涓庢椂闂寸被鍨嬪搴旓細2022-03-21/2022-03/2022
+ * @param timeType 鏃堕棿绫诲瀷 DAY/MONTH/YEAR
+ * @param modelCode 妯″瀷Code
+ * @param energyType 鑳芥簮绫诲瀷
+ * @return
+ */
+ @Override
+ public List<EnergyConsumeTrendDetailItem> listEnergyCostTrendDetail(String timeCode, String timeType, String modelCode, String energyType) {
+ //鑳芥簮绫诲瀷淇℃伅
+ SysEnergy sysEnergy = new SysEnergy();
+ if (StringUtils.isNotEmpty(energyType)) {
+ sysEnergy.setEnersno(energyType);
+ }
+ List<SysEnergy> sysEnergies = sysEnergyMapper.selectSysEnergyList(sysEnergy);
+ if (sysEnergies.isEmpty()) {
+ throw new RuntimeException("鏈煡璇㈠埌鑳芥簮淇℃伅");
+ }
+
+ //鑺傜偣淇℃伅
+ List<ModelNode> modelNodes = modelNodeMapper.selectList(Wrappers.<ModelNode>lambdaQuery().eq(ModelNode::getModelCode, modelCode)
+ .isNull(ModelNode::getParentId));
+ if (modelNodes.isEmpty()) {
+ throw new RuntimeException("鏈煡璇㈠埌鑺傜偣淇℃伅");
+ }
+ String nodeId = modelNodes.stream().findFirst().get().getNodeId();
+
+ // 鑳借�椾俊鎭�
+ List<EnergyConsumeTrendDetailItem> itemList = new ArrayList<>();
+ List<EnergyConsumeVO> energyConsumeVOList = new ArrayList<>();
+ Date startTime = DateTimeUtil.getTime(timeType, timeCode);
+ Date endTime = DateTimeUtil.getEndTimeByType(timeType, startTime);
+ for (SysEnergy sysEnergyInfo : sysEnergies) {
+ switch (sysEnergyInfo.getEnersno()) {
+ case "electric":
+ List<ElectricityDataItem> electricityDataItems = peakValleyMapper.getCostTrends(startTime, endTime, timeType, nodeId, sysEnergyInfo.getEnersno());
+ if (!electricityDataItems.isEmpty()) {
+ electricityDataItems.forEach(electricityDataItem -> {
+ EnergyConsumeVO temp = new EnergyConsumeVO();
+ temp.setDataTime(electricityDataItem.getDataTime());
+ temp.setCostValue(electricityDataItem.getCost());
+ temp.setAccumulationValue(electricityDataItem.getElectricity());
+ energyConsumeVOList.add(temp);
+ });
+ }
+ break;
+ default:
+ List<CarbonEmission> dataItems = dataItemMapper.getMiddleCarbonEmission(startTime, endTime, timeType, nodeId, sysEnergyInfo.getEnersno());
+ if (!dataItems.isEmpty()) {
+ dataItems.forEach(electricityDataItem -> {
+ EnergyConsumeVO temp = new EnergyConsumeVO();
+ temp.setDataTime(electricityDataItem.getDataTime());
+ temp.setCostValue(new BigDecimal(electricityDataItem.getValue()));
+ temp.setAccumulationValue(new BigDecimal(electricityDataItem.getValue()).multiply(sysEnergyInfo.getPrice()));
+ energyConsumeVOList.add(temp);
+ });
+ }
+ break;
+ }
+ BigDecimal cost = energyConsumeVOList.stream().map(EnergyConsumeVO::getCostValue)
+ .reduce(BigDecimal.ZERO, BigDecimal::add).setScale(CommonConst.DIGIT_2, RoundingMode.HALF_UP);
+ BigDecimal accumulation = energyConsumeVOList.stream().map(EnergyConsumeVO::getAccumulationValue)
+ .reduce(BigDecimal.ZERO, BigDecimal::add).setScale(CommonConst.DIGIT_2, RoundingMode.HALF_UP);
+ // 缁勮缁熻鍥句俊鎭�
+ EnergyConsumeTrendDetailItem item = new EnergyConsumeTrendDetailItem();
+ item.setEnergyType(sysEnergyInfo.getEnersno());
+ item.setEnergyUnit(sysEnergyInfo.getMuid());
+ item.setCostLabel(sysEnergyInfo.getEnername() + "璐�");
+ item.setAccumulationLabel(sysEnergyInfo.getEnername() + "鐢ㄩ噺");
+ item.setCost(cost);
+ item.setAccumulation(accumulation);
+ // 缁勮鍥捐〃淇℃伅
+ getTrendAnalysisCharInfoByEnergyType(startTime, timeType, energyConsumeVOList, item);
+ itemList.add(item);
+ }
+ return itemList;
+ }
+
+ /**
+ * 缁勮鎴愭湰瓒嬪娍鍒嗘瀽-缁熻鍥句俊鎭�
+ *
+ * @param bsTime 鏃堕棿
+ * @param timeType 鏃堕棿绫诲瀷
+ * @param dataItems 鑳借��
+ * @param item 杩斿洖瀵硅薄
+ */
+ private void getTrendAnalysisCharInfoByEnergyType(Date bsTime, String timeType,
+ List<EnergyConsumeVO> dataItems, EnergyConsumeTrendDetailItem item) {
+ List<String> costKeyList = new ArrayList<>();
+ List<String> accumulationKeyList = new ArrayList<>();
+ List<BigDecimal> costValueList = new ArrayList<>();
+ List<BigDecimal> accumulationValueList = new ArrayList<>();
+ Map<String, List<EnergyConsumeVO>> energyConsumeVOMap;
+ //鎸夋椂闂寸被鍨嬬粍缁囪繑鍥炴暟鎹�
+ switch (timeType) {
+ case TimeTypeConst.TIME_TYPE_DAY:
+ energyConsumeVOMap = dataItems.stream().collect(Collectors.groupingBy(li -> DateUtil.formatDateTime(li.getDataTime())));
+ for (int i = 0; i < CommonConst.DIGIT_24; i++) {
+ String formatDate = i + CommonConst.TIME_UNIT_SHOW_HOUR;
+ costKeyList.add(formatDate);
+ accumulationKeyList.add(formatDate);
+ String key = DateUtil.formatDateTime(DateUtil.offsetHour(bsTime, i));
+ calculateCostAndAccumulation(energyConsumeVOMap, key, costValueList, accumulationValueList);
+ }
+ break;
+ case TimeTypeConst.TIME_TYPE_MONTH:
+ energyConsumeVOMap = dataItems.stream().collect(Collectors.groupingBy(li -> DateUtil.formatDate(li.getDataTime())));
+ Date endTime = DateTimeUtil.getEndTimeByType(timeType, bsTime);
+ while (bsTime.before(endTime)) {
+ String formatDate = DateUtil.formatDate(bsTime);
+ costKeyList.add(formatDate);
+ accumulationKeyList.add(formatDate);
+ calculateCostAndAccumulation(energyConsumeVOMap, formatDate, costValueList, accumulationValueList);
+ bsTime = DateUtil.offsetDay(bsTime, CommonConst.DIGIT_1);
+ }
+ break;
+ case TimeTypeConst.TIME_TYPE_YEAR:
+ SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM");
+ energyConsumeVOMap = dataItems.stream().collect(Collectors.groupingBy(li -> formatter.format(li.getDataTime())));
+ for (int i = 0; i < CommonConst.DIGIT_12; i++) {
+ Date newDate = DateUtil.offsetMonth(bsTime, i);
+ String formatDate = DateUtil.format(newDate, DateTimeUtil.COMMON_PATTERN_TO_MONTH_ZH);
+ costKeyList.add(formatDate);
+ accumulationKeyList.add(formatDate);
+ calculateCostAndAccumulation(energyConsumeVOMap, formatDate, costValueList, accumulationValueList);
+ }
+ break;
+ default:
+ break;
+ }
+
+ item.setCostKeyList(costKeyList);
+ item.setCostValueList(costValueList);
+ item.setAccumulationKeyList(accumulationKeyList);
+ item.setAccumulationValueList(accumulationValueList);
+ }
+
+ /**
+ * 璁$畻璐圭敤鍜岀敤閲�
+ * @param energyConsumeVOMap
+ * @param formatDate
+ * @param costValueList
+ * @param accumulationValueList
+ */
+ private static void calculateCostAndAccumulation(Map<String, List<EnergyConsumeVO>> energyConsumeVOMap, String formatDate, List<BigDecimal> costValueList, List<BigDecimal> accumulationValueList) {
+ List<EnergyConsumeVO> energyConsumeList = Optional.ofNullable(energyConsumeVOMap.get(formatDate))
+ .orElse(Collections.emptyList());
+ BigDecimal totalCost = energyConsumeList.stream()
+ .map(EnergyConsumeVO::getCostValue)
+ .reduce(BigDecimal.ZERO, BigDecimal::add)
+ .setScale(CommonConst.DIGIT_2, RoundingMode.HALF_UP);
+
+ BigDecimal totalAccumulation = energyConsumeList.stream()
+ .map(EnergyConsumeVO::getAccumulationValue)
+ .reduce(BigDecimal.ZERO, BigDecimal::add)
+ .setScale(CommonConst.DIGIT_2, RoundingMode.HALF_UP);
+ costValueList.add(totalCost);
+ accumulationValueList.add(totalAccumulation);
+ }
+}
diff --git a/zhitan-system/src/main/resources/mapper/dataitem/DataItemMapper.xml b/zhitan-system/src/main/resources/mapper/dataitem/DataItemMapper.xml
index 37b928f..e06ddbe 100644
--- a/zhitan-system/src/main/resources/mapper/dataitem/DataItemMapper.xml
+++ b/zhitan-system/src/main/resources/mapper/dataitem/DataItemMapper.xml
@@ -215,4 +215,22 @@
AND ( begin_time BETWEEN #{beginTime} AND #{endTime} )
AND time_type = #{timeType}
</select>
+
+ <select id="getDataItemTimeRangeValueByNodeId" resultType="java.math.BigDecimal">
+ SELECT
+ COALESCE (SUM ( "value" ), 0)
+ FROM
+ "data_item" di
+ JOIN energy_index ei ON di.index_id = ei.index_id
+ WHERE
+ di.index_id IN ( SELECT index_id FROM node_index WHERE node_id = #{nodeId})
+ <if test="energyType !='' and energyType !=null and energyType =='allType'">
+ AND ei.energy_id != ''
+ </if>
+ <if test="energyType !='' and energyType !=null and energyType !='allType'">
+ AND ei.energy_id = #{energyType}
+ </if>
+ AND (di.data_time BETWEEN #{beginTime} AND #{endTime})
+ AND di.time_type = #{timeType}
+ </select>
</mapper>
\ No newline at end of file
diff --git a/zhitan-system/src/main/resources/mapper/peakvalley/ElectricityDataItemMapper.xml b/zhitan-system/src/main/resources/mapper/peakvalley/ElectricityDataItemMapper.xml
index 2676c7d..d478107 100644
--- a/zhitan-system/src/main/resources/mapper/peakvalley/ElectricityDataItemMapper.xml
+++ b/zhitan-system/src/main/resources/mapper/peakvalley/ElectricityDataItemMapper.xml
@@ -49,4 +49,30 @@
AND time_type = #{timeType}
</select>
+ <select id="getCostTrends"
+ resultType="com.zhitan.peakvalley.domain.ElectricityDataItem">
+ SELECT
+ di.index_code,
+ di.time_code,
+ di.electricity_type,
+ di.data_time,
+ di.electricity,
+ di.cost,
+ di.time_type,
+ di.price,
+ di.remark
+ FROM
+ "electricity_data_item" di
+ JOIN energy_index ei ON di.index_id = ei.index_id
+ WHERE
+ di.index_id IN ( SELECT index_id FROM node_index WHERE node_id = #{nodeId})
+ <if test="energyType !='' and energyType !=null and energyType =='allType'">
+ AND ei.energy_id != ''
+ </if>
+ <if test="energyType !='' and energyType !=null and energyType !='allType'">
+ AND ei.energy_id = #{energyType}
+ </if>
+ AND (di.data_time BETWEEN #{beginTime} AND #{endTime})
+ AND di.time_type = #{timeType}
+ </select>
</mapper>
\ No newline at end of file
--
Gitblit v1.9.3