From 348adf3f47bc9765b317e83b3c61981172e9200f Mon Sep 17 00:00:00 2001 From: lizijie <lzjiiie@163.com> Date: Thu, 09 Dec 2021 14:26:35 +0800 Subject: [PATCH] 当前时间因子热力图接口 --- screen-api/src/main/java/com/moral/api/service/impl/HistoryHourlyServiceImpl.java | 111 ++++++++++++++++++++++ screen-api/src/main/java/com/moral/api/controller/HistoryHourlyController.java | 55 +++++++++++ screen-common/src/main/java/com/moral/util/PollutantUtils.java | 57 +++++++++++ screen-api/src/main/java/com/moral/api/mapper/HistoryHourlyMapper.java | 4 screen-api/src/main/java/com/moral/api/service/HistoryHourlyService.java | 9 + screen-api/src/main/resources/mapper/HistoryHourlyMapper.xml | 9 + 6 files changed, 245 insertions(+), 0 deletions(-) diff --git a/screen-api/src/main/java/com/moral/api/controller/HistoryHourlyController.java b/screen-api/src/main/java/com/moral/api/controller/HistoryHourlyController.java new file mode 100644 index 0000000..0f1da06 --- /dev/null +++ b/screen-api/src/main/java/com/moral/api/controller/HistoryHourlyController.java @@ -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); + } + +} diff --git a/screen-api/src/main/java/com/moral/api/mapper/HistoryHourlyMapper.java b/screen-api/src/main/java/com/moral/api/mapper/HistoryHourlyMapper.java index 0d9d380..71102bf 100644 --- a/screen-api/src/main/java/com/moral/api/mapper/HistoryHourlyMapper.java +++ b/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); + } diff --git a/screen-api/src/main/java/com/moral/api/service/HistoryHourlyService.java b/screen-api/src/main/java/com/moral/api/service/HistoryHourlyService.java index e2c6533..c10e14b 100644 --- a/screen-api/src/main/java/com/moral/api/service/HistoryHourlyService.java +++ b/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> diff --git a/screen-api/src/main/java/com/moral/api/service/impl/HistoryHourlyServiceImpl.java b/screen-api/src/main/java/com/moral/api/service/impl/HistoryHourlyServiceImpl.java index e3f2037..48d1dcf 100644 --- a/screen-api/src/main/java/com/moral/api/service/impl/HistoryHourlyServiceImpl.java +++ b/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> diff --git a/screen-api/src/main/resources/mapper/HistoryHourlyMapper.xml b/screen-api/src/main/resources/mapper/HistoryHourlyMapper.xml index f9b3ceb..a392166 100644 --- a/screen-api/src/main/resources/mapper/HistoryHourlyMapper.xml +++ b/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> \ No newline at end of file diff --git a/screen-common/src/main/java/com/moral/util/PollutantUtils.java b/screen-common/src/main/java/com/moral/util/PollutantUtils.java new file mode 100644 index 0000000..07d8ca4 --- /dev/null +++ b/screen-common/src/main/java/com/moral/util/PollutantUtils.java @@ -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; + } +} -- Gitblit v1.8.0