“mitao”
2026-03-03 b2828fa3551ee423c2c38e507b4e2a8555f9a80c
fix:在库车辆年检/保险/资质过期处理
1个文件已修改
89 ■■■■■ 已修改文件
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/service/impl/XpVehicleServiceImpl.java 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/service/impl/XpVehicleServiceImpl.java
@@ -49,6 +49,7 @@
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.*;
@@ -348,21 +349,21 @@
        Locale locale = LocaleContextHolder.getLocale();
        if (dto.getAnnualInspectionDate() != null && dto.getAnnualInspectionDate().isBefore(now)) {
            if (locale.equals(Locale.CHINESE)) {
            if ("zh".equals(locale.getLanguage())) {
                expiredItems.add("年检到期时间");
            } else {
                expiredItems.add("Annual inspection expiration date");
            }
        }
        if (dto.getInsuranceEndTime() != null && dto.getInsuranceEndTime().isBefore(now)) {
            if (locale.equals(Locale.CHINESE)) {
            if ("zh".equals(locale.getLanguage())) {
                expiredItems.add("保险到期时间");
            } else {
                expiredItems.add("Insurance expiration date");
            }
        }
        if (dto.getQualificationExpireTime() != null && dto.getQualificationExpireTime().isBefore(now)) {
            if (locale.equals(Locale.CHINESE)) {
            if ("zh".equals(locale.getLanguage())) {
                expiredItems.add("运营资质到期时间");
            } else {
                expiredItems.add("Operation qualification expiration date");
@@ -371,7 +372,7 @@
        if (!expiredItems.isEmpty()) {
            String detail;
            if (locale.equals(Locale.CHINESE)) {
            if ("zh".equals(locale.getLanguage())) {
                detail = String.join("、", expiredItems);
            } else {
                detail = String.join("; ", expiredItems);
@@ -393,7 +394,7 @@
                || StringUtils.isBlank(vehicle.getInsurancePhone())
                || vehicle.getInsuranceEndTime() == null
                || StringUtils.isBlank(vehicle.getPolicyInformation())) {
            if (locale.equals(Locale.CHINESE)) {
            if ("zh".equals(locale.getLanguage())) {
                missingItems.add("保险信息");
            } else {
                missingItems.add("Insurance information");
@@ -403,7 +404,7 @@
        // 校验年检信息
        if (vehicle.getAnnualInspectionDate() == null
                || StringUtils.isBlank(vehicle.getInspectionAttachments())) {
            if (locale.equals(Locale.CHINESE)) {
            if ("zh".equals(locale.getLanguage())) {
                missingItems.add("年检信息");
            } else {
                missingItems.add("Annual inspection information");
@@ -412,7 +413,7 @@
        // 校验运营区域
        if (vehicle.getElectronicId() == null) {
            if (locale.equals(Locale.CHINESE)) {
            if ("zh".equals(locale.getLanguage())) {
                missingItems.add("运营区域");
            } else {
                missingItems.add("Operation area");
@@ -422,7 +423,7 @@
        // 校验运营资质
        if (StringUtils.isBlank(vehicle.getOperationQualification())
                || vehicle.getQualificationExpireTime() == null) {
            if (locale.equals(Locale.CHINESE)) {
            if ("zh".equals(locale.getLanguage())) {
                missingItems.add("运营资质");
            } else {
                missingItems.add("Operation qualification");
@@ -431,7 +432,7 @@
        if (!missingItems.isEmpty()) {
            String detail;
            if (locale.equals(Locale.CHINESE)) {
            if ("zh".equals(locale.getLanguage())) {
                detail = String.join("、", missingItems);
            } else {
                detail = String.join("; ", missingItems);
@@ -455,6 +456,32 @@
                && vehicle.getQualificationExpireTime() != null;
    }
    /**
     * 检查车辆是否有任意一项证件过期(精确到日期)
     * - 精确度:yyyy-MM-dd(只比较日期部分)
     * - 到期日期等于今天不算过期(使用 isBefore)
     * @param vehicle 车辆信息
     * @param today 今天日期
     */
    private boolean isAnyDateExpired(XpVehicle vehicle, LocalDate today) {
        // 年检到期时间检查:已过期
        if (vehicle.getAnnualInspectionDate() != null
                && vehicle.getAnnualInspectionDate().toLocalDate().isBefore(today)) {
            return true;
        }
        // 保险到期时间检查:已过期
        if (vehicle.getInsuranceEndTime() != null
                && vehicle.getInsuranceEndTime().toLocalDate().isBefore(today)) {
            return true;
        }
        // 运营资质到期时间检查:已过期
        if (vehicle.getQualificationExpireTime() != null
                && vehicle.getQualificationExpireTime().toLocalDate().isBefore(today)) {
            return true;
        }
        return false;
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void batchOperation(String idStr) {
@@ -464,7 +491,7 @@
        List<String> ids = Arrays.asList(idStr.split(","));
        // 查询车辆完整信息
        List<XpVehicle> vehicles = this.listByIds(ids);
        LocalDateTime now = LocalDateTime.now();
        LocalDate now = LocalDate.now();
        List<String> errorMessages = new ArrayList<>();
        for (XpVehicle vehicle : vehicles) {
@@ -473,38 +500,38 @@
            // 校验状态为待运营
            if (!Integer.valueOf(2).equals(vehicle.getStatus())) {
                if (locale.equals(Locale.CHINESE)) {
                if ("zh".equals(locale.getLanguage())) {
                    reasons.add("状态非待运营");
                } else {
                    reasons.add("Status is not 'Pending Operation'");
                }
            }
            // 校验年检到期时间
            if (vehicle.getAnnualInspectionDate() == null || vehicle.getAnnualInspectionDate().isBefore(now)) {
                if (locale.equals(Locale.CHINESE)) {
            if (vehicle.getAnnualInspectionDate() == null || vehicle.getAnnualInspectionDate().toLocalDate().isBefore(now)) {
                if ("zh".equals(locale.getLanguage())) {
                    reasons.add("年检已过期");
                } else {
                    reasons.add("Annual inspection has expired");
                }
            }
            // 校验保险到期时间
            if (vehicle.getInsuranceEndTime() == null || vehicle.getInsuranceEndTime().isBefore(now)) {
                if (locale.equals(Locale.CHINESE)) {
            if (vehicle.getInsuranceEndTime() == null || vehicle.getInsuranceEndTime().toLocalDate().isBefore(now)) {
                if ("zh".equals(locale.getLanguage())) {
                    reasons.add("保险已过期");
                } else {
                    reasons.add("Insurance has expired");
                }
            }
            // 校验运营资质到期时间
            if (vehicle.getQualificationExpireTime() == null || vehicle.getQualificationExpireTime().isBefore(now)) {
                if (locale.equals(Locale.CHINESE)) {
            if (vehicle.getQualificationExpireTime() == null || vehicle.getQualificationExpireTime().toLocalDate().isBefore(now)) {
                if ("zh".equals(locale.getLanguage())) {
                    reasons.add("运营资质已过期");
                } else {
                    reasons.add("Operation qualification has expired");
                }
            }
            if (!reasons.isEmpty()) {
                if (locale.equals(Locale.CHINESE)) {
                if ("zh".equals(locale.getLanguage())) {
                    errorMessages.add("车辆[" + vehicle.getPlateNumber() + "]:" + String.join("、", reasons));
                } else {
                    errorMessages.add("Vehicles [" + vehicle.getPlateNumber() + "]: " + String.join("; ", reasons));
@@ -558,6 +585,32 @@
    public PageInfo<XpVehicle> vehiclePageList(VehiclePageQuery query) {
        PageInfo<XpVehicle> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
        List<XpVehicle> list = this.baseMapper.vehiclePageList(pageInfo, query);
        if (CollUtil.isNotEmpty(list)) {
            LocalDate today = LocalDate.now();
            List<Long> expiredVehicleIds = new ArrayList<>();
            for (XpVehicle vehicle : list) {
                // 检查是否有任意一项过期(精确到 yyyy-MM-dd)
                boolean isExpired = isAnyDateExpired(vehicle, today);
                if (isExpired && !Integer.valueOf(3).equals(vehicle.getStatus())) {
                    // 记录需要更新状态的车辆ID
                    expiredVehicleIds.add(vehicle.getId());
                    // 同时更新返回结果中的状态
                    vehicle.setStatus(3);
                }
            }
            // 批量更新过期车辆状态到数据库
            if (CollUtil.isNotEmpty(expiredVehicleIds)) {
                LambdaUpdateWrapper<XpVehicle> updateWrapper = new LambdaUpdateWrapper<>();
                updateWrapper.in(XpVehicle::getId, expiredVehicleIds)
                             .set(XpVehicle::getStatus, 3);
                this.update(updateWrapper);
            }
        }
        pageInfo.setRecords(list);
        return pageInfo;
    }