liujie
2026-03-10 8948a532dfa18d6bbd54ca849eadc025175a4a95
Merge branch 'master' of http://120.76.84.145:10101/gitblit/r/java/Robotaxi
1个文件已添加
5个文件已修改
107 ■■■■■ 已修改文件
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/mapper/SysGroupMapper.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/SysGroupServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/resources/mapper/account/SysGroupMapper.xml 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/service/KafkaConsumerService.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/task/VehicleDocumentExpiryTask.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/mapper/SysGroupMapper.java
@@ -1,6 +1,7 @@
package com.xiaopeng.account.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.xiaopeng.account.model.query.GroupUserPageQuery;
import com.xiaopeng.account.model.vo.GroupUserVO;
import com.xiaopeng.api.model.account.SysGroup;
@@ -34,5 +35,5 @@
     * @param query    查询参数
     * @return 用户列表
     */
    PageInfo<GroupUserVO> queryUserPageList(PageInfo<GroupUserVO> pageInfo, @Param("query") GroupUserPageQuery query);
    Page<GroupUserVO> queryUserPageList(PageInfo<GroupUserVO> pageInfo, @Param("query") GroupUserPageQuery query);
}
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/SysGroupServiceImpl.java
@@ -2,6 +2,7 @@
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xiaopeng.account.constant.I18nKeyConstant;
import com.xiaopeng.account.mapper.SysGroupMapper;
@@ -203,8 +204,8 @@
        // 分页查询
        PageInfo<GroupUserVO> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
        query.setGroupType(group.getGroupType());
        PageInfo<GroupUserVO> records = baseMapper.queryUserPageList(pageInfo, query);
        Page<GroupUserVO> records = baseMapper.queryUserPageList(pageInfo, query);
        pageInfo.setRecords(records.getRecords());
        // 手动设置分页信息(因为使用了自定义SQL)
        return pageInfo;
    }
xp-robotaxi-account-boot/src/main/resources/mapper/account/SysGroupMapper.xml
@@ -48,15 +48,15 @@
                    ou.id,
                    ou.nick_name AS nickName,
                    ou.unique_number AS uniqueNumber,
                    ou.user_account AS userAccount,
                    ou.phone_number 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
                    GROUP_CONCAT(DISTINCT 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
                INNER JOIN xp_operations_role xop ON ou.id = xop.operations_user_id
                INNER JOIN sys_role sr ON xop.role_id = sr.id
                WHERE sr.group_id = #{query.groupId}
                  AND sr.is_deleted = 0
                  AND ou.is_deleted = 0
@@ -66,8 +66,7 @@
                <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
                GROUP BY ou.id, ou.nick_name, ou.unique_number, ou.phone_number, ou.status, ou.remarks, ou.create_time
                ORDER BY ou.create_time DESC
            </otherwise>
        </choose>
xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/service/KafkaConsumerService.java
@@ -422,15 +422,15 @@
                log.info("订单的任务未开始执行");
                break;
            case ROUTE_TO_PICKUP:
                log.info("驶往上车点的行程");
                log.info("驶往上车点的行程 {}", orderId);
                buildNaviRequest(requestId, orderId, orderPhase, msgContent.getHeader().getSequence());
                break;
            case ROUTE_TO_DESTINATION:
                log.info("驶往下车点的行程");
                log.info("驶往下车点的行程 {}", orderId);
                buildNaviRequest(requestId, orderId, orderPhase, msgContent.getHeader().getSequence());
                break;
            case ROUTE_TO_CRUISE:
                log.info("巡游阶段路线");
                log.info("巡游阶段路线 {}", orderId);
                buildNaviRequest(requestId, orderId, orderPhase, msgContent.getHeader().getSequence());
                break;
        }
