lizijie
2021-11-18 6c90be39beb1d8c2300cd22e1338dcbbf9775ac7
污染报警信息定时任务
11 files added
2 files modified
1091 ■■■■■ changed files
screen-job/src/main/java/com/moral/api/entity/AlarmInfo.java 71 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/entity/SysArea.java 43 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/mapper/AlarmInfoMapper.java 16 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/mapper/SysAreaMapper.java 16 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/service/AlarmInfoService.java 16 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/service/OrganizationService.java 11 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/service/SysAreaService.java 16 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/service/impl/AlarmInfoServiceImpl.java 20 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/service/impl/OrganizationServiceImpl.java 40 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/service/impl/SysAreaServiceImpl.java 20 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/task/AlarmTask.java 794 ●●●●● patch | view | raw | blame | history
screen-job/src/main/resources/mapper/AlarmInfoMapper.xml 16 ●●●●● patch | view | raw | blame | history
screen-job/src/main/resources/mapper/SysAreaMapper.xml 12 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/entity/AlarmInfo.java
New file
@@ -0,0 +1,71 @@
package com.moral.api.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import com.baomidou.mybatisplus.annotation.TableId;
import java.time.LocalDateTime;
import java.io.Serializable;
import java.util.Date;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
 * <p>
 *
 * </p>
 *
 * @author moral
 * @since 2021-11-12
 */
@Data
@EqualsAndHashCode(callSuper = false)
public class AlarmInfo extends Model<AlarmInfo> {
    private static final long serialVersionUID = 1L;
    /**
     * id
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    /**
     * 报警时间
     */
    private Date alarmTime;
    /**
     * 指标(因子)
     */
    @TableField("`index`")
    private String index;
    /**
     * 点位(设备)
     */
    private Integer deviceId;
    /**
     * 报警类型
     */
    private String alarmType;
    /**
     * 报警信息
     */
    private String alarmInformation;
    /**
     * 创建时间
     */
    private LocalDateTime createTime;
    @Override
    protected Serializable pkVal() {
        return this.id;
    }
}
screen-job/src/main/java/com/moral/api/entity/SysArea.java
New file
@@ -0,0 +1,43 @@
package com.moral.api.entity;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import java.io.Serializable;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
 * <p>
 * 系统区域表
 * </p>
 *
 * @author moral
 * @since 2021-11-15
 */
@Data
@EqualsAndHashCode(callSuper = false)
public class SysArea extends Model<SysArea> {
    private static final long serialVersionUID = 1L;
    /**
     * 区域代码
     */
    private Integer areaCode;
    /**
     * 区域名称
     */
    private String areaName;
    /**
     * 父级代码
     */
    private Integer parentCode;
    @Override
    protected Serializable pkVal() {
        return this.areaCode;
    }
}
screen-job/src/main/java/com/moral/api/mapper/AlarmInfoMapper.java
New file
@@ -0,0 +1,16 @@
package com.moral.api.mapper;
import com.moral.api.entity.AlarmInfo;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
 * <p>
 *  Mapper 接口
 * </p>
 *
 * @author moral
 * @since 2021-11-12
 */
public interface AlarmInfoMapper extends BaseMapper<AlarmInfo> {
}
screen-job/src/main/java/com/moral/api/mapper/SysAreaMapper.java
New file
@@ -0,0 +1,16 @@
package com.moral.api.mapper;
import com.moral.api.entity.SysArea;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
 * <p>
 * 系统区域表 Mapper 接口
 * </p>
 *
 * @author moral
 * @since 2021-11-15
 */
public interface SysAreaMapper extends BaseMapper<SysArea> {
}
screen-job/src/main/java/com/moral/api/service/AlarmInfoService.java
New file
@@ -0,0 +1,16 @@
package com.moral.api.service;
import com.moral.api.entity.AlarmInfo;
import com.baomidou.mybatisplus.extension.service.IService;
/**
 * <p>
 *  服务类
 * </p>
 *
 * @author moral
 * @since 2021-11-12
 */
public interface AlarmInfoService extends IService<AlarmInfo> {
}
screen-job/src/main/java/com/moral/api/service/OrganizationService.java
@@ -3,6 +3,8 @@
import com.moral.api.entity.Organization;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
 * <p>
 * 组织表 服务类
@@ -15,4 +17,13 @@
    Organization getOrganizationById(int id);
    /**
      *@Description: 根据父组织获取所有子组织
      *@Param: [parentId]
      *@return: java.util.List<com.moral.api.entity.Organization>
      *@Author: lizijie
      *@Date: 2021/11/9 16:48
     **/
    List<Organization> getAllChildrenOrganization(Integer parentId);
}
screen-job/src/main/java/com/moral/api/service/SysAreaService.java
New file
@@ -0,0 +1,16 @@
package com.moral.api.service;
import com.moral.api.entity.SysArea;
import com.baomidou.mybatisplus.extension.service.IService;
/**
 * <p>
 * 系统区域表 服务类
 * </p>
 *
 * @author moral
 * @since 2021-11-15
 */
public interface SysAreaService extends IService<SysArea> {
}
screen-job/src/main/java/com/moral/api/service/impl/AlarmInfoServiceImpl.java
New file
@@ -0,0 +1,20 @@
package com.moral.api.service.impl;
import com.moral.api.entity.AlarmInfo;
import com.moral.api.mapper.AlarmInfoMapper;
import com.moral.api.service.AlarmInfoService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author moral
 * @since 2021-11-12
 */
