From 36a9d5bf9ac0c80bf051e159635ee749b0f10d07 Mon Sep 17 00:00:00 2001
From: VVT789 <67089238+VVT789@users.noreply.github.com>
Date: 星期三, 26 三月 2025 11:24:44 +0800
Subject: [PATCH] Merge pull request #35 from Andy-Yin/develop1.0

---
 zhitan-system/src/main/java/com/zhitan/branchanalysis/service/IBranchAnalysisService.java                         |   16 +
 zhitan-system/src/main/java/com/zhitan/Itemizedenergyanalysis/domain/VO/ItemizedEnergyAnalysisVO.java             |   38 ++
 zhitan-admin/src/main/resources/application-dev.yml                                                               |    6 
 zhitan-system/src/main/java/com/zhitan/model/domain/vo/ModelNodeIndexInfor.java                                   |   42 +++
 zhitan-system/src/main/java/com/zhitan/Itemizedenergyanalysis/domain/VO/ItemizedEnergyAnalysisItemVO.java         |   85 ++++++
 zhitan-system/src/main/java/com/zhitan/branchanalysis/service/impl/BranchAnalysisServiceImpl.java                 |   91 ++++++
 sql/zhitan-ems_20250325182628.nb3                                                                                 |    0 
 zhitan-system/src/main/java/com/zhitan/Itemizedenergyanalysis/dto/ItemizedEnergyAnalysisDTO.java                  |   23 +
 zhitan-system/src/main/resources/mapper/model/ModelNodeMapper.xml                                                 |    3 
 zhitan-system/src/main/java/com/zhitan/Itemizedenergyanalysis/service/IItemizedEnergyAnalysisService.java         |   13 
 zhitan-system/src/main/java/com/zhitan/branchanalysis/domain/BranchAnalysisVO.java                                |   75 +++++
 zhitan-admin/src/main/java/com/zhitan/web/controller/branchanalysis/BranchEnergyAnalysisController.java           |   37 ++
 zhitan-system/src/main/java/com/zhitan/realtimedata/domain/dto/BranchAnalysisDTO.java                             |   17 +
 zhitan-system/src/main/java/com/zhitan/Itemizedenergyanalysis/service/impl/ItemizedEnergyAnalysisServiceImpl.java |  113 ++++++++
 zhitan-system/src/main/java/com/zhitan/branchanalysis/mapper/BranchAnalysisMapper.java                            |   26 +
 zhitan-admin/src/main/java/com/zhitan/web/controller/itemizedenergyanalysis/ItemizedEnergyAnalysisController.java |   36 ++
 zhitan-system/src/main/java/com/zhitan/model/domain/vo/ModelNodeIndexInfo.java                                    |    6 
 zhitan-system/src/main/resources/mapper/branchanalysis/BranchAnalysisMapper.xml                                   |   60 ++++
 zhitan-common/src/main/java/com/zhitan/common/utils/PropUtils.java                                                |  126 +++++++++
 19 files changed, 807 insertions(+), 6 deletions(-)

