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.*;
|
|
/**
|
* <p>
|
* 服务实现类
|
* </p>
|
*
|
* @author YuZhiTong
|
* @since 2025-05-26
|
*/
|
@Service
|
public class TbTrackServiceImpl extends ServiceImpl<TbTrackMapper, TbTrack> 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<TbTrack> info = new PageInfo<>(tbTrackMapper.FindTrackInfo(UserInfoUtil.getUserCompany(), TableSearchResult.getTrack().getTime(),TableSearchResult.getTrack().getTagid()));
|
table<TbTrack> 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<TbTrack> 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<Integer, List<TbTrack>> addHashMap(List<TbTrack> list, int pointDis, int timeC) {
|
String latPast = "";
|
String lonPast = "";
|
String timePast = "";
|
Map<Integer, List<TbTrack>> map = new HashMap<>();
|
List<TbTrack> 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();
|
}
|
}
|