xuhy
2026-04-23 d9e201f71882d7d6faac88f1f2f69b31f5fb29f1
[feat] 车辆服务取消登录校验,流量接入的流程接口定义
1个文件已删除
1个文件已添加
8个文件已修改
272 ■■■■■ 已修改文件
xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/controller/OrderMissionController.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/controller/ActiveOrderController.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/controller/XpPricingController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpTradingStrategyController.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/webSocket/handler/TestMsgHandler.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/webSocket/handler/TestMsgSchedule.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/config/MiniprogramConfigurer.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpFleetController.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpFleetVehicleController.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpVehicleController.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/controller/OrderMissionController.java
@@ -1,12 +1,10 @@
package com.xiaopeng.automaticPilot.controller;
import cn.hutool.core.lang.Snowflake;
import cn.hutool.core.util.IdUtil;
import com.alibaba.fastjson2.JSON;
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;
@@ -20,7 +18,6 @@
import com.xiaopeng.api.feignClient.vehicleConvoy.XpVehicleClient;
import com.xiaopeng.api.model.order.XpOrder;
import com.xiaopeng.api.model.vehicleConvoy.XpVehicle;
import com.xiaopeng.api.model.order.XpOrder;import com.xiaopeng.api.model.vehicleConvoy.XpVehicle;
import com.xiaopeng.api.vo.SystemEventType;
import com.xiaopeng.api.vo.automaticPilot.VehiclePosition;
import com.xiaopeng.api.vo.automaticPilot.protobuf.*;
@@ -35,7 +32,6 @@
import com.xiaopeng.common.redis.service.RedisService;
import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.geo.Point;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.geo.GeoJsonPoint;
@@ -46,7 +42,10 @@
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.*;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
@@ -324,12 +323,15 @@
        long sequence = snowflake.nextId();
        MqttPublishDto mqttPublishDto = xpuUtil.cloudCreateOrder(taskListBuilder.build(), dto.getVin(),sequence);
        //先将车辆修改状态,防止在异步通知之前被其他订单选中
        if(!dto.getOrderType().equals(com.xiaopeng.api.vo.OrderType.CRUISE_ORDER) &&
                !dto.getOrderType().equals(com.xiaopeng.api.vo.OrderType.TEST_CRUISE_ORDER)
                && mqttPublishDto.getCode()== 200){
            // 修改车子为接单状态
            xpVehicleClient.updateVehicleStatus(new UpdateVehicleStateDto(dto.getVin(), 1));
            // TODO[流量接入] 通过设置的URL发送订单和导航路线给运力
        }
        if(null != mqttPublishDto && mqttPublishDto.getCode() == 200){
xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/controller/ActiveOrderController.java
@@ -2,11 +2,7 @@
import com.xiaopeng.api.dto.map.RouteAndFareDto;
import com.xiaopeng.api.dto.order.OrderChangeDto;
import com.xiaopeng.api.feignClient.vehicleConvoy.XpVehicleClient;
import com.xiaopeng.api.model.vehicleConvoy.XpVehicle;
import com.xiaopeng.api.vo.operation.RouteAndFareVo;
import com.xiaopeng.api.vo.operation.VehiclePositionVo;
import com.xiaopeng.api.vo.vehicleConvoy.XpVehicleVO;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.itinerary.service.ActiveOrderService;
import com.xiaopeng.itinerary.service.XpPricingService;
@@ -14,22 +10,16 @@
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.data.geo.Distance;
import org.springframework.data.geo.Metrics;
import org.springframework.data.geo.Point;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
/**
@@ -81,10 +71,5 @@
        activeOrderService.orderChange(dto, uid);
        return R.ok();
    }
    @Resource
    private MongoTemplate mongoTemplate;
}
xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/controller/XpPricingController.java
@@ -107,8 +107,6 @@
        return R.ok(xpPricingService.getWaitTime(dto.getLongitude(), dto.getLatitude()));
    }
    /**
     * 播单
     */
@@ -134,9 +132,6 @@
        saveOrderVo.setOrderId(orderId);
        return R.ok(saveOrderVo);
    }
    /**
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpTradingStrategyController.java
@@ -1,5 +1,6 @@
package com.xiaopeng.operation.controller;
import com.xiaopeng.api.model.operation.XpTradingStrategy;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.common.core.web.controller.BaseController;
import com.xiaopeng.operation.dto.XpTradingStrategyEditDTO;
@@ -44,6 +45,8 @@
    @ApiOperation(value = "获取交易策略配置", tags = {"inner-交易策略配置"})
    @GetMapping("/logan/inner/xpOperationStrategy/getOne")
    public R<XpTradingStrategyDetailVO> getOne() {
        // TODO[流量接入] 这里需要判断是哪个三方车队的,获取到对应的交易策略
        XpTradingStrategyDetailVO detail = tradingStrategyService.queryDetail();
        return R.ok(detail);
    }
@@ -60,4 +63,13 @@
        tradingStrategyService.editStrategy(dto);
        return R.ok();
    }
    @ApiOperation(value = "三方车队的交易策略", tags = {"流量接入-信息录入-设置交易策略"})
    @PostMapping("/api/v1/xp-rt/strategy")
    public R<?> add(@Validated @RequestBody XpTradingStrategy dto) {//创建只接收部分可设置的参数的dto
        // 通过key认证是哪个三方车队
        tradingStrategyService.save(dto);
        return R.ok();
    }
}
xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/webSocket/handler/TestMsgHandler.java
File was deleted
xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/webSocket/handler/TestMsgSchedule.java
New file
@@ -0,0 +1,54 @@
package com.xiaopeng.pushMessage.webSocket.handler;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.xiaopeng.api.feignClient.maintenance.XpTaskClient;
import com.xiaopeng.api.model.maintenance.XpTask;
import com.xiaopeng.pushMessage.webSocket.service.WebSocketUserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
@Component
@Slf4j
//public class TestMsgHandler implements BusinessMsgHandler{
public class TestMsgSchedule  {
    @Resource
    XpTaskClient xpTaskClient;
    @Autowired
    private WebSocketUserService webSocketUserService;
    @PostConstruct
    public void setup() {
        Executors.newSingleThreadScheduledExecutor()
                .scheduleWithFixedDelay(this::send, 10, 1, TimeUnit.MINUTES);
    }
    public void send() {
        String msg;
        XpTask xpTask = xpTaskClient.queryInfoByVehicleId(20L).getData();
        HashMap<String, Object> ret = new HashMap<>();
        ret.put("type", "task");
        ret.put("data", xpTask);
        try {
            msg = om.writeValueAsString(ret);
        } catch (JsonProcessingException e) {
            throw new RuntimeException("Message serialization failed", e);
        }
        webSocketUserService.broadcastMessage(msg);
    }
    @Autowired ObjectMapper om;
    @Autowired MongoTemplate mongoTemplate;
}
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/config/MiniprogramConfigurer.java
@@ -10,7 +10,7 @@
import javax.annotation.Resource;
@Slf4j
@Configuration
//@Configuration
public class MiniprogramConfigurer extends WebMvcConfigurerAdapter {
    @Resource
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpFleetController.java
@@ -10,7 +10,10 @@
import com.xiaopeng.vehicleConvoy.model.query.FleetPageQuery;
import com.xiaopeng.vehicleConvoy.model.query.FleetUserPageQuery;
import com.xiaopeng.vehicleConvoy.model.query.FleetVehiclePageQuery;
import com.xiaopeng.vehicleConvoy.model.vo.*;
import com.xiaopeng.vehicleConvoy.model.vo.FleetDetailVO;
import com.xiaopeng.vehicleConvoy.model.vo.FleetPageVO;
import com.xiaopeng.vehicleConvoy.model.vo.FleetUserVO;
import com.xiaopeng.vehicleConvoy.model.vo.FleetVehicleVO;
import com.xiaopeng.vehicleConvoy.service.IXpFleetOperationsService;
import com.xiaopeng.vehicleConvoy.service.IXpFleetService;
import io.swagger.annotations.*;
@@ -220,4 +223,17 @@
    public R<List<XpFleet>> getList() {
        return R.ok(xpFleetService.list());
    }
    @ApiOperation(value = "品牌信息", tags = {"流量接入-信息录入-品牌展示信息"})
    @PostMapping("/api/v1/xp-rt/brand-info")
    public R<?> JoinUs(
            @ApiParam(value = "车辆信息", required = true)
            @RequestBody XpFleet fleet
    ) {
        //包含接收订单的URL
        xpFleetService.save(fleet);
        return R.ok();
    }
}
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpFleetVehicleController.java
@@ -1,12 +1,13 @@
package com.xiaopeng.vehicleConvoy.controller;
import com.xiaopeng.api.model.vehicleConvoy.XpFleetVehicle;
import com.xiaopeng.api.vo.automaticPilot.VehiclePosition;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.vehicleConvoy.service.IXpFleetVehicleService;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
@@ -59,4 +60,29 @@
        List<Long> vehicleIds = xpFleetVehicleService.listVehicleIdsByFleetId(fleetId);
        return R.ok(vehicleIds);
    }
    @ApiOperation(value = "添加车辆", tags = {"流量接入-信息录入-车辆"})
    @PostMapping("/api/v1/xp-rt/vehicle")
    public R<?> add(
            @ApiParam(value = "车辆信息", required = true)
            @RequestBody XpFleetVehicle fleetVehicle
            ) {
        xpFleetVehicleService.save(fleetVehicle);
        return R.ok();
    }
    @Resource
    MongoTemplate mongoTemplate;
    @ApiOperation(value = "车辆", tags = {"流量接入-信息录入-车辆"})
    @PostMapping("/api/v1/xp-rt/vehicle/position")
    public R<?> JoinUs(
            @ApiParam(value = "车辆位置信息", required = true)
            @RequestBody VehiclePosition vp
    ) {
        mongoTemplate.save(vp);
        return R.ok();
    }
}
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpVehicleController.java
@@ -1163,15 +1163,13 @@
        return R.ok(vehicleDoorStatus);
    }
    @Resource
    XpVehicleClient xpVehicleClient;
    /**
     * 周围车辆点位查询
     */
    @ApiOperation(value = "周围车辆点位查询", notes = "", tags = {"小程序-周围车辆点位查询"})
    @GetMapping("/api/v1/mini-program/vehicle/nearby")
    @XpClientCheck(checkToken = false)
    public R<List<XpVehicleVO>> carAround(@RequestParam double lon,@RequestParam double lat) {
    @XpClientCheck(checkToken = false, checkOtpToken = false)
    public R<List<XpVehicleVO>> carAround(@RequestParam double lon, @RequestParam double lat) {
        Point point = new Point(lon, lat);
        Distance distance = new Distance(3, Metrics.KILOMETERS);
@@ -1180,20 +1178,51 @@
                .maxDistance(distance.getNormalizedValue());
        Query query = new Query(criteria);
        List<VehiclePositionVo> vehiclePositions = mongoTemplate.find(query, VehiclePositionVo.class);
        if (CollectionUtils.isEmpty(vehiclePositions)) {
            return R.ok(new ArrayList<>());
        }
        List<XpVehicleVO> xpVehicleList = vehiclePositions.stream()
                .sorted(Comparator.comparingDouble(VehiclePositionVo::getDistance))
                .map(vp -> {
                    XpVehicle xpVehicle = xpVehicleClient.findByVehicleVin(vp.getVin()).getData();
                    XpVehicle xpVehicle = xpVehicleService.getOne(new LambdaQueryWrapper<XpVehicle>().eq(XpVehicle::getVehicleVin, vp.getVin()));
                    if (xpVehicle == null) {
                        return null;
                    }
                    XpVehicleVO vo = new XpVehicleVO();
                    BeanUtils.copyProperties(xpVehicle, vo);
                    vo.setDirection(vp.getCourse());
                    return vo;
                })
                .filter(v -> v.getState() == 0)
                .filter(Objects::nonNull)
                .filter(v -> v.getState() != null && v.getState() == 0)
                .limit(5)
                .collect(Collectors.toList());
        return R.ok(xpVehicleList);
    }
    @ApiOperation(value = "上报车辆位置", notes = "", tags = {"流量接入-上报车辆位置"})
    @PostMapping("/api/v1/xp-rt/vehicle/position")
    public R<List<XpVehicleVO>> pushVehiclePosition(@RequestBody VehiclePosition vp) {
        // 更新到mongodb,用于被分配订单
        // 如果是接单中,更新导航路线
        return R.ok();
    }
    /**
     * {@Link OrderStatusEnum}
     * @param vp
     * @return
     */
    @ApiOperation(value = "更新车辆状态", notes = "", tags = {"流量接入-更新车辆状态"})
    @PostMapping("/api/v1/xp-rt/vehicle/status")
    public R<List<XpVehicleVO>> pushVehicleStatus(@RequestBody VehiclePosition vp) {
        // 前往接驾,等待上车,前往终点,到达终点等待下车,结束订单
        // 更新order状态
        return R.ok();
    }
}