From 7dfd10611e89eb9014e862d6b336d2e39fbecf81 Mon Sep 17 00:00:00 2001
From: DYL <Dn1332079466>
Date: 星期一, 10 二月 2025 11:31:44 +0800
Subject: [PATCH] 获取三相不平衡数据

---
 zhitan-system/src/main/java/com/zhitan/model/service/impl/EnergyIndexServiceImpl.java                |   15 
 zhitan-admin/src/main/java/com/zhitan/web/controller/energyMonitor/ElectricThreePhaseController.java |   64 ++++
 zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/vo/ElectricThreePhaseVO.java             |   23 +
 zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/vo/ElectricThreePhaseTempModel.java      |   44 ++
 zhitan-system/src/main/java/com/zhitan/energyMonitor/service/IElectricThreePhaseService.java         |   20 +
 zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/vo/ElectricThreePhaseDetail.java         |   55 +++
 zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/vo/ElectricThreePhaseItem.java           |   44 ++
 zhitan-system/src/main/java/com/zhitan/model/service/IEnergyIndexService.java                        |  182 ++++++-----
 zhitan-system/src/main/java/com/zhitan/energyMonitor/service/impl/ElectricThreePhaseServiceImpl.java |  413 +++++++++++++++++++++++++++
 9 files changed, 772 insertions(+), 88 deletions(-)