@Service
public class AlarmInfoServiceImpl extends ServiceImpl<AlarmInfoMapper, AlarmInfo> implements AlarmInfoService {
}
screen-job/src/main/java/com/moral/api/service/impl/OrganizationServiceImpl.java
@@ -8,6 +8,10 @@
import com.moral.constant.Constants;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import java.util.ArrayList;
import java.util.List;
/**
 * <p>
@@ -31,4 +35,40 @@
        Organization organization = organizationMapper.selectOne(wrapper_organization);
        return organization;
    }
    /**
     * @Description: 根据父组织获取所有子组织
     * @Param: []
     * @return: java.util.List<com.moral.api.entity.Organization>
     * @Author: 陈凯裕
     * @Date: 2021/4/14
     */
    @Override
    public List<Organization> getAllChildrenOrganization(Integer parentId) {
        List<Organization> children = new ArrayList<>();
        recursionQueryChildren(parentId, children);
        return children;
    }
    /**
     * @Description: 通过父组织查询下面所有的子组织放到children中
     * @Param: [parent, children]
     * @return: void
     * @Author: 陈凯裕
     * @Date: 2021/4/14
     */
    private void recursionQueryChildren(Integer parentId, List<Organization> children) {
        QueryWrapper<Organization> queryWrapper = new QueryWrapper();
        queryWrapper.eq("is_delete", Constants.NOT_DELETE);
        queryWrapper.eq("parent_id", parentId);
        List<Organization> organizations = organizationMapper.selectList(queryWrapper);
        if (!ObjectUtils.isEmpty(organizations)) {
            children.addAll(organizations);
            for (Organization organization : organizations) {
                recursionQueryChildren(organization.getId(), children);
            }
        } else {
            return;
        }
    }
}
screen-job/src/main/java/com/moral/api/service/impl/SysAreaServiceImpl.java
New file
@@ -0,0 +1,20 @@
package com.moral.api.service.impl;
import com.moral.api.entity.SysArea;
import com.moral.api.mapper.SysAreaMapper;
import com.moral.api.service.SysAreaService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
 * <p>
 * 系统区域表 服务实现类
 * </p>
 *
 * @author moral
 * @since 2021-11-15
 */
@Service
public class SysAreaServiceImpl extends ServiceImpl<SysAreaMapper, SysArea> implements SysAreaService {
}
screen-job/src/main/java/com/moral/api/task/AlarmTask.java
New file
@@ -0,0 +1,794 @@
package com.moral.api.task;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.moral.api.entity.*;
import com.moral.api.mapper.*;
import com.moral.api.service.HistoryHourlyService;
import com.moral.api.service.OrganizationService;
import com.moral.constant.Constants;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
import javax.annotation.Resource;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;
/**
 * @program: screen
 * @description: 警报定时任务
 * @author: lizijie
 * @create: 2021-11-09 11:07
 **/
