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>