package com.gyee.impala.service.custom; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.gyee.impala.common.feign.RemoteServiceBuilder; import com.gyee.impala.common.spring.InitialRunner; import com.gyee.impala.common.util.DateUtil; import com.gyee.impala.model.custom.AlertHistory; import com.gyee.impala.model.master.Casewarningscada; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.*; import java.util.stream.Collectors; @Slf4j @Service public class WarningService { @Autowired private RemoteServiceBuilder remoteService; /** * 通过sharding获取时间内的报警数据 * @param category 报警分类 DI scada:windturbine 自定义:custom * @param station * @param wtId * @param time * @return */ public List resolveWarn(String category, String station, String wtId, List time){ if (StringUtils.isEmpty(station) || StringUtils.isEmpty(wtId) || time.size() == 0) return null; List result = new ArrayList<>(); List list = new ArrayList<>(); Calendar cal = Calendar.getInstance(); /**将时间按照天分开**/ Map> map = time.stream().collect(Collectors.groupingBy(item -> DateUtil.format(item, DateUtil.YYYY_MM_DD))); try{ map.forEach((k, v) -> { if (v.size() < 10) return; String max = v.stream().max(String::compareTo).get(); /**提前30分钟**/ String min = DateUtil.format(DateUtil.covertDateTimestamp(v.stream().min(String::compareTo).get()) - 30000, DateUtil.YYYY_MM_DD_HH_MM_SS); cal.setTime(DateUtil.parseStrtoDate(k)); cal.set(Calendar.HOUR_OF_DAY, cal.getActualMinimum(Calendar.HOUR_OF_DAY)); String st = DateUtil.format(cal.getTime(), DateUtil.YYYY_MM_DD); cal.add(cal.DATE,1); String et = DateUtil.format(cal.getTime(), DateUtil.YYYY_MM_DD); JSONObject data = remoteService.sharding().getAlertHistory(category, st, et, station, wtId); JSONObject json = data.getJSONObject("data"); if (json == null) return; String records = json.getJSONArray("records").toJSONString(); List ls = JSONArray.parseArray(records, AlertHistory.class); ls.stream().forEach(obj -> { if (StringUtils.isNotEmpty(obj.getCategory1()) && StringUtils.isNotEmpty(obj.getCategory2()) && obj.getAlertTime().compareTo(min) > 0 && obj.getAlertTime().compareTo(max) < 0){ Casewarningscada warn = (Casewarningscada) new Casewarningscada().toData(obj); list.add(warn); } }); }); }catch (Exception e){ e.getStackTrace(); log.error(e.getMessage()); } /**按照报警类型分类**/ Map> collect = list.stream().sorted(Comparator.comparing(Casewarningscada::getWarntime)) .filter(obj -> StringUtils.isNotEmpty(obj.getWarncode())) .collect(Collectors.groupingBy(Casewarningscada::getWarncode)); collect.forEach((k, v) -> { Map mp = new HashMap<>(); mp.put("label", InitialRunner.scadaWarnMap.get(k.toUpperCase())); mp.put("value", k); mp.put("children", v); result.add(mp); }); return result; } }