From 78382199e35d37b9ec348522c9faac81d80d3ade Mon Sep 17 00:00:00 2001
From: DYL <Dn1332079466>
Date: 星期一, 10 二月 2025 19:33:49 +0800
Subject: [PATCH] 能源流向分析

---
 zhitan-system/src/main/resources/mapper/model/NodeIndexMapper.xml                                      |   10 +
 zhitan-system/src/main/java/com/zhitan/model/mapper/ModelNodeMapper.java                               |   19 +
 zhitan-system/src/main/java/com/zhitan/dataitem/mapper/DataItemMapper.java                             |    3 
 zhitan-system/src/main/java/com/zhitan/dataitem/service/impl/DataItemServiceImpl.java                  |  139 +++++++++++++
 zhitan-system/src/main/resources/mapper/model/ModelNodeMapper.xml                                      |  103 +++++++---
 zhitan-system/src/main/java/com/zhitan/model/domain/NodeIndex.java                                     |   26 ++
 zhitan-system/src/main/java/com/zhitan/dataitem/service/IDataItemService.java                          |   10 +
 zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/domain/vo/FlowChartsVO.java                 |   68 ++++++
 zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/domain/vo/FlowChartsItemVO.java             |   34 +++
 zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/domain/dto/FlowChartsDTO.java               |   57 +++++
 zhitan-system/src/main/java/com/zhitan/model/mapper/NodeIndexMapper.java                               |   15 +
 zhitan-system/src/main/java/com/zhitan/dataitem/domain/vo/NodeIndexValueVO.java                        |   32 +++
 zhitan-admin/src/main/java/com/zhitan/web/controller/statisticalAnalysis/EnergyDataItemController.java |   39 +++
 zhitan-admin/src/main/resources/application.yml                                                        |    2 
 14 files changed, 520 insertions(+), 37 deletions(-)

diff --git a/zhitan-admin/src/main/java/com/zhitan/web/controller/statisticalAnalysis/EnergyDataItemController.java b/zhitan-admin/src/main/java/com/zhitan/web/controller/statisticalAnalysis/EnergyDataItemController.java
new file mode 100644
index 0000000..af79e0b
--- /dev/null
+++ b/zhitan-admin/src/main/java/com/zhitan/web/controller/statisticalAnalysis/EnergyDataItemController.java
@@ -0,0 +1,39 @@
+package com.zhitan.web.controller.statisticalAnalysis;
+
+import com.zhitan.common.annotation.Log;
+import com.zhitan.common.core.domain.AjaxResult;
+import com.zhitan.dataitem.service.IDataItemService;
+import com.zhitan.statisticalAnalysis.domain.dto.FlowChartsDTO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+
+/**
+ * 鑳借�楃粺璁″垎鏋�
+ */
+@Api(tags = "鑳借�楃粺璁″垎鏋�")
+@RestController
+@RequestMapping("/statisticsAnalysis")
+public class EnergyDataItemController {
+
+    @Autowired
+    private IDataItemService dataItemService;
+
+    /**
+     * 鑾峰彇鑳芥祦鍥惧舰鍒嗘瀽
+     *
+     * @param dto 璇锋眰鍙傛暟
+     * @return 缁撴灉
+     */
+    @Log(title = "鑾峰彇鑳芥祦鍥惧舰鍒嗘瀽")
+    @ApiOperation(value = "鑾峰彇鑳芥祦鍥惧舰鍒嗘瀽", notes = "鑾峰彇鑳芥祦鍥惧舰鍒嗘瀽")
+    @GetMapping(value = "/getFlowCharts")
+    public AjaxResult getFlowCharts(@Validated FlowChartsDTO dto) {
+        return AjaxResult.success(dataItemService.getFlowCharts(dto));
+    }
+}
diff --git a/zhitan-admin/src/main/resources/application.yml b/zhitan-admin/src/main/resources/application.yml
index b766372..86eed19 100644
--- a/zhitan-admin/src/main/resources/application.yml
+++ b/zhitan-admin/src/main/resources/application.yml
@@ -11,6 +11,8 @@
   addressEnabled: true
   # 楠岃瘉鐮佺被鍨� math 鏁板瓧璁$畻 char 瀛楃楠岃瘉
   captchaType: math
