zhitong.yu
7 天以前 7fc9c42987a13c1d8d2159591a5803e70518827f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
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();
    }
}