18个文件已修改
9个文件已添加
997 ■■■■■ 已修改文件
PlateFormFile/6.21审查.docx 补丁 | 查看 | 原始文档 | blame | 历史
PlateFormFile/直流电源智慧平台需求规格书2.0.docx 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/constant/AnalysisEnum.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/controller/AnalysisAlmController.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/controller/BattCompareController.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/controller/PowerheartParamController.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/controller/RealContoller.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/dto/Real/RealDateDTO.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/dto/Real/RealHeart.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/mapper/BattRtstateMapper.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/mapper/PwrdevAcdcdataMapper.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/pojo/db_param/AlmAnalysisParam.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/pojo/db_param/AlmSummaryParam.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/service/AlmAnalysisParamService.java 50 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/service/BattRealdataIdService.java 65 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/service/BattRtstateService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/service/BatttestdataInfService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/service/PowerheartParamService.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/service/PwrdevAcdcdataService.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/service/PwrdevHistorydataIdService.java 108 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/service/SubTablePageInfoService.java 138 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/webSocket/HeartAcInSocket.java 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/webSocket/HeartAcOutSocket.java 112 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/webSocket/HeartHrSocket.java 120 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/BattInfMapper.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/BattRtstateMapper.xml 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/PwrdevAcdcdataMapper.xml 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PlateFormFile/6.21Éó²é.docx
Binary files differ
PlateFormFile/Ö±Á÷µçÔ´ÖÇ»ÛÆ½Ì¨ÐèÇ󹿏ñÊé2.0.docx
Binary files differ
src/main/java/com/whyc/constant/AnalysisEnum.java
New file
@@ -0,0 +1,49 @@
package com.whyc.constant;
import java.util.HashMap;
import java.util.Map;
public enum AnalysisEnum {
    ALARM_1(1,"直流电源"),
    ALARM_2(2,"通信电源"),
    ALARM_3(3,"配网电源"),
    ALARM_4(4,"蓄电池组"),
    ALARM_5(5,"设备"),
    ALARM_6(6,"ups电源"),
    ;
    private Integer stateId;
    private String stateName;
    AnalysisEnum(Integer stateId, String stateName) {
        this.stateId = stateId;
        this.stateName = stateName;
    }
    public Integer getStateId() {
        return stateId;
    }
    public String getStateName() {
        return stateName;
    }
    public static String getValue(Integer stateId) {
        if(stateId==null){
            return "";
        }
        for (AnalysisEnum ele : values()) {
            if(ele.getStateId().equals(stateId)) {
                return ele.getStateName();
            }
        }
        return null;
    }
    public static Map<Integer,String> getOpInfo() {
        Map<Integer,String> map=new HashMap<>();
        for (AnalysisEnum logOpEnum : AnalysisEnum.values()) {
            map.put(logOpEnum.getStateId(),logOpEnum.getStateName());
        }
        return map;
    }
}
src/main/java/com/whyc/controller/AnalysisAlmController.java
@@ -7,6 +7,7 @@
import com.whyc.dto.Param.AlmAnalyseDto;
import com.whyc.dto.Response;
import com.whyc.pojo.db_alarm.BattalarmData;
import com.whyc.pojo.db_param.AppParam;
import com.whyc.service.*;
import com.whyc.util.ActionUtil;
import io.swagger.annotations.Api;
@@ -78,10 +79,16 @@
        return almAnalysisParamService.getAlmSummaryParam();
    }
    @PostMapping("updateAlarmAnalysisCycle")
    @GetMapping("updateAlarmAnalysisCycle")
    @ApiOperation("预警分析管理-设置时间间隔")
    public Response updateAlarmAnalysisCycle(@RequestParam Integer intervalTime){
        return appParamService.updateAlarmAnalysisCycle(intervalTime);
    }
    @GetMapping("getAlarmAnalysisCycle")
    @ApiOperation("预警分析管理-查询时间间隔")
    public Response getAlarmAnalysisCycle(){
        AppParam appParam= appParamService.getAlarmAnalysisCycle();
        return new Response().setII(1,appParam!=null,appParam,"查询时间间隔");
    }
}
src/main/java/com/whyc/controller/BattCompareController.java
New file
@@ -0,0 +1,48 @@
package com.whyc.controller;
import com.whyc.dto.Response;
import com.whyc.dto.Statistic.BattCompareStic;
import com.whyc.pojo.db_user.User;
import com.whyc.service.BatttestdataInfService;
import com.whyc.util.ActionUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@Api(tags = "蓄电池对比分析管理")
@RequestMapping("compare")
public class BattCompareController {
    @Autowired
    private BatttestdataInfService battTinfService;
    @ApiOperation(value = "蓄电池组对比分析界面(同一品牌同一时间)(1.2.15)")
    @PostMapping("getBattCompare15Statistic")
    public Response getBattCompare15Statistic(@RequestBody BattCompareStic stic){
        User uinf= ActionUtil.getUser();
        stic.setUid(uinf.getId());
        return battTinfService.getBattCompare15Statistic(stic);
    }
    @ApiOperation(value = "蓄电池组对比分析界面(不同品牌同一时间)(1.2.16)")
    @PostMapping("getBattCompare16Statistic")
    public Response getBattCompare16Statistic(@RequestBody BattCompareStic stic){
        User uinf= ActionUtil.getUser();
        stic.setUid(uinf.getId());
        return battTinfService.getBattCompare16Statistic(stic);
    }
    @ApiOperation(value = "蓄电池组对比分析界面(同一品牌不同时间)(1.2.17)")
    @PostMapping("getBattCompare17Statistic")
    public Response getBattCompare17Statistic(@RequestBody BattCompareStic stic){
        User uinf= ActionUtil.getUser();
        stic.setUid(uinf.getId());
        return battTinfService.getBattCompare17Statistic(stic);
    }
}
src/main/java/com/whyc/controller/PowerheartParamController.java
New file
@@ -0,0 +1,41 @@
package com.whyc.controller;
import com.whyc.dto.Response;
import com.whyc.pojo.db_pwrdev_alarm.PwrdevAlarmParamStand;
import com.whyc.service.PowerheartParamService;
import com.whyc.service.PwrdevAlarmParamStandService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@Api(tags = "电源心跳参数管理")
@RequestMapping("pwrHeart")
public class PowerheartParamController {
    @Autowired
    private PowerheartParamService service;
    @ApiOperation(value = "查询电源心跳参数")
    @GetMapping("getPwrHeartParam")
    public Response getPwrHeartParam(@RequestParam Integer powerId){
        return service.getPwrHeartParam(powerId);
    }
    @ApiOperation(value = "设置电源心跳参数-交流输入")
    @GetMapping("setPwrHeartAcIn")
    public Response setPwrHeartAcIn(@RequestParam Integer powerId,@RequestParam Integer interverCfg,@RequestParam Integer countCfg){
        return service.setPwrHeartAcIn(powerId,interverCfg,countCfg);
    }
    @ApiOperation(value = "设置电源心跳参数-直流输出")
    @GetMapping("setPwrHeartAcOut")
    public Response setPwrHeartAcOut(@RequestParam Integer powerId,@RequestParam Integer interverCfg,@RequestParam Integer countCfg){
        return service.setPwrHeartAcOut(powerId,interverCfg,countCfg);
    }
    @ApiOperation(value = "设置电源心跳参数-核容设备")
    @GetMapping("setPwrHeartHr")
    public Response setPwrHeartHr(@RequestParam Integer powerId,@RequestParam Integer interverCfg,@RequestParam Integer countCfg){
        return service.setPwrHeartHr(powerId,interverCfg,countCfg);
    }
}
src/main/java/com/whyc/controller/RealContoller.java
@@ -39,13 +39,13 @@
    @ApiOperation(value = "系统概览获取前一百比时间间隔数据直流输出统计")
    @GetMapping("getPwrHisDcoutData100")
    public Response getPwrHisDcoutData100(@RequestParam Integer powerId){
    public Response getPwrHisDcoutData100(@RequestParam Integer powerId) throws ParseException, InterruptedException {
        return pwrdevHistorydataIdService.getHalfHourPwrHisDcoutData(powerId);
    }
    @ApiOperation(value = "系统概览获取前一百比时间间隔数据核容设备信息")
    @GetMapping("getBattDevData100")
    public Response getBattDevData100(@RequestParam Integer powerId,@RequestParam Integer battgroupId){
    public Response getBattDevData100(@RequestParam Integer powerId,@RequestParam Integer battgroupId) throws ParseException, InterruptedException {
        return battRealdataIdService.getBattDevData100(powerId,battgroupId);
    }
@@ -62,10 +62,16 @@
        return tdataIdService.getTinfDataWithTestRecordCount(battgroupId,testRecordCount,recordNum,granularity);
    }
    @ApiOperation(value = "历史实时查询")
    @ApiOperation(value = "电池历史实时查询")
    @GetMapping("getBattRealDataHis")
    public Response getBattRealDataHis(@RequestParam Integer battgroupId,@RequestParam Integer granularity
            ,@RequestParam String startTime,@RequestParam String  endTime) throws ParseException, InterruptedException {
        return battRealdataIdService.getBattRealDataHis(battgroupId,granularity,startTime,endTime);
    }
    @ApiOperation(value = "电源历史实时查询")
    @GetMapping("getPwrRealDataHis")
    public Response getPwrRealDataHis(@RequestParam Integer powerId,@RequestParam Integer granularity
            ,@RequestParam String startTime,@RequestParam String  endTime) throws ParseException, InterruptedException {
        return pwrdevHistorydataIdService.getPwrRealDataHis(powerId,granularity,startTime,endTime);
    }
}
src/main/java/com/whyc/dto/Real/RealDateDTO.java
@@ -19,6 +19,8 @@
    private Float onlineVol;
    @ApiModelProperty(value = "组端电流")
    private Float groupCurr;
    @ApiModelProperty(value = "负载电流")
    private Float loadCurr;
    @ApiModelProperty(value = "单体电压")
    private Float monVol;
    @ApiModelProperty(value = "单体温度")