@@ -467,7 +467,7 @@
            LonLatDto origin = new LonLatDto();
            if (orderId.contains("XU")) {
                orderType = OrderType.CRUISE_ORDER;
//                orderType = OrderType.CRUISE_ORDER;
                R<XpCruiseOrder> cruiseOrder = xpCruiseOrderClient.getCruiseOrder(orderId);
                XpCruiseOrder xpCruiseOrder = cruiseOrder.getData();
@@ -484,17 +484,18 @@
                dto.setOrderId(Long.parseLong(orderId));
                dto.setOrigin(origin);
                dto.setDestination(destination);
                dto.setRouteType(3);
                R<RouteVo> routeVoR = xpMapClient.getOrderDistanceAndDuration(dto);
                if (200 != routeVoR.getCode()) {
                    throw new RuntimeException("获取订单线路和运费失败");
                }
                RouteVo routeVo = routeVoR.getData();
                routeID = routeVo.getRouteID();
//                routeID = routeVo.getRouteID();
                vehicleId = xpCruiseOrder.getVehicleId();
//                vehicleId = xpCruiseOrder.getVehicleId();
            } else {
                orderType = OrderType.USER_ORDER;
//                orderType = OrderType.USER_ORDER;
                //正常单
                R<XpOrder> xpOrderR = xpOrderClient.queryOrderById(Long.parseLong(orderId));
                if (200 != xpOrderR.getCode()) {
@@ -516,12 +517,13 @@
                    dto.setOrderId(Long.parseLong(orderId));
                    dto.setOrigin(origin);
                    dto.setDestination(destination);
                    dto.setRouteType(1);
                    R<RouteVo> routeVoR = xpMapClient.getOrderDistanceAndDuration(dto);
                    if (200 != routeVoR.getCode()) {
                        throw new RuntimeException("获取订单线路和运费失败");
                    }
                    RouteVo routeVo = routeVoR.getData();
                    routeID = routeVo.getRouteID();
//                    routeID = routeVo.getRouteID();
                    //缓存数据,用于后续推给乘客导航线路
                    redisService.setCacheObject("ORDER_NAVIGATION_START_DATA:" + xpOrder.getAppUserId(), JSON.toJSONString(routeVo), 24L, TimeUnit.HOURS);
                }
@@ -536,16 +538,17 @@
                    dto.setOrderId(Long.parseLong(orderId));
                    dto.setOrigin(origin);
                    dto.setDestination(destination);
                    dto.setRouteType(2);
                    R<RouteVo> routeVoR = xpMapClient.getOrderDistanceAndDuration(dto);
                    if (200 != routeVoR.getCode()) {
                        throw new RuntimeException("获取订单线路和运费失败");
                    }
                    RouteVo routeVo = routeVoR.getData();
                    routeID = routeVo.getRouteID();
//                    routeID = routeVo.getRouteID();
                    //缓存导航数据,用于后面的逻辑中给乘客端推送导航数据
                    redisService.setCacheObject("ORDER_NAVIGATION_END_DATA:" + xpOrder.getAppUserId(), com.alibaba.fastjson.JSON.toJSONString(routeVo), 24L, TimeUnit.HOURS);
                }
                vehicleId = xpOrder.getVehicleId();
//                vehicleId = xpOrder.getVehicleId();
            }
            // TODO 在请求导航哪里返回导航数据