diff --git a/zhitan-admin/src/main/java/com/zhitan/web/controller/energyMonitor/ElectricThreePhaseController.java b/zhitan-admin/src/main/java/com/zhitan/web/controller/energyMonitor/ElectricThreePhaseController.java
new file mode 100644
index 0000000..fca2c2d
--- /dev/null
+++ b/zhitan-admin/src/main/java/com/zhitan/web/controller/energyMonitor/ElectricThreePhaseController.java
@@ -0,0 +1,64 @@
+package com.zhitan.web.controller.energyMonitor;
+
+import com.zhitan.common.annotation.Log;
+import com.zhitan.common.core.controller.BaseController;
+import com.zhitan.common.core.domain.AjaxResult;
+import com.zhitan.energyMonitor.service.IElectricThreePhaseService;
+import com.zhitan.model.domain.EnergyIndex;
+import com.zhitan.model.service.IEnergyIndexService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.ObjectUtils;
+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.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * @Description: 涓夌浉涓嶅钩琛�
+ * @Author: yxw
+ * @Date: 2022-04-24
+ * @Version: V1.2
+ */
+@Api(tags = "涓夌浉涓嶅钩琛�")
+@RestController
+@RequestMapping("/threePhaseUnbalanceAnalysis")
+@Slf4j
+public class ElectricThreePhaseController extends BaseController {
+
+    @Autowired
+    private IElectricThreePhaseService electricThreePhaseService;
+    @Autowired
+    private IEnergyIndexService energyIndexService;
+
+    /**
+     * 鑾峰彇鐢ㄨ兘鍗曞厓涓嬬殑鏌愪釜鐢佃〃鐨勪笁鐩镐笉骞宠 鏁版嵁
+     *
+     * @param nodeId 鑺傜偣id
+     * @param meterId      鐢佃〃id
+     * @param timeType     鏃堕棿绫诲瀷 DAY/MONTH/YEAR
+     * @param timeCode     鏃堕棿鍊� 涓庢椂闂寸被鍨嬪搴旓細2022-03-21/2022-03/2022
+     * @param requestType  璇锋眰绫诲瀷锛�0.鐢靛帇锛�1.鐢垫祦
+     * @return
+     */
+    @Log(title = "鏍规嵁鐢佃〃id鏌ヨ涓夌浉涓嶅钩琛℃暟鎹�")
+    @ApiOperation(value = "鏍规嵁鐢佃〃id鏌ヨ涓夌浉涓嶅钩琛℃暟鎹�", notes = "鏍规嵁鐢佃〃id鏌ヨ涓夌浉涓嶅钩琛℃暟鎹�")
+    @GetMapping(value = "/detail")
+    public AjaxResult list(@RequestParam(name = "nodeId") String nodeId,
+                           @RequestParam(name = "meterId") String meterId,
+                           @RequestParam(name = "timeType") String timeType,
+                           @RequestParam(name = "timeCode") String timeCode,
+                           @RequestParam(name = "requestType") String requestType) {
+        if (ObjectUtils.isEmpty(meterId)){
+            return AjaxResult.error("鐢佃〃id涓嶈兘涓虹┖");
+        }
+        List<EnergyIndex> energyIndexList = energyIndexService.listDeviceIndex(nodeId, meterId);
+
+        return AjaxResult.success(electricThreePhaseService.list(timeType, timeCode, energyIndexList, requestType, meterId));
+    }
+
+}
diff --git a/zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/vo/ElectricThreePhaseDetail.java b/zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/vo/ElectricThreePhaseDetail.java
new file mode 100644
index 0000000..6175ef9
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/vo/ElectricThreePhaseDetail.java
@@ -0,0 +1,55 @@
+package com.zhitan.energyMonitor.domain.vo;
+
+import lombok.Data;
+
+/**
+ * @Description: TODO
+ * @author: yxw
+ * @date: 2022骞�04鏈�24鏃� 16:59
+ */
+@Data
+public class ElectricThreePhaseDetail {
+    /**
+     * 鏈�澶у姛鐜囧洜鏁�
+     */
+    private String max;
+    /**
+     * 鏈�澶у姛鐜囧洜鏁板彂鐢熸椂闂�
+     */
+    private String maxTime;
+    /**
+     * 鏈�灏忓姛鐜囧洜鏁�
+     */
+    private String min;
+    /**
+     * 鏈�灏忓姛鐜囧洜鏁板彂鐢熸椂闂�
+     */
+    private String minTime;
+
+    /**
+     * 鏈�澶у��-A鐩哥數娴�/鐢靛帇
+     */
+    private String valueMaxA;
+    /**
+     * 鏈�澶у��-B鐩哥數娴�/鐢靛帇
+     */
+    private String valueMaxB;
+    /**
+     * 鏈�澶у��-C鐩哥數娴�/鐢靛帇
+     */
+    private String valueMaxC;
+
+    /**
+     * 鏈�灏忓��-A鐩哥數娴�/鐢靛帇
+     */
+    private String valueMinA;
+    /**
+     * 鏈�灏忓��-B鐩哥數娴�/鐢靛帇
+     */
+    private String valueMinB;
+    /**
+     * 鏈�灏忓��-C鐩哥數娴�/鐢靛帇
+     */
+    private String valueMinC;
+
+}
diff --git a/zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/vo/ElectricThreePhaseItem.java b/zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/vo/ElectricThreePhaseItem.java
new file mode 100644
index 0000000..779321a
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/vo/ElectricThreePhaseItem.java
@@ -0,0 +1,44 @@
+package com.zhitan.energyMonitor.domain.vo;
+
+import lombok.Data;
+
+/**
+ * @Description: TODO
+ * @author: yxw
+ * @date: 2022骞�04鏈�24鏃� 16:59
+ */
+@Data
+public class ElectricThreePhaseItem {
+    /**
+     * 鐢佃〃鍚嶇О
+     */
+    private String name;
+    /**
+     * 鏃堕棿
+     */
+    private String timeCode;
+    /**
+     * 缁熻鍥炬樉绀烘椂闂�
+     */
+    private String timeCodeChart;
+    /**
+     * 鏈�澶т笁鐩镐笉骞宠 
+     */
+    private String max;
+    /**
+     * 鏈�灏忎笁鐩镐笉骞宠 
+     */
+    private String min;
+    /**
+     * A鐩哥數娴�/鐢靛帇
+     */
+    private String valueA;
+    /**
+     * D鐩哥數娴�/鐢靛帇
+     */
+    private String valueB;
+    /**
+     * C鐩哥數娴�/鐢靛帇
+     */
+    private String valueC;
+}
diff --git a/zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/vo/ElectricThreePhaseTempModel.java b/zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/vo/ElectricThreePhaseTempModel.java
new file mode 100644
index 0000000..5051870
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/vo/ElectricThreePhaseTempModel.java
@@ -0,0 +1,44 @@
+package com.zhitan.energyMonitor.domain.vo;
+
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @Description: TODO
+ * @author: yxw
+ * @date: 2022骞�05鏈�06鏃� 14:02
+ */
+@Data
+public class ElectricThreePhaseTempModel {
+
+    private Double max;
+    private Date maxTime;
+    private Double min;
+    private Date minTime;
+    /**
+     * 鏈�澶у��-A鐩哥數娴�/鐢靛帇
+     */
+    private double valueMaxA;
+    /**
+     * 鏈�澶у��-B鐩哥數娴�/鐢靛帇
+     */
+    private double valueMaxB;
+    /**
+     * 鏈�澶у��-C鐩哥數娴�/鐢靛帇
+     */
+    private double valueMaxC;
+
+    /**
+     * 鏈�灏忓��-A鐩哥數娴�/鐢靛帇
+     */
+    private double valueMinA;
+    /**
+     * 鏈�灏忓��-B鐩哥數娴�/鐢靛帇
+     */
+    private double valueMinB;
+    /**
+     * 鏈�灏忓��-C鐩哥數娴�/鐢靛帇
+     */
+    private double valueMinC;
+}
diff --git a/zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/vo/ElectricThreePhaseVO.java b/zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/vo/ElectricThreePhaseVO.java
new file mode 100644
index 0000000..76e9e74
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/vo/ElectricThreePhaseVO.java
@@ -0,0 +1,23 @@
+package com.zhitan.energyMonitor.domain.vo;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @Description: TODO
+ * @author: yxw
+ * @date: 2022骞�04鏈�24鏃� 16:58
+ */
+@Data
+public class ElectricThreePhaseVO {
+    /**
+     * 璁板綍鍒楄〃
+     */
+    private List<ElectricThreePhaseItem> itemList;
+
+    /**
+     * 璇︽儏瀹炰綋
+     */
+    private ElectricThreePhaseDetail detail;
+}
diff --git a/zhitan-system/src/main/java/com/zhitan/energyMonitor/service/IElectricThreePhaseService.java b/zhitan-system/src/main/java/com/zhitan/energyMonitor/service/IElectricThreePhaseService.java
new file mode 100644
index 0000000..8b8ce8d
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/energyMonitor/service/IElectricThreePhaseService.java
@@ -0,0 +1,20 @@
+package com.zhitan.energyMonitor.service;
+
+import com.zhitan.energyMonitor.domain.vo.ElectricThreePhaseVO;
+import com.zhitan.model.domain.EnergyIndex;
+
+import java.util.List;
+
+/**
+ * @Description:
+ * @Author: jeecg-boot
+ * @Date: 2022-04-19
+ * @Version: V1.0
+ */
+public interface IElectricThreePhaseService {
+
+    /**
+     * 鑾峰彇涓夌浉涓嶅钩琛℃暟鎹�
+     */
+    ElectricThreePhaseVO list(String timeType, String timeCode, List<EnergyIndex> energyIndexList, String requestType, String meterId);
+}
diff --git a/zhitan-system/src/main/java/com/zhitan/energyMonitor/service/impl/ElectricThreePhaseServiceImpl.java b/zhitan-system/src/main/java/com/zhitan/energyMonitor/service/impl/ElectricThreePhaseServiceImpl.java
new file mode 100644
index 0000000..5a21836
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/energyMonitor/service/impl/ElectricThreePhaseServiceImpl.java
@@ -0,0 +1,413 @@
+package com.zhitan.energyMonitor.service.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.zhitan.basicdata.domain.MeterImplement;
+import com.zhitan.basicdata.mapper.MeterImplementMapper;
+import com.zhitan.common.constant.CommonConst;
+import com.zhitan.common.constant.TimeTypeConst;
+import com.zhitan.common.utils.*;
+import com.zhitan.energyMonitor.domain.vo.ElectricThreePhaseDetail;
+import com.zhitan.energyMonitor.domain.vo.ElectricThreePhaseItem;
+import com.zhitan.energyMonitor.domain.vo.ElectricThreePhaseTempModel;
+import com.zhitan.energyMonitor.domain.vo.ElectricThreePhaseVO;
+import com.zhitan.energyMonitor.service.IElectricThreePhaseService;
+import com.zhitan.model.domain.EnergyIndex;
+import com.zhitan.realtimedata.domain.TagValue;
+import com.zhitan.realtimedata.service.RealtimeDatabaseService;
+import org.joda.time.DateTime;
+import org.joda.time.Duration;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @Description: sensor_alarm_item
+ * @Author: jeecg-boot
+ * @Date: 2022-04-19
+ * @Version: V1.0
+ */
+@Service
+public class ElectricThreePhaseServiceImpl implements IElectricThreePhaseService {
+
+    @Autowired
+    private RealtimeDatabaseService realtimeDatabaseService;
+    @Resource
+    private MeterImplementMapper meterImplementMapper;
+
+    /**
+     * 鑾峰彇涓夌浉涓嶅钩琛℃暟鎹�
+     *
+     * @param timeType        鏃堕棿绫诲瀷
+     * @param timeCode        鏃堕棿缂栫爜
+     * @param energyIndexList 鐐逛綅闆嗗悎
+     * @param requestType     绫诲瀷
+     * @return ElectricThreePhaseVo
+     * @Date 14:27 2022/5/30
+     **/
+    @Override
+    public ElectricThreePhaseVO list(String timeType, String timeCode, List<EnergyIndex> energyIndexList, String requestType, String meterId) {
+        ElectricThreePhaseVO vo = new ElectricThreePhaseVO();
+        if (ObjectUtil.isEmpty(energyIndexList)) {
+            return vo;
+        }
+        // 鑾峰彇鐢靛帇涓嶅钩琛℃暟鎹�
+        if (CommonConst.STR_NUMBER_0.equals(requestType)) {
+            energyIndexList = energyIndexList.stream()
+                    .filter(x -> StringUtil.ifEmptyOrNullReturnValue(x.getCode()).trim().endsWith(CommonConst.TAG_CODE_VOLTAGE_A)
+                            || StringUtil.ifEmptyOrNullReturnValue(x.getCode()).trim().endsWith(CommonConst.TAG_CODE_VOLTAGE_B)
+                            || StringUtil.ifEmptyOrNullReturnValue(x.getCode()).trim().endsWith(CommonConst.TAG_CODE_VOLTAGE_C)).collect(Collectors.toList());
+        } else {
+            energyIndexList = energyIndexList.stream()
+                    .filter(x -> StringUtil.ifEmptyOrNullReturnValue(x.getCode()).trim().endsWith(CommonConst.TAG_CODE_CURRENT_A)
+                            || StringUtil.ifEmptyOrNullReturnValue(x.getCode()).trim().endsWith(CommonConst.TAG_CODE_CURRENT_B)
+                            || StringUtil.ifEmptyOrNullReturnValue(x.getCode()).trim().endsWith(CommonConst.TAG_CODE_CURRENT_C))
+                    .collect(Collectors.toList());
+        }
+        List<String> tagCodeList = energyIndexList.stream().map(EnergyIndex::getCode).collect(Collectors.toList());
+        tagCodeList.add(CommonConst.STR_NUMBER_MINUS_ONE);
+        String tagCodes = String.join(StrUtil.COMMA, tagCodeList);
+
+        Date start = ChartUtils.getDateTime(timeType, timeCode);
+        Date end = getEndTime(timeType, start);
+
+        DateTime begin = new DateTime(start);
+        DateTime finish = new DateTime(end);
+        long millis = new Duration(begin, finish).getMillis();
+        int pointCount = IntegerUtil.toInt(millis / CommonConst.DIGIT_3600 / CommonConst.DIGIT_1000);
+
+        List<TagValue> tagValueList = realtimeDatabaseService.retrieve(tagCodes, start, end, pointCount);
+        List<ElectricThreePhaseItem> itemList = new ArrayList<>();
+        List<Date> dateList = new ArrayList<>();
+        ChartUtils.generateDateList(timeType, timeCode, dateList);
+        ElectricThreePhaseTempModel tempModel = new ElectricThreePhaseTempModel();
+
+        Date now = new Date();
+        for (Date date : dateList) {
+            Date tempDate = date;
+            Date temNow = now;
+            switch (timeType) {
+                case TimeTypeConst.TIME_TYPE_DAY:
+                    tempDate = DateTimeUtil.addHours(date, CommonConst.DIGIT_1);
+                    //褰撳墠鏃堕棿杞垚鏁存椂鏁寸偣
+                    temNow = DateTimeUtil.getHourTime(TimeTypeConst.TIME_TYPE_HOUR, now);
+                    break;
+                case TimeTypeConst.TIME_TYPE_MONTH:
+                    tempDate = date;
+                    //褰撳墠鏃堕棿杞垚鏁存椂鏁寸偣
+                    temNow = DateTimeUtil.getHourTime(TimeTypeConst.TIME_TYPE_DAY, now);
+                    break;
+                case TimeTypeConst.TIME_TYPE_YEAR:
+                    tempDate = date;
+                    temNow = DateTimeUtil.getHourTime(TimeTypeConst.TIME_TYPE_MONTH, now);
+                    break;
+                default:
+                    break;
+            }
+            MeterImplement meterImplement = meterImplementMapper.selectById(meterId);
+
+            ElectricThreePhaseItem temp = new ElectricThreePhaseItem();
+            if (ObjectUtil.isNotEmpty(meterImplement)) {
+                temp.setName(meterImplement.getMeterName());
+            }
+            temp.setTimeCode(ChartUtils.getTimeCode(timeType, date));
+            temp.setTimeCodeChart(ChartUtils.getTimeCodeChart(timeType, date));
+            temp.setValueA(CommonConst.DOUBLE_MINUS_SIGN);
+            temp.setValueB(CommonConst.DOUBLE_MINUS_SIGN);
+            temp.setValueC(CommonConst.DOUBLE_MINUS_SIGN);
+            itemList.add(temp);
+            // 濡傛灉澶т簬褰撳墠鏃堕棿榛樿--
+            if (DateTimeUtil.compareDateDiff(date, temNow) > CommonConst.DIGIT_0) {
+                continue;
+            }
+            switch (timeType) {
+                case TimeTypeConst.TIME_TYPE_DAY:
+                    // 鏋勯�犲綋澶╂瘡涓皬鏃剁殑鏁版嵁
+                    listDayData(tempDate, tagValueList, temp, tempModel);
+                    break;
+                case TimeTypeConst.TIME_TYPE_MONTH:
+                    // 鏋勯�犲綋鏈堟瘡澶╃殑鏁版嵁
+                    listMonthData(tempDate, tagValueList, temp, tempModel);
+                    break;
+                case TimeTypeConst.TIME_TYPE_YEAR:
+                    // 鏋勯�犲綋骞存瘡鏈堢殑鏁版嵁
+                    listYearData(tempDate, tagValueList, temp, tempModel);
+                    break;
+                default:
+                    break;
+            }
+        }
+
+        if (ObjectUtil.isEmpty(tempModel.getMin()) || CommonConst.MIN_INIT_VALUE == tempModel.getMin()) {
+            tempModel.setMin(null);
+        }
+        //璁剧疆鍊�
+        ElectricThreePhaseDetail detail = new ElectricThreePhaseDetail();
+        BeanUtils.copyProperties(tempModel, detail);
+        detail.setMax(CommonConst.DOUBLE_MINUS_SIGN);
+        detail.setMaxTime(CommonConst.DOUBLE_MINUS_SIGN);
+        detail.setValueMaxA(CommonConst.DOUBLE_MINUS_SIGN);
+        detail.setValueMaxB(CommonConst.DOUBLE_MINUS_SIGN);
+        detail.setValueMaxC(CommonConst.DOUBLE_MINUS_SIGN);
+        detail.setMin(CommonConst.DOUBLE_MINUS_SIGN);
+        detail.setMinTime(CommonConst.DOUBLE_MINUS_SIGN);
+        detail.setValueMinA(CommonConst.DOUBLE_MINUS_SIGN);
+        detail.setValueMinB(CommonConst.DOUBLE_MINUS_SIGN);
+        detail.setValueMinC(CommonConst.DOUBLE_MINUS_SIGN);
+        if (ObjectUtil.isNotNull(tempModel.getMax())) {
+            detail.setMax(DoubleUtil.formatDoubleToStr(tempModel.getMax()) + CommonConst.SYMBOL_PERCENT);
+            detail.setMaxTime(DateTimeUtil.getDateTime(tempModel.getMaxTime()));
+            detail.setValueMaxA(DoubleUtil.formatDoubleToStr(tempModel.getValueMaxA()));
+            detail.setValueMaxB(DoubleUtil.formatDoubleToStr(tempModel.getValueMaxB()));
+            detail.setValueMaxC(DoubleUtil.formatDoubleToStr(tempModel.getValueMaxC()));
+        }
+        if (ObjectUtil.isNotNull(tempModel.getMin())) {
+            detail.setMin(DoubleUtil.formatDoubleToStr(tempModel.getMin()) + CommonConst.SYMBOL_PERCENT);
+            detail.setMinTime(DateTimeUtil.getDateTime(tempModel.getMinTime()));
+            detail.setValueMinA(DoubleUtil.formatDoubleToStr(tempModel.getValueMinA()));
+            detail.setValueMinB(DoubleUtil.formatDoubleToStr(tempModel.getValueMinB()));
+            detail.setValueMinC(DoubleUtil.formatDoubleToStr(tempModel.getValueMinC()));
+        }
+        vo.setDetail(detail);
+        vo.setItemList(itemList);
+        return vo;
+    }
+
+    /**
+     * 鏋勯�犲綋鏈堢殑鏁版嵁鍒楄〃
+     *
+     * @param date
+     * @param tagValueList
+     * @param temp
+     * @param tempModel
+     */
+    private void listYearData(Date date, List<TagValue> tagValueList, ElectricThreePhaseItem temp, ElectricThreePhaseTempModel tempModel) {
+        List<Date> dateList = new ArrayList<>();
+        ChartUtils.generateDateList(TimeTypeConst.TIME_TYPE_MONTH, DateTimeUtil.getDateTime(date, DateTimeUtil.COMMON_PATTERN_TO_MONTH), dateList);
+        ElectricThreePhaseTempModel tempModelMonth = new ElectricThreePhaseTempModel();
+        for (Date date1 : dateList) {
+            listMonthData(date1, tagValueList, temp, tempModelMonth);
+            temp.setMax(CommonConst.DOUBLE_MINUS_SIGN);
+            temp.setMin(CommonConst.DOUBLE_MINUS_SIGN);
+            if (ObjectUtil.isNotNull(tempModelMonth.getMax())) {
+                temp.setMax(DoubleUtil.formatDoubleToStr(tempModelMonth.getMax()));
+            }
+            if (ObjectUtil.isNotNull(tempModelMonth.getMin())) {
+                temp.setMin(DoubleUtil.formatDoubleToStr(tempModelMonth.getMin()));
+            }
+            if (ObjectUtil.isEmpty(tempModel.getMin()) || CommonConst.MIN_INIT_VALUE == tempModel.getMin()) {
+                tempModel.setMin(null);
+            }
+            if (ObjectUtil.isNotNull(tempModelMonth.getMax())) {
+                if (ObjectUtil.isNull(tempModel.getMax()) || (ObjectUtil.isNotNull(tempModel.getMax()) && tempModelMonth.getMax() > tempModel.getMax())) {
+                    tempModel.setMax(DoubleUtil.formatDouble(tempModelMonth.getMax()));
+                    tempModel.setMaxTime(tempModelMonth.getMaxTime());
+                    tempModel.setValueMaxA(DoubleUtil.formatDouble(tempModelMonth.getValueMaxA()));
+                    tempModel.setValueMaxB(DoubleUtil.formatDouble(tempModelMonth.getValueMaxB()));
+                    tempModel.setValueMaxC(DoubleUtil.formatDouble(tempModelMonth.getValueMaxC()));
+                }
+            }
+            if (ObjectUtil.isNotNull(tempModelMonth.getMin())) {
+                if (ObjectUtil.isNull(tempModel.getMin()) || (ObjectUtil.isNotNull(tempModel.getMin()) && tempModelMonth.getMin() <= tempModel.getMin())) {
+                    tempModel.setMin(DoubleUtil.formatDouble(tempModelMonth.getMin()));
+                    tempModel.setMinTime(tempModelMonth.getMinTime());
+                    tempModel.setValueMinA(DoubleUtil.formatDouble(tempModelMonth.getValueMinA()));
+                    tempModel.setValueMinB(DoubleUtil.formatDouble(tempModelMonth.getValueMinB()));
+                    tempModel.setValueMinC(DoubleUtil.formatDouble(tempModelMonth.getValueMinC()));
+                }
+            }
+        }
+    }
+
+    /**
+     * 鏋勯�犲綋鏈堢殑鏁版嵁鍒楄〃
+     *
+     * @param date
+     * @param tagValueList
+     * @param temp
+     * @param tempModel
+     */
+    private void listMonthData(Date date, List<TagValue> tagValueList, ElectricThreePhaseItem temp, ElectricThreePhaseTempModel tempModel) {
+        List<Date> dateList = new ArrayList<>();
+        ChartUtils.generateDateList(TimeTypeConst.TIME_TYPE_DAY, DateTimeUtil.getDateTime(date, DateTimeUtil.COMMON_PATTERN_TO_DAY), dateList);
+        ElectricThreePhaseTempModel tempModelDay = new ElectricThreePhaseTempModel();
+        for (Date date1 : dateList) {
+            Date tempDate = DateTimeUtil.addHours(date1, CommonConst.DIGIT_1);
+            listDayData(tempDate, tagValueList, temp, tempModelDay);
+            temp.setMax(CommonConst.DOUBLE_MINUS_SIGN);
+            temp.setMin(CommonConst.DOUBLE_MINUS_SIGN);
+            if (ObjectUtil.isNotNull(tempModelDay.getMax())) {
+                temp.setMax(DoubleUtil.formatDoubleToStr(tempModelDay.getMax()));
+            }
+            if (ObjectUtil.isNotNull(tempModelDay.getMin())) {
+                temp.setMin(DoubleUtil.formatDoubleToStr(tempModelDay.getMin()));
+            }
+            if (ObjectUtil.isEmpty(tempModel.getMin()) || CommonConst.MIN_INIT_VALUE == tempModel.getMin()) {
+                tempModel.setMin(null);
+            }
+            if (ObjectUtil.isNotNull(tempModelDay.getMax())) {
+                if (ObjectUtil.isNull(tempModel.getMax()) || (ObjectUtil.isNotNull(tempModel.getMax()) && tempModelDay.getMax() > tempModel.getMax())) {
+                    tempModel.setMax(DoubleUtil.formatDouble(tempModelDay.getMax()));
+                    tempModel.setMaxTime(tempModelDay.getMaxTime());
+                    tempModel.setValueMaxA(DoubleUtil.formatDouble(tempModelDay.getValueMaxA()));
+                    tempModel.setValueMaxB(DoubleUtil.formatDouble(tempModelDay.getValueMaxB()));
+                    tempModel.setValueMaxC(DoubleUtil.formatDouble(tempModelDay.getValueMaxC()));
+                }
+            }
+            if (ObjectUtil.isNotNull(tempModelDay.getMin())) {
+                if (ObjectUtil.isNull(tempModel.getMin()) || (ObjectUtil.isNotNull(tempModel.getMin()) && tempModelDay.getMin() <= tempModel.getMin())) {
+                    tempModel.setMin(DoubleUtil.formatDouble(tempModelDay.getMin()));
+                    tempModel.setMinTime(tempModelDay.getMinTime());
+                    tempModel.setValueMinA(DoubleUtil.formatDouble(tempModelDay.getValueMinA()));
+                    tempModel.setValueMinB(DoubleUtil.formatDouble(tempModelDay.getValueMinB()));
+                    tempModel.setValueMinC(DoubleUtil.formatDouble(tempModelDay.getValueMinC()));
+                }
+            }
+        }
+    }
+
+    /**
+     * 鑾峰彇褰撳ぉ鐨勬暟鎹垪琛�
+     *
+     * @param date
+     * @param tagValueList
+     * @param tempModel
+     */
+    private void listDayData(Date date, List<TagValue> tagValueList, ElectricThreePhaseItem temp, ElectricThreePhaseTempModel tempModel) {
+        Date endTime = DateTimeUtil.addHours(date, CommonConst.DIGIT_1);
+        List<TagValue> currentTagValueList = tagValueList.stream().filter(x -> DateTimeUtil.compareDateDiff(date, x.getDataTime()) <= 0 && DateTimeUtil.compareDateDiff(endTime, x.getDataTime()) > 0).collect(Collectors.toList());
+        List<TagValue> currentATagValueList = currentTagValueList.stream().filter(x -> StringUtil.ifEmptyOrNullReturnValue(x.getTagCode()).trim().endsWith("_A")).collect(Collectors.toList());
+        List<TagValue> currentBTagValueList = currentTagValueList.stream().filter(x -> StringUtil.ifEmptyOrNullReturnValue(x.getTagCode()).trim().endsWith("_B")).collect(Collectors.toList());
+        List<TagValue> currentCTagValueList = currentTagValueList.stream().filter(x -> StringUtil.ifEmptyOrNullReturnValue(x.getTagCode()).trim().endsWith("_C")).collect(Collectors.toList());
+        TagValue tagValueA = currentATagValueList.stream().filter(x -> DateTimeUtil.compareDateDiff(date, x.getDataTime()) == 0).findAny().orElse(null);
+        TagValue tagValueB = currentBTagValueList.stream().filter(x -> DateTimeUtil.compareDateDiff(date, x.getDataTime()) == 0).findAny().orElse(null);
+        TagValue tagValueC = currentCTagValueList.stream().filter(x -> DateTimeUtil.compareDateDiff(date, x.getDataTime()) == 0).findAny().orElse(null);
+        Double valueA = null, valueB = null, valueC = null;
+        if (ObjectUtil.isNotEmpty(tagValueA)) {
+            valueA = tagValueA.getValue();
+            temp.setValueA(String.valueOf(DoubleUtil.formatDouble(tagValueA.getValue())));
+        } else {
+            temp.setValueA(CommonConst.DOUBLE_MINUS_SIGN);
+        }
+        if (!ObjectUtil.isEmpty(tagValueB)) {
+            valueB = tagValueB.getValue();
+            temp.setValueB(String.valueOf(DoubleUtil.formatDouble(tagValueB.getValue())));
+        } else {
+            temp.setValueB(CommonConst.DOUBLE_MINUS_SIGN);
+        }
+        if (!ObjectUtil.isEmpty(tagValueC)) {
+            valueC = tagValueC.getValue();
+            temp.setValueC(String.valueOf(DoubleUtil.formatDouble(tagValueC.getValue())));
+        } else {
+            temp.setValueC(CommonConst.DOUBLE_MINUS_SIGN);
+        }
+        Double value = calcUnbalanceValue(valueA, valueB, valueC);
+        if (ObjectUtil.isEmpty(value)) {
+            return;
+        }
+        if (ObjectUtil.isEmpty(tempModel.getMin()) || CommonConst.MIN_INIT_VALUE == tempModel.getMin()) {
+            tempModel.setMin(value);
+        }
+        if (ObjectUtil.isEmpty(tempModel.getMax()) || value > tempModel.getMax()) {
+            tempModel.setMax(DoubleUtil.formatDouble(value));
+            if (!ObjectUtil.isEmpty(tagValueA)) {
+                tempModel.setMaxTime(tagValueA.getDataTime());
+            }
+            tempModel.setValueMaxA(DoubleUtil.formatDouble(valueA));
+            tempModel.setValueMaxB(DoubleUtil.formatDouble(valueB));
+            tempModel.setValueMaxC(DoubleUtil.formatDouble(valueC));
+        }
+        if (ObjectUtil.isEmpty(tempModel.getMin()) || value <= tempModel.getMin()) {
+            tempModel.setMin(DoubleUtil.formatDouble(value));
+            tempModel.setValueMinA(DoubleUtil.formatDouble(valueA));
+            tempModel.setValueMinB(DoubleUtil.formatDouble(valueB));
+            tempModel.setValueMinC(DoubleUtil.formatDouble(valueC));
+            if (!ObjectUtil.isEmpty(tagValueA)) {
+                tempModel.setMinTime(tagValueA.getDataTime());
+            }
+        }
+    }
+
+    /**
+     * 璁$畻涓夌浉涓嶅钩琛℃瀬鍊�
+     *
+     * @param valueA
+     * @param valueB
+     * @param valueC
+     * @return
+     */
+    private Double calcUnbalanceValue(Double valueA, Double valueB, Double valueC) {
+        /**
+         * 1銆佽绠椾笁鐩稿钩鍧囩數娴侊紝A/B/C涓夌浉鐢垫祦鐩稿姞闄や互3
+         * 2銆� MAX锛堢浉鐢垫祦-涓夌浉骞冲潎鐢垫祦锛�/涓夌浉骞冲潎鐢垫祦锛�
+         * 姣斿涓夌浉鐢垫祦鍒嗗埆涓篒A=9A IB=8A IC=4A锛屽垯涓夌浉骞冲潎鐢垫祦涓�7A锛岀浉鐢垫祦-涓夌浉骞冲潎鐢垫祦鍒嗗埆涓�2A 1A 3A锛屽彇宸�兼渶澶ч偅涓紝鏁匨AX锛堢浉鐢垫祦-涓夌浉骞冲潎鐢垫祦锛�=3A锛屾墍浠ヤ笁鐩哥數娴佷笉骞宠 搴�=3/7銆�
+         */
+        Double result = null;
+        Double sum = null;
+        if (ObjectUtil.isNotNull(valueA)) {
+            sum = valueA;
+        }
+        if (ObjectUtil.isNotNull(valueB)) {
+            sum += valueB;
+        }
+        if (ObjectUtil.isNotNull(valueC)) {
+            sum += valueC;
+        }
+        if (ObjectUtil.isNotNull(sum)) {
+            double avg = sum / CommonConst.DIGIT_3;
+            double diff1 = 0, diff2 = 0, diff3 = 0;
+            if (ObjectUtil.isNotNull(valueA)) {
+                diff1 = Math.abs(valueA - avg);
+            }
+            if (ObjectUtil.isNotNull(valueB)) {
+                diff2 = Math.abs(valueB - avg);
+            }
+            if (ObjectUtil.isNotNull(valueC)) {
+                diff3 = Math.abs(valueC - avg);
+            }
+            double max = diff1;
+            if (diff2 > max) {
+                max = diff2;
+            }
+            if (diff3 > max) {
+                max = diff3;
+            }
+            if (avg != CommonConst.DIGIT_DOUBLE_0) {
+                result = max * CommonConst.DIGIT_DOUBLE_100 / avg;
+            }
+        }
+
+        return result;
+    }
+
+    /**
+     * 鑾峰彇瀵瑰簲鐨勭粨鏉熸椂闂�
+     *
+     * @param timeType
+     * @param date
+     * @return
+     */
+    public static Date getEndTime(String timeType, Date date) {
+        Date d1 = null;
+        switch (timeType) {
+            case TimeTypeConst.TIME_TYPE_DAY:
+                d1 = DateTimeUtil.addDays(date, CommonConst.DIGIT_1);
+                break;
+            case TimeTypeConst.TIME_TYPE_MONTH:
+                d1 = DateTimeUtil.addMonths(date, CommonConst.DIGIT_1);
+                break;
+            case TimeTypeConst.TIME_TYPE_YEAR:
+                d1 = DateTimeUtil.addYears(date, CommonConst.DIGIT_1);
+                break;
+            default:
+                break;
+        }
+        return d1;
+    }
+}
diff --git a/zhitan-system/src/main/java/com/zhitan/model/service/IEnergyIndexService.java b/zhitan-system/src/main/java/com/zhitan/model/service/IEnergyIndexService.java
index ad2d221..1f4c23c 100644
--- a/zhitan-system/src/main/java/com/zhitan/model/service/IEnergyIndexService.java
+++ b/zhitan-system/src/main/java/com/zhitan/model/service/IEnergyIndexService.java
@@ -13,117 +13,125 @@
  * @author fanxinfu
  * @date 2020-02-14
  */