+  # 鍩熷悕鍦板潃
+  domainName: https://demo-ems.zhitancloud.com/prod-api
 
 # 寮�鍙戠幆澧冮厤缃�
 server:
diff --git a/zhitan-system/src/main/java/com/zhitan/dataitem/domain/vo/NodeIndexValueVO.java b/zhitan-system/src/main/java/com/zhitan/dataitem/domain/vo/NodeIndexValueVO.java
new file mode 100644
index 0000000..33560fa
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/dataitem/domain/vo/NodeIndexValueVO.java
@@ -0,0 +1,32 @@
+package com.zhitan.dataitem.domain.vo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @Author DYL
+ **/
+@Data
+public class NodeIndexValueVO {
+
+    /**
+     * 鑺傜偣id
+     */
+    private String nodeId;
+
+    /**
+     * 鑺傜偣鍚嶇О
+     */
+    private String nodeName;
+
+    /**
+     * 鐐逛綅id
+     */
+    private String indexId;
+
+    /**
+     * 绱Н閲�
+     */
+    private BigDecimal value;
+}
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 2f6d9ab..94f00fe 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
@@ -1,5 +1,6 @@
 package com.zhitan.dataitem.mapper;
 
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.zhitan.carbonemission.domain.CarbonEmission;
 import com.zhitan.common.enums.TimeType;
 import com.zhitan.dataitem.domain.StagseDataEntry;
@@ -16,7 +17,7 @@
  * @author sys
  * @date 2020-03-25
  */
