kaiyu
2021-10-18 5586964c3e63f95c9e460a6a3d85d7dca408e096
Merge branch 'dev' of http://blit.7drlb.com:8888/r/moral into dev
12 files added
13 files modified
898 ■■■■■ changed files
screen-job/src/main/java/com/moral/api/config/mybatis/MybatisPlusConfig.java 28 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/entity/GovMonitorPoint.java 2 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/entity/HistoryHourly.java 47 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/entity/Information.java 69 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/entity/Organization.java 134 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/mapper/HistoryHourlyMapper.java 5 ●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/mapper/InformationMapper.java 16 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/mapper/OrganizationMapper.java 16 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/service/CityWeatherService.java 9 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/service/DeviceService.java 11 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/service/GovMonitorPointService.java 11 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/service/HistoryAqiService.java 2 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/service/HistoryHourlyService.java 12 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/service/InformationService.java 27 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/service/OrganizationService.java 18 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/service/impl/CityWeatherServiceImpl.java 12 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/service/impl/DeviceServiceImpl.java 10 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/service/impl/GovMonitorPointServiceImpl.java 29 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/service/impl/HistoryAqiServiceImpl.java 21 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/service/impl/HistoryHourlyServiceImpl.java 39 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/service/impl/InformationServiceImpl.java 31 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/service/impl/OrganizationServiceImpl.java 34 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/task/InformationTask.java 269 ●●●●● patch | view | raw | blame | history
screen-job/src/main/resources/mapper/InformationMapper.xml 17 ●●●●● patch | view | raw | blame | history
screen-job/src/main/resources/mapper/OrganizationMapper.xml 29 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/config/mybatis/MybatisPlusConfig.java
@@ -1,11 +1,20 @@
package com.moral.api.config.mybatis;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.handler.TableNameHandler;
import com.baomidou.mybatisplus.extension.plugins.inner.DynamicTableNameInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.HashMap;
@Configuration
public class MybatisPlusConfig {
    public static ThreadLocal<String> tableName = new ThreadLocal<>();
    /**
     * 分页插件
@@ -16,5 +25,24 @@
        return page;
    }
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        //分页插件
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        // 动态表名SQL解析器
        DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor = new DynamicTableNameInnerInterceptor();
        HashMap<String, TableNameHandler> map = new HashMap<>();
        map.put("history_hourly", (sql, tableName) -> tableName+this.tableName.get());
        map.put("history_five_minutely", (sql, tableName) -> tableName+this.tableName.get());
        dynamicTableNameInnerInterceptor.setTableNameHandlerMap(map);
        interceptor.addInnerInterceptor(dynamicTableNameInnerInterceptor);
        return interceptor;
    }
}
screen-job/src/main/java/com/moral/api/entity/GovMonitorPoint.java
@@ -1,6 +1,7 @@
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.io.Serializable;
@@ -87,6 +88,7 @@
    /**
     * 备注
     */
    @TableField(value = "`desc`")
    private String desc;
screen-job/src/main/java/com/moral/api/entity/HistoryHourly.java
New file
@@ -0,0 +1,47 @@
package com.moral.api.entity;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
 * @ClassName HistoryHourly
 * @Description TODO
 * @Author 陈凯裕
 * @Date 2021/9/14 8:53
 * @Version TODO
 **/
@Data
public class HistoryHourly extends Model<HistoryHourly> {
    private static final long serialVersionUID = 1L;
    /**
     * 设备mac
     */
    private String mac;
    /**
     * 时间
     */
    private Date time;
    /**
     * 数据
     */
    private String value;
    /*
    * 版本号
    * */
    private Integer version;
    @Override
    protected Serializable pkVal() {
        return null;
    }
}
screen-job/src/main/java/com/moral/api/entity/Information.java
New file
@@ -0,0 +1,69 @@
package com.moral.api.entity;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import java.time.LocalDateTime;
import java.io.Serializable;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
 * <p>
 *
 * </p>
 *
 * @author moral
 * @since 2021-10-11
 */
@Data
@EqualsAndHashCode(callSuper = false)
public class Information extends Model<Information> {
    private static final long serialVersionUID = 1L;
    /**
     * id
     */
    private Integer id;
    /**
     * 组织id
     */
    private Integer organizationId;
    /**
     * 信息
     */
    private String info;
    /**
     * 信息类型
     */
    private String type;
    /**
     * 是否已读;1:已读;0:未读
     */
    private String isRead;
    /**
     * 创建时间
     */
    private LocalDateTime createTime;
    /**
     * 更新时间
     */
    private LocalDateTime updateTime;
    /**
     * 逻辑删除;1:删除;0:未删除
     */
    private String isDelete;
    @Override
    protected Serializable pkVal() {
        return this.id;
    }
}
screen-job/src/main/java/com/moral/api/entity/Organization.java
New file
@@ -0,0 +1,134 @@
package com.moral.api.entity;
import com.baomidou.mybatisplus.annotation.IdType;
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-10-12
 */
@Data
@EqualsAndHashCode(callSuper = false)
public class Organization extends Model<Organization> {
    private static final long serialVersionUID = 1L;
    /**
     * 序号
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    /**
     * 父Id
     */
    private Integer parentId;
    /**
     * admin账号Id
     */
    private Integer adminUserId;
    /**
     * 组织名称
     */
    private String name;
    /**
     * 省份代码
     */
    private Integer provinceCode;
    /**
     * 省份名称
     */
    private String provinceName;
    /**
     * 城市代码
     */
    private Integer cityCode;
    /**
     * 城市名称
     */
    private String cityName;
    /**
     * 区代码
     */
    private Integer areaCode;
    /**
     * 区名称
     */
    private String areaName;
    /**
     * 地图定位级别码
     */
    private Integer locationLevelCode;
    /**
     * 地图定位级别名称
     */
    private String locationLevelName;
    /**
     * 地址
     */
    private String address;
    /**
     * 手机号
     */
    private String phone;
    /**
     * 邮箱
     */
    private String email;
    /**
     * 微信号
     */
    private String wechat;
    /**
     * 创建时间
     */
    private Date createTime;
    /**
     * 更新时间
     */
    private Date updateTime;
    /**
     * 到期时间
     */
    private Date expireTime;
    /**
     * 是否删除
     */
    private String isDelete;
    @Override
    protected Serializable pkVal() {
        return this.id;
    }
}
screen-job/src/main/java/com/moral/api/mapper/HistoryHourlyMapper.java
@@ -1,5 +1,8 @@
package com.moral.api.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.moral.api.entity.HistoryHourly;
import java.util.List;
import java.util.Map;
@@ -11,7 +14,7 @@
 * @author moral
 * @since 2021-06-28
 */
public interface HistoryHourlyMapper {
public interface HistoryHourlyMapper extends BaseMapper<HistoryHourly> {
    void createTable(String timeUnits);
screen-job/src/main/java/com/moral/api/mapper/InformationMapper.java
New file
@@ -0,0 +1,16 @@
package com.moral.api.mapper;
import com.moral.api.entity.Information;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
 * <p>
 *  Mapper 接口
 * </p>
 *
 * @author moral
 * @since 2021-10-11
 */
public interface InformationMapper extends BaseMapper<Information> {
}
screen-job/src/main/java/com/moral/api/mapper/OrganizationMapper.java
New file
@@ -0,0 +1,16 @@
package com.moral.api.mapper;
import com.moral.api.entity.Organization;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
 * <p>
 * 组织表 Mapper 接口
 * </p>
 *
 * @author moral
 * @since 2021-10-12
 */
public interface OrganizationMapper extends BaseMapper<Organization> {
}
screen-job/src/main/java/com/moral/api/service/CityWeatherService.java
@@ -15,5 +15,14 @@
    //实时城市气象数据insert
    void insertCityWeather();
    /**
      *@Description: 通过city_code和time获取数据
      *@Param: [cityCode, time]
      *@return: com.moral.api.entity.CityWeather
      *@Author: lizijie
      *@Date: 2021/10/14 16:52
     **/
    CityWeather getDataByCityCodeAndTime(String cityCode,String time);
}
screen-job/src/main/java/com/moral/api/service/DeviceService.java
@@ -3,6 +3,8 @@
import com.moral.api.entity.Device;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
 * <p>
 * 设备表 服务类
@@ -19,4 +21,13 @@
    //更改设备状态
    void updateDeviceState(Device device);
    /**
      *@Description: 通过组织id查找设备
      *@Param: [orgId]
      *@return: java.util.List<com.moral.api.entity.Device>
      *@Author: lizijie
      *@Date: 2021/10/14 9:54
     **/
    List<Device> getDateByOrgId(int orgId);
}
screen-job/src/main/java/com/moral/api/service/GovMonitorPointService.java
@@ -3,6 +3,8 @@
import com.moral.api.entity.GovMonitorPoint;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
 * <p>
 *  服务类
@@ -13,4 +15,13 @@
 */
public interface GovMonitorPointService extends IService<GovMonitorPoint> {
    /**
      *@Description: 通过省市区县编码查询政府站点
      *@Param: [code]
      *@return: java.util.List<com.moral.api.entity.GovMonitorPoint>
      *@Author: lizijie
      *@Date: 2021/10/12 14:42
     **/
    List<GovMonitorPoint> getGovMonitorPointByRegionCode(int code);
}
screen-job/src/main/java/com/moral/api/service/HistoryAqiService.java
@@ -8,4 +8,6 @@
    //aqi数据按国控站接入
    void insertHistoryAqi();
    HistoryAqi getHistoryApiByTimeAndGuid(String guid,String time);
}
screen-job/src/main/java/com/moral/api/service/HistoryHourlyService.java
@@ -1,5 +1,8 @@
package com.moral.api.service;
import com.moral.api.entity.HistoryHourly;
import java.util.Date;
import java.util.List;
import java.util.Map;
@@ -22,4 +25,13 @@
    //从分钟表统计天数据
    List<Map<String, Object>> selectDailyData(Map<String, Object> params);
    /**
     * @Description: 根据mac和时间获取小时值
     * @Param: [mac, startDate, endDate]
     * @return: java.util.List<com.moral.api.entity.HistoryHourly>
     * @Author: 陈凯裕
     * @Date: 2021/9/28
     */
    List<HistoryHourly> getValueByMacAndTime(String mac, Date startDate, Date endDate);
}
screen-job/src/main/java/com/moral/api/service/InformationService.java
New file
@@ -0,0 +1,27 @@
package com.moral.api.service;
import com.moral.api.entity.Information;
import com.baomidou.mybatisplus.extension.service.IService;
import org.springframework.transaction.annotation.Transactional;
/**
 * <p>
 *  服务类
 * </p>
 *
 * @author moral
 * @since 2021-10-11
 */
