package com.moral.api.service.impl; import com.moral.api.config.Interceptor.UserHelper; import com.moral.api.entity.SysDictData; import com.moral.api.exception.BusinessException; import com.moral.api.mapper.*; import com.moral.api.pojo.enums.SysDictTypeEnum; import com.moral.api.pojo.vo.user.QxUser; import com.moral.api.service.SysDictTypeService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.system.ApplicationHome; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.ObjectUtils; import org.springframework.web.multipart.MultipartFile; import java.io.Serializable; import java.math.BigDecimal; import java.text.DecimalFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; 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.moral.api.entity.Dustld; import com.moral.api.entity.ManageCoordinate; import com.moral.api.entity.MaxRoad; import com.moral.api.pojo.dto.historySecondCruiser.DustldDTO; import com.moral.api.pojo.dust.DustForm; import com.moral.api.pojo.dust.TimeForm; import com.moral.api.service.DustldService; import com.moral.util.DateUtils; import com.moral.util.FileUtils; import com.moral.util.TokenUtils; @Service @Slf4j public class DustldServiceImpl implements DustldService { @Autowired private HistorySecondCruiserMapper historySecondCruiserMapper; @Autowired private DustldMapper dustldMapper; /** * 保存日报信息 * @param params * @param file * @return * @throws ParseException */ @Override public Integer getDailyDustld(Map params,MultipartFile file ) { SysDictData listDict = sysDictTypeService.listOne(SysDictTypeEnum.SYS_SECOND_CRUISER.getValue(),"dustld"); //获取jar包所在目录 ApplicationHome applicationHome = new ApplicationHome(getClass()); //在jar包所在目录下生成一个upload文件夹用来存储上传的图片 String path = applicationHome.getSource().getParentFile().toString() + "/static/img"; String mac = params.get("mac").toString(); String time3 = params.get("time3").toString(); String time4 = params.get("time4").toString(); String table = params.get("table").toString(); String substring = time3.substring(0, 10); //路段名 String road = params.get("road").toString(); ArrayList list = new ArrayList<>(); List tables = JSONArray.parseArray(table, TimeForm.class); if (!ObjectUtils.isEmpty(tables)){ for (TimeForm timeForm : tables) { String start = timeForm.getStart(); String end = timeForm.getEnd(); List dust = historySecondCruiserMapper.getDust(start, end, mac); ArrayList rsDouble = new ArrayList<>(); for (String s : dust) { double aDouble = Double.parseDouble(s); if(listDict.getDataValue().contains(",")){ List resultStr = Arrays.asList(listDict.getDataValue().split(",")); if(resultStr.size() % 2 ==0){ aDouble = numAvg(resultStr,BigDecimal.valueOf(aDouble)).doubleValue(); } }else { BigDecimal dataValue = Objects.nonNull(listDict.getDataValue())?BigDecimal.valueOf(Double.parseDouble(listDict.getDataValue())):BigDecimal.ZERO; aDouble = BigDecimal.valueOf(aDouble).add(dataValue).doubleValue(); } /*if (aDouble>=0 && aDouble<40 ){ aDouble = aDouble + 170; }else if (aDouble>=40 && aDouble<60){ aDouble = aDouble + 130; }else if (aDouble>=60 && aDouble<100 ){ aDouble = aDouble + 110; }else if (aDouble>=100 && aDouble<150){ aDouble = aDouble + 70; }else if (aDouble>=150 && aDouble<180){ aDouble = aDouble + 30; }else { aDouble= aDouble+0; }*/ rsDouble.add(aDouble); } list.addAll(rsDouble); } } String format = ""; if (!ObjectUtils.isEmpty(list)){ Double collect = (list.stream().collect(Collectors.averagingDouble(Double::doubleValue)))/1000; format = new DecimalFormat("0.000").format(collect); } QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("mac",mac).likeRight("time",substring); Dustld dustld = dustldMapper.selectOne(queryWrapper); if (ObjectUtils.isEmpty(dustld)){ Dustld dustld1 = new Dustld(); if (!ObjectUtils.isEmpty(file)){ HashMap hashMap = new HashMap<>(); 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)) { hashMap.put("file1",fileName); String s = JSON.toJSONString(hashMap); dustld1.setImages(s); } } } HashMap map = new HashMap<>(); map.put(road,format); String value = JSON.toJSONString(map); dustld1.setMac(mac); dustld1.setTime(DateUtils.getDate(time3,DateUtils.yyyy_MM_dd_HH_mm_ss_EN)); dustld1.setValue(value); dustld1.setEndTime(DateUtils.getDate(time4,DateUtils.yyyy_MM_dd_HH_mm_ss_EN)); dustldMapper.insert(dustld1); return 200; }else { if (!ObjectUtils.isEmpty(file)){ HashMap hashMap = new HashMap<>(); 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)) { hashMap.put("file1",fileName); String s = JSON.toJSONString(hashMap); dustld.setImages(s); } } } String value = dustld.getValue(); JSONObject jsonObject = JSONObject.parseObject(value); jsonObject.put(road,format); String rsValue = JSONObject.toJSONString(jsonObject); dustld.setValue(rsValue); dustldMapper.updateById(dustld); return 200; } } /** * 下载日报 * @param id * @return */ @Override public Map dailyDustld(Integer id,List files) { //获取jar包所在目录 ApplicationHome applicationHome = new ApplicationHome(getClass()); //在jar包所在目录下生成一个upload文件夹用来存储上传的图片 String path = applicationHome.getSource().getParentFile().toString() + "/static/img"; HashMap map = new HashMap<>(); ArrayList list1 = new ArrayList<>(); ArrayList list2= new ArrayList<>(); Dustld dustld = dustldMapper.selectById(id); if (ObjectUtils.isEmpty(dustld)){ return null; } String pathList = getList(path, files); String images = dustld.getImages(); if (ObjectUtils.isEmpty(images)){ HashMap map1 = new HashMap<>(); map1.put("file1",""); if (pathList==null){ map1.put("file2",""); }else { map1.put("file2",pathList); } String s = JSON.toJSONString(map1); dustld.setImages(s); dustldMapper.updateById(dustld); }else { JSONObject jsonObject = JSONObject.parseObject(images); if (ObjectUtils.isEmpty(pathList)){ jsonObject.put("file2",""); }else { jsonObject.put("file2",pathList); } String s = JSON.toJSONString(jsonObject); dustld.setImages(s); dustldMapper.updateById(dustld); } SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日HH时mm分ss秒"); String stsrtTime = sdf.format(dustld.getTime()); String substring = stsrtTime.substring(5, 14); String endTime = sdf.format(dustld.getEndTime()); String substring1 = endTime.substring(5, 14); String value = dustld.getValue(); JSONObject jsonObject = JSONObject.parseObject(value); Iterator> iterator = jsonObject.entrySet().iterator(); while (iterator.hasNext()) { DustForm dustForm = new DustForm(); Map.Entry entry = (Map.Entry) iterator.next(); dustForm.setRoad(entry.getKey().toString()); dustForm.setValue(Double.parseDouble(entry.getValue().toString())); double aDouble = Double.parseDouble(entry.getValue().toString()); list2.add(dustForm); if (aDouble>=0.3){ list1.add(dustForm); } } //排序 list1.sort(Comparator.comparing(DustForm::getValue).reversed()); list2.sort(Comparator.comparing(DustForm::getValue).reversed()); map.put("list1",list1); map.put("list2",list2); map.put("time",substring+"-"+substring1); map.put("images",JSON.parseObject(dustld.getImages())); return map; } @Autowired private ManageCoordinateMapper manageCoordinateMapper; @Autowired private MaxRoadMapper maxRoadMapper; @Autowired private OrganizationMapper organizationMapper; @Autowired private SysDictTypeService sysDictTypeService; @Override @Transactional public Map dailyDustlds(Map params) { SysDictData list = sysDictTypeService.listOne(SysDictTypeEnum.SYS_SECOND_CRUISER.getValue(),"dustld"); Map userInfo = (Map) TokenUtils.getUserInfo(); Map orgInfo = (Map) userInfo.get("organization"); Integer orgId = (Integer) orgInfo.get("id"); String mac = params.get("mac").toString(); List orgList = organizationMapper.orgIdSpecialDevList(orgId,mac); if(CollectionUtils.isEmpty(orgList)){ throw new BusinessException("该设备没有路段组织信息!"); } String time1 = params.get("startTime").toString(); String dateString1 = DateUtils.stringToDateString(time1, DateUtils.yyyy_MM_dd_HH_mm_ss_EN, DateUtils.yyyy_MM_dd_HH_mm_CN); String rsTime1 = dateString1.substring(5, 14); String time2 = params.get("endTime").toString(); String dateString2 = DateUtils.stringToDateString(time2, DateUtils.yyyy_MM_dd_HH_mm_ss_EN, DateUtils.yyyy_MM_dd_HH_mm_CN); String rsTime2 = dateString2.substring(5, 14); HashMap rsMap = new HashMap<>(); List> dusts = historySecondCruiserMapper.getDusts(params); Map> collect = manageCoordinateMapper.CompareTo(orgList.get(0)).stream().collect(Collectors.groupingBy(o -> o.getName())); if (ObjectUtils.isEmpty(dusts) || ObjectUtils.isEmpty(collect)){ return null; } Set strings = collect.keySet(); ArrayList list1 = new ArrayList<>(); //所有的高值路段 StringBuilder builder = new StringBuilder(); int i = 1; long timestamp = System.currentTimeMillis(); for (String string : strings) { DustForm dustForm = new DustForm(); ArrayList doubleArrayList = new ArrayList<>(); List dustldDTOS = collect.get(string); for (DustldDTO dustldDTO : dustldDTOS) { String flyLat = dustldDTO.getFlyLat(); String flyLon = dustldDTO.getFlyLon(); if (flyLon==null && flyLat==null){ continue; } double latDouble1 = Double.parseDouble(flyLat); double lonDouble1 = Double.parseDouble(flyLon); for (Map dust : dusts) { String flyLat1 = Objects.nonNull(dust.get("flyLat")) ? dust.get("flyLat").toString() :"0"; String flyLon1 = Objects.nonNull(dust.get("flyLon")) ? dust.get("flyLon").toString() :"0"; double latDouble = Double.parseDouble(flyLat1); double lonDouble = Double.parseDouble(flyLon1); // String flyLon1 = dust.get("flyLon").toString(); if (latDouble1==latDouble && lonDouble1==lonDouble){ Double dustld = Objects.nonNull(dust.get("dustld"))?Double.parseDouble(dust.get("dustld").toString()):0d; if(list.getDataValue().contains(",")){ List resultStr = Arrays.asList(list.getDataValue().split(",")); if(resultStr.size() % 2 ==0){ dustld = numAvg(resultStr,BigDecimal.valueOf(dustld)).doubleValue(); } }else { BigDecimal dataValue = Objects.nonNull(list.getDataValue())?BigDecimal.valueOf(Double.parseDouble(list.getDataValue())):BigDecimal.ZERO; dustld = BigDecimal.valueOf(dustld).add(dataValue).doubleValue(); } doubleArrayList.add(dustld); break; } } } if (ObjectUtils.isEmpty(doubleArrayList)){ continue; } Double ListAva = doubleArrayList.stream() .collect(Collectors.averagingDouble(Double::doubleValue)); double rsAvg = new BigDecimal(ListAva/1000).setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue(); dustForm.setRoad(string); dustForm.setValue(rsAvg); list1.add(dustForm); if (rsAvg>=0.3){ builder.append("("+i+")"+string); i++; //添加高值路段 QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("name",string); wrapper.eq("time",DateUtils.getDate(time1,DateUtils.yyyy_MM_dd_EN)); Integer integer = maxRoadMapper.selectCount(wrapper); if (integer==0){ MaxRoad maxRoad = new MaxRoad(); maxRoad.setData(rsAvg); maxRoad.setName(string); maxRoad.setTime(DateUtils.getDate(time1,DateUtils.yyyy_MM_dd_EN)); maxRoadMapper.insert(maxRoad); } } } long timestamp2 = System.currentTimeMillis(); log.info(timestamp2-timestamp+""); //排序 list1.sort(Comparator.comparing(DustForm::getValue).reversed()); rsMap.put("list1",list1); //获取上一次的高值路段 ArrayList> list3 = new ArrayList<>(); QueryWrapper wrapper = new QueryWrapper<>(); wrapper.lt("time",DateUtils.getDate(time1,DateUtils.yyyy_MM_dd_EN)); wrapper.orderByDesc("time"); List maxRoads = maxRoadMapper.selectList(wrapper); String dateString3 = DateUtils.dateToDateString(maxRoads.get(0).getTime(), DateUtils.yyyy_MM_dd_CN); QueryWrapper wrapper2 = new QueryWrapper<>(); wrapper2.eq("time",maxRoads.get(0).getTime()); List maxRoads1 = maxRoadMapper.selectList(wrapper2); //获取两次路段相同的值 for (MaxRoad road : maxRoads1) { for (DustForm dustForm : list1) { if (road.getName().equals(dustForm.getRoad())){ HashMap map = new HashMap<>(); map.put("road",road.getName()); map.put("value1",String.format("%.2f",road.getData())); map.put("value2",String.format("%.2f",dustForm.getValue())); map.put("value3",String.format("%.2f",road.getData()-dustForm.getValue())); list3.add(map); } } } rsMap.put("data",ObjectUtils.isEmpty(builder)?"暂无高值路段":builder); rsMap.put("list3",list3); rsMap.put("time",rsTime1+"-"+rsTime2); rsMap.put("date1",dateString3.substring(5,10)); rsMap.put("date2",dateString1.substring(5,10)); return rsMap; } /** * 查询尘负荷高值 * @param id * @return */ @Override public Map selectDust(Integer id) { HashMap rsMap = new HashMap<>(); ArrayList list1 = new ArrayList<>(); Dustld dustld = dustldMapper.selectById(id); if (ObjectUtils.isEmpty(dustld)){ return null; } String value = dustld.getValue(); JSONObject jsonObject = JSONObject.parseObject(value); Iterator> iterator = jsonObject.entrySet().iterator(); while (iterator.hasNext()) { DustForm dustForm = new DustForm(); Map.Entry entry = (Map.Entry) iterator.next(); dustForm.setRoad(entry.getKey().toString()); dustForm.setValue(Double.parseDouble(entry.getValue().toString())); double aDouble = Double.parseDouble(entry.getValue().toString()); if (aDouble>=0.3){ list1.add(dustForm); } } if (!ObjectUtils.isEmpty(list1)){ list1.sort(Comparator.comparing(DustForm::getValue).reversed()); } rsMap.put("list",list1); rsMap.put("count",list1.size()); return rsMap; } /** * 查询日报记录 * @param params * @return */ @Override public List selectAll(Map params) { String mac = params.get("mac").toString(); String time1 = params.get("startTime").toString(); String time2 = params.get("endTime").toString(); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("mac",mac).between("time",time1,time2); List dustlds = dustldMapper.selectList(queryWrapper); if (ObjectUtils.isEmpty(dustlds)){ return null; } return dustlds; } //获取图片地址 private String getList(String path, List files1) { ArrayList images = new ArrayList<>(); if (!ObjectUtils.isEmpty(files1)){ for (MultipartFile file : files1) { 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(",")); return image; } return null; } private BigDecimal numAvg(List list , BigDecimal num){ int nums = 1; for (int i=0;i= 0 ){ return num.add(BigDecimal.valueOf(Double.parseDouble(list.get(i+1)))); } nums+=2; } return num; } }