yyy
2026-05-07 acb114190c6e6843a071c6ce50b1e28027adc862
Merge remote-tracking branch 'origin/1.0' into 1.0
14个文件已修改
286 ■■■■■ 已修改文件
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/model/dto/QualificationReviewDTO.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/XpAppUserCouponServiceImpl.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/XpQualificationAuditServiceImpl.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/account/XpQualificationAudit.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/operation/XpActicityStrategy.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/vehicleConvoy/VehicleDoorStatusVo.java 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/controller/XpMapController.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/controller/XpPointManagementController.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpActicityServiceImpl.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/CustomerServiceController.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/IXpOrderService.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/CarControlCallbackController.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/service/impl/XpVehicleServiceImpl.java 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/model/dto/QualificationReviewDTO.java
@@ -17,4 +17,7 @@
    @ApiModelProperty(value = "审核状态 1待审核 2审核通过 3审核驳回")
    private Integer auditStatus;
    @ApiModelProperty(value = "审核备注")
    private String auditRemarks;
}
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/XpAppUserCouponServiceImpl.java
@@ -570,7 +570,7 @@
                }
            }
            if(2 == effectiveRules){
                String format = acticityStrategy.getEffectiveDays().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
                String format = acticityStrategy.getEffectiveDays().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
                if(1 == expireRules){
                    vo.setEffectAndInvalid("生效失效:领取后" + format + "生效,未使用、次日零点失效。");
                }
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/XpQualificationAuditServiceImpl.java
@@ -51,7 +51,7 @@
    public PageInfo<XpQualificationAuditVO> pageList(XpQualificationAuditQuery query) throws UnsupportedEncodingException {
        PageInfo<XpQualificationAuditVO> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
        List<XpQualificationAuditVO> list = this.baseMapper.pageList(pageInfo, query);
        if(CollectionUtils.isEmpty(list)){
        if (CollectionUtils.isEmpty(list)) {
            return pageInfo;
        }
@@ -62,12 +62,12 @@
        List<XpOperationsRole> xpOperationsRoles = xpOperationsRoleMapper.selectList(Wrappers.lambdaQuery(XpOperationsRole.class)
                .in(XpOperationsRole::getOperationsUserId, operationsUserIds));
        if(!CollectionUtils.isEmpty(xpOperationsRoles)){
        if (!CollectionUtils.isEmpty(xpOperationsRoles)) {
            List<Long> roleIds = xpOperationsRoles.stream().map(XpOperationsRole::getRoleId).collect(Collectors.toList());
            // 查询列表关联的所有角色
            List<SysRole> sysRoles = sysRoleMapper.selectList(Wrappers.lambdaQuery(SysRole.class)
                    .in(SysRole::getId, roleIds));
            if(!CollectionUtils.isEmpty(sysRoles)){
            if (!CollectionUtils.isEmpty(sysRoles)) {
                // 角色匹配账号id
                Map<Long, List<SysRole>> map = new HashMap<>();
@@ -88,7 +88,7 @@
        for (XpQualificationAuditVO xpQualificationAuditVO : list) {
            xpQualificationAuditVO.setPhoneNumber(sysGroupService.getPhoneDesensitization(xpQualificationAuditVO.getPhoneNumber()));
            String certificateOfNoCriminalRecord = xpQualificationAuditVO.getCertificateOfNoCriminalRecord();
            if(certificateOfNoCriminalRecord!=null){
            if (certificateOfNoCriminalRecord != null) {
                JSONObject jsonObject = JSONObject.parseObject(certificateOfNoCriminalRecord);
                // 1
                String downloadUrl = aliOssService.getDownloadUrl(jsonObject.getString("id"), jsonObject.getString("name"), true);
@@ -97,7 +97,7 @@
            }
            String driverLicense = xpQualificationAuditVO.getDriverLicense();
            if(driverLicense!=null){
            if (driverLicense != null) {
                JSONObject jsonObject = JSONObject.parseObject(driverLicense);
                //1
                String downloadUrl = aliOssService.getDownloadUrl(jsonObject.getString("id"), jsonObject.getString("name"), true);
@@ -107,7 +107,7 @@
            String trainingGraduationCertificate = xpQualificationAuditVO.getTrainingGraduationCertificate();
            if(trainingGraduationCertificate!=null){
            if (trainingGraduationCertificate != null) {
                JSONObject jsonObject = JSONObject.parseObject(trainingGraduationCertificate);
                //1
                String downloadUrl = aliOssService.getDownloadUrl(jsonObject.getString("id"), jsonObject.getString("name"), true);
@@ -116,7 +116,7 @@
            }
            String idCardFront = xpQualificationAuditVO.getIdCardFront();
            if(idCardFront!=null){
            if (idCardFront != null) {
                JSONObject jsonObject = JSONObject.parseObject(idCardFront);
                //1
                String downloadUrl = aliOssService.getDownloadUrl(jsonObject.getString("id"), jsonObject.getString("name"), true);
@@ -125,7 +125,7 @@
            }
            String idCardBack = xpQualificationAuditVO.getIdCardBack();
            if(idCardBack!=null){
            if (idCardBack != null) {
                JSONObject jsonObject = JSONObject.parseObject(idCardBack);
                //1
                String downloadUrl = aliOssService.getDownloadUrl(jsonObject.getString("id"), jsonObject.getString("name"), true);
@@ -146,7 +146,7 @@
            qualificationAudit.setAuditUserId(userid);
            qualificationAudit.setAuditTime(LocalDateTime.now());
            qualificationAudit.setAuditStatus(dto.getAuditStatus());
//        qualificationAudit.setAuditRemarks(dto.getAuditRemarks());
            qualificationAudit.setAuditRemark(dto.getAuditRemarks());
        }
        this.updateBatchById(qualificationAudits);
    }
xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/account/XpQualificationAudit.java
@@ -63,6 +63,6 @@
    private Integer auditStatus;
    @ApiModelProperty(value = "审核备注")
    private Integer auditRemark;
    private String auditRemark;
}
xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/operation/XpActicityStrategy.java
@@ -57,7 +57,8 @@
    private Integer effectiveRules;
    @ApiModelProperty(value = "领取后指定日期生效")
    private LocalDateTime effectiveDays;
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private LocalDate effectiveDays;
    @ApiModelProperty(value = "失效规则(1=次日0点失效,2=指定有效天数,3=指定日期失效)")
    private Integer expireRules;
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/vehicleConvoy/VehicleDoorStatusVo.java
@@ -8,18 +8,72 @@
@Data
@ApiModel
public class VehicleDoorStatusVo {
    @ApiModelProperty("前左门状态(开=1/关=0)")
    @ApiModelProperty("主驾车门关闭状态(开=1/关=0)")
    private Integer frontLeftDoor;
    @ApiModelProperty("前右门状态(开=1/关=0)")
    @ApiModelProperty("副驾车门关闭状态(开=1/关=0)")
    private Integer frontRightDoor;
    @ApiModelProperty("后左门状态(开=1/关=0)")
    @ApiModelProperty("左后车门关闭状态(开=1/关=0)")
    private Integer rearLeftDoor;
    @ApiModelProperty("后右门状态(开=1/关=0)")
    @ApiModelProperty("右后车门关闭状态(开=1/关=0)")
    private Integer rearRightDoor;
    @ApiModelProperty("后备箱盖状态(开=1/关=0)")
    @ApiModelProperty("新车型后备箱状态 0-异常停止,关闭\n" +
            "1-关 \n" +
            "2-正在运动中 \n" +
            "3-运动中异常停止,可开可关 \n" +
            "4-运动中异常停止,可开可关 \n" +
            "5-已打开 \n" +
            "6-正在运动中 \n" +
            "7-运动中异常停止,可开可关 \n" +
            "8-运动中异常停止,可开可关 \n" +
            "9-无效非关闭状态 \n" +
            "10-异常停止,仅允许开启")
    private Integer trunk;
    @ApiModelProperty("前备箱盖状态(开=1/关=0)")
    @ApiModelProperty("前舱盖开关状态:0-关闭,1-开 ,2-有障碍物  3、开路  (代表的是电路故障)")
    private Integer frunk;
    @ApiModelProperty("充电口盖状态(开=1/关=0)")
    private Integer chargePort;
    @ApiModelProperty("空调开启状态:1-on,0-off")
    private Integer hvacOn;
    @ApiModelProperty("车内实际温度(保留一位小数)")
    private Double hvacInnerTempFloat;
    @ApiModelProperty("空调设定温度(保留一位小数)")
    private Double hvacTempFloat;
    @ApiModelProperty("后排左侧空调设定温度,保留一位小数")
    private Double rearLeftHvacTempFloat;
    @ApiModelProperty("副驾空调设定温度,保留一位小数")
    private Double passengerHvacTempFloat;
    @ApiModelProperty("驾驶位状态:0-无人,1-有人 (BCM_DriverSeat占用)")
    private Integer driverSeatState;
    @ApiModelProperty("副驾座椅占位 0:未占用 1:占用;")
    private Integer psngrSeatOccupancyStatus;
    @ApiModelProperty("二排左座椅占位 0:未占用 1:占用;")
    private Integer secRowLeftSeatOccupancyStatus;
    @ApiModelProperty("二排中座椅占位 0:未占用 1:占用;")
    private Integer secRowMidSeatOccupancyStatus;
    @ApiModelProperty("二排右座椅占位 0:未占用 1:占用;")
    private Integer secRowRightSeatOccupancyStatus;
    @ApiModelProperty("三排左座椅占位 0:未占用 1:占用;")
    private Integer thirdRowLeftSeatOccupancyStatus;
    @ApiModelProperty("三排中座椅占位 0:未占用 1:占用;")
    private Integer thirdRowMidSeatOccupancyStatus;
    @ApiModelProperty("三排右座椅占位 0:未占用 1:占用;")
    private Integer thirdRowRightSeatOccupancyStatus;
    @ApiModelProperty("主驾安全带卡扣状态 0:已解开 1:未解开;")
    private Integer drvSeatBeltBuckleSt;
    @ApiModelProperty("副驾安全带卡扣状态 0:已解开 1:未解开;")
    private Integer psngrSeatBeltBuckleSt;
    @ApiModelProperty("二排左侧安全带卡扣状态 0:已解开 1:未解开;")
    private Integer secRowLtSeatBeltBuckleSt;
    @ApiModelProperty("二排中部安全带未卡扣状态 0:已解开 1:未解开;")
    private Integer secRowMidSeatBeltBuckleSt;
    @ApiModelProperty("二排右侧安全带未卡扣状态 0:已解开 1:未解开;")
    private Integer secRowRtSeatBeltBuckleSt;
    @ApiModelProperty("三排左侧安全带未卡扣状态 0:已解开 1:未解开;")
    private Integer trdRowLtSeatBeltBuckleSt;
    @ApiModelProperty("三排中部安全带未卡扣状态 0:已解开 1:未解开;")
    private Integer trdRowMidSeatBeltBuckleSt;
    @ApiModelProperty("三排右侧安全带未卡扣状态 0:已解开 1:未解开;")
    private Integer trdRowRtSeatBeltBuckleSt;
    @ApiModelProperty("(慢充)交流充电口状态:0-开启,1-中间状态(开启或关闭过程中),2-关闭,3-错误(E28开始支持)")
    private Integer slowChargePortStatus;
    @ApiModelProperty("(快充)直流充电口状态:0-开启,1-中间状态(开启或关闭过程中),2-关闭,3-错误(E28开始支持)")
    private Integer fastChargePortStatus;
}
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/controller/XpMapController.java
@@ -28,7 +28,9 @@
import org.bson.Document;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.geo.Point;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.geo.GeoJsonPolygon;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.validation.annotation.Validated;
@@ -143,13 +145,12 @@
        String fenceId = null;
        if(!operatingArea.isEmpty()){
            fenceId = operatingArea.get(0);
            List<Document> pointsInFence = xpGeoFencingPolygonService.findPointsByParentId(fenceId, "fenceId", "prohibited_area");
            for (Document document : pointsInFence) {
                List<GeoPoint> points = document.getList("points", GeoPoint.class);
            List<XpGeoFencingPolygon> pointsInFence = mongoTemplate.find(Query.query(Criteria.where("fenceId").is(fenceId)), XpGeoFencingPolygon.class);
            for (XpGeoFencingPolygon xpGeoFencingPolygon : pointsInFence) {
                GeoJsonPolygon points = xpGeoFencingPolygon.getPoints();
                List<String> coordinatesList = new ArrayList<>();
                // 一个区域的点位
                for (GeoPoint point : points) {
                    coordinatesList.add(point.getLongitude()+","+point.getLatitude());
                for (Point point : points) {
                    coordinatesList.add(point.getX()+","+point.getY());
                }
                JSONObject jsonObject = new JSONObject();
                jsonObject.put("coordinates", coordinatesList);
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/controller/XpPointManagementController.java
@@ -286,7 +286,7 @@
    /**
     * 点位详情
     */
    @GetMapping("/api/v1/point/queryById")
    @GetMapping("/queryById")
    @ApiOperation(value = "点位详情")
    public R<XpPoint> queryById(@RequestParam Long id) {
        return R.ok(xpPointService.getById(id));
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpActicityServiceImpl.java
@@ -259,7 +259,8 @@
                                }
                                // 指定日期生效
                                if(2 == effectiveRules){
                                    xpAppUserCoupon.setEffectiveTime(xpActicityStrategy.getEffectiveDays());
                                    String format = xpActicityStrategy.getEffectiveDays().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
                                    xpAppUserCoupon.setEffectiveTime(LocalDateTime.parse(format + " 23:59:59", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                                }
                                Integer expireRules = xpActicityStrategy.getExpireRules();
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/CustomerServiceController.java
@@ -217,20 +217,23 @@
    /**
     * 10. 根据 VIN 查询剩余电量及预估续航
     * @param vin
     * @return
     */
    @GetMapping("/getVehicleRange/{vin}")
    @ApiOperation(value = "根据 VIN 查询剩余电量及预估续航", notes = "客服系统对接")
    @ApiImplicitParam(name = "vin", value = "vin码", required = true, dataType = "string", paramType = "path")
    public R<VehicleRangeVo> getVehicleRange(@PathVariable String vin){
        VehiclePosition vehiclePositions = mongoTemplate.findOne(Query.query(Criteria.where("vin").is(vin)), VehiclePosition.class);
        if(null == vehiclePositions){
            return R.ok();
        }
    @GetMapping("/getVehicleRange/{orderId}")
    @ApiOperation(value = "根据 订单id 查询剩余电量及预估续航", notes = "客服系统对接")
    @ApiImplicitParam(name = "orderId", value = "订单id", required = true, dataType = "string", paramType = "path")
    public R<VehicleRangeVo> getVehicleRange(@PathVariable String orderId){
        XpOrder xpOrder = xpOrderService.getById(orderId);
        VehicleRangeVo vo = new VehicleRangeVo();
        vo.setBatteryLevel(vehiclePositions.getCurrentElectricity());
        vo.setEstimatedRange(Double.valueOf(vehiclePositions.getMileageRange()));
        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()));
        }
        return R.ok(vo);
    }
@@ -297,6 +300,7 @@
    @ApiOperation(value = "根据订单号查询订单日志", notes = "客服系统对接")
    @ApiImplicitParam(name = "orderId", value = "订单ID", required = true, dataType = "Long", paramType = "path")
    public R<UserOrderInfoVo> getOrderInfo(@PathVariable Long orderId){
        return R.ok(new UserOrderInfoVo());
        UserOrderInfoVo orderHistoryInfo = xpOrderService.getOrderHistoryInfo(orderId);
        return R.ok(orderHistoryInfo);
    }
}
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/IXpOrderService.java
@@ -25,10 +25,7 @@
import com.xiaopeng.order.model.vo.XpOrderDetailVO;
import com.xiaopeng.order.model.vo.XpOrderHistoryVO;
import com.xiaopeng.order.model.vo.XpOrderPageVO;
import com.xiaopeng.order.vo.OrderDetailVo;
import com.xiaopeng.order.vo.OrderInfoVo;
import com.xiaopeng.order.vo.UpdateOrderStatusVo;
import com.xiaopeng.order.vo.UserOrderListVo;
import com.xiaopeng.order.vo.*;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
@@ -273,4 +270,12 @@
     * @param vo
     */
    R<?> officialPartnerUpdateOrderStatus(UpdateOrderStatusVo vo, Integer officialPartnerId);
    /**
     * 获取订单历史信息
     * @param orderId
     * @return
     */
    UserOrderInfoVo getOrderHistoryInfo(Long orderId);
}
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java
@@ -56,6 +56,7 @@
import com.xiaopeng.api.vo.operation.NearestNextVo;
import com.xiaopeng.api.vo.operation.RouteVo;
import com.xiaopeng.api.vo.order.*;
import com.xiaopeng.api.vo.order.FareBreakdownVo;
import com.xiaopeng.api.vo.vehicleConvoy.AddTaxiPassengerVo;
import com.xiaopeng.api.vo.vehicleConvoy.BluetoothDeliverVo;
import com.xiaopeng.api.vo.vehicleConvoy.CancelTaxiPassengerVo;
@@ -94,10 +95,7 @@
import com.xiaopeng.order.service.*;
import com.xiaopeng.order.utils.*;
import com.xiaopeng.order.utils.holiday.HolidayUtil;
import com.xiaopeng.order.vo.OrderDetailVo;
import com.xiaopeng.order.vo.OrderInfoVo;
import com.xiaopeng.order.vo.UpdateOrderStatusVo;
import com.xiaopeng.order.vo.UserOrderListVo;
import com.xiaopeng.order.vo.*;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.shardingsphere.transaction.annotation.ShardingSphereTransactionType;
@@ -4483,4 +4481,39 @@
        return R.ok();
    }
    @Override
    public UserOrderInfoVo getOrderHistoryInfo(Long orderId) {
        XpOrder xpOrder = this.getById(orderId);
        UserOrderInfoVo vo = new UserOrderInfoVo();
        vo.setOrderId(xpOrder.getId());
        vo.setOrderCreatedAt(xpOrder.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        vo.setDispatchStartAt("");
        vo.setDispatchSuccessAt(xpOrder.getAcceptanceTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        vo.setVehicleArrivedAt(xpOrder.getArrivalTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        vo.setFreeWaitExpiredAt("");
        vo.setVehicleUnlockedAt("");
        vo.setDoorOpenedAt(Arrays.asList(""));
        vo.setDoorClosedAt(Arrays.asList(""));
        vo.setTripConfirmedAt(xpOrder.getTripBegin().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        vo.setSafetybeltUnlockedAt(Arrays.asList(""));
        vo.setArrivedDestinationAt("");
        vo.setDropoffDoorOpenedAt(Arrays.asList(""));
        vo.setDropoffTrunkOpenedAt(Arrays.asList(""));
        vo.setDropoffDoorClosedAt(Arrays.asList(""));
        vo.setTripEndedAt(xpOrder.getTripEnd().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        vo.setPaymentCompletedAt("");
        XpOrderEvaluate orderEvaluate = xpOrderEvaluateService.getOne(new QueryWrapper<XpOrderEvaluate>().eq("order_id", xpOrder.getId()));
        if(null != orderEvaluate){
            vo.setUserRatedAt(orderEvaluate.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        }
        XpOrderCancel xpOrderCancel = xpOrderCancelService.getOne(new QueryWrapper<XpOrderCancel>().eq("order_id", xpOrder.getId()));
        if(null != xpOrderCancel){
            vo.setOrderCancelledAt(xpOrderCancel.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
            vo.setCancelReasonType(xpOrderCancel.getCancelSource() == 1 ? "用户取消" : xpOrderCancel.getCancelSource() == 4 ? "超时取消" : "系统取消");
        }
        vo.setSafetyAlertTriggeredAt("");
        vo.setRemoteTakeoverAt("");
        return vo;
    }
}
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/CarControlCallbackController.java
@@ -114,6 +114,24 @@
                    log.info("解析到后备箱状态: msgId={}, trunk_ajar_st_new={}", callback.getMsgRef(), trunkAjarStNewObj);
                }
            }
            // 解析hvac信息
            Map<String, Object> hvac = (Map<String, Object>) instant.get("hvac");
            if (hvac != null) {
                //存入缓存用于后续使用
                redisService.setCacheObject("HVAC:" + callback.getMsgId(), JSON.toJSONString(hvac), 30L, TimeUnit.SECONDS);
            }
            // 解析seat信息
            Map<String, Object> seat = (Map<String, Object>) instant.get("seat");
            if (seat != null) {
                //存入缓存用于后续使用
                redisService.setCacheObject("SEAT:" + callback.getMsgId(), JSON.toJSONString(seat), 30L, TimeUnit.SECONDS);
            }
            // 解析charge信息
            Map<String, Object> charge = (Map<String, Object>) instant.get("charge");
            if (charge != null) {
                //存入缓存用于后续使用
                redisService.setCacheObject("CHARGE:" + callback.getMsgId(), JSON.toJSONString(charge), 30L, TimeUnit.SECONDS);
            }
            stateData.setStateMap(stateMap);
            return stateData;
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/service/impl/XpVehicleServiceImpl.java
@@ -1280,14 +1280,13 @@
     */
    @Override
    public List<XpVehicle> getServiceVehicleList(ServiceVehicleListDto dto) {
        List<XpVehicle> list = this.list(new QueryWrapper<XpVehicle>().eq("vehicle_type", 2)
        PageInfo<XpVehicle> pageInfo = new PageInfo<>(dto.getPageNo(), dto.getPageSize());
        PageInfo<XpVehicle> page = this.page(pageInfo, new QueryWrapper<XpVehicle>().eq("vehicle_type", 2)
                .eq("status", 2).eq("operating_status", 1)
                .eq("is_deleted", 0).like(StringUtils.isNotBlank(dto.getPlateNumber()), "plate_number", dto.getPlateNumber())
                .like(StringUtils.isNotBlank(dto.getVin()), "vehicle_vin", dto.getVin())
                .last(" order by create_time desc limit " + dto.getPageNo() + "," + dto.getPageSize())
        );
        return list;
                .last(" order by create_time desc"));
        return page.getRecords();
    }
@@ -1498,7 +1497,6 @@
        if(StringUtils.isEmpty(cacheObject)){
            return null;
        }
        // todo 待文档补充后再更新代码
        VehicleDoorStatusVo vo = new VehicleDoorStatusVo();
        JSONObject jsonObject = JSON.parseObject(cacheObject);
        Integer driver_door_ajar_st = jsonObject.getInteger("driver_door_ajar_st");
@@ -1506,7 +1504,65 @@
        Integer rear_left_door_ajar_st = jsonObject.getInteger("rear_left_door_ajar_st");
        Integer rear_right_door_ajar_st = jsonObject.getInteger("rear_right_door_ajar_st");
        Integer trunk_ajar_st_new = jsonObject.getInteger("trunk_ajar_st_new");
        vo.setTrunk(trunk_ajar_st_new == 5 ? 1 : 0);
        Integer bonnet_ajar_st = jsonObject.getInteger("bonnet_ajar_st");
        vo.setFrontLeftDoor(driver_door_ajar_st);
        vo.setFrontRightDoor(passenger_door_ajar_st);
        vo.setRearLeftDoor(rear_left_door_ajar_st);
        vo.setRearRightDoor(rear_right_door_ajar_st);
        vo.setTrunk(trunk_ajar_st_new);
        vo.setFrunk(bonnet_ajar_st);
        String hvac = redisService.getCacheObject("HVAC:" + msgId);
        JSONObject hvacJsonObject = JSON.parseObject(hvac);
        Integer hvac_on = hvacJsonObject.getInteger("hvac_on");
        Double hvac_inner_temp_float = hvacJsonObject.getDouble("hvac_inner_temp_float");
        Double hvac_temp_float = hvacJsonObject.getDouble("hvac_temp_float");
        Double rear_left_hvac_temp_float = hvacJsonObject.getDouble("rear_left_hvac_temp_float");
        Double passenger_hvac_temp_float = hvacJsonObject.getDouble("passenger_hvac_temp_float");
        vo.setHvacOn(hvac_on);
        vo.setHvacInnerTempFloat(hvac_inner_temp_float);
        vo.setHvacTempFloat(hvac_temp_float);
        vo.setRearLeftHvacTempFloat(rear_left_hvac_temp_float);
        vo.setPassengerHvacTempFloat(passenger_hvac_temp_float);
        String seat = redisService.getCacheObject("SEAT:" + msgId);
        JSONObject seatJsonObject = JSON.parseObject(seat);
        Integer driver_seat_state = seatJsonObject.getInteger("driver_seat_state");
        Integer psngr_seat_occupancy_status = seatJsonObject.getInteger("psngr_seat_occupancy_status");
        Integer sec_row_left_seat_occupancy_status = seatJsonObject.getInteger("sec_row_left_seat_occupancy_status");
        Integer sec_row_mid_seat_occupancy_status = seatJsonObject.getInteger("sec_row_mid_seat_occupancy_status");
        Integer sec_row_right_seat_occupancy_status = seatJsonObject.getInteger("sec_row_right_seat_occupancy_status");
        Integer third_row_left_seat_occupancy_status = seatJsonObject.getInteger("third_row_left_seat_occupancy_status");
        Integer third_row_mid_seat_occupancy_status = seatJsonObject.getInteger("third_row_mid_seat_occupancy_status");
        Integer third_row_right_seat_occupancy_status = seatJsonObject.getInteger("third_row_right_seat_occupancy_status");
        Integer drv_seat_belt_buckle_st = seatJsonObject.getInteger("drv_seat_belt_buckle_st");
        Integer psngr_seat_belt_buckle_st = seatJsonObject.getInteger("psngr_seat_belt_buckle_st");
        Integer sec_row_lt_seat_belt_buckle_st = seatJsonObject.getInteger("sec_row_lt_seat_belt_buckle_st");
        Integer sec_row_mid_seat_belt_buckle_st = seatJsonObject.getInteger("sec_row_mid_seat_belt_buckle_st");
        Integer sec_row_rt_seat_belt_buckle_st = seatJsonObject.getInteger("sec_row_rt_seat_belt_buckle_st");
        Integer trd_row_lt_seat_belt_buckle_st = seatJsonObject.getInteger("trd_row_lt_seat_belt_buckle_st");
        Integer trd_row_mid_seat_belt_buckle_st = seatJsonObject.getInteger("trd_row_mid_seat_belt_buckle_st");
        Integer trd_row_rt_seat_belt_buckle_st = seatJsonObject.getInteger("trd_row_rt_seat_belt_buckle_st");
        vo.setDriverSeatState(driver_seat_state);
        vo.setPsngrSeatOccupancyStatus(psngr_seat_occupancy_status);
        vo.setSecRowLeftSeatOccupancyStatus(sec_row_left_seat_occupancy_status);
        vo.setSecRowMidSeatOccupancyStatus(sec_row_mid_seat_occupancy_status);
        vo.setSecRowRightSeatOccupancyStatus(sec_row_right_seat_occupancy_status);
        vo.setThirdRowLeftSeatOccupancyStatus(third_row_left_seat_occupancy_status);
        vo.setThirdRowMidSeatOccupancyStatus(third_row_mid_seat_occupancy_status);
        vo.setThirdRowRightSeatOccupancyStatus(third_row_right_seat_occupancy_status);
        vo.setDrvSeatBeltBuckleSt(drv_seat_belt_buckle_st);
        vo.setPsngrSeatBeltBuckleSt(psngr_seat_belt_buckle_st);
        vo.setSecRowLtSeatBeltBuckleSt(sec_row_lt_seat_belt_buckle_st);
        vo.setSecRowMidSeatBeltBuckleSt(sec_row_mid_seat_belt_buckle_st);
        vo.setSecRowRtSeatBeltBuckleSt(sec_row_rt_seat_belt_buckle_st);
        vo.setTrdRowLtSeatBeltBuckleSt(trd_row_lt_seat_belt_buckle_st);
        vo.setTrdRowMidSeatBeltBuckleSt(trd_row_mid_seat_belt_buckle_st);
        vo.setTrdRowRtSeatBeltBuckleSt(trd_row_rt_seat_belt_buckle_st);
        String charge = redisService.getCacheObject("CHARGE:" + msgId);
        JSONObject chargeJsonObject = JSON.parseObject(charge);
        Integer slow_charge_port_status = chargeJsonObject.getInteger("slow_charge_port_status");
        Integer fast_charge_port_status = chargeJsonObject.getInteger("fast_charge_port_status");
        vo.setSlowChargePortStatus(slow_charge_port_status);
        vo.setFastChargePortStatus(fast_charge_port_status);
        return vo;
    }