package com.yssh.service; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.concurrent.CountDownLatch; import com.yssh.entity.*; import com.yssh.mapper.DictRecordMapper; import com.yssh.mapper.QxshMapper; import com.yssh.mapper.SuYuanMapper; import com.yssh.mapper.WarningDetailMapper; import com.yssh.utils.CalculateUtils; import com.yssh.utils.DateUtils; import com.yssh.utils.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import com.google.common.collect.Lists; import com.yssh.entity.WarningVo; import javax.annotation.Resource; @Service public class WarningAnalyseService { protected final Logger logger = LoggerFactory.getLogger(this.getClass()); @Resource private WarningDetailMapper warningDetailMapper; @Resource private CommonService commonService; @Resource private SuYuanMapper suYuanMapper; @Resource private DictRecordMapper dictRecordMapper; @Resource private AsyncService asyncService; @Resource private QxshMapper qxshMapper; @Resource private SuYuanService suYuanService; private SimpleDateFormat ym = new SimpleDateFormat("yyyyMM%"); @Async("threadPoolTaskExecutor") public void insertWarningDetails(List warning) throws Exception { //插入数据 List> list = Lists.partition(warning, AsyncService.BATCH_INSERT_NUMBER); CountDownLatch countDownLatch = new CountDownLatch(list.size()); for (List corpReserveList : list) { asyncService.executeAsync("", corpReserveList, warningDetailMapper, countDownLatch); } countDownLatch.await(); } public List getRunTimeAlarmAnalyse() { List result = new ArrayList<>(); Date nowDate = DateUtils.getNowDate(); //String time = DateUtils.parseDateToStr(DateUtils.YYYYMMDDHH, nowDate); //DictRecord dictRecord = dictRecordMapper.selectByCreateTime(Long.parseLong(time)); //if (StringUtils.isNull(dictRecord)) { // nowDate = DateUtils.getAPeriodOfTime(nowDate, -1, Calendar.HOUR_OF_DAY); //} //List list = alarmAnalyseOperation(nowDate); List list = new ArrayList<>(); Calendar calendar = getCalendar(nowDate); for (int i = 0; i < 6; i++) { calendar.add(Calendar.HOUR, -1); List rs = getAlarmWarnAnalyse(calendar.getTime(), false); if (null != rs && rs.size() > 0) { list.addAll(rs); } } list.forEach(s -> { String time = DateUtils.getYyyyMmDdHh(s.getCreateTime()); result.add(new WarningVo(s.getLocationName(), s.getSuYuanId(), 0.0, 0.0, s.getValue(), time)); }); return result; } private Calendar getCalendar(Date nowDate) { Calendar calendar = Calendar.getInstance(); calendar.setTime(nowDate); calendar.add(Calendar.HOUR, 1); return calendar; } public List getRunTimeWarningAnalyse() { List result = new ArrayList<>(); Date nowDate = DateUtils.getNowDate(); //String time = DateUtils.parseDateToStr(DateUtils.YYYYMMDDHH, nowDate); //DictRecord dictRecord = dictRecordMapper.selectByCreateTime(Long.parseLong(time)); //if (StringUtils.isNull(dictRecord)) { // nowDate = DateUtils.getAPeriodOfTime(nowDate, -1, Calendar.HOUR_OF_DAY); //} //List list = warningAnalyseOperation(nowDate); List list = new ArrayList<>(); Calendar calendar = getCalendar(nowDate); for (int i = 0; i < 6; i++) { calendar.add(Calendar.HOUR, -1); List rs = getAlarmWarnAnalyse(calendar.getTime(), true); if (null != rs && rs.size() > 0) { list.addAll(rs); } } list.forEach(s -> { String time = DateUtils.getYyyyMmDdHh(s.getCreateTime()); result.add(new WarningVo(s.getLocationName(), s.getSuYuanId(), 0.0, 0.0, s.getValue(), time)); }); return result; } private List getAlarmWarnAnalyse(Date date, boolean isWarn) { List ids = CalculateUtils.assembleId(commonService.getCheckPoints3d()); String time = DateUtils.parseDateToStr(DateUtils.YYYYMMDDHH, date); DictRecord dictRecord = dictRecordMapper.selectByCreateTime(Long.parseLong(time)); if (null == dictRecord) return null; String tableName = dictRecord.getTableName(); if (suYuanMapper.isTableExists(tableName) == 0) return null; List list = isWarn ? suYuanMapper.getWarningAnalyse(tableName, ids) : suYuanMapper.getAlarmsAnalyse(tableName, ids); if (null == list || list.isEmpty()) { return null; } int type = isWarn ? 1 : 0; List result = new ArrayList<>(); for (SuYuan2d s : list) { String locationName = commonService.select3dCheckPointById(s.getId()).getName(); result.add(new WarningDetail(0L, tableName, s.getId(), locationName, date, type, s.getValue())); } return result; } public void warningOperationStorage(Date date) { List allData = new ArrayList<>(); List alarms = this.getAlarmWarnAnalyse(date, false); if (StringUtils.isNotEmpty(alarms)) { allData.addAll(alarms); } List warnings = this.getAlarmWarnAnalyse(date, true); if (StringUtils.isNotEmpty(warnings)) { allData.addAll(warnings); } if (StringUtils.isNotEmpty(allData)) { try { insertWarningDetails(allData); } catch (Exception e) { logger.error("批量插入告警数据出现异常!!!", e); e.printStackTrace(); } } } public Map countThisMonthAlarmAndWarning() { Map result = new HashMap<>(); Map param = new HashMap<>(); param.put("startTime", DateUtils.getYyyyMmDdHhMmSs(DateUtils.getMonthStart())); param.put("endTime", DateUtils.getYyyyMmDdHhMmSs(DateUtils.getMonthEnd())); /*param.put("type", 0); List alarms = warningDetailMapper.selectWarningDetailByMap(param); if (StringUtils.isNull(alarms)) { alarms = new ArrayList<>(); } result.put("alarmNumber", alarms.size());*/ Integer alarmNum = warningDetailMapper.countAlarmByMap(param); result.put("alarmNumber", null == alarmNum ? 0 : alarmNum); param.put("type", 1); /*List warnings = warningDetailMapper.selectWarningDetailByMap(param); if (StringUtils.isNull(warnings)) { warnings = new ArrayList<>(); } result.put("warningNumber", warnings.size());*/ Integer warnNum = warningDetailMapper.countWarnByMap(param); result.put("warningNumber", null == warnNum ? 0 : warnNum); return result; } public Map>> countEverydayAlarmAndWarning() { Map>> result = new HashMap<>(); Map param = new HashMap(); Date now = new Date(); Date last = DateUtils.getAPeriodOfTime(now, -7, Calendar.DATE); // 上周的今天 param.put("startTime", DateUtils.getYyyyMmDdHhMmSs(last)); param.put("endTime", DateUtils.getYyyyMmDdHhMmSs(now)); param.put("type", 0); List> alarmDayCount = warningDetailMapper.selectWarningDayCountByMap(param); result.put("alarmDayCount", alarmDayCount); param.put("type", 1); List> warningDayCount = warningDetailMapper.selectWarningDayCountByMap(param); result.put("warningDayCount", warningDayCount); return result; } public Map> selectEachLocationDataChange() { /*Map> result = new LinkedHashMap<>(); List checkPoints = commonService.getCheckPoints3d(); Date nowDate = DateUtils.getNowDate(); Long endTime = Long.parseLong(DateUtils.parseDateToStr(DateUtils.YYYYMMDDHH, nowDate)); Long startTime = Long.parseLong(DateUtils.parseDateToStr(DateUtils.YYYYMMDDHH, DateUtils.getAPeriodOfTime(nowDate, -3, Calendar.HOUR_OF_DAY))); List recordList = dictRecordMapper.selectByTimeDictRecordList(startTime, endTime); checkPoints.forEach(c -> { List tableNames = new ArrayList<>(); recordList.forEach(r -> { tableNames.add(r.getTableName()); }); List values = new ArrayList<>(); if (StringUtils.isNotNull(tableNames)) { List data = suYuanMapper.getMonitorData(tableNames, c.getId()); data.forEach(v -> { values.add(v.getValue()); }); result.put(c.getName(), values); } }); return result;*/ Map> result = new LinkedHashMap<>(); List checkPoints = commonService.getCheckPoints3d(); Date nowDate = DateUtils.getNowDate(); Long endTime = Long.parseLong(DateUtils.parseDateToStr(DateUtils.YYYYMMDDHH, nowDate)); Long startTime = Long.parseLong(DateUtils.parseDateToStr(DateUtils.YYYYMMDDHH, DateUtils.getAPeriodOfTime(nowDate, -3, Calendar.HOUR_OF_DAY))); List recordList = dictRecordMapper.selectByTimeDictRecordList(startTime, endTime); List tableNames = new ArrayList<>(); for (DictRecord dr : recordList) { if (suYuanMapper.isTableExists(dr.getTableName()) > 0) { tableNames.add(dr.getTableName()); } } if (tableNames.isEmpty()) { return result; } for (MonitorPointPosition c : checkPoints) { List values = new ArrayList<>(); List data = suYuanMapper.getMonitorData(tableNames, c.getId()); if (null != data && data.size() > 0) { for (SuYuanMonitorData v : data) { values.add(v.getValue()); } } result.put(c.getName(), values); } return result; } public List> selectThisMonthLocationValueDataTop10() { /*List> result = new ArrayList<>(); List checkPoints = commonService.getCheckPoints3d(); Long startTime = Long.parseLong(DateUtils.parseDateToStr(DateUtils.YYYYMMDDHH, DateUtils.getMonthStart())); Long endTime = Long.parseLong(DateUtils.parseDateToStr(DateUtils.YYYYMMDDHH, DateUtils.getMonthEnd())); List recordList = dictRecordMapper.selectByTimeDictRecordList(startTime, endTime); checkPoints.forEach(c -> { List tableNames = new ArrayList<>(); recordList.forEach(r -> { tableNames.add(r.getTableName()); }); Map map = suYuanMapper.getMonthValueDataMax(tableNames, c.getId()); if (StringUtils.isNotNull(map) && StringUtils.isNotEmpty(map)) { String suYuanId = map.get("id").toString(); map.put("name", commonService.select3dCheckPointById(suYuanId).getName()); map.remove("id"); } result.add(map); }); return CalculateUtils.sort(result, "value", true).subList(0, 10);*/ List> result = new ArrayList<>(); List checkPoints = commonService.getCheckPoints3d(); Long startTime = Long.parseLong(DateUtils.parseDateToStr(DateUtils.YYYYMMDDHH, DateUtils.getMonthStart())); Long endTime = Long.parseLong(DateUtils.parseDateToStr(DateUtils.YYYYMMDDHH, DateUtils.getMonthEnd())); //startTime = 2023040100L; //endTime = 2023043023L; List recordList = dictRecordMapper.selectByTimeDictRecordList(startTime, endTime); List tableNames = new ArrayList<>(); for (DictRecord dr : recordList) { if (suYuanMapper.isTableExists(dr.getTableName()) > 0) { tableNames.add(dr.getTableName()); } } if (tableNames.isEmpty()) { return result; } /*List idList = new ArrayList<>(); for (MonitorPointPosition c : checkPoints) { idList.add("'" + c.getId() + "'"); } String ids = String.join(",", idList);*/ for (MonitorPointPosition c : checkPoints) { Map map = suYuanMapper.getMonthValueDataMax(tableNames, c.getId()); if (null != map && map.size() > 0) { //String suYuanId = map.get("id").toString(); //map.put("name", commonService.select3dCheckPointById(suYuanId).getName()); //map.remove("id"); map.put("name", c.getName()); result.add(map); } } return CalculateUtils.sort(result, "value", true).subList(0, 10); } public List selectMonthTop10() { String time = DateUtils.getYyyyMm(new Date()); List list = qxshMapper.selectMonthTop10(time + "%"); return list; } public Map> select3Hours() { Map> map = new LinkedHashMap<>(); List times = DateUtils.get3Hours(); List list = qxshMapper.select3Hours(times); if (null == list || list.isEmpty()) { return map; } for (Qxsh qxsh : list) { String name = qxsh.getName(); List values = map.computeIfAbsent(name, k -> new ArrayList<>()); values.add(qxsh.getValue()); } return map; } public List getAlarmAndWarnByTime(Date begin, Date end) { String startTime = DateUtils.getYyyyMmDdHhMmSs(begin); String endTime = DateUtils.getYyyyMmDdHhMmSs(end); List rs = new ArrayList<>(); List rsYj = warningDetailMapper.selectByTimeForYj(startTime, endTime); if (null != rsYj && rsYj.size() > 0) rs.addAll(rsYj); List rsBj = warningDetailMapper.selectByTimeForBj(startTime, endTime); if (null != rsBj && rsBj.size() > 0) rs.addAll(rsBj); List list = new ArrayList<>(); for (WarningDetail wd : rs) { //String time = ymdh.format(wd.getCreateTime()); //list.add(new WarningVo(wd.getLocationName(), wd.getSuYuanId(), 0.0, 0.0, wd.getValue(), time)); /*DistanceSuYuan suYuan = suYuanMapper.getSuYuanById(wd.getTableName(), wd.getSuYuanId()); Double lastVal = warningDetailMapper.getLastYearVal(wd.getId()); int rows = suYuanMapper.isTableExists(wd.getTableName()); DistanceSuYuan suMax = null; if (rows > 0) { MonitorPointPosition point = commonService.select3dCheckPointByName(wd.getLocationName()); List ids3d = CalculateUtils.aloneCrosswiseExtend(point, 50); suMax = suYuanMapper.getSuYuan500Max(wd.getTableName(), ids3d); } else { suMax = suYuan; }*/ int rows = suYuanMapper.isTableExists(wd.getTableName()); if (rows == 0) { continue; } DistanceSuYuan suYuan = suYuanMapper.getSuYuanById(wd.getTableName(), wd.getSuYuanId()); Double lastVal = warningDetailMapper.getLastYearVal(wd.getId()); MonitorPointPosition point = commonService.select3dCheckPointByName(wd.getLocationName()); List ids3d = CalculateUtils.aloneCrosswiseExtend(point, 50); DistanceSuYuan suMax = suYuanMapper.getSuYuan500Max(wd.getTableName(), ids3d); String[] strs = suMax.getId().split("_"); int x = Integer.parseInt(strs[0]) / 10; int y = Integer.parseInt(strs[1]) / 10; String addr = suYuanService.selectAddrByXY(x, y); suMax.setAddr(addr); Report report = Report.calcReport(wd, suYuan, suMax); report.setLastVal(lastVal); list.add(report); } return list; } }