screen-api/src/main/java/com/moral/api/controller/HistoryHourlyController.java | ●●●●● patch | view | raw | blame | history | |
screen-api/src/main/java/com/moral/api/mapper/HistoryHourlyMapper.java | ●●●●● patch | view | raw | blame | history | |
screen-api/src/main/java/com/moral/api/service/HistoryHourlyService.java | ●●●●● patch | view | raw | blame | history | |
screen-api/src/main/java/com/moral/api/service/impl/HistoryHourlyServiceImpl.java | ●●●●● patch | view | raw | blame | history | |
screen-api/src/main/resources/mapper/HistoryHourlyMapper.xml | ●●●●● patch | view | raw | blame | history | |
screen-common/src/main/java/com/moral/util/PollutantUtils.java | ●●●●● patch | view | raw | blame | history |
screen-api/src/main/java/com/moral/api/controller/HistoryHourlyController.java
New file @@ -0,0 +1,55 @@ package com.moral.api.controller; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.moral.api.entity.Organization; import com.moral.api.mapper.OrganizationMapper; import com.moral.api.service.AlarmInfoService; import com.moral.api.service.HistoryHourlyService; import com.moral.constant.ResponseCodeEnum; import com.moral.constant.ResultMessage; import com.moral.util.WebUtils; import io.swagger.annotations.Api; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import java.util.Map; /** * @program: screen * @description: 设备小时数据 * @author: lizijie * @create: 2021-11-10 16:05 **/ @Slf4j @Api(tags = {"设备小时数据"}) @RestController @CrossOrigin(origins = "*", maxAge = 3600) @RequestMapping("/historyHourly") public class HistoryHourlyController { @Resource private OrganizationMapper organizationMapper; @Resource private HistoryHourlyService historyHourlyService; @RequestMapping(value = "getLastHourDataByOrgIdAndSensorCode", method = RequestMethod.GET) @ResponseBody public ResultMessage getLastHourDataByOrgIdAndSensorCode(HttpServletRequest request){ Map<String, Object> parameters = WebUtils.getParametersStartingWith(request,null); Object orgid = parameters.get("organization_id"); Object sensorCode = parameters.get("sensor_code"); if (ObjectUtils.isEmpty(orgid) || ObjectUtils.isEmpty(sensorCode)){ return ResultMessage.fail(ResponseCodeEnum.PARAMETERS_IS_MISSING.getCode(), ResponseCodeEnum.PARAMETERS_IS_MISSING.getMsg()); } Organization organization = organizationMapper.selectById(Integer.parseInt(orgid.toString())); if (ObjectUtils.isEmpty(organization)){ return ResultMessage.fail(ResponseCodeEnum.ORGANIZATION_NOT_EXIST.getCode(), ResponseCodeEnum.ORGANIZATION_NOT_EXIST.getMsg()); } Map<String, Object> resultMap = historyHourlyService.getLastHourDataByOrgIdAndSensorCode(parameters); return ResultMessage.ok(resultMap); } } screen-api/src/main/java/com/moral/api/mapper/HistoryHourlyMapper.java
@@ -2,7 +2,9 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.moral.api.entity.HistoryHourly; import org.apache.ibatis.annotations.Param; import java.util.List; import java.util.Map; /** @@ -17,4 +19,6 @@ String selectHourlyData(Map<String,Object> params); List<Map<String,Object>> selectDataByMacsAndTime(@Param("timeUnits") String timeUnits, @Param("list")List list, @Param("time")String time); } screen-api/src/main/java/com/moral/api/service/HistoryHourlyService.java
@@ -20,6 +20,15 @@ Map<String,Object> getHourlyAqiByMac(String mac); /** *@Description: 通过组织id和因子编码获取上一个小时数据 *@Param: [map] *@return: java.util.Map<java.lang.String,java.lang.Object> *@Author: lizijie *@Date: 2021/12/7 10:07 **/ Map<String, Object> getLastHourDataByOrgIdAndSensorCode(Map map); /** * @Description: 根据mac和时间获取小时值 * @Param: [mac, startDate, endDate] * @return: java.util.List<com.moral.api.entity.HistoryHourly> screen-api/src/main/java/com/moral/api/service/impl/HistoryHourlyServiceImpl.java
@@ -3,10 +3,14 @@ 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.Device; import com.moral.api.entity.HistoryFiveMinutely; import com.moral.api.entity.HistoryHourly; import com.moral.api.entity.Organization; import com.moral.api.mapper.DeviceMapper; import com.moral.api.mapper.HistoryHourlyMapper; import com.moral.api.service.HistoryHourlyService; import com.moral.api.service.OrganizationService; import com.moral.constant.Constants; import com.moral.constant.SeparateTableType; import com.moral.pojo.AQI; @@ -14,11 +18,14 @@ import com.moral.util.DateUtils; import com.moral.util.MybatisPLUSUtils; import com.moral.util.PollutantUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.ObjectUtils; import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; /** * <p> @@ -33,6 +40,12 @@ @Autowired private HistoryHourlyMapper historyHourlyMapper; @Autowired private DeviceMapper deviceMapper; @Autowired private OrganizationService organizationService; @Override public Map<String, Object> getHourlyAqiByMac(String mac) { @@ -56,6 +69,104 @@ } /** *@Description: 通过组织id和因子编码获取上一个小时数据 *@Param: [map] *@return: java.util.Map<java.lang.String,java.lang.Object> *@Author: lizijie *@Date: 2021/12/7 10:07 **/ @Override public Map<String, Object> getLastHourDataByOrgIdAndSensorCode(Map parameters) { Map<String, Object> resultMap = new HashMap<>(); int orgId = Integer.parseInt(parameters.get("organization_id").toString()); //定义一个集合,存放所有id List<Integer> allOrgId = new ArrayList<>(); allOrgId.add(orgId); //循环集合 //所有子组织 List<Organization> allChildrenOrganization = organizationService.getChildrenOrganizationsById(orgId); if (!ObjectUtils.isEmpty(allChildrenOrganization) || allChildrenOrganization.size() < 1){ for (Organization organization:allChildrenOrganization) { allOrgId.add(organization.getId()); } } //集合去重 List<Integer> allOrgIdWithoutDuplicates = allOrgId.stream().distinct().collect(Collectors.toList()); //声明一个list,存放设备mac List<String> deviceMacList = new ArrayList<>(); //声明一个map,Mac作为key,device作为value Map<String,Device> deviceMap = new HashMap<>(); for (Integer orgIdWithoutDuplicates:allOrgIdWithoutDuplicates) { //根据id查询所属设备 QueryWrapper<Device> wrapper_device = new QueryWrapper<>(); wrapper_device.eq("is_delete",Constants.NOT_DELETE).eq("organization_id",orgIdWithoutDuplicates); List<Device> devices = new ArrayList<>(); devices = deviceMapper.selectList(wrapper_device); if (devices.size()>0){ for (Device device:devices) { String mac = device.getMac(); deviceMacList.add(mac); deviceMap.put(mac,device); } }else { continue; } } //获取时间 SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH"); Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.HOUR_OF_DAY,calendar.get(Calendar.HOUR_OF_DAY)-1); String time = df.format(calendar.getTime())+":00:00"; resultMap.put("time",time); String timeUnits = DateUtils.dateToDateString(calendar.getTime(), DateUtils.yyyyMM_EN); List<Map<String,Object>> historyHourlyDatas = new ArrayList<>(); historyHourlyDatas = historyHourlyMapper.selectDataByMacsAndTime(timeUnits, deviceMacList, time); List<Object> list = new ArrayList<>(); List<Double> longitudeList = new ArrayList<>(); List<Double> latitudeList = new ArrayList<>(); for (Map historyHourlyData:historyHourlyDatas) { List<Object> list1 = new ArrayList<>(); String mac = historyHourlyData.get("mac").toString(); Device device = deviceMap.get(mac); double longitude = device.getLongitude(); double latitude = device.getLatitude(); longitudeList.add(longitude); latitudeList.add(latitude); JSONObject value = JSONObject.parseObject(historyHourlyData.get("value").toString()); double num = Double.parseDouble(value.get(parameters.get("sensor_code")).toString()); int level = PollutantUtils.pollutantLevel(num, (parameters.get("sensor_code")).toString()); list1.add(latitude); list1.add(longitude); list1.add(level); list.add(list1); } resultMap.put("list",list); double latitudeMin = Collections.min(latitudeList)-0.0018; double latitudeMax = Collections.max(latitudeList)+0.0018; double longitudeMin = Collections.min(longitudeList)-0.2/(111*Math.cos(latitudeMin)); double longitudeMax = Collections.max(longitudeList)+0.2/(111*Math.cos(latitudeMin)); List<Object> bound = new ArrayList<>(); List<Object> left_up = new ArrayList<>(); left_up.add(latitudeMax); left_up.add(longitudeMin); List<Object> right_up = new ArrayList<>(); right_up.add(latitudeMax); right_up.add(longitudeMax); List<Object> left_down = new ArrayList<>(); left_down.add(latitudeMin); left_down.add(longitudeMin); List<Object> right_down = new ArrayList<>(); right_down.add(latitudeMin); right_down.add(longitudeMax); bound.add(left_up); bound.add(right_up); bound.add(right_down); bound.add(left_down); resultMap.put("bound",bound); return resultMap; } /** * @Description: 查询一段时间内某一mac的数据 * @Param: [mac, startDate, endDate] * @return: java.util.List<com.moral.api.entity.HistoryHourly> screen-api/src/main/resources/mapper/HistoryHourlyMapper.xml
@@ -5,4 +5,13 @@ <select id="selectHourlyData" resultType="java.lang.String"> SELECT `value` FROM history_hourly_${timeUnits} WHERE mac = #{mac} AND `time` = #{time} </select> <select id="selectDataByMacsAndTime" parameterType="java.util.List" resultType="java.util.Map"> select mac, `time`, `value` from history_hourly_${timeUnits} where mac in <foreach collection="list" item="item" index="index" open="(" separator="," close=")"> #{item} </foreach> and `time` = #{time} </select> </mapper> screen-common/src/main/java/com/moral/util/PollutantUtils.java
New file @@ -0,0 +1,57 @@ package com.moral.util; /** * @program: screen * @description: 污染物相关工具类 * @author: lizijie * @create: 2021-12-07 17:34 **/ public class PollutantUtils { /*1小时浓度限值*/ private static Double[] SO2_Hourly_Limit_Data = new Double[]{0d, 150d, 500d, 650d, 800d}; private static Double[] NO2_Hourly_Limit_Data = new Double[]{0d, 100d, 200d, 700d, 1200d, 2340d, 3090d, 3840d}; private static Double[] PM10_Hourly_Limit_Data = new Double[]{0d, 50d, 150d, 250d, 350d, 420d, 500d, 600d}; private static Double[] CO_Hourly_Limit_Data = new Double[]{0d, 5d, 10d, 35d, 60d, 90d, 120d, 150d}; private static Double[] PM2_5_Hourly_Limit_Data = new Double[]{0d, 35d, 75d, 115d, 150d, 250d, 350d, 500d}; private static Double[] O3_Hourly_Limit_Data = new Double[]{0d, 160d, 200d, 300d, 400d, 800d, 1000d, 1200d}; /** * 计算污染物污染等级 */ public static int pollutantLevel(Double num,String sensorCode){ Double[] pollutantArray = null; switch (sensorCode){ case "a34004" : pollutantArray = PM2_5_Hourly_Limit_Data; break; case "a34002" : pollutantArray = PM10_Hourly_Limit_Data; break; case "a21026" : pollutantArray = SO2_Hourly_Limit_Data; break; case "a21004" : pollutantArray = NO2_Hourly_Limit_Data; break; case "a21005" : pollutantArray = CO_Hourly_Limit_Data; break; case "a05024" : pollutantArray = O3_Hourly_Limit_Data; break; default: break; } return getStartIndexFromArray(num,pollutantArray); } /** * 获取数值对应数组中的索引范围的开始值 */ public static int getStartIndexFromArray(Double num,Double[] array){ for (int i=0; i<array.length-1; i++){ if (num >= array[i] && num<array[i+1]){ return i; } if (i == array.length-2){ return i+1; } } return 0; } }