-public interface DataItemMapper {
+public interface DataItemMapper extends BaseMapper<DataItem> {
     /**
      * 闃舵鏁版嵁褰曞叆
      *
diff --git a/zhitan-system/src/main/java/com/zhitan/dataitem/service/IDataItemService.java b/zhitan-system/src/main/java/com/zhitan/dataitem/service/IDataItemService.java
index 993beb7..99c2a1c 100644
--- a/zhitan-system/src/main/java/com/zhitan/dataitem/service/IDataItemService.java
+++ b/zhitan-system/src/main/java/com/zhitan/dataitem/service/IDataItemService.java
@@ -4,6 +4,8 @@
 import com.zhitan.common.enums.TimeType;
 import com.zhitan.dataitem.domain.StagseDataEntry;
 import com.zhitan.realtimedata.domain.DataItem;
+import com.zhitan.statisticalAnalysis.domain.dto.FlowChartsDTO;
+import com.zhitan.statisticalAnalysis.domain.vo.FlowChartsVO;
 
 import java.math.BigDecimal;
 import java.util.Date;
@@ -88,4 +90,12 @@
      * @return
      */
     List<DataItem> getDataItemHourInforByIndexIds(Date beginTime, Date endTime, String timeType, List<String> indexIds);
+
+    /**
+     * 鑾峰彇鑳芥祦鍥惧舰鍒嗘瀽
+     *
+     * @param dto 璇锋眰鍙傛暟
+     * @return 缁撴灉
+     */
+    FlowChartsVO getFlowCharts(FlowChartsDTO dto);
 }
diff --git a/zhitan-system/src/main/java/com/zhitan/dataitem/service/impl/DataItemServiceImpl.java b/zhitan-system/src/main/java/com/zhitan/dataitem/service/impl/DataItemServiceImpl.java
index 1e29b7f..2f95c17 100644
--- a/zhitan-system/src/main/java/com/zhitan/dataitem/service/impl/DataItemServiceImpl.java
+++ b/zhitan-system/src/main/java/com/zhitan/dataitem/service/impl/DataItemServiceImpl.java
@@ -2,15 +2,29 @@
 
 import com.zhitan.common.enums.TimeType;
 import com.zhitan.dataitem.domain.StagseDataEntry;
+import com.zhitan.dataitem.domain.vo.NodeIndexValueVO;
 import com.zhitan.dataitem.mapper.DataItemMapper;
 import com.zhitan.dataitem.service.IDataItemService;
+import com.zhitan.model.domain.ModelNode;
+import com.zhitan.model.mapper.EnergyIndexMapper;
+import com.zhitan.model.mapper.ModelNodeMapper;
+import com.zhitan.model.mapper.NodeIndexMapper;
 import com.zhitan.realtimedata.domain.DataItem;
+import com.zhitan.statisticalAnalysis.domain.dto.FlowChartsDTO;
+import com.zhitan.statisticalAnalysis.domain.vo.FlowChartsItemVO;
+import com.zhitan.statisticalAnalysis.domain.vo.FlowChartsVO;
 import lombok.AllArgsConstructor;
+import org.apache.commons.lang3.ObjectUtils;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.Resource;
 import java.math.BigDecimal;
-import java.util.Date;
-import java.util.List;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.temporal.TemporalAdjusters;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * stagseDataEntryService涓氬姟灞傚鐞�
@@ -22,7 +36,14 @@
 @AllArgsConstructor
 public class DataItemServiceImpl implements IDataItemService {
 
-    private final DataItemMapper dataItemMapper;
+    @Resource
+    private DataItemMapper dataItemMapper;
+    @Resource
+    private ModelNodeMapper modelNodeMapper;
+    @Resource
+    private EnergyIndexMapper energyIndexMapper;
+    @Resource
+    private NodeIndexMapper nodeIndexMapper;
 
 
     /**
@@ -117,4 +138,116 @@
     public List<DataItem> getDataItemHourInforByIndexIds(Date beginTime, Date endTime, String timeType, List<String> indexIds) {
         return dataItemMapper.getDataItemHourInforByIndexIds(beginTime, endTime, timeType, indexIds);
     }
+
+    /**
+     * 鑾峰彇鑳芥祦鍥惧舰鍒嗘瀽
+     *
+     * @param dto 璇锋眰鍙傛暟
+     * @return 缁撴灉
+     */
+    @Override
+    public FlowChartsVO getFlowCharts(FlowChartsDTO dto) {
+        FlowChartsVO flowChartsVO = new FlowChartsVO();
+        // 鐖惰妭鐐筰d
+        String nodeId = dto.getNodeId();
+        String energyType = dto.getEnergyType();
+        LocalDate queryTime = dto.getQueryTime();
+        TimeType timeType = dto.getTimeType();
+
+        // 鑾峰彇鑺傜偣淇℃伅
+        ModelNode modelNode = modelNodeMapper.selectModelNodeById(nodeId);
+        if (ObjectUtils.isEmpty(modelNode)) {
+            return flowChartsVO;
+        }
+        // 鑾峰彇鏌ヨ鏃堕棿
+        Map<String, LocalDateTime> dateTimeMap = getDataItemByIndexId(timeType, queryTime);
+
+        // 鑾峰彇鑺傜偣鍜岀偣浣嶇殑绱Н閲�
+        List<NodeIndexValueVO> parentDataItemList = modelNodeMapper.getDataItemByNodeId(nodeId, energyType, timeType, dateTimeMap);
+
+        // 鑾峰彇瀛愯妭鐐逛笅鐨勭偣浣嶇殑绱Н閲�
+        List<NodeIndexValueVO> childDataItemList = modelNodeMapper.getDataItemByParentNodeId(nodeId, energyType, timeType, dateTimeMap);
+
+        // 鑾峰彇鐖惰妭鐐逛笅鐨勮兘鑰楁暟鎹�诲拰
+        if (ObjectUtils.isNotEmpty(parentDataItemList)) {
+            // 鐖惰妭鐐逛笅鐨勮兘鑰楁暟鎹�诲拰
+            BigDecimal totalValue = parentDataItemList.stream().map(NodeIndexValueVO::getValue)
+                    .filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+            // 鎬荤疮绉噺
+            flowChartsVO.setTotalAccumulatedAmount(totalValue);
+        }
+        // 鑾峰彇瀛愯妭鐐逛笅鐨勮兘鑰楁暟鎹�
+        if (ObjectUtils.isNotEmpty(childDataItemList)) {
+            // 瀛愯妭鐐逛笅鐨勮兘鑰楁暟鎹�诲拰
+            BigDecimal childTotalValue = childDataItemList.stream().map(NodeIndexValueVO::getValue)
+                    .filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+            // 瀛愯妭鐐圭疮绉噺
+            flowChartsVO.setChildNodeAccumulatedAmount(childTotalValue);
+
+            // 鏍规嵁瀛愯妭鐐筰d鍒嗙粍
+            Map<String, List<NodeIndexValueVO>> voMap = childDataItemList.stream()
+                    .collect(Collectors.groupingBy(NodeIndexValueVO::getNodeId));
+            List<FlowChartsItemVO> itemList = new ArrayList<>();
+
+            for (String childNodeId : voMap.keySet()) {
+                FlowChartsItemVO vo = new FlowChartsItemVO();
+                vo.setSource(modelNode.getName());
+                List<NodeIndexValueVO> valueList = voMap.getOrDefault(childNodeId, Collections.emptyList());
+                if (ObjectUtils.isNotEmpty(valueList)) {
+                    // 鍚勪釜瀛愯妭鐐圭殑鑳借�楁暟鎹�诲拰
+                    BigDecimal value = valueList.stream().map(NodeIndexValueVO::getValue)
+                            .filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+                    valueList.stream().findFirst().ifPresent(nodeIndexValueVO -> vo.setTarget(nodeIndexValueVO.getNodeName()));
+                    vo.setValue(value);
+                }
+                itemList.add(vo);
+            }
+            flowChartsVO.setItemVOList(itemList);
+        }
+        return flowChartsVO;
+    }
+
+    /**
+     * 鏍规嵁indexId鏌ヨ鑳借�楁暟鎹�
+     */
+    private Map<String, LocalDateTime> getDataItemByIndexId(TimeType timeType, LocalDate queryTime) {
+        LocalDateTime startTime;
+        LocalDateTime endTime;
+        LocalDate startDate;
+        LocalDate endDate;
+        switch (timeType) {
+            case DAY:
+                // 褰撳ぉ鐨勫紑濮嬫椂闂�
+                startTime = LocalDateTime.of(queryTime, LocalTime.MIN);
+                // 褰撳ぉ鐨勭粨鏉熸椂闂�
+                endTime = LocalDateTime.of(queryTime, LocalTime.MAX);
+                break;
+            case MONTH:
+                // 褰撴湀鐨勫紑濮嬫椂闂�
+                startDate = queryTime.with(TemporalAdjusters.firstDayOfMonth());
+                startTime = LocalDateTime.of(startDate, LocalTime.MIN);
+                // 褰撴湀鐨勭粨鏉熸椂闂�
+                endDate = queryTime.with(TemporalAdjusters.lastDayOfMonth());
+                endTime = LocalDateTime.of(endDate, LocalTime.MAX);
+                break;
+            case YEAR:
+                // 褰撳勾鐨勫紑濮嬫椂闂�
+                startDate = queryTime.with(TemporalAdjusters.firstDayOfYear());
+                startTime = LocalDateTime.of(startDate, LocalTime.MIN);
+                // 褰撳勾鐨勭粨鏉熸椂闂�
+                endDate = queryTime.with(TemporalAdjusters.lastDayOfYear());
+                endTime = LocalDateTime.of(endDate, LocalTime.MAX);
+                break;
+            default:
+                // 褰撳ぉ鐨勫紑濮嬫椂闂�
+                startTime = LocalDateTime.of(queryTime, LocalTime.MIN);
+                // 褰撳ぉ鐨勭粨鏉熸椂闂�
+                endTime = LocalDateTime.of(queryTime, LocalTime.MAX);
+                break;
+        }
+        Map<String, LocalDateTime> localDateTimeMap = new HashMap<>();
+        localDateTimeMap.put("startTime", startTime);
+        localDateTimeMap.put("endTime", endTime);
+        return localDateTimeMap;
+    }
 }
diff --git a/zhitan-system/src/main/java/com/zhitan/model/domain/NodeIndex.java b/zhitan-system/src/main/java/com/zhitan/model/domain/NodeIndex.java
new file mode 100644
index 0000000..b4de1e1
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/model/domain/NodeIndex.java
@@ -0,0 +1,26 @@
+package com.zhitan.model.domain;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 妯″瀷鑺傜偣涓庢寚鏍囩殑鍏宠仈鍏崇郴(NodeIndex)瀹炰綋绫�
+ *
+ * @author makejava
+ * @since 2025-02-10 15:08:14
+ */
+@Data
+public class NodeIndex implements Serializable {
+    private static final long serialVersionUID = 386292923712960012L;
+    /**
+     * 鑺傜偣涓婚敭
+     */
+    private String nodeId;
+    /**
+     * 鎸囨爣涓婚敭
+     */
+    private String indexId;
+
+}
+
diff --git a/zhitan-system/src/main/java/com/zhitan/model/mapper/ModelNodeMapper.java b/zhitan-system/src/main/java/com/zhitan/model/mapper/ModelNodeMapper.java
index 3df1018..9b6bb93 100644
--- a/zhitan-system/src/main/java/com/zhitan/model/mapper/ModelNodeMapper.java
+++ b/zhitan-system/src/main/java/com/zhitan/model/mapper/ModelNodeMapper.java
@@ -5,11 +5,14 @@
 import com.zhitan.basicdata.domain.MeterImplement;
 import com.zhitan.basicdata.domain.SysEnergy;
 import com.zhitan.basicdata.domain.SysProduct;
+import com.zhitan.common.enums.TimeType;
+import com.zhitan.dataitem.domain.vo.NodeIndexValueVO;
 import com.zhitan.model.domain.EnergyIndex;
 import com.zhitan.model.domain.ModelNode;
 import com.zhitan.model.domain.vo.ModelNodeIndexInfor;
 import org.apache.ibatis.annotations.Param;
 
+import java.time.LocalDateTime;
 import java.util.List;
 import java.util.Map;
 
@@ -196,4 +199,20 @@
     ModelNode getFirstModeNodeInfo(String modelCode);
 
     List<ModelNodeIndexInfor> selectIndexByNodeIds(@Param("modelCode") String modelCode,@Param("nodeIds") List<String> nodeIds);
+
+    /**
+     * 鏍规嵁鐖惰妭鐐筰d鍜岃兘婧愮被鍨嬫煡璇㈢偣浣嶄笅鐨勭疮绉噺
+     */
+    List<NodeIndexValueVO> getDataItemByParentNodeId(@Param("parentId") String parentId,
+                                                     @Param("energyType") String energyType,
+                                                     @Param("timeType") TimeType timeType,
+                                                     @Param("dateTimeMap") Map<String, LocalDateTime> dateTimeMap);
+
+    /**
+     * 鏍规嵁鑺傜偣id鍜岃兘婧愮被鍨嬫煡璇㈢偣浣嶄笅鐨勭疮绉噺
+     */
+    List<NodeIndexValueVO> getDataItemByNodeId(@Param("nodeId") String nodeId,
+                                                     @Param("energyType") String energyType,
+                                                     @Param("timeType") TimeType timeType,
+                                                     @Param("dateTimeMap") Map<String, LocalDateTime> dateTimeMap);
 }
