package com.hxzk.gps.service.impl.Track; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.hxzk.gps.controller.Track.dto.TrackView; import com.hxzk.gps.controller.Track.dto.TableSearchResult.TableSearchResult; import com.hxzk.gps.entity.Loragateway.TbLoragateway; import com.hxzk.gps.entity.Map.TbMarsHomeset; import com.hxzk.gps.entity.Track.TbGpsTrack; import com.hxzk.gps.entity.Track.TbTrack; import com.hxzk.gps.mapper.Track.TbTrackMapper; import com.hxzk.gps.result.*; import com.hxzk.gps.service.Map.TbMarsHomesetService; import com.hxzk.gps.service.Track.TbTrackService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.hxzk.gps.util.GetUser.UserInfoUtil; import com.hxzk.gps.util.GnssToXY; import com.hxzk.gps.util.MessageUtils.MessageUtils; import com.hxzk.gps.util.Time.TimeUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.Duration; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.*; /** *

* 服务实现类 *

* * @author YuZhiTong * @since 2025-05-26 */ @Service public class TbTrackServiceImpl extends ServiceImpl implements TbTrackService { @Autowired TbTrackMapper tbTrackMapper; @Autowired TbMarsHomesetService marsHomesetService; @Override public ResultTable FindTrackInfo(TableSearchResult TableSearchResult) { if (TableSearchResult.getTrack().getTime() == null){ TableSearchResult.getTrack().setTime(TimeUtil.GetYearMonthDay()); }else{ TableSearchResult.getTrack().setTime(TimeUtil.ZhuanDate(TableSearchResult.getTrack().getTime())); } PageHelper.startPage(TableSearchResult.getTableList().getPageNum(),TableSearchResult.getTableList().getPageSize()); PageInfo info = new PageInfo<>(tbTrackMapper.FindTrackInfo(UserInfoUtil.getUserCompany(), TableSearchResult.getTrack().getTime(),TableSearchResult.getTrack().getTagid())); table achortable = new table<>(info.getList(),TableSearchResult.getTableList().getPageNum(),TableSearchResult.getTableList().getPageSize(),info.getTotal()); return ListDataResult.resultTableSuccess(achortable, MessageUtils.getMessage("Success")); } @Override public TrackResultTable FindTrackView(TrackView trackView) throws ParseException { SimpleDateFormat outputFormat = new SimpleDateFormat("yyyyMMdd"); String trackTime = TimeUtil.ZhuanDate(trackView.time[0]); Date date2 = outputFormat.parse(trackTime); String trackTimes = outputFormat.format(date2); String startTime = TimeUtil.ZhuanTime(trackView.time[0]); String stopTime = TimeUtil.ZhuanTime(trackView.time[1]); TbTrack track = new TbTrack(); track.setTime(trackTimes); track.setBaoliu1(startTime); track.setBaoliu2(stopTime); track.setTagid(trackView.getTagid()); List tbTracks = tbTrackMapper.FindTrackView(track); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("company",UserInfoUtil.getUserCompany()); TbMarsHomeset marsHomeset = marsHomesetService.getBaseMapper().selectOne(queryWrapper); Integer distance = Integer.valueOf(marsHomeset.getDistance()); if (tbTracks.size() > 0){ Tracktable table =new Tracktable(addHashMap(tbTracks,distance*100, Integer.parseInt(marsHomeset.getTime())),1,tbTracks.size(),Long.valueOf(tbTracks.size())); return ListDataResult.resultTrackTableSuccess(table, MessageUtils.getMessage("Success")); }else { return ListDataResult.resultTrackTableerror(MessageUtils.getMessage("TrackNull")); } } private Map> addHashMap(List list, int pointDis, int timeC) { String latPast = ""; String lonPast = ""; String timePast = ""; Map> map = new HashMap<>(); List vector = null; // 用于存储当前组的数据 int key = 0; // 遍历所有的点数据 for (TbTrack info : list) { String lat = info.getBaoliu2(); // 纬度 String lon = info.getBaoliu3(); // 经度 String time = info.getTime(); // 时间 // 如果当前点与前一个点在阈值范围内,继续添加到当前组 if (latPast.length()>0 && timePast.length()>0) { int distance = GnssToXY.distance(lon, lat, lonPast, latPast); // 计算距离 long cha = calculateTimeDifferenceInSeconds(timePast, time); // 计算时间差 if (distance < pointDis && cha < timeC) { vector.add(info); // 添加当前点到当前组 } else if (cha > timeC){ // 如果当前点超出时间阈值,存储当前组,并开始新的组 vector = new ArrayList<>(); // 创建新的组 map.put(key, vector); vector.add(info); // 添加当前点到新组 key++; }else if (distance > pointDis && cha < timeC){ vector = new ArrayList<>(); // 创建新的组 map.put(key, vector); vector.add(info); // 添加当前点到新组 key++; // System.out.println(lat+"----"+lon+"|"+latPast+"----"+lonPast+"--"+i++); } } else { // 第一个点,初始化一个新组 vector = new ArrayList<>(); vector.add(info); map.put(key, vector); key++; } latPast = lat; lonPast = lon; timePast = time; } return map; } // 封装成一个方法,计算时间差(以秒为单位) public static long calculateTimeDifferenceInSeconds(String timeStr1, String timeStr2) { // 定义日期时间格式 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"); // 将字符串转换为 LocalDateTime 对象 LocalDateTime time1 = LocalDateTime.parse(timeStr1, formatter); LocalDateTime time2 = LocalDateTime.parse(timeStr2, formatter); // 计算时间差 Duration duration = Duration.between(time1, time2); // 返回时间差的秒数 return duration.getSeconds(); } }