puzhibing
2026-05-12 08cc6d5cf7e93b75cfabe7dcc2aeaa9afa1117eb
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/service/impl/XpVehicleServiceImpl.java
@@ -6,6 +6,7 @@
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
@@ -47,9 +48,11 @@
import com.xiaopeng.api.vo.vehicleConvoy.*;
import com.xiaopeng.common.core.constant.CacheConstants;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.common.core.enums.PushMessageTypeEnum;
import com.xiaopeng.common.core.exception.ServiceException;
import com.xiaopeng.common.core.exception.base.BaseException;
import com.xiaopeng.common.core.utils.GeodesyUtil;
import com.xiaopeng.common.core.utils.SensitiveDataCryptoUtil;
import com.xiaopeng.common.core.web.page.PageInfo;
import com.xiaopeng.common.redis.service.RedisService;
import com.xiaopeng.evi.oss.service.AliOssService;
@@ -86,6 +89,7 @@
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.io.Serializable;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDate;
@@ -174,7 +178,9 @@
            return new ArrayList<>();
        }
        //查询车型和 车队信息
        return super.listByIds(ids);
        List<XpVehicle> list = super.listByIds(ids);
        decryptVehicles(list);
        return list;
    }
    /**
@@ -236,6 +242,7 @@
        query.setPlateNumber(plateNumber);
        List<XpVehicleVO> list = baseMapper.findList(query);
        decryptVehicleVos(list);
        //获取车的位置 和订单的位置 并计算 距离 和 时间
        if(!list.isEmpty()){
            for (XpVehicle xpVehicle : list) {
@@ -329,6 +336,7 @@
            query.setElectronicIdList(Arrays.asList(query.getElectronicId().split(",")));
        }
        List<XpVehicleVO> list = this.baseMapper.pageList(pageInfo, query);
        decryptVehicleVos(list);
        if (CollectionUtils.isEmpty(list)) {
            return pageInfo;
        }
@@ -376,7 +384,9 @@
            return Collections.emptyList();
        }
        return lambdaQuery().like(XpVehicle::getPlateNumber, plateNumber).list();
        List<XpVehicle> list = lambdaQuery().like(XpVehicle::getPlateNumber, plateNumber).list();
        decryptVehicles(list);
        return list;
    }
    @Override
@@ -384,7 +394,9 @@
        if (fenceId == null) {
            return Collections.emptyList();
        }
        return lambdaQuery().eq(XpVehicle::getElectronicId, fenceId).eq(XpVehicle::getOperatingStatus, 1).eq(XpVehicle::getState, 0).list();
        List<XpVehicle> list = lambdaQuery().eq(XpVehicle::getElectronicId, fenceId).eq(XpVehicle::getOperatingStatus, 1).eq(XpVehicle::getState, 0).list();
        decryptVehicles(list);
        return list;
    }
    @Override
@@ -392,7 +404,9 @@
        if (fenceId == null) {
            return Collections.emptyList();
        }
        return lambdaQuery().eq(XpVehicle::getElectronicId, fenceId).list();
        List<XpVehicle> list = lambdaQuery().eq(XpVehicle::getElectronicId, fenceId).list();
        decryptVehicles(list);
        return list;
    }
    @Override
@@ -681,7 +695,7 @@
                .ne(excludeId != null, XpVehicle::getId, excludeId)
                .and(w -> w.eq(XpVehicle::getVehicleCode, vehicleCode)
                        .or()
                        .eq(XpVehicle::getVehicleVin, vehicleVin)
                        .in(XpVehicle::getVehicleVin, SensitiveDataCryptoUtil.queryValues(vehicleVin))
                        .or()
                        .eq(XpVehicle::getPlateNumber, plateNumber))
                .last("limit 3")
@@ -695,7 +709,7 @@
            throw new ServiceException("车辆编码已存在", I18nKeyConstant.VEHICLE_CODE_EXISTS, new Object[]{vehicleCode});
        }
        boolean vehicleVinExists = duplicates.stream().anyMatch(v -> vehicleVin.equals(v.getVehicleVin()));
        boolean vehicleVinExists = duplicates.stream().anyMatch(v -> vehicleVin.equals(SensitiveDataCryptoUtil.decryptIfPossible(v.getVehicleVin())));
        if (vehicleVinExists) {
            throw new ServiceException("车辆VIN码已存在", I18nKeyConstant.VEHICLE_VIN_EXISTS, new Object[]{vehicleVin});
        }
@@ -1035,8 +1049,10 @@
    @Override
    public PageInfo<XpVehicle> vehiclePageList(VehiclePageQuery query) {
        query.setVehicleVinQueryValues(SensitiveDataCryptoUtil.queryValues(query.getVehicleVin()));
        PageInfo<XpVehicle> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
        List<XpVehicle> list = this.baseMapper.vehiclePageList(pageInfo, query);
        decryptVehicles(list);
        //查询运营区域名称
        List<Long> electronicIds = list.stream()
                .map(XpVehicle::getElectronicId)
@@ -1088,7 +1104,10 @@
    @Override
    public List<XpVehicle> vehicleExportList(VehicleExportQuery query) {
        return this.baseMapper.vehicleExportList(query);
        query.setVehicleVinQueryValues(SensitiveDataCryptoUtil.queryValues(query.getVehicleVin()));
        List<XpVehicle> list = this.baseMapper.vehicleExportList(query);
        decryptVehicles(list);
        return list;
    }
    @Override
@@ -1137,7 +1156,7 @@
        LambdaQueryWrapper<XpVehicle> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(XpVehicle::getVehicleType, 2)
                .like(StringUtils.isNotBlank(query.getVehicleCode()), XpVehicle::getVehicleCode, query.getVehicleCode())
                .like(StringUtils.isNotBlank(query.getVehicleVin()), XpVehicle::getVehicleVin, query.getVehicleVin())
                .in(StringUtils.isNotBlank(query.getVehicleVin()), XpVehicle::getVehicleVin, SensitiveDataCryptoUtil.queryValues(query.getVehicleVin()))
                .like(StringUtils.isNotBlank(query.getPlateNumber()), XpVehicle::getPlateNumber, query.getPlateNumber())
                .eq(Objects.nonNull(query.getOperatingStatus()), XpVehicle::getOperatingStatus, query.getOperatingStatus())
                .eq(Objects.nonNull(query.getElectronicId()), XpVehicle::getElectronicId, query.getElectronicId());
@@ -1150,6 +1169,7 @@
        wrapper.orderByDesc(XpVehicle::getCreateTime);
        //3.执行分页查询
        PageInfo<XpVehicle> page = this.page(pageInfo, wrapper);
        decryptVehicles(page.getRecords());
        //4.批量查询围栏名称并填充
        Set<Long> electronicIdSet = page.getRecords().stream().map(XpVehicle::getElectronicId).collect(Collectors.toSet());
@@ -1173,7 +1193,7 @@
        LambdaQueryWrapper<XpVehicle> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(XpVehicle::getVehicleType, 2)
                .like(StringUtils.isNotBlank(query.getVehicleCode()), XpVehicle::getVehicleCode, query.getVehicleCode())
                .like(StringUtils.isNotBlank(query.getVehicleVin()), XpVehicle::getVehicleVin, query.getVehicleVin())
                .in(StringUtils.isNotBlank(query.getVehicleVin()), XpVehicle::getVehicleVin, SensitiveDataCryptoUtil.queryValues(query.getVehicleVin()))
                .like(StringUtils.isNotBlank(query.getPlateNumber()), XpVehicle::getPlateNumber, query.getPlateNumber())
                .eq(Objects.nonNull(query.getOperatingStatus()), XpVehicle::getOperatingStatus, query.getOperatingStatus())
                .eq(Objects.nonNull(query.getElectronicId()), XpVehicle::getElectronicId, query.getOperatingStatus())
@@ -1187,6 +1207,7 @@
        wrapper.orderByDesc(XpVehicle::getCreateTime);
        //2.执行查询
        List<XpVehicle> list = this.list(wrapper);
        decryptVehicles(list);
        //3.批量查询围栏名称并填充
        Set<Long> electronicIdSet = list.stream().map(XpVehicle::getElectronicId).collect(Collectors.toSet());
@@ -1284,8 +1305,9 @@
        PageInfo<XpVehicle> page = this.page(pageInfo, new QueryWrapper<XpVehicle>().eq("vehicle_type", 2)
                .eq("status", 2).eq("operating_status", 1)
                .eq("is_deleted", 0).like(StringUtils.isNotBlank(dto.getPlateNumber()), "plate_number", dto.getPlateNumber())
                .like(StringUtils.isNotBlank(dto.getVin()), "vehicle_vin", dto.getVin())
                .in(StringUtils.isNotBlank(dto.getVin()), "vehicle_vin", SensitiveDataCryptoUtil.queryValues(dto.getVin()))
                .last(" order by create_time desc"));
        decryptVehicles(page.getRecords());
        return page.getRecords();
    }
@@ -1419,7 +1441,7 @@
            }
            log.info("同步查询车辆空调状态成功,开始等到查询回调结果");
            try {
                Thread.sleep(2000);
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
@@ -1489,7 +1511,7 @@
        }
        log.info("同步查询车辆空调状态成功,开始等到查询回调结果");
        try {
            Thread.sleep(2000);
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
@@ -1579,7 +1601,7 @@
        if(null == dto.getLatitude() || null == dto.getLongitude()){
            throw new ServiceException("无效数据");
        }
        XpVehicle vehicle = this.getOne(new QueryWrapper<XpVehicle>().eq("vehicle_vin", dto.getVin()).eq("is_deleted", 0));
        XpVehicle vehicle = this.getOne(new QueryWrapper<XpVehicle>().in("vehicle_vin", SensitiveDataCryptoUtil.queryValues(dto.getVin())).eq("is_deleted", 0));
        if(null == vehicle){
            throw new ServiceException("无效数据");
        }
@@ -1611,6 +1633,7 @@
        //调用推送服务接口,给乘客推送剩余轨迹和里程时长
        if (null != orderId) {
            PushOrderRouteDTO dto1 = new PushOrderRouteDTO();
            dto1.setMessageType(PushMessageTypeEnum.ORDER_ROUTE.getDesc());
            dto1.setOrderId(orderId);
            dto1.setRouteType(1);
            dto1.setLongitude(longitude);
@@ -1642,4 +1665,88 @@
        }
    }
    @Override
    public XpVehicle getById(Serializable id) {
        XpVehicle vehicle = super.getById(id);
        decryptVehicle(vehicle);
        return vehicle;
    }
    @Override
    public boolean save(XpVehicle entity) {
        encryptVehicle(entity);
        try {
            return super.save(entity);
        } finally {
            decryptVehicle(entity);
        }
    }
    @Override
    public boolean saveBatch(Collection<XpVehicle> entityList) {
        if (entityList != null) {
            entityList.forEach(this::encryptVehicle);
        }
        try {
            return super.saveBatch(entityList);
        } finally {
            decryptVehicles(entityList);
        }
    }
    @Override
    public boolean updateById(XpVehicle entity) {
        encryptVehicle(entity);
        try {
            return super.updateById(entity);
        } finally {
            decryptVehicle(entity);
        }
    }
    @Override
    public List<XpVehicle> list() {
        List<XpVehicle> list = super.list();
        decryptVehicles(list);
        return list;
    }
    @Override
    public List<XpVehicle> list(Wrapper<XpVehicle> queryWrapper) {
        List<XpVehicle> list = super.list(queryWrapper);
        decryptVehicles(list);
        return list;
    }
    @Override
    public XpVehicle getOne(Wrapper<XpVehicle> queryWrapper) {
        XpVehicle vehicle = super.getOne(queryWrapper);
        decryptVehicle(vehicle);
        return vehicle;
    }
    private void encryptVehicle(XpVehicle vehicle) {
        if (vehicle != null) {
            vehicle.setVehicleVin(SensitiveDataCryptoUtil.encrypt(vehicle.getVehicleVin()));
        }
    }
    private void decryptVehicle(XpVehicle vehicle) {
        if (vehicle != null) {
            vehicle.setVehicleVin(SensitiveDataCryptoUtil.decryptIfPossible(vehicle.getVehicleVin()));
        }
    }
    private void decryptVehicles(Collection<? extends XpVehicle> vehicles) {
        if (vehicles != null) {
            vehicles.forEach(this::decryptVehicle);
        }
    }
    private void decryptVehicleVos(Collection<XpVehicleVO> vehicles) {
        if (vehicles != null) {
            vehicles.forEach(this::decryptVehicle);
        }
    }
}