diff --git a/zhitan-system/src/main/java/com/zhitan/model/mapper/NodeIndexMapper.java b/zhitan-system/src/main/java/com/zhitan/model/mapper/NodeIndexMapper.java
new file mode 100644
index 0000000..92808f2
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/model/mapper/NodeIndexMapper.java
@@ -0,0 +1,15 @@
+package com.zhitan.model.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zhitan.model.domain.NodeIndex;
+
+/**
+ * 妯″瀷鑺傜偣涓庢寚鏍囩殑鍏宠仈鍏崇郴(NodeIndex)琛ㄦ暟鎹簱璁块棶灞�
+ *
+ * @author makejava
+ * @since 2025-02-10 15:09:17
+ */
+public interface NodeIndexMapper extends BaseMapper<NodeIndex> {
+
+}
+
diff --git a/zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/domain/dto/FlowChartsDTO.java b/zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/domain/dto/FlowChartsDTO.java
new file mode 100644
index 0000000..b9dc2f9
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/domain/dto/FlowChartsDTO.java
@@ -0,0 +1,57 @@
+package com.zhitan.statisticalAnalysis.domain.dto;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.zhitan.common.enums.TimeType;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.apache.commons.lang3.ObjectUtils;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.time.LocalDate;
+
+/**
+ * 鑳芥祦鍥炬煡璇�
+ */
+@Data
+public class FlowChartsDTO {
+
+    /**
+     * 鑳芥簮绫诲瀷鍚嶇О
+     */
+    @EnumValue
+    @ApiModelProperty(value = "鏃堕棿绫诲瀷")
+    private TimeType timeType;
+
+    /**
+     * 鏌ヨ鏃堕棿
+     */
+    @NotNull(message = "鏌ヨ鏃堕棿涓嶈兘涓虹┖")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty(value = "鏌ヨ鏃堕棿")
+    private LocalDate queryTime;
+
+    /**
+     * 鑳芥簮绫诲瀷
+     */
+    @NotBlank(message = "鑳芥簮绫诲瀷涓嶈兘涓虹┖")
+    @ApiModelProperty(value = "鑳芥簮绫诲瀷")
+    private String energyType;
+
+    /**
+     * 鑺傜偣id
+     */
+    @NotBlank(message = "鑺傜偣id涓嶈兘涓虹┖")
+    @ApiModelProperty(value = "鑺傜偣id")
+    private String nodeId;
+
+    public TimeType getTimeType() {
+        if (ObjectUtils.isEmpty(timeType)) {
+            return TimeType.DAY;
+        }
+        return timeType;
+    }
+}
diff --git a/zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/domain/vo/FlowChartsItemVO.java b/zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/domain/vo/FlowChartsItemVO.java
new file mode 100644
index 0000000..4696561
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/domain/vo/FlowChartsItemVO.java
@@ -0,0 +1,34 @@
+package com.zhitan.statisticalAnalysis.domain.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.math.BigDecimal;
+
+/**
+ * 鑳芥祦鍥炬煡璇�
+ */
+@Data
+public class FlowChartsItemVO {
+
+    /**
+     * 婧愬ご
+     */
+    @ApiModelProperty(value = "婧愬ご")
+    private String source;
+
+    /**
+     * 鐩爣
+     */
+    @ApiModelProperty(value = "鐩爣")
+    private String target;
+
+    /**
+     * 鍊�
+     */
+    @NotBlank(message = "鍊�")
+    @ApiModelProperty(value = "鍊�")
+    private BigDecimal value;
+
+}
diff --git a/zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/domain/vo/FlowChartsVO.java b/zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/domain/vo/FlowChartsVO.java
new file mode 100644
index 0000000..a0bf88e
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/domain/vo/FlowChartsVO.java
@@ -0,0 +1,68 @@
+package com.zhitan.statisticalAnalysis.domain.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * 鑳芥祦鍥炬煡璇�
+ */
+@Data
+public class FlowChartsVO {
+
+    // 鎬荤疮绉噺
+    @ApiModelProperty(value = "鎬荤疮绉噺")
+    private BigDecimal totalAccumulatedAmount;
+
+    // 瀛愯妭鐐圭疮绉噺
+    @ApiModelProperty(value = "瀛愯妭鐐圭疮绉噺")
+    private BigDecimal childNodeAccumulatedAmount;
+
+    // 宸��
+    @ApiModelProperty(value = "宸��")
+    private BigDecimal difference;
+
+    // 鑳借�楁崯澶辨瘮渚�
+    @ApiModelProperty(value = "鑳借�楁崯澶辨瘮渚�")
+    private BigDecimal energyLossRatio;
+
+    private List<FlowChartsItemVO> itemVOList;
+
+    public BigDecimal getTotalAccumulatedAmount() {
+        if (totalAccumulatedAmount == null){
+            return BigDecimal.ZERO;
+        }
+        return totalAccumulatedAmount;
+    }
+
+    public BigDecimal getChildNodeAccumulatedAmount() {
+        if (childNodeAccumulatedAmount == null){
+            return BigDecimal.ZERO;
+        }
+        return childNodeAccumulatedAmount;
+    }
+
+    public BigDecimal getDifference() {
+        return difference = totalAccumulatedAmount.subtract(childNodeAccumulatedAmount);
+    }
+
+    public BigDecimal getEnergyLossRatio() {
+        if (BigDecimal.ZERO.compareTo(totalAccumulatedAmount) == 0
+                || BigDecimal.ZERO.compareTo(difference) == 0){
+            return BigDecimal.ZERO;
+        }
+        return energyLossRatio = difference.divide(totalAccumulatedAmount, 2, RoundingMode.HALF_UP);
+    }
+
+    public FlowChartsVO() {
+        this.totalAccumulatedAmount = BigDecimal.ZERO;
+        this.childNodeAccumulatedAmount = BigDecimal.ZERO;
+        this.difference = BigDecimal.ZERO;
+        this.energyLossRatio = BigDecimal.ZERO;
+        this.itemVOList = Collections.emptyList();
+    }
+}
diff --git a/zhitan-system/src/main/resources/mapper/model/ModelNodeMapper.xml b/zhitan-system/src/main/resources/mapper/model/ModelNodeMapper.xml
index 01c8c59..f0fe5ef 100644
--- a/zhitan-system/src/main/resources/mapper/model/ModelNodeMapper.xml
+++ b/zhitan-system/src/main/resources/mapper/model/ModelNodeMapper.xml
@@ -89,9 +89,9 @@
             resultType="com.zhitan.model.domain.EnergyIndex">
         select ei.index_id as indexId, code, name, index_type as indexType
         from energy_index ei