diff --git a/sql/zhitan-ems_20250325182628.nb3 b/sql/zhitan-ems_20250325182628.nb3
new file mode 100644
index 0000000..6102f1e
--- /dev/null
+++ b/sql/zhitan-ems_20250325182628.nb3
Binary files differ
diff --git a/zhitan-admin/src/main/java/com/zhitan/web/controller/branchanalysis/BranchEnergyAnalysisController.java b/zhitan-admin/src/main/java/com/zhitan/web/controller/branchanalysis/BranchEnergyAnalysisController.java
new file mode 100644
index 0000000..f6f0895
--- /dev/null
+++ b/zhitan-admin/src/main/java/com/zhitan/web/controller/branchanalysis/BranchEnergyAnalysisController.java
@@ -0,0 +1,37 @@
+package com.zhitan.web.controller.branchanalysis;
+
+import com.zhitan.branchanalysis.domain.BranchAnalysisVO;
+import com.zhitan.common.core.controller.BaseController;
+import com.zhitan.common.core.domain.AjaxResult;
+import com.zhitan.branchanalysis.service.IBranchAnalysisService;
+
+import com.zhitan.realtimedata.domain.dto.BranchAnalysisDTO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ *鏀矾鐢ㄨ兘鍒嗘瀽
+ *
+ * @author zt
+ * @date 2025-03-26
+ */
+@RestController
+@RequestMapping("/branchanalysis")
+@Api(value = "鏀矾鐢ㄨ兘鑳借�楃粺璁�",tags = {"鏀矾鐢ㄨ兘鍒嗘瀽"})
+public class BranchEnergyAnalysisController extends BaseController {
+
+    @Autowired
+    private IBranchAnalysisService branchAnalysisService;
+
+    @GetMapping("/list")
+    @ApiOperation(value = "鏀矾鐢ㄨ兘鑳借�楃粺璁″垪琛�")
+    public AjaxResult list(BranchAnalysisDTO dataItem)  {
+        BranchAnalysisVO vo = branchAnalysisService.getBranchAnalysisService(dataItem);
+        return success(vo);
+    }
+}
+
diff --git a/zhitan-admin/src/main/java/com/zhitan/web/controller/itemizedenergyanalysis/ItemizedEnergyAnalysisController.java b/zhitan-admin/src/main/java/com/zhitan/web/controller/itemizedenergyanalysis/ItemizedEnergyAnalysisController.java
new file mode 100644
index 0000000..80badb9
--- /dev/null
+++ b/zhitan-admin/src/main/java/com/zhitan/web/controller/itemizedenergyanalysis/ItemizedEnergyAnalysisController.java
@@ -0,0 +1,36 @@
+package com.zhitan.web.controller.itemizedenergyanalysis;
+
+import com.zhitan.Itemizedenergyanalysis.domain.VO.ItemizedEnergyAnalysisVO;
+import com.zhitan.Itemizedenergyanalysis.dto.ItemizedEnergyAnalysisDTO;
+import com.zhitan.Itemizedenergyanalysis.service.IItemizedEnergyAnalysisService;
+import com.zhitan.common.core.domain.AjaxResult;
+import io.swagger.annotations.Api;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import static com.zhitan.common.core.domain.AjaxResult.success;
+
+/**
+ * 鍒嗛」鐢ㄨ兘鍒嗘瀽 鎺ュ彛
+ */
+@RestController
+@RequestMapping("/itemizedEnergyAnalysis")
+@Api(value = "鍒嗛」鐢ㄨ兘鍒嗘瀽", tags = {"鍒嗛」鐢ㄨ兘鍒嗘瀽"})
+public class ItemizedEnergyAnalysisController {
+
+    @Autowired
+    private IItemizedEnergyAnalysisService itemizedEnergyAnalysisService;
+
+    /**
+     *
+     * @param dataItem
+     * @return
+     */
+    @GetMapping("/list")
+    private AjaxResult list(ItemizedEnergyAnalysisDTO dataItem) {
+        ItemizedEnergyAnalysisVO list = itemizedEnergyAnalysisService.getItemizedEnergyAnalysisService(dataItem);
+        return success(list);
+    }
+}
\ No newline at end of file
diff --git a/zhitan-admin/src/main/resources/application-dev.yml b/zhitan-admin/src/main/resources/application-dev.yml
index faa025f..29ebe27 100644
--- a/zhitan-admin/src/main/resources/application-dev.yml
+++ b/zhitan-admin/src/main/resources/application-dev.yml
@@ -6,9 +6,9 @@
     druid:
       # 涓诲簱鏁版嵁婧�
       master:
-        url: jdbc:postgresql://127.0.0.1:5432/zhitan_ems
-        username: postgres
-        password: postgres
+          url: jdbc:postgresql://127.0.0.1:5432/zhitan_ems
+          username: postgres
+          password: postgres
       # 浠庡簱鏁版嵁婧�
       slave:
         # 浠庢暟鎹簮寮�鍏�/榛樿鍏抽棴
