wzp
2025-09-03 a8553f9ef7e165b6348243af91caad1a987f8f9c
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/VehicleGpsController.java
@@ -1,7 +1,11 @@
package com.ruoyi.web.controller.system;
import java.util.List;
import java.util.*;
import java.text.SimpleDateFormat;
import java.text.ParseException;
import com.ruoyi.system.domain.*;
import com.ruoyi.system.service.*;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
@@ -18,8 +22,6 @@
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.system.domain.VehicleGps;
import com.ruoyi.system.service.IVehicleGpsService;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.core.page.TableDataInfo;
@@ -32,16 +34,123 @@
    @Autowired
    private IVehicleGpsService vehicleGpsService;
    @Anonymous
    /**
    @Autowired
    private ITbVehicleOrderService tbVehicleOrderService;
    @Autowired
    private IDispatchOrdService dispatchOrdService;
    @Autowired
    private ITbOrdersService tbOrdersService;
    @Autowired
    private IGpsCollectService gpsCollectService;
    @Autowired
    private IVehicleInfoService vehicleInfoService;
    @Autowired
    private ICmsGpsCollectService cmsGpsCollectService;
   /**
     * 查询车辆GPS坐标列表
     */
     */
    @PreAuthorize("@ss.hasPermi('system:gps:list')")
    @GetMapping("/list")
    public TableDataInfo list(VehicleGps vehicleGps) {
        startPage();
//        String vehicleNo=vehicleGps.getVehicleNo();
//        String beginTime=vehicleGps.getBeginTime();
//        String endTime=vehicleGps.getEndTime();
//        return this.getAnonymousTracks(vehicleNo,beginTime,endTime);
//
//        // 设置按时间倒序排序
        vehicleGps.setOrderByColumn("collect_time");
        vehicleGps.setIsAsc("desc");
        List<VehicleGps> list = vehicleGpsService.selectVehicleGpsList(vehicleGps);
        return getDataTable(list);
    }
    @Anonymous(needSign=true)
    @GetMapping("/anonymousList")
    public TableDataInfo anonymousList(VehicleGps vehicleGps) {
        if(vehicleGps.getOrderId()==null)
        {
            return getDataTable(new ArrayList<>());
        }
        //查询订单
        TbVehicleOrder tbVehicleOrder = tbVehicleOrderService.selectTbVehicleOrderById(vehicleGps.getOrderId());
        if(tbVehicleOrder==null)
        {
            return getDataTable(new ArrayList<>());
        }
        if(!Objects.equals(tbVehicleOrder.getStatus(), "0"))
        {
            //非0表示订单完成了。
            try {
                TbOrders tbOrders = tbOrdersService.selectTbOrdersByOrderID(vehicleGps.getOrderId());
                if (tbOrders == null) {
                    return getDataTable(new ArrayList<>());
                }
                DispatchOrd dispatchOrd = dispatchOrdService.selectDispatchOrdByServiceOrdIDDt(tbOrders.getServiceOrdID());
                if (dispatchOrd == null) {
                    return getDataTable(new ArrayList<>());
                }
                String vehicleNo = tbVehicleOrder.getVehicle();
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                String beginTime= sdf.format(dispatchOrd.getDispatchOrdStartDate());
                String endTime=  sdf.format(dispatchOrd.getDispatchOrdUpdateTime());
                //如果订单没完成, endTime为当前时间;如何订单已经完成了,用订单的结束时间。
                return this.getAnonymousTracks(vehicleNo,beginTime,endTime);
//                Map<String, Object> params = new HashMap<>();
//                params.put("beginTime", dispatchOrd.getDispatchOrdStartDate());
//                params.put("endTime", dispatchOrd.getDispatchOrdUpdateTime());
//
//                vehicleGps.setVehicleNo(tbVehicleOrder.getVehicle());
//                startPage();
//                // 设置按时间倒序排序
//                vehicleGps.setOrderByColumn("collect_time");
//                vehicleGps.setIsAsc("desc");
//                List<VehicleGps> list = vehicleGpsService.selectVehicleGpsList(vehicleGps);
//                return getDataTable(list);
            }
            catch (Exception ex)
            {
                logger.error("已完成的订单查询地图异常:{}",ex.getMessage());
                return getDataTable(new ArrayList<>());
            }
        }else{
            TbOrders tbOrders = tbOrdersService.selectTbOrdersByOrderID(vehicleGps.getOrderId());
            if (tbOrders == null) {
                return getDataTable(new ArrayList<>());
            }
            DispatchOrd dispatchOrd = dispatchOrdService.selectDispatchOrdByServiceOrdIDDt(tbOrders.getServiceOrdID());
            if (dispatchOrd == null) {
                return getDataTable(new ArrayList<>());
            }
            String vehicleNo = tbVehicleOrder.getVehicle();
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String beginTime= sdf.format(dispatchOrd.getDispatchOrdStartDate());
            String endTime=  sdf.format(new Date());
            logger.info("查询车辆轨迹:车辆号:{}, 开始时间:{}, 结束时间:{}", vehicleNo, beginTime, endTime);
            return this.getAnonymousTracks(vehicleNo,beginTime,endTime);
//
//        vehicleGps.setVehicleNo(tbVehicleOrder.getVehicle());
//        startPage();
//        // 设置按时间倒序排序
//        vehicleGps.setOrderByColumn("collect_time");
//        vehicleGps.setIsAsc("desc");
//        List<VehicleGps> list = vehicleGpsService.selectVehicleGpsList(vehicleGps);
//        return getDataTable(list);
        }
    }
    /**
@@ -51,6 +160,9 @@
    @Log(title = "车辆GPS坐标", businessType = BusinessType.EXPORT)
    @GetMapping("/export")
    public AjaxResult export(VehicleGps vehicleGps) {
        // 设置按时间倒序排序
        vehicleGps.setOrderByColumn("collect_time");
        vehicleGps.setIsAsc("desc");
        List<VehicleGps> list = vehicleGpsService.selectVehicleGpsList(vehicleGps);
        ExcelUtil<VehicleGps> util = new ExcelUtil<VehicleGps>(VehicleGps.class);
        return util.exportExcel(list, "车辆GPS坐标数据");
@@ -94,4 +206,167 @@
    public AjaxResult remove(@PathVariable Long[] gpsIds) {
        return toAjax(vehicleGpsService.deleteVehicleGpsByIds(gpsIds));
    }
    /**
     * 查询车辆历史轨迹
     */
    @PreAuthorize("@ss.hasPermi('system:gps:query')")
    @GetMapping("/tracks")
    public TableDataInfo getTracks(String vehicleNo, String beginTime, String endTime) {
        return getAnonymousTracks(vehicleNo, beginTime, endTime);
    }
    /**
     * 匿名查询车辆历史轨迹
     */
    @Anonymous()
    @GetMapping("/anonymousTracks")
    public TableDataInfo getAnonymousTracks(String vehicleNo, String beginTime, String endTime) {
        try {
            // 通过车牌号获取设备ID
            VehicleInfo vehicleInfo = vehicleInfoService.selectVehicleInfoByPlateNumber(vehicleNo);
            if (vehicleInfo == null) {
                // throw new Error("未找到该车辆对应的GPS设备");
                return getDataTable(new ArrayList<>());
            }
            // 处理开始时间
                beginTime = beginTime.replace("T", " ");
                if (beginTime.split(":").length == 2) { // 只有小时和分钟
                    beginTime += ":00";
                }
                // 处理结束时间
//                endTime = endTime.replace("T", " ").replace(" ","%20");
            endTime = endTime.replace("T", " ");
                if (endTime.split(":").length == 2) { // 只有小时和分钟
                    endTime += ":59";
                }
            List<GpsTrackPoint> trackPoints = new ArrayList<>();
            //如果平台是cms,则调用cms的接口
            if(vehicleInfo.getPlatformCode().equals("CMS"))
            {
                CmsTrackDetailResponse response = cmsGpsCollectService.queryTrackDetail(
                    vehicleInfo.getDeviceId(),  // 设备号
                    beginTime,                  // 开始时间
                    endTime,                    // 结束时间
                    null,                       // 距离(可选)
                    null,                       // 停车时长(可选)
                    1,                          // 解析地理位置
                    null,                       // 当前页码(可选)
                    null,                       // 每页记录数(可选)
                    2                           // 地图类型(2:百度地图)
                );
                if (response.getResult() != 0) {
                    throw new Error("查询CMS轨迹失败");
                }
                // 转换CMS轨迹点为统一格式
                if (response.getTracks() != null) {
                    for (CmsTrackDetailResponse.CmsTrackPoint point : response.getTracks()) {
                        GpsTrackPoint trackPoint = new GpsTrackPoint();
                        trackPoint.setVehicleNo(point.getVid());
                        trackPoint.setDeviceId(point.getId());
                        //经度纬度为空时,跳过
                        if(point.getMlng()==null || point.getMlat()==null)
                        {
                            continue;
                        }
                        // 经度,使用三元运算符
                        trackPoint.setLongitude(point.getMlng() != null ? Double.parseDouble(point.getMlng()) : 0.0);
                        // 纬度,使用三元运算符
                        trackPoint.setLatitude(point.getMlat() != null ? Double.parseDouble(point.getMlat()) : 0.0);
                        // 速度,直接使用int转double
                        trackPoint.setSpeed(point.getSp() > 0 ? (double)point.getSp() : 0.0);
                        // 方向,使用三元运算符处理
                        trackPoint.setCourse(point.getFt() > 0 ? point.getFt() : 0);
                        // ACC状态,使用三元运算符处理
                        trackPoint.setAccStatus(point.getAc() > 0 ? point.getAc() : 0);
                        // 在线状态,使用三元运算符处理
                        trackPoint.setOnlineStatus(point.getNet() > 0 ? point.getNet() : 0);
                        trackPoint.setAddress(point.getPs());
                        // 上报时间,直接使用字符串
                        trackPoint.setReportTime(point.getGt() != null ? point.getGt() : new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
                        trackPoints.add(trackPoint);
                    }
                }
            }
            else {
                // 构建查询请求
                GpsTrackQueryRequest request = new GpsTrackQueryRequest();
                request.setDeviceid(vehicleInfo.getDeviceId());
                request.setBegintime(beginTime);
                request.setEndtime(endTime);
                request.setTimezone(8); // 中国时区
                logger.info("查询车辆轨迹:车辆号:{}, 设备ID:{}, 开始时间:{}, 结束时间:{}", vehicleNo, vehicleInfo.getDeviceId(), beginTime, endTime);
                // 查询轨迹
                GpsTrackQueryResponse response = gpsCollectService.queryTracks(request);
                if (response.getStatus() != 0) {
                    logger.error("查询轨迹失败,状态码:{}, 错误信息:{}", response.getStatus(), response.getCause());
                    throw new Error("查询轨迹失败:" + (response.getCause() != null ? response.getCause() : "未知错误"));
                }
                // 转换GPS51轨迹点为统一格式
                if (response.getRecords() != null) {
                    for (GpsTrackPoint point : response.getRecords()) {
                        GpsTrackPoint trackPoint = new GpsTrackPoint();
                        trackPoint.setVehicleNo(vehicleNo);
                        trackPoint.setDeviceId(vehicleInfo.getDeviceId());
                        trackPoint.setLongitude(point.getLongitude());    // 经度
                        trackPoint.setLatitude(point.getLatitude());    // 纬度
                        trackPoint.setSpeed(point.getSpeed());      // 速度
                        trackPoint.setCourse(point.getCourse());    // 方向
                        trackPoint.setReportTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(point.getUpdatetime()))); // 上报时间
                        trackPoints.add(trackPoint);
                    }
                }
            }
            //转换成List<VehicleGps>
            List<VehicleGps> vehicleGpsList = new ArrayList<>();
            for(GpsTrackPoint trackPoint : trackPoints)
            {
                VehicleGps vehicleGps = new VehicleGps();
                vehicleGps.setVehicleNo(trackPoint.getVehicleNo());
                vehicleGps.setDeviceId(trackPoint.getDeviceId());
                vehicleGps.setLongitude(trackPoint.getLongitude());
                vehicleGps.setLatitude(trackPoint.getLatitude());
                vehicleGps.setSpeed(trackPoint.getSpeed());
                //方向
                vehicleGps.setDirection(Double.valueOf(trackPoint.getCourse()));
                //地址
                vehicleGps.setAddress(trackPoint.getAddress());
                vehicleGps.setCollectTime(trackPoint.getReportTime());
                //GPS平台处理时间
                vehicleGps.setPlatformProcessTime(trackPoint.getReportTime());
                vehicleGps.setDeviceReportTime(trackPoint.getReportTime());
                vehicleGpsList.add(vehicleGps);
            }
            //时间倒序排序
            vehicleGpsList.sort(Comparator.comparing(VehicleGps::getDeviceReportTime).reversed());
            //返回车辆Gps列表
            return getDataTable(vehicleGpsList);
            // return success(vehicleGpsList);
        } catch (Exception e) {
            logger.error("查询车辆轨迹异常", e);
            throw new Error("查询车辆轨迹失败:" + e.getMessage());
        }
    }