screen-api/src/main/java/com/moral/api/controller/UAVController.java
@@ -3,10 +3,15 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.moral.api.entity.HistorySecondUav; import com.moral.api.mapper.HistorySecondUavMapper; import com.moral.api.pojo.dto.uav.UAVQueryTimeSlotDTO; import com.moral.api.pojo.form.uav.UAVQueryTimeSlotForm; import com.moral.api.pojo.vo.uav.UAVQueryDateVO; import com.moral.api.pojo.vo.uav.UAVQueryTimeSlotVO; import com.moral.api.pojo.vo.uav.UAVQueryTimeSlotVOs; import com.moral.api.service.HistorySecondUavService; import com.moral.constant.ResponseCodeEnum; import com.moral.constant.ResultMessage; import com.moral.util.DateUtils; import io.swagger.annotations.Api; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -14,8 +19,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.Date; import java.util.List; import java.util.*; /** * @ClassName UAVController @@ -66,4 +70,19 @@ return new ResultMessage(ResponseCodeEnum.SUCCESS.getCode(), ResponseCodeEnum.SUCCESS.getMsg(),vo); } @RequestMapping("queryTimeSlot") public ResultMessage queryTimeSlot(UAVQueryTimeSlotForm form){ //判断是否缺少参数 if (!form.valid()) return ResultMessage.fail(ResponseCodeEnum.PARAMETERS_IS_MISSING.getCode(), ResponseCodeEnum.PARAMETERS_IS_MISSING.getMsg()); //处理查询业务 List<UAVQueryTimeSlotDTO> dtos = historySecondUavService.queryTimeSlot(form); //封装vo层 UAVQueryTimeSlotVOs vo = UAVQueryTimeSlotVOs.convert(dtos); //返回数据 return new ResultMessage(ResponseCodeEnum.SUCCESS.getCode(), ResponseCodeEnum.SUCCESS.getMsg(),vo); } } screen-api/src/main/java/com/moral/api/pojo/dto/uav/UAVQueryTimeSlotDTO.java
New file @@ -0,0 +1,35 @@ package com.moral.api.pojo.dto.uav; import lombok.Data; import java.util.Date; import java.util.List; import java.util.Map; /** * @ClassName UAVQueryTimeSlotDTO * @Description TODO * @Author 陈凯裕 * @Date 2021/9/8 15:13 * @Version TODO **/ @Data public class UAVQueryTimeSlotDTO { /* * 无人机mac * */ private String mac; /* * 无人机名称 * */ private String name; /* * 无人机飞行时间段 * map中开始时间的key为startTime * 结束时间的key为endTime * */ private List<Map<String,Date>> timeSlot; } screen-api/src/main/java/com/moral/api/pojo/form/uav/UAVQueryTimeSlotForm.java
New file @@ -0,0 +1,57 @@ package com.moral.api.pojo.form.uav; import com.fasterxml.jackson.annotation.JsonFormat; import com.moral.util.DateUtils; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; import org.springframework.util.ObjectUtils; import java.util.Date; import java.util.List; /** * @ClassName queryTimeSlotForm * @Description TODO * @Author 陈凯裕 * @Date 2021/9/8 14:17 * @Version TODO **/ @Data public class UAVQueryTimeSlotForm { /* * 组织id * */ private Integer organizationId; /* * 日期 * */ @DateTimeFormat(pattern = "yyyy-MM-dd") @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") private Date date; /* * 开始时间 * */ private Date startDate; /* * 结束时间 * */ private Date endDate; public boolean valid() { if ( ObjectUtils.isEmpty(organizationId)&& ObjectUtils.isEmpty(date) ) return false; //将日期转换为开始结束时间 List<Date> dates = DateUtils.dateToStartAndEndTime(date); startDate = dates.get(0); endDate = dates.get(1); return true; } } screen-api/src/main/java/com/moral/api/pojo/vo/uav/UAVQueryTimeSlotVO.java
New file @@ -0,0 +1,23 @@ package com.moral.api.pojo.vo.uav; import lombok.Data; import java.util.List; import java.util.Map; /** * @ClassName UAVQueryTimeSlotVO * @Description TODO * @Author 陈凯裕 * @Date 2021/9/8 16:57 * @Version TODO **/ @Data public class UAVQueryTimeSlotVO { private String mac; private String name; private List<Map<String,String>> timeSlot; } screen-api/src/main/java/com/moral/api/pojo/vo/uav/UAVQueryTimeSlotVOs.java
New file @@ -0,0 +1,44 @@ package com.moral.api.pojo.vo.uav; import com.moral.api.pojo.dto.uav.UAVQueryTimeSlotDTO; import com.moral.util.DateUtils; import lombok.Data; import java.util.*; /** * @ClassName UAVQueryTimeSlotVOs * @Description TODO * @Author 陈凯裕 * @Date 2021/9/8 17:16 * @Version TODO **/ @Data public class UAVQueryTimeSlotVOs { List<UAVQueryTimeSlotVO> vos; public static UAVQueryTimeSlotVOs convert(List<UAVQueryTimeSlotDTO> dtos){ UAVQueryTimeSlotVOs resultVO = new UAVQueryTimeSlotVOs(); List<UAVQueryTimeSlotVO> vos = new ArrayList<>(); for (UAVQueryTimeSlotDTO dto : dtos) { UAVQueryTimeSlotVO vo = new UAVQueryTimeSlotVO(); vo.setMac(dto.getMac()); vo.setName(dto.getName()); List<Map<String,String>> timeSlotVo = new ArrayList<>(); List<Map<String, Date>> timeSlot = dto.getTimeSlot(); for (Map<String, Date> map : timeSlot) { Map<String,String> newMap = new LinkedHashMap<>(); map.forEach((key,value)->{ String dateStr = DateUtils.dateToDateString(value, "yyyy-MM-dd HH:mm:ss"); newMap.put(key,dateStr); }); timeSlotVo.add(newMap); } vo.setTimeSlot(timeSlotVo); vos.add(vo); } resultVO.setVos(vos); return resultVO; } } screen-api/src/main/java/com/moral/api/service/HistorySecondUavService.java
@@ -2,6 +2,8 @@ import com.moral.api.entity.HistorySecondUav; import com.baomidou.mybatisplus.extension.service.IService; import com.moral.api.pojo.dto.uav.UAVQueryTimeSlotDTO; import com.moral.api.pojo.form.uav.UAVQueryTimeSlotForm; import java.util.Date; import java.util.List; @@ -25,4 +27,14 @@ */ List<Date> queryDate(Integer organizationId); /** * @Description: 查询组织在指定日期下无人机的飞行时间段 * @Param: [from] * @return: List<UAVQueryTimeSlotDTO> * @Author: 陈凯裕 * @Date: 2021/9/8 */ List<UAVQueryTimeSlotDTO> queryTimeSlot(UAVQueryTimeSlotForm form); } screen-api/src/main/java/com/moral/api/service/SpecialDeviceService.java
@@ -22,4 +22,22 @@ //走航车轨迹 List<Map<String, Object>> carTrajectory(Map<String, Object> params); /** * @Description: 根据mac号获取无人机数据 * @Param: [mac] * @return: com.moral.api.entity.SpecialDevice * @Author: 陈凯裕 * @Date: 2021/9/8 */ Map<String,Object> getSpecialDeviceMapByMac(String mac); /** * @Description: 根据mac号获取无人机对象 * @Param: [mac] * @return: com.moral.api.entity.SpecialDevice * @Author: 陈凯裕 * @Date: 2021/9/8 */ SpecialDevice getSpecialDeviceByMac(String mac); } screen-api/src/main/java/com/moral/api/service/impl/HistorySecondUavServiceImpl.java
@@ -2,16 +2,20 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.moral.api.entity.HistorySecondUav; import com.moral.api.entity.Organization; import com.moral.api.mapper.HistorySecondUavMapper; import com.moral.api.pojo.dto.uav.UAVQueryTimeSlotDTO; import com.moral.api.pojo.form.uav.UAVQueryTimeSlotForm; import com.moral.api.service.HistorySecondUavService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.moral.api.service.OrganizationService; import com.moral.api.service.SpecialDeviceService; import com.moral.util.DateUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.*; import java.util.function.Predicate; /** * <p> @@ -26,12 +30,23 @@ @Autowired HistorySecondUavMapper historySecondUavMapper; @Autowired OrganizationService organizationService; @Autowired SpecialDeviceService specialDeviceService; @Override public List<Date> queryDate(Integer organizationId) { //构造查询条件 QueryWrapper<HistorySecondUav> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("organization_id",organizationId); //获取子组织id List<Organization> children = organizationService.getChildrenOrganizationsById(organizationId); List<Integer> childrenId = new ArrayList<>(); for (Organization child : children) { childrenId.add(child.getId()); } childrenId.add(organizationId); queryWrapper.in("organization_id",childrenId); //设置查询时间范围为180天 Date endDate = new Date(); Date startDate = DateUtils.addDays(endDate, -180); @@ -47,4 +62,91 @@ } return result; } @Override public List<UAVQueryTimeSlotDTO> queryTimeSlot(UAVQueryTimeSlotForm form) { //取参 Integer organizationId = form.getOrganizationId(); Date startDate = form.getStartDate(); Date endDate = form.getEndDate(); QueryWrapper<HistorySecondUav> wrapper = new QueryWrapper<>(); //获取子组织id List<Organization> children = organizationService.getChildrenOrganizationsById(organizationId); List<Integer> childrenId = new ArrayList<>(); for (Organization child : children) { childrenId.add(child.getId()); } childrenId.add(organizationId); wrapper.in("organization_id",childrenId); //查询根据batch查,因为可能会有跨天飞行的情况。 wrapper.between("batch",startDate,endDate); //设置查询字段 wrapper.select("mac,time,batch"); //查询结果 List<HistorySecondUav> historySecondUavs = historySecondUavMapper.selectList(wrapper); //根据batch进行分批 Map<String,List<HistorySecondUav>> batchMap = new LinkedHashMap<>();//key为batch的string for (HistorySecondUav historySecondUav : historySecondUavs) { //获取batch对应的数据集合 List<HistorySecondUav> list = batchMap.get(historySecondUav.getBatch().toString()); if(list!=null){ list.add(historySecondUav); }else{ ArrayList<HistorySecondUav> newList = new ArrayList<>(); newList.add(historySecondUav); batchMap.put(historySecondUav.getBatch().toString(),newList); } } //去除少于30条数据的集合 batchMap.values().removeIf(new Predicate<List<HistorySecondUav>>() { @Override public boolean test(List<HistorySecondUav> historySecondUavs) { if(historySecondUavs.size()<=30) return true; return false; } }); //根据mac进行分类 Map<String,List<Map<String,List<HistorySecondUav>>>> macBatchMap = new LinkedHashMap<>();//key为mac //遍历batchMap将mac提取出来,作为macBatchMap的key,batch和数据map的数据集合放入value batchMap.forEach((key,value)->{ String mac = value.get(0).getMac(); List<Map<String, List<HistorySecondUav>>> maps = macBatchMap.get(mac); if(maps!=null){ Map<String,List<HistorySecondUav>> map = new LinkedHashMap<>(); map.put(key,value); maps.add(map); }else{ List<Map<String,List<HistorySecondUav>>> list = new ArrayList<>(); Map<String,List<HistorySecondUav>> map = new LinkedHashMap<>(); map.put(key,value); list.add(map); macBatchMap.put(value.get(0).getMac(),list); } }); //封装返回数据 List<UAVQueryTimeSlotDTO> dtos = new ArrayList<>(); macBatchMap.forEach((key,value)->{ UAVQueryTimeSlotDTO dto = new UAVQueryTimeSlotDTO(); List<Map<String,Date>> timeSlots = new ArrayList<>(); dto.setMac(key); //根据mac查询设备名称 dto.setName((String) specialDeviceService.getSpecialDeviceMapByMac(key).get("name")); //获取时间段 value.forEach(listValue->{ listValue.forEach((mKey,mValue)->{ Date slotStartDate = mValue.get(0).getTime(); Date slotEndDate = mValue.get(mValue.size()-1).getTime(); Map<String,Date> dateMap = new HashMap<>(); dateMap.put("startTime",slotStartDate); dateMap.put("endTime",slotEndDate); timeSlots.add(dateMap); }); }); dto.setTimeSlot(timeSlots); dtos.add(dto); }); return dtos; } } screen-api/src/main/java/com/moral/api/service/impl/OrganizationServiceImpl.java
@@ -27,6 +27,7 @@ @Autowired OrganizationMapper organizationMapper; @Override public List<Organization> getChildrenOrganizationsById(Integer id) { List<Organization> childrenOrganization = new ArrayList<>(); screen-api/src/main/java/com/moral/api/service/impl/SpecialDeviceServiceImpl.java
@@ -2,18 +2,23 @@ import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.moral.api.entity.HistorySecondSpecial; import com.moral.api.entity.Organization; import com.moral.api.entity.SpecialDevice; import com.moral.api.entity.SpecialDeviceHistory; import com.moral.api.mapper.HistorySecondSpecialMapper; import com.moral.api.mapper.SpecialDeviceMapper; 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.constant.RedisConstants; import com.moral.util.GeodesyUtils; import com.moral.util.TokenUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import org.springframework.util.ObjectUtils; @@ -37,6 +42,14 @@ @Autowired private SpecialDeviceHistoryService specialDeviceHistoryService; @Autowired OrganizationService organizationService; @Autowired SpecialDeviceMapper specialDeviceMapper; @Autowired RedisTemplate redisTemplate; private final static Double dis = 50d; @@ -84,6 +97,23 @@ return filterData(data); } @Override public Map<String,Object> getSpecialDeviceMapByMac(String mac) { //从缓存中获取 Map<String,Object> specialDeviceMap = (Map<String, Object>) redisTemplate.opsForHash().get(RedisConstants.DEVICE,mac); return specialDeviceMap; } @Override public SpecialDevice getSpecialDeviceByMac(String mac) { QueryWrapper<SpecialDevice> queryWrapper = new QueryWrapper(); queryWrapper.eq("mac",mac); queryWrapper.eq("is_delete",Constants.NOT_DELETE); SpecialDevice specialDevice = specialDeviceMapper.selectOne(queryWrapper); return specialDevice; } //根据距离筛选数据 private List<Map<String, Object>> filterData(List<Map<String, Object>> data) { List<Map<String, Object>> result = new ArrayList<>(); screen-common/src/main/java/com/moral/constant/Constants.java
@@ -218,5 +218,6 @@ * 字典表无人机设备类型 * */ public static final String SPECIAL_DEVICE_UAV = "1"; } screen-common/src/main/java/com/moral/util/DateUtils.java
@@ -92,6 +92,26 @@ /** * @Description: 将日期转换为当天的开始和结束时间 * @Param: [date] * @return: java.util.List<java.util.Date> * @Author: 陈凯裕 * @Date: 2021/9/8 */ public static List<Date> dateToStartAndEndTime(Date date){ String dateStr = dateToDateString(date, "yyyy-MM-dd"); String startDateStr = dateStr+" 00:00:00"; String endDateStr = dateStr+" 23:59:59"; Date startDate = getDate(startDateStr, "yyyy-MM-dd HH:mm:ss"); Date endDate = getDate(endDateStr, "yyyy-MM-dd HH:mm:ss"); ArrayList<Date> dates = new ArrayList<>(); dates.add(startDate); dates.add(endDate); return dates; } /** * @Description: Date的toString格式转为Date * @Param: [] * @return: java.util.Date