-                 left join node_index ni on ei.index_id = ni.index_id
+        left join node_index ni on ei.index_id = ni.index_id
         where ni.node_id = #{nodeId}
-          and ei.index_type = #{indexType}
+        and ei.index_type = #{indexType}
         <if test="code != null  and code != ''">
             and code like concat('%', #{code}, '%')
         </if>
@@ -332,11 +332,12 @@
                node_category nodeCategory
         FROM "model_node"
         WHERE model_code = #{indexCode}
-          AND parent_id IS NULL LIMIT 1;
+          AND parent_id IS NULL
+        LIMIT 1;
     </select>
     <select id="selectIndexByModelCodeAndNodeId"
             resultType="com.zhitan.model.domain.vo.ModelNodeIndexInfor">
-        SELECT mn.node_id nodeId,
+        SELECT mn.node_id  nodeId,
                mn."name",
                ni.index_id indexId
         FROM model_node mn
@@ -347,15 +348,15 @@
 
     <select id="getSettingDeviceIndex" resultType="com.zhitan.basicdata.domain.MeterImplement">
         SELECT distinct
-               m."id",
-               m.code,
-               m.meter_name AS meterName,
-               m.meter_type    meterType,
-               m.wire_diameter    wireDiameter,
-               m.max_allowable_power    maxAllowablePower
+        m."id",
+        m.code,
+        m.meter_name AS meterName,
+        m.meter_type meterType,
+        m.wire_diameter wireDiameter,
+        m.max_allowable_power maxAllowablePower
         FROM meter_implement m
-                 LEFT JOIN energy_index ei ON ei.meter_id = m."id"
-                 LEFT JOIN node_index ni ON ni.index_id = ei.index_id
+        LEFT JOIN energy_index ei ON ei.meter_id = m."id"
+        LEFT JOIN node_index ni ON ni.index_id = ei.index_id
         WHERE ni.node_id = #{nodeId}
         <if test="energyType!=null and energyType!=''">
             AND M.energy_type = #{energyType}
@@ -365,11 +366,12 @@
     <delete id="delIndexNodeIdAndIndexType">
         delete
         from node_index
-        where node_id = #{nodeId} and index_id in (
-            select ni.index_id
-            from node_index ni left join energy_index ei on ni.index_id = ei.index_id
-            where node_id = #{nodeId} and ei.index_type = #{indexType}
-        );
+        where node_id = #{nodeId}
+          and index_id in (select ni.index_id
+                           from node_index ni
+                                    left join energy_index ei on ni.index_id = ei.index_id
+                           where node_id = #{nodeId}
+                             and ei.index_type = #{indexType});
     </delete>
     <insert id="setIndexAndNodeId">
         <foreach collection="indexIds" item="indexId" separator=";">
@@ -379,11 +381,11 @@
     </insert>
 
     <select id="getModelNodeIndexIdByNodeId" resultType="com.zhitan.model.domain.vo.ModelNodeIndexInfor">
-        SELECT mn.node_id  nodeId,
-               mn."name"   "name",
-               ni.index_id indexId,
-               ei.energy_id energyId,
-               ei.index_type indexType
+        SELECT mn.node_id nodeId,
+        mn."name" "name",
+        ni.index_id indexId,
+        ei.energy_id energyId,
+        ei.index_type indexType
         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
@@ -400,16 +402,17 @@
         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
-        WHERE mn.parent_id = #{parentId} and ei.index_type = 'STATISTIC'
+        WHERE mn.parent_id = #{parentId}
+          and ei.index_type = 'STATISTIC'
     </select>
     <select id="getFirstModeNodeInfo" resultType="com.zhitan.model.domain.ModelNode">
         <include refid="selectModelNodeVo"/>
-        where model_code = #{modelCode}  AND parent_id is null
+        where model_code = #{modelCode} AND parent_id is null
         order by order_num
     </select>
     <select id="selectIndexByNodeIds" resultType="com.zhitan.model.domain.vo.ModelNodeIndexInfor">
-        SELECT mn.node_id  nodeId,
-        mn."name"   "name",
+        SELECT mn.node_id nodeId,
+        mn."name" "name",
         ni.index_id indexId,
         ei.energy_id
         FROM "model_node" mn
@@ -417,15 +420,49 @@
         left join energy_index ei on ni.index_id = ei.index_id
         <where>
             mn.model_code = #{modelCode}
-          AND mn.node_id in
-        <foreach collection="nodeIds" index="index" item="item" open="(" separator="," close=")">
-            #{item}
-        </foreach>
-        <if test="modelCode!=null and modelCode!='' and nodeIds.size>0">
-            and ei.index_type='STATISTIC'
-        </if>
+            AND mn.node_id in
+            <foreach collection="nodeIds" index="index" item="item" open="(" separator="," close=")">
+                #{item}
+            </foreach>
+            <if test="modelCode!=null and modelCode!='' and nodeIds.size>0">
+                and ei.index_type='STATISTIC'
+            </if>
 
         </where>
 
     </select>
+
+    <select id="getDataItemByParentNodeId" resultType="com.zhitan.dataitem.domain.vo.NodeIndexValueVO">
+        SELECT mn.node_id  nodeId,
+               mn."name"   nodeName,
+               di.index_id indexId,
+               di."value"  value
+        FROM model_node mn
+                 LEFT JOIN "node_index" ni ON mn.node_id = ni.node_id
+                 LEFT JOIN "energy_index" ei ON ei.index_id = ni.index_id
+                 LEFT JOIN "data_item" di ON ei.index_id = di.index_id
+        WHERE mn.parent_id = #{parentId}
+          AND ei.energy_id = #{energyType}
+          AND ei.index_type = 'STATISTIC'
+          AND di.time_type = #{timeType.name}
+          AND di.data_time >= #{dateTimeMap.startTime}
+          AND di.data_time &lt;= #{dateTimeMap.endTime}
+    </select>
+
+    <select id="getDataItemByNodeId" resultType="com.zhitan.dataitem.domain.vo.NodeIndexValueVO">
+        SELECT mn.node_id  nodeId,
+               mn."name"   nodeName,
+               di.index_id indexId,
+               di."value"  value
+        FROM "model_node" mn
+                 LEFT JOIN "node_index" ni ON mn.node_id = ni.node_id
+                 LEFT JOIN "energy_index" ei ON ei.index_id = ni.index_id
+                 LEFT JOIN "data_item" di ON ei.index_id = di.index_id
+        WHERE mn.node_id = #{nodeId}
+          AND ei.energy_id = #{energyType}
+          AND ei.index_type = 'STATISTIC'
+          AND di.time_type = #{timeType.name}
+          AND di.data_time >= #{dateTimeMap.startTime}
+          AND di.data_time &lt;= #{dateTimeMap.endTime}
+    </select>
 </mapper>
diff --git a/zhitan-system/src/main/resources/mapper/model/NodeIndexMapper.xml b/zhitan-system/src/main/resources/mapper/model/NodeIndexMapper.xml
new file mode 100644
index 0000000..71e9b64
--- /dev/null
+++ b/zhitan-system/src/main/resources/mapper/model/NodeIndexMapper.xml
@@ -0,0 +1,10 @@
+<?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.model.mapper.NodeIndexMapper">
+
+    <resultMap type="com.zhitan.model.domain.NodeIndex" id="NodeIndexMap">
+        <result property="nodeId" column="node_id" jdbcType="VARCHAR"/>
+        <result property="indexId" column="index_id" jdbcType="VARCHAR"/>
+    </resultMap>
+</mapper>
+

--
Gitblit v1.9.3