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); } }