package com.whyc.service; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.whyc.dto.AnalysisAlm.AnalysisChangeRes; 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.AlmSummaryParam; 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; @Autowired private AlmSummaryParamService summaryParamService; //获取告警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) throws ParseException, InterruptedException { Map map=new HashMap<>(); map.put("batt",null); map.put("pwr",null); //获取预警分析周期阈值 AppParam appParam = appParamService.getAlarmAnalysisCycle(); Integer cycleTime=appParam.getParamValue().intValue(); Date cyscleDate=ActionUtil.getDateAdd(ThreadLocalUtil.parse(startTime,1),cycleTime*(-1)); Date endTime=ActionUtil.getDateAdd(ThreadLocalUtil.parse(startTime,1),60); //获取cyscleDate到现在所有的历史实时数据 List> monthTimeList = DateUtil.getMonthTime(cyscleDate,endTime); //获取告警almId对应的分析配置属性值 AlmAnalysisParam almAnalysisParam=getAnalysisParam(almId); if(almAnalysisParam==null||almAnalysisParam.getMainFieldType()==null){ return new Response().set(1,false,"无对应分析属性"); }else{ //分组查看需要查询电源/电池实时表的哪些数据 Map> groupmap=groupPwrAndBatt(almAnalysisParam); Map battMap=groupmap.get("batt"); Map pwrMap=groupmap.get("pwr"); Map 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); map.put("batt",battHislist); } } if(powerId!=null){ if(pwrMap!=null&&pwrMap.size()>0){ List pwrHislist=getPwrRealData(powerId,monthTimeList,pwrMap); map.put("pwr",pwrHislist); } } return new Response().setIII(1,true, map,mainMap,"预警分析管理-电源主属性和分析属性"); } } //分组查看需要查询电源/电池实时表的哪些数据 private Map> groupPwrAndBatt(AlmAnalysisParam almAnalysisParam) { Map> map = new HashMap<>(); Map battMap=new HashMap<>(); Map pwrMap=new HashMap<>(); Map 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){ if(almAnalysisParam.getMinorField1()!=null&&almAnalysisParam.getMinorField1().length()>0){ pwrMap.put(almAnalysisParam.getMinorField1(),almAnalysisParam.getMinorField1Type()); } }else{ if(almAnalysisParam.getMinorField1()!=null&&almAnalysisParam.getMinorField1().length()>0){ battMap.put(almAnalysisParam.getMinorField1(),almAnalysisParam.getMinorField1Type()); } } if(almAnalysisParam.getMinorField2Type()==1||almAnalysisParam.getMinorField2Type()==2||almAnalysisParam.getMinorField2Type()==3){ if(almAnalysisParam.getMinorField2()!=null&&almAnalysisParam.getMinorField2().length()>0){ pwrMap.put(almAnalysisParam.getMinorField2(),almAnalysisParam.getMinorField2Type()); } }else{ if(almAnalysisParam.getMinorField2()!=null&&almAnalysisParam.getMinorField2().length()>0){ battMap.put(almAnalysisParam.getMinorField2(),almAnalysisParam.getMinorField2Type()); } } if(almAnalysisParam.getMinorField3Type()==1||almAnalysisParam.getMinorField3Type()==2||almAnalysisParam.getMinorField3Type()==3){ if(almAnalysisParam.getMinorField3()!=null&&almAnalysisParam.getMinorField3().length()>0){ pwrMap.put(almAnalysisParam.getMinorField3(),almAnalysisParam.getMinorField3Type()); } }else{ if(almAnalysisParam.getMinorField3()!=null&&almAnalysisParam.getMinorField3().length()>0){ battMap.put(almAnalysisParam.getMinorField3(),almAnalysisParam.getMinorField3Type()); } } if(almAnalysisParam.getMinorField4Type()==1||almAnalysisParam.getMinorField4Type()==2||almAnalysisParam.getMinorField4Type()==3){ if(almAnalysisParam.getMinorField4()!=null&&almAnalysisParam.getMinorField4().length()>0){ pwrMap.put(almAnalysisParam.getMinorField4(),almAnalysisParam.getMinorField4Type()); } }else{ if(almAnalysisParam.getMinorField4()!=null&&almAnalysisParam.getMinorField4().length()>0){ battMap.put(almAnalysisParam.getMinorField4(),almAnalysisParam.getMinorField4Type()); } } map.put("pwr",pwrMap); map.put("batt",battMap); map.put("main",mainMap); return map; } //连接池获取电源历史实时数据 public List getPwrRealData(Integer powerId,List> monthTimeList,Map pwrMap) 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,pwrMap); } 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,Map battMap) 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,battMap); } 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 Response getHisRealWithChage(AnalysisChangeRes res) throws ParseException, InterruptedException { Map map=new HashMap<>(); map.put("batt",null); map.put("pwr",null); Integer cycleTime=0; //获取预警分析周期阈值 AppParam appParam = appParamService.getAlarmAnalysisCycle(); cycleTime=appParam.getParamValue().intValue(); Date cyscleDate=ActionUtil.getDateAdd(ThreadLocalUtil.parse(res.getStartTime(),1),cycleTime*(-1)); Date endTime=ActionUtil.getDateAdd(ThreadLocalUtil.parse(res.getStartTime(),1),60); //获取cyscleDate到现在所有的历史实时数据 List> monthTimeList = DateUtil.getMonthTime(cyscleDate,endTime); //获取告警almId对应的分析配置属性值 AlmAnalysisParam almAnalysisParam=new AlmAnalysisParam(); //将属性拷贝至almAnalysisParam中 copyProperties(almAnalysisParam,res); //分组查看需要查询电源/电池实时表的哪些数据 Map> groupmap=groupPwrAndBatt(almAnalysisParam); Map battMap=groupmap.get("batt"); Map pwrMap=groupmap.get("pwr"); Map 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); map.put("batt",battHislist); } } if(res.getPowerId()!=null){ if(pwrMap!=null&&pwrMap.size()>0){ List pwrHislist=getPwrRealData(res.getPowerId(),monthTimeList,pwrMap); map.put("pwr",pwrHislist); } } return new Response().setIII(1,true, map,mainMap,"预警分析管理-切换时间间隔和副属性"); } //将属性拷贝至almAnalysisParam中 private void copyProperties(AlmAnalysisParam almAnalysisParam, AnalysisChangeRes res) { almAnalysisParam.setMainField(res.getDataName1()); almAnalysisParam.setMainFieldType(res.getDataType1()); almAnalysisParam.setMinorField1(res.getDataName2()); almAnalysisParam.setMinorField1Type(res.getDataType2()); almAnalysisParam.setMinorField2(res.getDataName3()); almAnalysisParam.setMinorField2Type(res.getDataType3()); almAnalysisParam.setMinorField3(res.getDataName4()); almAnalysisParam.setMinorField3Type(res.getDataType4()); almAnalysisParam.setMinorField4(res.getDataName5()); almAnalysisParam.setMinorField4Type(res.getDataType5()); } //预警分析管理-查询所有的属性对应关系 public Response getAlmSummaryParam() { //总的属性配置 List summaryList=summaryParamService.getInfo(); return new Response().setII(1,true,summaryList,"预警分析管理-查询所有的属性对应关系"); } }