From 2148f513155ca2516dc30af751f967be904d4efe Mon Sep 17 00:00:00 2001 From: jinpengyong <jpy123456> Date: Fri, 14 Jan 2022 17:23:10 +0800 Subject: [PATCH] update --- screen-api/src/main/java/com/moral/api/service/impl/CityAqiServiceImpl.java | 244 ++++++++++++++++++++++++++++++------------------ 1 files changed, 154 insertions(+), 90 deletions(-) diff --git a/screen-api/src/main/java/com/moral/api/service/impl/CityAqiServiceImpl.java b/screen-api/src/main/java/com/moral/api/service/impl/CityAqiServiceImpl.java index f38abc8..746fcbb 100644 --- a/screen-api/src/main/java/com/moral/api/service/impl/CityAqiServiceImpl.java +++ b/screen-api/src/main/java/com/moral/api/service/impl/CityAqiServiceImpl.java @@ -3,6 +3,7 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.moral.api.config.properties.SpecialCitiesProperties; import com.moral.api.entity.CityAqi; import com.moral.api.entity.CityAqiDaily; import com.moral.api.entity.CityAqiMonthly; @@ -60,9 +61,6 @@ private RedisTemplate redisTemplate; @Autowired - private OrganizationService organizationService; - - @Autowired private SysAreaService sysAreaService; @Autowired @@ -73,6 +71,9 @@ @Autowired private CityAqiYearlyService cityAqiYearlyService; + + @Autowired + private SpecialCitiesProperties specialCitiesProperties; @Override public List<Map<String, Object>> measuredCompareForecastOfO3(Map<String, Object> params) { @@ -135,6 +136,21 @@ Map<String, Object> value = (Map<String, Object>) redisTemplate.opsForHash().get(RedisConstants.CITY_AQI, String.valueOf(regionCode)); if (value == null) value = queryCityAqiByRegionCodeFromDB(regionCode); + //������������������������������������������������������������ + if (value == null) { + String regionCodeStr = String.valueOf(regionCode); + String end = regionCodeStr.substring(regionCodeStr.length() - 2, regionCodeStr.length()); + if (!end.equals(00)) { + regionCodeStr = regionCodeStr.substring(0, regionCodeStr.length() - 2); + regionCodeStr += "00"; + regionCode = Integer.parseInt(regionCodeStr); + value = (Map<String, Object>) redisTemplate.opsForHash().get(RedisConstants.CITY_AQI, String.valueOf(regionCode)); + if (value == null) + value = queryCityAqiByRegionCodeFromDB(regionCode); + } else { + return null; + } + } //������AQI������������������ if (value == null || value.get("AQI") == null) return null; @@ -152,6 +168,8 @@ lastDataWrapper.orderByDesc("time"); lastDataWrapper.last(true, "limit 1"); CityAqi cityAqi = cityAqiMapper.selectOne(lastDataWrapper); + if (cityAqi == null) + return null; //���������24������������������ Date endDate = cityAqi.getTime(); Date startDate = DateUtils.addHours(endDate, -23); @@ -176,10 +194,10 @@ //������������������������ cityAqis.sort(Comparator.comparing(CityAqi::getTime)); } - //������������������,map���key���HH:mm������������������value���aqi��������� + //������������������,map���key���yyyy-MM-dd HH:mm������������������value���aqi��������� Map<String, Object> result = new LinkedHashMap<>(); for (CityAqi aqi : cityAqis) { - String key = DateUtils.dateToDateString(aqi.getTime(), "HH:mm"); + String key = DateUtils.dateToDateString(aqi.getTime(), "yyyy-MM-dd HH:mm"); String allDataJson = aqi.getValue(); if (allDataJson == null) { result.put(key, ""); @@ -223,7 +241,7 @@ @Override public List<Map<String, Object>> rankingDetails(Map<String, Object> params) { List<Map<String, Object>> result = new ArrayList<>(); - int orgId = Integer.parseInt(params.get("organizationId").toString()); + int regionCode = Integer.parseInt(params.get("regionCode").toString()); String type = params.get("type").toString(); String time = null; if (!ObjectUtils.isEmpty(params.get("time"))) { @@ -237,45 +255,52 @@ } String cityType = params.get("cityType").toString(); - //���������,���code - Organization organization = organizationService.getById(orgId); - Integer curProvinceCode = organization.getProvinceCode(); - Integer curCityCode = organization.getCityCode(); + String s = String.valueOf(regionCode); + //���������������,���code + Integer curProvinceCode = Integer.parseInt(s.substring(0, 2) + "0000"); + Integer curCityCode = Integer.parseInt(s.substring(0, 4) + "00"); QueryWrapper<SysArea> areaWrapper = new QueryWrapper<>(); - if ("province".equals(cityType)) { - //��������������������� - areaWrapper.select("area_code").eq("parent_code", curProvinceCode); + + List<SysArea> sysAreas; + if ("28".equals(cityType)) { + //������2+26������ + sysAreas = specialCitiesProperties.getTwentyEightCities(); } else { - //������������������������ - areaWrapper.select("area_code").eq("parent_code", curCityCode); + if ("province".equals(cityType)) { + //��������������������� + areaWrapper.select("area_code", "area_name").eq("parent_code", curProvinceCode); + } else { + //������������������������ + areaWrapper.select("area_code", "area_name").eq("parent_code", curCityCode); + } + sysAreas = sysAreaService.list(areaWrapper); } - List<Object> regionCodes = sysAreaService.listObjs(areaWrapper); switch (type) { case "today": - result = accumulatedTodayRank(regionCodes); + result = accumulatedTodayRank(sysAreas); break; case "hour": time = new StringBuilder(time).replace(10, 11, " ").toString() + ":00:00"; - result = hourRank(regionCodes, time); + result = hourRank(sysAreas, time); break; case "day": time = time + " 00:00:00"; - result = dayRank(regionCodes, time); + result = dayRank(sysAreas, time); break; case "month": time = time + "-01 00:00:00"; - result = monthRank(regionCodes, time); + result = monthRank(sysAreas, time); break; case "year": time = time + "-01-01 00:00:00"; - result = yearRank(regionCodes, time); + result = yearRank(sysAreas, time); break; case "custom": start = start + " 00:00:00"; end = end + " :00:00"; - result = customRank(regionCodes, start, end); + result = customRank(sysAreas, start, end); break; default: break; @@ -284,10 +309,14 @@ } /** - * @param regionCodes ��������������������������������������� + * @param sysAreas ������������������������ * @return ��������������������������� */ - private List<Map<String, Object>> accumulatedTodayRank(List<Object> regionCodes) { + private List<Map<String, Object>> accumulatedTodayRank(List<SysArea> sysAreas) { + List<Integer> regionCodes = sysAreas.stream() + .map(SysArea::getAreaCode) + .collect(Collectors.toList()); + List<Map<String, Object>> result = new ArrayList<>(); List<String> sensors = Arrays.asList("PM2_5", "PM10", "SO2", "NO2", "CO", "O3"); Date now = new Date(); @@ -298,7 +327,7 @@ .in("city_code", regionCodes); List<Map<String, Object>> cumulativeData = cityAqiMapper.selectMaps(wrapper); //���city_code������ - Map<String, List<Map<String, Object>>> data = cumulativeData.parallelStream().collect(Collectors.groupingBy(o -> o.get("city_code").toString())); + Map<Integer, List<Map<String, Object>>> data = cumulativeData.parallelStream().collect(Collectors.groupingBy(o -> Integer.parseInt(o.get("city_code").toString()))); data.forEach((cityCode, value) -> { List<Double> doubles = new ArrayList<>(); for (Map<String, Object> objectMap : value) { @@ -360,22 +389,27 @@ dataMap.put("compositeIndex", compositeIndex); //��������� - QueryWrapper<SysArea> queryWrapper = new QueryWrapper<>(); - queryWrapper.select("area_name").eq("area_code", cityCode); - String areaName = sysAreaService.getOne(queryWrapper).getAreaName(); - dataMap.put("cityName", areaName); - + for (SysArea sysArea : sysAreas) { + if (cityCode.equals(sysArea.getAreaCode())) { + dataMap.put("cityName", sysArea.getAreaName()); + break; + } + } result.add(dataMap); }); return result; } /** - * @param regionCodes ��������������������������������� - * @param time ��������������������������� 2021-11-04 13:00:00 + * @param sysAreas ������������������������ + * @param time ��������������������������� 2021-11-04 13:00:00 * @return ��������������������� */ - private List<Map<String, Object>> hourRank(List<Object> regionCodes, String time) { + private List<Map<String, Object>> hourRank(List<SysArea> sysAreas, String time) { + List<Integer> regionCodes = sysAreas.stream() + .map(SysArea::getAreaCode) + .collect(Collectors.toList()); + List<Map<String, Object>> result = new ArrayList<>(); QueryWrapper<CityAqi> wrapper = new QueryWrapper<>(); wrapper.select("value") @@ -398,11 +432,15 @@ } /** - * @param regionCodes ��������������������������������� - * @param time ��������������������������� 2021-11-04 00:00:00 + * @param sysAreas ������������������������ + * @param time ��������������������������� 2021-11-04 00:00:00 * @return ������������������ */ - private List<Map<String, Object>> dayRank(List<Object> regionCodes, String time) { + private List<Map<String, Object>> dayRank(List<SysArea> sysAreas, String time) { + List<Integer> regionCodes = sysAreas.stream() + .map(SysArea::getAreaCode) + .collect(Collectors.toList()); + List<Map<String, Object>> result = new ArrayList<>(); QueryWrapper<CityAqiDaily> wrapper = new QueryWrapper<>(); wrapper.select("city_code", "value") @@ -417,30 +455,37 @@ primaryPollutant = primaryPollutantNames.stream().map(String::valueOf).collect(Collectors.joining(",")); } value.put("primaryPollutant", primaryPollutant); + + //��������� - QueryWrapper<SysArea> queryWrapper = new QueryWrapper<>(); - queryWrapper.select("area_name") - .eq("area_code", dayDatum.get("city_code")); - String areaName = sysAreaService.getOne(queryWrapper).getAreaName(); - value.put("cityName", areaName); + for (SysArea sysArea : sysAreas) { + if (dayDatum.get("city_code").equals(sysArea.getAreaCode())) { + value.put("cityName", sysArea.getAreaName()); + break; + } + } result.add(value); } return result; } /** - * @param regionCodes ��������������������������������� - * @param time ��������������������������� 2021-11-01 00:00:00 ������1��� + * @param sysAreas ������������������������ + * @param time ��������������������������� 2021-11-01 00:00:00 ������1��� * @return ������������������ */ - private List<Map<String, Object>> monthRank(List<Object> regionCodes, String time) { + private List<Map<String, Object>> monthRank(List<SysArea> sysAreas, String time) { + List<Integer> regionCodes = sysAreas.stream() + .map(SysArea::getAreaCode) + .collect(Collectors.toList()); + //��������������������������� List<String> sensors = Arrays.asList("PM2_5", "PM10", "SO2", "NO2"); List<Map<String, Object>> result = new ArrayList<>(); - //���������������,������������������������������city_aqi_monthly������ + //������������������,������������������������������city_aqi_monthly������ if (!time.substring(0, 7).equals(DateUtils.dateToDateString(new Date(), DateUtils.yyyy_MM_EN))) { QueryWrapper<CityAqiMonthly> cityAqiMonthlyQueryWrapper = new QueryWrapper<>(); - for (Object regionCode : regionCodes) { + for (Integer regionCode : regionCodes) { cityAqiMonthlyQueryWrapper.clear(); cityAqiMonthlyQueryWrapper.select("value") .eq("city_code", regionCode) @@ -451,13 +496,15 @@ } String value = cityAqiMonthly.getValue(); Map<String, Object> resultMap = JSONObject.parseObject(value, Map.class); + + //��������� - QueryWrapper<SysArea> sysAreaQueryWrapper = new QueryWrapper<>(); - sysAreaQueryWrapper.select("area_name") - .eq("area_code", regionCode); - String areaName = sysAreaService.getOne(sysAreaQueryWrapper).getAreaName(); - resultMap.put("cityName", areaName); - result.add(resultMap); + for (SysArea sysArea : sysAreas) { + if (regionCode.equals(sysArea.getAreaCode())) { + resultMap.put("cityName", sysArea.getAreaName()); + break; + } + } } return result; } @@ -468,7 +515,9 @@ .in("city_code", regionCodes); List<Map<String, Object>> thisMonthData = cityAqiDailyService.listMaps(cityAqiDailyQueryWrapper); //���city_code������ - Map<String, List<Map<String, Object>>> thisMonthMap = thisMonthData.parallelStream().collect(Collectors.groupingBy(o -> o.get("city_code").toString())); + Map<Integer, List<Map<String, Object>>> thisMonthMap = thisMonthData.parallelStream() + .collect(Collectors.groupingBy(o -> Integer.parseInt(o.get("city_code").toString()))); + thisMonthMap.forEach((cityCode, value) -> { Map<String, Object> resultMap = new HashMap<>(); @@ -539,30 +588,34 @@ resultMap.put("monthContrast", monthContrast); //��������� - QueryWrapper<SysArea> sysAreaQueryWrapper = new QueryWrapper<>(); - sysAreaQueryWrapper.select("area_name") - .eq("area_code", cityCode); - String areaName = sysAreaService.getOne(sysAreaQueryWrapper).getAreaName(); - resultMap.put("cityName", areaName); - + for (SysArea sysArea : sysAreas) { + if (cityCode.equals(sysArea.getAreaCode())) { + resultMap.put("cityName", sysArea.getAreaName()); + break; + } + } result.add(resultMap); }); return result; } /** - * @param regionCodes ��������������������������������� - * @param time ��������������������������� 2021-11-01 00:00:00 ������1���1��� + * @param sysAreas ������������������������ + * @param time ��������������������������� 2021-11-01 00:00:00 ������1���1��� * @return ������������������ */ - private List<Map<String, Object>> yearRank(List<Object> regionCodes, String time) { + private List<Map<String, Object>> yearRank(List<SysArea> sysAreas, String time) { + List<Integer> regionCodes = sysAreas.stream() + .map(SysArea::getAreaCode) + .collect(Collectors.toList()); + //��������������������������� List<String> sensors = Arrays.asList("PM2_5", "PM10", "SO2", "NO2"); List<Map<String, Object>> result = new ArrayList<>(); //���������������,������������������������������city_aqi_monthly������ if (!time.substring(0, 4).equals(DateUtils.dateToDateString(new Date(), DateUtils.yyyy))) { QueryWrapper<CityAqiYearly> cityAqiYearlyQueryWrapper = new QueryWrapper<>(); - for (Object regionCode : regionCodes) { + for (Integer regionCode : regionCodes) { cityAqiYearlyQueryWrapper.clear(); cityAqiYearlyQueryWrapper.select("value") .eq("city_code", regionCode) @@ -573,12 +626,15 @@ } String value = cityAqiYearly.getValue(); Map<String, Object> resultMap = JSONObject.parseObject(value, Map.class); + + //��������� - QueryWrapper<SysArea> sysAreaQueryWrapper = new QueryWrapper<>(); - sysAreaQueryWrapper.select("area_name") - .eq("area_code", regionCode); - String areaName = sysAreaService.getOne(sysAreaQueryWrapper).getAreaName(); - resultMap.put("cityName", areaName); + for (SysArea sysArea : sysAreas) { + if (regionCode.equals(sysArea.getAreaCode())) { + resultMap.put("cityName", sysArea.getAreaName()); + break; + } + } result.add(resultMap); } return result; @@ -590,7 +646,8 @@ .in("city_code", regionCodes); List<Map<String, Object>> thisMonthData = cityAqiDailyService.listMaps(cityAqiDailyQueryWrapper); //���city_code������ - Map<String, List<Map<String, Object>>> thisYearMap = thisMonthData.parallelStream().collect(Collectors.groupingBy(o -> o.get("city_code").toString())); + Map<Integer, List<Map<String, Object>>> thisYearMap = thisMonthData.parallelStream() + .collect(Collectors.groupingBy(o -> Integer.parseInt(o.get("city_code").toString()))); thisYearMap.forEach((cityCode, value) -> { Map<String, Object> resultMap = new HashMap<>(); @@ -659,24 +716,31 @@ yearContrast = decimalFormat.format((compositeIndex - lastCompositeIndex) / lastCompositeIndex); } resultMap.put("yearContrast", yearContrast); - //��������� - QueryWrapper<SysArea> sysAreaQueryWrapper = new QueryWrapper<>(); - sysAreaQueryWrapper.select("area_name").eq("area_code", cityCode); - String areaName = sysAreaService.getOne(sysAreaQueryWrapper).getAreaName(); - resultMap.put("cityName", areaName); + + //��������� + for (SysArea sysArea : sysAreas) { + if (cityCode.equals(sysArea.getAreaCode())) { + resultMap.put("cityName", sysArea.getAreaName()); + break; + } + } result.add(resultMap); }); return result; } /** - * @param regionCodes ��������������������������������� - * @param start ���������������������������������,���������������2021-11-03 00:00:00 - * @param end ���������������������������������,���������������2021-11-25 00:00:00 + * @param sysAreas ������������������������ + * @param start ���������������������������������,���������������2021-11-03 00:00:00 + * @param end ���������������������������������,���������������2021-11-25 00:00:00 * @return ������������������������ */ - private List<Map<String, Object>> customRank(List<Object> regionCodes, String start, String end) { + private List<Map<String, Object>> customRank(List<SysArea> sysAreas, String start, String end) { + List<Integer> regionCodes = sysAreas.stream() + .map(SysArea::getAreaCode) + .collect(Collectors.toList()); + //��������������������������� List<String> sensors = Arrays.asList("PM2_5", "PM10", "SO2", "NO2"); List<Map<String, Object>> result = new ArrayList<>(); @@ -687,7 +751,8 @@ .in("city_code", regionCodes); List<Map<String, Object>> thisMonthData = cityAqiDailyService.listMaps(cityAqiDailyQueryWrapper); //���city_code������ - Map<String, List<Map<String, Object>>> customMap = thisMonthData.parallelStream().collect(Collectors.groupingBy(o -> o.get("city_code").toString())); + Map<Integer, List<Map<String, Object>>> customMap = thisMonthData.parallelStream() + .collect(Collectors.groupingBy(o -> Integer.parseInt(o.get("city_code").toString()))); customMap.forEach((cityCode, value) -> { Map<String, Object> resultMap = new HashMap<>(); @@ -741,11 +806,12 @@ resultMap.put("O3_8H", resultMap.remove("O3")); //��������� - QueryWrapper<SysArea> sysAreaQueryWrapper = new QueryWrapper<>(); - sysAreaQueryWrapper.select("area_name").eq("area_code", cityCode); - String areaName = sysAreaService.getOne(sysAreaQueryWrapper).getAreaName(); - resultMap.put("cityName", areaName); - + for (SysArea sysArea : sysAreas) { + if (cityCode.equals(sysArea.getAreaCode())) { + resultMap.put("cityName", sysArea.getAreaName()); + break; + } + } result.add(resultMap); }); return result; @@ -826,7 +892,7 @@ } @Override - public Map<String, Object> provincialRanking(Integer organizationId) { + public Map<String, Object> provincialRanking(Integer regionCode) { //��������� Map<String, Object> result = new HashMap<>(); @@ -835,10 +901,10 @@ Date yesterday = DateUtils.dataToTimeStampTime(DateUtils.getDateOfDay(now, -1), DateUtils.yyyy_MM_dd_EN); String dateString = DateUtils.dateToDateString(yesterday, DateUtils.yyyy_MM_dd_HH_mm_ss_EN); + String s = String.valueOf(regionCode); //���������,���code - Organization organization = organizationService.getById(organizationId); - Integer provinceCode = organization.getProvinceCode(); - Integer cityCode = organization.getCityCode(); + Integer provinceCode = Integer.parseInt(s.substring(0, 2) + "0000"); + Integer cityCode = Integer.parseInt(s.substring(0, 4) + "00"); //������������������city_code QueryWrapper<SysArea> wrapper = new QueryWrapper<>(); wrapper.select("area_code").eq("parent_code", provinceCode); @@ -920,8 +986,6 @@ result.put("month", monthMap); //������������������������������ - sortByField(ranks, "compositeIndexYear"); - //��������������� sortByField(ranks, "compositeIndexYear"); Map<String, Object> yearMap = rankByField(ranks, cityCode, "compositeIndexYear", cityCodes.size()); if (ObjectUtils.isEmpty(yearMap)) { -- Gitblit v1.8.0