xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/automaticPilot/VehiclePosition.java
@@ -63,4 +63,8 @@ * 订单id */ private Long orderId; /** * 总里程 */ private Float totalOdometer; } xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/controller/OrderMissionController.java
@@ -6,12 +6,14 @@ import com.alibaba.fastjson2.JSONObject; import com.xiaopeng.api.dto.automaticPilot.MqttPublishDto; import com.xiaopeng.api.dto.automaticPilot.PushOrderDto; import com.xiaopeng.api.dto.automaticPilot.VehicleEventDTO; import com.xiaopeng.api.dto.map.OrderRouteAndFareDto; import com.xiaopeng.api.dto.operation.LonLatDto; import com.xiaopeng.api.dto.order.PopOrderDto; import com.xiaopeng.api.dto.pushMessage.PushOrderRouteDTO; import com.xiaopeng.api.dto.pushMessage.SendMessageDTO; import com.xiaopeng.api.dto.vehicleConvoy.UpdateVehicleStateDto; import com.xiaopeng.api.feignClient.automaticPilot.VehicleBuriedPointClient; import com.xiaopeng.api.feignClient.map.XpMapClient; import com.xiaopeng.api.feignClient.order.XpOrderClient; import com.xiaopeng.api.feignClient.pushMessage.XpPushMessageClient; @@ -59,6 +61,8 @@ private RedisService redisService; @Resource private XpVehicleClient xpVehicleClient; @Resource private VehicleBuriedPointClient vehicleBuriedPointClient; @Resource(name = "hutoolSnowflake") private Snowflake snowflake; xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/service/KafkaConsumerService.java
@@ -6,6 +6,7 @@ import com.google.protobuf.InvalidProtocolBufferException; import com.google.protobuf.util.JsonFormat; import com.xiaopeng.api.dto.automaticPilot.MqttPublishDto; import com.xiaopeng.api.dto.automaticPilot.VehicleEventDTO; import com.xiaopeng.api.dto.map.OrderRouteAndFareDto; import com.xiaopeng.api.dto.operation.CruisePointDto; import com.xiaopeng.api.dto.operation.LonLatDto; @@ -15,6 +16,7 @@ import com.xiaopeng.api.dto.pushMessage.PushOrderRouteDTO; import com.xiaopeng.api.dto.pushMessage.SendMessageDTO; import com.xiaopeng.api.dto.vehicleConvoy.UpdateVehicleStateDto; import com.xiaopeng.api.feignClient.automaticPilot.VehicleBuriedPointClient; import com.xiaopeng.api.feignClient.maintenance.XpTaskClient; import com.xiaopeng.api.feignClient.map.XpMapClient; import com.xiaopeng.api.feignClient.operation.ReassignOrderClient; @@ -111,6 +113,8 @@ @Resource private XpTaskClient xpTaskClient; @Resource private VehicleBuriedPointClient vehicleBuriedPointClient; private static final JsonFormat.Printer jsonPrinter = JsonFormat.printer() .printingEnumsAsInts() @@ -340,6 +344,7 @@ vehiclePosition.setCurrentElectricity(dynamicStatus.getBmsSocDisp()); vehiclePosition.setMileageRange(dynamicStatus.getDstBatDisp()); vehiclePosition.setOrderId(orderId); vehiclePosition.setTotalOdometer(dynamicStatus.getTotalOdometer()); mongoTemplate.save(vehiclePosition); }else{ vehiclePosition.setOrderId(orderId); @@ -351,7 +356,8 @@ .set("currentElectricity", dynamicStatus.getBmsSocDisp()) .set("mileageRange", dynamicStatus.getDstBatDisp()) .set("hasOrder", hasOrder) .set("orderId", orderId); .set("orderId", orderId) .set("totalOdometer", dynamicStatus.getTotalOdometer()); mongoTemplate.updateFirst(new Query(Criteria.where("vin").is(vin)), update, VehiclePosition.class); } //调用推送服务接口 @@ -874,6 +880,39 @@ case ORDER_COMPLETED: //已完成 log.info("已完成,不做任何处理:{}", orderId); if(!orderId.contains("XU")){ XpOrder xpOrder = xpOrderClient.queryOrderById(Long.valueOf(orderId)).getData(); if (Objects.nonNull(xpOrder)){ // 查询车辆 XpVehicle xpVehicle = xpVehicleClient.queryById(xpOrder.getVehicleId()).getData(); if (Objects.nonNull(xpVehicle)){ String vin = xpVehicle.getVehicleVin(); // 封装埋点消息实体 VehicleEventDTO vehicleEventDTO = new VehicleEventDTO(); vehicleEventDTO.setVin(vin); vehicleEventDTO.setXpuId(""); vehicleEventDTO.setOrderId(orderId); vehicleEventDTO.setEventKey("RT_xpu_vehicle_trace_upload"); vehicleEventDTO.setEventTime(System.currentTimeMillis()); Map<String,Object> attributes = new HashMap<>(); attributes.put("vin",vin); attributes.put("order_id",vehicleEventDTO.getOrderId()); attributes.put("order_type","user_order"); attributes.put("timestamp",vehicleEventDTO.getEventTime()); attributes.put("current_main_status",OrderStatus.ORDER_COMPLETED); attributes.put("current_sub_status",""); VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(vin)), VehiclePosition.class); if(Objects.nonNull(vehiclePosition)){ attributes.put("odometer_km",vehiclePosition.getTotalOdometer()); }else { attributes.put("odometer_km",""); } vehicleEventDTO.setAttributes(attributes); vehicleBuriedPointClient.sendVehicleEvent(vehicleEventDTO); log.info("已完成,推送埋点:{}", orderId); } } } break; case ORDER_CANCELLED: //已取消 @@ -895,6 +934,38 @@ //到达巡游终点 if(orderId.contains("XU")){ buildPushOrderStatus(orderId, OrderStatusEnum.COMPLETED, sequence); String cruiseOrderId = orderId.substring(2); XpCruiseOrder xpCruiseOrder = xpCruiseOrderClient.getCruiseOrder(Long.parseLong(cruiseOrderId)).getData(); if (Objects.nonNull(xpCruiseOrder)){ // 查询车辆 XpVehicle xpVehicle = xpVehicleClient.queryById(xpCruiseOrder.getVehicleId()).getData(); if (Objects.nonNull(xpVehicle)){ String vin = xpVehicle.getVehicleVin(); // 封装埋点消息实体 VehicleEventDTO vehicleEventDTO = new VehicleEventDTO(); vehicleEventDTO.setVin(vin); vehicleEventDTO.setXpuId(""); vehicleEventDTO.setOrderId(cruiseOrderId); vehicleEventDTO.setEventKey("RT_xpu_vehicle_trace_upload"); vehicleEventDTO.setEventTime(System.currentTimeMillis()); Map<String,Object> attributes = new HashMap<>(); attributes.put("vin",vin); attributes.put("order_id",vehicleEventDTO.getOrderId()); attributes.put("order_type","cruise_order"); attributes.put("timestamp",vehicleEventDTO.getEventTime()); attributes.put("current_main_status",OrderStatus.ORDER_ARRIVED_AT_CRUISE_DESTINATION); attributes.put("current_sub_status",""); VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(vin)), VehiclePosition.class); if(Objects.nonNull(vehiclePosition)){ attributes.put("odometer_km",vehiclePosition.getTotalOdometer()); }else { attributes.put("odometer_km",""); } vehicleEventDTO.setAttributes(attributes); vehicleBuriedPointClient.sendVehicleEvent(vehicleEventDTO); log.info("到达巡游终点,推送埋点:{}", orderId); } } } break; case ORDER_PAUSED: xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpVehicleOperationsController.java
@@ -1,7 +1,9 @@ package com.xiaopeng.maintenance.controller; import com.alibaba.fastjson2.JSONObject; import com.xiaopeng.api.dto.automaticPilot.VehicleEventDTO; import com.xiaopeng.api.dto.operation.NewCruiseOrderDto; import com.xiaopeng.api.feignClient.automaticPilot.VehicleBuriedPointClient; import com.xiaopeng.api.feignClient.operation.XpCruisePlanClient; import com.xiaopeng.api.feignClient.order.XpCruiseOrderClient; import com.xiaopeng.api.feignClient.vehicleConvoy.XpVehicleClient; @@ -32,6 +34,8 @@ import javax.annotation.Resource; import java.io.UnsupportedEncodingException; import java.util.HashMap; import java.util.Map; /** * <p> @@ -58,6 +62,8 @@ private AliOssService aliOssService; @Autowired private XpCruisePlanClient xpCruisePlanClient; @Autowired private VehicleBuriedPointClient vehicleBuriedPointClient; /** * 车辆详情-车辆调度-发车 收车 @@ -77,11 +83,38 @@ if(vehiclePosition==null || vehiclePosition.getPoint()==null){ return R.fail("车辆位置信息不存在"); } Integer departureStatus = dto.getDepartureStatus(); XpVehicle vehicle1 = new XpVehicle(); vehicle1.setOperatingStatus(dto.getDepartureStatus()); vehicle1.setOperatingStatus(departureStatus); vehicle1.setId(xpVehicle.getId()); xpVehicleClient.updateVehicleById(vehicle1); // 封装埋点消息实体 VehicleEventDTO vehicleEventDTO = new VehicleEventDTO(); vehicleEventDTO.setVin(xpVehicle.getVehicleVin()); vehicleEventDTO.setXpuId(""); vehicleEventDTO.setOrderId(""); vehicleEventDTO.setEventKey("RT_web_vehicle_status_changed"); vehicleEventDTO.setEventTime(System.currentTimeMillis()); Map<String,Object> attributes = new HashMap<>(); attributes.put("vin",xpVehicle.getVehicleVin()); attributes.put("order_id",""); attributes.put("timestamp",vehicleEventDTO.getEventTime()); if(departureStatus == 1){ attributes.put("main_status","ONLINE"); // TODO 预留位置 目前无状态 attributes.put("sub_status",""); attributes.put("prev_sub_status",""); }else { attributes.put("main_status","OFFLINE"); // TODO 预留位置 目前无状态 attributes.put("sub_status",""); attributes.put("prev_sub_status",""); } vehicleEventDTO.setAttributes(attributes); vehicleBuriedPointClient.sendVehicleEvent(vehicleEventDTO); // 发车 if(dto.getDepartureStatus()==1){ // 找车辆的任务 生成巡游单子 下发命令 @@ -123,7 +156,6 @@ if(returnCruisePoint!=null){ xpCruiseOrderClient.addCruiseOrder(returnCruisePoint); } } return R.ok(); } xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java
@@ -15,6 +15,7 @@ import com.xiaopeng.api.dto.account.UcUserInfo; import com.xiaopeng.api.dto.account.UseUserCouponDto; import com.xiaopeng.api.dto.automaticPilot.PushOrderDto; import com.xiaopeng.api.dto.automaticPilot.VehicleEventDTO; import com.xiaopeng.api.dto.operation.CruisePointDto; import com.xiaopeng.api.dto.operation.LonLatDto; import com.xiaopeng.api.dto.order.GetOrderNumDto; @@ -31,6 +32,7 @@ import com.xiaopeng.api.feignClient.account.UserResourcesClient; import com.xiaopeng.api.feignClient.account.XpAppUserCouponClient; import com.xiaopeng.api.feignClient.automaticPilot.OrderMissionClient; import com.xiaopeng.api.feignClient.automaticPilot.VehicleBuriedPointClient; import com.xiaopeng.api.feignClient.maintenance.XpTaskRuleClient; import com.xiaopeng.api.feignClient.operation.XpCruisePlanClient; import com.xiaopeng.api.feignClient.operation.XpPointClient; @@ -156,6 +158,7 @@ private final XpCruisePlanClient xpCruisePlanClient; private final XpPricingUtil xpPricingUtil; private final GDMapGeocodingUtil gdMapGeocodingUtil; private final VehicleBuriedPointClient vehicleBuriedPointClient; @Autowired @@ -995,7 +998,6 @@ log.info("已将原车辆状态设为空闲,车辆ID: {}", oldVehicleId); // 6.1.4 为原车辆创建返程巡游订单 -------------- createReturnCruiseOrder(oldVehicle.getId(), order); } else { log.warn("查询原车辆信息失败,车辆ID: {}", oldVehicleId); @@ -2221,7 +2223,7 @@ /** * 取消订单后的继续巡游任务 * @param vehicle * @param vehicleId */ public void addCruiseMission(Long vehicleId) { XpVehicle vehicle = xpVehicleClient.queryById(vehicleId).getData(); @@ -2840,6 +2842,29 @@ xpCruiseOrder.setVehicleId(null); xpCruiseOrderMapper.updateById(xpCruiseOrder); log.info("修改巡游单状态,开始执行巡游单 {}", dto.getOrderId()); // 封装埋点消息实体 VehicleEventDTO vehicleEventDTO = new VehicleEventDTO(); vehicleEventDTO.setVin(dto.getXpVehicleVin()); vehicleEventDTO.setXpuId(""); vehicleEventDTO.setOrderId(String.valueOf(dto.getOrderId())); vehicleEventDTO.setEventKey("RT_xpu_vehicle_trace_upload"); vehicleEventDTO.setEventTime(System.currentTimeMillis()); Map<String,Object> attributes = new HashMap<>(); attributes.put("vin",vehicleEventDTO.getVin()); attributes.put("order_id",vehicleEventDTO.getOrderId()); attributes.put("order_type","cruise_order"); attributes.put("timestamp",vehicleEventDTO.getEventTime()); attributes.put("current_main_status",OrderStatus.ORDER_STARTED); attributes.put("current_sub_status",""); VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(dto.getXpVehicleVin())), VehiclePosition.class); if(Objects.nonNull(vehiclePosition)){ attributes.put("odometer_km",vehiclePosition.getTotalOdometer()); }else { attributes.put("odometer_km",""); } vehicleEventDTO.setAttributes(attributes); vehicleBuriedPointClient.sendVehicleEvent(vehicleEventDTO); log.info("巡游单埋点消息,开始执行推送: {}", dto.getOrderId()); } } //乘客单处理逻辑 @@ -2921,6 +2946,33 @@ //推送乘客车辆到达预约点的导航数据 sendRoute(addTaxiPassengerVo.getUid(), orderId, "ORDER_NAVIGATION_START_DATA", dto.getXpVehicleVin()); } if(order.getStatus() == 2){ // 封装埋点消息实体 VehicleEventDTO vehicleEventDTO = new VehicleEventDTO(); vehicleEventDTO.setVin(dto.getXpVehicleVin()); vehicleEventDTO.setXpuId(""); vehicleEventDTO.setOrderId(String.valueOf(dto.getOrderId())); vehicleEventDTO.setEventKey("RT_xpu_vehicle_trace_upload"); vehicleEventDTO.setEventTime(System.currentTimeMillis()); Map<String,Object> attributes = new HashMap<>(); attributes.put("vin",vehicleEventDTO.getVin()); attributes.put("order_id",vehicleEventDTO.getOrderId()); attributes.put("order_type","user_order"); attributes.put("timestamp",vehicleEventDTO.getEventTime()); attributes.put("current_main_status",OrderStatus.ORDER_EN_ROUTE_TO_PICKUP); attributes.put("current_sub_status",""); VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(dto.getXpVehicleVin())), VehiclePosition.class); if(Objects.nonNull(vehiclePosition)){ attributes.put("odometer_km",vehiclePosition.getTotalOdometer()); }else { attributes.put("odometer_km",""); } vehicleEventDTO.setAttributes(attributes); vehicleBuriedPointClient.sendVehicleEvent(vehicleEventDTO); log.info("用户单埋点消息,开始执行推送: {}", dto.getOrderId()); } } }