package com.moral.api.service.impl; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.moral.api.entity.SpecialDevice; import com.moral.api.entity.SpecialDeviceHistory; import com.moral.api.mapper.HistorySecondCruiserMapper; 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.util.DateUtils; 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; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; /** *

* 服务实现类 *

* * @author moral * @since 2021-08-18 */ @Service public class SpecialDeviceServiceImpl extends ServiceImpl implements SpecialDeviceService { @Autowired private HistorySecondSpecialMapper historySecondSpecialMapper; @Autowired private SpecialDeviceHistoryService specialDeviceHistoryService; @Autowired OrganizationService organizationService; @Autowired SpecialDeviceMapper specialDeviceMapper; @Autowired private HistorySecondCruiserMapper historySecondCruiserMapper; @Autowired RedisTemplate redisTemplate; private final static Double dis = 50d; @Override public List> selectCruisers() { //获取当前用户信息 Map userInfo = (Map) TokenUtils.getUserInfo(); Map orgInfo = (Map) userInfo.get("organization"); Integer orgId = (Integer) orgInfo.get("id"); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.select("mac", "name") .eq("organization_id", orgId) .eq("special_type", Constants.SPECIAL_DEVICE_CRUISER) .eq("is_delete", Constants.NOT_DELETE); return specialDeviceHistoryService.listMaps(queryWrapper); } @Override public List> carTrajectory(Map params) { params.put("dateFormat", "%Y-%m-%d %H:%i:%s"); Map userInfo = (Map) TokenUtils.getUserInfo(); Map orgInfo = (Map) userInfo.get("organization"); Integer orgId = (Integer) orgInfo.get("id"); params.put("orgId", orgId); //从秒数据表获取走航车数据 List> data = historySecondSpecialMapper.getSpecialDeviceData(params); if (ObjectUtils.isEmpty(data)) { return data; } data.removeIf(o -> { Map value = JSONObject.parseObject(o.remove("value").toString(), Map.class); Object flylon = value.get("flylon"); Object flylat = value.get("flylat"); if (ObjectUtils.isEmpty(flylon) || ObjectUtils.isEmpty(flylat)) { return true; } double lon = Double.parseDouble(flylon.toString()); double lat = Double.parseDouble(flylat.toString()); if (lon < 70 || lon > 150 || lat < 20 || lat > 60) { return true; } o.putAll(value); return false; }); return filterData(data); } @Override public SpecialDevice getSpecialDeviceMapByMac(String mac) { QueryWrapper queryWrapper = new QueryWrapper(); queryWrapper.eq("mac", mac); queryWrapper.eq("is_delete", Constants.NOT_DELETE); SpecialDevice specialDevice = specialDeviceMapper.selectOne(queryWrapper); return specialDevice; } @Override public List getDatesByMac(String mac) { Map userInfo = (Map) TokenUtils.getUserInfo(); Map orgInfo = (Map) userInfo.get("organization"); Integer orgId = (Integer) orgInfo.get("id"); Map params = new HashMap<>(); params.put("orgId", orgId); params.put("mac", mac); Date start = DateUtils.addMonths(new Date(), -6); params.put("start", DateUtils.dateToDateString(start)); return historySecondCruiserMapper.getDates(params); } //根据距离筛选数据 private List> filterData(List> data) { List> result = new ArrayList<>(); result.add(data.remove(0)); for (Map map : data) { boolean flag = true; for (Map resultMap : result) { double lng1 = Double.parseDouble(map.get(Constants.SENSOR_CODE_LON).toString()); double lat1 = Double.parseDouble(map.get(Constants.SENSOR_CODE_LAT).toString()); double lng2 = Double.parseDouble(resultMap.get(Constants.SENSOR_CODE_LON).toString()); double lat2 = Double.parseDouble(resultMap.get(Constants.SENSOR_CODE_LAT).toString()); double distance = GeodesyUtils.getDistance(lat1, lng1, lat2, lng2); if (distance < dis) { flag = false; } } if (flag) { result.add(map); } } return result; } }