package com.moral.api.service.impl; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.moral.api.entity.HistorySecondCruiser; import com.moral.api.entity.Organization; import com.moral.api.entity.SpecialDevice; import com.moral.api.entity.SpecialDeviceHistory; import com.moral.api.entity.TbDaily; import com.moral.api.mapper.DailyMapper; import com.moral.api.mapper.HistorySecondCruiserMapper; import com.moral.api.mapper.SpecialDeviceMapper; import com.moral.api.pojo.bo.ExcelBO; import com.moral.api.pojo.dto.historySecondCruiser.HistorySecondCruiserListDTO; import com.moral.api.pojo.dto.historySecondCruiser.HistorySecondCruiserResultCountDTO; import com.moral.api.pojo.dto.historySecondCruiser.HistorySecondCruiserResultDTO; import com.moral.api.pojo.vo.excel.DailyVo; import com.moral.api.service.OrganizationService; import com.moral.api.service.SpecialDeviceHistoryService; import com.moral.api.service.SpecialDeviceService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.moral.constant.Constants; import com.moral.util.AmendUtils; import com.moral.util.DateUtils; import com.moral.util.FileUtils; import com.moral.util.GeodesyUtils; import com.moral.util.TokenUtils; import org.apache.commons.collections4.CollectionUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.system.ApplicationHome; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.math.BigDecimal; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; /** *

* 服务实现类 *

* * @author moral * @since 2021-08-18 */ @Service public class SpecialDeviceServiceImpl extends ServiceImpl implements SpecialDeviceService { @Autowired private HistorySecondCruiserMapper HistorySecondCruiserMapper; @Autowired private SpecialDeviceHistoryService specialDeviceHistoryService; @Autowired OrganizationService organizationService; @Autowired SpecialDeviceMapper specialDeviceMapper; @Autowired private HistorySecondCruiserMapper historySecondCruiserMapper; @Autowired private SpecialDeviceService specialDeviceService; @Autowired private DailyMapper dailyMapper; @Autowired RedisTemplate redisTemplate; private final static Double dis = 50d; private final static Double DIS_NEW = 100d; @Override public List> selectCruisers() { //获取当前用户信息 Map userInfo = (Map) TokenUtils.getUserInfo(); Map orgInfo = (Map) userInfo.get("organization"); Integer orgId = (Integer) orgInfo.get("id"); //获取所有子组织 List organizations = organizationService.getChildrenOrganizationsById(orgId); List orgIds = organizations.stream().map(Organization::getId).collect(Collectors.toList()); orgIds.add(orgId); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.select("mac", "name") //.eq("special_type", Constants.SPECIAL_DEVICE_CRUISER) .eq("is_delete", Constants.NOT_DELETE) .in("organization_id", orgIds); return specialDeviceHistoryService.listMaps(queryWrapper); } @Override public List> carTrajectory(Map params,boolean type) { params.put("dateFormat", "%Y-%m-%d %H:%i:%s"); Map userInfo = (Map) TokenUtils.getUserInfo(); Map orgInfo = (Map) userInfo.get("organization"); Integer orgId = (Integer) orgInfo.get("id"); params.put("orgId", orgId); //从秒数据表获取走航车数据 List> data = HistorySecondCruiserMapper.getCruiserData(params); if (ObjectUtils.isEmpty(data)) { return data; } data.removeIf(o -> { Map value = JSONObject.parseObject(o.remove("value").toString(), Map.class); Object flylon = value.get(Constants.SENSOR_CODE_LON); Object flylat = value.get(Constants.SENSOR_CODE_LAT); if (ObjectUtils.isEmpty(flylon) || ObjectUtils.isEmpty(flylat)) { return true; } double lon = Double.parseDouble(flylon.toString()); double lat = Double.parseDouble(flylat.toString()); if (lon < 70 || lon > 150 || lat < 20 || lat > 60) { return true; } if(type){ o.putAll(value); }else { } return false; }); /*for (Map map:data) { Object third = map.get("dustld"); map.put("dustld",map.get("a21026")); map.put("a21026",String.valueOf(Double.parseDouble(third.toString())*10000)); }*/ /*for (Map map : data) { String a21026 = String.valueOf(map.get("a21026")); String a21004 = String.valueOf(map.get("a21004")); map.put("a21026",String.valueOf(Double.parseDouble(a21026) / 100)); map.put("a21004",String.valueOf(Double.parseDouble(a21004) / 10)); }*/ return filterData(data); } @Override public List carTrajectoryNewAvg(Map params) { double range = Double.valueOf(params.get("range").toString()); params.put("dateFormat", "%Y-%m-%d %H:%i:%s"); Map userInfo = (Map) TokenUtils.getUserInfo(); Map orgInfo = (Map) userInfo.get("organization"); Integer orgId = (Integer) orgInfo.get("id"); params.put("orgId", orgId); params.put("type","$."+params.get("type")); //从秒数据表获取走航车数据 List data = HistorySecondCruiserMapper.getCruiserDataNewAvg(params); data.removeIf(o->{ if (ObjectUtils.isEmpty(o.getFlyLon()) || ObjectUtils.isEmpty(o.getFlyLat())) { return true; } double lon = o.getFlyLon(); double lat = o.getFlyLat(); if (lon < 70 || lon > 150 || lat < 20 || lat > 60) { return true; } return false; }); if(CollectionUtils.isEmpty(data)){ return null; } return filterDataNew(data,range); } @Override public SpecialDevice getSpecialDeviceMapByMac(String mac) { QueryWrapper queryWrapper = new QueryWrapper(); queryWrapper.eq("mac", mac); queryWrapper.eq("is_delete", Constants.NOT_DELETE); SpecialDevice specialDevice = specialDeviceMapper.selectOne(queryWrapper); return specialDevice; } @Override public List getDatesByMac(String mac) { Map userInfo = (Map) TokenUtils.getUserInfo(); Map orgInfo = (Map) userInfo.get("organization"); Integer orgId = (Integer) orgInfo.get("id"); Map params = new HashMap<>(); params.put("orgId", orgId); params.put("mac", mac); Date start = DateUtils.addMonths(new Date(), -6); params.put("start", DateUtils.dateToDateString(start)); return historySecondCruiserMapper.getDates(params); } /** * 走航车日报 * @param params * @return */ @Override public ExcelBO getDaily(Map params, List files) throws ParseException { ExcelBO excelBO = new ExcelBO(); ArrayList list = new ArrayList<>(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String time1 = params.get("time1").toString(); String time2 = params.get("time2").toString(); String rsTime = getTime(time1, time2); list.add(rsTime); List> maps = specialDeviceService.carTrajectory(params,false); if (ObjectUtils.isEmpty(maps)){ return null; } if (params.containsKey("time3")){ Map map = new HashMap<>(); String time3 = params.get("time3").toString(); String time4 = params.get("time4").toString(); String mac = params.get("mac").toString(); map.put("time1",time3); map.put("time2",time4); map.put("mac",mac); List> maps1 = specialDeviceService.carTrajectory(map,false); if (ObjectUtils.isEmpty(maps1)){ return null; } maps.addAll(maps1); list.add(getTime(time3, time4)); } if (params.containsKey("time5")){ Map map = new HashMap<>(); String time5 = params.get("time5").toString(); String time6 = params.get("time6").toString(); String mac = params.get("mac").toString(); map.put("time1",time5); map.put("time2",time6); map.put("mac",mac); List> maps1 = specialDeviceService.carTrajectory(map,false); if (ObjectUtils.isEmpty(maps1)){ return null; } maps.addAll(maps1); list.add(getTime(time5, time6)); } HashMap rsMap = getStringObjectHashMap(maps); rsMap.put("time",list); //获取jar包所在目录 ApplicationHome applicationHome = new ApplicationHome(getClass()); //在jar包所在目录下生成一个upload文件夹用来存储上传的图片 String path = applicationHome.getSource().getParentFile().toString() + "/static/img"; String type = params.get("type").toString(); String code = params.get("code").toString(); String area = params.get("area").toString(); rsMap.put("area",area); String value = JSON.toJSONString(rsMap); String mac = params.get("mac").toString(); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("mac",mac); queryWrapper.likeRight("time",time1.substring(0,10)); TbDaily daily = dailyMapper.selectOne(queryWrapper); ArrayList images = new ArrayList<>(); if (daily==null){ TbDaily daily1 = new TbDaily(); //获取图片 if (files.size()>0){ for (MultipartFile file : files) { String fileType = file.getContentType(); if ("image/jpg".equals(fileType) || "image/png".equals(fileType) || "image/jpeg".equals(fileType)){ //获取文件名 String fileName = file.getOriginalFilename(); //获取文件后缀名 String suffixName = fileName.substring(fileName.lastIndexOf(".")); //每一次都需要 fileName.substring(fileName.lastIndexOf(".")); //重新生成文件名 fileName = UUID.randomUUID() + suffixName; //图片上传 if (FileUtils.upload(file, path, fileName)) { images.add(fileName); } } } } if (!ObjectUtils.isEmpty(images)) { String image = images.stream() .map(String::valueOf) .collect(Collectors.joining(",")); daily1.setImages(image); } //封装数据 daily1.setMac(mac); daily1.setTime(sdf.parse(time1)); Date date = new Date(); daily1.setDate(date); daily1.setValue(value); daily1.setType(type); daily1.setCode(code); dailyMapper.insert(daily1); excelBO.setId(daily1.getId()); excelBO.setTime(sdf.parse(time1)); excelBO.setDate(date); }else { //删除服务器中的原来图片 String images1 = daily.getImages(); // ObjectUtils.isEmpty(images1); if (!ObjectUtils.isEmpty(images1)){ String[] splits = images1.split(","); for (String split : splits) { String realPath = path + File.separator + split; File file = new File(realPath); if (file.exists() && file.isFile()) { file.delete(); } } } if (files.size() > 0) { for (MultipartFile file : files) { //判断上传文件格式 String fileType = file.getContentType(); if ("image/jpg".equals(fileType) || "image/png".equals(fileType) || "image/jpeg".equals(fileType)) { //获取文件名 String fileName = file.getOriginalFilename(); //获取文件后缀名 String suffixName = fileName.substring(fileName.lastIndexOf(".")); //重新生成文件名 fileName = UUID.randomUUID() + suffixName; //图片上传 if (FileUtils.upload(file, path, fileName)) { images.add(fileName); } } } } if (!ObjectUtils.isEmpty(images)) { String image = images.stream() .map(String::valueOf) .collect(Collectors.joining(",")); daily.setImages(image); }else { daily.setImages(""); } daily.setValue(value); daily.setTime(sdf.parse(time1)); daily.setTime(sdf.parse(time1)); daily.setDate(new Date()); daily.setType(type); dailyMapper.updateById(daily); excelBO.setId(daily.getId()); excelBO.setTime(sdf.parse(time1)); excelBO.setDate(new Date()); } return excelBO; } private String getTime(String time1, String time2) { String substring1 = time1.substring(11, 13); String substring2= time2.substring(11, 13); String substring3 = time1.substring(5, 7); String substring4 = time1.substring(8, 10); return substring3 + "月" + substring4 + "日" + substring1 + "时-" + substring2+"时"; } /** * 下载走航车日报 * @param id * @return */ @Override public DailyVo loadDaily(Integer id) { ArrayList rsList = new ArrayList<>(); DailyVo dailyVo = new DailyVo(); TbDaily tbDaily = dailyMapper.selectById(id); if (tbDaily==null){ return null; } String images = tbDaily.getImages(); if (!ObjectUtils.isEmpty(images)){ String[] split = images.split(","); List list1 = Arrays.asList(split); dailyVo.setImages(list1); }else { dailyVo.setImages(rsList); } String value = tbDaily.getValue(); Map map = JSON.parseObject(value, Map.class); dailyVo.setCode(map); return dailyVo; } /** * 查询日报 * @param params * @return */ @Override public List selectDaily(Map params) { ArrayList excelBOS = new ArrayList<>(); String startTime = params.get("startTime").toString(); String endTime = params.get("endTime").toString(); String type = params.get("type").toString(); String code = params.get("code").toString(); Object mac = params.get("mac"); if (!ObjectUtils.isEmpty(mac)){ String MAC = mac.toString(); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("type",type).eq("code",code).eq("mac",MAC); queryWrapper.between("time",startTime,endTime); List dailies = dailyMapper.selectList(queryWrapper); for (TbDaily daily : dailies) { ExcelBO excelBO = new ExcelBO(); BeanUtils.copyProperties(daily,excelBO); excelBOS.add(excelBO); } return excelBOS; } QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("type",type).eq("code",code); queryWrapper.between("time",startTime,endTime); List dailies = dailyMapper.selectList(queryWrapper); for (TbDaily daily : dailies) { ExcelBO excelBO = new ExcelBO(); BeanUtils.copyProperties(daily,excelBO); excelBOS.add(excelBO); } return excelBOS; } //计算平均值和最大值 private HashMap getStringObjectHashMap(List> maps) { HashMap rsMap = new HashMap<>(); ArrayList pm25List = new ArrayList<>(); ArrayList pm10List = new ArrayList<>(); ArrayList COList = new ArrayList<>(); ArrayList SO2List = new ArrayList<>(); ArrayList NO2List = new ArrayList<>(); ArrayList O3List = new ArrayList<>(); ArrayList VOCList = new ArrayList<>(); for (Map map : maps) { // String flylon = map.get("flylon").toString(); // String flylat = map.get("flylat").toString(); // String s = flylon + "-" + flylat; // if (Double.parseDouble(map.get("a34004").toString())>200){ // // } pm25List.add(Double.parseDouble(map.get("a34004").toString())); pm10List.add(Double.parseDouble(map.get("a34002").toString())); COList.add(Double.parseDouble(map.get("a21005").toString())); SO2List.add(Double.parseDouble(map.get("a21026").toString())); NO2List.add(Double.parseDouble(map.get("a21004").toString())); O3List.add(Double.parseDouble(map.get("a05024").toString())); VOCList.add(Double.parseDouble(map.get("a99054").toString())); } //获取平均值 double PM25 = AmendUtils.sciCal(pm25List.stream().collect(Collectors.averagingDouble(Double::doubleValue)), 2); double PM10 = AmendUtils.sciCal(pm10List.stream().collect(Collectors.averagingDouble(Double::doubleValue)), 2); double CO = AmendUtils.sciCal(COList.stream().collect(Collectors.averagingDouble(Double::doubleValue)), 2); double SO2 = AmendUtils.sciCal(SO2List.stream().collect(Collectors.averagingDouble(Double::doubleValue)), 2); double O3 = AmendUtils.sciCal(O3List.stream().collect(Collectors.averagingDouble(Double::doubleValue)), 2); double VOC= AmendUtils.sciCal(VOCList.stream().collect(Collectors.averagingDouble(Double::doubleValue)), 2); double NO2= AmendUtils.sciCal(NO2List.stream().collect(Collectors.averagingDouble(Double::doubleValue)), 2); rsMap.put("maxPm25", Collections.max(pm25List)); rsMap.put("avgPm25",PM25); rsMap.put("maxPm10",Collections.max(pm10List)); rsMap.put("avgPm10",PM10); rsMap.put("maxCO",Collections.max(COList)); rsMap.put("avgCO",CO); rsMap.put("maxSO2",Collections.max(SO2List)); rsMap.put("avgSO2",SO2); rsMap.put("maxO3",Collections.max(O3List)); rsMap.put("avgO3",O3); rsMap.put("maxVOC",Collections.max(VOCList)); rsMap.put("avgVOC",VOC); rsMap.put("maxNO2",Collections.max(NO2List)); rsMap.put("avgNO2",NO2); return rsMap; } //根据距离筛选数据 private List> filterData(List> data) { List> result = new ArrayList<>(); result.add(data.remove(0)); for (Map map : data) { boolean flag = true; for (Map resultMap : result) { double lng1 = Double.parseDouble(map.get(Constants.SENSOR_CODE_LON).toString()); double lat1 = Double.parseDouble(map.get(Constants.SENSOR_CODE_LAT).toString()); double lng2 = Double.parseDouble(resultMap.get(Constants.SENSOR_CODE_LON).toString()); double lat2 = Double.parseDouble(resultMap.get(Constants.SENSOR_CODE_LAT).toString()); double distance = GeodesyUtils.getDistance(lat1, lng1, lat2, lng2); if (distance < dis) { flag = false; } } if (flag) { result.add(map); } } return result; } //范围取均值 private List> filterData(List> data, List> result) { List> list = new ArrayList<>(); Map> map = new HashMap<>(); result.forEach(it->map.put(it.get(Constants.SENSOR_CODE_LON).toString()+ "_"+Constants.SENSOR_CODE_LAT.toString(),Arrays.asList(it))); // 坐标在50 以内分组 for (Map mapData : data) { for (Map.Entry> entry : map.entrySet()) { double lng1 = Double.parseDouble(mapData.get(Constants.SENSOR_CODE_LON).toString()); double lat1 = Double.parseDouble(mapData.get(Constants.SENSOR_CODE_LAT).toString()); String[] mapKey = entry.getKey().split("_"); List mapValue = entry.getValue(); double lng2 = Double.parseDouble(mapKey[0]); double lat2 = Double.parseDouble(mapKey[1]); double distance = GeodesyUtils.getDistance(lat1, lng1, lat2, lng2); if (distance < dis) { mapValue.add(mapData); } } } return list; } //根据距离筛选数据 private List filterDataNew(List data,double range) { List list = new ArrayList<>(); Map map = new HashMap<>(); Map mapTest = new HashMap<>(); Integer integer = 1; HistorySecondCruiserResultCountDTO countDTO = new HistorySecondCruiserResultCountDTO(); countDTO.setSumNum(data.get(0).getNum()); countDTO.setContNum(1); map.put(integer,countDTO); list.add(0,data.remove(0)); mapTest.put(data.get(0).getFlyLon()+"_"+data.get(0).getFlyLat(),data.get(0).getNum()); int k =1; for (HistorySecondCruiserListDTO d : data) { boolean flag = true; for (HistorySecondCruiserListDTO l : list) { double distance = GeodesyUtils.getDistance(d.getFlyLat(), d.getFlyLon(), l.getFlyLat(), l.getFlyLon()); if (distance < range) { flag = false; if(integer.equals(list.size())&& !mapTest.containsKey(d.getFlyLon()+"_"+d.getFlyLat())){ HistorySecondCruiserResultCountDTO countResultDTO = Objects.isNull(map.get(integer))?new HistorySecondCruiserResultCountDTO():map.get(integer); countResultDTO.setContNum(countResultDTO.getContNum()+1); countResultDTO.setSumNum(countResultDTO.getSumNum().add(d.getNum())); map.put(integer,countResultDTO); mapTest.put(d.getFlyLon()+"_"+d.getFlyLat(),d.getNum()); k++; } } } if (flag) { if(!list.contains(d)){ list.add(d); integer++; HistorySecondCruiserResultCountDTO countResultDTO = Objects.isNull(map.get(integer))?new HistorySecondCruiserResultCountDTO():map.get(integer); countResultDTO.setSumNum(d.getNum()); countResultDTO.setContNum(1); map.put(integer,countResultDTO); mapTest.put(d.getFlyLon()+"_"+d.getFlyLat(),d.getNum()); } } } if(!list.contains(data.get(data.size()-1))){ HistorySecondCruiserListDTO result = data.get(data.size()-1); list.add(result); integer++; HistorySecondCruiserResultCountDTO countResultDTO = new HistorySecondCruiserResultCountDTO(); countResultDTO.setContNum(1); countResultDTO.setSumNum(result.getNum()); map.put(integer,countResultDTO); } return filterDataNe(list,map); } private List filterDataNe(List list,Map map){ List listResult = new ArrayList<>(); for(Map.Entry entry : map.entrySet()){ Integer mapKey = entry.getKey(); HistorySecondCruiserResultCountDTO mapValue = entry.getValue(); BigDecimal avgNum = mapValue.getSumNum().divide(BigDecimal.valueOf(mapValue.getContNum()),2,BigDecimal.ROUND_HALF_UP); HistorySecondCruiserResultDTO resultDTO = new HistorySecondCruiserResultDTO(); resultDTO.setTime(list.get(mapKey-1).getTime()); resultDTO.setAvgNum(avgNum); resultDTO.setFlyLon(list.get(mapKey-1).getFlyLon()); resultDTO.setFlyLat(list.get(mapKey-1).getFlyLat()); listResult.add(resultDTO); } return listResult; } private List filterDataNew(List data, List list,double range) { List listResult = new ArrayList<>(); List filter = new ArrayList<>(); for (HistorySecondCruiserListDTO d : data) { for (HistorySecondCruiserListDTO l : list) { double distance = GeodesyUtils.getDistance(d.getFlyLat(), d.getFlyLon(), l.getFlyLat(), l.getFlyLon()); if (filter.contains(d)) { break; } if (distance < range ) { List numList = new ArrayList<>(CollectionUtils.isEmpty(l.getNumList()) ? Arrays.asList(l.getNum()) : l.getNumList()); numList.add(d.getNum()); l.setNumList(numList); filter.add(d); break; } } } int k = 0; for(int j =0;j>>>:"+ (k++)); System.out.println("sss>>>>:"+ (filter.size())+">>>>:"+data.size()); int z = 0 ; return listResult; } }