From c363540ce0469e6754329c1be5e56a63ec1d344f Mon Sep 17 00:00:00 2001 From: jinpengyong <jpy123456> Date: Mon, 27 Dec 2021 15:40:41 +0800 Subject: [PATCH] 行业贡献率 --- screen-api/src/main/java/com/moral/api/service/impl/HistoryHourlyServiceImpl.java | 44 +++- screen-api/src/main/java/com/moral/api/service/ProfessionService.java | 4 screen-api/src/main/java/com/moral/api/service/impl/ProfessionServiceImpl.java | 362 +++++++++++++++++++++++++++++++++++++++- screen-api/src/main/java/com/moral/api/controller/ProfessionController.java | 26 ++ screen-api/src/main/java/com/moral/api/mapper/HistoryHourlyMapper.java | 3 screen-api/src/main/java/com/moral/api/service/impl/UserServiceImpl.java | 3 screen-api/src/main/java/com/moral/api/service/HistoryHourlyService.java | 66 ++++--- screen-api/src/main/resources/mapper/HistoryHourlyMapper.xml | 20 ++ 8 files changed, 471 insertions(+), 57 deletions(-) diff --git a/screen-api/src/main/java/com/moral/api/controller/ProfessionController.java b/screen-api/src/main/java/com/moral/api/controller/ProfessionController.java index 33c95c7..455c8aa 100644 --- a/screen-api/src/main/java/com/moral/api/controller/ProfessionController.java +++ b/screen-api/src/main/java/com/moral/api/controller/ProfessionController.java @@ -1,6 +1,8 @@ package com.moral.api.controller; import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -53,4 +55,28 @@ Set<Map<String, Object>> response = professionService.getSensorByProfessionsAndOrganizationId(params); return ResultMessage.ok(response); } + + @ApiOperation(value = "���������������", notes = "���������������") + @GetMapping("professionContribution") + @ApiImplicitParams({ + @ApiImplicitParam(name = "organizationId", value = "������id", required = true, paramType = "query", dataType = "Integer"), + @ApiImplicitParam(name = "profession", value = "������key���������������������", required = true, paramType = "query", dataType = "String"), + @ApiImplicitParam(name = "type", value = "���������������2021-12������������2021-12-24���", required = true, paramType = "query", dataType = "String"), + @ApiImplicitParam(name = "time", value = "������", required = true, paramType = "query", dataType = "String"), + @ApiImplicitParam(name = "sensorCode", value = "���������code", required = true, paramType = "query", dataType = "String") + }) + public ResultMessage professionContribution(HttpServletRequest request) { + Map<String, Object> params = WebUtils.getParametersStartingWith(request, null); + if (ObjectUtils.isEmpty(params.get("organizationId")) + ||ObjectUtils.isEmpty(params.get("professions")) + || ObjectUtils.isEmpty(params.get("type")) + || ObjectUtils.isEmpty(params.get("time")) + || ObjectUtils.isEmpty(params.get("sensorCode"))) { + return ResultMessage.fail(ResponseCodeEnum.PARAMETERS_IS_MISSING.getCode(), + ResponseCodeEnum.PARAMETERS_IS_MISSING.getMsg()); + } + List<Map<String, Object>> response = professionService.professionContribution(params); + return ResultMessage.ok(response); + } + } 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 71102bf..17ca271 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 @@ -21,4 +21,7 @@ List<Map<String,Object>> selectDataByMacsAndTime(@Param("timeUnits") String timeUnits, @Param("list")List list, @Param("time")String time); + Double getSensorSumByMacs(@Param("sensorCode") String sensorCode, @Param("macs") List<String> macs, @Param("time") String time, @Param("timeUnits") String timeUnits); + + Double getSensorAvgByMacs(@Param("sensorCode") String sensorCode, @Param("macs") List<String> macs, @Param("time") String time, @Param("timeUnits") String timeUnits); } 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 641674f..5e7f78a 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 @@ -14,54 +14,60 @@ * @author moral * @since 2021-07-14 */ -public interface HistoryHourlyService{ +public interface HistoryHourlyService { //������mac������������AQI - Map<String,Object> getHourlyAqiByMac(String mac); + 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 + * @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: ������������id���������������������������12��������������� - *@Param: [map] - *@return: java.util.Map<java.lang.String,java.lang.Object> - *@Author: lizijie - *@Date: 2021/12/10 14:57 + * @Description: ������������id���������������������������12��������������� + * @Param: [map] + * @return: java.util.Map<java.lang.String, java.lang.Object> + * @Author: lizijie + * @Date: 2021/12/10 14:57 **/ Map<String, Object> getLastTwelveHourDataByOrgIdAndSensorCode(Map map); - + /** - *@Description: ������������id������������������������������������������ - *@Param: [map] - *@return: java.util.Map<java.lang.String,java.lang.Object> - *@Author: lizijie - *@Date: 2021/12/15 15:16 + * @Description: ������������id������������������������������������������ + * @Param: [map] + * @return: java.util.Map<java.lang.String, java.lang.Object> + * @Author: lizijie + * @Date: 2021/12/15 15:16 **/ Map<String, Object> getThermodynamicDiagramDataByOrgIdSensorCodeTime(Map<String, Object> map); /** - *@Description: ������������id��������������������������������������������� - *@Param: [map] - *@return: java.util.Map<java.lang.String,java.lang.Object> - *@Author: lizijie - *@Date: 2021/12/16 15:16 + * @Description: ������������id��������������������������������������������� + * @Param: [map] + * @return: java.util.Map<java.lang.String, java.lang.Object> + * @Author: lizijie + * @Date: 2021/12/16 15:16 **/ List<Map<String, Object>> getThermodynamicDiagramDataByOrgIdSensorCodeTimeslot(Map<String, Object> map); /** - * @Description: ������mac������������������������ - * @Param: [mac, startDate, endDate] - * @return: java.util.List<com.moral.api.entity.HistoryHourly> - * @Author: ��������� - * @Date: 2021/9/28 - */ + * @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); + //��������������������������������������������������� + Double getSensorSumByMacs(String sensorCode, List macs, String time); + + //��������������������������������������������������� + Double getSensorAvgByMacs(String sensorCode, List macs, String time); + } diff --git a/screen-api/src/main/java/com/moral/api/service/ProfessionService.java b/screen-api/src/main/java/com/moral/api/service/ProfessionService.java index ba24c92..eb1e8d7 100644 --- a/screen-api/src/main/java/com/moral/api/service/ProfessionService.java +++ b/screen-api/src/main/java/com/moral/api/service/ProfessionService.java @@ -1,5 +1,6 @@ package com.moral.api.service; +import java.util.List; import java.util.Map; import java.util.Set; @@ -10,4 +11,7 @@ //������������������������������������������ Set<Map<String, Object>> getSensorByProfessionsAndOrganizationId(Map<String, Object> params); + + //��������������� + List<Map<String, Object>> professionContribution(Map<String, Object> params); } 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 287aba6..e842633 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 @@ -528,30 +528,42 @@ } /** - * @Description: ���������������������������mac��������� - * @Param: [mac, startDate, endDate] - * @return: java.util.List<com.moral.api.entity.HistoryHourly> - * @Author: ��������� - * @Date: 2021/9/23 - */ + * @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){ + public List<HistoryHourly> getValueByMacAndTime(String mac, Date startDate, Date endDate) { QueryWrapper<HistoryHourly> wrapper = new QueryWrapper<>(); - wrapper.eq("mac",mac); - wrapper.between("time",startDate,endDate); + 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; } + @Override + public Double getSensorSumByMacs(String sensorCode, List macs, String time) { + String timeUnits = time.substring(0, 7).replace("-", ""); + return historyHourlyMapper.getSensorSumByMacs(sensorCode, macs, time, timeUnits); + } + + @Override + public Double getSensorAvgByMacs(String sensorCode, List macs, String time) { + String timeUnits = time.substring(0, 7).replace("-", ""); + return historyHourlyMapper.getSensorAvgByMacs(sensorCode, macs, time, timeUnits); + } + /** - * @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){ + * @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); diff --git a/screen-api/src/main/java/com/moral/api/service/impl/ProfessionServiceImpl.java b/screen-api/src/main/java/com/moral/api/service/impl/ProfessionServiceImpl.java index d67599f..fa708b8 100644 --- a/screen-api/src/main/java/com/moral/api/service/impl/ProfessionServiceImpl.java +++ b/screen-api/src/main/java/com/moral/api/service/impl/ProfessionServiceImpl.java @@ -3,8 +3,12 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; +import org.springframework.util.ObjectUtils; +import java.text.NumberFormat; +import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -13,12 +17,28 @@ import java.util.stream.Collectors; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.moral.api.entity.CityAqi; +import com.moral.api.entity.CityAqiDaily; +import com.moral.api.entity.CityAqiMonthly; import com.moral.api.entity.Device; +import com.moral.api.entity.HistoryDaily; +import com.moral.api.entity.HistoryMonthly; import com.moral.api.entity.Sensor; +import com.moral.api.service.CityAqiDailyService; +import com.moral.api.service.CityAqiMonthlyService; +import com.moral.api.service.CityAqiService; import com.moral.api.service.DeviceService; +import com.moral.api.service.HistoryDailyService; +import com.moral.api.service.HistoryHourlyService; +import com.moral.api.service.HistoryMonthlyService; +import com.moral.api.service.OrganizationService; import com.moral.api.service.ProfessionService; + import com.moral.constant.Constants; import com.moral.constant.RedisConstants; + +import com.moral.util.AmendUtils; +import com.moral.util.DateUtils; /** * <p> @@ -36,6 +56,38 @@ @Autowired private RedisTemplate redisTemplate; + + @Autowired + private HistoryMonthlyService historyMonthlyService; + + @Autowired + private HistoryDailyService historyDailyService; + + @Autowired + private HistoryHourlyService historyHourlyService; + + @Autowired + private CityAqiMonthlyService cityAqiMonthlyService; + + @Autowired + private CityAqiDailyService cityAqiDailyService; + + @Autowired + private CityAqiService cityAqiService; + + @Autowired + private OrganizationService organizationService; + + private static Map<String, String> senorMap = new HashMap<>(); + + static { + senorMap.put(Constants.SENSOR_CODE_PM25, "PM2_5"); + senorMap.put(Constants.SENSOR_CODE_PM10, "PM10"); + senorMap.put(Constants.SENSOR_CODE_SO2, "SO2"); + senorMap.put(Constants.SENSOR_CODE_NO2, "NO2"); + senorMap.put(Constants.SENSOR_CODE_CO, "CO"); + senorMap.put(Constants.SENSOR_CODE_O3, "O3"); + } @Override public Set<Map<String, Object>> getProfessionsByOrganizationId(Integer organizationId) { @@ -55,6 +107,22 @@ //��������������������������������� Integer orgId = Integer.parseInt(params.get("organizationId").toString()); List<String> professions = Arrays.asList(params.get("professions").toString().split(",")); + List<Device> devices = getDevicesOfProfessions(orgId, professions); + //���redis������������������������ + for (Device device : devices) { + device = (Device) redisTemplate.opsForHash().get(RedisConstants.DEVICE_INFO, device.getMac()); + List<Sensor> sensors = device.getVersion().getSensors(); + for (Sensor sensor : sensors) { + Map<String, Object> sensorMap = new HashMap<>(); + sensorMap.put("sensorCode", sensor.getCode()); + sensorMap.put("sensorName", sensor.getName()); + result.add(sensorMap); + } + } + return result; + } + + private List<Device> getDevicesOfProfessions(Integer orgId, List<String> professions) { QueryWrapper<Device> queryWrapper = new QueryWrapper<>(); queryWrapper.select("mac", "profession") .eq("organization_id", orgId) @@ -69,18 +137,292 @@ } return false; }).collect(Collectors.toList()); + return devices; + } - //���redis������������������������ - for (Device device : devices) { - device = (Device) redisTemplate.opsForHash().get(RedisConstants.DEVICE_INFO, device.getMac()); - List<Sensor> sensors = device.getVersion().getSensors(); - for (Sensor sensor : sensors) { - Map<String, Object> sensorMap = new HashMap<>(); - sensorMap.put("sensorCode", sensor.getCode()); - sensorMap.put("sensorName", sensor.getName()); - result.add(sensorMap); - } + @Override + public List<Map<String, Object>> professionContribution(Map<String, Object> params) { + int orgId = Integer.parseInt(params.get("organizationId").toString()); + List<String> professions = Arrays.asList(params.get("professions").toString().split(",")); + String type = params.get("type").toString(); + String time = params.get("time").toString(); + String sensorCode = params.get("sensorCode").toString(); + List<Map<String, Object>> result = new ArrayList<>(); + + switch (type) { + case "year": + result = professionContributionOfYear(orgId, professions, time, sensorCode); + break; + case "month": + result = professionContributionOfMonth(orgId, professions, time, sensorCode); + break; + case "day": + result = professionContributionOfDay(orgId, professions, time, sensorCode); + break; + default: + break; } return result; } + + //��������������� + private List<Map<String, Object>> professionContributionOfYear(Integer orgId, List<String> professions, String time, String sensorCode) { + List<Map<String, Object>> result = new ArrayList<>(); + + //��������������������������� + List allMacs = getMacsByOrgId(orgId); + + List<String> timeLag = DateUtils.getTimeLag(time); + for (String yearMonth : timeLag) { + Map<String, Object> resultMap = new HashMap<>(); + resultMap.put("time", yearMonth.split("-")[1]); + yearMonth = yearMonth + "-01 00:00:00"; + + + //������������������������������ + Double allDeviceSum = null; + QueryWrapper<HistoryMonthly> historyMonthlyQueryWrapper = new QueryWrapper<>(); + historyMonthlyQueryWrapper.select("SUM(`value`->'$." + sensorCode + "') AS result") + .eq("time", yearMonth) + .in("mac", allMacs); + Map<String, Object> allDeviceSumMap = historyMonthlyService.getMap(historyMonthlyQueryWrapper); + if (!ObjectUtils.isEmpty(allDeviceSumMap)) { + allDeviceSum = (Double) allDeviceSumMap.get("result"); + } + + + //������������ + Double cityValue = null; + //������������������������������ + Integer locationLevelCode = organizationService.getById(orgId).getLocationLevelCode(); + QueryWrapper<CityAqiMonthly> cityAqiMonthlyQueryWrapper = new QueryWrapper<>(); + cityAqiMonthlyQueryWrapper.select("`value`->'$." + sensorCode + "' AS result") + .eq("city_code", locationLevelCode) + .eq("time", yearMonth); + Map<String, Object> cityValueMap = cityAqiMonthlyService.getMap(cityAqiMonthlyQueryWrapper); + if (!ObjectUtils.isEmpty(cityValueMap)) { + cityValue = (Double) cityValueMap.get("result"); + } + resultMap.put("cityValue", cityValue); + + + for (String profession : professions) { + Map<String, Object> professionMap = new HashMap<>(); + + //��������������������� + List<Device> devices = getDevicesOfProfessions(orgId, Collections.singletonList(profession)); + List<String> professionMacs = devices.stream().map(Device::getMac).collect(Collectors.toList()); + + + //������������������ + Double professionSum = null; + historyMonthlyQueryWrapper.clear(); + historyMonthlyQueryWrapper.select("SUM(`value`->'$." + sensorCode + "') AS result") + .eq("time", yearMonth) + .in("mac", professionMacs); + Map<String, Object> professionSumMap = historyMonthlyService.getMap(historyMonthlyQueryWrapper); + if (!ObjectUtils.isEmpty(professionSumMap)) { + professionSum = (Double) professionSumMap.get("result"); + } + + + //������������������ + Double professionAvg = null; + historyMonthlyQueryWrapper.clear(); + historyMonthlyQueryWrapper.select("AVG(`value`->'$." + sensorCode + "') AS result") + .eq("time", yearMonth) + .in("mac", professionMacs); + Map<String, Object> professionAvgMap = historyMonthlyService.getMap(historyMonthlyQueryWrapper); + if (!ObjectUtils.isEmpty(professionAvgMap)) { + professionAvg = (Double) professionAvgMap.get("result"); + } + + //��������������������� + String contributionRate = null; + NumberFormat numberFormat = NumberFormat.getInstance(); + numberFormat.setMaximumFractionDigits(2); + if (professionSum != null && allDeviceSum != null) { + contributionRate = numberFormat.format(professionSum / allDeviceSum * 100) + "%"; + } + + //������������ + professionMap.put("value", professionAvg == null ? null : AmendUtils.sciCal(professionAvg, 0)); + //��������������� + professionMap.put("contributionRate", contributionRate); + + resultMap.put(profession, professionMap); + } + result.add(resultMap); + } + return result; + } + + //��������������� + private List<Map<String, Object>> professionContributionOfMonth(Integer orgId, List<String> professions, String time, String sensorCode) { + List<Map<String, Object>> result = new ArrayList<>(); + + //��������������������������� + List allMacs = getMacsByOrgId(orgId); + + List<String> timeLag = DateUtils.getTimeLag(time); + for (String yearMonthDay : timeLag) { + Map<String, Object> resultMap = new HashMap<>(); + resultMap.put("time", yearMonthDay.split("-")[2]); + yearMonthDay = yearMonthDay + " 00:00:00"; + + + //������������������������������ + Double allDeviceSum = null; + QueryWrapper<HistoryDaily> historyDailyQueryWrapper = new QueryWrapper<>(); + historyDailyQueryWrapper.select("SUM(`value`->'$." + sensorCode + "') AS result") + .eq("time", yearMonthDay) + .in("mac", allMacs); + Map<String, Object> allDeviceSumMap = historyDailyService.getMap(historyDailyQueryWrapper); + if (!ObjectUtils.isEmpty(allDeviceSumMap)) { + allDeviceSum = (Double) allDeviceSumMap.get("result"); + } + + + //������������ + Double cityValue = null; + //������������������������������ + Integer locationLevelCode = organizationService.getById(orgId).getLocationLevelCode(); + QueryWrapper<CityAqiDaily> cityAqiDailyQueryWrapper = new QueryWrapper<>(); + cityAqiDailyQueryWrapper.select("`value`->'$." + sensorCode + "' AS result") + .eq("city_code", locationLevelCode) + .eq("time", yearMonthDay); + Map<String, Object> cityValueMap = cityAqiDailyService.getMap(cityAqiDailyQueryWrapper); + if (!ObjectUtils.isEmpty(cityValueMap)) { + cityValue = (Double) cityValueMap.get("result"); + } + resultMap.put("cityValue", cityValue); + + + + for (String profession : professions) { + Map<String, Object> professionMap = new HashMap<>(); + + //��������������������� + List<Device> devices = getDevicesOfProfessions(orgId, Collections.singletonList(profession)); + List<String> professionMacs = devices.stream().map(Device::getMac).collect(Collectors.toList()); + + + //������������������ + Double professionSum = null; + historyDailyQueryWrapper.clear(); + historyDailyQueryWrapper.select("SUM(`value`->'$." + sensorCode + "') AS result") + .eq("time", yearMonthDay) + .in("mac", professionMacs); + Map<String, Object> professionSumMap = historyDailyService.getMap(historyDailyQueryWrapper); + if (!ObjectUtils.isEmpty(professionSumMap)) { + professionSum = (Double) professionSumMap.get("result"); + } + + + //������������������ + Double professionAvg = null; + historyDailyQueryWrapper.clear(); + historyDailyQueryWrapper.select("AVG(`value`->'$." + sensorCode + "') AS result") + .eq("time", yearMonthDay) + .in("mac", professionMacs); + Map<String, Object> professionAvgMap = historyDailyService.getMap(historyDailyQueryWrapper); + if (!ObjectUtils.isEmpty(professionAvgMap)) { + professionAvg = (Double) professionAvgMap.get("result"); + } + + + //��������������������� + String contributionRate = null; + NumberFormat numberFormat = NumberFormat.getInstance(); + numberFormat.setMaximumFractionDigits(2); + if (professionSum != null && allDeviceSum != null) { + contributionRate = numberFormat.format(professionSum / allDeviceSum * 100) + "%"; + } + + //������������ + professionMap.put("value", professionAvg == null ? null : AmendUtils.sciCal(professionAvg, 0)); + //��������������� + professionMap.put("contributionRate", contributionRate); + + resultMap.put(profession, professionMap); + } + result.add(resultMap); + } + return result; + } + + private List<Map<String, Object>> professionContributionOfDay(Integer orgId, List<String> professions, String time, String sensorCode) { + List<Map<String, Object>> result = new ArrayList<>(); + + //��������������������������� + List allMacs = getMacsByOrgId(orgId); + + List<String> timeLag = DateUtils.getTimeLag(time); + for (String yearMonthDayHour : timeLag) { + Map<String, Object> resultMap = new HashMap<>(); + resultMap.put("time", yearMonthDayHour.split(" ")[1]); + yearMonthDayHour = yearMonthDayHour + ":00:00"; + + + //������������������������������ + Double allDeviceSum = historyHourlyService.getSensorSumByMacs(sensorCode, allMacs, yearMonthDayHour); + + + //������������ + Double cityValue = null; + //������������������������������ + Integer locationLevelCode = organizationService.getById(orgId).getLocationLevelCode(); + QueryWrapper<CityAqi> cityAqiQueryWrapper = new QueryWrapper<>(); + cityAqiQueryWrapper.select("`value`->'$." + sensorCode + "' AS result") + .eq("city_code", locationLevelCode) + .eq("time", yearMonthDayHour); + Map<String, Object> cityValueMap = cityAqiService.getMap(cityAqiQueryWrapper); + if (!ObjectUtils.isEmpty(cityValueMap)) { + cityValue = (Double) cityValueMap.get("result"); + } + resultMap.put("cityValue", cityValue); + + + for (String profession : professions) { + Map<String, Object> professionMap = new HashMap<>(); + + //��������������������� + List<Device> devices = getDevicesOfProfessions(orgId, Collections.singletonList(profession)); + List<String> professionMacs = devices.stream().map(Device::getMac).collect(Collectors.toList()); + + //��������������������������������������������������� + Double professionAvg = historyHourlyService.getSensorAvgByMacs(sensorCode, professionMacs, yearMonthDayHour); + Double professionSum = historyHourlyService.getSensorSumByMacs(sensorCode, professionMacs, yearMonthDayHour); + + //��������������������� + String contributionRate = null; + NumberFormat numberFormat = NumberFormat.getInstance(); + numberFormat.setMaximumFractionDigits(2); + if (professionSum != null && allDeviceSum != null) { + contributionRate = numberFormat.format(professionSum / allDeviceSum * 100) + "%"; + } + + //������������ + professionMap.put("value", professionAvg == null ? null : AmendUtils.sciCal(professionAvg, 0)); + //��������������� + professionMap.put("contributionRate", contributionRate); + + resultMap.put(profession, professionMap); + } + result.add(resultMap); + } + return result; + } + + //������������id������������macs + private List getMacsByOrgId(Integer orgId) { + //��������������������������� + QueryWrapper<Device> deviceQueryWrapper = new QueryWrapper<>(); + deviceQueryWrapper.select("mac") + .eq("organization_id", orgId) + .eq("is_delete", Constants.NOT_DELETE); + return deviceService.listObjs(deviceQueryWrapper); + } + + } diff --git a/screen-api/src/main/java/com/moral/api/service/impl/UserServiceImpl.java b/screen-api/src/main/java/com/moral/api/service/impl/UserServiceImpl.java index ae847c4..a47ccf5 100644 --- a/screen-api/src/main/java/com/moral/api/service/impl/UserServiceImpl.java +++ b/screen-api/src/main/java/com/moral/api/service/impl/UserServiceImpl.java @@ -119,7 +119,7 @@ //������������������ Map<String, Object> userInfo = new LinkedHashMap<>(); - //������in��� + //������������ userInfo.put("userId", userBo.getId()); userInfo.put("account", userBo.getAccount()); userInfo.put("userName", userBo.getUserName()); @@ -219,6 +219,7 @@ //������������������������������ List<Menu> nextLevelMenus = menus.stream() .filter(o -> o.getParentId().equals(menu.getId())) + .sorted(Comparator.comparing(Menu::getOrder)) .collect(Collectors.toList()); List<Map<String, Object>> list = new ArrayList<>(); if (nextLevelMenus.size() > 0) { diff --git a/screen-api/src/main/resources/mapper/HistoryHourlyMapper.xml b/screen-api/src/main/resources/mapper/HistoryHourlyMapper.xml index a392166..426f142 100644 --- a/screen-api/src/main/resources/mapper/HistoryHourlyMapper.xml +++ b/screen-api/src/main/resources/mapper/HistoryHourlyMapper.xml @@ -14,4 +14,24 @@ </foreach> and `time` = #{time} </select> + + <select id="getSensorSumByMacs" resultType="java.lang.Double"> + SELECT SUM(`value`->'$.${sensorCode}') + FROM history_hourly_${timeUnits} + WHERE `time` = #{time} + AND mac IN + <foreach collection="macs" item="mac" index="index" open="(" close=")" separator=","> + #{mac} + </foreach> + </select> + + <select id="getSensorAvgByMacs" resultType="java.lang.Double"> + SELECT AVG(`value`->'$.${sensorCode}') + FROM history_hourly_${timeUnits} + WHERE `time` = #{time} + AND mac IN + <foreach collection="macs" item="mac" index="index" open="(" close=")" separator=","> + #{mac} + </foreach> + </select> </mapper> \ No newline at end of file -- Gitblit v1.8.0