puzhibing
2026-05-08 87735379c4024b064aed0419e9fb57bbc10ca5c3
修改电话号码脱敏功能
9个文件已修改
411 ■■■■■ 已修改文件
xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/controller/OrderMissionController.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/service/impl/XpPricingServiceImpl.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/utils/XpPricingUtil.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpCruiseCheckInRuleServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/service/serviceimpl/XpElectronicFenceServiceImpl.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/CustomerServiceController.java 170 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java 120 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/vo/VehicleSeatStatus.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/webSocket/controller/WebSocketController.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/controller/OrderMissionController.java
@@ -474,6 +474,41 @@
        if(StringUtils.isNotEmpty(code)){
            xpOrder = xpOrderClient.queryOrderByOrderNo(code).getData();
        }
        //保存车辆实时信息到mongodb
        VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(xpVehicle.getVehicleVin())), VehiclePosition.class);
        if (null == vehiclePosition) {
            log.info("【模拟接单】MongoDB无车辆位置记录,新建,vin={}", xpVehicle.getVehicleVin());
            vehiclePosition = new VehiclePosition();
            vehiclePosition.setVin(xpVehicle.getVehicleVin());
            vehiclePosition.setPoint(new GeoJsonPoint(startLon, startLat));
            vehiclePosition.setCourse(60D);
            vehiclePosition.setAlt(100F);
            vehiclePosition.setSpeed(50F);
            vehiclePosition.setCurrentElectricity(80);
            vehiclePosition.setMileageRange(300f);
            vehiclePosition.setHasOrder(0);
            vehiclePosition.setOrderId(orderId);
            vehiclePosition.setTotalOdometer(10000L);
            vehiclePosition.setAddTime(System.currentTimeMillis());
            mongoTemplate.save(vehiclePosition);
        }else{
            log.info("【模拟接单】更新MongoDB车辆位置记录,vin={}", xpVehicle.getVehicleVin());
            vehiclePosition.setOrderId(orderId);
            Update update = new Update()
                    .set("point", new GeoJsonPoint(startLon, startLat))
                    .set("course", 60D)
                    .set("alt", 100F)
                    .set("speed", 50F)
                    .set("currentElectricity", 80)
                    .set("mileageRange", 300f)
                    .set("hasOrder", 0)
                    .set("orderId", orderId)
                    .set("totalOdometer", 10000L)
                    .set("addTime", System.currentTimeMillis());
            mongoTemplate.updateFirst(new Query(Criteria.where("vin").is(xpVehicle.getVehicleVin())), update, VehiclePosition.class);
        }
        orderId = xpOrder.getId();
        OrderRouteAndFareDto dto = new OrderRouteAndFareDto();
        dto.setOrderId(orderId);
xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/service/impl/XpPricingServiceImpl.java
@@ -238,16 +238,6 @@
    @Override
    public List<RouteAndFareVo> getRouteAndFare(RouteAndFareDto routeAndFareDto, String userId) {
//        // 判断是否5分钟内进行了查询 相同站点的起始点  并且是同时段
//        String key = "xp-map-query-" + routeAndFareDto.getOpenCityId()
//                + "-" + routeAndFareDto.getOrigin().getLongitude() + "-" + routeAndFareDto.getOrigin().getLatitude()
//                + "-" + routeAndFareDto.getDestination().getLongitude() + "-" + routeAndFareDto.getDestination().getLatitude() + "-" + getCurrentTimeSlot() + "-" + userId+routeAndFareDto.getUserCouponId();
//
//        if (redisService.hasKey(key)) {
//            String jsonStr = Objects.requireNonNull(redisService.getCacheObject(key)).toString();
//            RouteAndFareVo RouteAndFareVo = JSONObject.parseObject(jsonStr, RouteAndFareVo.class);
//            return (RouteAndFareVo);
//        }
        ArrayList<RouteAndFareVo> routeAndFareVos = new ArrayList<>(3);
        // 1. 基础数据查询
@@ -301,7 +291,8 @@
                xpPricingCardVo = xpPricingUtil.calculationPrice(userId,
                        JSON.parseObject(xpPricing.getBasicPricingJson()),
                        JSON.parseArray(xpPricing.getStartingFareJson()),
                        routeVo.getDistance(), routeVo.getDuration(), 0, 0.0, xpPricing.getIsDynamicPrice(), routeAndFareDto.getOpenCityId(), xpPricing.getDynamicPricingJson()
                        routeVo.getDistance(), routeVo.getDuration(), 0, 0.0, xpPricing.getIsDynamicPrice(),
                        routeAndFareDto.getOpenCityId(), xpPricing.getDynamicPricingJson()
                );
            } else {
                xpPricingCardVo = xpPricingUtil.calculationFixedPrice(userId,
xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/utils/XpPricingUtil.java
@@ -80,7 +80,8 @@
    /**
     * 计算一口价
     */
    public XpPricingCardVo calculationFixedPrice(String uid, JSONObject rule, JSONArray startingFareJson, double distance, long duration, long wait, Double waitMoney, Integer isDynamicPriceStatus, Long openCityId, String dynamicPricingJson) {
    public XpPricingCardVo calculationFixedPrice(String uid, JSONObject rule, JSONArray startingFareJson, double distance, long duration, long wait, Double waitMoney,
                                                 Integer isDynamicPriceStatus, Long openCityId, String dynamicPricingJson) {
        // 默认费率1
        double priceRate=1;
        if(isDynamicPriceStatus==1){
@@ -114,6 +115,7 @@
                                // 当前费率+(费率*上升百分比)
                                priceRate =  new BigDecimal(priceRate).multiply(divide).add(new BigDecimal(priceRate)).setScale(2, RoundingMode.HALF_UP).doubleValue();
                            }
                            //天气动态调价
                            JSONArray ws = jsonObject.getJSONArray("weather");
                            if(null != ws){
                                XpOpenCity openCity = openCityClient.getXpOpenCityById(openCityId).getData();
@@ -188,9 +190,8 @@
     * @return
     * @throws Exception
     */
    public XpPricingCardVo calculationPrice(String uid,JSONObject rule, JSONArray startingFareJson, double distance, long duration, long wait, Double waitMoney,Integer isDynamicPriceStatus,Long openCityId,String dynamicPricingJson) {
    public XpPricingCardVo calculationPrice(String uid,JSONObject rule, JSONArray startingFareJson, double distance, long duration,
                                            long wait, Double waitMoney,Integer isDynamicPriceStatus,Long openCityId,String dynamicPricingJson) {
        // 默认费率1
        double priceRate=1;
        if(isDynamicPriceStatus==1){
@@ -225,10 +226,27 @@
                                priceRate =  new BigDecimal(priceRate).multiply(divide).add(new BigDecimal(priceRate)).setScale(2, RoundingMode.HALF_UP).doubleValue();
                            }
                            // 天气预报动态调价
                            JSONArray ws = jsonObject.getJSONArray("weather");
                            if (null != ws) {
                                XpOpenCity openCity = openCityClient.getXpOpenCityById(openCityId).getData();
                                WeatherDTO data = xpMapClient.wether(openCity.getCityCode()).getData();
                                List<WeatherDTO.Lives> lives = data.getLives();
                                if (lives != null && !lives.isEmpty()) {
                                    String w = lives.get(0).getWeather();
                                    for (Object o : ws) {
                                        JSONObject ele = JSONObject.parseObject(o.toString());
                                        if (w.contains(ele.getString("weatherType"))) {
                                            double floatRate = jsonObject.getDouble("ratio");
                                            priceRate = new BigDecimal(priceRate).add(new BigDecimal(floatRate)).doubleValue();
                                            break;
                                        }
                                    }
                                }
                            }
                            // 冷却时间
                            Integer time = getOrderNum(jsonObject, 6);
                            // 触发调价了
                            redisService.setCacheObject("USER_DYNAMIC_PRICE_" + openCityId + "_" + uid, priceRate,time.longValue(), TimeUnit.MINUTES);
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpCruiseCheckInRuleServiceImpl.java
@@ -235,12 +235,6 @@
            vo.setIsInRange(true);
            vo.setMessageType(2);
            vo.setCheckLocationId(cruiseCheckInRuleLocation.getCheckLocationId());
//            Boolean read = redisService.getCacheObject("CHECK_IN_SCOPE:" + xpCheckLocation.getId());
//            if(null == read || !read){
//                vo.setMessageType(2);
//                vo.setCheckLocationId(cruiseCheckInRuleLocation.getCheckLocationId());
//                redisService.setCacheObject("CHECK_IN_SCOPE:" + xpCheckLocation.getId(), true, 1L, TimeUnit.HOURS);
//            }
            return vo;
        }
        //判断时间小于10分钟首次触发和小于3分钟再次触发
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/service/serviceimpl/XpElectronicFenceServiceImpl.java
@@ -297,20 +297,20 @@
        }
        //根据经纬度获取当前城市code
//        XpElectronicFenceArea xpElectronicFenceArea = dto.getElectronicFenceAreas().get(0);
//        String[] split = xpElectronicFenceArea.getFencePoints().split(",");
//        Coordinate[] coordinates = new Coordinate[split.length + 1];
//        for (int i = 0; i < split.length; i++) {
//            String[] split1 = split[i].split("_");
//            coordinates[i] = new Coordinate(Double.parseDouble(split1[0]), Double.parseDouble(split1[1]));
//        }
//        org.locationtech.jts.geom.Point point = calculateCentroid(coordinates);
//        Map<String, String> geocode = gdMapGeocodingUtil.geocode(point.getX() + "", point.getY() + "");
//        if (null == geocode) {
//            return R.fail("经纬度转换城市code失败");
//        }
//        String cityCode = geocode.get("cityCode");
//        dto.setCityCode(cityCode);
        XpElectronicFenceArea xpElectronicFenceArea = dto.getElectronicFenceAreas().get(0);
        String[] split = xpElectronicFenceArea.getFencePoints().split(",");
        Coordinate[] coordinates = new Coordinate[split.length + 1];
        for (int i = 0; i < split.length; i++) {
            String[] split1 = split[i].split("_");
            coordinates[i] = new Coordinate(Double.parseDouble(split1[0]), Double.parseDouble(split1[1]));
        }
        org.locationtech.jts.geom.Point point = calculateCentroid(coordinates);
        Map<String, String> geocode = gdMapGeocodingUtil.geocode(point.getX() + "", point.getY() + "");
        if (null == geocode) {
            return R.fail("经纬度转换城市code失败");
        }
        String cityCode = geocode.get("cityCode");
        dto.setCityCode(cityCode);
        xpElectronicFence.setCityCode(dto.getCityCode());
@@ -446,7 +446,7 @@
            QuartzManager.removeJob((ElectronicEffectJob.effect + xpElectronicFence.getId()).toUpperCase(), TimeJobType.ELECTRONIC_EFFECT);
            QuartzManager.removeJob((ElectronicEffectJob.failure + xpElectronicFence.getId()).toUpperCase(), TimeJobType.ELECTRONIC_FAILURE);
        }
        /*
        //根据经纬度获取当前城市code
        XpElectronicFenceArea electronicFenceArea = dto.getElectronicFenceAreas().get(0);
        String[] split = electronicFenceArea.getFencePoints().split(",");
@@ -462,7 +462,6 @@
        }
        String cityCode = geocode.get("cityCode");
        dto.setCityCode(cityCode);
         */
        xpElectronicFence.setCityCode(dto.getCityCode());
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/CustomerServiceController.java
@@ -183,13 +183,17 @@
            return R.ok();
        }
        AppUserLocationVo vo = new AppUserLocationVo();
        AppUserPosition userPosition = mongoTemplate.findOne(Query.query(Criteria.where("appUserId").is(xpOrder.getAppUserId())), AppUserPosition.class);
        if(null != userPosition){
            vo.setPassengerLng(userPosition.getPoint().getX());
            vo.setPassengerLat(userPosition.getPoint().getY());
            return R.ok(vo);
        }
        return R.ok();
        vo.setPassengerLng(104.5165135);
        vo.setPassengerLat(30.2566515);
        return R.ok(vo);
        // TODO 后期放开,临时mock
//        AppUserPosition userPosition = mongoTemplate.findOne(Query.query(Criteria.where("appUserId").is(xpOrder.getAppUserId())), AppUserPosition.class);
//        if(null != userPosition){
//            vo.setPassengerLng(userPosition.getPoint().getX());
//            vo.setPassengerLat(userPosition.getPoint().getY());
//            return R.ok(vo);
//        }
//        return R.ok();
    }
@@ -206,10 +210,42 @@
        if(null == xpOrder){
            return R.ok();
        }
        return R.ok();
        // TODO 后期放开,临时mock
//        R<VehicleDoorStatusVo> vehicleDoorStatus = xpVehicleClient.getVehicleDoorStatus(orderId);
//        if(200 != vehicleDoorStatus.getCode()){
//            return R.fail(vehicleDoorStatus.getMsg());
//        }
//        VehicleDoorStatusVo data = vehicleDoorStatus.getData();
        VehicleSeatStatusVo vo = new VehicleSeatStatusVo();
        //主驾
        VehicleSeatStatus frontLeft = new VehicleSeatStatus();
//        frontLeft.setSeatOccupied(data.getDriverSeatState() + "");
//        frontLeft.setSeatbeltFastened(data.getDrvSeatBeltBuckleSt() + "");
        frontLeft.setSeatOccupied("0");
        frontLeft.setSeatbeltFastened("0");
        vo.setFrontLeft(frontLeft);
        //副驾
        VehicleSeatStatus frontRight = new VehicleSeatStatus();
//        frontRight.setSeatOccupied(data.getPsngrSeatOccupancyStatus() + "");
//        frontRight.setSeatbeltFastened(data.getPsngrSeatBeltBuckleSt() + "");
        frontRight.setSeatOccupied("1");
        frontRight.setSeatbeltFastened("0");
        vo.setFrontRight(frontRight);
        //左后
        VehicleSeatStatus rearLeft = new VehicleSeatStatus();
//        rearLeft.setSeatOccupied(data.getSecRowLeftSeatOccupancyStatus() + "");
//        rearLeft.setSeatbeltFastened(data.getSecRowLtSeatBeltBuckleSt() + "");
        rearLeft.setSeatOccupied("1");
        rearLeft.setSeatbeltFastened("1");
        vo.setRearLeft(rearLeft);
        //右后
        VehicleSeatStatus rearRight = new VehicleSeatStatus();
//        rearRight.setSeatOccupied(data.getSecRowRightSeatOccupancyStatus() + "");
//        rearRight.setSeatbeltFastened(data.getSecRowRtSeatBeltBuckleSt() + "");
        rearRight.setSeatOccupied("0");
        rearRight.setSeatbeltFastened("0");
        vo.setRearRight(rearRight);
        return R.ok(vo);
    }
@@ -225,15 +261,18 @@
    public R<VehicleRangeVo> getVehicleRange(@PathVariable String orderId){
        XpOrder xpOrder = xpOrderService.getById(orderId);
        VehicleRangeVo vo = new VehicleRangeVo();
        if(null != xpOrder.getVehicleId()){
            XpVehicle xpVehicle = xpVehicleClient.queryById(xpOrder.getVehicleId()).getData();
            VehiclePosition vehiclePositions = mongoTemplate.findOne(Query.query(Criteria.where("vin").is(xpVehicle.getVehicleVin())), VehiclePosition.class);
            if(null == vehiclePositions){
                return R.ok();
            }
            vo.setBatteryLevel(vehiclePositions.getCurrentElectricity());
            vo.setEstimatedRange(Double.valueOf(vehiclePositions.getMileageRange()));
        }
        // TODO 后期放开,临时mock
//        if(null != xpOrder.getVehicleId()){
//            XpVehicle xpVehicle = xpVehicleClient.queryById(xpOrder.getVehicleId()).getData();
//            VehiclePosition vehiclePositions = mongoTemplate.findOne(Query.query(Criteria.where("vin").is(xpVehicle.getVehicleVin())), VehiclePosition.class);
//            if(null == vehiclePositions){
//                return R.ok();
//            }
//            vo.setBatteryLevel(vehiclePositions.getCurrentElectricity());
//            vo.setEstimatedRange(Double.valueOf(vehiclePositions.getMileageRange()));
//        }
        vo.setBatteryLevel(85);
        vo.setEstimatedRange(580D);
        return R.ok(vo);
    }
@@ -247,7 +286,38 @@
    @ApiOperation(value = "根据 订单查询四门三盖状态", notes = "客服系统对接")
    @ApiImplicitParam(name = "orderId", value = "订单ID", required = true, dataType = "Long", paramType = "path")
    public R<VehicleDoorStatusVo> getVehicleDoorStatus(@PathVariable Long orderId){
        VehicleDoorStatusVo data = xpVehicleClient.getVehicleDoorStatus(orderId).getData();
//        VehicleDoorStatusVo data = xpVehicleClient.getVehicleDoorStatus(orderId).getData();
        // TODO 后期放开,临时mock
        VehicleDoorStatusVo data = new VehicleDoorStatusVo();
        data.setFrontLeftDoor(0);
        data.setFrontRightDoor(0);
        data.setRearLeftDoor(0);
        data.setRearRightDoor(0);
        data.setTrunk(1);
        data.setFrunk(1);
        data.setHvacOn(0);
        data.setHvacInnerTempFloat(28.5);
        data.setHvacTempFloat(29.5);
        data.setRearLeftHvacTempFloat(29.5);
        data.setPassengerHvacTempFloat(29.5);
        data.setDriverSeatState(1);
        data.setPsngrSeatOccupancyStatus(0);
        data.setSecRowLeftSeatOccupancyStatus(0);
        data.setSecRowMidSeatOccupancyStatus(0);
        data.setSecRowRightSeatOccupancyStatus(0);
        data.setThirdRowLeftSeatOccupancyStatus(1);
        data.setThirdRowMidSeatOccupancyStatus(0);
        data.setThirdRowRightSeatOccupancyStatus(0);
        data.setDrvSeatBeltBuckleSt(1);
        data.setPsngrSeatBeltBuckleSt(0);
        data.setSecRowLtSeatBeltBuckleSt(0);
        data.setSecRowMidSeatBeltBuckleSt(0);
        data.setSecRowRtSeatBeltBuckleSt(0);
        data.setTrdRowLtSeatBeltBuckleSt(0);
        data.setTrdRowMidSeatBeltBuckleSt(0);
        data.setTrdRowRtSeatBeltBuckleSt(0);
        data.setSlowChargePortStatus(2);
        data.setFastChargePortStatus(2);
        return R.ok(data);
    }
@@ -272,21 +342,55 @@
            return R.ok();
        }
        VehicleFenceInformationVo vo = new VehicleFenceInformationVo();
        vo.setVehicleLng(vehiclePositions.getPoint().getX());
        vo.setVehicleLat(vehiclePositions.getPoint().getY());
        XpGeoFencingPolygon fencingPolygon = mongoTemplate.findOne(Query.query(Criteria.where("areaId").is(xpOrder.getXpElectronicFenceAreaId())), XpGeoFencingPolygon.class);
        List<FenceVo> collect = fencingPolygon.getPoints().getPoints().stream().map(point -> {
        // TODO 后期放开,临时mock
//        vo.setVehicleLng(vehiclePositions.getPoint().getX());
//        vo.setVehicleLat(vehiclePositions.getPoint().getY());
        vo.setVehicleLng(104.5313);
        vo.setVehicleLat(30.26335);
//        XpGeoFencingPolygon fencingPolygon = mongoTemplate.findOne(Query.query(Criteria.where("areaId").is(xpOrder.getXpElectronicFenceAreaId())), XpGeoFencingPolygon.class);
//        List<FenceVo> collect = fencingPolygon.getPoints().getPoints().stream().map(point -> {
//            FenceVo fenceVo = new FenceVo();
//            fenceVo.setLng(point.getX());
//            fenceVo.setLat(point.getY());
//            return fenceVo;
//        }).collect(Collectors.toList());
        List<FenceVo> collect = new ArrayList<FenceVo>(){{
            FenceVo fenceVo = new FenceVo();
            fenceVo.setLng(point.getX());
            fenceVo.setLat(point.getY());
            return fenceVo;
        }).collect(Collectors.toList());
            fenceVo.setLng(104.5313);
            fenceVo.setLat(30.26335);
            add(fenceVo);
            fenceVo = new FenceVo();
            fenceVo.setLng(104.5323);
            fenceVo.setLat(30.26325);
            add(fenceVo);
            fenceVo = new FenceVo();
            fenceVo.setLng(104.5353);
            fenceVo.setLat(30.26365);
            add(fenceVo);
            fenceVo = new FenceVo();
            fenceVo.setLng(104.5343);
            fenceVo.setLat(30.26375);
            add(fenceVo);
            fenceVo = new FenceVo();
            fenceVo.setLng(104.5373);
            fenceVo.setLat(30.26395);
            add(fenceVo);
            fenceVo = new FenceVo();
            fenceVo.setLng(104.5323);
            fenceVo.setLat(30.26375);
            add(fenceVo);
            fenceVo = new FenceVo();
            fenceVo.setLng(104.5343);
            fenceVo.setLat(30.26345);
            add(fenceVo);
        }};
        vo.setGeofenceBoundary(collect);
        GeoJsonPoint point = new GeoJsonPoint(vehiclePositions.getPoint().getX(), vehiclePositions.getPoint().getY());
        List<XpGeoFencingPolygon> polygon = mongoTemplate.find(Query.query(Criteria.where("points").intersects(point)), XpGeoFencingPolygon.class);
        Set<String> collect1 = polygon.stream().map(XpGeoFencingPolygon::getAreaId).collect(Collectors.toSet());
        vo.setIsOutOfGeofence(collect1.contains(xpOrder.getXpElectronicFenceAreaId()));
