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; /** *

* 无人机秒数据表 服务实现类 *

* * @author moral * @since 2021-08-31 */ @Service public class HistorySecondUavServiceImpl extends ServiceImpl implements HistorySecondUavService { @Autowired HistorySecondUavMapper historySecondUavMapper; @Autowired OrganizationService organizationService; @Autowired SpecialDeviceService specialDeviceService; @Override public List queryDate(Integer organizationId) { //构造查询条件 QueryWrapper queryWrapper = new QueryWrapper<>(); //获取子组织id List children = organizationService.getChildrenOrganizationsById(organizationId); List 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 historySecondUavs = historySecondUavMapper.selectList(queryWrapper); //结果转为Date集合 List result = new ArrayList<>(); for (HistorySecondUav historySecondUav : historySecondUavs) { result.add(historySecondUav.getBatch()); } return result; } @Override public List queryTimeSlot(UAVQueryTimeSlotForm form) { //取参 Integer organizationId = form.getOrganizationId(); Date startDate = form.getStartDate(); Date endDate = form.getEndDate(); QueryWrapper wrapper = new QueryWrapper<>(); //获取子组织id List children = organizationService.getChildrenOrganizationsById(organizationId); List 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 historySecondUavs = historySecondUavMapper.selectList(wrapper); //根据batch进行分批 Map> batchMap = new LinkedHashMap<>();//key为batch的string for (HistorySecondUav historySecondUav : historySecondUavs) { //获取batch对应的数据集合 List list = batchMap.get(historySecondUav.getBatch().toString()); if(list!=null){ list.add(historySecondUav); }else{ ArrayList newList = new ArrayList<>(); newList.add(historySecondUav); batchMap.put(historySecondUav.getBatch().toString(),newList); } } //去除少于30条数据的集合 batchMap.values().removeIf(new Predicate>() { @Override public boolean test(List historySecondUavs) { if(historySecondUavs.size()<=30) return true; return false; } }); //根据mac进行分类 Map>>> macBatchMap = new LinkedHashMap<>();//key为mac //遍历batchMap将mac提取出来,作为macBatchMap的key,batch和数据map的数据集合放入value batchMap.forEach((key,value)->{ String mac = value.get(0).getMac(); List>> maps = macBatchMap.get(mac); if(maps!=null){ Map> map = new LinkedHashMap<>(); map.put(key,value); maps.add(map); }else{ List>> list = new ArrayList<>(); Map> map = new LinkedHashMap<>(); map.put(key,value); list.add(map); macBatchMap.put(value.get(0).getMac(),list); } }); //封装返回数据 List dtos = new ArrayList<>(); macBatchMap.forEach((key,value)->{ UAVQueryTimeSlotDTO dto = new UAVQueryTimeSlotDTO(); List> 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 dateMap = new HashMap<>(); dateMap.put("startTime",slotStartDate); dateMap.put("endTime",slotEndDate); timeSlots.add(dateMap); }); }); dto.setTimeSlot(timeSlots); dtos.add(dto); }); return dtos; } }