kaiyu
2021-09-08 9cc9f173f8db89135610eba2c8af79c17b24dfdf
screen-api
增加获取组织所有无人机飞行时间接口
4 files added
8 files modified
374 ■■■■■ changed files
screen-api/src/main/java/com/moral/api/controller/UAVController.java 23 ●●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/pojo/dto/uav/UAVQueryTimeSlotDTO.java 35 ●●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/pojo/form/uav/UAVQueryTimeSlotForm.java 57 ●●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/pojo/vo/uav/UAVQueryTimeSlotVO.java 23 ●●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/pojo/vo/uav/UAVQueryTimeSlotVOs.java 44 ●●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/service/HistorySecondUavService.java 12 ●●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/service/SpecialDeviceService.java 18 ●●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/service/impl/HistorySecondUavServiceImpl.java 110 ●●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/service/impl/OrganizationServiceImpl.java 1 ●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/service/impl/SpecialDeviceServiceImpl.java 30 ●●●●● patch | view | raw | blame | history
screen-common/src/main/java/com/moral/constant/Constants.java 1 ●●●● patch | view | raw | blame | history
screen-common/src/main/java/com/moral/util/DateUtils.java 20 ●●●●● patch | view | raw | blame | history
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