//        GeoJsonPoint point = new GeoJsonPoint(vehiclePositions.getPoint().getX(), vehiclePositions.getPoint().getY());
//        List<XpGeoFencingPolygon> polygon = mongoTemplate.find(Query.query(Criteria.where("points").intersects(point)), XpGeoFencingPolygon.class);
//        Set<String> collect1 = polygon.stream().map(XpGeoFencingPolygon::getAreaId).collect(Collectors.toSet());
//        vo.setIsOutOfGeofence(collect1.contains(xpOrder.getXpElectronicFenceAreaId()));
        vo.setIsOutOfGeofence(false);
        return R.ok(vo);
    }
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java
@@ -2404,7 +2404,68 @@
                totalPrice = totalPrice.add(xpOrderDetail1.getMoney());
                xpOrderDetailMapper.insert(xpOrderDetail1);
            }
            order.setOrderMoney(totalPrice);
            // 默认费率1
            double priceRate = 1;
            if (pricing.getIsDynamicPrice() == 1) {
                // 先判断是否已经调价过了
                Object userDynamicPriceObj = redisService.getCacheObject("USER_DYNAMIC_PRICE_" + order.getCityId() + "_" + uid);
                if (userDynamicPriceObj != null) {
                    // 是否调价过了
                    priceRate = Double.parseDouble(userDynamicPriceObj.toString());
                } else {
                    // 没有调过
                    //是否触发动态调价 redis获取
                    Object dynamicPriceObj = redisService.getCacheObject("DYNAMIC_PRICE_" + order.getCityId());
                    if (dynamicPriceObj != null) {
                        JSONObject jsonObject = JSONObject.parseObject(pricing.getDynamicPricingJson());
                        // 触发动态调价
                        // value=时间
                        String timeStr = dynamicPriceObj.toString();
                        // 判断当前距离这个时间范围的新增订单数(排除取消) / 上浮数量 算出应该增加的价格率
                        Integer num = this.getOrderNum(new GetOrderNumDto(timeStr, order.getCityId()));
                        // X单上升一次调价
                        Integer orderNum = getOrderNum(jsonObject, 4);
                        // 需要调价的次数
                        int count = num / orderNum;
                        if (count > 0) {
                            // 计算每次上升的费率
                            Integer upRate = getOrderNum(jsonObject, 5);
                            BigDecimal divide = new BigDecimal(upRate).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP);
                            for (int i = count; i > 0; i--) {
                                // 当前费率+(费率*上升百分比)
                                priceRate = new BigDecimal(priceRate).multiply(divide).add(new BigDecimal(priceRate)).setScale(2, RoundingMode.HALF_UP).doubleValue();
                            }
                            // 天气预报动态调价
                            JSONArray ws = jsonObject.getJSONArray("weather");
                            if (null != ws) {
                                WeatherDTO data = xpMapClient.wether(order.getCityCode()).getData();
                                List<WeatherDTO.Lives> lives = data.getLives();
                                if (lives != null && !lives.isEmpty()) {
                                    String w = lives.get(0).getWeather();
                                    for (Object o : ws) {
                                        JSONObject ele = JSONObject.parseObject(o.toString());
                                        if (w.contains(ele.getString("weatherType"))) {
                                            double floatRate = jsonObject.getDouble("ratio");
                                            priceRate = new BigDecimal(priceRate).add(new BigDecimal(floatRate)).doubleValue();
                                            break;
                                        }
                                    }
                                }
                            }
                            // 冷却时间
                            Integer time = getOrderNum(jsonObject, 6);
                            // 触发调价了
                            redisService.setCacheObject("USER_DYNAMIC_PRICE_" + order.getCityId() + "_" + uid, priceRate, time.longValue(), TimeUnit.MINUTES);
                        }
                    }
                }
            }
            order.setOrderMoney(totalPrice.multiply(new BigDecimal(priceRate)));
            order.setAppUserId(null);
            baseMapper.updateById(order);
        } else {
@@ -2523,7 +2584,6 @@
                        }
                    }
                }
            }
            // 封装费用明细数据
            for (Map.Entry<String, BigDecimal> stringBigDecimalEntry : bill.entrySet()) {
@@ -3550,6 +3610,7 @@
                addTaxiPassengerVo.setUid(appUserId.toString());
                order.setAppUserId(null);
                this.updateById(order);
                order.setAppUserId(appUserId);
                bootCommonService.setCache_orderStatus(order.getId(), order, null);
                //构建推送消息
@@ -3591,19 +3652,18 @@
                //生成前往上车点的导航数据
                //查询车辆位置
                //TODO 本地环境默认写死
                // VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(dto.getXpVehicleVin())), VehiclePosition.class);
                // if (Objects.isNull(vehiclePosition)) {
                //     throw new RuntimeException("车辆位置信息不存在");
                // }
                 VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(dto.getXpVehicleVin())), VehiclePosition.class);
                 if (Objects.isNull(vehiclePosition)) {
                     throw new RuntimeException("车辆位置信息不存在");
                 }
                LonLatDto destination = new LonLatDto();
                LonLatDto origin = new LonLatDto();
                //查询司机当前位置到起点的线路
                // origin.setLongitude(vehiclePosition.getPoint().getX());
                // origin.setLatitude(vehiclePosition.getPoint().getY());
                origin.setLongitude(104.055499);
                origin.setLatitude(30.586747);
                 origin.setLongitude(vehiclePosition.getPoint().getX());
                 origin.setLatitude(vehiclePosition.getPoint().getY());
