puzhibing
2026-05-13 842c0755fdf8501b85f02ecacd71ee4e2b6b9327
Merge branch 'master' of http://120.76.84.145:10101/gitblit/r/java/Robotaxi into 1.0

# Conflicts:
# xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/SysUserController.java
# xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/model/query/XpOperationsUserPageQuery.java
# xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/SysLoginService.java
# xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/SysUserServiceImpl.java
# xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/XpOperationsUserServiceImpl.java
# xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/XpQualificationAuditServiceImpl.java
# xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpTaskController.java
# xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/controller/XpElectronicFenceManagementController.java
# xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpCouponController.java
# xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpInvitationCodeController.java
# xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpPricingController.java
# xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpWhitelistController.java
# xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpWhitelistServiceImpl.java
# xp-robotaxi-operation-boot/src/main/resources/mapper/operation/XpWhitelistMapper.xml
# xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpFleetController.java
# xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpVehicleController.java
# xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/service/impl/XpVehicleServiceImpl.java
37个文件已修改
406 ■■■■■ 已修改文件
sql/增量sql/xprt_operation.sql 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/SysGroupController.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/SysRoleController.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/SysUserController.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpAppUserCouponController.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpOperationsUserController.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpQualificationAuditController.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/SysLoginService.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/SysUserServiceImpl.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/XpOperationsUserServiceImpl.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/XpQualificationAuditServiceImpl.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpCheckLocationController.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpSchedulingDetailController.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpShiftController.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpTaskController.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpTaskManagementController.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpWorkOrderController.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/controller/XpElectronicFenceManagementController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/controller/XpPointManagementController.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/controller/XpTestPointManagementController.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpAppVersionController.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpBannerManagementController.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpCouponController.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpCruisePlanController.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpFeedbackTypeManagementController.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpInvitationCodeController.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpOpenCityController.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpPricingController.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpRoutePlanController.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpTestPlanController.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpWhitelistController.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/query/WhitelistPageListQuery.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpWhitelistServiceImpl.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpFleetController.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpPolicyApplicationController.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpVehicleController.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/service/impl/XpVehicleServiceImpl.java 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sql/增量sql/xprt_operation.sql
@@ -398,4 +398,29 @@
                                                      INDEX `idx_number`(`point_number` ASC) USING BTREE COMMENT '唯一ID'
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '点位管理' ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS=1;
CREATE TABLE IF NOT EXISTS `xp_admin_operation_log` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'primary key',
  `business_type` tinyint NOT NULL COMMENT 'business type',
  `business_type_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT 'business type name',
  `operator_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT 'operator name',
  `operator_account` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT 'operator account',
  `operator_account_id` bigint NULL DEFAULT NULL COMMENT 'operator account id',
  `operation_type` tinyint NOT NULL COMMENT 'operation type',
  `operation_type_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT 'operation type name',
  `operation_content` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT 'operation content',
  `operation_ip` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT 'operation ip',
  `request_uri` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT 'request uri',
  `request_method` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT 'request method',
  `method` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT 'interface method',
  `status` tinyint NOT NULL DEFAULT 0 COMMENT 'status: 0 success, 1 failed',
  `error_msg` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'error message',
  `operation_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'operation time',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'create time',
  PRIMARY KEY (`id`) USING BTREE,
  INDEX `idx_business_type` (`business_type`) USING BTREE,
  INDEX `idx_operation_type` (`operation_type`) USING BTREE,
  INDEX `idx_operator_account` (`operator_account`) USING BTREE,
  INDEX `idx_operation_time` (`operation_time`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'admin operation log' ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS=1;
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/SysGroupController.java
@@ -21,6 +21,9 @@
import org.springframework.context.annotation.Lazy;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import com.xiaopeng.common.log.annotation.AdminOperationLog;
import com.xiaopeng.common.log.enums.AdminBusinessType;
import com.xiaopeng.common.log.enums.AdminOperationType;
/**
 * <p>
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/SysRoleController.java
@@ -18,6 +18,9 @@
import org.springframework.context.annotation.Lazy;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import com.xiaopeng.common.log.annotation.AdminOperationLog;
import com.xiaopeng.common.log.enums.AdminBusinessType;
import com.xiaopeng.common.log.enums.AdminOperationType;
/**
 * <p>
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/SysUserController.java
@@ -48,6 +48,9 @@
import java.util.Objects;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import com.xiaopeng.common.log.annotation.AdminOperationLog;
import com.xiaopeng.common.log.enums.AdminBusinessType;
import com.xiaopeng.common.log.enums.AdminOperationType;
/**
 * 用户信息
@@ -235,12 +238,9 @@
    public AjaxResult edit(@Validated @RequestBody SysUser user) {
        userService.checkUserAllowed(user);
        // userService.checkUserDataScope(user.getId());
        SysUser sysUser = null;
        if (StringUtils.isNotEmpty(user.getPhoneNumber())) {
            sysUser = userService.getOne(Wrappers.lambdaQuery(SysUser.class)
                    .in(SysUser::getPhoneNumber, SensitiveDataCryptoUtil.queryValues(user.getPhoneNumber()))
                    .last("LIMIT 1"));
        }
        SysUser sysUser = userService.getOne(Wrappers.lambdaQuery(SysUser.class)
                .in(SysUser::getPhoneNumber, SensitiveDataCryptoUtil.queryValues(user.getPhoneNumber()))
                .last("LIMIT 1"));
        if (StringUtils.isNotEmpty(user.getPhoneNumber()) && (Objects.nonNull(sysUser) && !user.getId().equals(sysUser.getId()) )) {
            throw new ServiceException("手机号已开通账号", I18nKeyConstant.ACCOUNT_PHONE_DUPLICATE);
@@ -479,8 +479,7 @@
            return R.ok(java.util.Collections.emptyList());
        }
        List<SysUser> list = userService.list(Wrappers.lambdaQuery(SysUser.class)
                .in(SysUser::getPhoneNumber, phoneQueryValues));
        list.forEach(user -> user.setPhoneNumber(SensitiveDataCryptoUtil.decryptIfPossible(user.getPhoneNumber())));
                .in(SysUser::getPhoneNumber, buildPhoneQueryValues(phoneList)));
        return R.ok(list);
    }
@@ -504,6 +503,17 @@
        return R.ok(user);
    }
    private List<String> buildPhoneQueryValues(List<String> phoneList) {
        if (phoneList == null) {
            return java.util.Collections.emptyList();
        }
        return phoneList.stream()
                .filter(StringUtils::isNotBlank)
                .flatMap(phone -> SensitiveDataCryptoUtil.queryValues(phone).stream())
                .distinct()
                .collect(Collectors.toList());
    }
    /**
     * 通过账号查询用户
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpAppUserCouponController.java
@@ -47,6 +47,9 @@
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
import com.xiaopeng.common.log.annotation.AdminOperationLog;
import com.xiaopeng.common.log.enums.AdminBusinessType;
import com.xiaopeng.common.log.enums.AdminOperationType;
/**
 * <p>
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpOperationsUserController.java
@@ -48,6 +48,9 @@
import javax.validation.Valid;
import java.util.ArrayList;
import java.util.List;
import com.xiaopeng.common.log.annotation.AdminOperationLog;
import com.xiaopeng.common.log.enums.AdminBusinessType;
import com.xiaopeng.common.log.enums.AdminOperationType;
/**
 * <p>
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpQualificationAuditController.java
@@ -19,6 +19,9 @@
import org.springframework.stereotype.Controller;
import java.io.UnsupportedEncodingException;
import com.xiaopeng.common.log.annotation.AdminOperationLog;
import com.xiaopeng.common.log.enums.AdminBusinessType;
import com.xiaopeng.common.log.enums.AdminOperationType;
/**
 * <p>
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/SysLoginService.java
@@ -162,7 +162,7 @@
        }
        return userInfo;
    }
    public void logout(String loginName, HttpServletRequest request) {
        recordLogService.recordLogininfor(request, null, loginName, Constants.LOGIN_SUCCESS_STATUS, "退出成功");
    }
@@ -203,6 +203,9 @@
            throw new ServiceException("用户/验证码必须填写");
        }
        // 查询运维用户信息
        XpOperationsUser operationsUser = operationsUserService.lambdaQuery().in(
                XpOperationsUser::getPhoneNumber, SensitiveDataCryptoUtil.queryValues(phoneNumber)
        ).last("limit 1").one();
        XpOperationsUser operationsUser = operationsUserService.lambdaQuery()
                .in(XpOperationsUser::getPhoneNumber, SensitiveDataCryptoUtil.queryValues(phoneNumber))
                .last("limit 1").one();
@@ -236,6 +239,9 @@
            throw new ServiceException("用户/验证码必须填写");
        }
        // 查询运维用户信息
        XpOperationsUser operationsUser = operationsUserService.lambdaQuery().in(
                XpOperationsUser::getPhoneNumber, SensitiveDataCryptoUtil.queryValues(phoneNumber)
        ).last("limit 1").one();
        XpOperationsUser operationsUser = operationsUserService.lambdaQuery()
                .in(XpOperationsUser::getPhoneNumber, SensitiveDataCryptoUtil.queryValues(phoneNumber))
                .last("limit 1").one();
@@ -285,11 +291,20 @@
        return loginOperationUser;
    }
    public Boolean verificationCodeUpdate(UpdatePasswordDTO updatePasswordDTO, HttpServletRequest request) {
    public Boolean verificationCodeUpdate(UpdatePasswordDTO updatePasswordDTO, HttpServletRequest request) {
        String phoneNumber = updatePasswordDTO.getPhoneNumber();
        String code = updatePasswordDTO.getVerificationCode();
        phoneNumber = phoneNumber.trim();
        // 查询运维用户信息
        XpOperationsUser operationsUser = operationsUserService.lambdaQuery().in(
                XpOperationsUser::getPhoneNumber, SensitiveDataCryptoUtil.queryValues(phoneNumber)
        ).last("limit 1").one();
        if (StringUtils.isNull(operationsUser)) {
            throw new ServiceException("验证码错误!");
        }
        if (!operationsUser.getStatus()){
            throw new ServiceException("账号已禁用!");
        }
        if (StringUtils.isAnyBlank(phoneNumber, code)) {
            throw new ServiceException("用户/验证码必须填写");
        }
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/SysUserServiceImpl.java
@@ -1,5 +1,6 @@
package com.xiaopeng.account.service.impl;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import cn.hutool.core.util.DesensitizedUtil;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -128,7 +129,6 @@
     */
    @Override
    public boolean checkPhoneUnique(SysUser user) {
        Long userId = StringUtils.isNull(user.getId()) ? -1L : user.getId();
        SysUser info = lambdaQuery()
                .in(SysUser::getPhoneNumber, SensitiveDataCryptoUtil.queryValues(user.getPhoneNumber()))
                .last("limit 1")
@@ -202,7 +202,7 @@
     * @return 结果
     */
    @Override
    @Transactional
    @Transactional
    @ShardingSphereTransactionType(TransactionType.BASE)
    public int updateUser(SysUser user) {
        encryptPhone(user);
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/XpOperationsUserServiceImpl.java
@@ -32,6 +32,7 @@
import com.xiaopeng.api.model.account.XpQualificationAudit;
import com.xiaopeng.api.model.vehicleConvoy.XpFleet;
import com.xiaopeng.api.query.account.OptionalUsersPageListQuery;
import com.xiaopeng.api.query.account.OptionalUsersPageListQuery;
import com.xiaopeng.api.vo.account.*;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.common.core.exception.ServiceException;
@@ -54,6 +55,9 @@
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.Serializable;
import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import java.io.UnsupportedEncodingException;
import java.time.LocalDateTime;
@@ -124,10 +128,12 @@
    @Override
    public PageInfo<XpOperationsUserWithRoleVO> selectUserPageByConditions(XpOperationsUserPageQuery query) {
        query.setPhoneNumberQueryValues(SensitiveDataCryptoUtil.queryValues(query.getPhoneNumber()));
        LoginUser loginUser = tokenService.getLoginUser();
        query.setPhoneNumberQueryValues(SensitiveDataCryptoUtil.queryValues(query.getPhoneNumber()));
        PageInfo<XpOperationsUserWithRoleVO> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
        Page<XpOperationsUserWithRoleVO> page = baseMapper.selectUserPageByConditions(pageInfo, query);
        decryptWithRolePhones(page.getRecords());
        decryptWithRolePhones(page.getRecords());
        if(!loginUser.getPhoneDesensitizationExempt()){
            for (XpOperationsUserWithRoleVO record : page.getRecords()) {
@@ -243,7 +249,6 @@
    @Override
    public PageInfo<XpOperationsUserVO> pageList(XpOperationsUserQuery query) {
        LoginUser loginUser = tokenService.getLoginUser();
        query.setPhoneNumberQueryValues(SensitiveDataCryptoUtil.queryValues(query.getPhoneNumber()));
        PageInfo<XpOperationsUserVO> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
        List<XpOperationsUserVO> list = this.baseMapper.pageList(pageInfo, query);
@@ -314,12 +319,10 @@
    @Override
    public R<String> addOperationsUser(XpOperationsUserAddDTO dto) {
        if (StringUtils.isNotBlank(dto.getPhoneNumber())) {
            long userCount = this.count(Wrappers.lambdaQuery(XpOperationsUser.class)
                    .in(XpOperationsUser::getPhoneNumber, SensitiveDataCryptoUtil.queryValues(dto.getPhoneNumber())));
            if (userCount > 0) {
                throw new ServiceException("登录账号重复", I18nKeyConstant.ACCOUNT_DUPLICATE);
            }
        long userCount = StringUtils.isBlank(dto.getPhoneNumber()) ? 0 : this.count(Wrappers.lambdaQuery(XpOperationsUser.class)
                .in(XpOperationsUser::getPhoneNumber, SensitiveDataCryptoUtil.queryValues(dto.getPhoneNumber())));
        if (StringUtils.isNotBlank(dto.getPhoneNumber()) && userCount>0) {
            throw new ServiceException("登录账号重复", I18nKeyConstant.ACCOUNT_DUPLICATE);
        }
        //校验编号是否唯一
        long numberCount = this.count(Wrappers.lambdaQuery(XpOperationsUser.class)
@@ -347,13 +350,12 @@
    @Override
    public R<String> editOperationsUser(XpOperationsUserAddDTO dto) {
        if (StringUtils.isNotBlank(dto.getPhoneNumber())) {
            XpOperationsUser operationsUser = this.getOne(Wrappers.lambdaQuery(XpOperationsUser.class)
                    .in(XpOperationsUser::getPhoneNumber, SensitiveDataCryptoUtil.queryValues(dto.getPhoneNumber()))
                    .last("LIMIT 1"));
            if (Objects.nonNull(operationsUser) && !dto.getId().equals(operationsUser.getId())) {
                throw new ServiceException("手机号已开通账号", I18nKeyConstant.ACCOUNT_PHONE_DUPLICATE);
            }
        XpOperationsUser operationsUser = StringUtils.isBlank(dto.getPhoneNumber()) ? null : this.getOne(Wrappers.lambdaQuery(XpOperationsUser.class)
                .in(XpOperationsUser::getPhoneNumber, SensitiveDataCryptoUtil.queryValues(dto.getPhoneNumber()))
                .last("LIMIT 1"));
        if (StringUtils.isNotBlank(dto.getPhoneNumber()) && (Objects.nonNull(operationsUser) && !dto.getId().equals(operationsUser.getId()) )) {
            throw new ServiceException("手机号已开通账号", I18nKeyConstant.ACCOUNT_PHONE_DUPLICATE);
        }
        if (dto.getPassword() != null && !dto.getPassword().isEmpty()) {
            dto.setPassword(null);
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/XpQualificationAuditServiceImpl.java
@@ -56,6 +56,7 @@
    @Override
    public PageInfo<XpQualificationAuditVO> pageList(XpQualificationAuditQuery query) throws UnsupportedEncodingException {
        query.setPhoneNumberQueryValues(SensitiveDataCryptoUtil.queryValues(query.getPhoneNumber()));
        LoginUser loginUser = tokenService.getLoginUser();
        query.setPhoneNumberQueryValues(SensitiveDataCryptoUtil.queryValues(query.getPhoneNumber()));
        PageInfo<XpQualificationAuditVO> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
@@ -96,6 +97,7 @@
        for (XpQualificationAuditVO xpQualificationAuditVO : list) {
            xpQualificationAuditVO.setPhoneNumber(SensitiveDataCryptoUtil.decryptIfPossible(xpQualificationAuditVO.getPhoneNumber()));
            xpQualificationAuditVO.setPhoneNumber(SensitiveDataCryptoUtil.decryptIfPossible(xpQualificationAuditVO.getPhoneNumber()));
            if(!loginUser.getPhoneDesensitizationExempt()){
                xpQualificationAuditVO.setPhoneNumber(DesensitizedUtil.mobilePhone(xpQualificationAuditVO.getPhoneNumber()));
            }
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpCheckLocationController.java
@@ -20,6 +20,9 @@
import java.util.ArrayList;
import java.util.List;
import com.xiaopeng.common.log.annotation.AdminOperationLog;
import com.xiaopeng.common.log.enums.AdminBusinessType;
import com.xiaopeng.common.log.enums.AdminOperationType;
/**
 * @author MiTao
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpSchedulingDetailController.java
@@ -24,6 +24,9 @@
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import com.xiaopeng.common.log.annotation.AdminOperationLog;
import com.xiaopeng.common.log.enums.AdminBusinessType;
import com.xiaopeng.common.log.enums.AdminOperationType;
/**
 * <p>
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpShiftController.java
@@ -18,6 +18,9 @@
import org.springframework.web.bind.annotation.*;
import java.util.List;
import com.xiaopeng.common.log.annotation.AdminOperationLog;
import com.xiaopeng.common.log.enums.AdminBusinessType;
import com.xiaopeng.common.log.enums.AdminOperationType;
/**
 * <p>
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpTaskController.java
@@ -71,6 +71,12 @@
import javax.validation.Valid;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import com.xiaopeng.common.log.annotation.AdminOperationLog;
import com.xiaopeng.common.log.enums.AdminBusinessType;
import com.xiaopeng.common.log.enums.AdminOperationType;
import java.net.URLEncoder;
import java.util.*;
import java.util.function.Function;
@@ -395,7 +401,7 @@
        int  time = 10*60*1000;
        Long oneMinuteAgo = System.currentTimeMillis() - time;
        query.addCriteria(Criteria.where("updateTime").gte(oneMinuteAgo));
        List<XpOperationsUserPositionDTO> vehiclePositions = mongoTemplate.find(query, XpOperationsUserPositionDTO.class);
        if(CollUtil.isEmpty(vehiclePositions)){
            throw new ServiceException("未查询到运维人员");
@@ -439,7 +445,7 @@
            // 将查询结果转换为 Map,key 为 userId,value 为 XpFleetOperations 对象
            Map<Long, XpFleetOperations> fleetOperationsMap = findListByUserIdsR.getData().stream()
                    .collect(Collectors.toMap(XpFleetOperations::getOperationsUserId, Function.identity()));
            for (XpOperationsUserWithRoleVO record : ret.getRecords()) {
                if(fleetOperationsMap.containsKey(record.getId())){
                    record.setFleetName(fleetOperationsMap.get(record.getId()).getFleetName());
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpTaskManagementController.java
@@ -57,6 +57,9 @@
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import com.xiaopeng.common.log.annotation.AdminOperationLog;
import com.xiaopeng.common.log.enums.AdminBusinessType;
import com.xiaopeng.common.log.enums.AdminOperationType;
/**
 * <p>
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpWorkOrderController.java
@@ -25,6 +25,9 @@
import javax.annotation.Resource;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import com.xiaopeng.common.log.annotation.AdminOperationLog;
import com.xiaopeng.common.log.enums.AdminBusinessType;
import com.xiaopeng.common.log.enums.AdminOperationType;
/**
 * <p>
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/controller/XpElectronicFenceManagementController.java
@@ -54,6 +54,9 @@
import java.util.stream.Collectors;
import static com.xiaopeng.map.service.serviceimpl.XpElectronicFenceServiceImpl.getPinyinInitials;
import com.xiaopeng.common.log.annotation.AdminOperationLog;
import com.xiaopeng.common.log.enums.AdminBusinessType;
import com.xiaopeng.common.log.enums.AdminOperationType;
/**
 * <p>
@@ -138,7 +141,7 @@
            content = "新增电子围栏",
            appendRequestData = true
    )
    public R add(@Valid @RequestBody ElectronicFenceAddDto dto) {
    public R add(@Validated @RequestBody ElectronicFenceAddDto dto) {
        validateFenceTime(dto.getStatus(), dto.getEffectType(), dto.getEffectTime(), dto.getFailureType(), dto.getFailureTime());
        return xpElectronicFenceService.addElectronic(dto);
    }
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/controller/XpPointManagementController.java
@@ -55,6 +55,9 @@
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
import com.xiaopeng.common.log.annotation.AdminOperationLog;
import com.xiaopeng.common.log.enums.AdminBusinessType;
import com.xiaopeng.common.log.enums.AdminOperationType;
@Slf4j
@@ -234,6 +237,12 @@
    )
    @Transactional
    @ShardingSphereTransactionType(TransactionType.BASE)
    @AdminOperationLog(
            businessType = AdminBusinessType.POINT_MANAGEMENT,
            operationType = AdminOperationType.EDIT,
            content = "编辑正式点位",
            appendRequestData = true
    )
    public R edit(@Validated @RequestBody PointUpdateDto pointAddDto) {
        XpPoint xpPoint = xpPointService.getById(pointAddDto.getId());
        if (xpPoint == null) {
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/controller/XpTestPointManagementController.java
@@ -36,6 +36,9 @@
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import com.xiaopeng.common.log.annotation.AdminOperationLog;
import com.xiaopeng.common.log.enums.AdminBusinessType;
import com.xiaopeng.common.log.enums.AdminOperationType;
@Slf4j
@RestController
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpAppVersionController.java
@@ -14,6 +14,9 @@
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Lazy;
import org.springframework.web.bind.annotation.*;
import com.xiaopeng.common.log.annotation.AdminOperationLog;
import com.xiaopeng.common.log.enums.AdminBusinessType;
import com.xiaopeng.common.log.enums.AdminOperationType;
/**
 * App版本管理 Controller
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpBannerManagementController.java
@@ -22,6 +22,9 @@
import java.io.UnsupportedEncodingException;
import java.util.List;
import com.xiaopeng.common.log.annotation.AdminOperationLog;
import com.xiaopeng.common.log.enums.AdminBusinessType;
import com.xiaopeng.common.log.enums.AdminOperationType;
@Slf4j
@RestController
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpCouponController.java
@@ -13,6 +13,12 @@
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
import org.springframework.stereotype.Controller;
import java.util.List;
import com.xiaopeng.common.log.annotation.AdminOperationLog;
import com.xiaopeng.common.log.enums.AdminBusinessType;
import com.xiaopeng.common.log.enums.AdminOperationType;
import javax.annotation.Resource;
/**
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpCruisePlanController.java
@@ -48,6 +48,9 @@
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import com.xiaopeng.common.log.annotation.AdminOperationLog;
import com.xiaopeng.common.log.enums.AdminBusinessType;
import com.xiaopeng.common.log.enums.AdminOperationType;
/**
 * <p>
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpFeedbackTypeManagementController.java
@@ -16,6 +16,9 @@
import org.springframework.web.bind.annotation.*;
import java.util.List;
import com.xiaopeng.common.log.annotation.AdminOperationLog;
import com.xiaopeng.common.log.enums.AdminBusinessType;
import com.xiaopeng.common.log.enums.AdminOperationType;
/**
 * <p>
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpInvitationCodeController.java
@@ -55,6 +55,9 @@
import java.util.*;
import java.util.stream.Collectors;
import java.util.regex.Pattern;
import com.xiaopeng.common.log.annotation.AdminOperationLog;
import com.xiaopeng.common.log.enums.AdminBusinessType;
import com.xiaopeng.common.log.enums.AdminOperationType;
/**
 * <p>
@@ -106,7 +109,7 @@
            content = "生成邀请码",
            appendRequestData = true
    )
    public R add(@RequestBody InvitationAddDto dto) {
    public R add(@RequestBody InvitationAddDto dto){
        long existing = xpInvitationCodeService.count();
        long incoming = Arrays.stream(Optional.ofNullable(dto.getPhones()).orElse("").split(","))
                .map(String::trim)
@@ -128,16 +131,16 @@
    @PutMapping("/api/v1/invitation/unbind")
    @ResponseBody
    @ApiOperation(value = "解绑")
    @ApiImplicitParams({
            @ApiImplicitParam(value = "id", name = "id", dataType = "Long", required = true)
    })
    @AdminOperationLog(
            businessType = AdminBusinessType.INVITATION_CODE_MANAGEMENT,
            operationType = AdminOperationType.EDIT,
            contentExpression = "'解绑邀请码,id=' + #p0",
            appendRequestData = false
    )
    @ApiImplicitParams({
            @ApiImplicitParam(value = "id", name = "id", dataType = "Long", required = true)
    })
    public R unbind(@RequestParam("id") Long id) {
    public R unbind(@RequestParam("id") Long id){
        UpdateWrapper<XpInvitationCode> xpInvitationCodeUpdateWrapper = new UpdateWrapper<>();
        xpInvitationCodeUpdateWrapper.eq("id", id);
        xpInvitationCodeUpdateWrapper.set("status", 3);
@@ -390,7 +393,7 @@
            contentExpression = "'批量删除邀请码,ids=' + #p0",
            appendRequestData = false
    )
    public R deleteByIds(String ids) {
    public R deleteByIds(String ids){
        // 再转化为Long类型
        List<Long> longs = Arrays.stream(ids.split(",")).map(Long::parseLong).collect(Collectors.toList());
        xpInvitationCodeService.removeBatchByIds(longs);
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpOpenCityController.java
@@ -26,6 +26,9 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import com.xiaopeng.common.log.annotation.AdminOperationLog;
import com.xiaopeng.common.log.enums.AdminBusinessType;
import com.xiaopeng.common.log.enums.AdminOperationType;
@Slf4j
@RestController
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpPricingController.java
@@ -43,6 +43,9 @@
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;
import com.xiaopeng.common.log.annotation.AdminOperationLog;
import com.xiaopeng.common.log.enums.AdminBusinessType;
import com.xiaopeng.common.log.enums.AdminOperationType;
import java.util.ArrayList;
import java.util.List;
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpRoutePlanController.java
@@ -19,6 +19,9 @@
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import com.xiaopeng.common.log.annotation.AdminOperationLog;
import com.xiaopeng.common.log.enums.AdminBusinessType;
import com.xiaopeng.common.log.enums.AdminOperationType;
/**
 * <p>
@@ -58,6 +61,12 @@
            appendRequestData = true
    )
    @PostMapping("/api/v1/routePlan/add")
    @AdminOperationLog(
            businessType = AdminBusinessType.ROUTE_PLAN_MANAGEMENT,
            operationType = AdminOperationType.ADD,
            content = "新增路线规划配置",
            appendRequestData = true
    )
    public R<?> add(@Validated @RequestBody RoutePlanAddDTO dto) {
        routePlanService.add(dto);
        return R.ok();
@@ -74,6 +83,12 @@
            appendRequestData = true
    )
    @PostMapping("/api/v1/routePlan/edit")
    @AdminOperationLog(
            businessType = AdminBusinessType.ROUTE_PLAN_MANAGEMENT,
            operationType = AdminOperationType.EDIT,
            content = "编辑路线规划配置",
            appendRequestData = true
    )
    public R<?> edit(@Validated @RequestBody RoutePlanEditDTO dto) {
        routePlanService.edit(dto);
        return R.ok();
@@ -89,6 +104,11 @@
            contentExpression = "'删除路线规划配置,id=' + #p0"
    )
    @DeleteMapping("/api/v1/routePlan/deleteById/{id}")
    @AdminOperationLog(
            businessType = AdminBusinessType.ROUTE_PLAN_MANAGEMENT,
            operationType = AdminOperationType.DELETE,
            contentExpression = "'删除路线规划配置,id=' + #p0"
    )
    public R<?> deleteById(@ApiParam(name = "id", value = "线路ID") @PathVariable Long id) {
        routePlanService.deleteById(id);
        return R.ok();
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpTestPlanController.java
@@ -27,6 +27,9 @@
import javax.validation.Valid;
import java.util.List;
import com.xiaopeng.common.log.annotation.AdminOperationLog;
import com.xiaopeng.common.log.enums.AdminBusinessType;
import com.xiaopeng.common.log.enums.AdminOperationType;
/**
 * <p>
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpWhitelistController.java
@@ -425,17 +425,15 @@
        return value.substring(0, maxLength);
    }
    private static List<String> buildAccountQueryValues(Collection<String> accounts) {
        Set<String> values = new LinkedHashSet<>();
        if (accounts == null) {
            return new ArrayList<>();
    private static List<String> buildAccountQueryValues(Set<String> accounts) {
        if (CollectionUtils.isEmpty(accounts)) {
            return Collections.emptyList();
        }
        for (String account : accounts) {
            if (StringUtils.hasLength(account)) {
                values.addAll(SensitiveDataCryptoUtil.queryValues(account));
            }
        }
        return new ArrayList<>(values);
        return accounts.stream()
                .filter(StringUtils::hasLength)
                .flatMap(account -> SensitiveDataCryptoUtil.queryValues(account).stream())
                .distinct()
                .collect(Collectors.toList());
    }
    @ApiOperation(value = "白名单导出")
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/query/WhitelistPageListQuery.java
@@ -26,4 +26,7 @@
    @ApiModelProperty(value = "白名单账号查询值,包含明文兼容值和密文值")
    private List<String> accountQueryValues;
}
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpWhitelistServiceImpl.java
@@ -4,6 +4,8 @@
import cn.hutool.core.util.PhoneUtil;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xiaopeng.api.dto.account.UcUserInfo;
import com.xiaopeng.api.feignClient.account.UserResourcesClient;
import com.xiaopeng.api.model.account.SysUser;
@@ -27,6 +29,16 @@
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.io.Serializable;
import java.time.LocalDate;
import java.util.*;
@@ -128,6 +140,7 @@
                    .list()
                    .stream()
                    .map(XpWhitelist::getAccount)
                    .map(SensitiveDataCryptoUtil::decryptIfPossible)
                    .filter(StringUtils::hasLength)
                    .collect(Collectors.toSet());
            existsAccounts = existsStoredAccounts.stream()
@@ -502,8 +515,8 @@
        }
    }
    private void decryptWhitelistAccounts(Collection<XpWhitelist> list) {
        if (CollUtil.isEmpty(list)) {
    private static void decryptWhitelistAccounts(Collection<XpWhitelist> list) {
        if (list == null) {
            return;
        }
        for (XpWhitelist item : list) {
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpFleetController.java
@@ -37,6 +37,9 @@
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import com.xiaopeng.common.log.annotation.AdminOperationLog;
import com.xiaopeng.common.log.enums.AdminBusinessType;
import com.xiaopeng.common.log.enums.AdminOperationType;
import java.util.stream.Collectors;
/**
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpPolicyApplicationController.java
@@ -19,6 +19,9 @@
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import com.xiaopeng.common.log.annotation.AdminOperationLog;
import com.xiaopeng.common.log.enums.AdminBusinessType;
import com.xiaopeng.common.log.enums.AdminOperationType;
/**
 * @author MiTao
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpVehicleController.java
@@ -85,6 +85,10 @@
import java.util.*;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import com.xiaopeng.common.log.annotation.AdminOperationLog;
import com.xiaopeng.common.log.enums.AdminBusinessType;
import com.xiaopeng.common.log.enums.AdminOperationType;
import java.util.stream.Collectors;
/**
 * <p>
@@ -518,7 +522,7 @@
                    .collect(java.util.stream.Collectors.toSet());
            existsVins = xpVehicleService.lambdaQuery()
                    .select(XpVehicle::getVehicleVin)
                    .in(XpVehicle::getVehicleVin, vinQueryValues)
                    .in(XpVehicle::getVehicleVin, buildVinQueryValues(vinSet))
                    .list()
                    .stream()
                    .map(XpVehicle::getVehicleVin)
@@ -592,6 +596,17 @@
            }
        }
        return duplicated;
    }
    private static List<String> buildVinQueryValues(Iterable<String> vins) {
        if (vins == null) {
            return Collections.emptyList();
        }
        List<String> values = new ArrayList<>();
        for (String vin : vins) {
            values.addAll(SensitiveDataCryptoUtil.queryValues(vin));
        }
        return values.stream().distinct().collect(Collectors.toList());
    }
    private void uploadVehiclePicture(List<XpVehicleImportExcel> importList) {
@@ -846,15 +861,8 @@
     */
    @PostMapping("/logan/inner/vehicle/queryVehiclePositionByVin")
    public R<List<String>> queryVehiclePositionByVin(@RequestBody VehiclePositionByVinDto dto){
        if (dto == null) {
            return R.ok(new ArrayList<>());
        }
        List<String> vinQueryValues = buildVinQueryValues(dto.getVinList());
        if (vinQueryValues.isEmpty()) {
            return R.ok(new ArrayList<>());
        }
        List<XpVehicle> list = xpVehicleService.list(new LambdaQueryWrapper<XpVehicle>().eq(XpVehicle::getState, Optional.ofNullable(dto.getStatus()).orElse(0))
                .eq(XpVehicle::getOperatingStatus, 1).eq(XpVehicle::getElectronicId, dto.getFenceId()).in(XpVehicle::getVehicleVin, vinQueryValues));
                .eq(XpVehicle::getOperatingStatus, 1).eq(XpVehicle::getElectronicId, dto.getFenceId()).in(XpVehicle::getVehicleVin, buildVinQueryValues(dto.getVinList()))));
        if (list.isEmpty()) {
            return R.ok(new ArrayList<>());
        } else {
@@ -875,21 +883,16 @@
     * @return
     */
    @GetMapping("/logan/inner/vehicle/findByVehicleVin")
    public R<XpVehicle> findByVehicleVin(@RequestParam("vehicleVin") String vehicleVin) {
        if (StringUtils.isBlank(vehicleVin)) {
            return R.ok();
        }
    public R<XpVehicle> findByVehicleVin(@RequestParam("vehicleVin") String vehicleVin){
        XpVehicle xpVehicle = xpVehicleService.getOne(new LambdaQueryWrapper<XpVehicle>().in(XpVehicle::getVehicleVin, SensitiveDataCryptoUtil.queryValues(vehicleVin)));
        if (xpVehicle == null) {
            return R.ok();
        }
        // 获取车队
        XpFleetVehicle xpFleetVehicle = vehicleService.getOne(new LambdaQueryWrapper<XpFleetVehicle>().eq(XpFleetVehicle::getVehicleId, xpVehicle.getId()));
        if(null == xpFleetVehicle){
            return R.fail("车队信息获取失败");
        if (Objects.nonNull(xpVehicle)) {
            XpFleetVehicle xpFleetVehicle = vehicleService.getOne(new LambdaQueryWrapper<XpFleetVehicle>().eq(XpFleetVehicle::getVehicleId, xpVehicle.getId()));
            if (Objects.nonNull(xpFleetVehicle)) {
                xpVehicle.setFleetId(xpFleetVehicle.getFleetId());
            }
        }
        xpVehicle.setFleetId(xpFleetVehicle.getFleetId());
        return R.ok(xpVehicle);
    }
@@ -1145,7 +1148,6 @@
     * @param updateVehicleStateDto
     * @return
     */
    @PostMapping("/base/vi/vehicle/updateVehicleStatus")
    public R<?> testUpdateVehicleStatus(@RequestBody UpdateVehicleStateDto updateVehicleStateDto) {
        if (StringUtils.isBlank(updateVehicleStateDto.getVin())) {
            return R.ok();
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/service/impl/XpVehicleServiceImpl.java
@@ -90,6 +90,7 @@
import javax.annotation.Resource;
import java.io.Serializable;
import java.io.Serializable;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDate;
@@ -591,15 +592,16 @@
            //绑定XPUID
            String vin = xpVehicle.getVehicleVin();
            R<String> xpuIdByVin = xpuVinClient.getXpuIdByVin(vin);
            if(200 != xpuIdByVin.getCode()) {
                throw new ServiceException(xpuIdByVin.getMsg());
            }
            if (200 != xpuIdByVin.getCode()) {
                throw new RuntimeException(xpuIdByVin.getMsg());
            }
            String xpuid = xpuIdByVin.getData();
            xpVehicle.setXpuId(xpuid);
        }
        //绑定XPUID
        String vin = xpVehicle.getVehicleVin();
        String encryptVin = SensitiveDataCryptoUtil.encrypt(vin);
        xpVehicle.setVehicleVin(encryptVin);
        xpVehicle.setOfficialPartnerId(officialPartnerId);
        this.save(xpVehicle);
@@ -665,6 +667,9 @@
        } else {
            xpVehicle.setXpuId(existingVehicle.getXpuId());
        }
        String encryptVin = SensitiveDataCryptoUtil.encrypt(xpVehicle.getVehicleVin());
        xpVehicle.setVehicleVin(encryptVin);
        this.updateById(xpVehicle);
        // ADC推送:围栏绑定变更时触发单车推送
@@ -1749,4 +1754,82 @@
            vehicles.forEach(this::decryptVehicle);
        }
    }
    @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);
        }
    }
}