-public interface IEnergyIndexService  {
+public interface IEnergyIndexService {
 
-  EnergyIndex getiEnergyIndexByCode(String code);
+    EnergyIndex getiEnergyIndexByCode(String code);
 
-  /**
-   * 鏍规嵁璁¢噺鍣ㄥ叿id闆嗗悎鏌ヨ鐐逛綅淇℃伅
-   *
-   * @param meterId 璁¢噺鍣ㄥ叿id闆嗗悎
-   * @return
-   */
-  List<EnergyIndex> listIndexByMeterIds(String nodeId,List<String> meterId);
+    /**
+     * 鏍规嵁璁¢噺鍣ㄥ叿id闆嗗悎鏌ヨ鐐逛綅淇℃伅
+     *
+     * @param meterId 璁¢噺鍣ㄥ叿id闆嗗悎
+     * @return
+     */
+    List<EnergyIndex> listIndexByMeterIds(String nodeId, List<String> meterId);
 
-  /**
-   * 鏌ヨ鎸囨爣淇℃伅
-   *
-   * @param indexId 鎸囨爣淇℃伅ID
-   * @return 鎸囨爣淇℃伅
-   */
-  EnergyIndex selectEnergyIndexById(String indexId);
+    /**
+     * 鏌ヨ鎸囨爣淇℃伅
+     *
+     * @param indexId 鎸囨爣淇℃伅ID
+     * @return 鎸囨爣淇℃伅
+     */
+    EnergyIndex selectEnergyIndexById(String indexId);
 
-  /**
-   * 鏌ヨ鎸囨爣淇℃伅
-   *
-   * @param indexId 鎸囨爣淇℃伅ID
-   * @return 鎸囨爣淇℃伅
-   */
-  List<EnergyIndex> selectEnergyIndexByIds(List<String> indexId);
+    /**
+     * 鏌ヨ鎸囨爣淇℃伅
+     *
+     * @param indexId 鎸囨爣淇℃伅ID
+     * @return 鎸囨爣淇℃伅
+     */
+    List<EnergyIndex> selectEnergyIndexByIds(List<String> indexId);
 
-  /**
-   * 鏌ヨ鎸囨爣淇℃伅鍒楄〃
-   *
-   * @param energyIndex 鎸囨爣淇℃伅
-   * @return 鎸囨爣淇℃伅闆嗗悎
-   */
-  List<EnergyIndex> selectEnergyIndexList(EnergyIndex energyIndex);
+    /**
+     * 鏌ヨ鎸囨爣淇℃伅鍒楄〃
+     *
+     * @param energyIndex 鎸囨爣淇℃伅
+     * @return 鎸囨爣淇℃伅闆嗗悎
+     */
+    List<EnergyIndex> selectEnergyIndexList(EnergyIndex energyIndex);
 
-  /**
-   * 鏌ヨ鎸囨爣淇℃伅鍒楄〃
-   *
-   * @param query 鎸囨爣淇℃伅
-   * @return 鎸囨爣淇℃伅闆嗗悎
-   */
-  List<EnergyIndex> selectEnergyIndexList(EnergyIndexQuery query);
+    /**
+     * 鏌ヨ鎸囨爣淇℃伅鍒楄〃
+     *
+     * @param query 鎸囨爣淇℃伅
+     * @return 鎸囨爣淇℃伅闆嗗悎
+     */
+    List<EnergyIndex> selectEnergyIndexList(EnergyIndexQuery query);
 
-  /**
-   * 鏂板鎸囨爣淇℃伅
-   *
-   * @param nodeId
-   * @param energyIndex 鎸囨爣淇℃伅
-   * @return 缁撴灉
-   */
-  int insertEnergyIndex(String nodeId, EnergyIndex energyIndex);
+    /**
+     * 鏂板鎸囨爣淇℃伅
+     *
+     * @param nodeId
+     * @param energyIndex 鎸囨爣淇℃伅
+     * @return 缁撴灉
+     */
+    int insertEnergyIndex(String nodeId, EnergyIndex energyIndex);
 
-  /**
-   * 淇敼鎸囨爣淇℃伅
-   *
-   * @param energyIndex 鎸囨爣淇℃伅
-   * @return 缁撴灉
-   */
-  int updateEnergyIndex(EnergyIndex energyIndex);
+    /**
+     * 淇敼鎸囨爣淇℃伅
+     *
+     * @param energyIndex 鎸囨爣淇℃伅
+     * @return 缁撴灉
+     */
+    int updateEnergyIndex(EnergyIndex energyIndex);
 
-  /**
-   * 鎵归噺鍒犻櫎鎸囨爣淇℃伅
-   *
-   *
-   * @param nodeId
-   * @param indexIds 闇�瑕佸垹闄ょ殑鎸囨爣淇℃伅ID
-   * @return 缁撴灉
-   */
-  int deleteEnergyIndexByIds(String nodeId, String[] indexIds);
+    /**
+     * 鎵归噺鍒犻櫎鎸囨爣淇℃伅
+     *
+     * @param nodeId
+     * @param indexIds 闇�瑕佸垹闄ょ殑鎸囨爣淇℃伅ID
+     * @return 缁撴灉
+     */
+    int deleteEnergyIndexByIds(String nodeId, String[] indexIds);
 
-  boolean energyIndexHasExist(String code);
+    boolean energyIndexHasExist(String code);
 
-  boolean energyIndexHasExist(String indexId, String code);
+    boolean energyIndexHasExist(String indexId, String code);
 
-  AjaxResult addMeterIndex(String meterId);
+    AjaxResult addMeterIndex(String meterId);
 
-  List<EnergyIndex> getMeterIndex(String meterId);
+    List<EnergyIndex> getMeterIndex(String meterId);
 
-  boolean modelHasConfig(String modelCode);
+    boolean modelHasConfig(String modelCode);
 
-  List<EnergyIndex> selectCollectIndex(String deviceId);
+    List<EnergyIndex> selectCollectIndex(String deviceId);
 
-  List<EnergyIndex> getEnergyIndexByIds(List<String> indexIds);
+    List<EnergyIndex> getEnergyIndexByIds(List<String> indexIds);
 
-  List<EnergyIndex> getEnergyIndexByCodes(List<String> indexCodes);
+    List<EnergyIndex> getEnergyIndexByCodes(List<String> indexCodes);
 
-  List<EnergyIndex> getIndexByNodeAndChildrenNode(String nodeId);
+    List<EnergyIndex> getIndexByNodeAndChildrenNode(String nodeId);
 
-  List<EnergyIndex> searchIndexByNodeAndChildrenNode(String nodeId, String filter);
+    List<EnergyIndex> searchIndexByNodeAndChildrenNode(String nodeId, String filter);
 
-  void removeNodeIndex(String nodeId, List<String> removeLink);
+    void removeNodeIndex(String nodeId, List<String> removeLink);
 
-  AjaxResult importEnergyIndex(List<EnergyIndex> energyIndexList, boolean updateSupport);
+    AjaxResult importEnergyIndex(List<EnergyIndex> energyIndexList, boolean updateSupport);
 
-  List<EnergyIndex> getEnergyIndexMeterByCodes(List<String> indexCodes);
+    List<EnergyIndex> getEnergyIndexMeterByCodes(List<String> indexCodes);
 
-  Page<EnergyIndex> selectEnergyIndexPage(EnergyIndexQuery query, Long pageNum, Long pageSize);
+    Page<EnergyIndex> selectEnergyIndexPage(EnergyIndexQuery query, Long pageNum, Long pageSize);
 
-  Page<EnergyIndex> getMeterIndexList(List<String> meterIndexIds,String code,
-                                      String name,Long pageNum, Long pageSize);
+    Page<EnergyIndex> getMeterIndexList(List<String> meterIndexIds, String code,
+                                        String name, Long pageNum, Long pageSize);
 
-  List<EnergyIndex> getIndexByCode(String code,String nodeId);
+    List<EnergyIndex> getIndexByCode(String code, String nodeId);
 
-  /**
-   * 鏍规嵁鐢ㄨ兘鍗曞厓id鍜岃澶噄d锛屼互鍙婄偣浣嶇紪鐮佽幏鍙栫偣浣�
-   *
-   * @param energyUnitId 鐢ㄨ兘鍗曞厓id
-   * @param meterId      璁惧id
-   * @param indexCode    鐐逛綅缂栫爜鎴栬�呯偣浣嶇紪鐮佺殑涓�閮ㄥ垎
-   * @return
-   */
-  EnergyIndex getDeviceIndexByCode(String energyUnitId, String meterId, String indexCode);
+    /**
+     * 鏍规嵁鐢ㄨ兘鍗曞厓id鍜岃澶噄d锛屼互鍙婄偣浣嶇紪鐮佽幏鍙栫偣浣�
+     *
+     * @param nodeId    鑺傜偣id
+     * @param meterId   璁惧id
+     * @param indexCode 鐐逛綅缂栫爜鎴栬�呯偣浣嶇紪鐮佺殑涓�閮ㄥ垎
+     * @return
+     */
+    EnergyIndex getDeviceIndexByCode(String nodeId, String meterId, String indexCode);
+
+    /**
+     * 鏍规嵁鐢ㄨ兘鍗曞厓id鍜岃澶噄d锛屼互鍙婄偣浣嶇紪鐮佽幏鍙栫偣浣�
+     *
+     * @param nodeId  鑺傜偣id
+     * @param meterId 璁惧id
+     * @return
+     */
+    List<EnergyIndex> listDeviceIndex(String nodeId, String meterId);
 }
diff --git a/zhitan-system/src/main/java/com/zhitan/model/service/impl/EnergyIndexServiceImpl.java b/zhitan-system/src/main/java/com/zhitan/model/service/impl/EnergyIndexServiceImpl.java
index 301d0ae..aa5f76f 100644
--- a/zhitan-system/src/main/java/com/zhitan/model/service/impl/EnergyIndexServiceImpl.java
+++ b/zhitan-system/src/main/java/com/zhitan/model/service/impl/EnergyIndexServiceImpl.java
@@ -84,7 +84,6 @@
     /**
      * 鏌ヨ鎸囨爣淇℃伅鍒楄〃
      *
-     * @param energyIndex 鎸囨爣淇℃伅
      * @return 鎸囨爣淇℃伅
      */
     @Override
@@ -351,4 +350,18 @@
                 .eq(EnergyIndex::getMeterId, meterId)
                 .like(EnergyIndex::getCode, indexCode));
     }
+
+    /**
+     * 鏍规嵁鐢ㄨ兘鍗曞厓id鍜岃澶噄d锛屼互鍙婄偣浣嶇紪鐮佽幏鍙栫偣浣�
+     *
+     * @param nodeId  鑺傜偣id
+     * @param meterId 璁惧id
+     * @return
+     */
+    @Override
+    public List<EnergyIndex> listDeviceIndex(String nodeId, String meterId) {
+        return energyIndexMapper.selectList(Wrappers.<EnergyIndex>lambdaQuery()
+                .eq(EnergyIndex::getNodeId, nodeId)
+                .eq(EnergyIndex::getMeterId, meterId));
+    }
 }

--
Gitblit v1.9.3