//                origin.setLongitude(104.055499);
//                origin.setLatitude(30.586747);
                destination.setLongitude(order.getStartLon());
                destination.setLatitude(order.getStartLat());
@@ -3634,25 +3694,25 @@
                        .plusMinutes(routeVo1.getDuration()).plusMinutes(endPoint.getParkingTimeLimit()).plusMinutes(30);
                long expirationTime = localDateTime.toEpochSecond(ZoneOffset.of("+8"));
                //生成token
//                String token = bluetoothUnlockTokenUtil.generateBluetoothUnlockToken(order.getAppUserId(),
//                        order.getId(), order.getVehicleId(), expirationTime);
//                log.info("生成蓝牙token:{} 有效期:{} 订单号: {}", token, expirationTime, order.getOrderNumber());
//                //存储缓存
//                JSONObject jsonObject = new JSONObject();
//                jsonObject.put("userId", order.getAppUserId());
//                jsonObject.put("orderId", order.getId());
//                jsonObject.put("vehicleId", order.getVehicleId());
//                jsonObject.put("expirationTime", expirationTime);
//                jsonObject.put("orderNumber", order.getOrderNumber());
//                jsonObject.put("vehicleVin", vehicle.getVehicleVin());
//                jsonObject.put("createTime", System.currentTimeMillis());
//                redisService.setCacheObject("rt:bluetooth:unlock:" + token, jsonObject.toJSONString(), expirationTime, TimeUnit.SECONDS);
//                redisService.setCacheObject("rt:bluetooth:unlock:order:" + order.getId(), token, expirationTime, TimeUnit.SECONDS);
//                //开始下发蓝牙token
//                BluetoothDeliverVo vo = new BluetoothDeliverVo();
//                vo.setCredential(token);
//                vo.setVim(vehicle.getVehicleVin());
//                vo.setPassengerUid(order.getAppUserId());
                String token = bluetoothUnlockTokenUtil.generateBluetoothUnlockToken(order.getAppUserId(),
                        order.getId(), order.getVehicleId(), expirationTime);
                log.info("生成蓝牙token:{} 有效期:{} 订单号: {}", token, expirationTime, order.getOrderNumber());
                //存储缓存
                JSONObject jsonObject = new JSONObject();
                jsonObject.put("userId", order.getAppUserId());
                jsonObject.put("orderId", order.getId());
                jsonObject.put("vehicleId", order.getVehicleId());
                jsonObject.put("expirationTime", expirationTime);
                jsonObject.put("orderNumber", order.getOrderNumber());
                jsonObject.put("vehicleVin", vehicle.getVehicleVin());
                jsonObject.put("createTime", System.currentTimeMillis());
                redisService.setCacheObject("rt:bluetooth:unlock:" + token, jsonObject.toJSONString(), expirationTime, TimeUnit.SECONDS);
                redisService.setCacheObject("rt:bluetooth:unlock:order:" + order.getId(), token, expirationTime, TimeUnit.SECONDS);
                //开始下发蓝牙token
                BluetoothDeliverVo vo = new BluetoothDeliverVo();
                vo.setCredential(token);
                vo.setVim(vehicle.getVehicleVin());
                vo.setPassengerUid(order.getAppUserId());
//                BaseVehicleUserDto deliver = bluetoothUnlockClient.deliver(vo);
//                if(null == deliver){
//                    throw new ServiceException("下发蓝牙token失败");
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/vo/VehicleSeatStatus.java
@@ -7,8 +7,8 @@
@Data
@ApiModel
public class VehicleSeatStatus {
    @ApiModelProperty("座椅状态")
    @ApiModelProperty("座椅状态 0-无人,1-有人")
    private String seatOccupied;
    @ApiModelProperty("安全带状态")
    @ApiModelProperty("安全带状态 0:已解开 1:未解开")
    private String seatbeltFastened;
}
xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/webSocket/controller/WebSocketController.java
@@ -104,7 +104,7 @@
     * @return 操作结果
     */
    @ApiOperation(value = "发送车辆路线、时间")
    @PostMapping("/inner/websocket/order/sendRoute")
    @PostMapping("/logan/inner/websocket/order/sendRoute")
    public R<String> sendRoute(@RequestBody SendMessageDTO dto) {
        try {
            String message = dto.getMessage();