无关风月
2026-02-27 d6b1b931dfb218e1cc06128450be1ad8225bc9fb
Merge remote-tracking branch 'origin/master'
4个文件已添加
8个文件已修改
395 ■■■■■ 已修改文件
xp-robotaxi-account-boot/src/main/resources/mapper/account/SysUserMapper.xml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/dto/pushMessage/AliPushMessageDTO.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/pushMessage/XpAliPushMessageClientFallbackFactory.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/pushMessage/XpAliPushMessageClient.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/controller/XpPricingController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/service/XpPricingService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/service/impl/XpPricingServiceImpl.java 130 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/utils/XpPricingUtil.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/controller/AliPushController.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/utils/AliPushUtil.java 112 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/service/impl/XpVehicleServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/resources/mapper/account/SysUserMapper.xml
@@ -34,7 +34,7 @@
    </resultMap>
    
    <resultMap id="RoleResult" type="com.xiaopeng.api.model.account.SysRole">
        <id     property="id"       column="role_id"        />
        <id     property="id"       column="id"        />
        <result property="roleName"     column="role_name"      />
        <result property="groupId"      column="group_id"       />
        <result property="remarks"     column="remarks"    />
xp-robotaxi-api/src/main/java/com/xiaopeng/api/dto/pushMessage/AliPushMessageDTO.java
New file
@@ -0,0 +1,25 @@
package com.xiaopeng.api.dto.pushMessage;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
@Data
@ApiModel(value = "ali推送消息AliPushMessageDTO")
public class AliPushMessageDTO implements Serializable {
    @ApiModelProperty(value = "设备类型")
    private Integer deviceType;
    @ApiModelProperty(value = "运维手机号")
    private String account;
    @ApiModelProperty(value = "标题")
    private String title;
    @ApiModelProperty(value = "消息内容")
    private String body;
}
xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/pushMessage/XpAliPushMessageClientFallbackFactory.java
New file
@@ -0,0 +1,32 @@
package com.xiaopeng.api.factory.pushMessage;
import com.xiaopeng.api.dto.pushMessage.AliPushMessageDTO;
import com.xiaopeng.api.dto.pushMessage.PushOrderRouteDTO;
import com.xiaopeng.api.dto.pushMessage.SendMessageDTO;
import com.xiaopeng.api.feignClient.pushMessage.XpAliPushMessageClient;
import com.xiaopeng.api.feignClient.pushMessage.XpPushMessageClient;
import com.xiaopeng.common.core.domain.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.openfeign.FallbackFactory;
import org.springframework.stereotype.Component;
/**
 * 消息Feign客户端降级工厂
 *
 * @author mitao
 */
@Slf4j
@Component
public class XpAliPushMessageClientFallbackFactory implements FallbackFactory<XpAliPushMessageClient> {
    @Override
    public XpAliPushMessageClient create(Throwable cause) {
        log.error("阿里消息服务调用失败: {}", cause.getMessage());
        return new XpAliPushMessageClient() {
            @Override
            public R<String> pushMessage(AliPushMessageDTO dto) {
                return R.fail("运维APP消息推送失败,"+cause.getMessage());
            }
        };
    }
}
xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/pushMessage/XpAliPushMessageClient.java
New file
@@ -0,0 +1,33 @@
package com.xiaopeng.api.feignClient.pushMessage;
import com.xiaopeng.api.dto.pushMessage.AliPushMessageDTO;
import com.xiaopeng.api.dto.pushMessage.PushOrderRouteDTO;
import com.xiaopeng.api.dto.pushMessage.SendMessageDTO;
import com.xiaopeng.api.factory.pushMessage.XpAliPushMessageClientFallbackFactory;
import com.xiaopeng.api.factory.pushMessage.XpPushMessageClientFallbackFactory;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.common.core.dto.ServiceNameConstantsEnum;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
/**
 * 消息Feign客户端
 *
 * @author xiaochen
 */
@FeignClient(contextId = "XpAliPushMessageClient",
        value = ServiceNameConstantsEnum.XP_PUSH_MESSAGE_SERVICE,
        fallbackFactory = XpAliPushMessageClientFallbackFactory.class)
