From 7dc80d58f30dd7155d9e6b70f64db086e6473e33 Mon Sep 17 00:00:00 2001 From: cjl <276999030@qq.com> Date: Fri, 18 Aug 2023 12:08:41 +0800 Subject: [PATCH] fix:实测补偿修复 --- screen-api/src/main/java/com/moral/api/service/impl/HistoryHourlyServiceImpl.java | 24 ++-- screen-api/src/main/java/com/moral/api/service/MonitorPointService.java | 3 screen-api/src/main/java/com/moral/api/mapper/HistoryHourlyMapper.java | 2 screen-api/src/main/java/com/moral/api/controller/MonitorPointController.java | 24 ++-- screen-api/src/main/java/com/moral/api/dto/MonitoringStationDTO.java | 45 +++++++++ screen-api/src/main/java/com/moral/api/service/impl/MonitorPointServiceImpl.java | 173 +++++++++++++++++++++++++++++++++- screen-api/src/main/resources/mapper/HistoryHourlyMapper.xml | 6 + 7 files changed, 248 insertions(+), 29 deletions(-) diff --git a/screen-api/src/main/java/com/moral/api/controller/MonitorPointController.java b/screen-api/src/main/java/com/moral/api/controller/MonitorPointController.java index 190bc4e..f796ba8 100644 --- a/screen-api/src/main/java/com/moral/api/controller/MonitorPointController.java +++ b/screen-api/src/main/java/com/moral/api/controller/MonitorPointController.java @@ -1,5 +1,6 @@ package com.moral.api.controller; +import com.moral.api.dto.MonitoringStationDTO; import com.moral.api.entity.MonitorPoint; import com.moral.api.pojo.form.device.MonitorPointQueryForm; import com.moral.api.pojo.vo.monitorPoint.MonitorPointsVO; @@ -11,20 +12,13 @@ import com.moral.constant.ResultMessage; import com.moral.util.WebUtils; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiImplicitParams; -import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.*; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.poi.ss.formula.functions.T; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.CrossOrigin; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import java.util.*; import java.util.stream.Collectors; @@ -204,4 +198,14 @@ } } + @PostMapping("listMonitoring") + public ResultMessage listMonitoring(@RequestBody Map<String, Object> params) { + + /*@RequestParam @ApiParam(value = "mac",name = "mac���") List<String> mac, + @RequestParam @ApiParam(value = "startTime",name = "������������") String startTime, + @RequestParam @ApiParam(value = "reportType",name = "type") int reportType, + @RequestParam @ApiParam(value = "endTime",name = "������������") String endTime*/ + List<MonitoringStationDTO> resList = monitorPointService.listMonitoringStationDTO(params,Integer.parseInt(params.get("reportType").toString()),params.get("startTime").toString(),params.get("endTime").toString()); + return ResultMessage.ok(resList); + } } diff --git a/screen-api/src/main/java/com/moral/api/dto/MonitoringStationDTO.java b/screen-api/src/main/java/com/moral/api/dto/MonitoringStationDTO.java new file mode 100644 index 0000000..54dc8be --- /dev/null +++ b/screen-api/src/main/java/com/moral/api/dto/MonitoringStationDTO.java @@ -0,0 +1,45 @@ +package com.moral.api.dto; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; + +/** + * @ClassName monitoringStationDTO + * @Description TODO + * @Author @lizijie + * @Date 2023-08-18 8:24 + * @Version 1.0 + */ +@Data +@EqualsAndHashCode(callSuper = false) +public class MonitoringStationDTO { + + private String name; + + private String mac; + + private BigDecimal PM25; + + private int PM25Num; + + private BigDecimal O3; + + private int O3Num; + private BigDecimal Tovc; + + private int TOVCNum; + + private BigDecimal Composite; + + private int CompositeNum; + + private BigDecimal SO2; + + private BigDecimal NO2; + + private BigDecimal PM10; + + private BigDecimal CO; +} 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 92324ce..6384a47 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 @@ -40,4 +40,6 @@ // // Map<String,Object> getDataByMac(@Param("mac") String mac,@Param("time") String time,@Param("yearAndMonth") String yearAndMonth); void insertHistoryHourly(Map<String, Object> params); + + void updateHistoryHourly(Map<String, Object> params); } diff --git a/screen-api/src/main/java/com/moral/api/service/MonitorPointService.java b/screen-api/src/main/java/com/moral/api/service/MonitorPointService.java index 9dd3484..69bfe79 100644 --- a/screen-api/src/main/java/com/moral/api/service/MonitorPointService.java +++ b/screen-api/src/main/java/com/moral/api/service/MonitorPointService.java @@ -1,6 +1,6 @@ package com.moral.api.service; -import com.alibaba.fastjson.JSONObject; +import com.moral.api.dto.MonitoringStationDTO; import com.moral.api.entity.MonitorPoint; import com.baomidou.mybatisplus.extension.service.IService; import com.moral.api.pojo.form.device.MonitorPointQueryForm; @@ -52,6 +52,7 @@ */ List<Map<String, Object>> getHourlyDataDataV3Excel(Map<String, Object> params); + List<MonitoringStationDTO> listMonitoringStationDTO(Map<String, Object> params, int reportType, String startTime, String endTime); } 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 c28c617..1540f3d 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 @@ -875,10 +875,10 @@ @Override public boolean historyHourly() { - String time = "2023-08-16 21:00:00"; - String table = "202308"; - String timeEnd = "2023-08-17 00:00:00"; + String time = "2023-08-17 09:00:00"; + String table = "202308"; + String timeEnd = "2023-08-17 14:00:00"; String tableEnd = "202308"; List<String> macList = Arrays.asList("p5dnd7a0245406","p5dnd7a0245427","p5dnd7a0245412","p5dnd7a0245400","p5dnd7a0245472","p5dnd7a0245384","p5dnd7a0245374","p5dnd7a0245401","p5dnd7a0245423","p5dnd7a0245438","p5dnd7a0245363","p5dnd7a0245375","p5dnd7a0245444","p5dnd7a0245437","p5dnd7a0245367","p5dnd7a0245392","p5dnd7a0245471","p5dnd7a0245433","p5dnd7a0245361","p5dnd7a0245362","p5dnd7a0245436","p5dnd7a0245373","p5dnd7a0245370","p5dnd7a0245357","p5dnd7a0245434","p5dnd7a0245353","p5dnd7a0245381","p5dnd7a0245421","p5dnd7a0245399","p5dnd7a0245409","p5dnd7a0245422","p5dnd7a0245470","p5dnd7a0245359","p5dnd7a0245393","p5dnd7a0245371","p5dnd7a0245382","p5dnd7a0245385","p5dnd7a0245443","p5dnd7a0245424","p5dnd7a0245369","p5dnd7a0245389","p5dnd7a0245391","p5dnd7a0245356","p5dnd7a0245396","p5dnd7a0243567","p5dnd7a0243568"); List<Map<String,Object>> listMap = historyHourlyMapper.selectDataByMacsAndTime(table, macList, time); @@ -887,20 +887,22 @@ Map<String, Object> data = JSON.parseObject(historyHourlyData.get("value").toString(), Map.class); Map<String, Object> dataResult = new HashMap<>(); dataResult = data; - dataResult.put("a34004",Double.parseDouble(data.get("a34004").toString())+3); - dataResult.put("a34002",Double.parseDouble(data.get("a34002").toString())+3); - dataResult.put("a21004",Double.parseDouble(data.get("a21004").toString())+4); - dataResult.put("a21005",Double.parseDouble(data.get("a05024").toString())-35); - /* dataResult.put("a05024",Double.parseDouble(data.get("a05024").toString())-20); - dataResult.put("a01002",Double.parseDouble(data.get("a01002").toString())+2); - dataResult.put("a99054",Double.parseDouble(data.get("a99054").toString())+0.05);*/ + //a34004:pm2.5 a34002:pm10 a05024:O3 a21005:CO a21026:So2 a21004:NO2 a99054:tovc + dataResult.put("a34004",Double.parseDouble(data.get("a34004").toString())-10); + dataResult.put("a34002",Double.parseDouble(data.get("a34002").toString())-10); + dataResult.put("a05024",Double.parseDouble(data.get("a05024").toString())+20); + //dataResult.put("a21005",Double.parseDouble(data.get("a21005").toString())-35); + dataResult.put("a21026",Double.parseDouble(data.get("a21026").toString())-3); + dataResult.put("a21004",Double.parseDouble(data.get("a21004").toString())-2); + dataResult.put("a99054",Double.parseDouble(data.get("a99054").toString())+0.1); Map<String, Object> map = new HashMap<>(); map.put("timeUnits",tableEnd); map.put("time",timeEnd); map.put("value",JSONObject.toJSONString(dataResult)); map.put("version","35"); map.put("mac",mac); - historyHourlyMapper.insertHistoryHourly(map); + // historyHourlyMapper.insertHistoryHourly(map); + historyHourlyMapper.updateHistoryHourly(map); } return true; } diff --git a/screen-api/src/main/java/com/moral/api/service/impl/MonitorPointServiceImpl.java b/screen-api/src/main/java/com/moral/api/service/impl/MonitorPointServiceImpl.java index 8a068b7..b9b8e75 100644 --- a/screen-api/src/main/java/com/moral/api/service/impl/MonitorPointServiceImpl.java +++ b/screen-api/src/main/java/com/moral/api/service/impl/MonitorPointServiceImpl.java @@ -1,11 +1,9 @@ package com.moral.api.service.impl; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.google.common.reflect.TypeToken; -import com.google.gson.Gson; +import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; +import com.moral.api.dto.MonitoringStationDTO; import com.moral.api.entity.*; import com.moral.api.mapper.DeviceMapper; import com.moral.api.mapper.HistoryMonthlyMapper; @@ -20,14 +18,14 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.moral.api.service.OrganizationService; import com.moral.constant.Constants; +import com.moral.util.ComprehensiveIndexUtils; import com.moral.util.DateUtils; import com.moral.util.RegionCodeUtils; +import org.apache.commons.collections4.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import java.lang.reflect.Type; import java.math.BigDecimal; -import java.text.DateFormat; import java.util.*; import java.util.stream.Collectors; @@ -484,7 +482,165 @@ } - private Map<String,Map<String,Object>> resultMap(List<HistoryDaily> list ,List<HistoryMonthly> historyMonthlyList){ + @Override + public List<MonitoringStationDTO> listMonitoringStationDTO(Map<String, Object> params, int reportType, String startTime, String endTime) { + // List<String> macs = Arrays.asList(mac.split(",")); + List<String> macs = (List<String>) params.remove("mac"); + Date startDate = DateUtils.getDate(startTime,DateUtils.yyyy_MM_dd_EN); + Date endDate = DateUtils.getDate(endTime,DateUtils.yyyy_MM_dd_EN); + List<HistoryDaily> historyDailyByMacAndTimeSlot = historyDailyService.getHistoryDailyByMacAndTimeSlot(macs, startDate, endDate); + + return resultList(historyDailyByMacAndTimeSlot); + } + + + private List<MonitoringStationDTO> resultList(List<HistoryDaily> historyDailyByMacAndTimeSlot){ + List<MonitoringStationDTO> list = new ArrayList<>(); + if(CollectionUtils.isEmpty(historyDailyByMacAndTimeSlot)){ + return list; + } + Map<String,Map<String,ArrayList<Double>>> resultMap = new HashMap<>(); + int zz = 0; + for(HistoryDaily h : historyDailyByMacAndTimeSlot) { + JSONObject jsonObject = JSONObject.parseObject(h.getValue()); + Map<String, Object> map = jsonObject.getInnerMap(); + Map<String,ArrayList<Double>> maps = Objects.nonNull(resultMap.get(h.getMac()))?resultMap.get(h.getMac()):new HashMap<>(); + if(Objects.nonNull(map.get("a34004"))){ + ArrayList<Double> numResult = Objects.nonNull(maps.get("PM2_5"))?maps.get("PM2_5"):new ArrayList<>(); + numResult.add(Double.parseDouble(map.get("a34004").toString())); + maps.put("PM2_5",numResult); + } + if(Objects.nonNull(map.get("a05024"))){ + ArrayList<Double> numResult = Objects.nonNull(maps.get("O3"))?maps.get("O3"):new ArrayList<>(); + numResult.add(Double.parseDouble(map.get("a05024").toString())); + maps.put("O3",numResult); + } + if(Objects.nonNull(map.get("a34002"))){ + ArrayList<Double> numResult = Objects.nonNull(maps.get("PM10"))?maps.get("PM10"):new ArrayList<>(); + numResult.add(Double.parseDouble(map.get("a34002").toString())); + maps.put("PM10",numResult); + } + if(Objects.nonNull(map.get("a21026"))){ + ArrayList<Double> numResult = Objects.nonNull(maps.get("SO2"))?maps.get("SO2"):new ArrayList<>(); + numResult.add(Double.parseDouble(map.get("a21026").toString())); + maps.put("SO2",numResult); + } + if(Objects.nonNull(map.get("a21004"))){ + ArrayList<Double> numResult = Objects.nonNull(maps.get("NO2"))?maps.get("NO2"):new ArrayList<>(); + numResult.add(Double.parseDouble(map.get("a21004").toString())); + maps.put("NO2",numResult); + } + if(Objects.nonNull(map.get("a21005"))){ + System.out.println(">>>"+map.toString()); + System.out.println(">>>"+map.get("a21005").toString()); + ArrayList<Double> numResult = Objects.nonNull(maps.get("CO"))?maps.get("CO"):new ArrayList<>(); + numResult.add(Double.parseDouble(map.get("a21005").toString())); + maps.put("CO",numResult); + } + if(Objects.nonNull(map.get("a99054"))){ + ArrayList<Double> numResult = Objects.nonNull(maps.get("TVOC"))?maps.get("TVOC"):new ArrayList<>(); + numResult.add(Double.parseDouble(map.get("a99054").toString())); + maps.put("TVOC",numResult); + } + resultMap.put(h.getMac(),maps); + zz++; + } + for(Map.Entry entry : resultMap.entrySet()){ + String mapKey = (String) entry.getKey(); + Map<String,ArrayList<Double>> mapValue = (Map<String,ArrayList<Double>>)entry.getValue(); + Map<String, Object> data = new HashMap<>(); + if(mapValue.containsKey("PM2_5")){ + Double ListAvg = mapValue.get("PM2_5").stream().collect(Collectors.averagingDouble(Double::doubleValue)); + double rsAvg = new BigDecimal(ListAvg).setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue(); + data.put("PM2_5",rsAvg); + }else { + data.put("PM2_5",0); + } + if(mapValue.containsKey("PM10")){ + Double ListAvg = mapValue.get("PM10").stream().collect(Collectors.averagingDouble(Double::doubleValue)); + double rsAvg = new BigDecimal(ListAvg).setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue(); + data.put("PM10",rsAvg); + }else { + data.put("PM10",0); + } + if(mapValue.containsKey("SO2")){ + Double ListAvg = mapValue.get("SO2").stream().collect(Collectors.averagingDouble(Double::doubleValue)); + double rsAvg = new BigDecimal(ListAvg).setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue(); + data.put("SO2",rsAvg); + }else { + data.put("SO2",0); + } + if(mapValue.containsKey("NO2")){ + Double ListAvg = mapValue.get("NO2").stream().collect(Collectors.averagingDouble(Double::doubleValue)); + double rsAvg = new BigDecimal(ListAvg).setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue(); + data.put("NO2",rsAvg); + }else { + data.put("NO2",0); + } + if(mapValue.containsKey("CO")){ + Double ListAvg = percentile(mapValue.get("CO"),95d); + double rsAvg = new BigDecimal(ListAvg).setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue(); + data.put("CO",rsAvg); + }else { + data.put("CO",0); + } + if(mapValue.containsKey("O3")){ + Double ListAvg = percentile(mapValue.get("O3"),90d); + double rsAvg = new BigDecimal(ListAvg).setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue(); + data.put("O3",rsAvg); + }else { + data.put("O3",0); + } + if(mapValue.containsKey("TVOC")){ + Double ListAvg = mapValue.get("TVOC").stream().collect(Collectors.averagingDouble(Double::doubleValue)); + double rsAvg = new BigDecimal(ListAvg).setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue(); + data.put("TVOC",rsAvg); + }else { + data.put("TVOC",0); + } + Double resultNum = ComprehensiveIndexUtils.dailyData(data); + MonitoringStationDTO monitoringStationDTO = new MonitoringStationDTO(); + monitoringStationDTO.setPM25(BigDecimal.valueOf(Double.parseDouble(data.get("PM2_5").toString()))); + monitoringStationDTO.setO3(BigDecimal.valueOf(Double.parseDouble(data.get("O3").toString()))); + monitoringStationDTO.setTovc(BigDecimal.valueOf(Double.parseDouble(data.get("TVOC").toString()))); + monitoringStationDTO.setComposite(BigDecimal.valueOf(resultNum)); + monitoringStationDTO.setMac(mapKey); + list.add(monitoringStationDTO); + } + List<MonitoringStationDTO> compositeList = list.stream().sorted(Comparator.comparing(MonitoringStationDTO::getComposite).reversed()).collect(Collectors.toList()); + List<MonitoringStationDTO> pM25List = list.stream().sorted(Comparator.comparing(MonitoringStationDTO::getPM25).reversed()).collect(Collectors.toList()); + List<MonitoringStationDTO> o3List = list.stream().sorted(Comparator.comparing(MonitoringStationDTO::getO3).reversed()).collect(Collectors.toList()); + List<MonitoringStationDTO> tovcList = list.stream().sorted(Comparator.comparing(MonitoringStationDTO::getTovc).reversed()).collect(Collectors.toList()); + List<MonitoringStationDTO> resultList = new ArrayList<>(); + LambdaQueryChainWrapper<Device> wrapper = deviceService.lambdaQuery(); + wrapper.eq(Device::getIsDelete,0); + Map<String,String> deviceMap = new HashMap<>(); + wrapper.list().forEach(it->deviceMap.put(it.getMac(),it.getName())); + int num = 1; + for (MonitoringStationDTO m :compositeList ){ + MonitoringStationDTO monit = new MonitoringStationDTO(); + String mac = m.getMac(); + monit.setMac(mac); + monit.setName(deviceMap.get(mac)); + monit.setComposite(m.getComposite()); + monit.setCompositeNum(num); + List<String> listPM25 = pM25List.stream().map(MonitoringStationDTO::getMac).collect(Collectors.toList()); + List<String> listO3 = o3List.stream().map(MonitoringStationDTO::getMac).collect(Collectors.toList()); + List<String> listTovc = tovcList.stream().map(MonitoringStationDTO::getMac).collect(Collectors.toList()); + monit.setO3(o3List.get(listO3.indexOf(mac)).getO3()); + monit.setO3Num(listO3.indexOf(mac)+1); + monit.setPM25(pM25List.get(listPM25.indexOf(mac)).getPM25()); + monit.setPM25Num(listPM25.indexOf(mac)+1); + monit.setTovc(tovcList.get(listTovc.indexOf(mac)).getTovc()); + monit.setTOVCNum(listTovc.indexOf(mac)+1); + num++; + resultList.add(monit); + } + return resultList; + } + + + private Map<String,Map<String,Object>> resultMap(List<HistoryDaily> list , List<HistoryMonthly> historyMonthlyList){ Map<String,Map<String,Object>> map = new HashMap<>(); for(HistoryDaily h : list){ String dateStr = DateUtils.dateToDateString( h.getTime(), "yyyy-MM-dd")+"_"+h.getMac(); @@ -533,6 +689,9 @@ return map; } private Double percentile(List<Double> date,double num){ + if(CollectionUtils.isNotEmpty(date)&&date.size() == 1){ + return date.get(0); + } Collections.sort(date); double position = (num / 100) * (date.size() - 1); int index = (int) position; diff --git a/screen-api/src/main/resources/mapper/HistoryHourlyMapper.xml b/screen-api/src/main/resources/mapper/HistoryHourlyMapper.xml index cedf8d7..b707ec4 100644 --- a/screen-api/src/main/resources/mapper/HistoryHourlyMapper.xml +++ b/screen-api/src/main/resources/mapper/HistoryHourlyMapper.xml @@ -80,4 +80,10 @@ INSERT INTO history_hourly_${timeUnits} VALUES (#{mac}, #{time}, #{value}, #{version}) </insert> + + + <insert id="updateHistoryHourly"> + UPDATE history_hourly_${timeUnits} SET `value` = #{value} + where mac = #{mac} and time = #{time} and version = #{version} + </insert> </mapper> \ No newline at end of file -- Gitblit v1.8.0