screen-api/src/main/java/com/moral/api/controller/SupervisionController.java
@@ -5,6 +5,7 @@ import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.ObjectUtils; import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; @@ -69,4 +70,14 @@ return ResultMessage.ok(); } @ApiOperation(value = "删除督办单", notes = "删除督办单") @GetMapping("delete") public ResultMessage delete(Integer supervisionId) { if (ObjectUtils.isEmpty(supervisionId)) { return ResultMessage.fail(ResponseCodeEnum.PARAMETERS_IS_MISSING.getCode(), ResponseCodeEnum.PARAMETERS_IS_MISSING.getMsg()); } supervisionService.deleteSupervision(supervisionId); return ResultMessage.ok(); } } screen-api/src/main/java/com/moral/api/service/SupervisionService.java
@@ -26,4 +26,6 @@ //修改督办单 Map<String, Object> updateSupervision(MultipartFile[] files, Supervision supervision); void deleteSupervision(Integer id); } screen-api/src/main/java/com/moral/api/service/impl/SupervisionServiceImpl.java
@@ -124,7 +124,7 @@ public Map<String, Object> updateSupervision(MultipartFile[] files, Supervision supervision) { String path = this.getClass().getClassLoader() .getResource("").getFile() + "static/img/"; .getResource("").getFile() + "static/img"; Map<String, Object> result = new HashMap<>(); @@ -160,4 +160,9 @@ supervisionMapper.updateById(supervision); return result; } @Override public void deleteSupervision(Integer id) { supervisionMapper.deleteById(id); } } screen-common/src/main/java/com/moral/util/AmendUtils.java
@@ -327,4 +327,40 @@ result.put(Constants.SENSOR_CODE_O3, percentile(data, 90)); return result; } //各因子年均值计算 /** * 年均值算法 * PM2.5,PM10,CO,日均值95百分位 * SO2,NO2,日均值98百分位 * O3,日最大值90百分位 * * @param list 数据 * @param sensorCode 因子code */ public static Double getAvgOfYear(List<Map<String, Object>> list, String sensorCode) { List<Double> data = new ArrayList<>(); for (Map<String, Object> dataMap : list) { Map<String, Object> dataValue = JSONObject.parseObject((String) dataMap.get("value"), Map.class); Object o = dataValue.get(sensorCode); if (ObjectUtils.isEmpty(o)) { continue; } Double sensorValue = Double.parseDouble(o.toString()); data.add(sensorValue); } if (data.size() == 0) { return null; } Double v = null; if ("PM2_5".equals(sensorCode) || "PM10".equals(sensorCode) || "CO".equals(sensorCode)) { v = percentile(data, 95); } else if ("SO2".equals(sensorCode) || "NO2".equals(sensorCode)) { v = percentile(data, 98); } else if ("O3".equals(sensorCode)) { v = percentile(data, 90); } return v; } } screen-job/src/main/java/com/moral/api/service/impl/CityAqiMonthlyServiceImpl.java
@@ -69,7 +69,18 @@ return; } //按city_code分组 Map<String, List<Map<String, Object>>> data = monthlyData.parallelStream().collect(Collectors.groupingBy(o -> o.get("city_code").toString())); Map<String, List<Map<String, Object>>> data = monthlyData.stream() .collect(Collectors.groupingBy(o -> o.get("city_code").toString())); //获取上月数据,本月综指同上月对比 QueryWrapper<CityAqiMonthly> queryWrapper = new QueryWrapper<>(); queryWrapper.select("city_code", "value") .eq("time", DateUtils.dateToDateString(lastLastMonth)); //获取上月数据 List<CityAqiMonthly> lastCityAqiMonthly = cityAqiMonthlyMapper.selectList(queryWrapper); Map<Integer, List<CityAqiMonthly>> lastMonthData = lastCityAqiMonthly.stream() .collect(Collectors.groupingBy(CityAqiMonthly::getCityCode)); CityAqiMonthly cityAqiMonthly = new CityAqiMonthly(); data.forEach((cityCode, value) -> { @@ -102,7 +113,7 @@ } sensors.forEach(sensor -> { OptionalDouble optionalDouble = value.parallelStream().flatMapToDouble(v -> { OptionalDouble optionalDouble = value.stream().flatMapToDouble(v -> { Map<String, Object> dataValue = JSONObject.parseObject((String) v.get("value"), Map.class); double aDouble = Double.parseDouble(dataValue.get(sensor).toString()); return DoubleStream.of(aDouble); @@ -118,14 +129,10 @@ jsonMap.put("compositeIndex", compositeIndex); //本月综指同上月对比 QueryWrapper<CityAqiMonthly> queryWrapper = new QueryWrapper<>(); queryWrapper.select("value") .eq("city_code", cityCode) .eq("time", DateUtils.dateToDateString(lastLastMonth)); //获取上上月数据 CityAqiMonthly lastCityAqiMonthly = cityAqiMonthlyMapper.selectOne(queryWrapper); if (lastCityAqiMonthly != null) { Map<String, Object> map = JSONObject.parseObject(lastCityAqiMonthly.getValue(), Map.class); List<CityAqiMonthly> cityAqiMonthlies = lastMonthData.get(Integer.parseInt(cityCode)); if (!ObjectUtils.isEmpty(cityAqiMonthlies)) { CityAqiMonthly monthly = cityAqiMonthlies.get(0); Map<String, Object> map = JSONObject.parseObject(monthly.getValue(), Map.class); double lastCompositeIndex = Double.parseDouble(map.get("compositeIndex").toString()); DecimalFormat decimalFormat = new DecimalFormat("0.00%"); String format = decimalFormat.format((compositeIndex - lastCompositeIndex) / lastCompositeIndex); screen-job/src/main/java/com/moral/api/service/impl/CityAqiYearlyServiceImpl.java
@@ -8,7 +8,6 @@ import com.moral.api.service.CityAqiDailyService; import com.moral.api.service.CityAqiYearlyService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.moral.constant.Constants; import com.moral.util.AmendUtils; import com.moral.util.ComprehensiveIndexUtils; import com.moral.util.DateUtils; @@ -18,15 +17,12 @@ import org.springframework.util.ObjectUtils; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.OptionalDouble; import java.util.stream.Collectors; import java.util.stream.DoubleStream; /** * <p> @@ -48,7 +44,12 @@ @Override public void insertCityAqiYearly() { //需要均值计算的因子 /* * 年均值算法 * PM2.5,PM10,CO,日均值95百分位 * SO2,NO2,日均值98百分位 * O3,日最大值90百分位 * */ List<String> sensors = Arrays.asList("PM2_5", "PM10", "SO2", "NO2"); //开始时间,去年1号 @@ -59,7 +60,7 @@ Date end = DateUtils.getDate(DateUtils.getDateAddYear(DateUtils.dateToDateString(start, DateUtils.yyyy), 1), DateUtils.yyyy); //获取所有城市aqi小时数据 //获取所有城市aqi日数据 QueryWrapper<CityAqiDaily> wrapper = new QueryWrapper<>(); wrapper.select("city_code", "time", "value") .ge("time", DateUtils.dateToDateString(start)) @@ -70,7 +71,18 @@ return; } //按city_code分组 Map<String, List<Map<String, Object>>> data = monthlyData.parallelStream().collect(Collectors.groupingBy(o -> o.get("city_code").toString())); Map<String, List<Map<String, Object>>> data = monthlyData.stream() .collect(Collectors.groupingBy(o -> o.get("city_code").toString())); //上年数据 QueryWrapper<CityAqiYearly> queryWrapper = new QueryWrapper<>(); queryWrapper.select("city_code", "value") .eq("time", DateUtils.dateToDateString(lastLastYear)); //获取上年数据 List<CityAqiYearly> lastCityAqiYearly = cityAqiYearlyMapper.selectList(queryWrapper); Map<Integer, List<CityAqiYearly>> lastYearData = lastCityAqiYearly.stream() .collect(Collectors.groupingBy(CityAqiYearly::getCityCode)); CityAqiYearly cityAqiYearly = new CityAqiYearly(); data.forEach((cityCode, value) -> { @@ -78,57 +90,39 @@ cityAqiYearly.setCityCode(Integer.parseInt(cityCode)); cityAqiYearly.setTime(start); //PM2.5 Double pm25Avg = AmendUtils.getAvgOfYear(value, "PM2_5"); jsonMap.put("PM2_5", pm25Avg); Map<String, Object> params = new HashMap<>(); List<Map<String, Object>> temp = new ArrayList<>(); //PM10 Double pm10Avg = AmendUtils.getAvgOfYear(value, "PM10"); jsonMap.put("PM10", pm10Avg); for (Map<String, Object> map : value) { Map<String, Object> sensorsValue = JSONObject.parseObject(map.get("value").toString(), Map.class); Map<String, Object> tempMap = new HashMap<>(); tempMap.put(Constants.SENSOR_CODE_CO, sensorsValue.get("PM2_5")); tempMap.put(Constants.SENSOR_CODE_O3, sensorsValue.get("O3")); Map<String, Object> hashMap = new HashMap<>(); hashMap.put("value", JSONObject.toJSONString(tempMap)); temp.add(hashMap); } params.put("data", temp); //1. CO 95百分位计算并修约 Map<String, Object> coAvgOfWeekOrMonth = AmendUtils.getCOAvgOfWeekOrMonth(params); if (!ObjectUtils.isEmpty(coAvgOfWeekOrMonth)) { jsonMap.put("CO", coAvgOfWeekOrMonth.get(Constants.SENSOR_CODE_CO)); } //SO2 Double so2Avg = AmendUtils.getAvgOfYear(value, "SO2"); jsonMap.put("SO2", so2Avg); //2. O3 90百分位计算并修约 Map<String, Object> o3AvgOfWeekOrMonth = AmendUtils.getO3AvgOfWeekOrMonth(params); if (!ObjectUtils.isEmpty(o3AvgOfWeekOrMonth)) { jsonMap.put("O3", o3AvgOfWeekOrMonth.get(Constants.SENSOR_CODE_O3)); } //NO2 Double no2Avg = AmendUtils.getAvgOfYear(value, "NO2"); jsonMap.put("NO2", no2Avg); sensors.forEach(sensor -> { OptionalDouble optionalDouble = value.parallelStream().flatMapToDouble(v -> { Map<String, Object> dataValue = JSONObject.parseObject((String) v.get("value"), Map.class); double aDouble = Double.parseDouble(dataValue.get(sensor).toString()); return DoubleStream.of(aDouble); }).average(); if (optionalDouble.isPresent()) { //银行家算法修约 jsonMap.put(sensor, AmendUtils.sciCal(optionalDouble.getAsDouble(), 0)); } }); //CO Double coAvg = AmendUtils.getAvgOfYear(value, "CO"); jsonMap.put("CO", coAvg); //O3 Double o3Avg = AmendUtils.getAvgOfYear(value, "O3"); jsonMap.put("O3", o3Avg); //本月月综指计算 Double compositeIndex = ComprehensiveIndexUtils.dailyData(jsonMap); jsonMap.put("compositeIndex", compositeIndex); //本月综指同上月对比 QueryWrapper<CityAqiYearly> queryWrapper = new QueryWrapper<>(); queryWrapper.select("value") .eq("city_code", cityCode) .eq("time", DateUtils.dateToDateString(lastLastYear)); //获取上上月数据 CityAqiYearly lastCityAqiYearly = cityAqiYearlyMapper.selectOne(queryWrapper); if (lastCityAqiYearly != null) { Map<String, Object> map = JSONObject.parseObject(lastCityAqiYearly.getValue(), Map.class); //上年数据同本年对比 List<CityAqiYearly> cityAqiYearlies = lastYearData.get(Integer.parseInt(cityCode)); if (!ObjectUtils.isEmpty(cityAqiYearlies)) { CityAqiYearly yearly = cityAqiYearlies.get(0); Map<String, Object> map = JSONObject.parseObject(yearly.getValue(), Map.class); double lastCompositeIndex = Double.parseDouble(map.get("compositeIndex").toString()); DecimalFormat decimalFormat = new DecimalFormat("0.00%"); String format = decimalFormat.format((compositeIndex - lastCompositeIndex) / lastCompositeIndex); @@ -137,7 +131,5 @@ cityAqiYearly.setValue(JSONObject.toJSONString(jsonMap)); cityAqiYearlyMapper.insert(cityAqiYearly); }); } }