public interface XpAliPushMessageClient {
    /**
     * 订单状态推送
     *
     * @param dto 消息实体
     * @return 订单状态推送
     */
    @PostMapping("/inner/v1/aliPush/pushMessage")
    R<String> pushMessage(@RequestBody AliPushMessageDTO dto);
}
xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/controller/XpPricingController.java
@@ -98,6 +98,11 @@
    @GetMapping("/base/v1/mini-program/order/testOrder")
    public R testOrder(Long orderId, Integer status){
        xpPricingService.testOrder(orderId, status);
        return R.ok();
    }
}
xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/service/XpPricingService.java
@@ -45,6 +45,6 @@
     */
    Long saveOrder(XpOrderDto dto, String uid);
    void testOrder(Long orderId, Integer status);
}
xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/service/impl/XpPricingServiceImpl.java
@@ -554,7 +554,7 @@
        // 静默处理 不推单
        if (isSilent) {
            // todo 用于测试流程,正式联调需要删除此代码
            testOrder(orderId);
//            testOrder(orderId);
            return orderId;
        }
@@ -677,25 +677,20 @@
     * 测试阶段用于自动完成小程序的整个流程数据状态流转
     * @param orderId
     */
    private void testOrder(Long orderId){
        ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(10000));
        poolExecutor.execute(()->{
            XpOrder xpOrder = xpOrderClient.queryOrderById(orderId).getData();
    public void testOrder(Long orderId, Integer status){
        XpOrder xpOrder = xpOrderClient.queryOrderById(orderId).getData();
        Long appUserId = xpOrder.getAppUserId();
        if(2 == status){
            if(xpOrder.getStatus() == 0){
                return;
            }
            Long appUserId = xpOrder.getAppUserId();
            xpOrder.setAppUserId(null);
            xpOrder.setStatus(2);
            xpOrder.setVehicleId(1L);
            xpOrder.setFleetId(2L);
            xpOrderClient.updateOrder(xpOrder);
            //等待5秒钟
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
        if(3 == status){
            //修改状态为接驾中
            xpOrder = xpOrderClient.queryOrderById(orderId).getData();
            if(xpOrder.getStatus() == 0){
@@ -710,6 +705,7 @@
            dto.setMessage("{\"type\":\"ORDER_STATUS\",\"content\":\"{\\\"orderId\\\":\\\"" + orderId + "\\\",\\\"status\\\":3}\",\"timestamp\":\"176569945845456\"}");
            xpPushMessageClient.sendStatus(dto);
            //推送车辆位置
            dto.setAppUserId(appUserId.toString());
            dto.setMessage("{\"type\":\"VEHICLE_LOCATION\",\"content\":\"{\\\"orderId\\\":\\\"" + orderId + "\\\",\\\"lon\\\":113.385848,\\\"lat\\\":23.156841}\",\"timestamp\":\"176569945845456\"}");
            xpPushMessageClient.sendVehicleLocation(dto);
            //发送车辆到达起点的轨迹
@@ -749,13 +745,8 @@
            messageDTO.setAppUserId(appUserId.toString());
            messageDTO.setMessage(jsonObject.toJSONString());
            xpPushMessageClient.sendRoute(messageDTO);
            //等待10秒钟
            try {
                Thread.sleep(10000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
        if(4 == status){
            //司机到达起点
            xpOrder = xpOrderClient.queryOrderById(orderId).getData();
            if(xpOrder.getStatus() == 0){
@@ -764,18 +755,16 @@
            xpOrder.setAppUserId(null);
            xpOrder.setStatus(4);
            xpOrderClient.updateOrder(xpOrder);
            SendMessageDTO dto = new SendMessageDTO();
            dto.setAppUserId(appUserId.toString());
            dto.setMessage("{\"type\":\"ORDER_STATUS\",\"content\":\"{\\\"orderId\\\":\\\"" + orderId + "\\\",\\\"status\\\":4}\",\"timestamp\":\"176569945845456\"}");
            xpPushMessageClient.sendStatus(dto);
            //推送车辆位置到起点
            dto.setAppUserId(appUserId.toString());
            dto.setMessage("{\"type\":\"VEHICLE_LOCATION\",\"content\":\"{\\\"orderId\\\":\\\"" + orderId + "\\\",\\\"lon\\\":" + xpOrder.getStartLon() + ",\\\"lat\\\":" + xpOrder.getStartLat() + "}\",\"timestamp\":\"176569945845456\"}");
            xpPushMessageClient.sendVehicleLocation(dto);
            //等待5秒钟
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
        if(5 == status){
            //乘客上车
            xpOrder = xpOrderClient.queryOrderById(orderId).getData();
            if(xpOrder.getStatus() == 0){
@@ -788,38 +777,28 @@
            xpOrder.setBoardingLon(xpOrder.getStartLon());
            xpOrder.setBoardingAddress(xpOrder.getStartAddress());
            xpOrderClient.updateOrder(xpOrder);
            SendMessageDTO dto = new SendMessageDTO();
            dto.setAppUserId(appUserId.toString());
            dto.setMessage("{\"type\":\"ORDER_STATUS\",\"content\":\"{\\\"orderId\\\":\\\"" + orderId + "\\\",\\\"status\\\":5}\",\"timestamp\":\"176569945845456\"}");
            xpPushMessageClient.sendStatus(dto);
            //等待5秒钟
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            //开始服务中
            xpOrder.setStatus(6);
            xpOrder.setTripBegin(LocalDateTime.now());
            xpOrderClient.updateOrder(xpOrder);
            dto.setMessage("{\"type\":\"ORDER_STATUS\",\"content\":\"{\\\"orderId\\\":\\\"" + orderId + "\\\",\\\"status\\\":6}\",\"timestamp\":\"176569945845456\"}");
            xpPushMessageClient.sendStatus(dto);
            //推送起点到终点的行驶轨迹
            RouteAndFareDto routeAndFareDto = new RouteAndFareDto();
            routeAndFareDto = new RouteAndFareDto();
            routeAndFareDto.setDestination(new LonLatDto(xpOrder.getEndLon(), xpOrder.getEndLat()));
            routeAndFareDto.setOrigin(new LonLatDto(xpOrder.getStartLon(), xpOrder.getStartLat()));
            routeAndFareDto.setOpenCityId(2L);
            routeVo = xpMapClient.getDistanceAndDuration(routeAndFareDto).getData();
            jsonObject = new com.alibaba.fastjson2.JSONObject();
            RouteVo routeVo = xpMapClient.getDistanceAndDuration(routeAndFareDto).getData();
            com.alibaba.fastjson2.JSONObject jsonObject = new com.alibaba.fastjson2.JSONObject();
            jsonObject.put("type", "ORDER_ROUTE");
            jsonObject.put("timestamp", System.currentTimeMillis());
            content = new com.alibaba.fastjson2.JSONObject();
            com.alibaba.fastjson2.JSONObject content = new com.alibaba.fastjson2.JSONObject();
            content.put("orderId", orderId);
            content.put("routeType", 2);
            route = new com.alibaba.fastjson2.JSONObject();
            com.alibaba.fastjson2.JSONObject route = new com.alibaba.fastjson2.JSONObject();
            route.put("distance", routeVo.getDistance());
            route.put("duration", routeVo.getDuration());
            route.put("routeID", routeVo.getRouteID());
            collect = routeVo.getPolyline().stream().map(item->{
            List<com.alibaba.fastjson2.JSONObject> collect = routeVo.getPolyline().stream().map(item->{
                com.alibaba.fastjson2.JSONObject point = new com.alibaba.fastjson2.JSONObject();
                point.put("latitude", item.getLatitude());
                point.put("longitude", item.getLongitude());
@@ -828,18 +807,26 @@
            route.put("polyline", collect);
            content.put("route", route.toJSONString());
            jsonObject.put("content", content.toJSONString());
            messageDTO = new SendMessageDTO();
            SendMessageDTO messageDTO = new SendMessageDTO();
            messageDTO.setAppUserId(appUserId.toString());
            messageDTO.setMessage(jsonObject.toJSONString());
            xpPushMessageClient.sendRoute(messageDTO);
        }
        if(6 == status){
            //开始服务中
            xpOrder.setAppUserId(null);
            xpOrder.setStatus(6);
            xpOrder.setTripBegin(LocalDateTime.now());
            xpOrderClient.updateOrder(xpOrder);
            SendMessageDTO dto = new SendMessageDTO();
            dto.setAppUserId(appUserId.toString());
            dto.setMessage("{\"type\":\"ORDER_STATUS\",\"content\":\"{\\\"orderId\\\":\\\"" + orderId + "\\\",\\\"status\\\":6}\",\"timestamp\":\"176569945845456\"}");
            xpPushMessageClient.sendStatus(dto);
        }
            //等到10秒钟
            try {
                Thread.sleep(10000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        if(7 == status){
            //乘客待下车
            xpOrder.setAppUserId(null);
            xpOrder.setStatus(7);
            xpOrder.setTripEnd(LocalDateTime.now());
            xpOrder.setGetoffLat(xpOrder.getEndLat());
@@ -859,7 +846,16 @@
            xpOrder.setLongDistanceType(1);
            xpOrder.setLongDistancemoney(new BigDecimal(10));
            xpOrderClient.updateOrder(xpOrder);
            //添加费用明细
            //推送车辆位置到起点
            SendMessageDTO dto = new SendMessageDTO();
            dto.setAppUserId(appUserId.toString());
            dto.setMessage("{\"type\":\"VEHICLE_LOCATION\",\"content\":\"{\\\"orderId\\\":\\\"" + orderId + "\\\",\\\"lon\\\":" + xpOrder.getEndLon() + ",\\\"lat\\\":" + xpOrder.getEndLat() + "}\",\"timestamp\":\"176569945845456\"}");
            xpPushMessageClient.sendVehicleLocation(dto);
            dto.setAppUserId(appUserId.toString());
            dto.setMessage("{\"type\":\"ORDER_STATUS\",\"content\":\"{\\\"orderId\\\":\\\"" + orderId + "\\\",\\\"status\\\":7}\",\"timestamp\":\"176569945845456\"}");
            xpPushMessageClient.sendStatus(dto);
        }
        //添加费用明细
//            XpOrderDetail detail = new XpOrderDetail();
//            detail.setDetailType(1);
//            detail.setOrderId(orderId);
@@ -874,36 +870,26 @@
//            xpOrder
            //推送车辆位置到起点
            dto.setMessage("{\"type\":\"VEHICLE_LOCATION\",\"content\":\"{\\\"orderId\\\":\\\"" + orderId + "\\\",\\\"lon\\\":" + xpOrder.getEndLon() + ",\\\"lat\\\":" + xpOrder.getEndLat() + "}\",\"timestamp\":\"176569945845456\"}");
            xpPushMessageClient.sendVehicleLocation(dto);
            dto.setMessage("{\"type\":\"ORDER_STATUS\",\"content\":\"{\\\"orderId\\\":\\\"" + orderId + "\\\",\\\"status\\\":7}\",\"timestamp\":\"176569945845456\"}");
            xpPushMessageClient.sendStatus(dto);
            //等到5秒钟
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        if(8 == status){
            //乘客待支付
            xpOrder.setAppUserId(null);
            xpOrder.setStatus(8);
            xpOrderClient.updateOrder(xpOrder);
            SendMessageDTO dto = new SendMessageDTO();
            dto.setAppUserId(appUserId.toString());
            dto.setMessage("{\"type\":\"ORDER_STATUS\",\"content\":\"{\\\"orderId\\\":\\\"" + orderId + "\\\",\\\"status\\\":8}\",\"timestamp\":\"176569945845456\"}");
            xpPushMessageClient.sendStatus(dto);
        }
            //等到5秒钟
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        if(9 == status){
            //乘客支付成功
            xpOrder.setAppUserId(null);
            xpOrder.setStatus(9);
            xpOrderClient.updateOrder(xpOrder);
            SendMessageDTO dto = new SendMessageDTO();
            dto.setAppUserId(appUserId.toString());
            dto.setMessage("{\"type\":\"ORDER_STATUS\",\"content\":\"{\\\"orderId\\\":\\\"" + orderId + "\\\",\\\"status\\\":9}\",\"timestamp\":\"176569945845456\"}");
            xpPushMessageClient.sendStatus(dto);
        });
        }
    }
}
xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/utils/XpPricingUtil.java
@@ -127,10 +127,10 @@
        Double startPrice = rule.getDouble("num1");
        // 超出公里数价格
        Double distancePrice = rule.getDouble("num4") * exceedDistance;
        Double distancePrice = new BigDecimal(rule.getDouble("num4") * exceedDistance).setScale(2,RoundingMode.HALF_UP).doubleValue();
        // 超出时间价格
        Double durationPrice = rule.getDouble("num5") * exceedTime;
        Double durationPrice = new BigDecimal(rule.getDouble("num5") * exceedTime).setScale(2,RoundingMode.HALF_UP).doubleValue();
        startPrice = new BigDecimal(startPrice).multiply(BigDecimal.valueOf(priceRate)).setScale(2, RoundingMode.HALF_UP).doubleValue();
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java
@@ -706,7 +706,9 @@
        List<XpOrderHistoryDateVO> dateVOS = map.entrySet().stream().map(entry -> {
            XpOrderHistoryDateVO xpOrderHistoryDateVO = new XpOrderHistoryDateVO();
            xpOrderHistoryDateVO.setDateLabel(entry.getKey().toString());
            xpOrderHistoryDateVO.setOrders(entry.getValue());
            List<XpOrderHistoryListVO> value = entry.getValue();
            value = value.stream().sorted(Comparator.comparing(XpOrderHistoryListVO::getTime).reversed()).collect(Collectors.toList());
            xpOrderHistoryDateVO.setOrders(value);
            return xpOrderHistoryDateVO;
        }).collect(Collectors.toList());
        xpOrderHistoryVO.setList(dateVOS);
xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/controller/AliPushController.java
New file
@@ -0,0 +1,41 @@
package com.xiaopeng.pushMessage.controller;
import com.xiaopeng.api.dto.pushMessage.AliPushMessageDTO;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.common.redis.service.RedisService;
import com.xiaopeng.pushMessage.utils.AliPushUtil;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@Api(tags = "阿里消息接口")
@RestController
@RequestMapping("")
public class AliPushController {
    @Autowired
    private RedisService redisService;
    @Autowired
    private AliPushUtil aliPushUtil;
    /**
     * 运维端消息推送测试
     * @return
     */
    @GetMapping("/base/v1/aliPush/test")
    public R<String> test() throws Exception {
        String s = aliPushUtil.pushMessage(1, "13540694412", "测试", "{\"content\":\"测试消息\",\"strategy\":1\"type\":1,\"id\":1}");
        return R.ok(s);
    }
    /**
     * 运维端消息推送
     * @return
     */
    @PostMapping("/inner/v1/aliPush/pushMessage")
    public R<String> pushMessage(@RequestBody AliPushMessageDTO dto) {
        String result = aliPushUtil.pushMessage(dto.getDeviceType(), dto.getAccount(), dto.getTitle(), dto.getBody());
        return R.ok(result);
    }
}
xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/utils/AliPushUtil.java
@@ -9,12 +9,14 @@
import darabonba.core.client.ClientOverrideConfiguration;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
//import javax.net.ssl.KeyManager;
//import javax.net.ssl.X509TrustManager;
import java.util.concurrent.CompletableFuture;
@Slf4j
@Component
public class AliPushUtil {
    @Value("${ali.push.accessKeyId}")
@@ -27,6 +29,10 @@
    private Long appKey;
    @Value("${ali.push.iosAppKey}")
    private Long iosAppKey;
    @Value("${ali.push.channelId}")
    private String channelId;
    @Value("${ali.push.iosChannelId}")
    private String iosChannelId;
    /**
     * 消息类型  MESSAGE 消息  NOTICE  通知
     */
@@ -50,62 +56,74 @@
    /**
     *
     *  消息推送方法
     * @param account 运维手机号
     * @param title 标题
     * @param body 消息内容
     * @throws Exception
     */
    public String pushMessage(Integer deviceType,String account, String title, String body) throws Exception {
    public String pushMessage(Integer deviceType,String account, String title, String body){
        StaticCredentialProvider credentialProvider = StaticCredentialProvider.create(
                Credential.builder()
                        .accessKeyId(accessKeyId)
                        .accessKeySecret(accessKeySecret)
                        .build()
        );
        try {
            StaticCredentialProvider credentialProvider = StaticCredentialProvider.create(
                    Credential.builder()
                            .accessKeyId(accessKeyId)
                            .accessKeySecret(accessKeySecret)
                            .build()
            );
        // Configure the Client
        try (AsyncClient client = AsyncClient.builder()
                .region(regionId) // Region ID
                .credentialsProvider(credentialProvider)
                .overrideConfiguration(
                    ClientOverrideConfiguration.create()
                    .setEndpointOverride("cloudpush.aliyuncs.com")
                )
                .build()) {
            // Configure the Client
            try (AsyncClient client = AsyncClient.builder()
                    .region(regionId) // Region ID
                    .credentialsProvider(credentialProvider)
                    .overrideConfiguration(
                            ClientOverrideConfiguration.create()
                                    .setEndpointOverride("cloudpush.aliyuncs.com")
                    )
                    .build()) {
            // 判断账号类型
            Long appKeys = appKey;
            if(deviceType == 2){
                appKeys = iosAppKey;
                // 判断账号类型
                Long appKeys = appKey;
                if(deviceType == 2){
                    appKeys = iosAppKey;
                }
                String channelIds = channelId;
                if(deviceType == 2){
                    channelIds = iosChannelId;
                }
                PushRequest pushRequest = PushRequest.builder()
                        .appKey(appKeys)
                        .pushType(PUSH_TYPE)
                        .deviceType(DEVICE_TYPE_ALL)
                        .target(TARGET)
                        .targetValue(account)
                        .title(title)
                        .body(body)
                        .androidNotificationChannel(channelIds)
                        .build();
                CompletableFuture<PushResponse> response = client.push(pushRequest);
                PushResponse resp = response.get();
                String json = new Gson().toJson(resp);
                log.info("运维APP-消息推送:{}",json);
                JSONObject jsonObject = JSONObject.parseObject(json);
                Integer statusCode = jsonObject.getInteger("statusCode");
                if(statusCode == 200){
                    log.info("运维APP-消息推送成功");
                    JSONObject resultBody = jsonObject.getJSONObject("body");
                    return resultBody.getString("messageId");
                }else{
                    log.info("运维APP-消息推送失败");
                    return null;
                }
            }
            PushRequest pushRequest = PushRequest.builder()
                    .appKey(appKeys)
                    .pushType(PUSH_TYPE)
                    .deviceType(DEVICE_TYPE_ALL)
                    .target(TARGET)
                    .targetValue(account)
                    .title(title)
                    .body(body)
                    .build();
            CompletableFuture<PushResponse> response = client.push(pushRequest);
            PushResponse resp = response.get();
            String json = new Gson().toJson(resp);
            log.info("运维APP-消息推送:{}",json);
            JSONObject jsonObject = JSONObject.parseObject(json);
            Integer statusCode = jsonObject.getInteger("statusCode");
            if(statusCode == 200){
                log.info("运维APP-消息推送成功");
                JSONObject resultBody = jsonObject.getJSONObject("body");
                return resultBody.getString("messageId");
            }else{
                log.info("运维APP-消息推送失败");
                return null;
            }
        } catch (Exception e) {
            log.info("运维APP-消息推送失败-异常");
            e.printStackTrace();
            return null;
        }
    }
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/service/impl/XpVehicleServiceImpl.java
@@ -150,6 +150,11 @@
        vehiclesCommandVo.setUid(xpOrder.getAppUserId());
        vehiclesCommandVo.setVin(xpVehicle.getVehicleVin());
        if("door".equals(dto.getDoorType())){
            // 开启车门 判断是否为P档
            Integer gearLevel = redisService.getCacheObject(CacheConstants.GEAR_LEVEL + xpVehicle.getVehicleVin());
            if(gearLevel == null || gearLevel != 4){
                throw new ServiceException("车辆非P档,无法开启车门", I18nKeyConstant.VEHICLE_NOT_P_GEAR);
            }
            vehiclesCommandVo.setCommandCode(VehiclesCommandEnum.DOOR_UNLOCK);
        }else {
            // 开启后备箱 判断是否为P档