xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/automaticPilot/OrderMissionClient.java
@@ -34,4 +34,9 @@ */ @PostMapping("/logan/inner/cancelOrder") R<Boolean> cancelOrder(@RequestBody PushOrderDto dto); @PostMapping("/logan/inner/updateEndAddress") R<Boolean> updateEndAddress(@RequestBody PushOrderDto dto); } xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/order/XpCruiseOrder.java
@@ -88,4 +88,8 @@ @ApiModelProperty(value = "方向 1正2反") @TableField("order_reverse") private Integer orderReverse; @ApiModelProperty(value = "XPU行程任务id") @TableField("xpu_task_id") private String xpuTaskId; } xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/order/XpOrder.java
@@ -249,4 +249,7 @@ @ApiModelProperty(value = "订单修改目的地的次数 默认0") private Integer orderChange; @ApiModelProperty(value = "XPU行程任务id") @TableField("xpu_task_id") private String xpuTaskId; } xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/order/XpTestOrder.java
@@ -235,4 +235,8 @@ private Integer num; @ApiModelProperty(value = "是否改价标识 0-否 1-是") private Boolean changeMoneyFlag; @ApiModelProperty(value = "XPU行程任务id") @TableField("xpu_task_id") private String xpuTaskId; } xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/controller/OrderMissionController.java
@@ -80,7 +80,7 @@ if(dto.getOrderType().equals(com.xiaopeng.api.vo.OrderType.CRUISE_ORDER)){ RtTask.Builder taskBuilder = RtTask.newBuilder(); taskBuilder.setOrderId(dto.getOrderId().toString()); taskBuilder.setTaskId(snowflake.nextId() + ""); taskBuilder.setTaskId(StringUtils.isNotEmpty(dto.getTaskId()) ? dto.getTaskId() : snowflake.nextId() + ""); taskBuilder.setTaskType(OrderType.ORDER_TYPE_CRUISE); //构建起点坐标数据 pointBuilderStart.setWaypointId(dto.getOrderId() + "-001"); @@ -111,7 +111,7 @@ for (int i = 1; i < 3; i++) { RtTask.Builder taskBuilder = RtTask.newBuilder(); taskBuilder.setOrderId(dto.getOrderId().toString()); taskBuilder.setTaskId(snowflake.nextId() + ""); taskBuilder.setTaskId(StringUtils.isNotEmpty(dto.getTaskId()) ? dto.getTaskId() : snowflake.nextId() + ""); taskBuilder.setTaskType(OrderType.ORDER_TYPE_ROBOTAXI); if(i == 1){ VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(dto.getVin())), VehiclePosition.class); @@ -171,7 +171,7 @@ for (int i = 1; i < 3; i++) { RtTask.Builder taskBuilder = RtTask.newBuilder(); taskBuilder.setOrderId(dto.getOrderId().toString()); taskBuilder.setTaskId(snowflake.nextId() + ""); taskBuilder.setTaskId(StringUtils.isNotEmpty(dto.getTaskId()) ? dto.getTaskId() : snowflake.nextId() + ""); taskBuilder.setTaskType(OrderType.ORDER_TYPE_ROBOTAXI); if(i == 1){ VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(dto.getVin())), VehiclePosition.class); @@ -230,7 +230,7 @@ //测试单巡游单 RtTask.Builder taskBuilder = RtTask.newBuilder(); taskBuilder.setOrderId(dto.getOrderId().toString()); taskBuilder.setTaskId(snowflake.nextId() + ""); taskBuilder.setTaskId(StringUtils.isNotEmpty(dto.getTaskId()) ? dto.getTaskId() : snowflake.nextId() + ""); taskBuilder.setTaskType(OrderType.ORDER_TYPE_CRUISE); //构建起点坐标数据 pointBuilderStart.setWaypointId(dto.getOrderId() + "-001"); @@ -281,7 +281,7 @@ } @PostMapping("/logan/inner/cancelOrder") R<Boolean> cancelOrder(@RequestBody PushOrderDto dto) { public R<Boolean> cancelOrder(@RequestBody PushOrderDto dto) { log.info("取消订单,推送XPU报文:{}", JSON.toJSONString(dto)); String taskId = StringUtils.isNotEmpty(dto.getTaskId()) ? dto.getTaskId() : snowflake.nextId() + ""; OrderOperation.Builder operationBuilder = OrderOperation.newBuilder(); @@ -317,6 +317,48 @@ @PostMapping("/logan/inner/updateEndAddress") public R<Boolean> updateEndAddress(@RequestBody PushOrderDto dto){ log.info("修改目的地,推送XPU报文:{}", JSON.toJSONString(dto)); String taskId = StringUtils.isNotEmpty(dto.getTaskId()) ? dto.getTaskId() : snowflake.nextId() + ""; OrderOperation.Builder operationBuilder = OrderOperation.newBuilder(); operationBuilder.setOrderId(dto.getOrderId().toString()); operationBuilder.setTaskId(taskId); if (dto.getOperation_type() != null) { operationBuilder.setOperationType(OrderOperationType.forNumber(dto.getOperation_type().getNumber())); } Waypoint.Builder waypointBuilder = Waypoint.newBuilder(); waypointBuilder.setWaypointId(dto.getOrderId() + "-002"); waypointBuilder.setPointType(PointType.END_POINT); waypointBuilder.setActionType(ActionType.DROP_OFF); waypointBuilder.setSequence(2); GeoPoint.Builder geoPointBuilder = GeoPoint.newBuilder(); geoPointBuilder.setLatitude(dto.getStartLatitude()); geoPointBuilder.setLongitude(dto.getStartLongitude()); waypointBuilder.setPoint(geoPointBuilder.build()); waypointBuilder.setPoiName(dto.getEndPoiName()); operationBuilder.setTargetPoint(waypointBuilder); long sequence = snowflake.nextId(); MqttPublishDto mqttPublishDto = xpuUtil.cloudOrderOperation(operationBuilder.build(), dto.getVin(), sequence); if (mqttPublishDto.getCode() == 200) { if(!dto.getOrderId().contains("XU")){ Map<String, Object> cancelContext = new HashMap<>(); cancelContext.put("orderId", dto.getOrderId()); cancelContext.put("vin", dto.getVin()); cancelContext.put("cancelScene", StringUtils.isNotEmpty(dto.getCancelScene()) ? dto.getCancelScene() : CancelOrderSceneEnum.NORMAL_CANCEL.getCode()); redisService.setCacheObject("CANCEL_ORDER_CONTEXT:" + taskId, JSONObject.toJSONString(cancelContext), 30L, TimeUnit.MINUTES); log.info("记录修改目的地订单上下文成功,orderId: {}, vin: {}, taskId: {}, cancelScene: {}", dto.getOrderId(), dto.getVin(), taskId, cancelContext.get("cancelScene")); } return R.ok(true); } return R.ok(false); } xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/service/KafkaConsumerService.java
@@ -1467,6 +1467,7 @@ newXpCruiseOrder.setStartPointName(xpCruiseOrder.getEndPointName()); newXpCruiseOrder.setStatus(1); newXpCruiseOrder.setLastOrderId(xpCruiseOrder.getId()); xpCruiseOrder.setXpuTaskId(snowflake.nextId() + ""); // 通过车找终点id CruisePointDto cruisePointDto = new CruisePointDto(); xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/config/SnowflakeConfig.java
New file @@ -0,0 +1,57 @@ package com.xiaopeng.itinerary.config; import cn.hutool.core.lang.Snowflake; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.Date; @Configuration public class SnowflakeConfig { //初始时间戳,设为2026年1月1日0点0时0分 public static final Date EPOCH_DATE = new Date(1767225600000L); /** * 如果配置为<0的值,则woker-id根据pod名的hash取模生成 * 如果配置为>=0的值,则取配置的值 * 如果多个pod的data-center-id和worker-id相同,同一毫秒内请求数上千的话,可能会产生碰撞,生成一样的snowflake id */ @Value("${snowflake.worker-id:-1}") private long workerId; @Value("${snowflake.data-center-id:0}") private long dataCenterId; @Bean("hutoolSnowflake") public Snowflake snowflake() { long resolvedWorkerId = resolveWorkerId(); return new Snowflake(EPOCH_DATE, resolvedWorkerId, dataCenterId, false); } private long resolveWorkerId() { if (workerId >= 0 && workerId <= Snowflake.MAX_WORKER_ID) { return workerId; } String podName = System.getenv("HOSTNAME"); if (podName == null || podName.isEmpty()) { return 0; } int end = podName.length() - 1; while (end >= 0 && Character.isDigit(podName.charAt(end))) { end--; } String numberPart = podName.substring(end + 1); long candidate; if (!numberPart.isEmpty()) { try { candidate = Long.parseLong(numberPart); } catch (NumberFormatException e) { candidate = Math.abs(podName.hashCode()); } } else { candidate = Math.abs(podName.hashCode()); } return candidate % (Snowflake.MAX_WORKER_ID + 1); } } xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/controller/ActiveOrderController.java
@@ -71,7 +71,6 @@ @PostMapping("/api/v1/mini-program/order/orderChange") @XpClientCheck(checkToken = false, checkOtpToken = true) public R<?> orderChange(@RequestBody @Validated OrderChangeDto dto, HttpServletRequest request) { String uid = request.getHeader("XP-Uid"); activeOrderService.orderChange(dto, uid); return R.ok(); xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/service/impl/ActiveOrderServiceImpl.java
@@ -2,18 +2,23 @@ import com.alibaba.fastjson2.JSON; import com.xiaopeng.api.dto.automaticPilot.PushOrderDto; import com.xiaopeng.api.dto.operation.ReassignOrderDTO; import com.xiaopeng.api.dto.order.OrderChangeDto; import com.xiaopeng.api.feignClient.automaticPilot.OrderMissionClient; import com.xiaopeng.api.feignClient.map.XpMapClient; import com.xiaopeng.api.feignClient.operation.ReassignOrderClient; import com.xiaopeng.api.feignClient.operation.XpPointClient; import com.xiaopeng.api.feignClient.operation.XpSystemSettingClient; import com.xiaopeng.api.feignClient.order.XpOrderClient; import com.xiaopeng.api.feignClient.vehicleConvoy.XpVehicleClient; import com.xiaopeng.api.model.operation.XpElectronicFence; import com.xiaopeng.api.model.operation.XpElectronicFenceArea; import com.xiaopeng.api.model.operation.XpPoint; import com.xiaopeng.api.model.operation.XpSystemSetting; import com.xiaopeng.api.model.order.XpOrder; import com.xiaopeng.api.model.vehicleConvoy.XpVehicle; import com.xiaopeng.api.vo.automaticPilot.protobuf.OrderOperationType; import com.xiaopeng.api.vo.operation.RouteOptionVo; import com.xiaopeng.api.vo.operation.RouteVo; import com.xiaopeng.common.core.constant.CacheConstants; @@ -70,6 +75,10 @@ private RedisService redisService; @Resource private XpRoutePlanMapper xpRoutePlanMapper; @Resource private XpVehicleClient vehicleClient; @Resource private OrderMissionClient orderMissionClient; /* @@ -187,6 +196,16 @@ log.info("订单推单:{} {}", key, redisService.getCacheList(key)); xpOrder.setQueueName(key); xpOrderClient.updateOrder(xpOrder); //给车端推送修改目的地报文 XpVehicle xpVehicle = vehicleClient.queryById(xpOrder.getVehicleId()).getData(); PushOrderDto pushOrderDto = new PushOrderDto(); pushOrderDto.setOrderId(order.getId().toString()); pushOrderDto.setTaskId(order.getXpuTaskId()); pushOrderDto.setVin(xpVehicle.getVehicleVin()); pushOrderDto.setOperation_type(OrderOperationType.CLOUD_CHANGE_DESTINATION); orderMissionClient.cancelOrder(pushOrderDto); log.info("订单下发XPU修改目的地成功 {}", order.getId()); // 判断当前订单的车辆是否有连环派单,然后判断是都还满足连环派单的条件,不满足则需要重新派单 Long nextOrderId = redisService.getCacheObject(CacheConstants.nextOrder(order.getId().toString())); xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/service/impl/XpPricingServiceImpl.java
@@ -1,6 +1,7 @@ package com.xiaopeng.itinerary.service.impl; import cn.hutool.core.lang.Snowflake; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; @@ -136,6 +137,9 @@ @Resource private UserRoutePlanRuleClient userRoutePlanRuleClient; @Resource(name = "hutoolSnowflake") private Snowflake snowflake; @Value("${navigation.route.stale-seconds:60}") private int navigationStaleSeconds; @@ -639,6 +643,7 @@ xpOrder.setEndLat(endXpPoint.getPointLat()); xpOrder.setEndAddress(endXpPoint.getPointAddress()); xpOrder.setEndPointName(endXpPoint.getPointName()); xpOrder.setXpuTaskId(snowflake.nextId() + ""); // 当前时段 xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/config/SnowflakeConfig.java
New file @@ -0,0 +1,57 @@ package com.xiaopeng.maintenance.config; import cn.hutool.core.lang.Snowflake; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.Date; @Configuration public class SnowflakeConfig { //初始时间戳,设为2026年1月1日0点0时0分 public static final Date EPOCH_DATE = new Date(1767225600000L); /** * 如果配置为<0的值,则woker-id根据pod名的hash取模生成 * 如果配置为>=0的值,则取配置的值 * 如果多个pod的data-center-id和worker-id相同,同一毫秒内请求数上千的话,可能会产生碰撞,生成一样的snowflake id */ @Value("${snowflake.worker-id:-1}") private long workerId; @Value("${snowflake.data-center-id:0}") private long dataCenterId; @Bean("hutoolSnowflake") public Snowflake snowflake() { long resolvedWorkerId = resolveWorkerId(); return new Snowflake(EPOCH_DATE, resolvedWorkerId, dataCenterId, false); } private long resolveWorkerId() { if (workerId >= 0 && workerId <= Snowflake.MAX_WORKER_ID) { return workerId; } String podName = System.getenv("HOSTNAME"); if (podName == null || podName.isEmpty()) { return 0; } int end = podName.length() - 1; while (end >= 0 && Character.isDigit(podName.charAt(end))) { end--; } String numberPart = podName.substring(end + 1); long candidate; if (!numberPart.isEmpty()) { try { candidate = Long.parseLong(numberPart); } catch (NumberFormatException e) { candidate = Math.abs(podName.hashCode()); } } else { candidate = Math.abs(podName.hashCode()); } return candidate % (Snowflake.MAX_WORKER_ID + 1); } } xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpVehicleOperationsController.java
@@ -1,5 +1,6 @@ package com.xiaopeng.maintenance.controller; import cn.hutool.core.lang.Snowflake; import com.alibaba.fastjson2.JSONObject; import com.xiaopeng.api.dto.automaticPilot.VehicleEventDTO; import com.xiaopeng.api.dto.operation.NewCruiseOrderDto; @@ -64,6 +65,9 @@ private XpCruisePlanClient xpCruisePlanClient; @Autowired private VehicleBuriedPointClient vehicleBuriedPointClient; @Resource(name = "hutoolSnowflake") private Snowflake snowflake; /** * 车辆详情-车辆调度-发车 收车 @@ -150,6 +154,7 @@ xpCruiseOrder.setOrderReverse(1); xpCruiseOrder.setLastOrderId(r.getData()); xpCruiseOrder.setOrderReverse(1); xpCruiseOrder.setXpuTaskId(snowflake.nextId() + ""); // 找到收车站点 XpCruiseOrder returnCruisePoint = xpCruisePlanClient.findReturnCruisePoint(xpCruiseOrder).getData(); xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/schedule/VehicleCollectionScheduleTask.java
@@ -1,5 +1,6 @@ package com.xiaopeng.maintenance.schedule; import cn.hutool.core.lang.Snowflake; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.xiaopeng.api.feignClient.automaticPilot.OrderMissionClient; import com.xiaopeng.api.feignClient.operation.XpCruisePlanClient; @@ -21,6 +22,7 @@ import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; import javax.annotation.Resource; import java.time.LocalTime; import java.util.Collections; import java.util.List; @@ -62,6 +64,9 @@ @Autowired private XpCruisePlanClient xpCruisePlanClient; @Resource(name = "hutoolSnowflake") private Snowflake snowflake; /** * 每分钟检查一次是否需要执行收车任务 @@ -217,6 +222,7 @@ xpCruiseOrder.setOrderReverse(1); xpCruiseOrder.setLastOrderId(r.getData()); xpCruiseOrder.setOrderReverse(1); xpCruiseOrder.setXpuTaskId(snowflake.nextId() + ""); // 找到收车站点 R<XpCruiseOrder> returnCruisePoint = xpCruisePlanClient.findReturnCruisePoint(xpCruiseOrder); xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/config/SnowflakeConfig.java
New file @@ -0,0 +1,57 @@ package com.xiaopeng.operation.config; import cn.hutool.core.lang.Snowflake; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.Date; @Configuration public class SnowflakeConfig { //初始时间戳,设为2026年1月1日0点0时0分 public static final Date EPOCH_DATE = new Date(1767225600000L); /** * 如果配置为<0的值,则woker-id根据pod名的hash取模生成 * 如果配置为>=0的值,则取配置的值 * 如果多个pod的data-center-id和worker-id相同,同一毫秒内请求数上千的话,可能会产生碰撞,生成一样的snowflake id */ @Value("${snowflake.worker-id:-1}") private long workerId; @Value("${snowflake.data-center-id:0}") private long dataCenterId; @Bean("hutoolSnowflake") public Snowflake snowflake() { long resolvedWorkerId = resolveWorkerId(); return new Snowflake(EPOCH_DATE, resolvedWorkerId, dataCenterId, false); } private long resolveWorkerId() { if (workerId >= 0 && workerId <= Snowflake.MAX_WORKER_ID) { return workerId; } String podName = System.getenv("HOSTNAME"); if (podName == null || podName.isEmpty()) { return 0; } int end = podName.length() - 1; while (end >= 0 && Character.isDigit(podName.charAt(end))) { end--; } String numberPart = podName.substring(end + 1); long candidate; if (!numberPart.isEmpty()) { try { candidate = Long.parseLong(numberPart); } catch (NumberFormatException e) { candidate = Math.abs(podName.hashCode()); } } else { candidate = Math.abs(podName.hashCode()); } return candidate % (Snowflake.MAX_WORKER_ID + 1); } } xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpCruisePlanController.java
@@ -1,6 +1,7 @@ package com.xiaopeng.operation.controller; import cn.hutool.core.lang.Snowflake; import cn.hutool.core.util.IdUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.xiaopeng.api.dto.operation.CruisePointDto; @@ -34,6 +35,7 @@ import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import javax.validation.Valid; import org.springframework.web.bind.annotation.PathVariable; @@ -61,6 +63,9 @@ private final IXpCruisePlanPointService xpCruisePlanPointService; private final XpPointService pointService; private final XpVehicleClient xpVehicleClient; @Resource(name = "hutoolSnowflake") private Snowflake snowflake; @ApiOperation(value = "获取巡游计划分页列表", tags = {"管理后台-巡游计划"}) @PostMapping(value = {"/api/v1/xp-cruise-plan/pageList"}) @@ -205,6 +210,8 @@ newXpCruiseOrder.setMissionId(plan.getCruisePlanId()); newXpCruiseOrder.setStatus(1); newXpCruiseOrder.setOrderReverse(1); newXpCruiseOrder.setXpuTaskId(snowflake.nextId() + ""); GeoJsonPoint point = dto.getPoint(); // 起点 xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpPricingServiceImpl.java
@@ -1,6 +1,7 @@ package com.xiaopeng.operation.service.impl; import cn.hutool.core.lang.Snowflake; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; @@ -120,6 +121,9 @@ @Autowired private XpPointService xpPointService; @Resource(name = "hutoolSnowflake") private Snowflake snowflake; // 自定义线程池用于并行执行任务 @@ -512,6 +516,7 @@ xpOrder.setEndPointId(dto.getEndPointId()); xpOrder.setStartPointName(xpPoint.getPointName()); xpOrder.setEndPointName(endXpPoint.getPointName()); xpOrder.setXpuTaskId(snowflake.nextId() + ""); // 当前时段 String currentTimeSlot = DateUtils.getCurrentTimeSlot(); xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/TaskOrderUtil.java
@@ -347,6 +347,7 @@ // 下发XPU命令 PushOrderDto pushOrderDto = new PushOrderDto(); pushOrderDto.setVin(priorityVin); pushOrderDto.setTaskId(orderCheck.getData().getXpuTaskId()); pushOrderDto.setOrderId(orderCheck.getData().getId().toString()); pushOrderDto.setStartLatitude(orderCheck.getData().getStartLat()); pushOrderDto.setStartLongitude(orderCheck.getData().getStartLon()); @@ -1009,6 +1010,7 @@ log.info("关闭巡游单成功 {} {}", vehiclePosition.getPlateNumber(), orderNo); // 下发命令 PushOrderDto pushOrderDto = new PushOrderDto(); pushOrderDto.setTaskId(xpOrder.getXpuTaskId()); pushOrderDto.setVin(vehiclePosition.getVehicleVin()); pushOrderDto.setOrderId(xpOrder.getId().toString()); pushOrderDto.setStartLatitude(xpOrder.getStartLat()); @@ -1071,6 +1073,7 @@ log.info("关闭巡游单成功 {} {}", vehicleId1.getPlateNumber(), orderNo); PushOrderDto pushOrderDto = buildPushOrderDto(xpOrder); pushOrderDto.setVin(vehiclePosition.getVin()); pushOrderDto.setTaskId(xpOrder.getXpuTaskId()); // 调用推送服务 orderId + carVin orderMissionClient.pushOrder(pushOrderDto); log.info("开始推送 {} 订单到XPU", xpOrder.getOrderNumber()); @@ -1154,6 +1157,7 @@ routeToOrigin.setDistance(routeToOrigin.getDistance() + routeRemain.getDistance()); PushOrderDto pushOrderDto = buildPushOrderDto(xpOrder); pushOrderDto.setVin(xpVehicle.getVehicleVin()); pushOrderDto.setTaskId(xpOrder.getXpuTaskId()); // 订单流转 orderMissionClient.pushOrder(pushOrderDto); redisService.setCacheObject(CacheConstants.nextOrder(luckyOder.getId().toString()), xpOrder.getId()); @@ -1333,6 +1337,7 @@ } PushOrderDto pushOrderDto = new PushOrderDto(); pushOrderDto.setTaskId(data.getXpuTaskId()); pushOrderDto.setVin(vehiclePosition.getVin()); pushOrderDto.setOrderId(data.getId().toString()); pushOrderDto.setStartLatitude(data.getStartLat()); xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/config/SnowflakeConfig.java
New file @@ -0,0 +1,57 @@ package com.xiaopeng.order.config; import cn.hutool.core.lang.Snowflake; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.Date; @Configuration public class SnowflakeConfig { //初始时间戳,设为2026年1月1日0点0时0分 public static final Date EPOCH_DATE = new Date(1767225600000L); /** * 如果配置为<0的值,则woker-id根据pod名的hash取模生成 * 如果配置为>=0的值,则取配置的值 * 如果多个pod的data-center-id和worker-id相同,同一毫秒内请求数上千的话,可能会产生碰撞,生成一样的snowflake id */ @Value("${snowflake.worker-id:-1}") private long workerId; @Value("${snowflake.data-center-id:0}") private long dataCenterId; @Bean("hutoolSnowflake") public Snowflake snowflake() { long resolvedWorkerId = resolveWorkerId(); return new Snowflake(EPOCH_DATE, resolvedWorkerId, dataCenterId, false); } private long resolveWorkerId() { if (workerId >= 0 && workerId <= Snowflake.MAX_WORKER_ID) { return workerId; } String podName = System.getenv("HOSTNAME"); if (podName == null || podName.isEmpty()) { return 0; } int end = podName.length() - 1; while (end >= 0 && Character.isDigit(podName.charAt(end))) { end--; } String numberPart = podName.substring(end + 1); long candidate; if (!numberPart.isEmpty()) { try { candidate = Long.parseLong(numberPart); } catch (NumberFormatException e) { candidate = Math.abs(podName.hashCode()); } } else { candidate = Math.abs(podName.hashCode()); } return candidate % (Snowflake.MAX_WORKER_ID + 1); } } xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/CustomerServiceController.java
@@ -106,7 +106,7 @@ } List<ServiceVehicleListVo> collect = serviceVehicleList.getData().stream().map(xpVehicle -> { ServiceVehicleListVo vo = new ServiceVehicleListVo(); vo.setVim(xpVehicle.getVehicleVin()); vo.setVin(xpVehicle.getVehicleVin()); vo.setPlateNumber(xpVehicle.getPlateNumber()); return vo; }).collect(Collectors.toList()); xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpCruiseOrderController.java
@@ -115,6 +115,7 @@ // 下发命令 PushOrderDto pushOrderDto = new PushOrderDto(); pushOrderDto.setTaskId(order.getXpuTaskId()); pushOrderDto.setVin(order.getVehicleVin()); pushOrderDto.setOrderId("XU" + order.getId()); pushOrderDto.setStartLatitude(order.getStartLat()); xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/job/jobs/PushChainReactionOrderJob.java
@@ -49,6 +49,7 @@ log.info("完成连环单用户车辆绑定关系 {}", xpOrder.getOrderNumber()); //开始将新订单推送给车端 PushOrderDto pushOrderDto = new PushOrderDto(); pushOrderDto.setTaskId(xpOrder.getXpuTaskId()); pushOrderDto.setOrderId(xpOrder.getId().toString()); pushOrderDto.setStartLatitude(xpOrder.getStartLat()); pushOrderDto.setStartLongitude(xpOrder.getStartLon()); xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java
@@ -2,6 +2,7 @@ import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.Snowflake; import cn.hutool.core.util.IdUtil; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONArray; @@ -181,6 +182,9 @@ @Value("${robotaxi.appId:xp_robotaxi_api}") private String appid; @Resource(name = "hutoolSnowflake") private Snowflake snowflake; @Override @@ -1104,6 +1108,7 @@ // 11.2 下发订单到新车辆 PushOrderDto pushOrderDto = new PushOrderDto(); pushOrderDto.setTaskId(order.getXpuTaskId()); pushOrderDto.setVin(newVehicle.getVehicleVin()); pushOrderDto.setOrderId(order.getId().toString()); pushOrderDto.setStartLatitude(order.getStartLat()); @@ -1182,6 +1187,7 @@ returnOrder.setLastOrderId(lastCruise.getId()); returnOrder.setCreateTime(LocalDateTime.now()); returnOrder.setMissionId(lastCruise.getMissionId()); returnOrder.setXpuTaskId(snowflake.nextId() + ""); // 返程起点 = 当前订单的终点(车辆当前位置附近) returnOrder.setStartPointId(order.getEndPointId()); @@ -1220,6 +1226,7 @@ // 下发巡游订单到原车辆 PushOrderDto pushOrderDto = new PushOrderDto(); pushOrderDto.setTaskId(returnOrder.getXpuTaskId()); pushOrderDto.setVin(oldVehicle.getVehicleVin()); pushOrderDto.setOrderId("XU" + returnOrder.getId()); pushOrderDto.setStartLatitude(returnOrder.getStartLat()); @@ -2557,6 +2564,7 @@ xpCruiseOrder.setStartPointName(order.getEndPointName()); xpCruiseOrder.setStartLon(order.getEndLon()); xpCruiseOrder.setStartLat(order.getEndLat()); xpCruiseOrder.setXpuTaskId(snowflake.nextId() + ""); // 完成的直接走终点 终止的走起点 if(null != xpCruiseOrders){ @@ -2617,6 +2625,7 @@ log.info("添加巡游单成功 {}", xpCruiseOrder.getId()); //下发XUP巡游订单报文 PushOrderDto pushOrderDto = new PushOrderDto(); pushOrderDto.setTaskId(xpCruiseOrder.getXpuTaskId()); pushOrderDto.setVin(xpCruiseOrder.getVehicleVin()); pushOrderDto.setOrderId("XU" + xpCruiseOrder.getId()); pushOrderDto.setStartLatitude(xpCruiseOrder.getStartLat()); @@ -2664,6 +2673,7 @@ xpCruiseOrder.setFleetId(vehicle.getFleetId()); xpCruiseOrder.setVehicleVin(vehicle.getVehicleVin()); xpCruiseOrder.setOrderType(2); xpCruiseOrder.setXpuTaskId(snowflake.nextId() + ""); // 返程起点是当前正常订单的终点 xpCruiseOrder.setStartPointId(null); xpCruiseOrder.setStartPointName(null); @@ -2733,6 +2743,7 @@ //下发XPU消息报文 PushOrderDto pushOrderDto = new PushOrderDto(); pushOrderDto.setTaskId(xpCruiseOrder.getXpuTaskId()); pushOrderDto.setVin(xpCruiseOrder.getVehicleVin()); pushOrderDto.setOrderId("XU" + xpCruiseOrder.getId()); pushOrderDto.setStartLatitude(xpCruiseOrder.getStartLat()); xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpTestOrderServiceImpl.java
@@ -2,6 +2,7 @@ import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.Snowflake; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; @@ -138,6 +139,9 @@ @Resource private BootCommonService bootCommonService; @Resource(name = "hutoolSnowflake") private Snowflake snowflake; @@ -242,6 +246,7 @@ xpOrder.setStatus(1); xpOrder.setOrderSource(1); xpOrder.setOpenTrunk(2); xpOrder.setXpuTaskId(snowflake.nextId() + ""); // 当前时段 String currentTimeSlot = DateUtils.getCurrentTimeSlot(); @@ -262,6 +267,7 @@ redisService.setCacheObject("TEST_ORDER_NAVIGATION_END_DATA:" + vehicleId, JSON.toJSONString(routeVo), 24L, TimeUnit.HOURS); //下发XPU消息 PushOrderDto pushOrderDto = new PushOrderDto(); pushOrderDto.setTaskId(xpOrder.getXpuTaskId()); pushOrderDto.setVin(xpVehicle.getVehicleVin()); pushOrderDto.setOrderId("TEST" + xpOrder.getId()); pushOrderDto.setStartLatitude(xpOrder.getStartLat()); @@ -823,6 +829,7 @@ try { // 11.2 下发订单到新车辆 PushOrderDto pushOrderDto = new PushOrderDto(); pushOrderDto.setTaskId(order.getXpuTaskId()); pushOrderDto.setVin(newVehicle.getVehicleVin()); pushOrderDto.setOrderId("TEST" + order.getId()); pushOrderDto.setStartLatitude(order.getStartLat()); xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/vo/ServiceVehicleListVo.java
@@ -8,8 +8,8 @@ @Data @ApiModel public class ServiceVehicleListVo { @ApiModelProperty("vim码") private String vim; @ApiModelProperty("vin码") private String vin; @ApiModelProperty("车牌号") private String plateNumber; }