“mitao”
2026-03-26 f2cc55c6596b2242536a851b5a154397c46827b3
fix:充电定时任务增加判断,如果当前车辆正在充电则不创建任务
1个文件已修改
36 ■■■■■ 已修改文件
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/schedule/VehicleChargingScheduleTask.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/schedule/VehicleChargingScheduleTask.java
@@ -5,6 +5,7 @@
import com.xiaopeng.api.feignClient.vehicleConvoy.XpFleetOperationsClient;
import com.xiaopeng.api.feignClient.vehicleConvoy.XpVehicleClient;
import com.xiaopeng.api.model.account.XpOperationsRole;
import com.xiaopeng.api.model.maintenance.XpChargingRecord;
import com.xiaopeng.api.model.maintenance.XpTask;
import com.xiaopeng.api.model.maintenance.XpTaskRule;
import com.xiaopeng.api.model.maintenance.XpTaskRuleRole;
@@ -12,6 +13,7 @@
import com.xiaopeng.api.vo.automaticPilot.VehiclePosition;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.api.vo.maintenance.TaskScheduleConstants;
import com.xiaopeng.maintenance.mapper.XpChargingRecordMapper;
import com.xiaopeng.maintenance.mapper.XpTaskMapper;
import com.xiaopeng.maintenance.mapper.XpTaskRuleMapper;
import com.xiaopeng.maintenance.mapper.XpTaskRuleRoleMapper;
@@ -62,6 +64,9 @@
    @Autowired
    private XpTaskMapper taskMapper;
    @Autowired
    private XpChargingRecordMapper chargingRecordMapper;
    @Autowired
    private XpVehicleClient xpVehicleClient;
@@ -144,7 +149,8 @@
        }
        int createdCount = 0;
        int skippedCount = 0;
        int skippedUnfinishedTaskCount = 0;
        int skippedUnfinishedChargingRecordCount = 0;
        int skippedNoAssigneeCount = 0;
        for (VehiclePosition position : lowBatteryPositions) {
            if (position == null || !StringUtils.hasLength(position.getVin())) {
@@ -157,7 +163,13 @@
            // 避免重复创建:若存在未完成的充电任务则跳过
            if (hasUnfinishedTask(vehicle.getId(), TaskScheduleConstants.TASK_TYPE_CHARGING)) {
                skippedCount++;
                skippedUnfinishedTaskCount++;
                continue;
            }
            // 若车辆最新一条充电记录未完成,则不再创建新的充电任务
            if (hasUnfinishedLatestChargingRecord(vehicle.getId())) {
                skippedUnfinishedChargingRecordCount++;
                continue;
            }
@@ -174,8 +186,9 @@
            createdCount++;
        }
        log.info("========== {}执行完成,阈值={},命中={},创建任务数={},跳过(已存在未完成任务)={},跳过(无可分配处理人)={} ==========",
                TASK_NAME, threshold, lowBatteryPositions.size(), createdCount, skippedCount, skippedNoAssigneeCount);
        log.info("========== {}执行完成,阈值={},命中={},创建任务数={},跳过(已存在未完成任务)={},跳过(最新充电记录未完成)={},跳过(无可分配处理人)={} ==========",
                TASK_NAME, threshold, lowBatteryPositions.size(), createdCount, skippedUnfinishedTaskCount,
                skippedUnfinishedChargingRecordCount, skippedNoAssigneeCount);
    }
    private XpTaskRule getTaskRule() {
@@ -247,6 +260,21 @@
        return existingTask != null;
    }
    /**
     * 检查车辆最新一条充电记录是否未完成
     */
    private boolean hasUnfinishedLatestChargingRecord(Long vehicleId) {
        XpChargingRecord latestChargingRecord = chargingRecordMapper.selectOne(
                new LambdaQueryWrapper<XpChargingRecord>()
                        .eq(XpChargingRecord::getVehicleId, vehicleId)
                        .orderByDesc(XpChargingRecord::getCreateTime)
                        .last("limit 1")
        );
        return latestChargingRecord != null
                && (latestChargingRecord.getEndTime() == null
                || latestChargingRecord.getEndRemainingBattery() == null);
    }
    private List<Long> resolveHandleUserIds(Long vehicleId, Set<Long> roleOperationUserIds,
                                           Map<Long, Long> vehicleIdToFleetIdCache,
                                           Map<Long, Set<Long>> fleetIdToOperationUserIdsCache) {