src/main/java/com/whyc/dto/Real/RealHeart.java
New file
@@ -0,0 +1,9 @@
package com.whyc.dto.Real;
import lombok.Data;
@Data
public class RealHeart {
    private Integer powerId;
    private Integer battgroupId;
}
src/main/java/com/whyc/mapper/BattRtstateMapper.java
@@ -1,6 +1,9 @@
package com.whyc.mapper;
import com.whyc.dto.Real.RealDateDTO;
import com.whyc.pojo.db_ram_db.BattRtstate;
public interface BattRtstateMapper extends CustomMapper<BattRtstate>{
    //实时推送电池核容设备心跳数据
    RealDateDTO getBattRealHr(Integer battgroupId);
}
src/main/java/com/whyc/mapper/PwrdevAcdcdataMapper.java
@@ -1,6 +1,12 @@
package com.whyc.mapper;
import com.whyc.dto.Real.PwrHisRealAcInDto;
import com.whyc.dto.Real.PwrHisRealDcoutInDto;
import com.whyc.pojo.db_ram_db.PwrdevAcdcdata;
public interface PwrdevAcdcdataMapper extends CustomMapper<PwrdevAcdcdata>{
    //电源心跳数据获取交流输入实时数据
    PwrHisRealAcInDto getPwrRealAcIn(Integer powerId);
    //电源心跳数据获取电源直流输出数据实时数据
    PwrHisRealDcoutInDto getPwrRealDcOut(Integer powerId);
}
src/main/java/com/whyc/pojo/db_param/AlmAnalysisParam.java
@@ -1,6 +1,7 @@
package com.whyc.pojo.db_param;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
@@ -41,11 +42,17 @@
    @ApiModelProperty(value = "主字段类型[1:直流,2:通信,3配网  4:电池 5:设备]")
    private Integer mainFieldType;
    @TableField(exist = false)
    private String mainFieldTypeName;
    @ApiModelProperty(value = "次要字段1参考配置")
    private String minorField1;
    @ApiModelProperty(value = "字段1类型[1:直流,2:通信,3配网  4:电池 5:设备]")
    private Integer minorField1Type;
    @TableField(exist = false)
    private String minorField1TypeName;
    @ApiModelProperty(value = "次要字段2参考配置")
    private String minorField2;
@@ -53,17 +60,26 @@
    @ApiModelProperty(value = "字段2类型[1:直流,2:通信,3配网  4:电池 5:设备]")
    private Integer minorField2Type;
    @TableField(exist = false)
    private String minorField2TypeName;
    @ApiModelProperty(value = "次要字段3参考配置")
    private String minorField3;
    @ApiModelProperty(value = "字段3类型[1:直流,2:通信,3配网  4:电池 5:设备]")
    private Integer minorField3Type;
    @TableField(exist = false)
    private String minorField3TypeName;
    @ApiModelProperty(value = "次要字段4参考配置")
    private String minorField4;
    @ApiModelProperty(value = "字段4类型[1:直流,2:通信,3配网  4:电池 5:设备]")
    private Integer minorField4Type;
    @TableField(exist = false)
    private String minorField4TypeName;
}
src/main/java/com/whyc/pojo/db_param/AlmSummaryParam.java
@@ -1,6 +1,7 @@
package com.whyc.pojo.db_param;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
@@ -35,6 +36,10 @@
    @ApiModelProperty(value = "字段类型[1:直流,2:通信,3配网  4:电池 5:设备]")
    private Integer fieldType;
    @ApiModelProperty(value = "字段类型[1:直流,2:通信,3配网  4:电池 5:设备]")
    @TableField(exist = false)
    private String fieldTypeName;
    @ApiModelProperty(value = "字段属性")
    private String fieldName;
src/main/java/com/whyc/service/AlmAnalysisParamService.java
@@ -1,6 +1,7 @@
package com.whyc.service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.whyc.constant.AnalysisEnum;
import com.whyc.dto.AnalysisAlm.AnalysisChangeRes;
import com.whyc.dto.AnalysisAlm.ResAnalysis;
import com.whyc.dto.Real.RealDateDTO;
@@ -47,6 +48,13 @@
        wrapper.eq("alm_id",almId);
        wrapper.last("limit 1");
        AlmAnalysisParam param= mapper.selectOne(wrapper);
        if(param!=null){
            param.setMainFieldTypeName(AnalysisEnum.getValue(param.getMainFieldType()));
            param.setMinorField1TypeName(AnalysisEnum.getValue(param.getMinorField1Type()));
            param.setMinorField2TypeName(AnalysisEnum.getValue(param.getMinorField2Type()));
            param.setMinorField3TypeName(AnalysisEnum.getValue(param.getMinorField3Type()));
            param.setMinorField4TypeName(AnalysisEnum.getValue(param.getMinorField4Type()));
        }
        return param;
    }
