package com.ruoyi.web.controller.system; import java.util.*; import java.text.SimpleDateFormat; import com.ruoyi.gps.domain.*; import com.ruoyi.gps.service.*; import com.ruoyi.system.service.*; import com.ruoyi.system.domain.*; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.ruoyi.common.annotation.Anonymous; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.common.core.page.TableDataInfo; /** * 车辆GPS坐标Controller */ @RestController @RequestMapping("/system/gps") public class VehicleGpsController extends BaseController { @Autowired private IVehicleGpsService vehicleGpsService; @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 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 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 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()); return this.getAnonymousTracks(vehicleNo,beginTime,endTime); // // vehicleGps.setVehicleNo(tbVehicleOrder.getVehicle()); // startPage(); // // 设置按时间倒序排序 // vehicleGps.setOrderByColumn("collect_time"); // vehicleGps.setIsAsc("desc"); // List list = vehicleGpsService.selectVehicleGpsList(vehicleGps); // return getDataTable(list); } } /** * 导出车辆GPS坐标列表 */ @PreAuthorize("@ss.hasPermi('system:gps:export')") @Log(title = "车辆GPS坐标", businessType = BusinessType.EXPORT) @GetMapping("/export") public AjaxResult export(VehicleGps vehicleGps) { // 设置按时间倒序排序 vehicleGps.setOrderByColumn("collect_time"); vehicleGps.setIsAsc("desc"); List list = vehicleGpsService.selectVehicleGpsList(vehicleGps); ExcelUtil util = new ExcelUtil(VehicleGps.class); return util.exportExcel(list, "车辆GPS坐标数据"); } /** * 获取车辆GPS坐标详细信息 */ @PreAuthorize("@ss.hasPermi('system:gps:query')") @GetMapping(value = "/{gpsId}") public AjaxResult getInfo(@PathVariable("gpsId") Long gpsId) { return success(vehicleGpsService.selectVehicleGpsById(gpsId)); } /** * 新增车辆GPS坐标 */ @PreAuthorize("@ss.hasPermi('system:gps:add')") @Log(title = "车辆GPS坐标", businessType = BusinessType.INSERT) @PostMapping public AjaxResult add(@RequestBody VehicleGps vehicleGps) { return toAjax(vehicleGpsService.insertVehicleGps(vehicleGps)); } /** * 修改车辆GPS坐标 */ @PreAuthorize("@ss.hasPermi('system:gps:edit')") @Log(title = "车辆GPS坐标", businessType = BusinessType.UPDATE) @PutMapping public AjaxResult edit(@RequestBody VehicleGps vehicleGps) { return toAjax(vehicleGpsService.updateVehicleGps(vehicleGps)); } /** * 删除车辆GPS坐标 */ @PreAuthorize("@ss.hasPermi('system:gps:remove')") @Log(title = "车辆GPS坐标", businessType = BusinessType.DELETE) @DeleteMapping("/{gpsIds}") 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", " ").replace(" ","%20"); if (beginTime.split(":").length == 2) { // 只有小时和分钟 beginTime += ":00"; } // 处理结束时间 endTime = endTime.replace("T", " ").replace(" ","%20"); if (endTime.split(":").length == 2) { // 只有小时和分钟 endTime += ":59"; } List 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); // 中国时区 // 查询轨迹 GpsTrackQueryResponse response = gpsCollectService.queryTracks(request); if (response.getStatus() != 0) { throw new Error("查询轨迹失败:" + 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 List 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()); } } }