package com.zhgd.xmgl.task; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.zhgd.jeecg.common.mybatis.EntityMap; import com.zhgd.jeecg.common.util.HuaWeiMessageUtils; import com.zhgd.xmgl.modules.basicdata.entity.Notice; import com.zhgd.xmgl.modules.standard.entity.StandardAlarm; import com.zhgd.xmgl.modules.standard.entity.StandardContinuityAlarm; import com.zhgd.xmgl.modules.standard.entity.StandardCurrentData; import com.zhgd.xmgl.modules.standard.entity.StandardDev; import com.zhgd.xmgl.modules.standard.mapper.*; import com.zhgd.xmgl.modules.basicdata.service.INoticeService; import com.zhgd.xmgl.util.StandardDevUtil; import lombok.extern.log4j.Log4j; import net.javacrumbs.shedlock.core.SchedulerLock; import org.apache.commons.collections.MapUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * @program: wisdomSite * @description: 标养室定时任务 * @author: Mr.Peng * @create: 2021-05-12 14:23 **/ @Log4j @Component public class StandardDevTask { @Autowired private StandardCurrentDataMapper standardCurrentDataMapper; @Autowired private StandardContinuityAlarmMapper standardContinuityAlarmMapper; @Autowired private StandardDevMapper standardDevMapper; @Autowired private INoticeService noticeService; @Autowired private StandardAlarmMapper standardAlarmMapper; @Autowired private StandardDevRealTimeDataMapper standardDevRealTimeDataMapper; @Value("${isGetStandardData}") private boolean isGetStandardData; @Value("${sms.hw.notice.templateId.standardAlarm}") private String templateId; /** * 根据实时数据计算每15分钟标养室是否报警 */ @Scheduled(cron = "0 0/15 * * * ?") @SchedulerLock(name = "totalStandardAlarmTypeTask", lockAtMostFor = 1000*60*10, lockAtLeastFor = 1000*60*3) public void totalStandardAlarmTypeTask(){ try{ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); String time=sdf.format(new Date()); List list=standardCurrentDataMapper.selectStandardCurrentDataTotalAlarmStateList(); if(list.size()>0){ for(EntityMap map:list){ StandardContinuityAlarm standardContinuityAlarm=new StandardContinuityAlarm(); standardContinuityAlarm.setProjectSn(MapUtils.getString(map,"projectSn")); standardContinuityAlarm.setDevSn(MapUtils.getString(map,"devSn")); standardContinuityAlarm.setAlarmState(MapUtils.getInteger(map,"alarmType")); standardContinuityAlarm.setQueryTime(time); standardContinuityAlarmMapper.insert(standardContinuityAlarm); } } }catch (Exception e){ e.printStackTrace(); } } private void addNotice(StandardDev dev, String alarmPushWorkerId){ try { if (StringUtils.isNotEmpty(alarmPushWorkerId) && alarmPushWorkerId.length() > 0) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); int size = alarmPushWorkerId.split(",").length; String title = dev.getLaboratoryName() + "标养室报警"; String msg = dev.getLaboratoryName() + "标养室报警,请及时处理"; for (int i = 0; i < size; i++) { Notice notice = new Notice(); notice.setAccountId(Long.valueOf(alarmPushWorkerId.split(",")[i])); notice.setMsg(msg); notice.setTitle(title); notice.setSendTime(sdf.format(new Date())); notice.setType("9"); noticeService.addNotice(notice, true); } } }catch (Exception e){ e.printStackTrace(); } } private void sendSms(StandardDev dev,String alarmPushPhone,int hour) { try { if (StringUtils.isNotEmpty(alarmPushPhone) && alarmPushPhone.length() > 0 &&!"[]".equals(alarmPushPhone)) { JSONArray array=JSONArray.parseArray(alarmPushPhone); String signature = "华为云短信测试"; //短信模板ID //String templateId = "790d907f70594b4893227fc1d97e78bc"; //模板参数 String context=dev.getProjectName()+ "," +dev.getLaboratoryName()+ ","+ hour; for (int i=0;i list=standardDevMapper.selectContinuityAlarmDev(1); log.info("----------------------标养室1小时报警推送---------------------------------任务数:"+list.size()); if(list!=null&&list.size()>0){ for(StandardDev dev:list){ addNotice(dev,dev.getOneHourPushWorkerId()); sendSms(dev,dev.getOneHourPushPhone(),1); //添加报警记录 addStandardAlarm(dev); } } } catch (Exception e) { e.printStackTrace(); } } private void addStandardAlarm(StandardDev dev){ java.text.DateFormat format1 = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); StandardAlarm standardAlarm=new StandardAlarm(); standardAlarm.setAlarmTime(format1.format(new Date())); standardAlarm.setAlarmType("温湿度异常"); standardAlarm.setProjectSn(dev.getProjectSn()); standardAlarm.setDevSn(dev.getDevSn()); standardAlarmMapper.insert(standardAlarm); } /** * 2小时报警推送 */ @Scheduled(cron = "0 0 */2 * * ?") @SchedulerLock(name = "twoHourTask", lockAtMostFor = 1000*60*30, lockAtLeastFor = 1000*60*5) public void twoHourTask() { try { List list=standardDevMapper.selectContinuityAlarmDev(2); if(list!=null&&list.size()>0){ for(StandardDev dev:list){ addNotice(dev,dev.getTwoHourPushWorkerId()); sendSms(dev,dev.getTwoHourPushPhone(),2); } } } catch (Exception e) { e.printStackTrace(); } } /** * 3小时报警推送 */ @Scheduled(cron = "0 0 */3 * * ?") @SchedulerLock(name = "threeHourTask", lockAtMostFor = 1000*60*30, lockAtLeastFor = 1000*60*5) public void threeHourTask() { try { List list=standardDevMapper.selectContinuityAlarmDev(3); if(list!=null&&list.size()>0){ for(StandardDev dev:list){ addNotice(dev,dev.getThreeHourPushWorkerId()); sendSms(dev,dev.getThreeHourPushPhone(),3); } } } catch (Exception e) { e.printStackTrace(); } } /** * 12小时报警推送 */ @Scheduled(cron = "0 0 */6 * * ?") @SchedulerLock(name = "twelveHourTask", lockAtMostFor = 1000*60*30, lockAtLeastFor = 1000*60*5) public void twelveHourTask() { try { List list=standardDevMapper.selectContinuityAlarmDev(5); if(list!=null&&list.size()>0){ for(StandardDev dev:list){ addNotice(dev,dev.getTwelveHourPushWorkerId()); sendSms(dev,dev.getTwelveHourPushPhone(),12); } } } catch (Exception e) { e.printStackTrace(); } } /** * 6小时报警推送 */ @Scheduled(cron = "0 0 */6 * * ?") @SchedulerLock(name = "sixHourTask", lockAtMostFor = 1000*60*30, lockAtLeastFor = 1000*60*5) public void sixHourTask() { try { List list=standardDevMapper.selectContinuityAlarmDev(4); if(list!=null&&list.size()>0){ for(StandardDev dev:list){ addNotice(dev,dev.getSixHourPushWorkerId()); sendSms(dev,dev.getSixHourPushPhone(),6); } } } catch (Exception e) { e.printStackTrace(); } } /** * 24小时报警推送 */ @Scheduled(cron = "0 0 */24 * * ?") @SchedulerLock(name = "twelveFourHourTask", lockAtMostFor = 1000*60*30, lockAtLeastFor = 1000*60*5) public void twelveFourHourTask() { try { List list=standardDevMapper.selectContinuityAlarmDev(6); if(list!=null&&list.size()>0){ for(StandardDev dev:list){ addNotice(dev,dev.getTwelveFourHourPushWorkerId()); sendSms(dev,dev.getTwelveFourHourPushPhone(),24); } } } catch (Exception e) { e.printStackTrace(); } } /** * 定时调用外部接口拉取设备实时数据 */ @Scheduled(cron = "0 0/2 * * * ?") @SchedulerLock(name = "getStandardData", lockAtMostFor = 1000*60*2, lockAtLeastFor = 1000*60*1) public void getStandardData(){ if (isGetStandardData) { try { log.info("------------拉取执行标样室时数据任务开始---------"); QueryWrapper queryWrapper = new QueryWrapper<>(); List list = standardDevMapper.selectList(queryWrapper); if (list != null && list.size() > 0) { JSONArray array = StandardDevUtil.getDeviceData(""); for (StandardDev dev : list) { List temperatureList = new ArrayList<>(); List humidityList = new ArrayList<>(); if (array != null && array.size() > 0) { for (int i = 0; i < array.size(); i++) { JSONObject obj = array.getJSONObject(i); if(dev.getDevSn().equals(obj.getString("deviceAddr"))) { //判断设备是否在线 if ("2".equals(obj.getString("deviceStatus"))) { JSONArray jsonArray = obj.getJSONArray("realTimeData"); if (jsonArray != null && jsonArray.size() > 0) { for (int a = 0; a < jsonArray.size(); a++) { JSONObject obj2 = jsonArray.getJSONObject(a); if (obj2.getString("dataName").indexOf("温度") >= 0) { if (StringUtils.isNotEmpty(obj2.getString("dataValue"))&&obj2.getDouble("dataValue")!=0d) { temperatureList.add(Double.valueOf(obj2.getString("dataValue"))); } } else if (obj2.getString("dataName").indexOf("湿度") >= 0) { if (StringUtils.isNotEmpty(obj2.getString("dataValue"))&&obj2.getDouble("dataValue")!=0d) { humidityList.add(Double.valueOf(obj2.getString("dataValue"))); } } } } } } } //没有数据不插入 if (temperatureList.size() > 0 || temperatureList.size() > 0) { DecimalFormat df = new DecimalFormat("#.00"); StandardCurrentData standardCurrentData = new StandardCurrentData(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); standardCurrentData.setReceiveTime(sdf.format(new Date())); standardCurrentData.setProjectSn(dev.getProjectSn()); standardCurrentData.setDevSn(dev.getDevSn()); if (temperatureList.size() > 0) { //计算温度平均值 double avg = temperatureList.stream().collect(Collectors.averagingDouble(n -> n)); standardCurrentData.setTemperature(df.format(avg)); } if (humidityList.size() > 0) { //计算湿度平均值 double avg = humidityList.stream().collect(Collectors.averagingDouble(n -> n)); standardCurrentData.setHumidity(df.format(avg)); } standardCurrentDataMapper.insert(standardCurrentData); StandardDev tempStandardDev = new StandardDev(); tempStandardDev.setId(dev.getId()); tempStandardDev.setRealTime(new Date()); tempStandardDev.setDevHumidity(standardCurrentData.getHumidity()); tempStandardDev.setDevTemperature(standardCurrentData.getTemperature()); standardDevMapper.updateById(tempStandardDev); } } } } log.info("------------拉取执行标样室时数据任务结束---------"); }catch(Exception e){ e.printStackTrace(); } } } /** * 汇总标养室设备实时数据 */ @Scheduled(cron = "0 0/2 * * * ?") @SchedulerLock(name = "saveStandardRealTimeDataTask", lockAtMostFor = 1000*60*1, lockAtLeastFor = 1000*30) public void saveStandardRealTimeDataTask() { try { QueryWrapper queryWrapper = new QueryWrapper<>(); List list = standardDevMapper.selectList(queryWrapper); if (list != null && list.size() > 0) { for (StandardDev dev : list) { int dataNum=0; String temperature=null; String humidity=null; List> dataList=standardDevRealTimeDataMapper.selectDevRealTimeDataCount(dev.getDevSn()); if(dataList!=null&&dataList.size()>0){ for (Map data:dataList){ if(MapUtils.getString(data,"dataName").indexOf("温度")>=0){ dataNum=dataNum+MapUtils.getInteger(data,"num"); temperature=MapUtils.getString(data,"avgValue"); }else if(MapUtils.getString(data,"dataName").indexOf("湿度")>=0){ dataNum=dataNum+MapUtils.getInteger(data,"num"); humidity=MapUtils.getString(data,"avgValue"); } } } //没有数据不插入 if (dataNum> 0) { StandardCurrentData standardCurrentData = new StandardCurrentData(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); standardCurrentData.setReceiveTime(sdf.format(new Date())); standardCurrentData.setProjectSn(dev.getProjectSn()); standardCurrentData.setDevSn(dev.getDevSn()); standardCurrentData.setTemperature(temperature); standardCurrentData.setHumidity(humidity); standardCurrentDataMapper.insert(standardCurrentData); StandardDev tempStandardDev = new StandardDev(); tempStandardDev.setId(dev.getId()); tempStandardDev.setRealTime(new Date()); tempStandardDev.setDevHumidity(standardCurrentData.getHumidity()); tempStandardDev.setDevTemperature(standardCurrentData.getTemperature()); standardDevMapper.updateById(tempStandardDev); } } } }catch(Exception e){ e.printStackTrace(); } } }