src/main/java/com/whyc/controller/RealDataStaticController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/whyc/dto/RealDataStatic/MonDataDto.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/whyc/dto/RealDataStatic/ResRealDataMon.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/whyc/dto/RealDataStatic/SticRealDataBatt.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/whyc/service/BattRealdataIdService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/whyc/service/SubTablePageInfoService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/main/java/com/whyc/controller/RealDataStaticController.java
@@ -1,6 +1,7 @@ package com.whyc.controller; import com.whyc.dto.RealDataStatic.SticRealDataAc; import com.whyc.dto.RealDataStatic.SticRealDataBatt; import com.whyc.dto.Response; import com.whyc.service.BattRealdataIdService; import com.whyc.service.PwrdevHistorydataIdService; @@ -33,4 +34,9 @@ return battRealdataIdService.getSticRealHrData(stic); } @ApiOperation(value = "蓄电池组") @PostMapping("getSticRealMonData") public Response getSticRealMonData(@RequestBody SticRealDataBatt stic) throws ParseException, InterruptedException { return battRealdataIdService.getSticRealMonData(stic); } } src/main/java/com/whyc/dto/RealDataStatic/MonDataDto.java
New file @@ -0,0 +1,12 @@ package com.whyc.dto.RealDataStatic; import lombok.Data; @Data public class MonDataDto { private Integer monNum; private Float monVol; private Float monTmp; private Float monRes; private Float monJhCurr; } src/main/java/com/whyc/dto/RealDataStatic/ResRealDataMon.java
New file @@ -0,0 +1,16 @@ package com.whyc.dto.RealDataStatic; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import java.util.Date; import java.util.List; @Data public class ResRealDataMon { private Integer battgroupId; private Integer recordNum; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") private Date recordTime; private List<MonDataDto> monList; } src/main/java/com/whyc/dto/RealDataStatic/SticRealDataBatt.java
New file @@ -0,0 +1,13 @@ package com.whyc.dto.RealDataStatic; import lombok.Data; import java.util.List; @Data public class SticRealDataBatt { private Integer battgroupId; private Integer sticTime;//1:月,2:季度,3年 private List<String> propertyList; //查询的属性 } src/main/java/com/whyc/service/BattRealdataIdService.java
@@ -2,7 +2,9 @@ import com.whyc.dto.Real.*; import com.whyc.dto.RealDataStatic.ResRealDataAc; import com.whyc.dto.RealDataStatic.ResRealDataMon; import com.whyc.dto.RealDataStatic.SticRealDataAc; import com.whyc.dto.RealDataStatic.SticRealDataBatt; import com.whyc.dto.Response; import com.whyc.factory.ThreadPoolExecutorFactory; import com.whyc.mapper.CommonMapper; @@ -354,4 +356,79 @@ Map<String, List<String>> mergedMap =ActionUtil.getMergeMap(allTimeMap); return new Response().setIII(1,dataList.size()>0,dataListSorted,mergedMap,"实时数据统计曲线--核容设备"); } //蓄电池组 public Response getSticRealMonData(SticRealDataBatt stic) throws ParseException, InterruptedException { Integer granularity=2;//默认值 Map<String,Date> startAndEndTime=DateUtil.getStartAndEndTime(stic.getSticTime()); //获取两个时间分割多少张表 List<List<Date>> monthTimeList = DateUtil.getMonthTime(startAndEndTime.get("startTime"),startAndEndTime.get("endTime")); List<ResRealDataMon> dataList = new LinkedList<>(); Map<String, Map<String,List<String>>> allTimeMap=new HashMap<>(); ThreadPoolExecutor pool = ThreadPoolExecutorFactory.getPoolExecutor(); CountDownLatch latch = new CountDownLatch(monthTimeList.size()); for (int i = 0; i < monthTimeList.size(); i++) { int finalI = i; Integer finalGranularity = granularity; List<String> propertyList=stic.getPropertyList(); pool.execute(() -> { int finalII = finalI; Date recordDatetime=monthTimeList.get(finalII).get(0); Date recordDatetime1=monthTimeList.get(finalII).get(1); String timeTable=ThreadLocalUtil.format(recordDatetime,2); String table = stic.getBattgroupId() + "_" + timeTable; String tableName="db_data_history.tb_batt_realdata_"+table; //判断表是否存在 int tableNum = subTablePageInfoService.judgeTable_realdata(table); List<ResRealDataMon> list = new ArrayList(); Map<String,List<String>> timeMap=new HashMap<>(); 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.getSticRealMonData(tableName, finalGranularity,recordDatetime,recordDatetime1,maxRecordNum,minRecordNum); //所有属性的异动点 List<Integer> allChangeNums=new ArrayList<>(); if(propertyList!=null){ for (String value:propertyList) { //获取指定时间取出每个参数的异动次数和异动的recordNum float upperLimit=3.5f; float lowerLimit=2.0f; //查询电源字段的异动 List changes= subTablePageInfoService.getBattChangesRecordNum(tableName,recordDatetime,recordDatetime1,value,upperLimit,lowerLimit); List<Integer> numList= (List<Integer>) changes.get(0);//record_num的集合 if(numList!=null&&numList.size()>0){ allChangeNums.addAll(numList); } List<String> timeList= (List<String>) changes.get(1);//record_datetime的集合 //存放每个参数的异动时间点 timeMap.put(value,timeList); } } //只有存在异动点采取查询异动数据 if(allChangeNums.size()>0){ //查询大类参数下所有异动recordNum的记录之和 List<ResRealDataMon> paramList=subTablePageInfoService.getMonPropertyChangesByRecordNum(tableName,recordDatetime,recordDatetime1,allChangeNums); list.addAll(paramList); } } allTimeMap.put(timeTable,timeMap); dataList.addAll(list); latch.countDown(); }); sleep(200); } latch.await(10, TimeUnit.MINUTES); List<ResRealDataMon> uniqueList = dataList.stream() .distinct() .collect(Collectors.toList()); List dataListSorted = uniqueList.stream().sorted(Comparator.comparing(ResRealDataMon::getRecordNum)).collect(Collectors.toList()); //所有异动点合并去重 Map<String, List<String>> mergedMap =ActionUtil.getMergeMap(allTimeMap); return new Response().setIII(1,dataList.size()>0,dataListSorted,mergedMap,"实时数据统计曲线--蓄电池组"); } } src/main/java/com/whyc/service/SubTablePageInfoService.java
@@ -5,7 +5,9 @@ import com.whyc.dto.AlmHis.PwrAlmPar; import com.whyc.dto.AnalysisAlm.ResAnalysis; import com.whyc.dto.Real.*; import com.whyc.dto.RealDataStatic.MonDataDto; import com.whyc.dto.RealDataStatic.ResRealDataAc; import com.whyc.dto.RealDataStatic.ResRealDataMon; import com.whyc.dto.Statistic.ComPareChangeCurve; import com.whyc.dto.Statistic.ComPareChart; import com.whyc.dto.Statistic.QuarterPwr7Res; @@ -1016,7 +1018,51 @@ return list; } //查询电池组字段的异动的记录 //实时数据统计曲线--蓄电池组 public List<ResRealDataMon> getSticRealMonData(String tableName, Integer granularity, Date recordDatetime, Date recordDatetime1, Integer maxRecordNum, Integer minRecordNum) { String sql=" select distinct battgroup_id,record_time,record_num,mon_num,mon_vol,mon_tmp,mon_res,mon_jh_curr "+ " 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="+maxRecordNum+" or record_num="+minRecordNum ; sql+=" order by record_num,mon_num asc "; List<ResRealDataMon> list = sqlExecuteService.executeQuery_call(sql, new CallBack() { @Override public List getResults(ResultSet rs) throws SQLException { List<ResRealDataMon> result = new ArrayList<>(); Map<String, ResRealDataMon> map = new HashMap<>(); while (rs.next()) { Integer battgroupId = rs.getInt("battgroup_id"); Date recordTime = rs.getTimestamp("record_time"); Integer recordNum = rs.getInt("record_num"); // 构建唯一键(battgroupId + recordNum) String key = battgroupId + "_" + recordNum; ResRealDataMon data = map.get(key); if (data == null) { data = new ResRealDataMon(); data.setBattgroupId(battgroupId); data.setRecordTime(recordTime); data.setRecordNum(recordNum); data.setMonList(new ArrayList<>()); map.put(key, data); result.add(data); } // 将单体数据封装到 monList 中 MonDataDto monData = new MonDataDto(); monData.setMonNum(rs.getInt("mon_num")); monData.setMonVol(rs.getFloat("mon_vol")); monData.setMonTmp(rs.getFloat("mon_tmp")); monData.setMonRes(rs.getFloat("mon_res")); monData.setMonJhCurr(rs.getFloat("mon_jh_curr")); data.getMonList().add(monData); } return result; } }); return list; } //查询核容设备/单体字段的异动的记录 public List<Object> getBattChangesRecordNum(String tableName, Date recordDatetime, Date recordDatetime1, String value, float upperLimit, float lowerLimit) { String sql=" select distinct record_time,record_num "+ " from "+tableName+" where record_time>='"+ActionUtil.sdf.format(recordDatetime)+"'" + @@ -1040,6 +1086,58 @@ }); return list; } //查询电池组单体字段的异动 public List<ResRealDataMon> getMonPropertyChangesByRecordNum(String tableName, Date recordDatetime, Date recordDatetime1, List<Integer> allChangeNums) { String sql=" select distinct battgroup_id,record_time,record_num,mon_num,mon_vol,mon_tmp,mon_res,mon_jh_curr "+ " from "+tableName+" where record_time>='"+ActionUtil.sdf.format(recordDatetime)+"'" + " and record_time<='"+ActionUtil.sdf.format(recordDatetime1)+"'"; if (allChangeNums.size() > 0) { //去除重复项 List<Integer> uniqueList = allChangeNums.stream() .distinct() .collect(Collectors.toList()); //拼接生成sql String changeNumsStr = uniqueList.stream() .map(String::valueOf) .collect(Collectors.joining(",")); sql += " and record_num in (" + changeNumsStr + ")"; } sql += " order by record_num,mon_num asc "; List<ResRealDataMon> list = sqlExecuteService.executeQuery_call(sql, new CallBack() { @Override public List getResults(ResultSet rs) throws SQLException { List<ResRealDataMon> result = new ArrayList<>(); Map<String, ResRealDataMon> map = new HashMap<>(); while (rs.next()) { Integer battgroupId = rs.getInt("battgroup_id"); Date recordTime = rs.getTimestamp("record_time"); Integer recordNum = rs.getInt("record_num"); // 构建唯一键(battgroupId + recordNum) String key = battgroupId + "_" + recordNum; ResRealDataMon data = map.get(key); if (data == null) { data = new ResRealDataMon(); data.setBattgroupId(battgroupId); data.setRecordTime(recordTime); data.setRecordNum(recordNum); data.setMonList(new ArrayList<>()); map.put(key, data); result.add(data); } // 将单体数据封装到 monList 中 MonDataDto monData = new MonDataDto(); monData.setMonNum(rs.getInt("mon_num")); monData.setMonVol(rs.getFloat("mon_vol")); monData.setMonTmp(rs.getFloat("mon_tmp")); monData.setMonRes(rs.getFloat("mon_res")); monData.setMonJhCurr(rs.getFloat("mon_jh_curr")); data.getMonList().add(monData); } return result; } }); return list; } //查询电池组字段的异动 public List<ResRealDataAc> getBattPropertyChangesByRecordNum(String tableName, Date recordDatetime, Date recordDatetime1, List<Integer> allChangeNums, Map<String, List<String>> propertyInfo) { String propertyStr = propertyInfo.values().stream()