@@ -594,6 +597,7 @@
                dto.setOrderId(Long.parseLong(orderId));
                dto.setOrigin(origin);
                dto.setDestination(destination);
                dto.setRouteType(3);
                R<RouteVo> routeVoR = xpMapClient.getOrderDistanceAndDuration(dto);
                if (200 != routeVoR.getCode()) {
                    throw new RuntimeException("获取订单线路和运费失败");
@@ -609,7 +613,7 @@
            //正常单
            R<XpOrder> xpOrderR = xpOrderClient.queryOrderById(Long.parseLong(orderId));
            if (200 != xpOrderR.getCode()) {
                throw new RuntimeException("订单不存在");
                throw new RuntimeException("订单不存在 " + orderId);
            }
            XpOrder xpOrder = xpOrderR.getData();
            XpVehicle xpVehicle = xpVehicleClient.queryById(xpOrder.getVehicleId()).getData();
@@ -630,6 +634,7 @@
                dto.setOrderId(Long.parseLong(orderId));
                dto.setOrigin(origin);
                dto.setDestination(destination);
                dto.setRouteType(1);
                R<RouteVo> routeVoR = xpMapClient.getOrderDistanceAndDuration(dto);
                if (200 != routeVoR.getCode()) {
                    throw new RuntimeException("获取订单线路和运费失败");
@@ -654,6 +659,7 @@
                    dto.setOrderId(Long.parseLong(orderId));
                    dto.setOrigin(origin);
                    dto.setDestination(destination);
                    dto.setRouteType(2);
                    R<RouteVo> routeVoR = xpMapClient.getOrderDistanceAndDuration(dto);
                    if (200 != routeVoR.getCode()) {
                        throw new RuntimeException("获取订单线路和运费失败");
@@ -671,11 +677,13 @@
        }
        if(StringUtils.isNotEmpty(routeID)){
            log.info("开始推送导航信息 {}", orderId);
            XpVehicle xpVehicle = xpVehicleClient.queryById(vehicleId).getData();
            R<String> stringR = xpMapClient.queryRouted(routeID);
            if (200 != stringR.getCode()) {
                throw new RuntimeException("根据导航ID获取车端需要的导航数据失败");
            }
            log.info("根据导航ID获取车端需要的导航数据 订单 {} 导航数据 {}", orderId, stringR.getData());
            //构建导航下发请求对象
            cloudPushNavigationInfo(requestId, routeID, stringR.getData(), orderType, orderId, xpVehicle.getVehicleVin(), xpVehicle.getXpuId());
        }
@@ -1027,13 +1035,7 @@
        SnowFlake snowFlake = new SnowFlake(0, 0);
        snowFlake.withStartTimestamp(1420041600000L);
        long sequence = snowFlake.nextId();
        // 处理数据
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("event", SystemEventType.PUSH_NAVIGATION);
        jsonObject.put("orderType", orderType);
        jsonObject.put("orderId", orderId);
        jsonObject.put("vin", vin);
        redisTemplate.opsForValue().set(sequence, jsonObject.toJSONString(),30, TimeUnit.MINUTES);
        log.info("开始推送导航数据 {}", orderId);
        MqttPublishDto mqttPublishDto = xpuUtil.cloudPushNavigation(navigationDataBuilder.build(), xpuId, sequence);
        log.info("推送导航的响应消息,{}", JSON.toJSONString(mqttPublishDto));
    }
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java
@@ -580,7 +580,6 @@
        orderCancel.setCancelSource(3); // 3=运营人员(后台管理接口固定为运营人员)
        orderCancel.setUserId(SecurityUtils.getUserId()); // 当前登录用户ID
        orderCancel.setCancelReason("运营人员取消订单");
        orderCancel.setCreateBy(SecurityUtils.getLoginUser().getSysUser().getNickName());
        xpOrderCancelService.save(orderCancel);
        //查询车辆信息
        R<XpVehicle> xpVehicleR = xpVehicleClient.queryById(order.getId());
@@ -590,7 +589,7 @@
                PushOrderDto pushOrderDto = new PushOrderDto();
                pushOrderDto.setOrderId(order.getId().toString());
                pushOrderDto.setVin(xpVehicleR.getData().getVehicleVin());
                // pushOrderDto.setOperation_type(com.xiaopeng.api.vo.automaticPilot.protobuf.OrderOperationType.CLOUD_CANCEL_ORDER);
                pushOrderDto.setOperation_type(com.xiaopeng.api.vo.automaticPilot.protobuf.OrderOperationType.CLOUD_CANCEL_ORDER);
                orderMissionClient.cancelOrder(pushOrderDto);
            }
        } else {
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/task/VehicleDocumentExpiryTask.java
New file
@@ -0,0 +1,47 @@
package com.xiaopeng.vehicleConvoy.task;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.xiaopeng.api.model.vehicleConvoy.XpVehicle;
import com.xiaopeng.vehicleConvoy.service.IXpVehicleService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
/**
 * 运营车辆年检/保险/运营资质过期检查定时任务
 * 每日凌晨1点执行一次:任意一项过期则转为在库,车辆状态置为3(保险/年检已过期)
 */
@Slf4j
@Component
@RequiredArgsConstructor
public class VehicleDocumentExpiryTask {
    private static final ZoneId ZONE_GMT8 = ZoneId.of("GMT+8");
    private final IXpVehicleService xpVehicleService;
    @Scheduled(cron = "0 0 1 * * ?", zone = "GMT+8")
    @Transactional(rollbackFor = Exception.class)
    public void checkAndStockExpiredVehicles() {
        LocalDate today = LocalDate.now(ZONE_GMT8);
        LocalDateTime todayStart = today.atStartOfDay();
        LambdaUpdateWrapper<XpVehicle> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper.eq(XpVehicle::getVehicleType, 2)
                .and(w -> w.lt(XpVehicle::getAnnualInspectionDate, todayStart)
                        .or().lt(XpVehicle::getInsuranceEndTime, todayStart)
                        .or().lt(XpVehicle::getQualificationExpireTime, todayStart))
                .set(XpVehicle::getVehicleType, 1)
                .set(XpVehicle::getStatus, 3);
        boolean updated = xpVehicleService.update(updateWrapper);
        log.info("运营车辆证件过期检查任务执行完成,todayStart={}, updated={}", todayStart, updated);
    }
}