@@ -67,10 +75,14 @@
        if(almAnalysisParam==null||almAnalysisParam.getMainFieldType()==null){
            return new Response().set(1,false,"无对应分析属性");
        }else{
            //分组查看需要查询电源/电池实时表的哪些数据
            Map<String,  Map<String,Integer>> groupmap=groupPwrAndBatt(almAnalysisParam);
            Map<String,Integer> battMap=groupmap.get("batt");
            Map<String,Integer> pwrMap=groupmap.get("pwr");
            Map<String,  Map<String,Object>> groupmap=groupPwrAndBatt(almAnalysisParam);
            Map<String,Object> battMap=groupmap.get("batt");
            Map<String,Object> pwrMap=groupmap.get("pwr");
            Map<String,Object> mainMap=groupmap.get("main");
            mainMap.put("pwr",pwrMap.size());
            mainMap.put("batt",battMap.size());
            if(battgroupId!=null){
                if(battMap!=null&&battMap.size()>0){
                    List battHislist=getBattRealData(battgroupId,monthTimeList,battMap);
@@ -83,21 +95,24 @@
                    map.put("pwr",pwrHislist);
                }
            }
            return new Response().setII(1,true, map,"预警分析管理-电源主属性和分析属性");
            return new Response().setIIII(1,true, map,mainMap,almAnalysisParam,"预警分析管理-电源主属性和分析属性");
        }
    }
    //分组查看需要查询电源/电池实时表的哪些数据
    private  Map<String,  Map<String,Integer>> groupPwrAndBatt(AlmAnalysisParam almAnalysisParam) {
        Map<String,  Map<String,Integer>> map = new HashMap<>();
        Map<String,Integer> battMap=new HashMap<>();
        Map<String,Integer> pwrMap=new HashMap<>();
    private  Map<String,  Map<String,Object>> groupPwrAndBatt(AlmAnalysisParam almAnalysisParam) {
        Map<String,  Map<String,Object>> map = new HashMap<>();
        Map<String,Object> battMap=new HashMap<>();
        Map<String,Object> pwrMap=new HashMap<>();
        Map<String,Object> mainMap=new HashMap<>();
        if(almAnalysisParam.getMainFieldType()==1||almAnalysisParam.getMainFieldType()==2||almAnalysisParam.getMainFieldType()==3){
            if(almAnalysisParam.getMainField()!=null||almAnalysisParam.getMainField().length()>0){
                pwrMap.put(almAnalysisParam.getMainField(),almAnalysisParam.getMainFieldType());
                mainMap.put("main","pwr");
            }
        }else{
            if(almAnalysisParam.getMainField()!=null||almAnalysisParam.getMainField().length()>0){
                battMap.put(almAnalysisParam.getMainField(),almAnalysisParam.getMainFieldType());
                mainMap.put("main","batt");
            }
        }
        if(almAnalysisParam.getMinorField1Type()==1||almAnalysisParam.getMinorField1Type()==2||almAnalysisParam.getMinorField1Type()==3){
@@ -138,10 +153,11 @@
        }
        map.put("pwr",pwrMap);
        map.put("batt",battMap);
        map.put("main",mainMap);
        return map;
    }
    //连接池获取电源历史实时数据
    public List getPwrRealData(Integer powerId,List<List<Date>> monthTimeList,Map<String,Integer> pwrMap) throws InterruptedException {
    public List getPwrRealData(Integer powerId,List<List<Date>> monthTimeList,Map<String,Object> pwrMap) throws InterruptedException {
        List<ResAnalysis> dataList = new LinkedList<>();
        ThreadPoolExecutor pool = ThreadPoolExecutorFactory.getPoolExecutor();
        CountDownLatch latch = new CountDownLatch(monthTimeList.size());
@@ -171,7 +187,7 @@
    }
    //电池告警点击具体告警信息查看从告警开始时间到现在的历史实时数据
    public List getBattRealData(Integer battgroupId, List<List<Date>> monthTimeList,Map<String,Integer> battMap) throws ParseException, InterruptedException {
    public List getBattRealData(Integer battgroupId, List<List<Date>> monthTimeList,Map<String,Object> battMap) throws ParseException, InterruptedException {
        List<ResAnalysis> dataList = new LinkedList<>();
        ThreadPoolExecutor pool = ThreadPoolExecutorFactory.getPoolExecutor();
        CountDownLatch latch = new CountDownLatch(monthTimeList.size());
@@ -218,9 +234,12 @@
        //将属性拷贝至almAnalysisParam中
        copyProperties(almAnalysisParam,res);
        //分组查看需要查询电源/电池实时表的哪些数据
        Map<String,  Map<String,Integer>> groupmap=groupPwrAndBatt(almAnalysisParam);
        Map<String,Integer> battMap=groupmap.get("batt");
        Map<String,Integer> pwrMap=groupmap.get("pwr");
        Map<String,  Map<String,Object>> groupmap=groupPwrAndBatt(almAnalysisParam);
        Map<String,Object> battMap=groupmap.get("batt");
        Map<String,Object> pwrMap=groupmap.get("pwr");
        Map<String,Object> mainMap=groupmap.get("main");
        mainMap.put("pwr",pwrMap.size());
        mainMap.put("batt",battMap.size());
        if(res.getBattgroupId()!=null){
            if(battMap!=null&&battMap.size()>0){
                List battHislist=getBattRealData(res.getBattgroupId(),monthTimeList,battMap);
@@ -233,7 +252,7 @@
                map.put("pwr",pwrHislist);
            }
        }
        return new Response().setII(1,true, map,"预警分析管理-切换时间间隔和副属性");
        return new Response().setIIII(1,true, map,mainMap,almAnalysisParam,"预警分析管理-切换时间间隔和副属性");
    }
    //将属性拷贝至almAnalysisParam中
    private void copyProperties(AlmAnalysisParam almAnalysisParam, AnalysisChangeRes res) {
@@ -252,6 +271,9 @@
    public Response getAlmSummaryParam() {
        //总的属性配置
        List<AlmSummaryParam> summaryList=summaryParamService.getInfo();
        summaryList.forEach(item->{
            item.setFieldTypeName(AnalysisEnum.getValue(item.getFieldType()));
        });
        return new Response().setII(1,true,summaryList,"预警分析管理-查询所有的属性对应关系");
    }
}
src/main/java/com/whyc/service/BattRealdataIdService.java
@@ -1,9 +1,6 @@
package com.whyc.service;
import com.whyc.dto.Real.BattHisRealDto;
import com.whyc.dto.Real.CompareDto;
import com.whyc.dto.Real.QuarterDto;
import com.whyc.dto.Real.RealDateDTO;
import com.whyc.dto.Real.*;
import com.whyc.dto.Response;
import com.whyc.factory.ThreadPoolExecutorFactory;
import com.whyc.mapper.CommonMapper;
@@ -175,30 +172,59 @@
        return new Response().setII(1,map.size()>0,map,"获取电池组最近一季度的温度数据");
    }
    //系统概览获取前N笔核容设备信息
    public Response getBattDevData100(Integer powerId,Integer battgroupId) {
        String dateTime = ActionUtil.sdfwithOutday.format(new Date());
        String tableName ="db_data_history.tb_batt_realdata_"+battgroupId+"_"+dateTime;
    public Response getBattDevData100(Integer powerId,Integer battgroupId) throws ParseException, InterruptedException {
        //获取前笔数*时间间隔
        PowerheartParam heartParam=heartService.getHeartParamByPowerId(powerId);
        Integer interverCount=100*10;//默认值
        Integer granularity=10;//默认值
        Integer granularity=5;//默认值
        if(heartParam!=null){
            interverCount=heartParam.getAcinInterverCfg()*heartParam.getAcinCountCfg();
            granularity=heartParam.getAcinInterverCfg();
            interverCount=heartParam.getHrInterverCfg()*heartParam.getHrCountCfg();
            granularity=heartParam.getHrInterverCfg();
        }
        //获取前半个小时数据
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        LocalDateTime now = LocalDateTime.now();
        // è®¡ç®—半小时前的时间点
        String dateTime = now.format(formatter);
        Date endTime=ActionUtil.sdf.parse(dateTime);
        // è®¡ç®—笔数*时间间隔的时间点
        LocalDateTime halfHourAgo = now.minusMinutes(interverCount);
        // æ ¼å¼åŒ–输出
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        String halfHourAgoTime=halfHourAgo.format(formatter);
        String existTableName = commonMapper.existTable("db_data_history", "tb_batt_realdata_"+battgroupId+"_"+dateTime);
        if(existTableName == null){
            return new Response().set(1,false,"当前电池组不存在前面小时数据");
        Date startTime=ActionUtil.sdf.parse(halfHourAgoTime);
        List<List<Date>> monthTimeList = DateUtil.getMonthTime(startTime,endTime);
        List<RealDateDTO> dataList = new LinkedList<>();
        ThreadPoolExecutor pool = ThreadPoolExecutorFactory.getPoolExecutor();
        CountDownLatch latch = new CountDownLatch(monthTimeList.size());
        for (int i = 0; i < monthTimeList.size(); i++) {
            int finalI = i;
            Integer finalGranularity = granularity;
            pool.execute(() -> {
                int finalII = finalI;
                Date recordDatetime=monthTimeList.get(finalII).get(0);
                Date recordDatetime1=monthTimeList.get(finalII).get(1);
                String table = battgroupId + "_" + ThreadLocalUtil.format(recordDatetime,2);
                String tableName="db_data_history.tb_batt_realdata_"+table;
                //判断表是否存在
                int tableNum = subTablePageInfoService.judgeTable_realdata(table);
                List<RealDateDTO> list = new ArrayList();
                if (tableNum > 0) {
                    //获取指定时间段内最大最小recordNum确保数据的完整
                    List recordNums= subTablePageInfoService.getBattMaxAndMinRecordNum(tableName,recordDatetime,recordDatetime1);
                    Integer maxRecordNum= 0;
                    Integer minRecordNum= 0;
                    if(recordNums.size()>0){
                        maxRecordNum=(Integer)recordNums.get(0);
                        minRecordNum=(Integer)recordNums.get(1);
                    }
                    list = subTablePageInfoService.getBattDevData100(tableName, finalGranularity,recordDatetime,recordDatetime1,maxRecordNum,minRecordNum);
                }
                dataList.addAll(list);
                latch.countDown();
            });
            sleep(200);
        }
        List<BattHisRealDto> datalist=subTablePageInfoService.getHalfHourBattDevData(tableName,granularity,halfHourAgoTime);
        return new Response().setII(1,datalist.size()>0,datalist,"获取半小时内核容设备信息");
        latch.await(10, TimeUnit.MINUTES);
        List dataListSorted = dataList.stream().sorted(Comparator.comparing(RealDateDTO::getRecordTime)).collect(Collectors.toList());
        return new Response().setII(1,dataList.size()>0,dataListSorted,"获取半小时内核容设备信息");
    }
    //历史实时数据
    public Response getBattRealDataHis(Integer battgroupId, Integer granularity,String startTime,String endTime) throws ParseException, InterruptedException {
@@ -224,13 +250,14 @@
                realdata.setRecordTime(monthTimeList.get(finalII).get(0));
                realdata.setRecordTime1(monthTimeList.get(finalII).get(1));
                String table = battgroupId + "_" + ThreadLocalUtil.format(realdata.getRecordTime(),2);
                String tableName="db_data_history.tb_batt_realdata_"+table;
                realdata.setTableName(table);//表名时间格式部分
                //判断表是否存在
                int tableNum = subTablePageInfoService.judgeTable_realdata(table);
                List<RealDateDTO> list = new ArrayList();
                if (tableNum > 0) {
                    //获取指定时间段内最大最小recordNum确保数据的完整
                    List recordNums= subTablePageInfoService.getMaxAndMinRecordNum(realdata);
                    List recordNums= subTablePageInfoService.getBattMaxAndMinRecordNum(tableName,realdata.getRecordTime(),realdata.getRecordTime1());
                    Integer maxRecordNum= 0;
                    Integer minRecordNum= 0;
                    if(recordNums.size()>0){
src/main/java/com/whyc/service/BattRtstateService.java
@@ -3,6 +3,8 @@
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.whyc.constant.BattStateEnum;
import com.whyc.constant.DevStateEnum;
import com.whyc.dto.Real.PwrHisRealDcoutInDto;
import com.whyc.dto.Real.RealDateDTO;
import com.whyc.dto.Response;
import com.whyc.mapper.BattRtstateMapper;
import com.whyc.pojo.db_ram_db.BattRtstate;
@@ -28,4 +30,10 @@
        Map<Integer,String> map= BattStateEnum.getOpInfo();
        return new Response().setII(1,true,map,"获取电池组工作状态类型(下拉)");
    }
    //实时推送电池核容设备心跳数据
    public RealDateDTO getBattRealHr(Integer battgroupId) {
        RealDateDTO hrDto=mapper.getBattRealHr(battgroupId);
        return hrDto;
    }
}
src/main/java/com/whyc/service/BatttestdataInfService.java
@@ -278,7 +278,6 @@
                if(param.getParamNamePsx().equals("batt_mon_damage_val")){
                    damageValue=param.getParamValue();
                }
            }
        }
        //1查询符合条件的电池组
src/main/java/com/whyc/service/PowerheartParamService.java
@@ -1,6 +1,8 @@
package com.whyc.service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.whyc.dto.Response;
import com.whyc.mapper.PowerheartParamMapper;
import com.whyc.pojo.db_param.PowerheartParam;
import org.springframework.beans.factory.annotation.Autowired;
@@ -29,4 +31,39 @@
        heartParam.setHrCountCfg(100);
        mapper.insert(heartParam);
    }
    //查询电源心跳参数
    public Response getPwrHeartParam(Integer powerId) {
        QueryWrapper wrapper=new QueryWrapper();
        wrapper.eq("power_id",powerId);
        wrapper.last("limit 1");
        PowerheartParam param= mapper.selectOne(wrapper);
        return new Response().setII(1,param!=null,param,"查询电源心跳参数");
    }
    //设置电源心跳参数-交流输入
    public Response setPwrHeartAcIn(Integer powerId, Integer interverCfg, Integer countCfg) {
        UpdateWrapper wrapper=new UpdateWrapper();
        wrapper.eq("power_id",powerId);
        wrapper.set("acin_interver_cfg",interverCfg);
        wrapper.set("acin_count_cfg",countCfg);
        int flag=mapper.update(null,wrapper);
        return new Response().setII(1,flag>0,flag>0,"设置电源心跳参数-交流输入");
    }
    //设置电源心跳参数-直流输出
    public Response setPwrHeartAcOut(Integer powerId, Integer interverCfg, Integer countCfg) {
        UpdateWrapper wrapper=new UpdateWrapper();
        wrapper.eq("power_id",powerId);
        wrapper.set("acout_interver_cfg",interverCfg);
        wrapper.set("acout_count_cfg",countCfg);
        int flag=mapper.update(null,wrapper);
        return new Response().setII(1,flag>0,flag>0,"设置电源心跳参数-直流输出");
    }
    //设置电源心跳参数-核容设备
    public Response setPwrHeartHr(Integer powerId, Integer interverCfg, Integer countCfg) {
        UpdateWrapper wrapper=new UpdateWrapper();
        wrapper.eq("power_id",powerId);
        wrapper.set("hr_interver_cfg",interverCfg);
        wrapper.set("hr_count_cfg",countCfg);
        int flag=mapper.update(null,wrapper);
        return new Response().setII(1,flag>0,flag>0,"设置电源心跳参数-交流输入");
    }
}
src/main/java/com/whyc/service/PwrdevAcdcdataService.java
@@ -1,6 +1,8 @@
package com.whyc.service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.whyc.dto.Real.PwrHisRealAcInDto;
import com.whyc.dto.Real.PwrHisRealDcoutInDto;
import com.whyc.mapper.PwrdevAcdcdataMapper;
import com.whyc.pojo.db_ram_db.BattRtstate;
import com.whyc.pojo.db_ram_db.PwrdevAcdcdata;
@@ -19,4 +21,16 @@
        PwrdevAcdcdata pwr=mapper.selectOne(wrapper);
        return pwr;
    }
    //电源心跳数据获取交流输入实时数据
    public PwrHisRealAcInDto getPwrRealAcIn(Integer powerId) {
        PwrHisRealAcInDto acinDto=mapper.getPwrRealAcIn(powerId);
        return acinDto;
    }
    //电源心跳数据获取电源直流输出数据实时数据
    public PwrHisRealDcoutInDto getPwrRealDcOut(Integer powerId) {
        PwrHisRealDcoutInDto dcoutDto=mapper.getPwrRealDcOut(powerId);
        return dcoutDto;
    }
}
src/main/java/com/whyc/service/PwrdevHistorydataIdService.java
@@ -96,7 +96,15 @@
                int tableNum = subTablePageInfoService.judgeTable_pwrhis(table);
                List<PwrHisRealAcInDto> list = new ArrayList();
                if (tableNum > 0) {
                    list=subTablePageInfoService.getHalfHourPwrHisAcinData(tableName, finalGranularity,recordDatetime,recordDatetime1);
                    //获取指定时间段内最大最小recordNum确保数据的完整
                    List recordNums= subTablePageInfoService.getPwrMaxAndMinRecordNum(tableName,recordDatetime,recordDatetime1);
                    Integer maxRecordNum= 0;
                    Integer minRecordNum= 0;
                    if(recordNums.size()>0){
                        maxRecordNum=(Integer)recordNums.get(0);
                        minRecordNum=(Integer)recordNums.get(1);
                    }
                    list=subTablePageInfoService.getHalfHourPwrHisAcinData(tableName, finalGranularity,recordDatetime,recordDatetime1,maxRecordNum,minRecordNum);
                }
                dataList.addAll(list);
                latch.countDown();
