jinpengyong
2021-09-10 c8aa05fd65cc788abc0f44494338b04993e3b4be
Merge remote-tracking branch 'origin/dev' into dev_
11 files added
10 files modified
1025 ■■■■■ changed files
screen-api/src/main/java/com/moral/api/controller/UAVController.java 45 ●●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/entity/HistorySecondUav.java 8 ●●●●● 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/UAVQueryDateVO.java 47 ●●●●● 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 24 ●●●●● 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 132 ●●●●● 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/constant/RedisConstants.java 5 ●●●●● patch | view | raw | blame | history
screen-common/src/main/java/com/moral/util/DateUtils.java 20 ●●●●● patch | view | raw | blame | history
screen-manage/src/main/java/com/moral/api/controller/GovMonitorPoionController.java 107 ●●●●● patch | view | raw | blame | history
screen-manage/src/main/java/com/moral/api/entity/GovMonitorPoint.java 101 ●●●●● patch | view | raw | blame | history
screen-manage/src/main/java/com/moral/api/mapper/GovMonitorPointMapper.java 16 ●●●●● patch | view | raw | blame | history
screen-manage/src/main/java/com/moral/api/service/GovMonitorPointService.java 67 ●●●●● patch | view | raw | blame | history
screen-manage/src/main/java/com/moral/api/service/impl/GovMonitorPointServiceImpl.java 222 ●●●●● patch | view | raw | blame | history
screen-manage/src/main/resources/mapper/GovMonitorPointMapper.xml 22 ●●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/controller/UAVController.java
@@ -3,8 +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;
@@ -12,7 +19,7 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.*;
/**
 * @ClassName UAVController
@@ -30,6 +37,8 @@
    @Autowired
    HistorySecondUavMapper historySecondUavMapper;
    @Autowired
    HistorySecondUavService historySecondUavService;
    /**
    * @Description: 根据组织id,mac以及时间查询无人机数据
            * @Param: []
@@ -42,4 +51,38 @@
        List<HistorySecondUav> historySecondUavs = historySecondUavMapper.selectList(new QueryWrapper<>());
        return new ResultMessage(ResponseCodeEnum.SUCCESS.getCode(), ResponseCodeEnum.SUCCESS.getMsg(),historySecondUavs);
    }
    /**
    * @Description: 查询组织在哪天有无人机飞行,返回具体日期
            * @Param: [organizationId]
            * @return: com.moral.constant.ResultMessage
            * @Author: 陈凯裕
            * @Date: 2021/9/8
            */
    @RequestMapping("queryDate")
    public ResultMessage queryDate(Integer organizationId){
        //处理查询业务
        List<Date> dates = historySecondUavService.queryDate(organizationId);
        //封装vo层
        UAVQueryDateVO vo = UAVQueryDateVO.convert(dates);
        //返回数据
        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/entity/HistorySecondUav.java
@@ -1,5 +1,7 @@
package com.moral.api.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import java.time.LocalDateTime;
import java.io.Serializable;
@@ -23,6 +25,12 @@
    private static final long serialVersionUID = 1L;
    /**
     * 主键
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    /**
     * 设备mac
     */
    private String mac;
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/UAVQueryDateVO.java
New file
@@ -0,0 +1,47 @@
package com.moral.api.pojo.vo.uav;
import com.moral.util.DateUtils;
import lombok.Data;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
/**
 * @ClassName UAVQueryDateVO
 * @Description 查询组织哪天有无人机飞行vo
 * @Author 陈凯裕
 * @Date 2021/9/8 11:03
 * @Version TODO
 **/
@Data
public class UAVQueryDateVO {
    /**
    * @Description: 使用hashset是为了去重
            * @Param:
            * @return:
            * @Author: 陈凯裕
            * @Date: 2021/9/8
            */
    public HashSet<String> datesStr;
    /**
    * @Description: 将业务层返回数据转化为vo层数据
            * @Param: [dates]
            * @return: com.moral.api.pojo.vo.uav.UAVQueryDateVO
            * @Author: 陈凯裕
            * @Date: 2021/9/8
            */
    public static UAVQueryDateVO convert(List<Date> dates){
        //日志格式转化为字符串格式
        UAVQueryDateVO uavQueryDateVO = new UAVQueryDateVO();
        HashSet<String> datesStr = new HashSet<>();
        for (Date date : dates) {
            datesStr.add(DateUtils.dateToDateString(date,"yyyy-MM-dd"));
        }
        uavQueryDateVO.setDatesStr(datesStr);
        return uavQueryDateVO;
    }
}
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,11 @@
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;
/**
 * <p>
@@ -13,4 +18,23 @@
 */
public interface HistorySecondUavService extends IService<HistorySecondUav> {
    /**
    * @Description: 根据组织id查询该组织在哪天有无人机飞行
            * @Param: [organizationId]
            * @return: java.util.List<java.util.Date>
            * @Author: 陈凯裕
            * @Date: 2021/9/8
            */
    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
@@ -1,10 +1,21 @@
package com.moral.api.service.impl;
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.*;
import java.util.function.Predicate;
/**
 * <p>
@@ -17,4 +28,125 @@
@Service
public class HistorySecondUavServiceImpl extends ServiceImpl<HistorySecondUavMapper, HistorySecondUav> implements HistorySecondUavService {
    @Autowired
    HistorySecondUavMapper historySecondUavMapper;
    @Autowired
    OrganizationService organizationService;
    @Autowired
    SpecialDeviceService specialDeviceService;
    @Override
    public List<Date> queryDate(Integer organizationId) {
        //构造查询条件
        QueryWrapper<HistorySecondUav> queryWrapper = 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);
        queryWrapper.in("organization_id",childrenId);
        //设置查询时间范围为180天
        Date endDate = new Date();
        Date startDate = DateUtils.addDays(endDate, -180);
        queryWrapper.between("batch",startDate,endDate);
        //设置查询字段
        queryWrapper.select("DISTINCT batch");
        //查询结果
        List<HistorySecondUav> historySecondUavs = historySecondUavMapper.selectList(queryWrapper);
        //结果转为Date集合
        List<Date> result = new ArrayList<>();
        for (HistorySecondUav historySecondUav : historySecondUavs) {
            result.add(historySecondUav.getBatch());
        }
        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/constant/RedisConstants.java
@@ -78,5 +78,10 @@
     * */
    public static final String SPECIAL_DEVICE_INFO = "special_device_alarm_info";
    /*
     * redis中政府站点信息key
     * */
    public static final String GOV_MONITOR_POINT = "gov_monitor_point";
}
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
screen-manage/src/main/java/com/moral/api/controller/GovMonitorPoionController.java
New file
@@ -0,0 +1,107 @@
package com.moral.api.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.moral.api.entity.GovMonitorPoint;
import com.moral.api.mapper.GovMonitorPointMapper;
import com.moral.api.service.GovMonitorPointService;
import com.moral.constant.Constants;
import com.moral.constant.ResponseCodeEnum;
import com.moral.constant.ResultMessage;
import com.moral.util.WebUtils;
import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Map;
/**
 * @program: screen
 * @description: 政府站点
 * @author: lizijie
 * @create: 2021-09-09 11:31
 **/
@Slf4j
@Api(tags = {"政府站点"})
@RestController
@RequestMapping("/govMonitorPoint")
public class GovMonitorPoionController {
    @Resource
    private GovMonitorPointService govMonitorPointService;
    @Resource
    private GovMonitorPointMapper govMonitorPointMapper;
    @RequestMapping(value = "getGovMonitorPointByCondition", method = RequestMethod.GET)
    @ResponseBody
    public ResultMessage getSpecialDeviceByCondition(HttpServletRequest request) {
        Map<String,Object> parameters = WebUtils.getParametersStartingWith(request,null);
        Map<String,Object> resultMap = govMonitorPointService.getDataByCondition(parameters);
        if (!resultMap.containsKey("code")){
            return ResultMessage.ok(resultMap);
        }
        return ResultMessage.fail(Integer.parseInt(resultMap.get("code").toString()),resultMap.get("msg").toString());
    }
    @RequestMapping(value = "insert", method = RequestMethod.POST)
    @ResponseBody
    public ResultMessage insert(@RequestBody GovMonitorPoint govMonitorPoint){
        String guid = govMonitorPoint.getGuid();
        String name = govMonitorPoint.getName();
        double longitude = govMonitorPoint.getLongitude();
        double latitude = govMonitorPoint.getLatitude();
        String station_level = govMonitorPoint.getStationLevel();
        if (ObjectUtils.isEmpty(guid) && ObjectUtils.isEmpty(name) && ObjectUtils.isEmpty(longitude) && ObjectUtils.isEmpty(latitude) && ObjectUtils.isEmpty(station_level)){
            return ResultMessage.fail(ResponseCodeEnum.PARAMETERS_IS_MISSING.getCode(),ResponseCodeEnum.PARAMETERS_IS_MISSING.getMsg());
        }
        QueryWrapper<GovMonitorPoint> wrapper_govMonitorPoint = new QueryWrapper<>();
        wrapper_govMonitorPoint.eq("is_delete",Constants.NOT_DELETE);
        wrapper_govMonitorPoint.eq("guid",guid).or().eq("name",name);
        List<GovMonitorPoint> govMonitorPoints = govMonitorPointMapper.selectList(wrapper_govMonitorPoint);
        if (govMonitorPoints.size()>0){
            return ResultMessage.fail(ResponseCodeEnum.MONITOR_POINT_IS_EXIST.getCode(),ResponseCodeEnum.MONITOR_POINT_IS_EXIST.getMsg());
        }
        govMonitorPointService.insert(govMonitorPoint);
        return ResultMessage.ok();
    }
    @RequestMapping(value = "update", method = RequestMethod.POST)
    @ResponseBody
    public ResultMessage update(@RequestBody GovMonitorPoint govMonitorPoint){
        int id = govMonitorPoint.getId();
        if (ObjectUtils.isEmpty(id)){
            return ResultMessage.fail(ResponseCodeEnum.PARAMETERS_IS_MISSING.getCode(),ResponseCodeEnum.PARAMETERS_IS_MISSING.getMsg());
        }
        QueryWrapper<GovMonitorPoint> wrapper_govMonitorPoint = new QueryWrapper<>();
        wrapper_govMonitorPoint.eq("is_delete",Constants.NOT_DELETE);
        wrapper_govMonitorPoint.eq("id",id);
        List<GovMonitorPoint> govMonitorPoints = govMonitorPointMapper.selectList(wrapper_govMonitorPoint);
        if (govMonitorPoints.size()==0){
            return ResultMessage.fail(ResponseCodeEnum.MONITOR_POINT_IS_NOT_EXIST.getCode(),ResponseCodeEnum.MONITOR_POINT_IS_NOT_EXIST.getMsg());
        }
        govMonitorPointService.update(govMonitorPoint);
        return ResultMessage.ok();
    }
    @RequestMapping(value = "delete", method = RequestMethod.POST)
    @ResponseBody
    public ResultMessage delete(@RequestBody Map map){
        int id = Integer.parseInt(map.get("id").toString());
        if (ObjectUtils.isEmpty(id)){
            return ResultMessage.fail(ResponseCodeEnum.PARAMETERS_IS_MISSING.getCode(),ResponseCodeEnum.PARAMETERS_IS_MISSING.getMsg());
        }
        QueryWrapper<GovMonitorPoint> wrapper_govMonitorPoint = new QueryWrapper<>();
        wrapper_govMonitorPoint.eq("is_delete",Constants.NOT_DELETE);
        wrapper_govMonitorPoint.eq("id",id);
        List<GovMonitorPoint> govMonitorPoints = govMonitorPointMapper.selectList(wrapper_govMonitorPoint);
        if (govMonitorPoints.size()==0){
            return ResultMessage.fail(ResponseCodeEnum.MONITOR_POINT_IS_NOT_EXIST.getCode(),ResponseCodeEnum.MONITOR_POINT_IS_NOT_EXIST.getMsg());
        }
        govMonitorPointService.delete(id);
        return ResultMessage.ok();
    }
}
screen-manage/src/main/java/com/moral/api/entity/GovMonitorPoint.java
New file
@@ -0,0 +1,101 @@
package com.moral.api.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import com.baomidou.mybatisplus.annotation.TableId;
import java.time.LocalDateTime;
import java.io.Serializable;
import java.util.Date;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
 * <p>
 *
 * </p>
 *
 * @author moral
 * @since 2021-09-09
 */
@Data
@EqualsAndHashCode(callSuper = false)
public class GovMonitorPoint extends Model<GovMonitorPoint> {
    private static final long serialVersionUID = 1L;
    /**
     * id
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    /**
     * 政府站点code
     */
    private String guid;
    /**
     * 名称
     */
    private String name;
    /**
     * 经度
     */
    private Double longitude;
    /**
     * 纬度
     */
    private Double latitude;
    /**
     * 省编码
     */
    private Integer provinceCode;
    /**
     * 市编码
     */
    private Integer cityCode;
    /**
     * 县/区编码
     */
    private Integer areaCode;
    /**
     * 政府站点类型:国控、省控、县控
     */
    private String stationLevel;
    /**
     * 创建时间
     */
    private Date createTime;
    /**
     * 更新时间
     */
    private Date updateTime;
    /**
     * 是否删除
     */
    private String isDelete;
    /**
     * 备注
     */
    @TableField("`desc`")
    private String desc;
    @Override
    protected Serializable pkVal() {
        return this.id;
    }
}
screen-manage/src/main/java/com/moral/api/mapper/GovMonitorPointMapper.java
New file
@@ -0,0 +1,16 @@
package com.moral.api.mapper;
import com.moral.api.entity.GovMonitorPoint;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
 * <p>
 *  Mapper 接口
 * </p>
 *
 * @author moral
 * @since 2021-09-09
 */
public interface GovMonitorPointMapper extends BaseMapper<GovMonitorPoint> {
}
screen-manage/src/main/java/com/moral/api/service/GovMonitorPointService.java
New file
@@ -0,0 +1,67 @@
package com.moral.api.service;
import com.moral.api.entity.GovMonitorPoint;
import com.baomidou.mybatisplus.extension.service.IService;
import org.springframework.transaction.annotation.Transactional;
import java.util.Map;
/**
 * <p>
 *  服务类
 * </p>
 *
 * @author moral
 * @since 2021-09-09
 */
public interface GovMonitorPointService extends IService<GovMonitorPoint> {
    /**
      *@Description: 根据条件查询政府站点信息
      *@Param: [map]
      *@return: java.util.Map<java.lang.String,java.lang.Object>
      *@Author: lizijie
      *@Date: 2021/9/9 11:28
     **/
    Map<String,Object> getDataByCondition(Map map);
    /**
      *@Description: 新增政府站点
      *@Param: [govMonitorPoint]
      *@return: void
      *@Author: lizijie
      *@Date: 2021/9/9 15:09
     **/
    @Transactional
    void insert(GovMonitorPoint govMonitorPoint);
    /**
      *@Description: 更新政府站点
      *@Param: [govMonitorPoint]
      *@return: void
      *@Author: lizijie
      *@Date: 2021/9/10 10:10
     **/
    @Transactional
    void update(GovMonitorPoint govMonitorPoint);
    /**
      *@Description: 删除政府站点
      *@Param: [id]
      *@return: void
      *@Author: lizijie
      *@Date: 2021/9/10 13:11
     **/
    @Transactional
    void delete(Integer id);
    /**
      *@Description: 通过id获取政府站点信息
      *@Param: [id]
      *@return: com.moral.api.entity.GovMonitorPoint
      *@Author: lizijie
      *@Date: 2021/9/9 16:35
     **/
    GovMonitorPoint selectGovMonitorPointInfoById(int id);
}
screen-manage/src/main/java/com/moral/api/service/impl/GovMonitorPointServiceImpl.java
New file
@@ -0,0 +1,222 @@
package com.moral.api.service.impl;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.moral.api.entity.GovMonitorPoint;
import com.moral.api.entity.SysArea;
import com.moral.api.mapper.GovMonitorPointMapper;
import com.moral.api.mapper.SysAreaMapper;
import com.moral.api.service.GovMonitorPointService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.moral.api.util.LogUtils;
import com.moral.constant.Constants;
import com.moral.constant.RedisConstants;
import com.moral.constant.ResponseCodeEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Field;
import java.text.SimpleDateFormat;
import java.util.*;
/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author moral
 * @since 2021-09-09
 */
@Service
public class GovMonitorPointServiceImpl extends ServiceImpl<GovMonitorPointMapper, GovMonitorPoint> implements GovMonitorPointService {
    @Autowired(required = false)
    private GovMonitorPointMapper govMonitorPointMapper;
    @Autowired(required = false)
    private SysAreaMapper sysAreaMapper;
    @Autowired(required = false)
    private RedisTemplate redisTemplate;
    @Autowired
    private LogUtils logUtils;
    /*
     * 从redis获取设备信息
     * */
    private Map<String, Object> getGovMonitorPointInfoFromRedis(String id) {
        return (Map<String, Object>) redisTemplate.opsForHash().get(RedisConstants.GOV_MONITOR_POINT, id);
    }
    /*
     * 设备信息存入redis
     */
    private void setGovMonitorPointInfoToRedis(String id, GovMonitorPoint govMonitorPointInfo) {
        redisTemplate.opsForHash().put(RedisConstants.GOV_MONITOR_POINT, id, govMonitorPointInfo);
    }
    /*
     * 从redis删除设备信息
     */
    private void delGovMonitorPointInfoFromRedis(String id) {
        redisTemplate.opsForHash().delete(RedisConstants.GOV_MONITOR_POINT, id);
    }
    @Override
    public Map<String, Object> getDataByCondition(Map map) {
        Map<String,Object> resultMap = new HashMap<>();
        if (!map.containsKey("current")||!map.containsKey("size")){
            resultMap.put("code",ResponseCodeEnum.PARAMETERS_IS_MISSING.getCode());
            resultMap.put("msg",ResponseCodeEnum.PARAMETERS_IS_MISSING.getMsg());
            return resultMap;
        }
        int current = Integer.parseInt(map.get("current").toString());
        int size = Integer.parseInt(map.get("size").toString());
        Page<GovMonitorPoint> page = new Page<>(current,size);
        QueryWrapper<GovMonitorPoint> wrapper_Condition = new QueryWrapper<>();
        wrapper_Condition.eq("is_delete",Constants.NOT_DELETE);
        if (!ObjectUtils.isEmpty(map.get("name"))){
            wrapper_Condition.like("name",map.get("name").toString());
        }
        if (!ObjectUtils.isEmpty(map.get("stationLevel"))){
            wrapper_Condition.like("station_level",map.get("stationLevel").toString());
        }
        wrapper_Condition.orderByDesc("create_time");
        Page resultPage = govMonitorPointMapper.selectPage(page,wrapper_Condition);
        int totalNumber = govMonitorPointMapper.selectCount(wrapper_Condition);
        List<GovMonitorPoint> govMonitorPoints = resultPage.getRecords();
        SimpleDateFormat SDF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        List<Map<String,Object>> govMonitorPointList = new ArrayList<>();
        for (GovMonitorPoint govMonitorPoint:govMonitorPoints) {
            Map govMonitorPointMap = JSON.parseObject(JSON.toJSONString(govMonitorPoint),Map.class);
            String createTime = SDF.format(govMonitorPoint.getCreateTime());
            String updateTime = SDF.format(govMonitorPoint.getUpdateTime());
            govMonitorPointMap.put("createTime",createTime);
            govMonitorPointMap.put("updateTime",updateTime);
            String position = "";
            if (!ObjectUtils.isEmpty(govMonitorPoint.getProvinceCode())){
                QueryWrapper<SysArea> wrapper_province = new QueryWrapper<>();
                wrapper_province.eq("area_code",govMonitorPoint.getProvinceCode());
                SysArea sysArea_provice = sysAreaMapper.selectOne(wrapper_province);
                if (!ObjectUtils.isEmpty(sysArea_provice)){
                    position = position+sysArea_provice.getAreaName();
                    if (!ObjectUtils.isEmpty(govMonitorPoint.getCityCode())){
                        QueryWrapper<SysArea> wrapper_city = new QueryWrapper<>();
                        wrapper_city.eq("area_code",govMonitorPoint.getCityCode());
                        SysArea sysArea_city = sysAreaMapper.selectOne(wrapper_city);
                        if (!ObjectUtils.isEmpty(sysArea_city)){
                            position = position+"/"+sysArea_city.getAreaName();
                            if (!ObjectUtils.isEmpty(govMonitorPoint.getAreaCode())){
                                QueryWrapper<SysArea> wrapper_area = new QueryWrapper<>();
                                wrapper_area.eq("area_code",govMonitorPoint.getAreaCode());
                                SysArea sysArea_area = sysAreaMapper.selectOne(wrapper_area);
                                if (!ObjectUtils.isEmpty(sysArea_area)){
                                    position = position+"/"+sysArea_area.getAreaName();
                                }
                            }
                        }
                    }
                }
            }
            govMonitorPointMap.put("position",position);
            govMonitorPointList.add(govMonitorPointMap);
        }
        resultMap.put("govMonitorPointList",govMonitorPointList);
        resultMap.put("totalNumber",totalNumber);
        resultMap.put("current",current);
        int totalPageNumber = totalNumber/size;
        if(totalNumber%size != 0){
            totalPageNumber += 1;
        }
        resultMap.put("totalPageNumber",totalPageNumber);
        return resultMap;
    }
    @Transactional
    @Override
    public void insert(GovMonitorPoint govMonitorPoint) {
        int count = govMonitorPointMapper.insert(govMonitorPoint);
        //数据插入redis
        setGovMonitorPointInfoToRedis(govMonitorPoint.getId().toString(),selectGovMonitorPointInfoById(govMonitorPoint.getId()));
        if (count > 0){
            //操作日志记录
            HttpServletRequest request = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();
            StringBuilder content = new StringBuilder();
            content.append("添加了政府站点:").append("id:").append(govMonitorPoint.getId()+";").append(govMonitorPoint.getName()+";").append(":").append("guid:").append(govMonitorPoint.getGuid()+";");
            logUtils.saveOperationForManage(request, content.toString(), Constants.INSERT_OPERATE_TYPE);
        }
    }
    @Transactional
    @Override
    public void update(GovMonitorPoint govMonitorPoint) {
        Integer id = govMonitorPoint.getId();
        GovMonitorPoint oldGovMonitorPoint = govMonitorPointMapper.selectById(id);
        govMonitorPointMapper.updateById(govMonitorPoint);
        //删除redis
        delGovMonitorPointInfoFromRedis(id.toString());
        //更新redis
        setGovMonitorPointInfoToRedis(id.toString(),selectGovMonitorPointInfoById(id));
        //操作日志记录
        HttpServletRequest request = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();
        StringBuilder content = new StringBuilder();
        content.append("修改了政府站点:").append("id:").append(govMonitorPoint.getId()+";");
        if (!ObjectUtils.isEmpty(govMonitorPoint.getGuid())){
            content.append("guid:").append(oldGovMonitorPoint.getGuid()).append("->").append(govMonitorPoint.getGuid()).append(";");
        }
        if (!ObjectUtils.isEmpty(govMonitorPoint.getName())){
            content.append("name:").append(oldGovMonitorPoint.getName()).append("->").append(govMonitorPoint.getName()).append(";");
        }
        if (!ObjectUtils.isEmpty(govMonitorPoint.getLongitude())){
            content.append("longitude:").append(oldGovMonitorPoint.getLongitude()).append("->").append(govMonitorPoint.getLongitude()).append(";");
        }
        if (!ObjectUtils.isEmpty(govMonitorPoint.getLatitude())){
            content.append("latitude:").append(oldGovMonitorPoint.getLatitude()).append("->").append(govMonitorPoint.getLatitude()).append(";");
        }
        if (!ObjectUtils.isEmpty(govMonitorPoint.getProvinceCode())){
            content.append("provinceCode:").append(oldGovMonitorPoint.getProvinceCode()).append("->").append(govMonitorPoint.getProvinceCode()).append(";");
        }
        if (!ObjectUtils.isEmpty(govMonitorPoint.getCityCode())){
            content.append("cityCode:").append(oldGovMonitorPoint.getCityCode()).append("->").append(govMonitorPoint.getCityCode()).append(";");
        }
        if (!ObjectUtils.isEmpty(govMonitorPoint.getAreaCode())){
            content.append("areaCode:").append(oldGovMonitorPoint.getAreaCode()).append("->").append(govMonitorPoint.getAreaCode()).append(";");
        }
        if (!ObjectUtils.isEmpty(govMonitorPoint.getStationLevel())){
            content.append("stationLevel:").append(oldGovMonitorPoint.getStationLevel()).append("->").append(govMonitorPoint.getStationLevel()).append(";");
        }
        if (!ObjectUtils.isEmpty(govMonitorPoint.getDesc())){
            content.append("desc:").append(oldGovMonitorPoint).append("->").append(govMonitorPoint.getDesc()).append(";");
        }
        logUtils.saveOperationForManage(request, content.toString(), Constants.UPDATE_OPERATE_TYPE);
    }
    @Override
    public void delete(Integer id) {
        UpdateWrapper<GovMonitorPoint> wrapper_delete = new UpdateWrapper<>();
        wrapper_delete.eq("id",id).set("is_delete",Constants.DELETE);
        govMonitorPointMapper.update(null,wrapper_delete);
        //删除redis
        delGovMonitorPointInfoFromRedis(id.toString());
        //操作日志记录
        HttpServletRequest request = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();
        StringBuilder content = new StringBuilder();
        content.append("删除了设备:").append("id:").append(id).append(";");
        logUtils.saveOperationForManage(request, content.toString(), Constants.DELETE_OPERATE_TYPE);
    }
    @Override
    public GovMonitorPoint selectGovMonitorPointInfoById(int id) {
        GovMonitorPoint govMonitorPoint = govMonitorPointMapper.selectById(id);
        return govMonitorPoint;
    }
}
screen-manage/src/main/resources/mapper/GovMonitorPointMapper.xml
New file
@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.moral.api.mapper.GovMonitorPointMapper">
        <!-- 通用查询映射结果 -->
        <resultMap id="BaseResultMap" type="com.moral.api.entity.GovMonitorPoint">
                    <id column="id" property="id" />
                    <result column="gov_code" property="govCode" />
                    <result column="name" property="name" />
                    <result column="longitude" property="longitude" />
                    <result column="latitude" property="latitude" />
                    <result column="province_code" property="provinceCode" />
                    <result column="city_code" property="cityCode" />
                    <result column="area_code" property="areaCode" />
                    <result column="gov_type" property="govType" />
                    <result column="create_time" property="createTime" />
                    <result column="update_time" property="updateTime" />
                    <result column="is_delete" property="isDelete" />
                    <result column="desc" property="desc" />
        </resultMap>
</mapper>