diff --git a/zhitan-common/src/main/java/com/zhitan/common/utils/PropUtils.java b/zhitan-common/src/main/java/com/zhitan/common/utils/PropUtils.java
new file mode 100644
index 0000000..1be9af3
--- /dev/null
+++ b/zhitan-common/src/main/java/com/zhitan/common/utils/PropUtils.java
@@ -0,0 +1,126 @@
+package com.zhitan.common.utils;
+
+import com.alibaba.fastjson.JSONObject;
+import com.zhitan.common.constant.CommonConst;
+
+import java.lang.reflect.Field;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @Description: 灞炴�у�兼搷浣滃伐鍏风被
+ * @author: yxw
+ * @date: 2022骞�03鏈�07鏃� 9:57
+ */
+public class PropUtils {
+    /**
+     * 涓哄疄浣撹祴鍊�
+     *
+     * @param obj
+     * @param propName
+     * @param value
+     * @return
+     */
+    public static Object setValue(Object obj, String propName, Object value) {
+        try {
+            Field field = obj.getClass().getDeclaredField(propName);
+            field.setAccessible(true);
+            String nameTypeName = field.getType().getTypeName();
+            nameTypeName = StringUtil.ifEmptyOrNullReturnValue(nameTypeName).toLowerCase();
+            if (nameTypeName.contains("float")) {
+                float num = (float) DoubleUtil.toDouble(value);
+                field.set(obj, num);
+            } else if (nameTypeName.contains("double")) {
+                field.set(obj, DoubleUtil.toDouble(value));
+            } else if (nameTypeName.contains("bigdecimal")) {
+                BigDecimal valueOf = BigDecimal.valueOf(Double.parseDouble(String.valueOf(value)))
+                        .setScale(CommonConst.DIGIT_2, BigDecimal.ROUND_HALF_UP);
+
+                field.set(obj, valueOf);
+            } else {
+                field.set(obj, value);
+            }
+        } catch (Exception e) {
+            return null;
+        }
+        return obj;
+    }
+
+    /**
+     * 鑾峰彇瀵硅薄鐨勬寚瀹氬瓧娈电殑鍊�
+     *
+     * @param obj
+     * @param propName
+     * @return
+     */
+    public static String getPropValue(Object obj, String propName) {
+        String propValue = "";
+        try {
+            if (null != obj) {
+                JSONObject jsonObject = StringUtil.toJsonObject(obj);
+                if (!StringUtil.isEmptyOrNull(propName)) {
+                    propValue = jsonObject.getString(propName);
+                }
+            }
+        } catch (Exception e) {
+        }
+        return propValue;
+    }
+
+    /**
+     * 鑾峰彇瀵硅薄鐨勬寚瀹氬瓧娈电殑绫诲瀷
+     * 杩斿洖灞炴�х殑绫诲瀷瀛楃涓诧紙灏忓啓锛屼緥濡�:string/integer/double/date锛�
+     *
+     * @param obj      瀹炰綋
+     * @param propName 灞炴�у悕
+     * @return 锛堝皬鍐欙紝渚嬪:string/integer/double/date锛�
+     */
+    public static String getPropType(Object obj, String propName) {
+        String propType = "";
+        try {
+            if (null != obj && !StringUtil.isEmptyOrNull(propName)) {
+                Field[] fields = obj.getClass().getDeclaredFields();
+                for (Field field : fields) {
+                    String name = field.getName().toLowerCase();
+                    if (name.equals(propName.toLowerCase())) {
+                        propType = field.getType().getSimpleName().toLowerCase();
+                    }
+                }
+            }
+
+        } catch (Exception e) {
+
+        }
+        return propType;
+    }
+
+    /**
+     * 琛岃浆鍒�
+     * @param clazz 缁撴灉绫伙紝濡� UserInfo.class
+     * @param list 鏁版嵁闆�
+     * @return
+     * @param <T>
+     */
+    public static  <T> List rowToColumn(Class<T> clazz, List<T> list){
+        List<List> result;
+        Field[] fields = clazz.getDeclaredFields();
+        result = new ArrayList<>(fields.length);
+        for (int i = 0; i < fields.length; i++) {
+            result.add(new ArrayList());
+        }
+        for (T t : list) {
+            for (int i = 0; i < fields.length; i++) {
+                List l = result.get(i);
+                Field field = fields[i];
+                field.setAccessible(true);
+                try {
+                    l.add(field.get(t));
+                } catch (IllegalAccessException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        return result;
+    }
+}
diff --git a/zhitan-system/src/main/java/com/zhitan/Itemizedenergyanalysis/domain/VO/ItemizedEnergyAnalysisItemVO.java b/zhitan-system/src/main/java/com/zhitan/Itemizedenergyanalysis/domain/VO/ItemizedEnergyAnalysisItemVO.java
new file mode 100644
index 0000000..3984bb6
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/Itemizedenergyanalysis/domain/VO/ItemizedEnergyAnalysisItemVO.java
@@ -0,0 +1,85 @@
+package com.zhitan.Itemizedenergyanalysis.domain.VO;
+
+import com.zhitan.common.annotation.Excel;
+import lombok.Data;
+
+/**
+ *
+ */
+@Data
+public class ItemizedEnergyAnalysisItemVO {
+    /**
+     * 鑺傜偣id
+     */
+    private String nodeId;
+    /**
+     * 鑺傜偣鍚嶇О
+     */
+    private String nodeName;
+    /**
+     * 鍚堣
+     */
+    private Double total;
+    @Excel(name = "1鏃�/1鏃�/1鏈�")
+    private Double value0;
+    @Excel(name = "2鏃�/2鏃�/2鏈�")
+    private Double value1;
+    @Excel(name = "3鏃�/3鏃�/3鏈�")
+    private Double value2;
+    @Excel(name = "4鏃�/4鏃�/4鏈�")
+    private Double value3;
+    @Excel(name = "5鏃�/5鏃�/5鏈堟棩")
+    private Double value4;
+    @Excel(name = "6鏃�/6鏃�/6鏈堟棩")
+    private Double value5;
+    @Excel(name = "7鏃�/7鏃�/7鏈堟棩")
+    private Double value6;
+    @Excel(name = "8鏃�/8鏃�/8鏈堟棩")
+    private Double value7;
+    @Excel(name = "9鏃�/9鏃�/9鏈堟棩")
+    private Double value8;
+    @Excel(name = "10鏃�/10鏃�/10鏈堟棩")
+    private Double value9;
+    @Excel(name = "11鏃�/11鏃�/11鏈堟棩")
+    private Double value10;
+    @Excel(name = "12鏃�/12鏃�/12鏈�")
+    private Double value11;
+    @Excel(name = "13鏃�/13鏃�")
+    private Double value12;
+    @Excel(name = "14鏃�/14鏃�")
+    private Double value13;
+    @Excel(name = "15鏃�/15鏃�")
+    private Double value14;
+    @Excel(name = "16鏃�/16鏃�")
+    private Double value15;
+    @Excel(name = "17鏃�/17鏃�")
+    private Double value16;
+    @Excel(name = "18鏃�/18鏃�")
+    private Double value17;
+    @Excel(name = "19鏃�/19鏃�")
+    private Double value18;
+    @Excel(name = "20鏃�/20鏃�")
+    private Double value19;
+    @Excel(name = "21鏃�/21鏃�")
+    private Double value20;
+    @Excel(name = "22鏃�/22鏃�")
+    private Double value21;
+    @Excel(name = "23鏃�/23鏃�")
+    private Double value22;
+    @Excel(name = "24鏃�/24鏃�")
+    private Double value23;
+    @Excel(name = "25鏃�")
+    private Double value24;
+    @Excel(name = "26鏃�")
+    private Double value25;
+    @Excel(name = "27鏃�")
+    private Double value26;
+    @Excel(name = "28鏃�")
+    private Double value27;
+    @Excel(name = "29鏃�")
+    private Double value28;
+    @Excel(name = "30鏃�")
+    private Double value29;
+    @Excel(name = "31鏃�")
+    private Double value30;
+}
diff --git a/zhitan-system/src/main/java/com/zhitan/Itemizedenergyanalysis/domain/VO/ItemizedEnergyAnalysisVO.java b/zhitan-system/src/main/java/com/zhitan/Itemizedenergyanalysis/domain/VO/ItemizedEnergyAnalysisVO.java
new file mode 100644
index 0000000..1e6db62
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/Itemizedenergyanalysis/domain/VO/ItemizedEnergyAnalysisVO.java
@@ -0,0 +1,38 @@
+package com.zhitan.Itemizedenergyanalysis.domain.VO;
+
+import com.zhitan.common.annotation.Excel;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 鍒嗛」鐢ㄨ兘鍒嗘瀽杩斿洖绫�
+ *
+ * @author 寮�
+ */
+@Data
+public class ItemizedEnergyAnalysisVO {
+
+    /**
+     * 鍚堣
+     */
+    private String total;
+    /**
+     * 鏈�澶у��
+     */
+    private String max;
+    /**
+     * 鏈�灏忓��
+     */
+    private String min;
+    /**
+     * 骞冲潎鍊�
+     */
+    private String avg;
+    /**
+     * 鍗曚綅
+     */
+    private String unit;
+
+    private List<ItemizedEnergyAnalysisItemVO> dataList;
+}
diff --git a/zhitan-system/src/main/java/com/zhitan/Itemizedenergyanalysis/dto/ItemizedEnergyAnalysisDTO.java b/zhitan-system/src/main/java/com/zhitan/Itemizedenergyanalysis/dto/ItemizedEnergyAnalysisDTO.java
new file mode 100644
index 0000000..b161b87
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/Itemizedenergyanalysis/dto/ItemizedEnergyAnalysisDTO.java
@@ -0,0 +1,23 @@
+package com.zhitan.Itemizedenergyanalysis.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 鍛ㄦ湡鏁版嵁椤�.
+ */
+@Data
+public class ItemizedEnergyAnalysisDTO {
+
+  @ApiModelProperty(value = "鏃堕棿瀛楃涓�")
+  private String dataTime;
+
+  @ApiModelProperty(value = "鏃堕棿绫诲瀷")
+  private String timeType;
+
+  @ApiModelProperty(value = "鑳芥簮绫诲瀷")
+  private String energyType;
+
+  @ApiModelProperty(value = "鑺傜偣Id")
+  private String nodeId;
+}
diff --git a/zhitan-system/src/main/java/com/zhitan/Itemizedenergyanalysis/service/IItemizedEnergyAnalysisService.java b/zhitan-system/src/main/java/com/zhitan/Itemizedenergyanalysis/service/IItemizedEnergyAnalysisService.java
new file mode 100644
index 0000000..1c72f44
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/Itemizedenergyanalysis/service/IItemizedEnergyAnalysisService.java
@@ -0,0 +1,13 @@
+package com.zhitan.Itemizedenergyanalysis.service;
+
+import com.zhitan.Itemizedenergyanalysis.domain.VO.ItemizedEnergyAnalysisVO;
+import com.zhitan.Itemizedenergyanalysis.dto.ItemizedEnergyAnalysisDTO;
+
+public interface IItemizedEnergyAnalysisService {
+    /**
+     * 鍒嗛」鐢ㄨ兘鍒嗘瀽
+     * @param dto   璇锋眰鍙傛暟
+     * @return 缁撴灉
+     */
+    ItemizedEnergyAnalysisVO getItemizedEnergyAnalysisService(ItemizedEnergyAnalysisDTO dto);
+}
diff --git a/zhitan-system/src/main/java/com/zhitan/Itemizedenergyanalysis/service/impl/ItemizedEnergyAnalysisServiceImpl.java b/zhitan-system/src/main/java/com/zhitan/Itemizedenergyanalysis/service/impl/ItemizedEnergyAnalysisServiceImpl.java
new file mode 100644
index 0000000..6b8fb0d
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/Itemizedenergyanalysis/service/impl/ItemizedEnergyAnalysisServiceImpl.java
@@ -0,0 +1,113 @@
+package com.zhitan.Itemizedenergyanalysis.service.impl;
+
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.zhitan.Itemizedenergyanalysis.domain.VO.ItemizedEnergyAnalysisItemVO;
+import com.zhitan.Itemizedenergyanalysis.domain.VO.ItemizedEnergyAnalysisVO;
+import com.zhitan.Itemizedenergyanalysis.dto.ItemizedEnergyAnalysisDTO;
+import com.zhitan.Itemizedenergyanalysis.service.IItemizedEnergyAnalysisService;
+import com.zhitan.common.constant.TimeTypeConst;
+import com.zhitan.common.exception.ServiceException;
+import com.zhitan.common.utils.DateTimeUtil;
+import com.zhitan.common.utils.PropUtils;
+import com.zhitan.dataitem.service.IDataItemService;
+import com.zhitan.model.domain.vo.ModelNodeIndexInfo;
+import com.zhitan.model.mapper.ModelNodeMapper;
+import com.zhitan.realtimedata.domain.DataItem;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.*;
+import java.util.stream.Collectors;
+
+
+/**
+ * 鍒嗛」鐢ㄨ兘鍒嗘瀽
+ *
+ * @author sys
+ * @date 2025-03-25
+ */
+@Service
+@AllArgsConstructor
+public class ItemizedEnergyAnalysisServiceImpl implements IItemizedEnergyAnalysisService {
+
+    @Resource
+    private final ModelNodeMapper modelNodeMapper;
+    @Resource
+    private final IDataItemService dataItemService;
+
+    /**
+     * @param dto 璇锋眰鍙傛暟
+     * @return 缁撴灉
+     */
+    @Override
+    public ItemizedEnergyAnalysisVO getItemizedEnergyAnalysisService(ItemizedEnergyAnalysisDTO dto) {
+
+        String timeType = dto.getTimeType();
+        String dataTime = dto.getDataTime();
+        Date beginTime = DateTimeUtil.getTypeTime(timeType, dataTime);
+        DateTime endTime = null;
+
+        // 鑾峰彇鑺傜偣淇℃伅
+        List<ModelNodeIndexInfo> nodeIndexInfo = modelNodeMapper.getModelNodeIndexIdByNodeId(dto.getNodeId(), dto.getEnergyType());
+        List<String> indexList = nodeIndexInfo.stream().map(ModelNodeIndexInfo::getIndexId).collect(Collectors.toList());
+
+        if(ObjectUtil.isEmpty(indexList)){
+            return new ItemizedEnergyAnalysisVO();
+        }
+
+        ModelNodeIndexInfo info = nodeIndexInfo.stream().findFirst().get();
+
+        // 鏍规嵁鏃堕棿绫诲瀷璋冩暣鏃堕棿鑼冨洿
+        switch (dto.getTimeType()) {
+            case TimeTypeConst.TIME_TYPE_DAY:
+                timeType = TimeTypeConst.TIME_TYPE_HOUR;
+                endTime = DateUtil.endOfDay(beginTime);
+                break;
+            case TimeTypeConst.TIME_TYPE_MONTH:
+                timeType = TimeTypeConst.TIME_TYPE_DAY;
+                endTime = DateUtil.endOfMonth(beginTime);
+                break;
+            case TimeTypeConst.TIME_TYPE_YEAR:
+                timeType = TimeTypeConst.TIME_TYPE_MONTH;
+                endTime = DateUtil.endOfYear(beginTime);
+                break;
+            default:
+                throw new ServiceException("鏃堕棿鏍煎紡閿欒");
+        }
+        // 鑾峰彇鏁版嵁椤瑰垪琛�
+        List<DataItem> dataItemList = dataItemService.getDataItemTimeRangeInforByIndexIds(beginTime, endTime, timeType, indexList);
+
+        // 鑾峰彇鏈�澶у�笺�佹渶灏忓�笺�佸悎璁°�佸钩鍧囧��
+        ItemizedEnergyAnalysisVO vo = new ItemizedEnergyAnalysisVO();
+        double sum = dataItemList.stream().mapToDouble(DataItem::getValue).sum();
+        double max = dataItemList.stream().mapToDouble(DataItem::getValue).max().getAsDouble();
+        double min = dataItemList.stream().mapToDouble(DataItem::getValue).min().getAsDouble();
+        double avg = dataItemList.stream().mapToDouble(DataItem::getValue).average().getAsDouble();
+
+        vo.setTotal(BigDecimal.valueOf(sum).setScale(2, RoundingMode.HALF_UP).toString());
+        vo.setMax(BigDecimal.valueOf(max).setScale(2, RoundingMode.HALF_UP).toString());
+        vo.setMin(BigDecimal.valueOf(min).setScale(2, RoundingMode.HALF_UP).toString());
+        vo.setAvg(BigDecimal.valueOf(avg).setScale(2, RoundingMode.HALF_UP).toString());
+        if(ObjectUtil.isNotEmpty(info.getUnitId())){
+            vo.setUnit(info.getUnitId());
+        }
+
+        List<ItemizedEnergyAnalysisItemVO> voList = new ArrayList<>();
+        ItemizedEnergyAnalysisItemVO itemVO = new ItemizedEnergyAnalysisItemVO();
+        itemVO.setNodeId(info.getNodeId());
+        itemVO.setNodeName(info.getName());
+        itemVO.setTotal(sum);
+        for (int i = 0; i < dataItemList.size(); i++) {
+            PropUtils.setValue(itemVO,"value"+ i, dataItemList.get(i).getValue());
+        }
+        voList.add(itemVO);
+        vo.setDataList(voList);
+
+        return vo;
+    }
+}
diff --git a/zhitan-system/src/main/java/com/zhitan/branchanalysis/domain/BranchAnalysisVO.java b/zhitan-system/src/main/java/com/zhitan/branchanalysis/domain/BranchAnalysisVO.java
new file mode 100644
index 0000000..d92116d
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/branchanalysis/domain/BranchAnalysisVO.java
@@ -0,0 +1,75 @@
+package com.zhitan.branchanalysis.domain;
+import com.zhitan.common.annotation.Excel;
+import lombok.Data;
+
+@Data
+public class BranchAnalysisVO {
+    private String until;
+    private double total;
+    @Excel(name = "鑺傜偣id")
+    private String nodeId;
+    @Excel(name = "瀛楄妭鍚嶇О")
+    private String nodeName;
+    @Excel(name = "1鏃�/1鏃�/1鏈�")
+    private Double value0;
+    @Excel(name = "2鏃�/2鏃�/2鏈�")
+    private Double value1;
+    @Excel(name = "3鏃�/3鏃�/3鏈�")
+    private Double value2;
+    @Excel(name = "4鏃�/4鏃�/4鏈�")
+    private Double value3;
+    @Excel(name = "5鏃�/5鏃�/5鏈�")
+    private Double value4;
+    @Excel(name = "6鏃�/6鏃�/6鏈�")
+    private Double value5;
+    @Excel(name = "7鏃�/7鏃�/7鏈�")
+    private Double value6;
+    @Excel(name = "8鏃�/8鏃�/8鏈�")
+    private Double value7;
+    @Excel(name = "9鏃�/9鏃�/9鏈�")
+    private Double value8;
+    @Excel(name = "10鏃�/10鏃�/10鏈�")
+    private Double value9;
+    @Excel(name = "11鏃�/11鏃�/11鏈�")
+    private Double value10;
+    @Excel(name = "12鏃�/12鏃�/12鏈�")
+    private Double value11;
+    @Excel(name = "13鏃�/13鏃�")
+    private Double value12;
+    @Excel(name = "14鏃�/14鏃�")
+    private Double value13;
+    @Excel(name = "15鏃�/15鏃�")
+    private Double value14;
+    @Excel(name = "16鏃�/16鏃�")
+    private Double value15;
+    @Excel(name = "17鏃�/17鏃�")
+    private Double value16;
+    @Excel(name = "18鏃�18鏃�")
+    private Double value17;
+    @Excel(name = "19鏃�/19鏃�")
+    private Double value18;
+    @Excel(name = "20鏃�/20鏃�")
+    private Double value19;
+    @Excel(name = "21鏃�/21鏃�")
+    private Double value20;
+    @Excel(name = "22鏃�/22鏃�")
+    private Double value21;
+    @Excel(name = "23鏃�/23鏃�")
+    private Double value22;
+    @Excel(name = "24鏃�/24鏃�")
+    private Double value23;
+    @Excel(name = "25鏃�")
+    private Double value24;
+    @Excel(name = "26鏃�")
+    private Double value25;
+    @Excel(name = "27鏃�")
+    private Double value26;
+    @Excel(name = "28鏃�")
+    private Double value27;
+    @Excel(name = "29鏃�")
+    private Double value28;
+    @Excel(name = "30鏃�")
+    private Double value29;
+    @Excel(name = "31鏃�")
+    private Double value30;
+}
diff --git a/zhitan-system/src/main/java/com/zhitan/branchanalysis/mapper/BranchAnalysisMapper.java b/zhitan-system/src/main/java/com/zhitan/branchanalysis/mapper/BranchAnalysisMapper.java
new file mode 100644
index 0000000..d6d482d
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/branchanalysis/mapper/BranchAnalysisMapper.java
@@ -0,0 +1,26 @@
+package com.zhitan.branchanalysis.mapper;
+
+import com.zhitan.branchanalysis.domain.BranchAnalysisVO;
+import com.zhitan.common.utils.TypeTime;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ *鏀矾鐢ㄨ兘鍒嗘瀽
+ *
+ * @author sys
+ * @date 2021-01-11
+ */
+public interface BranchAnalysisMapper {
+    public List<BranchAnalysisVO> getBranchAnalysisList(@Param("indexIds") List<String> indexIds,
+                                                        @Param("dataList") List<TypeTime> dataList,
+                                                        @Param("beginTime") Date beginTime,
+                                                        @Param("endTime") Date endTime,
+                                                        @Param("timeType") String timeType,
+                                                        @Param("indexStorageId") String indexStorageId);
+
+
+}
+
diff --git a/zhitan-system/src/main/java/com/zhitan/branchanalysis/service/IBranchAnalysisService.java b/zhitan-system/src/main/java/com/zhitan/branchanalysis/service/IBranchAnalysisService.java
new file mode 100644
index 0000000..d5d04c3
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/branchanalysis/service/IBranchAnalysisService.java
@@ -0,0 +1,16 @@
+package com.zhitan.branchanalysis.service;
+
+
+import com.zhitan.branchanalysis.domain.BranchAnalysisVO;
+import com.zhitan.realtimedata.domain.dto.BranchAnalysisDTO;
+
+
+public interface IBranchAnalysisService {
+    /**
+     * 鏀矾鐢ㄨ兘鍒嗘瀽
+     *
+     * @author sys
+     * @date 2021-01-11
+     */
+    BranchAnalysisVO getBranchAnalysisService(BranchAnalysisDTO dataItem);
+}
diff --git a/zhitan-system/src/main/java/com/zhitan/branchanalysis/service/impl/BranchAnalysisServiceImpl.java b/zhitan-system/src/main/java/com/zhitan/branchanalysis/service/impl/BranchAnalysisServiceImpl.java
new file mode 100644
index 0000000..443fc99
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/branchanalysis/service/impl/BranchAnalysisServiceImpl.java
@@ -0,0 +1,91 @@
+package com.zhitan.branchanalysis.service.impl;
+
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.zhitan.branchanalysis.domain.BranchAnalysisVO;
+import com.zhitan.common.constant.TimeTypeConst;
+import com.zhitan.common.exception.ServiceException;
+import com.zhitan.common.utils.DateTimeUtil;
+import com.zhitan.branchanalysis.service.IBranchAnalysisService;
+import com.zhitan.common.utils.PropUtils;
+import com.zhitan.dataitem.mapper.DataItemMapper;
+import com.zhitan.model.domain.vo.ModelNodeIndexInfo;
+import com.zhitan.model.domain.vo.ModelNodeIndexInfor;
+import com.zhitan.model.mapper.ModelNodeMapper;
+import com.zhitan.realtimedata.domain.DataItem;
+import com.zhitan.realtimedata.domain.dto.BranchAnalysisDTO;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * c
+ *
+ * @author sys
+ * @date 2021-01-11
+ */
+@Service
+@AllArgsConstructor
+public class BranchAnalysisServiceImpl implements IBranchAnalysisService {
+
+    private ModelNodeMapper modelNodeMapper;
+    private DataItemMapper dataItemMapper;
+
+    @Override
+    public BranchAnalysisVO getBranchAnalysisService(BranchAnalysisDTO dto) {
+        String timeType = dto.getTimeType();
+        String dataTime = dto.getDataTime();
+        Date beginTime = DateTimeUtil.getTypeTime(timeType, dataTime);
+        DateTime endTime = null;
+
+        List<ModelNodeIndexInfo> nodeIndexInfo = modelNodeMapper.getModelNodeIndexIdByNodeId(dto.getNodeId(), dto.getEnergyType());
+        List<String> indexlist = nodeIndexInfo.stream().map(ModelNodeIndexInfo::getIndexId).collect(Collectors.toList());
+
+        if (ObjectUtil.isEmpty(indexlist)) {
+            return new BranchAnalysisVO();
+        }
+
+        ModelNodeIndexInfo info = nodeIndexInfo.stream().findFirst().get();
+
+        //鏍规嵁鏃堕棿绫诲瀷璋冩暣鏃堕棿鑼冨洿
+        switch (dto.getTimeType()) {
+            case TimeTypeConst.TIME_TYPE_DAY:
+                timeType = TimeTypeConst.TIME_TYPE_HOUR;
+                endTime = DateUtil.endOfDay(beginTime);
+                break;
+            case TimeTypeConst.TIME_TYPE_MONTH:
+                timeType = TimeTypeConst.TIME_TYPE_DAY;
+                endTime = DateUtil.endOfMonth(beginTime);
+                break;
+            case TimeTypeConst.TIME_TYPE_YEAR:
+                timeType = TimeTypeConst.TIME_TYPE_MONTH;
+                endTime = DateUtil.endOfYear(beginTime);
+                break;
+            default:
+                throw new ServiceException("鏃堕棿鏍煎紡閿欒");
+        }
+        //鑾峰彇鏁版嵁椤瑰垪琛�
+        List<DataItem> dataItemlist = dataItemMapper.getDataItemTimeRangeInforByIndexIds(beginTime, endTime, timeType, indexlist);
+
+        BranchAnalysisVO vo = new BranchAnalysisVO();
+        double sum = dataItemlist.stream().mapToDouble(DataItem::getValue).sum();
+        vo.setTotal(sum);
+        if (ObjectUtil.isNotEmpty(info.getIndexId())) {
+            vo.setUntil(info.getUnitId());
+        }
+
+        vo.setNodeId(info.getNodeId());
+        vo.setNodeName(info.getName());
+        for (int i = 0; i < dataItemlist.size(); i++) {
+            PropUtils.setValue(vo, "value" + i, dataItemlist.get(i).getValue());
+        }
+
+        return vo;
+
+
+    }
+}
diff --git a/zhitan-system/src/main/java/com/zhitan/model/domain/vo/ModelNodeIndexInfo.java b/zhitan-system/src/main/java/com/zhitan/model/domain/vo/ModelNodeIndexInfo.java
index a99de97..cd2b19c 100644
--- a/zhitan-system/src/main/java/com/zhitan/model/domain/vo/ModelNodeIndexInfo.java
+++ b/zhitan-system/src/main/java/com/zhitan/model/domain/vo/ModelNodeIndexInfo.java
@@ -38,7 +38,6 @@
      * 鍚嶇О
      */
     private String nodeName;
-
     /**
      * 鐐逛綅id
      */
@@ -60,5 +59,8 @@
      * 鐐逛綅绫诲瀷
      */
     private String indexType;
-
+    /**
+     * 鍗曚綅
+     */
+    private String unitId;
 }
diff --git a/zhitan-system/src/main/java/com/zhitan/model/domain/vo/ModelNodeIndexInfor.java b/zhitan-system/src/main/java/com/zhitan/model/domain/vo/ModelNodeIndexInfor.java
new file mode 100644
index 0000000..a4c0de4
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/model/domain/vo/ModelNodeIndexInfor.java
@@ -0,0 +1,42 @@
+package com.zhitan.model.domain.vo;
+
+
+import com.zhitan.common.core.domain.BaseEntity;
+import lombok.Data;
+
+/**
+ * 妯″瀷鑺傜偣涓庣偣浣嶅叧绯诲璞�
+ *
+ * @Author: Zhujw
+ * @Date: 2023/3/2
+ */
+@Data
+public class ModelNodeIndexInfor extends BaseEntity {
+  private static final long serialVersionUID = 1L;
+
+  /**
+   * 涓婚敭
+   */
+  private String nodeId;
+
+  /**
+   * 鍚嶇О
+   */
+  private String name;
+
+  /**
+   * 鐐逛綅id
+   */
+  private String indexId;
+  
+  /**
+   * 鑳芥簮绫诲瀷
+   */
+  private String energyId;
+
+  private String indexType;
+  /**
+   * 鍗曚綅
+   */
+  private String unitId;
+}
diff --git a/zhitan-system/src/main/java/com/zhitan/realtimedata/domain/dto/BranchAnalysisDTO.java b/zhitan-system/src/main/java/com/zhitan/realtimedata/domain/dto/BranchAnalysisDTO.java
new file mode 100644
index 0000000..cdb93b7
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/realtimedata/domain/dto/BranchAnalysisDTO.java
@@ -0,0 +1,17 @@
+package com.zhitan.realtimedata.domain.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+@Data
+public class BranchAnalysisDTO {
+
+
+    @ApiModelProperty(value="鑺傜偣id")
+    private String nodeId;
+    @ApiModelProperty(value ="鏃堕棿瀛楃涓�")
+    private String dataTime;
+    @ApiModelProperty(value ="鏃堕棿绫诲瀷")
+    private String timeType;
+    @ApiModelProperty(value = "鑳芥簮绫诲瀷")
+    private String energyType;
+}
diff --git a/zhitan-system/src/main/resources/mapper/branchanalysis/BranchAnalysisMapper.xml b/zhitan-system/src/main/resources/mapper/branchanalysis/BranchAnalysisMapper.xml
new file mode 100644
index 0000000..db0ed23
--- /dev/null
+++ b/zhitan-system/src/main/resources/mapper/branchanalysis/BranchAnalysisMapper.xml
@@ -0,0 +1,60 @@
+<?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.branchanalysis.mapper.BranchAnalysisMapper">
+    <resultMap id="dataItemMap" type="com.zhitan.branchanalysis.domain.BranchAnalysisVO">
+        <result column="index_id" property="indexId"/>
+        <result column="index_name" property="indexName"/>
+        <result column="time_type" property="timeType"/>
+        <result column="time_code" property="timeCode"/>
+        <result column="unit_id" property="unitId"/>
+        <result column="value1" property="value1"/>
+        <result column="value2" property="value2"/>
+        <result column="value3" property="value3"/>
+        <result column="value4" property="value4"/>
+        <result column="value5" property="value5"/>
+        <result column="value6" property="value6"/>
+        <result column="value7" property="value7"/>
+        <result column="value8" property="value8"/>
+        <result column="value9" property="value9"/>
+        <result column="value10" property="value10"/>
+        <result column="value11" property="value11"/>
+        <result column="value12" property="value12"/>
+    </resultMap>
+    <!--鍏ㄥ巶鑳借�楃粺璁�-->
+    <select id="getBranchAnalysisList" resultMap="dataItemMap">
+        SELECT
+        aa.index_id,
+        aa.index_name,
+        <foreach item="item" index="index" collection="dataList">
+            MAX ( CASE WHEN data_time = #{item.dateTime} THEN "value" END ) AS ${item.value},
+        </foreach>
+        aa.time_type
+        FROM
+        (
+        SELECT
+        ci.index_id,
+        ci.NAME AS "index_name",
+        di."value",
+        di.data_time,
+        di.time_type
+        FROM
+        data_item di LEFT JOIN energy_index ci ON di.index_id = ci.index_id
+        LEFT JOIN facility_archives f ON f."id"=ci.equipment
+        WHERE
+        di.data_time &gt;= #{beginTime}
+        AND di.data_time &lt; #{endTime}
+        AND di.index_id IN
+        <foreach item="indexId" index="index" collection="indexIds" open="(" separator="," close=")">
+            #{indexId}
+        </foreach>
+        AND di.time_type = #{timeType}
+        <if test="indexStorageId !='' and indexStorageId !=null">
+            and ci.energy_id=#{indexStorageId}
+        </if>
+        ) aa
+        GROUP BY
+        aa.index_id,aa.index_name,aa.time_type
+    </select>
+</mapper>
diff --git a/zhitan-system/src/main/resources/mapper/model/ModelNodeMapper.xml b/zhitan-system/src/main/resources/mapper/model/ModelNodeMapper.xml
index ab63dde..eb7fbde 100644
--- a/zhitan-system/src/main/resources/mapper/model/ModelNodeMapper.xml
+++ b/zhitan-system/src/main/resources/mapper/model/ModelNodeMapper.xml
@@ -385,7 +385,8 @@
         mn."name" "name",
         ni.index_id indexId,
         ei.energy_id energyId,
-        ei.index_type indexType
+        ei.index_type indexType,
+        ei.unit_id unitId
         FROM "model_node" mn
         LEFT JOIN "node_index" ni ON mn.node_id = ni.node_id
         LEFT JOIN energy_index ei on ni.index_id = ei.index_id

--
Gitblit v1.9.3