@@ -106,39 +114,67 @@
        latch.await(10, TimeUnit.MINUTES);
        List dataListSorted = dataList.stream().sorted(Comparator.comparing(PwrHisRealAcInDto::getRecordDatetime)).collect(Collectors.toList());
        return new Response().setII(1,dataList.size()>0,dataListSorted,"获取半小时内交流输入统计");
    }
    //系统概览获取前N笔直流输出统计
    public Response getHalfHourPwrHisDcoutData(Integer powerId) {
        String dateTime = ActionUtil.sdfwithOutday.format(new Date());
    public Response getHalfHourPwrHisDcoutData(Integer powerId) throws InterruptedException, ParseException {
        //获取前笔数*时间间隔
        PowerheartParam heartParam=heartService.getHeartParamByPowerId(powerId);
        Integer interverCount=100*5;//默认值
        Integer granularity=5;//默认值
        if(heartParam!=null){
            interverCount=heartParam.getAcinInterverCfg()*heartParam.getAcinCountCfg();
            granularity=heartParam.getAcinInterverCfg();
            interverCount=heartParam.getAcoutInterverCfg()*heartParam.getAcoutCountCfg();
            granularity=heartParam.getAcoutInterverCfg();//默认时间间隔一分钟一笔,所以时间间隔就是几笔取一笔
        }
        //获取前半个小时数据
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        LocalDateTime now = LocalDateTime.now();
        // è®¡ç®—半小时前的时间点
        String dateTime = now.format(formatter);
        Date endTime=ActionUtil.sdf.parse(dateTime);
        // è®¡ç®—笔数*时间间隔的时间点
        LocalDateTime halfHourAgo = now.minusMinutes(interverCount);
        // æ ¼å¼åŒ–输出
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        String halfHourAgoTime=halfHourAgo.format(formatter);
        String tableName ="db_data_history.tb_pwrdev_historydata_"+powerId+"_"+dateTime;
        String existTableName = commonMapper.existTable("db_data_history", "tb_pwrdev_historydata_"+powerId+"_"+dateTime);
        if(existTableName == null){
            return new Response().set(1,false,"当前电源不存在前面小时数据");
        Date startTime=ActionUtil.sdf.parse(halfHourAgoTime);
        //获取两个时间分割多少张表
        List<List<Date>> monthTimeList = DateUtil.getMonthTime(startTime,endTime);
        List<PwrHisRealDcoutInDto> dataList = new LinkedList<>();
        ThreadPoolExecutor pool = ThreadPoolExecutorFactory.getPoolExecutor();
        CountDownLatch latch = new CountDownLatch(monthTimeList.size());
        for (int i = 0; i < monthTimeList.size(); i++) {
            int finalI = i;
            Integer finalGranularity = granularity;
            pool.execute(() -> {
                int finalII = finalI;
                Date recordDatetime=monthTimeList.get(finalII).get(0);
                Date recordDatetime1=monthTimeList.get(finalII).get(1);
                String table = powerId + "_" + ThreadLocalUtil.format(recordDatetime,2);
                String tableName="db_data_history.tb_pwrdev_historydata_"+table;
                //判断表是否存在
                int tableNum = subTablePageInfoService.judgeTable_pwrhis(table);
                List<PwrHisRealDcoutInDto> list = new ArrayList();
                if (tableNum > 0) {
                    //获取指定时间段内最大最小recordNum确保数据的完整
                    List recordNums= subTablePageInfoService.getPwrMaxAndMinRecordNum(tableName,recordDatetime,recordDatetime1);
                    Integer maxRecordNum= 0;
                    Integer minRecordNum= 0;
                    if(recordNums.size()>0){
                        maxRecordNum=(Integer)recordNums.get(0);
                        minRecordNum=(Integer)recordNums.get(1);
                    }
                    list=subTablePageInfoService.getHalfHourPwrHisDcoutData(tableName, finalGranularity,recordDatetime,recordDatetime1,maxRecordNum,minRecordNum);
                }
                dataList.addAll(list);
                latch.countDown();
            });
            sleep(200);
        }
        List<PwrHisRealDcoutInDto> datalist=subTablePageInfoService.getHalfHourPwrHisDcoutData(tableName,granularity,halfHourAgoTime);
        latch.await(10, TimeUnit.MINUTES);
        List dataListSorted = dataList.stream().sorted(Comparator.comparing(PwrHisRealDcoutInDto::getRecordDatetime)).collect(Collectors.toList());
        Long modelCfg=0l;
        PowerInf pinf=powerInfService.getPowerInfById(powerId);
        if(pinf!=null){
            modelCfg=pinf.getModelCfg();
        }
        return new Response().setIII(1,datalist.size()>0,datalist,modelCfg,"获取半小时内直流输出统计");
        return new Response().setIII(1,dataList.size()>0,dataListSorted,modelCfg,"获取半小时内直流输出统计");
    }
    //1.2.7优良电源统计上一季度的电源某一属性和参数阈值超过的次数
    public Integer getPwrQuarter7(Integer powerId,Integer powerType) throws NoSuchFieldException, IllegalAccessException {
@@ -225,4 +261,44 @@
            return PwrCapperformanceEnum.PWRSTATE_4.getStateId();
        }
    }
    //电源历史实时查询
    public Response getPwrRealDataHis(Integer powerId, Integer granularity, String startTime, String endTime) throws InterruptedException, ParseException {
        //获取两个时间分割多少张表
        List<List<Date>> monthTimeList = DateUtil.getMonthTime(ThreadLocalUtil.parse(startTime,1),ThreadLocalUtil.parse(endTime,1));
        List<PwrHisRealDcoutInDto> dataList = new LinkedList<>();
        ThreadPoolExecutor pool = ThreadPoolExecutorFactory.getPoolExecutor();
        CountDownLatch latch = new CountDownLatch(monthTimeList.size());
        for (int i = 0; i < monthTimeList.size(); i++) {
            int finalI = i;
            Integer finalGranularity = granularity;
            pool.execute(() -> {
                int finalII = finalI;
                Date recordDatetime=monthTimeList.get(finalII).get(0);
                Date recordDatetime1=monthTimeList.get(finalII).get(1);
                String table = powerId + "_" + ThreadLocalUtil.format(recordDatetime,2);
                String tableName="db_data_history.tb_pwrdev_historydata_"+table;
                //判断表是否存在
                int tableNum = subTablePageInfoService.judgeTable_pwrhis(table);
                List<PwrHisRealDcoutInDto> list = new ArrayList();
                if (tableNum > 0) {
                    //获取指定时间段内最大最小recordNum确保数据的完整
                    List recordNums= subTablePageInfoService.getPwrMaxAndMinRecordNum(tableName,recordDatetime,recordDatetime1);
                    Integer maxRecordNum= 0;
                    Integer minRecordNum= 0;
                    if(recordNums.size()>0){
                        maxRecordNum=(Integer)recordNums.get(0);
                        minRecordNum=(Integer)recordNums.get(1);
                    }
                    list=subTablePageInfoService.getPwrRealDataHis(tableName, finalGranularity,recordDatetime,recordDatetime1,maxRecordNum,minRecordNum);
                }
                dataList.addAll(list);
                latch.countDown();
            });
            sleep(200);
        }
        latch.await(10, TimeUnit.MINUTES);
        List dataListSorted = dataList.stream().sorted(Comparator.comparing(PwrHisRealDcoutInDto::getRecordDatetime)).collect(Collectors.toList());
        return new Response().setII(1,dataList.size()>0,dataListSorted,"获取半小时内直流输出统计");
    }
}
src/main/java/com/whyc/service/SubTablePageInfoService.java
@@ -593,13 +593,13 @@
        return list;
    }
    //系统概览获取半小时交流输入统计
    public List<PwrHisRealAcInDto> getHalfHourPwrHisAcinData(String tableName,Integer granularity,Date recordDatetime,Date recordDatetime1) {
    public List<PwrHisRealAcInDto> getHalfHourPwrHisAcinData(String tableName,Integer granularity,Date recordDatetime,Date recordDatetime1,Integer maxRecordNum,Integer minRecordNum) {
        String sql=" select  distinct record_datetime,acin1_vola,acin1_volb,acin1_volc,acin2_vola,acin2_volb,acin2_volc " +
                " ,acin1_curra,acin1_currb,acin1_currc,acin2_curra,acin2_currb,acin2_currc  " +
                " from "+tableName+" where record_datetime>='"+ActionUtil.sdf.format(recordDatetime)+"'" +
                "                    and record_datetime<='"+ActionUtil.sdf.format(recordDatetime1)+
                "' and record_num%"+granularity+"=0 or record_num=1 or record_num=100 ";
        sql+=" order by record_datetime asc";
                "' and (record_num-"+minRecordNum+")%"+granularity+"=0  or record_num="+minRecordNum+" or record_num="+maxRecordNum;
        sql+="  order by record_datetime asc";
        List<PwrHisRealAcInDto> list = sqlExecuteService.executeQuery_call(sql, new CallBack() {
            @Override
            public List getResults(ResultSet rs) throws SQLException {
@@ -627,13 +627,65 @@
        return list;
    }
    public List<PwrHisRealDcoutInDto> getHalfHourPwrHisDcoutData(String tableName,Integer granularity,String halfHourAgoTime) {
    public List<PwrHisRealDcoutInDto> getHalfHourPwrHisDcoutData(String tableName,Integer granularity,Date recordDatetime,Date recordDatetime1,Integer maxRecordNum,Integer minRecordNum) {
        String sql="select  distinct * " +
                "from (select a.*, (@i:= @i+1) as number " +
                "     from (select * from "+tableName+" "+
                "                    where record_datetime>='"+halfHourAgoTime+"') a, " +
                "                   (select @i:=0) b) c "+
                " where c.number%"+granularity+"=0 or c.number=1 ";
                " from "+tableName+" where record_datetime>='"+ActionUtil.sdf.format(recordDatetime)+"'" +
                "                    and record_datetime<='"+ActionUtil.sdf.format(recordDatetime1)+
                "' and (record_num-"+minRecordNum+")%"+granularity+"=0 or record_num="+minRecordNum+" or record_num="+maxRecordNum;
        sql+=" order by record_datetime asc";
        List<PwrHisRealDcoutInDto> list = sqlExecuteService.executeQuery_call(sql, new CallBack() {
            @Override
            public List getResults(ResultSet rs) throws SQLException {
                List<PwrHisRealDcoutInDto> list=new ArrayList<>();
                while (rs.next()){
                    PwrHisRealDcoutInDto data=new PwrHisRealDcoutInDto();
                    data.setRecordDatetime(rs.getTimestamp("record_datetime"));
                    data.setMOutputvol(rs.getFloat("m_outputvol"));
                    data.setM1Outcurr(rs.getFloat("m1_outcurr"));
                    data.setM2Outcurr(rs.getFloat("m2_outcurr"));
                    data.setM3Outcurr(rs.getFloat("m3_outcurr"));
                    data.setM4Outcurr(rs.getFloat("m4_outcurr"));
                    data.setM5Outcurr(rs.getFloat("m5_outcurr"));
                    data.setM6Outcurr(rs.getFloat("m6_outcurr"));
                    data.setM7Outcurr(rs.getFloat("m7_outcurr"));
                    data.setM8Outcurr(rs.getFloat("m8_outcurr"));
                    data.setM9Outcurr(rs.getFloat("m9_outcurr"));
                    data.setM10Outcurr(rs.getFloat("m10_outcurr"));
                    data.setM11Outcurr(rs.getFloat("m11_outcurr"));
                    data.setM12Outcurr(rs.getFloat("m12_outcurr"));
                    data.setM13Outcurr(rs.getFloat("m13_outcurr"));
                    data.setM14Outcurr(rs.getFloat("m14_outcurr"));
                    data.setM15Outcurr(rs.getFloat("m15_outcurr"));
                    data.setM16Outcurr(rs.getFloat("m16_outcurr"));
                    data.setM1OutVol(rs.getFloat("m1_out_vol"));
                    data.setM2OutVol(rs.getFloat("m2_out_vol"));
                    data.setM3OutVol(rs.getFloat("m3_out_vol"));
                    data.setM4OutVol(rs.getFloat("m4_out_vol"));
                    data.setM5OutVol(rs.getFloat("m5_out_vol"));
                    data.setM6OutVol(rs.getFloat("m6_out_vol"));
                    data.setM7OutVol(rs.getFloat("m7_out_vol"));
                    data.setM8OutVol(rs.getFloat("m8_out_vol"));
                    data.setM9OutVol(rs.getFloat("m9_out_vol"));
                    data.setM10OutVol(rs.getFloat("m10_out_vol"));
                    data.setM11OutVol(rs.getFloat("m11_out_vol"));
                    data.setM12OutVol(rs.getFloat("m12_out_vol"));
                    data.setM13OutVol(rs.getFloat("m13_out_vol"));
                    data.setM14OutVol(rs.getFloat("m14_out_vol"));
                    data.setM15OutVol(rs.getFloat("m15_out_vol"));
                    data.setM16OutVol(rs.getFloat("m16_out_vol"));
                    list.add(data);
                }
                return list;
            }
        });
        return list;
    }
    //电源历史实时
    public List<PwrHisRealDcoutInDto> getPwrRealDataHis(String tableName,Integer granularity,Date recordDatetime,Date recordDatetime1,Integer maxRecordNum,Integer minRecordNum) {
        String sql="select  distinct * " +
                " from "+tableName+" where record_datetime>='"+ActionUtil.sdf.format(recordDatetime)+"'" +
                "                    and record_datetime<='"+ActionUtil.sdf.format(recordDatetime1)+
                "' and (record_num-"+minRecordNum+")%"+granularity+"=0 or record_num="+minRecordNum+" or record_num="+maxRecordNum;
        sql+=" order by record_datetime asc";
        List<PwrHisRealDcoutInDto> list = sqlExecuteService.executeQuery_call(sql, new CallBack() {
            @Override
@@ -771,7 +823,7 @@
    }
    //电池数据历史实时处理
    public List<RealDateDTO> getBattRealDataHis(BattRealdataId realdata, int granularity,Integer maxRecordNum,Integer minRecordNum) {
        String sql=" select record_time, group_vol, online_vol,group_curr, mon_vol, mon_tmp, mon_res, mon_num,record_num  " +
        String sql=" select record_time, group_vol, online_vol,group_curr,load_curr, mon_vol, mon_tmp, mon_res, mon_num,record_num  " +
                "               from db_data_history.tb_batt_realdata_"+realdata.getTableName()+" " +
                "               where record_time >= '"+ThreadLocalUtil.format(realdata.getRecordTime(),1)+"' " +
                "               and record_time <= '"+ThreadLocalUtil.format(realdata.getRecordTime1(),1)+"' "+
@@ -798,8 +850,35 @@
        });
        return list;
    }
    //系统概览获取前N笔核容设备信息
    public List<RealDateDTO> getBattDevData100(String tableName, Integer granularity, Date recordDatetime, Date recordDatetime1,Integer maxRecordNum,Integer minRecordNum) {
        String sql=" select record_time, group_vol, online_vol,group_curr, load_curr,record_num  " +
                "               from "+tableName+" " +
                "               where record_time >= '"+ThreadLocalUtil.format(recordDatetime,1)+"' " +
                "               and record_time <= '"+ThreadLocalUtil.format(recordDatetime1,1)+"' "+
                "               and (record_num-"+minRecordNum+")%"+granularity+"=0 or record_num="+minRecordNum+" or record_num="+maxRecordNum ;
        List<RealDateDTO> list = sqlExecuteService.executeQuery_call(sql, new CallBack() {
            @Override
            public List getResults(ResultSet rs) throws SQLException {
                List<RealDateDTO> list=new ArrayList<>();
                while (rs.next()){
                    RealDateDTO ph=new RealDateDTO();
                    ph.setRecordTime(rs.getTimestamp("record_time"));
                    ph.setGroupVol(rs.getFloat("group_vol"));
                    ph.setOnlineVol(rs.getFloat("online_vol"));
                    ph.setGroupCurr(rs.getFloat("group_curr"));
                    ph.setLoadCurr(rs.getFloat("load_curr"));
                    ph.setRecordNum(rs.getInt("record_num"));
                    list.add(ph);
                }
                return list;
            }
        });
        return list;
    }
    //电池数据历史实时处理(预警分析)
    public List<ResAnalysis> getBattHisRealInAlm(BattRealdataId realdata, Map<String,Integer> battMap) {
    public List<ResAnalysis> getBattHisRealInAlm(BattRealdataId realdata, Map<String,Object> battMap) {
        String result = String.join(",", battMap.keySet());
        String sql=" select record_time,"+result+" " +
                "               from db_data_history.tb_batt_realdata_"+realdata.getTableName()+" " +
@@ -815,7 +894,7 @@
                    ph.setRecordTime(rs.getTimestamp("record_time"));
                    int i=1;
                    for (String key : battMap.keySet()) {
                        Integer dataType = battMap.get(key);
                        Integer dataType = (Integer) battMap.get(key);
                        try {
                            String propertyType = "dataType"+(i);
                            Field fieldType = ResAnalysis.class.getDeclaredField(propertyType);
@@ -848,7 +927,7 @@
    }
    //电源数据历史实时处理(预警分析)
    public List<ResAnalysis> getPwrHisRealInAlm(PwrdevHistorydataId pwrHis, Map<String,Integer> pwrMap) {
    public List<ResAnalysis> getPwrHisRealInAlm(PwrdevHistorydataId pwrHis, Map<String,Object> pwrMap) {
        String result = String.join(",", pwrMap.keySet());
        String sql=" select record_datetime,"+result+"  " +
                "               from db_data_history.tb_pwrdev_historydata_"+pwrHis.getTableName()+" " +
@@ -864,7 +943,7 @@
                    ph.setRecordTime(rs.getTimestamp("record_datetime"));
                    int i=1;
                    for (String key : pwrMap.keySet()) {
                        Integer dataType = pwrMap.get(key);
                        Integer dataType = (Integer) pwrMap.get(key);
                        try {
                            String propertyType = "dataType"+(i);
                            Field fieldType = ResAnalysis.class.getDeclaredField(propertyType);
@@ -895,12 +974,12 @@
        });
        return list;
    }
    //获取指定时间段内最大最小recordNum确保数据的完整
    public List getMaxAndMinRecordNum(BattRealdataId realdata) {
    //获取电池组指定时间段内最大最小recordNum确保数据的完整
    public List getBattMaxAndMinRecordNum(String tableName,  Date recordDatetime, Date recordDatetime1) {
        String sql="select max(record_num) as maxRecordNum,min(record_num) as minRecordNum " +
                " from db_data_history.tb_batt_realdata_" + realdata.getTableName()+" " +
                " where record_time >= '"+ThreadLocalUtil.format(realdata.getRecordTime(),1)+"' " +
                " and record_time <= '"+ThreadLocalUtil.format(realdata.getRecordTime1(),1)+"'  " +
                " from " + tableName+" " +
                " where record_time >= '"+ThreadLocalUtil.format(recordDatetime,1)+"' " +
                " and record_time <= '"+ThreadLocalUtil.format(recordDatetime1,1)+"'  " +
                " limit 1";
        List list = sqlExecuteService.executeQuery_call(sql, new CallBack() {
            @Override
@@ -914,6 +993,26 @@
            }
           });
         return list;
    }
    //获取电源指定时间段内最大最小recordNum确保数据的完整
    public List getPwrMaxAndMinRecordNum(String tableName,  Date recordDatetime, Date recordDatetime1) {
        String sql="select max(record_num) as maxRecordNum,min(record_num) as minRecordNum " +
                " from " + tableName+" " +
                " where record_datetime >= '"+ThreadLocalUtil.format(recordDatetime,1)+"' " +
                " and record_datetime <= '"+ThreadLocalUtil.format(recordDatetime1,1)+"'  " +
                " limit 1";
        List list = sqlExecuteService.executeQuery_call(sql, new CallBack() {
            @Override
            public List getResults(ResultSet rs) throws SQLException {
                List list = new ArrayList<>();
                while (rs.next()) {
                    list.add(rs.getInt("maxRecordNum"));
                    list.add(rs.getInt("minRecordNum"));
                }
                return list;
            }
        });
        return list;
    }
    //1.2.7优良电源统计上一季度的电源某一属性和参数阈值超过的次数
    public List<PwrdevHistorydataId> getPwrQuarter7(String tableName,List<String> propertyNameList) {
@@ -984,4 +1083,5 @@
        });
        return list;
    }
}
src/main/java/com/whyc/webSocket/HeartAcInSocket.java
New file
@@ -0,0 +1,111 @@
package com.whyc.webSocket;
import com.whyc.config.WebSocketConfig;
import com.whyc.dto.Real.PwrHisRealAcInDto;
import com.whyc.dto.Response;
import com.whyc.pojo.db_param.PowerheartParam;
import com.whyc.service.PowerheartParamService;
import com.whyc.service.PwrdevAcdcdataService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpSession;
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.util.HashMap;
import java.util.Map;
/**
 * å®žæ—¶æŽ¨é€ç”µæºäº¤æµè¾“入心跳交流输入数据
 */
@Component
@ServerEndpoint(value = "/acin",encoders = WebSocketEncoder.class,configurator = WebSocketConfig.class)
public class HeartAcInSocket {
    private Session session;
    private Thread thread;
    private static PwrdevAcdcdataService acdcdataService;
    private static PowerheartParamService pwrHeartService;
    private static HttpSession httpSession;
    private volatile boolean runFlag = true;
    private volatile Map<String, Thread> threadMap = new HashMap<>();
    private volatile Map<Long,Boolean> threadFlagMap = new HashMap<>();
    @Autowired
    public void setPwrdevAcdcdataService(PwrdevAcdcdataService service) {
        HeartAcInSocket.acdcdataService = service;
    }
    @Autowired
    public void setPowerheartParamService(PowerheartParamService service) {
        HeartAcInSocket.pwrHeartService = service;
    }
    @OnOpen
    public void onOpen(Session session, EndpointConfig config) {
        this.session = session;
        this.httpSession = (HttpSession) config.getUserProperties().get("httpSession");
    }
    @OnMessage
    public void onMessage(Session session, String message) {
        Integer powerId = Integer.valueOf(message);
        thread = new Thread("Thread_HeartacinSocket") {
            @Override
            public void run() {
                while (runFlag && !isInterrupted()) {
                    Thread thread = currentThread();
                    threadFlagMap.put(thread.getId(), true);
                    try {
                        PwrHisRealAcInDto acinDto = acdcdataService.getPwrRealAcIn(powerId);
                        if (session.isOpen()) {
                            //推送信息
                            synchronized (session) {
                                session.getBasicRemote().sendObject(new Response<>().setII(1,acinDto!=null,acinDto,"电源交流输入数据"));
                            }
                            threadFlagMap.put(thread.getId(), false);
                        }
                        PowerheartParam powerheartParam=pwrHeartService.getHeartParamByPowerId(powerId);
                        sleep(1000*60*powerheartParam.getAcinInterverCfg());
                    } catch (Exception e) {
                        interrupt();
                    }
                }
            }
        };
        thread.start();
        threadFlagMap.put(thread.getId(),true);
        //停止老的socket线程
        Thread threadBefore = threadMap.get(session.getId());
        if(threadBefore !=null && threadBefore.isAlive()){
            while (threadFlagMap.get(threadBefore.getId())){
            }
            threadBefore.interrupt();
        }
        //将线程存储,便于调用定位
        threadMap.put(session.getId(), this.thread);
    }
    @OnClose
    public void onClose(CloseReason closeReason){
        System.err.println("closeReason = " + closeReason);
        runFlag = false;
        if (thread != null && thread.isAlive()) {
            thread.interrupt();
        }
        threadMap.remove(session.getId());
    }
    @OnError
    public void onError(Throwable error) {
        error.printStackTrace();
        if (thread != null && thread.isAlive()) {
            thread.interrupt();
        }
        threadMap.remove(session.getId());
    }
}
src/main/java/com/whyc/webSocket/HeartAcOutSocket.java
New file
@@ -0,0 +1,112 @@
package com.whyc.webSocket;
import com.whyc.config.WebSocketConfig;
import com.whyc.dto.Real.PwrHisRealAcInDto;
import com.whyc.dto.Real.PwrHisRealDcoutInDto;
import com.whyc.dto.Response;
import com.whyc.pojo.db_param.PowerheartParam;
import com.whyc.service.PowerheartParamService;
import com.whyc.service.PwrdevAcdcdataService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpSession;
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.util.HashMap;
import java.util.Map;
/**
 * å®žæ—¶æŽ¨é€ç”µæºç›´æµè¾“出心跳交流输入数据
 */
@Component
@ServerEndpoint(value = "/acout",encoders = WebSocketEncoder.class,configurator = WebSocketConfig.class)
public class HeartAcOutSocket {
    private Session session;
    private Thread thread;
    private static PwrdevAcdcdataService acdcdataService;
    private static PowerheartParamService pwrHeartService;
    private static HttpSession httpSession;
    private volatile boolean runFlag = true;
    private volatile Map<String, Thread> threadMap = new HashMap<>();
    private volatile Map<Long,Boolean> threadFlagMap = new HashMap<>();
    @Autowired
    public void setPwrdevAcdcdataService(PwrdevAcdcdataService service) {
        HeartAcOutSocket.acdcdataService = service;
    }
    @Autowired
    public void setPowerheartParamService(PowerheartParamService service) {
        HeartAcOutSocket.pwrHeartService = service;
    }
    @OnOpen
    public void onOpen(Session session, EndpointConfig config) {
        this.session = session;
        this.httpSession = (HttpSession) config.getUserProperties().get("httpSession");
    }
    @OnMessage
    public void onMessage(Session session, String message) {
        Integer powerId = Integer.valueOf(message);
        thread = new Thread("Thread_HeartacoutSocket") {
            @Override
            public void run() {
                while (runFlag && !isInterrupted()) {
                    Thread thread = currentThread();
                    threadFlagMap.put(thread.getId(), true);
                    try {
                        PwrHisRealDcoutInDto dcoutDto = acdcdataService.getPwrRealDcOut(powerId);
                        if (session.isOpen()) {
                            //推送信息
                            synchronized (session) {
                                session.getBasicRemote().sendObject(new Response<>().setII(1,dcoutDto!=null,dcoutDto,"电源直流输出数据"));
                            }
                            threadFlagMap.put(thread.getId(), false);
                        }
                        PowerheartParam powerheartParam=pwrHeartService.getHeartParamByPowerId(powerId);
                        sleep(1000*60*powerheartParam.getAcoutInterverCfg());
                    } catch (Exception e) {
                        interrupt();
                    }
                }
            }
        };
        thread.start();
        threadFlagMap.put(thread.getId(),true);
        //停止老的socket线程
        Thread threadBefore = threadMap.get(session.getId());
        if(threadBefore !=null && threadBefore.isAlive()){
            while (threadFlagMap.get(threadBefore.getId())){
            }
            threadBefore.interrupt();
        }
        //将线程存储,便于调用定位
        threadMap.put(session.getId(), this.thread);
    }
    @OnClose
    public void onClose(CloseReason closeReason){
        System.err.println("closeReason = " + closeReason);
        runFlag = false;
        if (thread != null && thread.isAlive()) {
            thread.interrupt();
        }
        threadMap.remove(session.getId());
    }
    @OnError
    public void onError(Throwable error) {
        error.printStackTrace();
        if (thread != null && thread.isAlive()) {
            thread.interrupt();
        }
        threadMap.remove(session.getId());
    }
}
src/main/java/com/whyc/webSocket/HeartHrSocket.java
New file
@@ -0,0 +1,120 @@
package com.whyc.webSocket;
import com.whyc.config.WebSocketConfig;
import com.whyc.dto.Real.PwrHisRealDcoutInDto;
import com.whyc.dto.Real.RealDateDTO;
import com.whyc.dto.Real.RealHeart;
import com.whyc.dto.Response;
import com.whyc.pojo.db_param.PowerheartParam;
import com.whyc.pojo.db_ram_db.BattRtdata;
import com.whyc.pojo.db_ram_db.BattRtstate;
import com.whyc.service.BattRtdataService;
import com.whyc.service.BattRtstateService;
import com.whyc.service.PowerheartParamService;
import com.whyc.service.PwrdevAcdcdataService;
import com.whyc.util.ActionUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpSession;
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.util.HashMap;
import java.util.Map;
/**
 * å®žæ—¶æŽ¨é€ç”µæ± æ ¸å®¹è®¾å¤‡å¿ƒè·³æ•°æ®
 */
@Component
@ServerEndpoint(value = "/hr",encoders = WebSocketEncoder.class,configurator = WebSocketConfig.class)
public class HeartHrSocket {
    private Session session;
    private Thread thread;
    private static BattRtstateService rtstateService;
    private static PowerheartParamService pwrHeartService;
    private static HttpSession httpSession;
    private volatile boolean runFlag = true;
    private volatile Map<String, Thread> threadMap = new HashMap<>();
    private volatile Map<Long,Boolean> threadFlagMap = new HashMap<>();
    @Autowired
    public void setBattRtstateService(BattRtstateService service) {
        HeartHrSocket.rtstateService = service;
    }
    @Autowired
    public void setPowerheartParamService(PowerheartParamService service) {
        HeartHrSocket.pwrHeartService = service;
    }
    @OnOpen
    public void onOpen(Session session, EndpointConfig config) {
        this.session = session;
        this.httpSession = (HttpSession) config.getUserProperties().get("httpSession");
    }
    @OnMessage
    public void onMessage(Session session, String message) {
        RealHeart heart= ActionUtil.getGson().fromJson(message,RealHeart.class);
        thread = new Thread("Thread_HeartacoutSocket") {
            @Override
            public void run() {
                while (runFlag && !isInterrupted()) {
                    Thread thread = currentThread();
                    threadFlagMap.put(thread.getId(), true);
                    try {
                        RealDateDTO hrdto=rtstateService.getBattRealHr(heart.getBattgroupId());
                        if (session.isOpen()) {
                            //推送信息
                            synchronized (session) {
                                session.getBasicRemote().sendObject(new Response<>().setII(1,hrdto!=null,hrdto,"电源直流输出数据"));
                            }
                            threadFlagMap.put(thread.getId(), false);
                        }
                        PowerheartParam powerheartParam=pwrHeartService.getHeartParamByPowerId(heart.getPowerId());
                        sleep(1000*60*powerheartParam.getHrInterverCfg());
                    } catch (Exception e) {
                        interrupt();
                    }
                }
            }
        };
        thread.start();
        threadFlagMap.put(thread.getId(),true);
        //停止老的socket线程
        Thread threadBefore = threadMap.get(session.getId());
        if(threadBefore !=null && threadBefore.isAlive()){
            while (threadFlagMap.get(threadBefore.getId())){
            }
            threadBefore.interrupt();
        }
        //将线程存储,便于调用定位
        threadMap.put(session.getId(), this.thread);
    }
    @OnClose
    public void onClose(CloseReason closeReason){
        System.err.println("closeReason = " + closeReason);
        runFlag = false;
        if (thread != null && thread.isAlive()) {
            thread.interrupt();
        }
        threadMap.remove(session.getId());
    }
    @OnError
    public void onError(Throwable error) {
        error.printStackTrace();
        if (thread != null && thread.isAlive()) {
            thread.interrupt();
        }
        threadMap.remove(session.getId());
    }
}
src/main/resources/mapper/BattInfMapper.xml
@@ -231,6 +231,12 @@
            <if test="stic.product!=null">
                and tb_batt_inf.product=#{stic.product}
            </if>
            <if test="stic.inuseStartTime!=null">
                and tb_batt_inf.inuse_time>=#{stic.inuseStartTime}
            </if>
            <if test="stic.inuseEndTime!=null">
                and tb_batt_inf.inuse_time&lt;=#{stic.inuseEndTimee}
            </if>
            <if test="stic.uid>100">
                and tb_batt_inf.station_id in(
                select distinct station_id from db_user.tb_baojigroup_power,db_user.tb_baojigroup_usr
src/main/resources/mapper/BattRtstateMapper.xml
New file
@@ -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.whyc.mapper.BattRtstateMapper">
    <select id="getBattRealHr" resultType="com.whyc.dto.Real.RealDateDTO">
        select * from db_ram_db.tb_batt_rtstate
        where battgroup_id=#{battgroupId}
        limit 1
    </select>
</mapper>
src/main/resources/mapper/PwrdevAcdcdataMapper.xml
New file
@@ -0,0 +1,17 @@
<?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.whyc.mapper.PwrdevAcdcdataMapper">
    <select id="getPwrRealAcIn" resultType="com.whyc.dto.Real.PwrHisRealAcInDto">
        select record_datetime,acin1_vola,acin1_volb,acin1_volc,acin2_vola,acin2_volb,acin2_volc,acin1_curra,acin1_currb,acin1_currc,acin2_curra,acin2_currb,acin2_currc
        from db_ram_db.tb_pwrdev_acdcdata
        where power_id=#{powerId}
        limit 1
    </select>
    <select id="getPwrRealDcOut" resultType="com.whyc.dto.Real.PwrHisRealDcoutInDto">
        select *
        from db_ram_db.tb_pwrdev_acdcdata
        where power_id=#{powerId}
            limit 1
    </select>
</mapper>