@Component
public class AlarmTask {
    @Resource
    private OrganizationService organizationService;
    @Resource
    private HistoryHourlyService historyHourlyService;
    @Autowired(required = false)
    private DeviceMapper deviceMapper;
    @Autowired(required = false)
    private AlarmInfoMapper alarmInfoMapper;
    @Autowired(required = false)
    private OrganizationMapper organizationMapper;
    @Autowired(required = false)
    private CityAqiMapper cityAqiMapper;
    @Autowired(required = false)
    private SysAreaMapper sysAreaMapper;
    @Autowired(required = false)
    private HistoryAqiMapper historyAqiMapper;
    @Autowired(required = false)
    private GovMonitorPointMapper govMonitorPointMapper;
    @XxlJob("alarmInfoInsert")
    public ReturnT informationInsert(){
        String params = XxlJobHelper.getJobParam();
        Map organizationIdMap = JSON.parseObject(params);
        List<Integer> orgIdList = (List<Integer>) organizationIdMap.get("orgId");
        //获取时间
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH");
        Calendar calendar = Calendar.getInstance();
        String alarmTime = df.format(calendar.getTime())+":00:00";
        calendar.set(Calendar.HOUR_OF_DAY, calendar.get(Calendar.HOUR_OF_DAY) - 1);
        //Date nearData = calendar.getTime();
        String beforTime = df.format(calendar.getTime())+":00:00";
        calendar.set(Calendar.HOUR_OF_DAY, calendar.get(Calendar.HOUR_OF_DAY) - 1);
        //Date previousData = calendar.getTime();
        String previousTime = df.format(calendar.getTime())+":00:00";
        //定义一个集合,存放所有id
        List<Integer> allOrgId = new ArrayList<>();
        allOrgId.addAll(orgIdList);
        //循环集合
        for (Integer orgId:orgIdList) {
            //所有子组织
            List<Organization> allChildrenOrganization = organizationService.getAllChildrenOrganization(orgId);
            if (!com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(allChildrenOrganization) || allChildrenOrganization.size() < 1){
                for (Organization organization:allChildrenOrganization) {
                    allOrgId.add(organization.getId());
                }
            }
        }
        //集合去重
        List<Integer> allOrgIdWithoutDuplicates = allOrgId.stream().distinct().collect(Collectors.toList());
        for (Integer orgId:allOrgIdWithoutDuplicates) {
            //根据id查询所属设备
            QueryWrapper<Organization> wrapper_organization = new QueryWrapper<>();
            wrapper_organization.eq("is_delete",Constants.NOT_DELETE).eq("id",orgId);
            Organization organization = new Organization();
            organization = organizationMapper.selectOne(wrapper_organization);
            //根据id查询所属设备
            QueryWrapper<Device> wrapper_device = new QueryWrapper<>();
            wrapper_device.eq("is_delete",Constants.NOT_DELETE).eq("organization_id",orgId);
            List<Device> devices = new ArrayList<>();
            devices = deviceMapper.selectList(wrapper_device);
            if (devices.size()>0){
                DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                Date alarmDate = new Date();
                Date nearDate = new Date();
                Date previousDate = new Date();
                try {
                    alarmDate = dateFormat.parse(alarmTime);
                    nearDate = dateFormat.parse(beforTime);
                    previousDate = dateFormat.parse(previousTime);
                }catch (ParseException e){
                    e.printStackTrace();
                }
                for (Device device:devices) {
                    AlarmInfo alarmInfo = new AlarmInfo();
                    alarmInfo.setAlarmTime(alarmDate);
                    int deviceId = device.getId();
                    alarmInfo.setDeviceId(deviceId);
                    String mac = device.getMac();
                    List<HistoryHourly> historyHourlys = null;
                    historyHourlys = historyHourlyService.getValueByMacAndTime(device.getMac(), nearDate, nearDate);
                    if (com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(historyHourlys) || historyHourlys.size()<1){
                        continue;
                    }
                    HistoryHourly historyHourly = new HistoryHourly();
                    historyHourly = historyHourlys.get(0);
                    if (com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(historyHourly)){
                        continue;
                    }
                    Double PM2_5 = null;
                    Double PM10 = null;
                    Double SO2 = null;
                    Double NO2 = null;
                    Double CO = null;
                    Double O3 = null;
                    String value = historyHourly.getValue();
                    JSONObject jsonObject = new JSONObject();
                    jsonObject = JSONObject.parseObject(value);
                    if (!com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(jsonObject.get("a34004"))){
                        PM2_5=(Double.parseDouble(jsonObject.get("a34004").toString()));
                    }
                    if (!com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(jsonObject.get("a34002"))){
                        PM10=(Double.parseDouble(jsonObject.get("a34002").toString()));
                    }
                    if (!com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(jsonObject.get("a21026"))){
                        SO2=(Double.parseDouble(jsonObject.get("a21026").toString()));
                    }
                    if (!com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(jsonObject.get("a21004"))){
                        NO2=(Double.parseDouble(jsonObject.get("a21004").toString()));
                    }
                    if (!com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(jsonObject.get("a21005"))){
                        CO=(Double.parseDouble(jsonObject.get("a21005").toString()));
                    }
                    if (!com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(jsonObject.get("a05024"))){
                        O3=(Double.parseDouble(jsonObject.get("a05024").toString()));
                    }
                    if (!com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(PM2_5)){
                        if (PM2_5>75){
                            alarmInfo.setIndex("PM2_5");
                            alarmInfo.setAlarmType("超限");
                            String alarmInformation = "站点["+device.getName()+"][PM2.5]浓度值["+PM2_5+"]超过限定的标准值[75]";
                            alarmInfo.setAlarmInformation(alarmInformation);
                            alarmInfoMapper.insert(alarmInfo);
                            continue;
                        }
                        Double previousPM2_5 = null;
                        List<HistoryHourly> previoushistoryHourlys = null;
                        previoushistoryHourlys = historyHourlyService.getValueByMacAndTime(device.getMac(), previousDate, previousDate);
                        HistoryHourly previousHistoryHourly = new HistoryHourly();
                        if (com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(previoushistoryHourlys) || historyHourlys.size()<1){
                            previousHistoryHourly = previoushistoryHourlys.get(0);
                            if (!com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(previousHistoryHourly)){
                                String previousValue = previousHistoryHourly.getValue();
                                JSONObject previousJsonObject = new JSONObject();
                                previousJsonObject = JSONObject.parseObject(previousValue);
                                if (!com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(previousJsonObject.get("a34004"))){
                                    previousPM2_5=(Double.parseDouble(previousJsonObject.get("a34004").toString()));
                                }
                            }
                        }
                        if (!com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(previousPM2_5) && previousPM2_5!=0){
                            if (PM2_5/previousPM2_5 > 2 || PM2_5/previousPM2_5 == 2){
                                String multiple = String.format("%.2f",PM2_5/previousPM2_5);
                                alarmInfo.setIndex("PM2_5");
                                alarmInfo.setAlarmType("突然高");
                                String alarmInformation = "["+device.getName()+"]["+beforTime+"][PM2.5]浓度值["+PM2_5+"]超过上小时的浓度["+previousPM2_5+"]的"+multiple+"倍";
                                alarmInfo.setAlarmInformation(alarmInformation);
                                alarmInfoMapper.insert(alarmInfo);
                                continue;
                            }
                        }
                        if (!com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(organization)){
                            int cityCode = organization.getCityCode();
                            QueryWrapper<CityAqi> wrapper_cityAqi = new QueryWrapper<>();
                            wrapper_cityAqi.eq("city_code",cityCode).eq("time",previousTime);
                            CityAqi cityAqi = null;
                            cityAqi = cityAqiMapper.selectOne(wrapper_cityAqi);
                            if (!com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(cityAqi)){
                                String cityAqiValue = cityAqi.getValue();
                                JSONObject JsonObject = new JSONObject();
                                JSONObject previousJsonObject = new JSONObject();
                                previousJsonObject = JSONObject.parseObject(cityAqiValue);
                                Double cityAqiPM2_5 = (Double.parseDouble(previousJsonObject.get("PM2_5").toString()));
                                if (PM2_5/cityAqiPM2_5 >=1.5){
                                    double multiple = PM2_5/cityAqiPM2_5;
                                    int percentage = 0;
                                    if (multiple >= 2.5){
                                        percentage = 250;
                                    }else if (multiple >= 1.5){
                                        percentage = 150;
                                    }
                                    QueryWrapper<SysArea> sysAreaQueryWrapper = new QueryWrapper<>();
                                    sysAreaQueryWrapper.eq("area_code",cityCode);
                                    SysArea sysArea = sysAreaMapper.selectOne(sysAreaQueryWrapper);
                                    alarmInfo.setIndex("PM2_5");
                                    alarmInfo.setAlarmType("超过市区均值"+multiple+"%");
                                    String alarmInformation = "["+device.getName()+"][PM2.5]浓度值["+PM2_5+"]超过["+sysArea.getAreaName()+"]均值["+cityAqiPM2_5+"]的"+percentage+"%";
                                    alarmInfo.setAlarmInformation(alarmInformation);
                                    alarmInfoMapper.insert(alarmInfo);
                                    continue;
                                }
                            }
                        }
                        if (!com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(device.getGuid())){
                            String guid = device.getGuid();
                            QueryWrapper<HistoryAqi> historyAqiQueryWrapper = new QueryWrapper<>();
                            historyAqiQueryWrapper.eq("guid",guid).eq("time",previousTime);
                            HistoryAqi historyAqi = null;
                            historyAqi = historyAqiMapper.selectOne(historyAqiQueryWrapper);
                            if (!com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(historyAqi)){
                                String cityAqiValue = historyAqi.getValue();
                                JSONObject JsonObject = new JSONObject();
                                JSONObject previousJsonObject = new JSONObject();
                                previousJsonObject = JSONObject.parseObject(cityAqiValue);
                                Double govMonitorPointPM2_5 = null;
                                if (!com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(previousJsonObject.get("PM2_5"))){
                                    govMonitorPointPM2_5 = (Double.parseDouble(previousJsonObject.get("PM2_5").toString()));
                                }
                                if (!com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(govMonitorPointPM2_5) && PM2_5/govMonitorPointPM2_5 >=1){
                                    double multiple = PM2_5/govMonitorPointPM2_5;
                                    int percentage = 0;
                                    if (multiple >= 2.5){
                                        percentage = 250;
                                    }else if (multiple >= 1.5){
                                        percentage = 150;
                                    }else if (multiple >= 1){
                                        percentage = 100;
                                    }
                                    QueryWrapper<GovMonitorPoint> sysAreaQueryWrapper = new QueryWrapper<>();
                                    sysAreaQueryWrapper.eq("guid",guid);
                                    GovMonitorPoint govMonitorPoint = govMonitorPointMapper.selectOne(sysAreaQueryWrapper);
                                    alarmInfo.setIndex("PM2_5");
                                    alarmInfo.setAlarmType("超过国控站"+multiple+"%");
                                    String alarmInformation = "["+device.getName()+"][PM2.5]浓度值["+PM2_5+"]超过["+govMonitorPoint.getName()+"]均值["+govMonitorPointPM2_5+"]的"+percentage+"%";
                                    alarmInfo.setAlarmInformation(alarmInformation);
                                    alarmInfoMapper.insert(alarmInfo);
                                    continue;
                                }
                            }
                        }
                    }
                    if (!com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(PM10)){
                        if (PM10>75150){
                            alarmInfo.setIndex("PM10");
                            alarmInfo.setAlarmType("超限");
                            String alarmInformation = "站点["+device.getName()+"][PM10]浓度值["+PM10+"]超过限定的标准值[150]";
                            alarmInfo.setAlarmInformation(alarmInformation);
                            alarmInfoMapper.insert(alarmInfo);
                            continue;
                        }
                        Double previousPM10 = null;
                        List<HistoryHourly> previoushistoryHourlys = null;
                        previoushistoryHourlys = historyHourlyService.getValueByMacAndTime(device.getMac(), previousDate, previousDate);
                        HistoryHourly previousHistoryHourly = new HistoryHourly();
                        if (com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(previoushistoryHourlys) || historyHourlys.size()<1){
                            previousHistoryHourly = previoushistoryHourlys.get(0);
                            if (!com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(previousHistoryHourly)){
                                String previousValue = previousHistoryHourly.getValue();
                                JSONObject previousJsonObject = new JSONObject();
                                previousJsonObject = JSONObject.parseObject(previousValue);
                                if (!com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(previousJsonObject.get("a34002"))){
                                    previousPM10=(Double.parseDouble(previousJsonObject.get("a34002").toString()));
                                }
                            }
                        }
                        if (!com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(previousPM10) && previousPM10!=0){
                            if (PM10/previousPM10 > 2 || PM10/previousPM10 == 2){
                                String multiple = String.format("%.2f",PM10/previousPM10);
                                alarmInfo.setIndex("PM10");
                                alarmInfo.setAlarmType("突然高");
                                String alarmInformation = "["+device.getName()+"]["+beforTime+"][PM10]浓度值["+PM10+"]超过上小时的浓度["+previousPM10+"]的"+multiple+"倍";
                                alarmInfo.setAlarmInformation(alarmInformation);
                                alarmInfoMapper.insert(alarmInfo);
                                continue;
                            }
                        }
                        if (!com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(organization)){
                            int cityCode = organization.getCityCode();
                            QueryWrapper<CityAqi> wrapper_cityAqi = new QueryWrapper<>();
                            wrapper_cityAqi.eq("city_code",cityCode).eq("time",previousTime);
                            CityAqi cityAqi = null;
                            cityAqi = cityAqiMapper.selectOne(wrapper_cityAqi);
                            if (!com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(cityAqi)){
                                String cityAqiValue = cityAqi.getValue();
                                JSONObject JsonObject = new JSONObject();
                                JSONObject previousJsonObject = new JSONObject();
                                previousJsonObject = JSONObject.parseObject(cityAqiValue);
                                Double cityAqiPM10 = (Double.parseDouble(previousJsonObject.get("PM10").toString()));
                                if (PM10/cityAqiPM10 >=1.5){
                                    double multiple = PM10/cityAqiPM10;
                                    int percentage = 0;
                                    if (multiple >= 2.5){
                                        percentage = 250;
                                    }else if (multiple >= 1.5){
                                        percentage = 150;
                                    }
                                    QueryWrapper<SysArea> sysAreaQueryWrapper = new QueryWrapper<>();
                                    sysAreaQueryWrapper.eq("area_code",cityCode);
                                    SysArea sysArea = sysAreaMapper.selectOne(sysAreaQueryWrapper);
                                    alarmInfo.setIndex("PM10");
                                    alarmInfo.setAlarmType("超过市区均值"+percentage+"%");
                                    String alarmInformation = "["+device.getName()+"][PM10]浓度值["+PM10+"]超过["+sysArea.getAreaName()+"]均值["+cityAqiPM10+"]的"+percentage+"%";
                                    alarmInfo.setAlarmInformation(alarmInformation);
                                    alarmInfoMapper.insert(alarmInfo);
                                    continue;
                                }
                            }
                        }
                        if (!com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(device.getGuid())){
                            String guid = device.getGuid();
                            QueryWrapper<HistoryAqi> historyAqiQueryWrapper = new QueryWrapper<>();
                            historyAqiQueryWrapper.eq("guid",guid).eq("time",previousTime);
                            HistoryAqi historyAqi = null;
                            historyAqi = historyAqiMapper.selectOne(historyAqiQueryWrapper);
                            if (!com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(historyAqi)){
                                String cityAqiValue = historyAqi.getValue();
                                JSONObject JsonObject = new JSONObject();
                                JSONObject previousJsonObject = new JSONObject();
                                previousJsonObject = JSONObject.parseObject(cityAqiValue);
                                Double govMonitorPointPM10 = null;
                                if (!com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(previousJsonObject.get("PM2_5"))){
                                    govMonitorPointPM10 = (Double.parseDouble(previousJsonObject.get("PM2_5").toString()));
                                }
                                if (!com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(govMonitorPointPM10) && PM10/govMonitorPointPM10 >=1){
                                    double multiple = PM10/govMonitorPointPM10;
                                    int percentage = 0;
                                    if (multiple >= 2.5){
                                        percentage = 250;
                                    }else if (multiple >= 1.5){
                                        percentage = 150;
                                    }else if (multiple >= 1){
                                        percentage = 100;
                                    }
                                    QueryWrapper<GovMonitorPoint> sysAreaQueryWrapper = new QueryWrapper<>();
                                    sysAreaQueryWrapper.eq("guid",guid);
                                    GovMonitorPoint govMonitorPoint = govMonitorPointMapper.selectOne(sysAreaQueryWrapper);
                                    alarmInfo.setIndex("PM10");
                                    alarmInfo.setAlarmType("超过国控站"+percentage+"%");
                                    String alarmInformation = "["+device.getName()+"][PM10]浓度值["+PM10+"]超过["+govMonitorPoint.getName()+"]均值["+govMonitorPointPM10+"]的"+percentage+"%";
                                    alarmInfo.setAlarmInformation(alarmInformation);
                                    alarmInfoMapper.insert(alarmInfo);
                                    continue;
                                }
                            }
                        }
                    }
                    if (!com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(SO2)){
                        if (SO2>500){
                            alarmInfo.setIndex("SO2");
                            alarmInfo.setAlarmType("超限");
                            String alarmInformation = "站点["+device.getName()+"][SO2]浓度值["+SO2+"]超过限定的标准值[75]";
                            alarmInfo.setAlarmInformation(alarmInformation);
                            alarmInfoMapper.insert(alarmInfo);
                            continue;
                        }
                        Double previousSO2 = null;
                        List<HistoryHourly> previoushistoryHourlys = null;
                        previoushistoryHourlys = historyHourlyService.getValueByMacAndTime(device.getMac(), previousDate, previousDate);
                        HistoryHourly previousHistoryHourly = new HistoryHourly();
                        if (com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(previoushistoryHourlys) || historyHourlys.size()<1){
                            previousHistoryHourly = previoushistoryHourlys.get(0);
                            if (!com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(previousHistoryHourly)){
                                String previousValue = previousHistoryHourly.getValue();
                                JSONObject previousJsonObject = new JSONObject();
                                previousJsonObject = JSONObject.parseObject(previousValue);
                                if (!com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(previousJsonObject.get("a21026"))){
                                    previousSO2=(Double.parseDouble(previousJsonObject.get("a21026").toString()));
                                }
                            }
                        }
                        if (!com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(previousSO2) && previousSO2!=0){
                            if (SO2/previousSO2 > 2 || SO2/previousSO2 == 2){
                                String multiple = String.format("%.2f",SO2/previousSO2);
                                alarmInfo.setIndex("SO2");
                                alarmInfo.setAlarmType("突然高");
                                String alarmInformation = "["+device.getName()+"]["+beforTime+"][SO2]浓度值["+SO2+"]超过上小时的浓度["+previousSO2+"]的"+multiple+"倍";
                                alarmInfo.setAlarmInformation(alarmInformation);
                                alarmInfoMapper.insert(alarmInfo);
                                continue;
                            }
                        }
                        if (!com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(organization)){
                            int cityCode = organization.getCityCode();
                            QueryWrapper<CityAqi> wrapper_cityAqi = new QueryWrapper<>();
                            wrapper_cityAqi.eq("city_code",cityCode).eq("time",previousTime);
                            CityAqi cityAqi = null;
                            cityAqi = cityAqiMapper.selectOne(wrapper_cityAqi);
                            if (!com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(cityAqi)){
                                String cityAqiValue = cityAqi.getValue();
                                JSONObject JsonObject = new JSONObject();
                                JSONObject previousJsonObject = new JSONObject();
                                previousJsonObject = JSONObject.parseObject(cityAqiValue);
                                Double cityAqiSO2 = (Double.parseDouble(previousJsonObject.get("SO2").toString()));
                                if (SO2/cityAqiSO2 >=1.5){
                                    double multiple = SO2/cityAqiSO2;
                                    int percentage = 0;
                                    if (multiple >= 2.5){
                                        percentage = 250;
                                    }else if (multiple >= 1.5){
                                        percentage = 150;
                                    }
                                    QueryWrapper<SysArea> sysAreaQueryWrapper = new QueryWrapper<>();
                                    sysAreaQueryWrapper.eq("area_code",cityCode);
                                    SysArea sysArea = sysAreaMapper.selectOne(sysAreaQueryWrapper);
                                    alarmInfo.setIndex("SO2");
                                    alarmInfo.setAlarmType("超过市区均值"+percentage+"%");
                                    String alarmInformation = "["+device.getName()+"][SO2]浓度值["+SO2+"]超过["+sysArea.getAreaName()+"]均值["+cityAqiSO2+"]的"+percentage+"%";
                                    alarmInfo.setAlarmInformation(alarmInformation);
                                    alarmInfoMapper.insert(alarmInfo);
                                    continue;
                                }
                            }
                        }
                        if (!com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(device.getGuid())){
                            String guid = device.getGuid();
                            QueryWrapper<HistoryAqi> historyAqiQueryWrapper = new QueryWrapper<>();
                            historyAqiQueryWrapper.eq("guid",guid).eq("time",previousTime);
                            HistoryAqi historyAqi = null;
                            historyAqi = historyAqiMapper.selectOne(historyAqiQueryWrapper);
                            if (!com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(historyAqi)){
                                String cityAqiValue = historyAqi.getValue();
                                JSONObject JsonObject = new JSONObject();
                                JSONObject previousJsonObject = new JSONObject();
                                previousJsonObject = JSONObject.parseObject(cityAqiValue);
                                Double govMonitorPointSO2 = null;
                                if (!com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(previousJsonObject.get("PM2_5"))){
                                    govMonitorPointSO2 = (Double.parseDouble(previousJsonObject.get("PM2_5").toString()));
                                }
                                if (!com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(govMonitorPointSO2) && SO2/govMonitorPointSO2 >=1){
                                    double multiple = SO2/govMonitorPointSO2;
                                    int percentage = 0;
                                    if (multiple >= 2.5){
                                        percentage = 250;
                                    }else if (multiple >= 1.5){
                                        percentage = 150;
                                    }else if (multiple >= 1){
                                        percentage = 100;
                                    }
                                    QueryWrapper<GovMonitorPoint> sysAreaQueryWrapper = new QueryWrapper<>();
                                    sysAreaQueryWrapper.eq("guid",guid);
                                    GovMonitorPoint govMonitorPoint = govMonitorPointMapper.selectOne(sysAreaQueryWrapper);
                                    alarmInfo.setIndex("SO2");
                                    alarmInfo.setAlarmType("超过国控站"+percentage+"%");
                                    String alarmInformation = "["+device.getName()+"][SO2]浓度值["+SO2+"]超过["+govMonitorPoint.getName()+"]均值["+govMonitorPointSO2+"]的"+percentage+"%";
                                    alarmInfo.setAlarmInformation(alarmInformation);
                                    alarmInfoMapper.insert(alarmInfo);
                                    continue;
                                }
                            }
                        }
                    }
                    if (!com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(NO2)){
                        if (NO2>200){
                            alarmInfo.setIndex("NO2");
                            alarmInfo.setAlarmType("超限");
                            String alarmInformation = "站点["+device.getName()+"][NO2]浓度值["+NO2+"]超过限定的标准值[75]";
                            alarmInfo.setAlarmInformation(alarmInformation);
                            alarmInfoMapper.insert(alarmInfo);
                            continue;
                        }
                        Double previousNO2 = null;
                        List<HistoryHourly> previoushistoryHourlys = null;
                        previoushistoryHourlys = historyHourlyService.getValueByMacAndTime(device.getMac(), previousDate, previousDate);
                        HistoryHourly previousHistoryHourly = new HistoryHourly();
                        if (com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(previoushistoryHourlys) || historyHourlys.size()<1){
                            previousHistoryHourly = previoushistoryHourlys.get(0);
                            if (!com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(previousHistoryHourly)){
                                String previousValue = previousHistoryHourly.getValue();
                                JSONObject previousJsonObject = new JSONObject();
                                previousJsonObject = JSONObject.parseObject(previousValue);
                                if (!com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(previousJsonObject.get("a21004"))){
                                    previousNO2=(Double.parseDouble(previousJsonObject.get("a21004").toString()));
                                }
                            }
                        }
                        if (!com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(previousNO2) && previousNO2!=0){
                            if (NO2/previousNO2 > 2 || NO2/previousNO2 == 2){
                                String multiple = String.format("%.2f",NO2/previousNO2);
                                alarmInfo.setIndex("NO2");
                                alarmInfo.setAlarmType("突然高");
                                String alarmInformation = "["+device.getName()+"]["+beforTime+"][NO2]浓度值["+NO2+"]超过上小时的浓度["+previousNO2+"]的"+multiple+"倍";
                                alarmInfo.setAlarmInformation(alarmInformation);
                                alarmInfoMapper.insert(alarmInfo);
                                continue;
                            }
                        }
                        if (!com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(organization)){
                            int cityCode = organization.getCityCode();
                            QueryWrapper<CityAqi> wrapper_cityAqi = new QueryWrapper<>();
                            wrapper_cityAqi.eq("city_code",cityCode).eq("time",previousTime);
                            CityAqi cityAqi = null;
                            cityAqi = cityAqiMapper.selectOne(wrapper_cityAqi);
                            if (!com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(cityAqi)){
                                String cityAqiValue = cityAqi.getValue();
                                JSONObject JsonObject = new JSONObject();
                                JSONObject previousJsonObject = new JSONObject();
                                previousJsonObject = JSONObject.parseObject(cityAqiValue);
                                Double cityAqiNO2 = (Double.parseDouble(previousJsonObject.get("NO2").toString()));
                                if (NO2/cityAqiNO2 >=1.5){
                                    double multiple = NO2/cityAqiNO2;
                                    int percentage = 0;
                                    if (multiple >= 2.5){
                                        percentage = 250;
                                    }else if (multiple >= 1.5){
                                        percentage = 150;
                                    }
                                    QueryWrapper<SysArea> sysAreaQueryWrapper = new QueryWrapper<>();
                                    sysAreaQueryWrapper.eq("area_code",cityCode);
                                    SysArea sysArea = sysAreaMapper.selectOne(sysAreaQueryWrapper);
                                    alarmInfo.setIndex("NO2");
                                    alarmInfo.setAlarmType("超过市区均值"+percentage+"%");
                                    String alarmInformation = "["+device.getName()+"][NO2]浓度值["+NO2+"]超过["+sysArea.getAreaName()+"]均值["+cityAqiNO2+"]的"+percentage+"%";
                                    alarmInfo.setAlarmInformation(alarmInformation);
                                    alarmInfoMapper.insert(alarmInfo);
                                    continue;
                                }
                            }
                        }
                        if (!com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(device.getGuid())){
                            String guid = device.getGuid();
                            QueryWrapper<HistoryAqi> historyAqiQueryWrapper = new QueryWrapper<>();
                            historyAqiQueryWrapper.eq("guid",guid).eq("time",previousTime);
                            HistoryAqi historyAqi = null;
                            historyAqi = historyAqiMapper.selectOne(historyAqiQueryWrapper);
                            if (!com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(historyAqi)){
                                String cityAqiValue = historyAqi.getValue();
                                JSONObject JsonObject = new JSONObject();
                                JSONObject previousJsonObject = new JSONObject();
                                previousJsonObject = JSONObject.parseObject(cityAqiValue);
                                Double govMonitorPointNO2 = null;
                                if (!com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(previousJsonObject.get("PM2_5"))){
                                    govMonitorPointNO2 = (Double.parseDouble(previousJsonObject.get("PM2_5").toString()));
                                }
                                if (!com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(govMonitorPointNO2) && NO2/govMonitorPointNO2 >=1){
                                    double multiple = NO2/govMonitorPointNO2;
                                    int percentage = 0;
                                    if (multiple >= 2.5){
                                        percentage = 250;
                                    }else if (multiple >= 1.5){
                                        percentage = 150;
                                    }else if (multiple >= 1){
                                        percentage = 100;
                                    }
                                    QueryWrapper<GovMonitorPoint> sysAreaQueryWrapper = new QueryWrapper<>();
                                    sysAreaQueryWrapper.eq("guid",guid);
                                    GovMonitorPoint govMonitorPoint = govMonitorPointMapper.selectOne(sysAreaQueryWrapper);
                                    alarmInfo.setIndex("NO2");
                                    alarmInfo.setAlarmType("超过国控站"+percentage+"%");
                                    String alarmInformation = "["+device.getName()+"][NO2]浓度值["+NO2+"]超过["+govMonitorPoint.getName()+"]均值["+govMonitorPointNO2+"]的"+percentage+"%";
                                    alarmInfo.setAlarmInformation(alarmInformation);
                                    alarmInfoMapper.insert(alarmInfo);
                                    continue;
                                }
                            }
                        }
                    }
                    if (!com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(CO)){
                        if (CO>10){
                            alarmInfo.setIndex("CO");
                            alarmInfo.setAlarmType("超限");
                            String alarmInformation = "站点["+device.getName()+"][CO]浓度值["+CO+"]超过限定的标准值[75]";
                            alarmInfo.setAlarmInformation(alarmInformation);
                            alarmInfoMapper.insert(alarmInfo);
                            continue;
                        }
                        Double previousCO = null;
                        List<HistoryHourly> previoushistoryHourlys = null;
                        previoushistoryHourlys = historyHourlyService.getValueByMacAndTime(device.getMac(), previousDate, previousDate);
                        HistoryHourly previousHistoryHourly = new HistoryHourly();
                        if (com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(previoushistoryHourlys) || historyHourlys.size()<1){
                            previousHistoryHourly = previoushistoryHourlys.get(0);
                            if (!com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(previousHistoryHourly)){
                                String previousValue = previousHistoryHourly.getValue();
                                JSONObject previousJsonObject = new JSONObject();
                                previousJsonObject = JSONObject.parseObject(previousValue);
                                if (!com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(previousJsonObject.get("a21005"))){
                                    previousCO=(Double.parseDouble(previousJsonObject.get("a21005").toString()));
                                }
                            }
                        }
                        if (!com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(previousCO) && previousCO!=0){
                            if (CO/previousCO > 2 || CO/previousCO == 2){
                                String multiple = String.format("%.2f",CO/previousCO);
                                alarmInfo.setIndex("CO");
                                alarmInfo.setAlarmType("突然高");
                                String alarmInformation = "["+device.getName()+"]["+beforTime+"][CO]浓度值["+CO+"]超过上小时的浓度["+previousCO+"]的"+multiple+"倍";
                                alarmInfo.setAlarmInformation(alarmInformation);
                                alarmInfoMapper.insert(alarmInfo);
                                continue;
                            }
                        }
                        if (!com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(organization)){
                            int cityCode = organization.getCityCode();
                            QueryWrapper<CityAqi> wrapper_cityAqi = new QueryWrapper<>();
                            wrapper_cityAqi.eq("city_code",cityCode).eq("time",previousTime);
                            CityAqi cityAqi = null;
                            cityAqi = cityAqiMapper.selectOne(wrapper_cityAqi);
                            if (!com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(cityAqi)){
                                String cityAqiValue = cityAqi.getValue();
                                JSONObject JsonObject = new JSONObject();
                                JSONObject previousJsonObject = new JSONObject();
                                previousJsonObject = JSONObject.parseObject(cityAqiValue);
                                Double cityAqiCO = (Double.parseDouble(previousJsonObject.get("CO").toString()));
                                if (CO/cityAqiCO >=1.5){
                                    double multiple = CO/cityAqiCO;
                                    int percentage = 0;
                                    if (multiple >= 2.5){
                                        percentage = 250;
                                    }else if (multiple >= 1.5){
                                        percentage = 150;
                                    }
                                    QueryWrapper<SysArea> sysAreaQueryWrapper = new QueryWrapper<>();
                                    sysAreaQueryWrapper.eq("area_code",cityCode);
                                    SysArea sysArea = sysAreaMapper.selectOne(sysAreaQueryWrapper);
                                    alarmInfo.setIndex("CO");
                                    alarmInfo.setAlarmType("超过市区均值"+percentage+"%");
                                    String alarmInformation = "["+device.getName()+"][CO]浓度值["+CO+"]超过["+sysArea.getAreaName()+"]均值["+cityAqiCO+"]的"+percentage+"%";
                                    alarmInfo.setAlarmInformation(alarmInformation);
                                    alarmInfoMapper.insert(alarmInfo);
                                    continue;
                                }
                            }
                        }
                        if (!com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(device.getGuid())){
                            String guid = device.getGuid();
                            QueryWrapper<HistoryAqi> historyAqiQueryWrapper = new QueryWrapper<>();
                            historyAqiQueryWrapper.eq("guid",guid).eq("time",previousTime);
                            HistoryAqi historyAqi = null;
                            historyAqi = historyAqiMapper.selectOne(historyAqiQueryWrapper);
                            if (!com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(historyAqi)){
                                String cityAqiValue = historyAqi.getValue();
                                JSONObject JsonObject = new JSONObject();
                                JSONObject previousJsonObject = new JSONObject();
                                previousJsonObject = JSONObject.parseObject(cityAqiValue);
                                Double govMonitorPointCO = null;
                                if (!com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(previousJsonObject.get("PM2_5"))){
                                    govMonitorPointCO = (Double.parseDouble(previousJsonObject.get("PM2_5").toString()));
                                }
                                if (!com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(govMonitorPointCO) && CO/govMonitorPointCO >=1){
                                    double multiple = CO/govMonitorPointCO;
                                    int percentage = 0;
                                    if (multiple >= 2.5){
                                        percentage = 250;
                                    }else if (multiple >= 1.5){
                                        percentage = 150;
                                    }else if (multiple >= 1){
                                        percentage = 100;
                                    }
                                    QueryWrapper<GovMonitorPoint> sysAreaQueryWrapper = new QueryWrapper<>();
                                    sysAreaQueryWrapper.eq("guid",guid);
                                    GovMonitorPoint govMonitorPoint = govMonitorPointMapper.selectOne(sysAreaQueryWrapper);
                                    alarmInfo.setIndex("CO");
                                    alarmInfo.setAlarmType("超过国控站"+percentage+"%");
                                    String alarmInformation = "["+device.getName()+"][CO]浓度值["+CO+"]超过["+govMonitorPoint.getName()+"]均值["+govMonitorPointCO+"]的"+percentage+"%";
                                    alarmInfo.setAlarmInformation(alarmInformation);
                                    alarmInfoMapper.insert(alarmInfo);
                                    continue;
                                }
                            }
                        }
                    }
                    if (!com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(O3)){
                        if (O3>200){
                            alarmInfo.setIndex("O3");
                            alarmInfo.setAlarmType("超限");
                            String alarmInformation = "站点["+device.getName()+"][O3]浓度值["+O3+"]超过限定的标准值[75]";
                            alarmInfo.setAlarmInformation(alarmInformation);
                            alarmInfoMapper.insert(alarmInfo);
                            continue;
                        }
                        Double previousO3 = null;
                        List<HistoryHourly> previoushistoryHourlys = null;
                        previoushistoryHourlys = historyHourlyService.getValueByMacAndTime(device.getMac(), previousDate, previousDate);
                        HistoryHourly previousHistoryHourly = new HistoryHourly();
                        if (com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(previoushistoryHourlys) || historyHourlys.size()<1){
                            previousHistoryHourly = previoushistoryHourlys.get(0);
                            if (!com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(previousHistoryHourly)){
                                String previousValue = previousHistoryHourly.getValue();
                                JSONObject previousJsonObject = new JSONObject();
                                previousJsonObject = JSONObject.parseObject(previousValue);
                                if (!com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(previousJsonObject.get("a05024"))){
                                    previousO3=(Double.parseDouble(previousJsonObject.get("a05024").toString()));
                                }
                            }
                        }
                        if (!com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(previousO3) && previousO3!=0){
                            if (O3/previousO3 > 2 || O3/previousO3 == 2){
                                String multiple = String.format("%.2f",O3/previousO3);
                                alarmInfo.setIndex("O3");
                                alarmInfo.setAlarmType("突然高");
                                String alarmInformation = "["+device.getName()+"]["+beforTime+"][O3]浓度值["+O3+"]超过上小时的浓度["+previousO3+"]的"+multiple+"倍";
                                alarmInfo.setAlarmInformation(alarmInformation);
                                alarmInfoMapper.insert(alarmInfo);
                                continue;
                            }
                        }
                        if (!com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(organization)){
                            int cityCode = organization.getCityCode();
                            QueryWrapper<CityAqi> wrapper_cityAqi = new QueryWrapper<>();
                            wrapper_cityAqi.eq("city_code",cityCode).eq("time",previousTime);
                            CityAqi cityAqi = null;
                            cityAqi = cityAqiMapper.selectOne(wrapper_cityAqi);
                            if (!com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(cityAqi)){
                                String cityAqiValue = cityAqi.getValue();
                                JSONObject JsonObject = new JSONObject();
                                JSONObject previousJsonObject = new JSONObject();
                                previousJsonObject = JSONObject.parseObject(cityAqiValue);
                                Double cityAqiO3 = (Double.parseDouble(previousJsonObject.get("O3").toString()));
                                if (O3/cityAqiO3 >=1.5){
                                    double multiple = O3/cityAqiO3;
                                    int percentage = 0;
                                    if (multiple >= 2.5){
                                        percentage = 250;
                                    }else if (multiple >= 1.5){
                                        percentage = 150;
                                    }
                                    QueryWrapper<SysArea> sysAreaQueryWrapper = new QueryWrapper<>();
                                    sysAreaQueryWrapper.eq("area_code",cityCode);
                                    SysArea sysArea = sysAreaMapper.selectOne(sysAreaQueryWrapper);
                                    alarmInfo.setIndex("O3");
                                    alarmInfo.setAlarmType("超过市区均值"+percentage+"%");
                                    String alarmInformation = "["+device.getName()+"][O3]浓度值["+O3+"]超过["+sysArea.getAreaName()+"]均值["+cityAqiO3+"]的"+percentage+"%";
                                    alarmInfo.setAlarmInformation(alarmInformation);
                                    alarmInfoMapper.insert(alarmInfo);
                                    continue;
                                }
                            }
                        }
                        if (!com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(device.getGuid())){
                            String guid = device.getGuid();
                            QueryWrapper<HistoryAqi> historyAqiQueryWrapper = new QueryWrapper<>();
                            historyAqiQueryWrapper.eq("guid",guid).eq("time",previousTime);
                            HistoryAqi historyAqi = null;
                            historyAqi = historyAqiMapper.selectOne(historyAqiQueryWrapper);
                            if (!com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(historyAqi)){
                                String cityAqiValue = historyAqi.getValue();
                                JSONObject JsonObject = new JSONObject();
                                JSONObject previousJsonObject = new JSONObject();
                                previousJsonObject = JSONObject.parseObject(cityAqiValue);
                                Double govMonitorPointO3 = null;
                                if (!com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(previousJsonObject.get("PM2_5"))){
                                    govMonitorPointO3 = (Double.parseDouble(previousJsonObject.get("PM2_5").toString()));
                                }
                                if (!com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(govMonitorPointO3) && O3/govMonitorPointO3 >=1){
                                    double multiple = O3/govMonitorPointO3;
                                    int percentage = 0;
                                    if (multiple >= 2.5){
                                        percentage = 250;
                                    }else if (multiple >= 1.5){
                                        percentage = 150;
                                    }else if (multiple >= 1){
                                        percentage = 100;
                                    }
                                    QueryWrapper<GovMonitorPoint> sysAreaQueryWrapper = new QueryWrapper<>();
                                    sysAreaQueryWrapper.eq("guid",guid);
                                    GovMonitorPoint govMonitorPoint = govMonitorPointMapper.selectOne(sysAreaQueryWrapper);
                                    alarmInfo.setIndex("O3");
                                    alarmInfo.setAlarmType("超过国控站"+percentage+"%");
                                    String alarmInformation = "["+device.getName()+"][O3]浓度值["+O3+"]超过["+govMonitorPoint.getName()+"]均值["+govMonitorPointO3+"]的"+percentage+"%";
                                    alarmInfo.setAlarmInformation(alarmInformation);
                                    alarmInfoMapper.insert(alarmInfo);
                                    continue;
                                }
                            }
                        }
                    }
                }
            }
        }
        return ReturnT.SUCCESS;
    }
}
screen-job/src/main/resources/mapper/AlarmInfoMapper.xml
New file
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.moral.api.mapper.AlarmInfoMapper">
        <!-- 通用查询映射结果 -->
        <resultMap id="BaseResultMap" type="com.moral.api.entity.AlarmInfo">
                    <id column="id" property="id" />
                    <result column="alarm_time" property="alarmTime" />
                    <result column="index" property="index" />
                    <result column="device_id" property="deviceId" />
                    <result column="alarm_type" property="alarmType" />
                    <result column="alarm_information" property="alarmInformation" />
                    <result column="create_time" property="createTime" />
        </resultMap>
</mapper>
screen-job/src/main/resources/mapper/SysAreaMapper.xml
New file
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.moral.api.mapper.SysAreaMapper">
        <!-- 通用查询映射结果 -->
        <resultMap id="BaseResultMap" type="com.moral.api.entity.SysArea">
                    <id column="area_code" property="areaCode" />
                    <result column="area_name" property="areaName" />
                    <result column="parent_code" property="parentCode" />
        </resultMap>
</mapper>