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();
}
}