liujie
2026-03-06 8ee550a8bc2ca7e57665f3955378b6428f820945
Merge branch 'master' of http://120.76.84.145:10101/gitblit/r/java/Robotaxi
1个文件已删除
7个文件已修改
269 ■■■■■ 已修改文件
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpOperationsUserController.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/XpOperationsUserServiceImpl.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/dto/automaticPilot/MqttPublishDto.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/controller/OrderMissionController.java 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/util/XPUUtil.java 120 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/OssUtil.java 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/TaskOrderUtil.java 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/controller/PushOrderRouteController.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpOperationsUserController.java
@@ -245,8 +245,9 @@
    @ApiOperation(value = "运维人员管理导入数据", tags = {"管理后台-运维执行"})
    @PostMapping("/api/v1/operationsUser/importOperationsUser")
    public void importOperationsUser(@RequestPart("file") MultipartFile file){
    public R<String> importOperationsUser(@RequestPart("file") MultipartFile file){
        xpOperationsUserService.importOperationsUser(file);
        return R.ok();
    }
}
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/XpOperationsUserServiceImpl.java
@@ -354,17 +354,36 @@
                xpOperationsUser.setUniqueNumber(exportOperationsUserVo.getUniqueNumber());
                xpOperationsUser.setAvatar(exportOperationsUserVo.getAvatar());
                xpOperationsUser.setPhoneNumber(exportOperationsUserVo.getPhoneNumber());
                xpOperationsUser.setPassword(SecurityUtils.encryptPassword("a123456"));
                xpOperationsUser.setRemarks(exportOperationsUserVo.getRemarks());
                xpOperationsUser.setStatus(true);
                xpOperationsUser.setIdCardFront(exportOperationsUserVo.getIdCardFront());
                xpOperationsUser.setIdCardBack(exportOperationsUserVo.getIdCardBack());
                xpOperationsUser.setDriverLicense(exportOperationsUserVo.getDriverLicense());
                xpOperationsUser.setCertificateOfNoCriminalRecord(exportOperationsUserVo.getCertificateOfNoCriminalRecord());
                xpOperationsUser.setTrainingGraduationCertificate(exportOperationsUserVo.getTrainingGraduationCertificate());
                xpOperationsUser.setIdCardFront(StringUtils.isBlank(exportOperationsUserVo.getIdCardFront()) ? null : exportOperationsUserVo.getIdCardFront());
                xpOperationsUser.setIdCardBack(StringUtils.isBlank(exportOperationsUserVo.getIdCardBack()) ? null : exportOperationsUserVo.getIdCardBack());
                xpOperationsUser.setDriverLicense(StringUtils.isBlank(exportOperationsUserVo.getDriverLicense()) ? null : exportOperationsUserVo.getDriverLicense());
                xpOperationsUser.setCertificateOfNoCriminalRecord(StringUtils.isBlank(exportOperationsUserVo.getCertificateOfNoCriminalRecord()) ? null : exportOperationsUserVo.getCertificateOfNoCriminalRecord());
                xpOperationsUser.setTrainingGraduationCertificate(StringUtils.isBlank(exportOperationsUserVo.getTrainingGraduationCertificate()) ? null : exportOperationsUserVo.getTrainingGraduationCertificate());
                xpOperationsUser.setDeleted(false);
                xpOperationsUser.setCreateTime(LocalDateTime.now());
                xpOperationsUser.setUpdateTime(LocalDateTime.now());
                this.save(xpOperationsUser);
                // 通过角色名称查询角色
                String roleName = exportOperationsUserVo.getRoleName();
                if(StringUtils.isNotBlank(roleName)){
                    List<SysRole> sysRoles = iSysRoleService.list(Wrappers.lambdaQuery(SysRole.class)
                            .in(SysRole::getRoleName, Arrays.asList(roleName.split(","))));
                    if(!CollectionUtils.isEmpty(sysRoles)){
                        List<XpOperationsRole> xpOperationsRoles = new ArrayList<>();
                        for (SysRole sysRole : sysRoles) {
                            XpOperationsRole xpOperationsRole = new XpOperationsRole();
                            xpOperationsRole.setOperationsUserId(xpOperationsUser.getId());
                            xpOperationsRole.setRoleId(sysRole.getId());
                            xpOperationsRoles.add(xpOperationsRole);
                        }
                        xpOperationsRoleService.saveBatch(xpOperationsRoles);
                    }else {
                        throw new ServiceException("角色["+roleName+"]不存在",I18nKeyConstant.ROlE_NOT_EXISTS);
                    }
                }
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
xp-robotaxi-api/src/main/java/com/xiaopeng/api/dto/automaticPilot/MqttPublishDto.java
@@ -1,5 +1,6 @@
package com.xiaopeng.api.dto.automaticPilot;
import com.xiaopeng.api.vo.automaticPilot.MqttPublishVo;
import lombok.Data;
@Data
@@ -16,4 +17,6 @@
     * 数据
     */
    private Object data;
    private MqttPublishVo vo;
}
xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/controller/OrderMissionController.java
@@ -125,7 +125,6 @@
        if (!dto.getOrderId().contains("XU") && mqttPublishDto.getCode()== 200) {
            // 修改车子为接单状态
            xpVehicleClient.updateVehicleStatus(new UpdateVehicleStateDto(dto.getVin(),1));
            return R.ok(true);
        }
        return R.ok(false);
xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/util/XPUUtil.java
@@ -48,7 +48,6 @@
     * @param taskList
     * @return
     */
    //TODO 处理feign调用的异常
    public MqttPublishDto cloudCreateOrder(RtTaskList taskList, String vin, Long sequence) {
        MsgContent.Builder msgContentBuilder = MsgContent.newBuilder();
        MsgHeader.Builder headerBuilder = MsgHeader.newBuilder();
@@ -70,8 +69,17 @@
            log.error("Protobuf转JSON失败", e);
            throw new RuntimeException("Protobuf转JSON失败", e);
        }
        log.info("云端-->XPU 创建订单:{}", vo);
        return xpuClient.publish(vo);
        log.info("云端-->XPU 创建订单:{}", JSON.toJSONString(vo));
        try {
            MqttPublishDto dto = xpuClient.publish(vo);
            log.info("XPU返回:{}", JSON.toJSONString(dto));
            if(200 != dto.getCode()){
                dto = againPushMessage(vo);
            }
            return dto;
        }catch (Exception e){
            throw new RuntimeException("云端-->XPU 创建订单失败:", e);
        }
    }
@@ -80,7 +88,6 @@
     * @param operation
     * @return
     */
    //TODO 处理feign调用的异常
    public MqttPublishDto cloudOrderOperation(OrderOperation operation, String vin, Long sequence) {
        MsgContent.Builder msgContentBuilder = MsgContent.newBuilder();
        MsgHeader.Builder headerBuilder = MsgHeader.newBuilder();
@@ -103,9 +110,59 @@
            throw new RuntimeException("Protobuf转JSON失败", e);
        }
        log.info("云端-->XPU 修改订单:{}", vo);
        return xpuClient.publish(vo);
        try {
            MqttPublishDto dto = xpuClient.publish(vo);
            log.info("XPU返回:{}", JSON.toJSONString(dto));
            if(200 != dto.getCode()){
                dto = againPushMessage(vo);
            }
            return dto;
        }catch (Exception e){
            throw new RuntimeException("云端-->XPU 修改订单失败:", e);
        }
    }
    /**
     * 下发导航地址到车端
     *
     * @param navigationData
     * @return
     */
    public MqttPublishDto cloudPushNavigation(RestoreNavigationData navigationData, String xpuId, Long sequence) {
        MsgContent.Builder msgContentBuilder = MsgContent.newBuilder();
        MsgHeader.Builder headerBuilder = MsgHeader.newBuilder();
        headerBuilder.setMsgId(UUID.randomUUID().toString());
        headerBuilder.setTimestamp(System.currentTimeMillis());
        headerBuilder.setCmd(RTCmdType.CLOUD_NAVIGATION_RESPONSE.getValue());
        headerBuilder.setSequence(sequence);
        headerBuilder.setType(MessageType.MESSAGE_TYPE_RESPONSE);
        headerBuilder.setSource(SourceType.CLOUD);
        msgContentBuilder.setHeader(headerBuilder.build());
        msgContentBuilder.setRestoreNavigationData(navigationData);
        MqttPublishVo vo = new MqttPublishVo();
        vo.setTopic(buildTopicByXpuId(xpuId));
        try {
            vo.setPayload(jsonPrinter.print(msgContentBuilder.build()));
        } catch (Exception e) {
            log.error("Protobuf转JSON失败", e);
            throw new RuntimeException("Protobuf转JSON失败", e);
        }
        log.info("云端-->XPU 下发导航信息:{}", vo);
        try {
            MqttPublishDto dto = xpuClient.publish(vo);
            log.info("XPU返回:{}", JSON.toJSONString(dto));
            if(200 != dto.getCode()){
                dto = againPushMessage(vo);
            }
            return dto;
        }catch (Exception e){
            throw new RuntimeException("云端-->XPU 下发导航信息失败:", e);
        }
    }
