package com.whyc.service; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.whyc.dto.AnalysisAlm.ResAnalysis; import com.whyc.dto.Real.RealDateDTO; import com.whyc.dto.Response; import com.whyc.factory.ThreadPoolExecutorFactory; import com.whyc.mapper.AlmAnalysisParamMapper; import com.whyc.pojo.db_data_history.BattRealdataId; import com.whyc.pojo.db_data_history.PwrdevHistorydataId; import com.whyc.pojo.db_param.AlmAnalysisParam; import com.whyc.pojo.db_param.AppParam; import com.whyc.util.ActionUtil; import com.whyc.util.DateUtil; import com.whyc.util.ThreadLocalUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.text.ParseException; import java.util.*; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import static java.lang.Thread.sleep; @Service public class AlmAnalysisParamService { @Autowired(required = false) private AlmAnalysisParamMapper mapper; @Autowired private AppParamService appParamService; @Autowired private SubTablePageInfoService subTablePageInfoService; //获取告警almId对应的分析配置属性值 public AlmAnalysisParam getAnalysisParam(Integer almId) { QueryWrapper wrapper=new QueryWrapper(); wrapper.eq("alm_id",almId); wrapper.last("limit 1"); AlmAnalysisParam param= mapper.selectOne(wrapper); return param; } //预警分析管理-电源主属性和分析属性 public Response getHisRealInAlm(Integer battgroupId,Integer powerId, String startTime, Integer almId,Integer intervalTime) throws ParseException, InterruptedException { Map map=new HashMap<>(); map.put("batt",null); map.put("pwr",null); Integer cycleTime=0; //获取预警分析周期阈值 if(intervalTime==null){ AppParam appParam = appParamService.getAlarmAnalysisCycle(); cycleTime=appParam.getParamValue().intValue(); }else{ cycleTime=intervalTime; } Date cyscleDate=ActionUtil.getDateAdd(ThreadLocalUtil.parse(startTime,1),cycleTime*(-1)); //获取cyscleDate到现在所有的历史实时数据 List> monthTimeList = DateUtil.getMonthTime(cyscleDate,new Date()); //获取告警almId对应的分析配置属性值 AlmAnalysisParam almAnalysisParam=getAnalysisParam(almId); if(almAnalysisParam==null||almAnalysisParam.getMainFieldType()==null){ return new Response().set(1,false,"无对应分析属性"); }else{ //分组查看需要查询电源/电池实时表的哪些数据 Map> groupmap=groupPwrAndBatt(almAnalysisParam); List battList=groupmap.get("batt"); List pwrList=groupmap.get("pwr"); if(battgroupId!=null){ if(battList!=null&&battList.size()>0){ List battHislist=getBattRealData(battgroupId,monthTimeList,battList); map.put("batt",battHislist); } } if(powerId!=null){ if(pwrList!=null&&pwrList.size()>0){ List pwrHislist=getPwrRealData(powerId,monthTimeList,pwrList); map.put("pwr",pwrHislist); } } return new Response().setIII(1,true, map,almAnalysisParam,"预警分析管理-电源主属性和分析属性"); } } //分组查看需要查询电源/电池实时表的哪些数据 private Map> groupPwrAndBatt(AlmAnalysisParam almAnalysisParam) { Map> map = new HashMap<>(); List battList=new ArrayList<>(); List pwrList=new ArrayList<>(); if(almAnalysisParam.getMainFieldType()==1||almAnalysisParam.getMainFieldType()==2||almAnalysisParam.getMainFieldType()==3){ if(almAnalysisParam.getMainField()!=null||almAnalysisParam.getMainField().length()>0){ pwrList.add(almAnalysisParam.getMainField()); } }else{ if(almAnalysisParam.getMainField()!=null||almAnalysisParam.getMainField().length()>0){ battList.add(almAnalysisParam.getMainField()); } } if(almAnalysisParam.getMinorField1Type()==1||almAnalysisParam.getMinorField1Type()==2||almAnalysisParam.getMinorField1Type()==3){ if(almAnalysisParam.getMinorField1()!=null&&almAnalysisParam.getMinorField1().length()>0){ pwrList.add(almAnalysisParam.getMinorField1()); } }else{ if(almAnalysisParam.getMinorField1()!=null&&almAnalysisParam.getMinorField1().length()>0){ battList.add(almAnalysisParam.getMinorField1()); } } if(almAnalysisParam.getMinorField2Type()==1||almAnalysisParam.getMinorField2Type()==2||almAnalysisParam.getMinorField2Type()==3){ if(almAnalysisParam.getMinorField2()!=null&&almAnalysisParam.getMinorField2().length()>0){ pwrList.add(almAnalysisParam.getMinorField2()); } }else{ if(almAnalysisParam.getMinorField2()!=null&&almAnalysisParam.getMinorField2().length()>0){ battList.add(almAnalysisParam.getMinorField2()); } } if(almAnalysisParam.getMinorField3Type()==1||almAnalysisParam.getMinorField3Type()==2||almAnalysisParam.getMinorField3Type()==3){ if(almAnalysisParam.getMinorField3()!=null&&almAnalysisParam.getMinorField3().length()>0){ pwrList.add(almAnalysisParam.getMinorField3()); } }else{ if(almAnalysisParam.getMinorField3()!=null&&almAnalysisParam.getMinorField3().length()>0){ battList.add(almAnalysisParam.getMinorField3()); } } if(almAnalysisParam.getMinorField4Type()==1||almAnalysisParam.getMinorField4Type()==2||almAnalysisParam.getMinorField4Type()==3){ if(almAnalysisParam.getMinorField4()!=null&&almAnalysisParam.getMinorField4().length()>0){ pwrList.add(almAnalysisParam.getMinorField4()); } }else{ if(almAnalysisParam.getMinorField4()!=null&&almAnalysisParam.getMinorField4().length()>0){ battList.add(almAnalysisParam.getMinorField4()); } } map.put("pwr",pwrList); map.put("batt",battList); return map; } //连接池获取电源历史实时数据 public List getPwrRealData(Integer powerId,List> monthTimeList,List pwrList) throws InterruptedException { List dataList = new LinkedList<>(); ThreadPoolExecutor pool = ThreadPoolExecutorFactory.getPoolExecutor(); CountDownLatch latch = new CountDownLatch(monthTimeList.size()); for (int i = 0; i < monthTimeList.size(); i++) { int finalI = i; pool.execute(() -> { int finalII = finalI; PwrdevHistorydataId pwrHis = new PwrdevHistorydataId(); pwrHis.setRecordDatetime(monthTimeList.get(finalII).get(0)); pwrHis.setRecordDatetime1(monthTimeList.get(finalII).get(1)); String table = powerId + "_" + ThreadLocalUtil.format(pwrHis.getRecordDatetime(),2); pwrHis.setTableName(table);//表名时间格式部分 //判断表是否存在 int tableNum = subTablePageInfoService.judgeTable_pwrhis(table); List list = new ArrayList(); if (tableNum > 0) { list = subTablePageInfoService.getPwrHisRealInAlm(pwrHis,pwrList); } dataList.addAll(list); latch.countDown(); }); sleep(200); } latch.await(10, TimeUnit.MINUTES); List dataListSorted = dataList.stream().sorted(Comparator.comparing(ResAnalysis::getRecordTime)).collect(Collectors.toList()); return dataListSorted; } //电池告警点击具体告警信息查看从告警开始时间到现在的历史实时数据 public List getBattRealData(Integer battgroupId, List> monthTimeList,List battList) throws ParseException, InterruptedException { List dataList = new LinkedList<>(); ThreadPoolExecutor pool = ThreadPoolExecutorFactory.getPoolExecutor(); CountDownLatch latch = new CountDownLatch(monthTimeList.size()); for (int i = 0; i < monthTimeList.size(); i++) { int finalI = i; pool.execute(() -> { int finalII = finalI; BattRealdataId realdata = new BattRealdataId(); realdata.setRecordTime(monthTimeList.get(finalII).get(0)); realdata.setRecordTime1(monthTimeList.get(finalII).get(1)); String table = battgroupId + "_" + ThreadLocalUtil.format(realdata.getRecordTime(),2); realdata.setTableName(table);//表名时间格式部分 //判断表是否存在 int tableNum = subTablePageInfoService.judgeTable_realdata(table); List list = new ArrayList(); if (tableNum > 0) { list = subTablePageInfoService.getBattHisRealInAlm(realdata,battList); } dataList.addAll(list); latch.countDown(); }); sleep(200); } latch.await(10, TimeUnit.MINUTES); List dataListSorted = dataList.stream().sorted(Comparator.comparing(ResAnalysis::getRecordTime)).collect(Collectors.toList()); return dataListSorted; } }