liujie
2026-03-01 bad018eeb9865c0f2a353f8a224d253fc635549e
Merge branch 'master' of http://120.76.84.145:10101/gitblit/r/java/Robotaxi
15个文件已修改
320 ■■■■■ 已修改文件
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/model/vo/GroupUserVO.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/resources/mapper/account/SysGroupMapper.xml 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/dto/pushMessage/PushOrderRouteDTO.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpTaskManagementController.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/exportExcel/XpTaskExportExcel.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/model/vo/XpVehicleDetectionVO.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/XpTaskService.java 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpTaskServiceImpl.java 139 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpVehicleDetectionServiceImpl.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/controller/XpPointManagementController.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderEvaluateServiceImpl.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/controller/PushOrderRouteController.java 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpVehicleController.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/model/vo/XpVehicleVO.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/service/impl/XpVehicleServiceImpl.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/model/vo/GroupUserVO.java
@@ -40,4 +40,7 @@
    @ApiModelProperty(value = "创建时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    @ApiModelProperty(value = "角色名称")
    private String roleName;
}
xp-robotaxi-account-boot/src/main/resources/mapper/account/SysGroupMapper.xml
@@ -15,32 +15,62 @@
    <!-- 查询权限组绑定用户列表 -->
    <select id="queryUserPageList" resultType="com.xiaopeng.account.model.vo.GroupUserVO">
        SELECT DISTINCT
            su.id,
            su.nick_name AS nickName,
            su.unique_number AS uniqueNumber,
            su.user_account AS userAccount,
            su.phone_number AS phoneNumber,
            su.status,
            su.remarks,
            su.create_time AS createTime
        FROM sys_user su
        INNER JOIN sys_user_role sur ON su.id = sur.user_id
        INNER JOIN sys_role sr ON sur.role_id = sr.id
        LEFT JOIN sys_group sg ON sr.group_id = sg.id
        WHERE sr.group_id = #{query.groupId}
          AND sr.is_deleted = 0
          AND su.is_deleted = 0
        <if test="query.groupType != null">
            AND sg.group_type = #{query.groupType}
        </if>
        <if test="query.nickName != null and query.nickName != ''">
            AND su.nick_name LIKE CONCAT('%', #{query.nickName}, '%')
        </if>
        <if test="query.phoneNumber != null and query.phoneNumber != ''">
            AND su.phone_number LIKE CONCAT('%', #{query.phoneNumber}, '%')
        </if>
        ORDER BY su.create_time DESC
        <choose>
            <!-- groupType=1: 管理端用户 -->
            <when test="query.groupType == 1">
                SELECT DISTINCT
                    su.id,
                    su.nick_name AS nickName,
                    su.unique_number AS uniqueNumber,
                    su.user_account AS userAccount,
                    su.phone_number AS phoneNumber,
                    su.status,
                    su.remarks,
                    su.create_time AS createTime,
                    sr.role_name AS roleName
                FROM sys_user su
                INNER JOIN sys_user_role sur ON su.id = sur.user_id
                INNER JOIN sys_role sr ON sur.role_id = sr.id
                WHERE sr.group_id = #{query.groupId}
                  AND sr.is_deleted = 0
                  AND su.is_deleted = 0
                <if test="query.nickName != null and query.nickName != ''">
                    AND su.nick_name LIKE CONCAT('%', #{query.nickName}, '%')
                </if>
                <if test="query.phoneNumber != null and query.phoneNumber != ''">
                    AND su.phone_number LIKE CONCAT('%', #{query.phoneNumber}, '%')
                </if>
                ORDER BY su.create_time DESC
            </when>
            <!-- groupType=2: 运维用户 -->
            <otherwise>
                SELECT
                    ou.id,
                    ou.nick_name AS nickName,
                    ou.unique_number AS uniqueNumber,
                    ou.user_account AS userAccount,
                    ou.phone_number AS phoneNumber,
                    ou.status,
                    ou.remarks,
                    ou.create_time AS createTime,
                    GROUP_CONCAT(DISTINCT sr.role_name ORDER BY sr.role_name SEPARATOR ',') AS roleName
                FROM xp_operations_user ou
                INNER JOIN xp_operations_role xor ON ou.id = xor.operations_user_id
                INNER JOIN sys_role sr ON xor.role_id = sr.id
                WHERE sr.group_id = #{query.groupId}
                  AND sr.is_deleted = 0
                  AND ou.is_deleted = 0
                <if test="query.nickName != null and query.nickName != ''">
                    AND ou.nick_name LIKE CONCAT('%', #{query.nickName}, '%')
                </if>
                <if test="query.phoneNumber != null and query.phoneNumber != ''">
                    AND ou.phone_number LIKE CONCAT('%', #{query.phoneNumber}, '%')
                </if>
                GROUP BY ou.id, ou.nick_name, ou.unique_number, ou.user_account,
                         ou.phone_number, ou.status, ou.remarks, ou.create_time
                ORDER BY ou.create_time DESC
            </otherwise>
        </choose>
    </select>
</mapper>
xp-robotaxi-api/src/main/java/com/xiaopeng/api/dto/pushMessage/PushOrderRouteDTO.java
@@ -35,4 +35,8 @@
    @ApiModelProperty(value = "订单类型 1=实时订单 2=巡游订单")
    private Integer routeType;
    @NotNull(message = "方向角不能为空")
    @ApiModelProperty(value = "方向角 0-359")
    private Integer direction;
}
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpTaskManagementController.java
@@ -167,6 +167,13 @@
        xpTaskService.saveTask(dto, reportUserId);
        return R.ok();
    }
    @ApiOperation(value = "异常情况上传车辆事故")
    @PostMapping("/inner/v1/task/saveVehicleAccidentError")
    public R saveVehicleAccidentError(@RequestParam Long vehicleId) {
        xpTaskService.saveVehicleAccidentError(vehicleId);
        return R.ok();
    }
    @ApiOperation(value = "任务详情")
    @GetMapping("/taskDetail")
    public R<TaskManagementDetailVO> taskDetail(Long id) {
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/exportExcel/XpTaskExportExcel.java
@@ -25,7 +25,7 @@
    @Excel(name = "车牌号",width = 20)
    private String plateNumber;
    @ApiModelProperty(value = "任务类别1常规 2事故")
    @Excel(name = "任务类别",width = 20)
    @Excel(name = "任务类别",width = 20,replace = {"常规_1","事故_2"})
    private Integer taskCategory;
    @ApiModelProperty(value = "类型")
    @Excel(name = "类型",width = 40)
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/model/vo/XpVehicleDetectionVO.java
@@ -27,6 +27,9 @@
    @ApiModelProperty(value = "开始操作人")
    private String operatorStartName;
    @ApiModelProperty(value = "联系电话")
    private String phoneNumber;
    @ApiModelProperty(value = "结束操作人")
    private String operatorEndName;
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/XpTaskService.java
@@ -91,4 +91,5 @@
     */
    XpTask queryInfoByVehicleId(Long vehicleId);
    void saveVehicleAccidentError(Long vehicleI);
}
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpTaskServiceImpl.java
@@ -952,6 +952,73 @@
    @Override
    public List<TaskManagementPageListVO> exportList(TaskManagementPageListQuery query) {
        List<TaskManagementPageListVO> list = this.baseMapper.exportList(query);
        for (TaskManagementPageListVO taskManagementPageListVO : list) {
            if (org.springframework.util.StringUtils.hasLength(taskManagementPageListVO.getHandleUserId())){
                String[] split = taskManagementPageListVO.getHandleUserId().split(",");
                List<XpOperationsUser> users = operationUserClient.listByIds(Arrays.stream(split).map(Long::parseLong).collect(Collectors.toList())).getData();
                if (users!=null){
                    StringBuilder handleUserName = new StringBuilder();
                    for (XpOperationsUser user : users) {
                        handleUserName.append(user.getNickName()).append(";");
                    }
                    taskManagementPageListVO.setHandleUserName(handleUserName.toString());
                }
            }
            if (taskManagementPageListVO.getTaskCategory() == 1) {
                switch (taskManagementPageListVO.getTaskTypeId()) {
                    case "1":
                        taskManagementPageListVO.setTaskTypeName("车辆检查");
                        break;
                    case "2":
                        taskManagementPageListVO.setTaskTypeName("车辆充电");
                        break;
                    case "3":
                        taskManagementPageListVO.setTaskTypeName("车辆整备");
                        break;
                    case "4":
                        taskManagementPageListVO.setTaskTypeName("整备洗车");
                        break;
                    case "5":
                        taskManagementPageListVO.setTaskTypeName("车辆维修");
                        break;
                    case "6":
                        taskManagementPageListVO.setTaskTypeName("车辆保养");
                        break;
                    case "7":
                        taskManagementPageListVO.setTaskTypeName("车辆保险到期");
                        break;
                    case "8":
                        taskManagementPageListVO.setTaskTypeName("车辆年检到期");
                        break;
                    case "9":
                        taskManagementPageListVO.setTaskTypeName("车辆运营资质到期");
                        break;
                    default:
                        taskManagementPageListVO.setTaskTypeName("");
                        break;
                }
            } else {
                StringBuilder taskTypeName = new StringBuilder();
                String[] typeIds = taskManagementPageListVO.getTaskTypeId().split(",");
                List<XpErrorType> xpErrorTypes = errorTypeMapper.selectList(new LambdaQueryWrapper<XpErrorType>()
                        .in(XpErrorType::getId, Arrays.asList(typeIds)).orderByAsc(XpErrorType::getParentId));
                List<XpErrorType> parents = new ArrayList<>();
                for (XpErrorType xpErrorType : xpErrorTypes) {
                    if (xpErrorType.getParentId() == 0) {
                        parents.add(xpErrorType);
                    }
                }
                for (XpErrorType parent : parents) {
                    List<XpErrorType> children = xpErrorTypes.stream().filter(e -> e.getParentId().equals(parent.getId())).collect(Collectors.toList());
                    taskTypeName.append(parent.getErrorName()).append(">");
                    for (XpErrorType child : children) {
                        taskTypeName.append(child.getErrorName()).append(";");
                    }
                }
                taskManagementPageListVO.setTaskTypeName(taskTypeName.substring(0, taskTypeName.length() - 1));
            }
        }
        return list;
    }
@@ -961,6 +1028,78 @@
    }
    @Override
    public void saveVehicleAccidentError(Long vehicleId) {
        XpTask xpTask = new XpTask();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
        String code = sdf.format(new Date()) + UUIDUtil.getNumberRandom(5);
        xpTask.setTaskCode(code);
        xpTask.setTaskCategory(2);
        // todo 事故类型待客户确定
        xpTask.setTaskTypeId("1");
        xpTask.setTaskUrgencyLevel(0);
        xpTask.setTaskDescription("车辆发生异常");
        XpVehicle vehicle = xpVehicleClient.queryById(xpTask.getVehicleId()).getData();
        if (vehicle!=null){
            VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(vehicle.getVehicleVin())), VehiclePosition.class);
            if (vehiclePosition != null) {
                double x = vehiclePosition.getPoint().getX();
                double y = vehiclePosition.getPoint().getY();
                xpTask.setVehicleLon(new BigDecimal(x));
                xpTask.setVehicleLat(new BigDecimal(y));
            }
        }
        xpTask.setVehicleId(vehicleId);
        // 系统上传异常任务标识
        xpTask.setReportUserId(0L);
        xpTask.setReportTime(LocalDateTime.now());
        xpTask.setStatus(0);
        xpTask.setCreateBy("admin");
        XpTaskRule taskRule = xpTaskRuleService.lambdaQuery().last("limit 1").one();
        XpTaskRuleRole taskRuleRole = xpTaskRuleRoleService.lambdaQuery().eq(XpTaskRuleRole::getRuleType, 9).last("limit 1").one();
        if (Objects.isNull(taskRuleRole) || Objects.isNull(taskRule)) {
            throw new ServiceException("未配置车辆事故任务分配规则");
        }
        R<List<XpOperationsRole>> xpOperationsRoleResult = xpOperationUserClient.getXpOperationsRoleByRoleId(taskRuleRole.getRoleId());
        if (CollUtil.isNotEmpty(xpOperationsRoleResult.getData())) {
            List<Long> userIds = xpOperationsRoleResult.getData().stream().map(XpOperationsRole::getOperationsUserId).collect(Collectors.toList());
            xpTask.setHandleUserId(StringUtils.join(userIds, ","));
        }
        // 根据事故处理限时配置设置任务截止时间
        LocalDateTime endTime = LocalDateTime.now().plusMinutes(taskRule.getProcessingTimeLimit());
        xpTask.setEndTime(endTime);
        this.save(xpTask);
        // 发送消息通知
        List<Long> userIds = Arrays.stream(xpTask.getHandleUserId().split(",")).map(Long::valueOf).collect(Collectors.toList());
        if (CollUtil.isNotEmpty(userIds)) {
            R<List<XpOperationsUser>> xpOperationUserResult = xpOperationUserClient.listByIds(userIds);
            List<XpOperationsUser> data = xpOperationUserResult.getData();
            if (CollUtil.isNotEmpty(data)) {
                String plateNumber = Objects.nonNull(vehicle) ? vehicle.getPlateNumber() : "";
                // 车辆${车牌号}在${车辆位置信息}发生了紧急事故,请在${到达现场限时}内到达现场!${APP链接}
                String content = String.format("车辆%s在%s发生了紧急事故,请在%d分钟内到达现场!", plateNumber, xpTask.getVehicleLocation(), taskRule.getProcessingTimeLimit());
                List<XpOperationsUserNotification> notifications = data.stream().map(item -> {
                    XpOperationsUserNotification notification = new XpOperationsUserNotification();
                    notification.setOperationsUserId(item.getId());
                    notification.setNotificationContent(content);
                    notification.setReadStatus(0);
                    notification.setCreateTime(LocalDateTime.now());
                    return notification;
                }).collect(Collectors.toList());
                xpOperationUserNotificationClient.addNotificationBatch(notifications);
                // 发送阿里云推送
                Map<Integer, List<XpOperationsUser>> operationUserMap = data.stream().collect(Collectors.groupingBy(XpOperationsUser::getDeviceType));
                for (Map.Entry<Integer, List<XpOperationsUser>> integerListEntry : operationUserMap.entrySet()) {
                    List<XpOperationsUser> value = integerListEntry.getValue();
                    pushAliMessage(value, content, xpTask);
                }
            }
        }
    }
    @Override
    public R assigneeTask(Long id, Long handlerUserId, Long assigneeUserId) {
        XpTask task = this.getById(id);
        task.setAssigneeTime(LocalDateTime.now());
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpVehicleDetectionServiceImpl.java
@@ -21,6 +21,7 @@
import org.springframework.util.CollectionUtils;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
@@ -117,13 +118,13 @@
                    .distinct()
                    .collect(Collectors.toList());
            // 批量查询操作人信息
            Map<Long, String> userNameMap = new HashMap<>();
            Map<Long, XpOperationsUser> operationUserMap = new HashMap<>();
            if (!CollectionUtils.isEmpty(allUserIds)) {
                R<List<XpOperationsUser>> userResult = xpOperationUserClient.listByIds(allUserIds);
                List<XpOperationsUser> users = userResult.getData();
                if (!CollectionUtils.isEmpty(users)) {
                    userNameMap = users.stream()
                            .collect(Collectors.toMap(XpOperationsUser::getId, XpOperationsUser::getNickName));
                    operationUserMap = users.stream()
                            .collect(Collectors.toMap(XpOperationsUser::getId, Function.identity()));
                }
            }
@@ -135,8 +136,11 @@
                // 填充操作人姓名
                if (xpVehicleDetection.getOperationsUserId() != null) {
                    String userName = userNameMap.get(xpVehicleDetection.getOperationsUserId());
                    vo.setOperatorStartName(userName);
                    XpOperationsUser xpOperationsUser = operationUserMap.get(xpVehicleDetection.getOperationsUserId());
                    if (Objects.nonNull(xpOperationsUser)) {
                        vo.setOperatorStartName(xpOperationsUser.getNickName());
                        vo.setPhoneNumber(xpOperationsUser.getPhoneNumber());
                    }
                }
                records.add(vo);
            }
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/controller/XpPointManagementController.java
@@ -97,7 +97,7 @@
    /**
     * 批量删除点位
     */
    @GetMapping("/delete")
    @GetMapping("/deletePoint")
    @ResponseBody
    @ApiOperation(value = "删除点位")
//    @Transactional
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderEvaluateServiceImpl.java
@@ -129,9 +129,9 @@
    @Override
    public PageInfo<OrderEvaluateManagementPageListVO> managementPageList(OrderEvaluateManagementPageListQuery query) {
        PageInfo<OrderEvaluateManagementPageListVO> pageInfo = new PageInfo<>(query.getPageNum(),query.getPageSize());
        List<OrderEvaluateManagementPageListVO> list = this.baseMapper.managementPageList(pageInfo,query);
        if (list.isEmpty()){
        PageInfo<OrderEvaluateManagementPageListVO> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
        List<OrderEvaluateManagementPageListVO> list = this.baseMapper.managementPageList(pageInfo, query);
        if (list.isEmpty()) {
            return new PageInfo<>();
        }
        List<Long> userIds = list.stream().map(OrderEvaluateManagementPageListVO::getUserId).collect(Collectors.toList());
@@ -140,21 +140,25 @@
        getUserListByUidsVo.setGetPreCarOwner(false);
        UserResourcesDto userListByUids = userResourcesClient.getUserListByUids(getUserListByUidsVo);
        for (OrderEvaluateManagementPageListVO orderEvaluateManagementPageListVO : list) {
            Object data = userListByUids.getData();
            // 转化为jsonArray
            JSONArray jsonArray = JSON.parseArray(JSON.toJSONString(data));
            for (Object o : jsonArray) {
                // 转化为JsonObject
                JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(o));
                String mobile = jsonObject.getString("mobile");
                String nickName = jsonObject.getString("nickName");
                String headImage = jsonObject.getString("headImage");
                orderEvaluateManagementPageListVO.setPhoneNumber(mobile);
                orderEvaluateManagementPageListVO.setNickName(nickName);
                orderEvaluateManagementPageListVO.setHeadImage(headImage);
            }
//            Object data = userListByUids.getData();
//            // 转化为jsonArray
//            JSONArray jsonArray = JSON.parseArray(JSON.toJSONString(data));
//            for (Object o : jsonArray) {
//                // 转化为JsonObject
//                JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(o));
//                String mobile = jsonObject.getString("mobile");
//                String nickName = jsonObject.getString("nickName");
//                String headImage = jsonObject.getString("headImage");
//                orderEvaluateManagementPageListVO.setPhoneNumber(mobile);
//                orderEvaluateManagementPageListVO.setNickName(nickName);
//                orderEvaluateManagementPageListVO.setHeadImage(headImage);
//            }
            orderEvaluateManagementPageListVO.setPhoneNumber("19983174515");
            orderEvaluateManagementPageListVO.setNickName("默认用户");
            orderEvaluateManagementPageListVO.setHeadImage("[]");
            systemSettingClient.getFeedbackTypeById(orderEvaluateManagementPageListVO.getFeedbackTypeId());
        }
        pageInfo.setRecords(list);
        return pageInfo;
    }
@@ -255,7 +259,7 @@
        // 手机号过滤
        if (StringUtils.isNotBlank(query.getPhoneNumber())) {
            if (StringUtils.isBlank(vo.getPhoneNumber()) ||
                !vo.getPhoneNumber().contains(query.getPhoneNumber())) {
                    !vo.getPhoneNumber().contains(query.getPhoneNumber())) {
                return false;
            }
        }
@@ -263,7 +267,7 @@
        // 车牌号过滤
        if (StringUtils.isNotBlank(query.getPlateNumber())) {
            if (StringUtils.isBlank(vo.getPlateNumber()) ||
                !vo.getPlateNumber().contains(query.getPlateNumber())) {
                    !vo.getPlateNumber().contains(query.getPlateNumber())) {
                return false;
            }
        }
xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/controller/PushOrderRouteController.java
@@ -80,6 +80,7 @@
            Map<String, Object> content = new HashMap<>();
            content.put("orderId",dto.getOrderId());
            content.put("routeType",routeType);
            content.put("direction",dto.getDirection());
            content.put("route",JSONObject.toJSONString(route));
            // 封装轨迹信息
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpVehicleController.java
@@ -394,7 +394,8 @@
        for (XpVehicleExportExcel xpVehicleExportExcel : exportList) {
            if (StringUtils.isNotBlank(xpVehicleExportExcel.getVehiclePictures())) {
                JSONObject jsonObject = JSONObject.parseObject(xpVehicleExportExcel.getVehiclePictures());
                xpVehicleExportExcel.setVehiclePictures(jsonObject.getString("url"));
                // xpVehicleExportExcel.setVehiclePictures(jsonObject.getString("url"));
                xpVehicleExportExcel.setVehiclePictures(null);
            }
        }
        // 3. 生成Excel
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/model/vo/XpVehicleVO.java
@@ -28,9 +28,9 @@
    private LocalDate nextMaintenanceTime;
    @ApiModelProperty(value = "车辆经度")
    private Double longitude;
    private Double longitude=104.056302;
    @ApiModelProperty(value = "车辆纬度")
    private Double latitude;
    private Double latitude=30.586688;
}
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/service/impl/XpVehicleServiceImpl.java
@@ -15,6 +15,7 @@
import com.xiaopeng.api.model.order.XpOrder;
import com.xiaopeng.api.model.vehicleConvoy.XpVehicle;
import com.xiaopeng.api.model.vehicleConvoy.XpVehicleAnnualRecord;
import com.xiaopeng.api.vo.automaticPilot.VehiclePosition;
import com.xiaopeng.api.vo.operation.ElectronicFenceDetailVo;
import com.xiaopeng.api.vo.vehicleConvoy.VehiclesCommandEnum;
import com.xiaopeng.api.vo.vehicleConvoy.VehiclesCommandParamVo;
@@ -37,7 +38,10 @@
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.geo.GeoJsonPoint;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
@@ -75,6 +79,8 @@
    private XpuVinClient xpuVinClient;
    @Autowired
    private RedisService redisService;
    @Autowired
    private MongoTemplate mongoTemplate;
    @Override
    public List<XpVehicle> listByIds(List<Long> ids) {
@@ -149,6 +155,15 @@
                xpVehicleVO.setLongitude(geoJsonPoint.getX());
                xpVehicleVO.setLatitude(geoJsonPoint.getY());
            }
            // 查询车辆的续航里程
            VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(xpVehicleVO.getVehicleVin())), VehiclePosition.class);
            if(Objects.nonNull(vehiclePosition)){
                xpVehicleVO.setMileageRange(vehiclePosition.getMileageRange());
                xpVehicleVO.setCurrentElectricity(vehiclePosition.getCurrentElectricity());
            }else {
                xpVehicleVO.setMileageRange(0F);
                xpVehicleVO.setCurrentElectricity(0);
            }
        }
        pageInfo.setRecords(list);