xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/order/XpOrderClientFallbackFactory.java
@@ -6,6 +6,7 @@ import com.xiaopeng.api.dto.statistics.StatisticsQueryDTO; import com.xiaopeng.api.feignClient.order.XpOrderClient; import com.xiaopeng.api.model.order.XpOrder; import com.xiaopeng.api.vo.order.OrderTrajectoryVo; import com.xiaopeng.common.core.domain.R; import lombok.extern.slf4j.Slf4j; import org.springframework.cloud.openfeign.FallbackFactory; @@ -94,6 +95,13 @@ log.error("更新订单状态失败,原因: {}", cause.getMessage()); return R.fail("更新订单状态失败"); } @Override public R<String> saveVehicleLocation(OrderTrajectoryVo orderTrajectory) { log.error("保存订单轨迹数据失败,原因: {}", cause.getMessage()); return R.fail("保存订单轨迹数据失败"); } }; } } xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/order/XpOrderClient.java
@@ -6,6 +6,7 @@ import com.xiaopeng.api.dto.statistics.StatisticsQueryDTO; import com.xiaopeng.api.factory.order.XpOrderClientFallbackFactory; import com.xiaopeng.api.model.order.XpOrder; import com.xiaopeng.api.vo.order.OrderTrajectoryVo; import com.xiaopeng.common.core.domain.R; import com.xiaopeng.common.core.dto.ServiceNameConstantsEnum; import org.springframework.cloud.openfeign.FeignClient; @@ -111,6 +112,12 @@ @RequestParam Integer status); /** * 保存订单轨迹数据 * @param orderTrajectory * @return */ @PostMapping("/inner/v1/order/saveVehicleLocation") R<String> saveVehicleLocation(@RequestBody OrderTrajectoryVo orderTrajectory); } xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/order/OrderTrajectoryVo.java
New file @@ -0,0 +1,44 @@ package com.xiaopeng.api.vo.order; import com.xiaopeng.common.core.web.domain.MongoBaseModel; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; import org.springframework.data.mongodb.core.mapping.Document; @Data @AllArgsConstructor @NoArgsConstructor @Accessors(chain = true) public class OrderTrajectoryVo extends MongoBaseModel { /** * 订单id */ private Long orderId; /** * 经纬度 坐标 (104.45645456,34.41564654) */ private String location; /** * 方向角(0-359°) */ private Integer direction; /** * 速度 */ private Double speed; /** * 时间戳 毫秒 */ private Long locatetime; /** * 距离 米 */ private Double distance; } xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/controller/OrderMissionController.java
@@ -23,6 +23,7 @@ import com.xiaopeng.api.vo.automaticPilot.proto.down.cloudCreateOrder.TaskType; import com.xiaopeng.api.vo.automaticPilot.protobuf.*; import com.xiaopeng.api.vo.operation.RouteVo; import com.xiaopeng.api.vo.order.OrderTrajectoryVo; import com.xiaopeng.automaticPilot.util.XPUUtil; import com.xiaopeng.common.core.domain.R; import com.xiaopeng.common.core.enums.OrderStatusEnum; @@ -41,7 +42,7 @@ import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.HashMap; import java.util.Date;import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.LinkedBlockingQueue; @@ -418,6 +419,16 @@ dto.setDistance(10); dto.setDirection(60); xpPushMessageClient.pushOrderRoute(dto); //存储历史轨迹 OrderTrajectoryVo orderTrajectory = new OrderTrajectoryVo(); orderTrajectory.setOrderId(orderId); orderTrajectory.setLocation(longitude + "," + latitude); orderTrajectory.setDirection(dto.getDirection()); orderTrajectory.setSpeed(0D); orderTrajectory.setLocatetime(System.currentTimeMillis()); orderTrajectory.setCreateTime(new Date()); xpOrderClient.saveVehicleLocation(orderTrajectory); } //5秒钟循环一次 xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpOrderController.java
@@ -15,10 +15,7 @@ import com.xiaopeng.api.model.vehicleConvoy.XpVehicle; import com.xiaopeng.api.vo.automaticPilot.VehiclePosition; import com.xiaopeng.api.vo.operation.RouteVo; import com.xiaopeng.api.vo.order.FareBreakdownVo; import com.xiaopeng.api.vo.order.XpHistoryEndPointsVo; import com.xiaopeng.api.vo.order.XpHistoryStartPointsVo; import com.xiaopeng.api.vo.order.XpPointInfoVo; import com.xiaopeng.api.vo.order.*; import com.xiaopeng.common.core.constant.CacheConstants; import com.xiaopeng.common.core.domain.R; import com.xiaopeng.common.core.utils.WebUtils; @@ -43,6 +40,7 @@ import io.swagger.annotations.ApiParam; import lombok.RequiredArgsConstructor; import org.apache.poi.ss.usermodel.Workbook; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.data.mongodb.core.MongoTemplate; @@ -474,7 +472,9 @@ */ @ApiOperation(value = "订单车辆定位实时存储") @PostMapping("/inner/v1/order/saveVehicleLocation") public R<String> saveVehicleLocation(@RequestBody OrderTrajectory orderTrajectory) { public R<String> saveVehicleLocation(@RequestBody OrderTrajectoryVo vo) { OrderTrajectory orderTrajectory = new OrderTrajectory(); BeanUtils.copyProperties(vo, orderTrajectory); xpOrderService.saveVehicleLocation(orderTrajectory); return R.ok(); } xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java
@@ -1880,10 +1880,11 @@ if (StringUtils.isEmpty(oldLocation)) { // 首次定位 xpOrder.setMileageKilometers(0D); xpOrder.setAppUserId(null); this.updateById(xpOrder); orderTrajectory.setDistance(0D); // 存储mongo数据 orderTrajectoryService.create(orderTrajectory); mongoTemplate.save(orderTrajectory); // 存储首次定位 redisService.setCacheObject(CacheConstants.ORDER_OLD_LOCATION + orderTrajectory.getOrderId(), orderTrajectory.getLocation()); } else { @@ -1892,11 +1893,12 @@ Double distance1 = distance.get("WGS84"); if (distance1 > 50 && xpOrder.getStatus() == 6) {//大于50米表示在移动,且在服务中的时候记录里程 xpOrder.setMileageKilometers(BigDecimal.valueOf(xpOrder.getMileageKilometers()).add(new BigDecimal(distance1)).setScale(2, RoundingMode.HALF_EVEN).doubleValue()); xpOrder.setAppUserId(null); this.updateById(xpOrder); // 存储本次距离 orderTrajectory.setDistance(distance1); // 存储mongo数据 orderTrajectoryService.create(orderTrajectory); mongoTemplate.save(orderTrajectory); } } else { log.error("调用高德计算距离出错"); @@ -1930,15 +1932,11 @@ } } // List<OrderTrajectory> trajectories = mongoTemplate.find( // new Query(Criteria.where("orderId").is(orderId)) // .with(Sort.by(Sort.Direction.ASC, "locatetime")), // OrderTrajectory.class // ); List<TaxiPricingDemoService.GpsPoint> mockGpsPoints = TaxiPricingDemoService.createMockGpsPoints(DateUtils.toDate(order.getCreateTime())); // 生成轨迹记录 List<OrderTrajectory> trajectories = TrajectoryGenerator.generateTrajectory(mockGpsPoints); List<OrderTrajectory> trajectories = mongoTemplate.find( new Query(Criteria.where("orderId").is(orderId)) .with(Sort.by(Sort.Direction.ASC, "locatetime")), OrderTrajectory.class ); orderDetailVo.setTrajectories(trajectories); if (order.getTripBegin() != null && order.getTripEnd() != null) { // 计算两个时间相差多少分钟