xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/account/XpOperationUserClient.java
@@ -2,6 +2,7 @@ import com.xiaopeng.api.dto.account.XpOperationsUserQueryDTO; import com.xiaopeng.api.factory.account.XpAppUserClientFallbackFactory; import com.xiaopeng.api.factory.account.XpOperationUserClientFallbackFactory; import com.xiaopeng.api.model.account.XpOperationsRole; import com.xiaopeng.api.model.account.XpOperationsUser; import com.xiaopeng.api.vo.account.XpOperationsUserWithRoleVO; @@ -23,7 +24,7 @@ */ @FeignClient(contextId = "XpOperationUserClient", value = ServiceNameConstantsEnum.XP_ACCOUNT_SERVICE, fallbackFactory = XpAppUserClientFallbackFactory.class) fallbackFactory = XpOperationUserClientFallbackFactory.class) public interface XpOperationUserClient { /** * 根据ID列表批量查询运维用户信息 xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpVehicleCleanController.java
@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.xiaopeng.api.feignClient.account.XpOperationUserClient; import com.xiaopeng.api.feignClient.vehicleConvoy.XpVehicleClient; import com.xiaopeng.api.model.account.XpOperationsUser; import com.xiaopeng.api.model.maintenance.XpVehicleClean; import com.xiaopeng.api.query.maintenance.VehicleCleanQuery; import com.xiaopeng.common.core.domain.R; @@ -22,6 +23,9 @@ import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.stream.Collectors; /** * <p> @@ -85,14 +89,25 @@ public R<PageInfo<XpVehicleClean>> list(@RequestBody VehicleCleanQuery query) { PageInfo<XpVehicleClean> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize()); LambdaQueryWrapper<XpVehicleClean> wrapper = new LambdaQueryWrapper<XpVehicleClean>().eq(XpVehicleClean::getVehicleId, query.getVehicleId()); List<XpOperationsUser> data=null; if(query.getOperationUserName()!=null && !query.getOperationUserName().isEmpty()){ wrapper.like(XpVehicleClean::getCreateBy, query.getOperationUserName()); R<List<XpOperationsUser>> r = xpOperationUserClient.listByName(query.getOperationUserName()); if(r.getCode()!=200 || r.getData().isEmpty()){ return R.ok(pageInfo); } data = r.getData(); wrapper.in(XpVehicleClean::getOperationsUserId, data.stream().map(XpOperationsUser::getId).collect(Collectors.toList())); } if(query.getStartTime()!=null && !query.getStartTime().isEmpty() && query.getEndTime()!=null && !query.getEndTime().isEmpty()){ wrapper.between(XpVehicleClean::getCreateTime, query.getStartTime(), query.getEndTime()); } PageInfo<XpVehicleClean> page = xpVehicleCleanService.page(pageInfo, wrapper.orderByDesc(BaseModel::getCreateTime)); List<XpVehicleClean> records = page.getRecords(); for (XpVehicleClean record : records) { data.stream().filter(xpOperationsUser -> xpOperationsUser.getId().equals(record.getOperationsUserId())).findFirst().ifPresent(xpOperationsUser -> record.setCreateBy(xpOperationsUser.getNickName())); } return R.ok(page); } xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/utils/TaskOrderCancelUtil.java
New file @@ -0,0 +1,62 @@ package com.xiaopeng.order.utils; import com.alibaba.nacos.common.utils.CollectionUtils; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.xiaopeng.api.model.order.XpOrder; import com.xiaopeng.order.service.IXpOrderService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.time.LocalDateTime; import java.util.List; @Slf4j @Component public class TaskOrderCancelUtil { @Autowired private IXpOrderService xpOrderService; /** * 30秒执行一次 */ @Scheduled(cron = "0/30 * * * * ?") public void taskOrder() { // 计算30分钟前的时间 LocalDateTime thirtyMinutesAgo = LocalDateTime.now().minusMinutes(30); // 查询状态为1且创建时间超过30分钟的订单 List<XpOrder> expiredOrders = xpOrderService.list(new LambdaQueryWrapper<XpOrder>() .eq(XpOrder::getStatus, 1) .lt(XpOrder::getCreateTime, thirtyMinutesAgo) // 使用lt避免边界问题 .orderByAsc(XpOrder::getCreateTime) // 按创建时间正序处理,先处理最早的 .last("LIMIT 1000") // 防止一次处理太多数据,可以分批处理 ); if (CollectionUtils.isNotEmpty(expiredOrders)) { for (XpOrder order : expiredOrders) { try { // 处理过期订单 processExpiredOrder(order); } catch (Exception e) { log.error("处理过期订单失败,订单ID: {}", order.getId(), e); } } } } private void processExpiredOrder(XpOrder order){ Long appUserId = order.getAppUserId(); order.setAppUserId(null); order.setStatus(0); xpOrderService.updateById(order); } }