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 = "";