wzp
2025-05-23 53443db90d66094124dbbeebbcf763032a2333d0
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
package com.ruoyi.quartz.task;
 
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
 
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
 
import com.ruoyi.system.domain.GpsLastPosition;
import com.ruoyi.system.domain.GpsLastPositionRequest;
import com.ruoyi.system.domain.GpsLastPositionResponse;
import com.ruoyi.system.domain.VehicleGps;
import com.ruoyi.system.domain.VehicleInfo;
import com.ruoyi.system.service.IGpsCollectService;
import com.ruoyi.system.service.IVehicleGpsService;
import com.ruoyi.system.service.IVehicleInfoService;
 
/**
 * GPS同步定时任务
 */
@Component("gpsSyncTask")
public class GpsSyncTask {
 
    private static final Logger log = LoggerFactory.getLogger(GpsSyncTask.class);
 
    @Autowired
    private IGpsCollectService gpsCollectService;
 
    @Autowired
    private IVehicleInfoService vehicleInfoService;
 
    @Autowired
    private IVehicleGpsService vehicleGpsService;
 
    /**
     * 同步GPS位置
     */
    public void syncGpsData() {
        try {
            log.info("开始同步GPS数据...");
 
            // 1. 获取所有车辆信息
            List<VehicleInfo> vehicleList = vehicleInfoService.selectVehicleInfoList(new VehicleInfo());
 
            // 2. 获取所有车辆的GPS最后位置
            GpsLastPositionResponse gpsLastPositionResponse = gpsCollectService.getLastPosition(new GpsLastPositionRequest());
 
            // 3. 遍历车辆列表,获取每个车辆的GPS位置
            for (VehicleInfo vehicle : vehicleList) {
                if (vehicle.getDeviceId() != null && !vehicle.getDeviceId().isEmpty()) {
                    try {
                        // 获取车辆的最后位置
                        gpsLastPositionResponse.getRecords().stream()
                            .filter(e -> e.getDeviceid().equals(vehicle.getDeviceId()))
                            .forEach(record -> {
                                updateVehicleGpsPositions(vehicle, record);
                            });
                    } catch (Exception e) {
                        log.error("获取车辆[{}]GPS位置失败: {}", vehicle.getVehicleNo(), e.getMessage());
                    }
                }
            }
 
            log.info("GPS数据同步完成");
        } catch (Exception e) {
            log.error("GPS数据同步失败: {}", e.getMessage());
        }
    }
 
    /**
     * 更新车辆GPS位置信息
     */
    private void updateVehicleGpsPositions(VehicleInfo vehicle, GpsLastPosition position) {
        try {
            VehicleGps gps = new VehicleGps();
            gps.setVehicleId(vehicle.getVehicleId());
            gps.setDeviceId(vehicle.getDeviceId());
            gps.setLongitude(position.getCallon());
            gps.setLatitude(position.getCallat());
            gps.setAltitude(position.getAltitude());
            gps.setSpeed(position.getSpeed());
            gps.setDirection(Double.valueOf(position.getCourse()));
            
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 
            // 处理到达时间
            long arrivedTime = position.getArrivedtime();
            Date arrivedDate;
            if (arrivedTime > 0) {
                arrivedDate = new Date(arrivedTime);
                arrivedDate.setTime(arrivedDate.getTime() - 8 * 60 * 60 * 1000);
            } else {
                arrivedDate = new Date();
            }
            gps.setPlatformProcessTime(sdf.format(arrivedDate));
 
            // 设备上报时间
            long deviceTime = position.getDevicetime();
            Date date;
            if (deviceTime > 0) {
                date = new Date(deviceTime);
                date.setTime(date.getTime() - 8 * 60 * 60 * 1000);
            } else {
                date = arrivedDate;
            }
            gps.setDeviceReportTime(sdf.format(date));
            
            // 采集时间(使用设备上报时间)
            gps.setCollectTime(sdf.format(new Date()));
 
            // 保存GPS位置信息
            vehicleGpsService.insertVehicleGps(gps);
 
            log.info("车辆[{}]GPS位置已更新: 经度={}, 纬度={}, 设备时间={}, 处理时间={}",
                    vehicle.getVehicleNo(), position.getCallon(), position.getCallat(), 
                    gps.getDeviceReportTime(), gps.getPlatformProcessTime());
        } catch (Exception e) {
            log.error("更新车辆[{}]GPS位置失败: {}", vehicle.getVehicleNo(), e.getMessage());
        }
    }
}