@@ -139,38 +196,7 @@
        return xpuClient.publish(vo);
    }
    /**
     * 下发导航地址到车端
     *
     * @param navigationData
     * @return
     */
    //TODO 处理feign调用的异常
    public MqttPublishDto cloudPushNavigation(RestoreNavigationData navigationData, String xpuId, Long sequence) {
        MsgContent.Builder msgContentBuilder = MsgContent.newBuilder();
        MsgHeader.Builder headerBuilder = MsgHeader.newBuilder();
        headerBuilder.setMsgId(UUID.randomUUID().toString());
        headerBuilder.setTimestamp(System.currentTimeMillis());
        headerBuilder.setCmd(RTCmdType.CLOUD_NAVIGATION_RESPONSE.getValue());
        headerBuilder.setSequence(sequence);
        headerBuilder.setType(MessageType.MESSAGE_TYPE_RESPONSE);
        headerBuilder.setSource(SourceType.CLOUD);
        msgContentBuilder.setHeader(headerBuilder.build());
        msgContentBuilder.setRestoreNavigationData(navigationData);
        MqttPublishVo vo = new MqttPublishVo();
        vo.setTopic(buildTopicByXpuId(xpuId));
        try {
            vo.setPayload(jsonPrinter.print(msgContentBuilder.build()));
        } catch (Exception e) {
            log.error("Protobuf转JSON失败", e);
            throw new RuntimeException("Protobuf转JSON失败", e);
        }
        log.info("云端-->XPU 下发导航信息:{}", vo);
        return xpuClient.publish(vo);
    }
    /**
@@ -207,4 +233,26 @@
        return prefix + value + "00000000";
    }
    /**
     * 消息下发XPU重试机制
     * @param message
     * @return
     */
    public MqttPublishDto againPushMessage(MqttPublishVo message) {
        log.info("云端-->XPU 消息重试:{}", message);
        MqttPublishDto dto = null;
        for (int i = 0; i < 3; i++) {
            try {
                dto = xpuClient.publish(message);
                log.info("云端-->XPU 消息重试{}次:{}", (i+1), message);
                if (dto.getCode() == 200) {
                    break;
                }
            }catch (Exception e){
                log.error("云端-->XPU 推送失败:{}", message);
            }
        }
        return dto;
    }
}
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/OssUtil.java
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/TaskOrderUtil.java
@@ -52,51 +52,51 @@
    @Resource
    private RedisService redisService;
    @Autowired
    @Resource
    private XpPointService xpPointService;
    @Autowired
    @Resource
    private IXpElectronicFenceAreaService xpElectronicFenceAreaService;
    @Autowired
    @Resource
    private XpOrderClient xpOrderClient;
    @Autowired
    @Resource
    private VehiclePositionService vehiclePositionService;
    @Autowired
    @Resource
    private IXpTradingStrategyService xpTradingStrategyService;
    @Autowired
    @Resource
    private XpCruiseOrderClient xpCruiseOrderClient;
    @Autowired
    @Resource
    private XpVehicleClient xpVehicleClient;
    @Autowired
    @Resource
    private RedissonClient redissonClient;
    @Autowired
    @Resource
    private XpMapClient xpMapClient;
    //
    @Autowired
    @Resource
    private OrderMissionClient orderMissionClient;
    @Resource
    private XpElectronicFenceMapper xpElectronicFenceMapper;
    // 自定义线程池
    private static final ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
    static {
        threadPoolTaskExecutor.setCorePoolSize(50);
        threadPoolTaskExecutor.setCorePoolSize(20);
        threadPoolTaskExecutor.setMaxPoolSize(100);
        threadPoolTaskExecutor.setQueueCapacity(20);
        threadPoolTaskExecutor.setKeepAliveSeconds(60);
        threadPoolTaskExecutor.setThreadNamePrefix("taskOrder-");
        threadPoolTaskExecutor.initialize();
    }
    @Autowired
    private XpElectronicFenceMapper xpElectronicFenceMapper;
    /**
     * 5秒执行一次
@@ -142,81 +142,50 @@
        // 后台配置的规则
        String planRule = firstElement.split("_")[7];
        // 经纬度
        String[] split = lonLat.split(",");
        // 5轮找车辆
        //每次查找车辆推单后的等待秒数
        int sleepTime = 3;
        Integer onePushTime = xpTradingStrategy.getOnePushTime();
        int count = onePushTime / 3;
        int count = onePushTime / sleepTime;
        // 第一轮推单
        processPushOrder(quoteName, count, uid, split, orderNo, xpTradingStrategy, distance, duration, planRule);
//
//        for (int i = 0; i < count; i++) {
//            // 根据距离找车
//            // 车多则根据配置找具体车数量 根据距离最近
//            List<VehiclePosition> availableVehiclesNearby = vehiclePositionService.findAvailableVehiclesNearby(Double.parseDouble(split[0]), Double.parseDouble(split[1]), one.getOnePushDistance(), one.getSimultaneouslyOrderCount());
//            if (!availableVehiclesNearby.isEmpty()) {
//                if (availableVehiclesNearby.size() > 1) {
//                    // 走权重
//                } else {
//                    // 直接派单  定义一个锁来锁定车辆
//                    VehiclePosition vehiclePosition = availableVehiclesNearby.get(0);
//                    Long vehicleId = vehiclePosition.getVehicle_id();
//                    // 查询车辆状态
//                    VehiclePosition vehicleId1 = vehiclePositionService.findByVehicleId(vehicleId);
//                    if (vehicleId1.getStatus() != 1 || vehicleId1.getState() != 0) {
//                        continue;
//                    }
//                    if (vehiclePosition.getHasOrder() == 1) {
//                        //  关闭巡游单子 TODO
//                    }
//
//                    AddTaxiPassengerVo addTaxiPassengerVo = new AddTaxiPassengerVo();
//                    addTaxiPassengerVo.setVin(vehiclePosition.getVin());
//                    addTaxiPassengerVo.setUid(uid);
//                    addTaxiPassengerVo.setOrderNo(orderNo);
//                    // TODO
//                    addTaxiPassengerVo.setAppId("");
//                    BaseVehicleUserDto baseVehicleUserDto = userVehicleClient.addTaxiPassenger(addTaxiPassengerVo);
//                    if (baseVehicleUserDto.getCode() == 200) {
//                        redisService.popFirstElement(quoteName);
//
//                    }
//                }
//
//            }
//        }
        log.info("开始第一轮推单 {}", orderNo);
        processPushOrder(quoteName, count, sleepTime, uid, split, orderNo, xpTradingStrategy, distance, duration, planRule);
        // 第二轮推单
        Integer twoPushTime = xpTradingStrategy.getTwoPushTime();
        count = twoPushTime / 3;
        processPushOrder(quoteName, count, uid, split, orderNo, xpTradingStrategy, distance, duration, planRule);
        count = twoPushTime / sleepTime;
        log.info("开始第二轮推单 {}", orderNo);
        processPushOrder(quoteName, count, sleepTime, uid, split, orderNo, xpTradingStrategy, distance, duration, planRule);
        // 第三轮推单
        Integer threePushTime = xpTradingStrategy.getThreePushTime();
        count = threePushTime / 3;
        processPushOrder(quoteName, count, uid, split, orderNo, xpTradingStrategy, distance, duration, planRule);
        count = threePushTime / sleepTime;
        log.info("开始第三轮推单 {}", orderNo);
        processPushOrder(quoteName, count, sleepTime, uid, split, orderNo, xpTradingStrategy, distance, duration, planRule);
        // 第四轮推单
        Integer fourPushTime = xpTradingStrategy.getFourPushTime();
        count = fourPushTime / 3;
        processPushOrder(quoteName, count, uid, split, orderNo, xpTradingStrategy, distance, duration, planRule);
        count = fourPushTime / sleepTime;
        log.info("开始第四轮推单 {}", orderNo);
        processPushOrder(quoteName, count, sleepTime, uid, split, orderNo, xpTradingStrategy, distance, duration, planRule);
        // 第五轮推单
        Integer fivePushTime = xpTradingStrategy.getFivePushTime();
        count = fivePushTime / 3;
        processPushOrder(quoteName, count, uid, split, orderNo, xpTradingStrategy, distance, duration, planRule);
        count = fivePushTime / sleepTime;
        log.info("开始第五轮推单 {}", orderNo);
        processPushOrder(quoteName, count, sleepTime, uid, split, orderNo, xpTradingStrategy, distance, duration, planRule);
        // 取消订单
        R<XpOrder> xpOrderR = xpOrderClient.queryOrderById(Long.valueOf(orderId));
        if (xpOrderR.getCode() == 200) {
            if (xpOrderR.getData().getStatus() == 1) {
                log.info("五轮推单结束,无车辆接单,执行取消订单 {}", orderNo);
                xpOrderClient.cancelOrder(orderId);
                // 最终没找到车
                //将订单从队列中移除
                log.info("五轮推单结束,无车辆接单,执行队列移除订单 {}", orderNo);
                redisService.popFirstElement(quoteName);
            }
        }
@@ -234,9 +203,8 @@
     * @param xpTradingStrategy  规则
     */
    @SneakyThrows
    private void processPushOrder(String quoteName, int count, String uid, String[] split, String orderNo, XpTradingStrategy xpTradingStrategy, String distance, String duration, String planRule) {
        System.out.println("进入推单环环节");
    private void processPushOrder(String quoteName, int count, int sleepTime, String uid, String[] split, String orderNo, XpTradingStrategy xpTradingStrategy, String distance, String duration, String planRule) {
        System.out.println("进入推单环节");
        if (count == 0) {
            count = 1;
        }
@@ -256,8 +224,8 @@
        XpElectronicFence xpElectronicFence = xpElectronicFenceMapper.selectById(electronicId);
        for (int i = 0; i < count; i++) {
            // 卡住3秒
            Thread.sleep(3000);
            //等到sleepTime秒钟
            Thread.sleep(sleepTime);
            System.out.println("进入找车环节");
            // 根据距离找车
            // 车多则根据配置找具体车数量 根据距离最近
@@ -830,7 +798,6 @@
                        log.info("附近只有一个车辆 {} ,直接推单XPU", vehicleId1.getPlateNumber());
                        log.info("当前车辆状态 {} 运营状态 {}", vehicleId1.getOperatingStatus(), vehicleId1.getState());
                        if (vehicleId1.getOperatingStatus() != 1 || vehicleId1.getState() != 0 || vehicleId1.getVehicleType()==1) {
                            lock.unlock();
                            continue;
                        }
                        //  关闭巡游单子
@@ -839,7 +806,6 @@
                            log.info("关闭巡游单子失败");
                            continue;
                        }
                        PushOrderDto pushOrderDto = new PushOrderDto();
                        pushOrderDto.setVin(vehiclePosition.getVin());
@@ -856,7 +822,6 @@
                        redisService.popFirstElement(quoteName);
                        log.info("将订单 {} 从队列 {} 弹出去", xpOrder.getOrderNumber(), quoteName);
                        return;
                    } catch (Exception e) {
                        e.printStackTrace();
                    } finally {
xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/controller/PushOrderRouteController.java
@@ -51,7 +51,7 @@
        if(routeType == 2){
            routeType = 3;
        }else {
            routeType = xpOrder.getStatus() == 3 ? 1 : 2;
            routeType = xpOrder.getStatus() == 2 || xpOrder.getStatus() == 3 ? 1 : 2;
        }
        // 获取路线规划
        String key = "";