public interface InformationService extends IService<Information> {
    /**
      *@Description: 插入一条信息
      *@Param: [information]
      *@return: void
      *@Author: lizijie
      *@Date: 2021/10/15 8:45
     **/
    @Transactional
    void insert(Information information);
}
screen-job/src/main/java/com/moral/api/service/OrganizationService.java
New file
@@ -0,0 +1,18 @@
package com.moral.api.service;
import com.moral.api.entity.Organization;
import com.baomidou.mybatisplus.extension.service.IService;
/**
 * <p>
 * 组织表 服务类
 * </p>
 *
 * @author moral
 * @since 2021-10-12
 */
public interface OrganizationService extends IService<Organization> {
    Organization getOrganizationById(int id);
}
screen-job/src/main/java/com/moral/api/service/impl/CityWeatherServiceImpl.java
@@ -64,4 +64,16 @@
            cityWeatherMapper.insert(cityWeather);
        }
    }
    @Override
    public CityWeather getDataByCityCodeAndTime(String cityCode, String time) {
        QueryWrapper wrapper_cityWeather = new QueryWrapper();
        wrapper_cityWeather.eq("city_code",cityCode);
        wrapper_cityWeather.eq("time",time);
        CityWeather cityWeather = new CityWeather();
        if (cityWeatherMapper.selectCount(wrapper_cityWeather)==1){
            cityWeather = cityWeatherMapper.selectOne(wrapper_cityWeather);
        }
        return cityWeather;
    }
}
screen-job/src/main/java/com/moral/api/service/impl/DeviceServiceImpl.java
@@ -15,6 +15,7 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
@@ -65,4 +66,13 @@
        updateWrapper.eq("id", device.getId()).set("state", device.getState());
        deviceMapper.update(null, updateWrapper);
    }
    @Override
    public List<Device> getDateByOrgId(int orgId) {
        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);
        return devices;
    }
}
screen-job/src/main/java/com/moral/api/service/impl/GovMonitorPointServiceImpl.java
@@ -1,10 +1,17 @@
package com.moral.api.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.moral.api.entity.GovMonitorPoint;
import com.moral.api.mapper.GovMonitorPointMapper;
import com.moral.api.service.GovMonitorPointService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.moral.constant.Constants;
import com.moral.util.RegionCodeUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
/**
 * <p>
@@ -17,4 +24,26 @@
@Service
public class GovMonitorPointServiceImpl extends ServiceImpl<GovMonitorPointMapper, GovMonitorPoint> implements GovMonitorPointService {
    @Autowired(required = false)
    private GovMonitorPointMapper govMonitorPointMapper;
    @Override
    public List<GovMonitorPoint> getGovMonitorPointByRegionCode(int code) {
        String regionName = RegionCodeUtils.regionCodeConvertToName(code);
        QueryWrapper<GovMonitorPoint> wrapper_govMonitorPoint = new QueryWrapper<>();
        wrapper_govMonitorPoint.eq("is_delete",Constants.NOT_DELETE);
        switch (regionName){
            case "province_code":wrapper_govMonitorPoint.eq("province_code",code);
                break;
            case "city_code":wrapper_govMonitorPoint.eq("city_code",code);
                break;
            case "area_code":wrapper_govMonitorPoint.eq("area_code",code);
                break;
            default:
                break;
        }
        List<GovMonitorPoint> govMonitorPoints = new ArrayList<>();
        govMonitorPoints = govMonitorPointMapper.selectList(wrapper_govMonitorPoint);
        return govMonitorPoints;
    }
}
screen-job/src/main/java/com/moral/api/service/impl/HistoryAqiServiceImpl.java
@@ -25,6 +25,7 @@
import org.springframework.util.ObjectUtils;
import org.springframework.web.client.RestTemplate;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -66,21 +67,26 @@
        queryWrapper.select("guid").eq("is_delete", Constants.NOT_DELETE);
        //获取所有国控,省控,县控站点
        List<GovMonitorPoint> govMonitorPoints = govMonitorPointService.list(queryWrapper);
        Date time = DateUtils.dataToTimeStampTime(new Date(), DateUtils.yyyy_MM_dd_HH_EN);
        String timeStr = DateUtils.dateToDateString(time, DateUtils.yyyy_MM_dd_HH_mm_ss_EN);
        for (GovMonitorPoint govMonitorPoint : govMonitorPoints) {
            String guid = govMonitorPoint.getGuid();
            ResponseEntity<String> response;
            try {
                //从第三方接口获取数据
                response = restTemplate.exchange("http://chinair.market.alicloudapi.com/api/v1/air_all/station_realtime?guid={1}", HttpMethod.GET, requestEntity, String.class, guid);
                response = restTemplate.exchange("http://chinair.market.alicloudapi.com/api/v1/air_all/station_realtime?guid={1}&pubtime={2}", HttpMethod.GET, requestEntity, String.class, guid, timeStr);
            } catch (Exception e) {
                continue;
            }
            String body = response.getBody();
            Map<String, Object> data = JSONObject.parseObject(body, Map.class);
            Map<String, Object> map = (Map<String, Object>) data.get("data");
            if (ObjectUtils.isEmpty(map)) {
                continue;
            }
            HistoryAqi historyAqi = new HistoryAqi();
            historyAqi.setGuid(guid);
            historyAqi.setTime(DateUtils.getDate(map.get("pubtime").toString(), DateUtils.yyyy_MM_dd_HH_mm_ss_EN));
            historyAqi.setTime(time);
            //存入数据库
            historyAqi.setValue(JSONObject.toJSONString(map));
            historyAqiMapper.insert(historyAqi);
@@ -120,4 +126,15 @@
            redisTemplate.opsForHash().put(RedisConstants.AQI_DATA, guid, value);
        }
    }
    @Override
    public HistoryAqi getHistoryApiByTimeAndGuid(String guid, String time) {
        QueryWrapper<HistoryAqi> wrapper_historyAqi = new QueryWrapper<>();
        wrapper_historyAqi.eq("guid",guid).eq("time",time);
        HistoryAqi historyAqi = new HistoryAqi();
        if (historyAqiMapper.selectCount(wrapper_historyAqi)==1){
            historyAqi = historyAqiMapper.selectOne(wrapper_historyAqi);
        }
        return historyAqi;
    }
}
screen-job/src/main/java/com/moral/api/service/impl/HistoryHourlyServiceImpl.java
@@ -2,6 +2,8 @@
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.moral.api.config.mybatis.MybatisPlusConfig;
import com.moral.api.entity.HistoryHourly;
import com.moral.api.entity.Sensor;
import com.moral.api.mapper.HistoryHourlyMapper;
import com.moral.api.mapper.HistoryMinutelyMapper;
@@ -9,9 +11,11 @@
import com.moral.api.service.SensorService;
import com.moral.constant.Constants;
import com.moral.constant.RedisConstants;
import com.moral.constant.SeparateTableType;
import com.moral.util.AmendUtils;
import com.moral.util.DateUtils;
import com.moral.util.MybatisPLUSUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
@@ -223,4 +227,39 @@
    public List<Map<String, Object>> selectDailyData(Map<String, Object> params) {
        return historyHourlyMapper.selectDailyData(params);
    }
    /**
     * @Description: 查询一段时间内某一mac的数据
     * @Param: [mac, startDate, endDate]
     * @return: java.util.List<com.moral.api.entity.HistoryHourly>
     * @Author: 陈凯裕
     * @Date: 2021/9/23
     */
    @Override
    public List<HistoryHourly> getValueByMacAndTime(String mac, Date startDate, Date endDate){
        QueryWrapper<HistoryHourly> wrapper = new QueryWrapper<>();
        wrapper.eq("mac",mac);
        wrapper.between("time",startDate,endDate);
        List<String> tableNames = MybatisPLUSUtils.getTableNamesByWrapper(startDate, endDate, SeparateTableType.MONTH);
        List<HistoryHourly> datas = multiTableQuery(wrapper, tableNames);
        return datas;
    }
    /**
     * @Description: 多表查询,传入表名集合,以及条件wrapper,返回数据
     * @Param: [wrapper, tableNames]
     * @return: java.util.List<com.moral.api.entity.HistoryHourly>
     * @Author: 陈凯裕
     * @Date: 2021/9/23
     */
    private List<HistoryHourly> multiTableQuery(QueryWrapper<HistoryHourly> wrapper,List<String> tableNames){
        List<HistoryHourly> result = new ArrayList<>();
        for (String tableName : tableNames) {
            MybatisPlusConfig.tableName.set(tableName);
            List<HistoryHourly> datas = historyHourlyMapper.selectList(wrapper);
            result.addAll(datas);
        }
        MybatisPlusConfig.tableName.remove();
        return result;
    }
}
screen-job/src/main/java/com/moral/api/service/impl/InformationServiceImpl.java
New file
@@ -0,0 +1,31 @@
package com.moral.api.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.moral.api.entity.Information;
import com.moral.api.mapper.InformationMapper;
import com.moral.api.service.InformationService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author moral
 * @since 2021-10-11
 */
