From 9cc9f173f8db89135610eba2c8af79c17b24dfdf Mon Sep 17 00:00:00 2001
From: kaiyu <404897439@qq.com>
Date: Wed, 08 Sep 2021 17:21:19 +0800
Subject: [PATCH] screen-api                  增加获取组织所有无人机飞行时间接口

---
 screen-api/src/main/java/com/moral/api/service/SpecialDeviceService.java             |   18 ++
 screen-api/src/main/java/com/moral/api/pojo/vo/uav/UAVQueryTimeSlotVO.java           |   23 +++
 screen-api/src/main/java/com/moral/api/service/impl/HistorySecondUavServiceImpl.java |  110 +++++++++++++++
 screen-common/src/main/java/com/moral/util/DateUtils.java                            |   20 ++
 screen-api/src/main/java/com/moral/api/pojo/form/uav/UAVQueryTimeSlotForm.java       |   57 ++++++++
 screen-api/src/main/java/com/moral/api/service/HistorySecondUavService.java          |   12 +
 screen-api/src/main/java/com/moral/api/service/impl/OrganizationServiceImpl.java     |    1 
 screen-api/src/main/java/com/moral/api/pojo/dto/uav/UAVQueryTimeSlotDTO.java         |   35 +++++
 screen-api/src/main/java/com/moral/api/service/impl/SpecialDeviceServiceImpl.java    |   30 ++++
 screen-common/src/main/java/com/moral/constant/Constants.java                        |    1 
 screen-api/src/main/java/com/moral/api/pojo/vo/uav/UAVQueryTimeSlotVOs.java          |   44 ++++++
 screen-api/src/main/java/com/moral/api/controller/UAVController.java                 |   23 +++
 12 files changed, 368 insertions(+), 6 deletions(-)

diff --git a/screen-api/src/main/java/com/moral/api/controller/UAVController.java b/screen-api/src/main/java/com/moral/api/controller/UAVController.java
index 412ef42..0342ed5 100644
--- a/screen-api/src/main/java/com/moral/api/controller/UAVController.java
+++ b/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);
+    }
+
 }
diff --git a/screen-api/src/main/java/com/moral/api/pojo/dto/uav/UAVQueryTimeSlotDTO.java b/screen-api/src/main/java/com/moral/api/pojo/dto/uav/UAVQueryTimeSlotDTO.java
new file mode 100644
index 0000000..80c0087
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/pojo/dto/uav/UAVQueryTimeSlotDTO.java
@@ -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;
+}
diff --git a/screen-api/src/main/java/com/moral/api/pojo/form/uav/UAVQueryTimeSlotForm.java b/screen-api/src/main/java/com/moral/api/pojo/form/uav/UAVQueryTimeSlotForm.java
new file mode 100644
index 0000000..c182c07
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/pojo/form/uav/UAVQueryTimeSlotForm.java
@@ -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;
+    }
+}
diff --git a/screen-api/src/main/java/com/moral/api/pojo/vo/uav/UAVQueryTimeSlotVO.java b/screen-api/src/main/java/com/moral/api/pojo/vo/uav/UAVQueryTimeSlotVO.java
new file mode 100644
index 0000000..90343dc
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/pojo/vo/uav/UAVQueryTimeSlotVO.java
@@ -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;
+}
diff --git a/screen-api/src/main/java/com/moral/api/pojo/vo/uav/UAVQueryTimeSlotVOs.java b/screen-api/src/main/java/com/moral/api/pojo/vo/uav/UAVQueryTimeSlotVOs.java
new file mode 100644
index 0000000..a713d11
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/pojo/vo/uav/UAVQueryTimeSlotVOs.java
@@ -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;
+    }
+}
diff --git a/screen-api/src/main/java/com/moral/api/service/HistorySecondUavService.java b/screen-api/src/main/java/com/moral/api/service/HistorySecondUavService.java
index fcfef5e..4b663ca 100644
--- a/screen-api/src/main/java/com/moral/api/service/HistorySecondUavService.java
+++ b/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);
+
+
 }
diff --git a/screen-api/src/main/java/com/moral/api/service/SpecialDeviceService.java b/screen-api/src/main/java/com/moral/api/service/SpecialDeviceService.java
index ea3f8da..7711c12 100644
--- a/screen-api/src/main/java/com/moral/api/service/SpecialDeviceService.java
+++ b/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);
+
 }
diff --git a/screen-api/src/main/java/com/moral/api/service/impl/HistorySecondUavServiceImpl.java b/screen-api/src/main/java/com/moral/api/service/impl/HistorySecondUavServiceImpl.java
index 81620b9..1565dc3 100644
--- a/screen-api/src/main/java/com/moral/api/service/impl/HistorySecondUavServiceImpl.java
+++ b/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;
+    }
+
 }
diff --git a/screen-api/src/main/java/com/moral/api/service/impl/OrganizationServiceImpl.java b/screen-api/src/main/java/com/moral/api/service/impl/OrganizationServiceImpl.java
index ce1ee37..0d730ba 100644
--- a/screen-api/src/main/java/com/moral/api/service/impl/OrganizationServiceImpl.java
+++ b/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<>();
diff --git a/screen-api/src/main/java/com/moral/api/service/impl/SpecialDeviceServiceImpl.java b/screen-api/src/main/java/com/moral/api/service/impl/SpecialDeviceServiceImpl.java
index 4ff6a07..fd19d65 100644
--- a/screen-api/src/main/java/com/moral/api/service/impl/SpecialDeviceServiceImpl.java
+++ b/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<>();
diff --git a/screen-common/src/main/java/com/moral/constant/Constants.java b/screen-common/src/main/java/com/moral/constant/Constants.java
index 38b3a9a..4346d0d 100644
--- a/screen-common/src/main/java/com/moral/constant/Constants.java
+++ b/screen-common/src/main/java/com/moral/constant/Constants.java
@@ -218,5 +218,6 @@
      * ������������������������������
      * */
     public static final String SPECIAL_DEVICE_UAV = "1";
+
     
 }
diff --git a/screen-common/src/main/java/com/moral/util/DateUtils.java b/screen-common/src/main/java/com/moral/util/DateUtils.java
index 9af501f..7b313a8 100644
--- a/screen-common/src/main/java/com/moral/util/DateUtils.java
+++ b/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

--
Gitblit v1.8.0