@Service
public class InformationServiceImpl extends ServiceImpl<InformationMapper, Information> implements InformationService {
    @Autowired(required = false)
    private InformationMapper informationMapper;
    @Override
    @Transactional
    public void insert(Information information) {
        informationMapper.insert(information);
    }
}
screen-job/src/main/java/com/moral/api/service/impl/OrganizationServiceImpl.java
New file
@@ -0,0 +1,34 @@
package com.moral.api.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.moral.api.entity.Organization;
import com.moral.api.mapper.OrganizationMapper;
import com.moral.api.service.OrganizationService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.moral.constant.Constants;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
 * <p>
 * 组织表 服务实现类
 * </p>
 *
 * @author moral
 * @since 2021-10-12
 */
@Service
public class OrganizationServiceImpl extends ServiceImpl<OrganizationMapper, Organization> implements OrganizationService {
    @Autowired(required = false)
    private OrganizationMapper organizationMapper;
    @Override
    public Organization getOrganizationById(int id) {
        QueryWrapper<Organization> wrapper_organization = new QueryWrapper<>();
        wrapper_organization.eq("is_delete",Constants.NOT_DELETE);
        wrapper_organization.eq("id",id);
        Organization organization = organizationMapper.selectOne(wrapper_organization);
        return organization;
    }
}
screen-job/src/main/java/com/moral/api/task/InformationTask.java
New file
@@ -0,0 +1,269 @@
package com.moral.api.task;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.moral.api.entity.*;
import com.moral.api.service.*;
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 java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
/**
 * @program: screen
 * @description: 提示信息自动生成接口
 * @author: lizijie
 * @create: 2021-10-12 08:53
 **/
@Component
public class InformationTask {
    @Autowired
    private OrganizationService organizationService;
    @Autowired
    private GovMonitorPointService govMonitorPointService;
    @Autowired
    private HistoryAqiService historyAqiService;
    @Autowired
    private DeviceService deviceService;
    @Autowired
    private HistoryHourlyService historyHourlyService;
    @Autowired
    private CityWeatherService cityWeatherService;
    @Autowired
    private InformationService informationService;
    @XxlJob("informationInsert")
    public ReturnT informationInsert(){
        String params = XxlJobHelper.getJobParam();
        Map organizationIdMap = JSON.parseObject(params);
        List<Integer> orgIdList = (List<Integer>) organizationIdMap.get("orgId");
        Calendar nowCalendar = Calendar.getInstance();
        Calendar beforeCalendar = Calendar.getInstance();
        /* HOUR_OF_DAY 指示一天中的小时 */
        nowCalendar.set(Calendar.HOUR_OF_DAY, nowCalendar.get(Calendar.HOUR_OF_DAY) - 1);
        beforeCalendar.set(Calendar.HOUR_OF_DAY, beforeCalendar.get(Calendar.HOUR_OF_DAY) - 2);
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH");
        String nowTime = df.format(nowCalendar.getTime())+":00:00";
        String beforeTime = df.format(beforeCalendar.getTime())+":00:00";
        String realTime = df.format(new Date())+":00:00";
        for (Integer orgId:orgIdList) {
            if (!ObjectUtils.isEmpty(organizationService.getOrganizationById(orgId))){
                Organization organization = organizationService.getOrganizationById(orgId);
                Integer locationLevelCode = organization.getLocationLevelCode();
                List<GovMonitorPoint> govMonitorPoints = govMonitorPointService.getGovMonitorPointByRegionCode(locationLevelCode);
                Double PM2_5AvgBefore = null;
                Double PM10AvgBefore = null;
                Double O3AvgBefore = null;
                Double PM2_5AvgNow = null;
                Double PM10AvgNow = null;
                Double O3AvgNow = null;
                Double AQIAvgNow = null;
                Double TVOCAvgNow = null;
                Double TVOCAvgBefore = null;
                if (govMonitorPoints.size()>0){
                    List<Double> PM2_5ListBefore = new ArrayList<>();
                    List<Double> PM10ListBefore = new ArrayList<>();
                    List<Double> O3ListBefore = new ArrayList<>();
                    List<Double> PM2_5ListNow = new ArrayList<>();
                    List<Double> PM10ListNow = new ArrayList<>();
                    List<Double> O3ListNow = new ArrayList<>();
                    List<Double> AQIListNow = new ArrayList<>();
                    for (GovMonitorPoint govMonitorPoint:govMonitorPoints) {
                        String guid = govMonitorPoint.getGuid();
                        HistoryAqi beforeHistoryAqi = new HistoryAqi();
                        beforeHistoryAqi = historyAqiService.getHistoryApiByTimeAndGuid(guid,beforeTime);
                        if (!ObjectUtils.isEmpty(beforeHistoryAqi)){
                            String value = beforeHistoryAqi.getValue();
                            if (!ObjectUtils.isEmpty(value)){
                                JSONObject jsonObject = new JSONObject();
                                jsonObject = JSONObject.parseObject(value);
                                if (!ObjectUtils.isEmpty(jsonObject.get("pm2_5"))){
                                    PM2_5ListBefore.add(Double.parseDouble(jsonObject.get("pm2_5").toString()));
                                }
                                if (!ObjectUtils.isEmpty(jsonObject.get("pm10"))){
                                    PM10ListBefore.add(Double.parseDouble(jsonObject.get("pm10").toString()));
                                }
                                if (!ObjectUtils.isEmpty(jsonObject.get("o3"))){
                                    O3ListBefore.add(Double.parseDouble(jsonObject.get("o3").toString()));
                                }
                            }
                        }
                        HistoryAqi nowHistoryAqi = new HistoryAqi();
                        nowHistoryAqi = historyAqiService.getHistoryApiByTimeAndGuid(guid,nowTime);
                        if (!ObjectUtils.isEmpty(nowHistoryAqi)){
                            String value = nowHistoryAqi.getValue();
                            if (!ObjectUtils.isEmpty(value)){
                                JSONObject jsonObject = JSONObject.parseObject(value);
                                if (!ObjectUtils.isEmpty(jsonObject.get("pm2_5"))){
                                    PM2_5ListNow.add(Double.parseDouble(jsonObject.get("pm2_5").toString()));
                                }
                                if (!ObjectUtils.isEmpty(jsonObject.get("pm10"))){
                                    PM10ListNow.add(Double.parseDouble(jsonObject.get("pm10").toString()));
                                }
                                if (!ObjectUtils.isEmpty(jsonObject.get("o3"))){
                                    O3ListNow.add(Double.parseDouble(jsonObject.get("o3").toString()));
                                }
                                if (!ObjectUtils.isEmpty(jsonObject.get("aqi"))){
                                    AQIListNow.add(Double.parseDouble(jsonObject.get("aqi").toString()));
                                }
                            }
                        }
                    }
                    if (PM2_5ListBefore.size()>0){
                        PM2_5AvgBefore = (double)Math.round(PM2_5ListBefore.stream().mapToDouble(aDouble -> aDouble).summaryStatistics().getAverage());
                    }
                    if (PM10ListBefore.size()>0){
                        PM10AvgBefore = (double)Math.round(PM10ListBefore.stream().mapToDouble(aDouble -> aDouble).summaryStatistics().getAverage());
                    }
                    if (O3ListBefore.size()>0){
                        O3AvgBefore = (double)Math.round(O3ListBefore.stream().mapToDouble(aDouble -> aDouble).summaryStatistics().getAverage());
                    }
                    if (PM2_5ListNow.size()>0){
                        PM2_5AvgNow = (double)Math.round(PM2_5ListNow.stream().mapToDouble(aDouble -> aDouble).summaryStatistics().getAverage());
                    }
                    if (PM10ListNow.size()>0){
                        PM10AvgNow = (double)Math.round(PM10ListNow.stream().mapToDouble(aDouble -> aDouble).summaryStatistics().getAverage());
                    }
                    if (O3ListNow.size()>0){
                        O3AvgNow = (double)Math.round(O3ListNow.stream().mapToDouble(aDouble -> aDouble).summaryStatistics().getAverage());
                    }
                    if (AQIListNow.size()>0){
                        AQIAvgNow = (double)Math.round(AQIListNow.stream().mapToDouble(aDouble -> aDouble).summaryStatistics().getAverage());
                    }
                    List<Device> devices = new ArrayList<>();
                    devices = deviceService.getDateByOrgId(orgId);
                    List<Double> TVOCListNow = new ArrayList<>();
                    List<Double> TVOCListBefore = new ArrayList<>();
                    SimpleDateFormat df1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                    try {
                        for (Device device:devices) {
                            String mac = device.getMac();
                            List<HistoryHourly> historyHourliesNow = new ArrayList<>();
                            historyHourliesNow = historyHourlyService.getValueByMacAndTime(mac, df1.parse(nowTime), df1.parse(df.format(nowCalendar.getTime()) + ":00:01"));
                            if (!ObjectUtils.isEmpty(historyHourliesNow) && historyHourliesNow.size()>0){
                                String value = historyHourliesNow.get(0).getValue();
                                JSONObject jsonObject = JSONObject.parseObject(value);
                                TVOCListNow.add(Double.parseDouble(jsonObject.get("a99054").toString()));
                            }
                            List<HistoryHourly> historyHourliesBefore = new ArrayList<>();
                            historyHourliesBefore = historyHourlyService.getValueByMacAndTime("p5dnd7a0392252", df1.parse(beforeTime), df1.parse(df.format(beforeCalendar.getTime()) + ":00:01"));
                            if (!ObjectUtils.isEmpty(historyHourliesBefore) && historyHourliesBefore.size()>0){
                                String value = historyHourliesBefore.get(0).getValue();
                                JSONObject jsonObject = JSONObject.parseObject(value);
                                TVOCListBefore.add(Double.parseDouble(jsonObject.get("a99054").toString()));
                            }
                        }
                    }catch (ParseException e){
                        e.printStackTrace();
                    }
                    if (TVOCListNow.size()>0){
                        TVOCAvgNow = (double)Math.round(TVOCListNow.stream().mapToDouble(aDouble -> aDouble).summaryStatistics().getAverage());
                    }
                    if (TVOCListBefore.size()>0){
                        TVOCAvgBefore = (double)Math.round(TVOCListBefore.stream().mapToDouble(aDouble -> aDouble).summaryStatistics().getAverage());
                    }
                }
                String temp = "";
                String humidity = "";
                String windDir = "";
                String windScale = "";
                CityWeather cityWeather = new CityWeather();
                cityWeather = cityWeatherService.getDataByCityCodeAndTime(locationLevelCode.toString(),nowTime);
                if (!ObjectUtils.isEmpty(cityWeather)){
                    String value = cityWeather.getValue();
                    if (!ObjectUtils.isEmpty(value)){
                        JSONObject jsonObject = JSONObject.parseObject(value);
                        if (!ObjectUtils.isEmpty(jsonObject.get("temp"))){
                            temp = jsonObject.getString("temp");
                        }
                        if (!ObjectUtils.isEmpty(jsonObject.get("humidity"))){
                            humidity = jsonObject.getString("humidity");
                        }
                        if (!ObjectUtils.isEmpty(jsonObject.get("windDir"))){
                            windDir = jsonObject.getString("windDir");
                        }
                        if (!ObjectUtils.isEmpty(jsonObject.get("windScale "))){
                            windScale = jsonObject.getString("windScale");
                        }
                    }
                }
                Information information = new Information();
                JSONObject jsonObject = new JSONObject();
                String realHour = realTime.substring(11,13);
                String nowHour = nowTime.substring(11,13);
                String beforeHour = beforeTime.substring(11,13);
                String title = "【"+realHour+"时数据提醒】";
                String airInfo = nowHour+"时,";
                String AQILevel = "";
                if (!ObjectUtils.isEmpty(AQIAvgNow)){
                    airInfo = airInfo + "我市AQI:"+AQIAvgNow+",等级:";
                    if (AQIAvgNow<50 || AQIAvgNow==50){
                        AQILevel = "优";
                    }else if (AQIAvgNow<100 || AQIAvgNow==100){
                        AQILevel = "良好";
                    }else if (AQIAvgNow<200 || AQIAvgNow==200){
                        AQILevel = "轻度污染";
                    }else if (AQIAvgNow<300 || AQIAvgNow==300){
                        AQILevel = "中度污染";
                    }else{
                        AQILevel = "重度污染";
                    }
                }else {
                    airInfo = airInfo + "我市AQI:"+",等级:";
                }
                airInfo = airInfo+AQILevel+"。";
                String PM10Info = "";
                PM10Info = PM10Info+"PM10:"+PM10AvgNow+"微克/立方米,";
                if (!ObjectUtils.isEmpty(PM10AvgBefore) && !ObjectUtils.isEmpty(PM10AvgNow)){
                    String upOrDown = (PM10AvgBefore<PM10AvgNow)?"上升":"下降";
                    PM10Info = PM10Info + upOrDown+Math.abs(PM10AvgNow-PM10AvgBefore)+";";
                }
                String PM2_5Info = "";
                PM2_5Info = PM2_5Info+"PM10:"+PM2_5AvgNow+"微克/立方米,";
                if (!ObjectUtils.isEmpty(PM2_5AvgBefore) && !ObjectUtils.isEmpty(PM2_5AvgNow)){
                    String upOrDown = (PM2_5AvgBefore<PM2_5AvgNow)?"上升":"下降";
                    PM2_5Info = PM2_5Info + upOrDown+Math.abs(PM2_5AvgNow-PM2_5AvgBefore)+";";
                }
                String O3Info = "";
                O3Info = O3Info+"O3:"+O3AvgNow+"微克/立方米,";
                if (!ObjectUtils.isEmpty(O3AvgBefore) && !ObjectUtils.isEmpty(O3AvgNow)){
                    String upOrDown = (O3AvgBefore<PM10AvgNow)?"上升":"下降";
                    O3Info = O3Info + upOrDown+Math.abs(O3AvgNow-O3AvgBefore)+";";
                }
                String TVOCInfo = "";
                TVOCInfo = TVOCInfo+"TVOC总量:"+TVOCAvgNow+"微克/立方米。";
                String cityWeatherInfo = "";
                cityWeatherInfo = cityWeatherInfo + "当天天气状况:温度"+temp+"℃,湿度"+humidity+"%,"+windDir+windScale+"级。";
                airInfo = airInfo+"与"+beforeHour+"相比,"+PM10Info+PM2_5Info+O3Info+TVOCInfo;
                airInfo = airInfo.replace("null","");
                cityWeatherInfo = cityWeatherInfo.replace("null","");
                List info = new ArrayList();
                info.add(airInfo);
                info.add(cityWeatherInfo);
                String author = "(七星瓢虫专家组)";
                jsonObject.put("title",title);
                jsonObject.put("info",info);
                jsonObject.put("author",author);
                information.setInfo(jsonObject.toString());
                information.setOrganizationId(orgId);
                information.setType("0");
                informationService.insert(information);
            }
        }
        return ReturnT.SUCCESS;
    }
}
screen-job/src/main/resources/mapper/InformationMapper.xml
New file
@@ -0,0 +1,17 @@
<?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.InformationMapper">
        <!-- 通用查询映射结果 -->
        <resultMap id="BaseResultMap" type="com.moral.api.entity.Information">
                    <id column="id" property="id" />
                    <result column="organization_id" property="organizationId" />
                    <result column="info" property="info" />
                    <result column="type" property="type" />
                    <result column="is_read" property="isRead" />
                    <result column="create_time" property="createTime" />
                    <result column="update_time" property="updateTime" />
                    <result column="is_delete" property="isDelete" />
        </resultMap>
</mapper>
screen-job/src/main/resources/mapper/OrganizationMapper.xml
New file
@@ -0,0 +1,29 @@
<?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.OrganizationMapper">
        <!-- 通用查询映射结果 -->
        <resultMap id="BaseResultMap" type="com.moral.api.entity.Organization">
                    <id column="id" property="id" />
                    <result column="parent_id" property="parentId" />
                    <result column="admin_user_id" property="adminUserId" />
                    <result column="name" property="name" />
                    <result column="province_code" property="provinceCode" />
                    <result column="province_name" property="provinceName" />
                    <result column="city_code" property="cityCode" />
                    <result column="city_name" property="cityName" />
                    <result column="area_code" property="areaCode" />
                    <result column="area_name" property="areaName" />
                    <result column="location_level_code" property="locationLevelCode" />
                    <result column="location_level_name" property="locationLevelName" />
                    <result column="address" property="address" />
                    <result column="phone" property="phone" />
                    <result column="email" property="email" />
                    <result column="wechat" property="wechat" />
                    <result column="create_time" property="createTime" />
                    <result column="update_time" property="updateTime" />
                    <result column="expire_time" property="expireTime" />
                    <result column="is_delete" property="isDelete" />
        </resultMap>
</mapper>