1
zj
2025-10-14 8e1c5b13e9dd4a88f17dfe4569d4a51b3495d83a
1
6 files modified
158 ■■■■ changed files
ruoyi-admin/src/main/java/com/ruoyi/im/out/UserAccountOut.java 2 ●●●●● patch | view | raw | blame | history
ruoyi-admin/src/main/java/com/ruoyi/im/util/SymmetricCryptoUtil.java 2 ●●● patch | view | raw | blame | history
ruoyi-admin/src/main/java/com/ruoyi/web/controller/product/UserKycController.java 60 ●●●● patch | view | raw | blame | history
ruoyi-admin/src/main/java/com/ruoyi/web/controller/product/UserPolicyController.java 57 ●●●●● patch | view | raw | blame | history
ruoyi-admin/src/main/java/com/ruoyi/web/controller/user/UserController.java 35 ●●●●● patch | view | raw | blame | history
ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/UserKycDto.java 2 ●●●●● patch | view | raw | blame | history
ruoyi-admin/src/main/java/com/ruoyi/im/out/UserAccountOut.java
@@ -69,6 +69,8 @@
    //身份证
    private String idCard;
    //是否已激活  true 已激活  false  未激活
    private Boolean activate;
    //创建群开关 0 开启 1关闭
    private Integer groupPermissions;
ruoyi-admin/src/main/java/com/ruoyi/im/util/SymmetricCryptoUtil.java
@@ -31,7 +31,7 @@
        String encryptData = encryptFromString(originalText, Mode.CBC, Padding.ZeroPadding);
        System.out.println("加密:" + encryptData);
        String decryptData = decryptFromString("6Du/e/lgbGjalVXFruqxjA==", Mode.CBC, Padding.ZeroPadding);
        String decryptData = decryptFromString("r9MkCPI7xQpdekYIhcVGwA==", Mode.CBC, Padding.ZeroPadding);
        System.out.println("解密:" + decryptData);
        // 验证加解密是否一致
ruoyi-admin/src/main/java/com/ruoyi/web/controller/product/UserKycController.java
@@ -107,14 +107,32 @@
            if(approvalStatus == 2 && StringUtils.isEmpty(message)){
                return AjaxResult.error("驳回理由不能为空!");
            }
            userKyc.setState(approvalStatus);
            userKyc.setMessage(message);
            userKyc.setUpdatedAt(new Date());
            userKycService.updateById(userKyc);
            UserAccount userAccount = userAccountService.getById(userKyc.getUserId());
            userAccount.setKycStatus(approvalStatus);
            userAccountService.updateById(userAccount);
            return AjaxResult.success("审批成功");
            if(approvalStatus == 2){
                userKyc.setState(approvalStatus);
                userKyc.setMessage(message);
                userKyc.setUpdatedAt(new Date());
                userKyc.setHeadPortraitImg(null);
                userKyc.setNationalEmblemImg(null);
                userKyc.setHandImg(null);
                userKyc.setName(null);
                userKyc.setIdCard(null);
                userKycService.updateById(userKyc);
                userKycService.updateById(userKyc);
                UserAccount userAccount = userAccountService.getById(userKyc.getUserId());
                userAccount.setKycStatus(approvalStatus);
                userAccountService.updateById(userAccount);
                return AjaxResult.success("审批成功");
            }else{
                userKyc.setState(approvalStatus);
                userKyc.setMessage(message);
                userKyc.setUpdatedAt(new Date());
                userKycService.updateById(userKyc);
                UserAccount userAccount = userAccountService.getById(userKyc.getUserId());
                userAccount.setKycStatus(approvalStatus);
                userAccountService.updateById(userAccount);
                return AjaxResult.success("审批成功");
            }
        }catch (Exception e){
            e.printStackTrace();
            // 手动设置回滚
@@ -124,7 +142,7 @@
    }
    /**
     * 什么认证列表
     * 实名认证列表
     */
    @GetMapping("/list")
    public TableDataInfo list(@RequestParam(value = "account",required = false) String account,
@@ -147,6 +165,30 @@
        return getDataTable(list);
    }
    /**
     * 实名认证后台修改
     */
    @PostMapping("/updateKyc")
    @Transactional
    public Result updateKyc(UserKycDto dto) {
        try {
            UserKyc userKyc = userKycService.getById(dto.getId());
            if(ObjectUtil.isEmpty(userKyc)){
                return Result.error("用户数据不存在!");
            }else{
                userKyc.setName(dto.getName());
                userKyc.setIdCard(dto.getIdCard());
                userKycService.updateById(userKyc);
            }
            return Result.success("修改成功!");
        }catch (Exception e){
            e.printStackTrace();
            // 手动设置回滚
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            return Result.error("提交失败");
        }
    }
    /**
     * 根据账户查询实名认证信息
ruoyi-admin/src/main/java/com/ruoyi/web/controller/product/UserPolicyController.java
@@ -78,28 +78,30 @@
     */
    @PostMapping("/purchaseApplication")
    public Result purchaseApplication(UserPolicyDto dto) {
        // 生成锁的key:基于用户ID和产品ID,防止同一用户同时购买同一产品
        String lockKey = redisDistributedLock.generateLockKey(dto.getAccount(), dto.getProductId());
        synchronized (dto.getAccount()) {
            // 生成锁的key:基于用户ID和产品ID,防止同一用户同时购买同一产品
            String lockKey = redisDistributedLock.generateLockKey(dto.getAccount(), dto.getProductId());
        boolean lockAcquired = false;
        try {
            // 尝试获取分布式锁:等待10秒,锁过期30秒
            lockAcquired = redisDistributedLock.tryLock(lockKey, 30L, 10L);
            boolean lockAcquired = false;
            try {
                // 尝试获取分布式锁:等待10秒,锁过期30秒
                lockAcquired = redisDistributedLock.tryLock(lockKey, 30L, 10L);
            if (!lockAcquired) {
                return Result.error("操作过于频繁,请稍后重试");
            }
                if (!lockAcquired) {
                    return Result.error("操作过于频繁,请稍后重试");
                }
            // 执行购买逻辑
            return userPolicyService.purchaseApplication(dto);
                // 执行购买逻辑
                return userPolicyService.purchaseApplication(dto);
        } catch (Exception e) {
            e.printStackTrace();
            return Result.error("购买失败");
        } finally {
            // 释放锁
            if (lockAcquired) {
                redisDistributedLock.releaseLock(lockKey);
            } catch (Exception e) {
                e.printStackTrace();
                return Result.error("购买失败");
            } finally {
                // 释放锁
                if (lockAcquired) {
                    redisDistributedLock.releaseLock(lockKey);
                }
            }
        }
    }
@@ -109,6 +111,25 @@
    /**
     * 根据用户id查询保单
     */
    @GetMapping("/updateGender")
    public AjaxResult updateGender(@RequestParam(value = "id") Integer id,@RequestParam(value = "gender") UserPolicy.Gender gender) {
        try {
            UserPolicy userPolicy = userPolicyService.getById(id);
            if(ObjectUtil.isEmpty(userPolicy)){
                AjaxResult.error("保单不存在!");
            }
            userPolicy.setGender(gender);
            userPolicyService.updateById(userPolicy);
            return AjaxResult.success("修改成功");
        }catch (Exception e){
            e.printStackTrace();
            return AjaxResult.error("修改失败!");
        }
    }
    /**
     * 根据用户id查询保单
     */
    @GetMapping("/getPolicyById")
    public Result getPolicyById(@RequestParam(value = "account") String account) {
        try {
ruoyi-admin/src/main/java/com/ruoyi/web/controller/user/UserController.java
@@ -14,11 +14,13 @@
import com.ruoyi.im.out.UserAccountOut;
import com.ruoyi.im.service.ImApiServcie;
import com.ruoyi.im.service.UserKycService;
import com.ruoyi.im.service.UserPolicyService;
import com.ruoyi.im.util.ConverterUtil;
import com.ruoyi.im.util.PhoneNumberValidatorUtil;
import com.ruoyi.im.util.SymmetricCryptoUtil;
import com.ruoyi.system.domain.UserAccount;
import com.ruoyi.system.domain.UserKyc;
import com.ruoyi.system.domain.UserPolicy;
import com.ruoyi.system.domain.vo.UserAccountUpdateVo;
import com.ruoyi.system.domain.vo.UserAccountVo;
import com.ruoyi.system.service.UserAccountService;
@@ -45,6 +47,9 @@
    @Autowired
    private UserKycService userKycService;
    @Autowired
    UserPolicyService userPolicyService;
    /**
     * 获取会员列表
@@ -126,9 +131,34 @@
        if (ObjectUtil.isEmpty(userAccounts) || maxLevel <= 0) {
            return new ArrayList<>();
        }
        // 收集用户ID用于查询激活状态
        List<Integer> idList = userAccounts.stream()
                .map(UserAccount::getId)
                .filter(ObjectUtil::isNotEmpty)
                .collect(Collectors.toList());
        // 先转换基础信息
        List<UserAccountOut> result = ConverterUtil.convertToList(userAccounts, UserAccountOut.class);
        // 批量查询激活状态
        Set<Integer> activatedUserIds = Collections.emptySet();
        if (!idList.isEmpty()) {
            LambdaQueryWrapper<UserPolicy> userPolicyWrapper = new LambdaQueryWrapper<>();
            userPolicyWrapper.in(UserPolicy::getUserId, idList)
                    .eq(UserPolicy::getApprovalStatus, 1)
                    .select(UserPolicy::getUserId);
            List<UserPolicy> policyList = userPolicyService.list(userPolicyWrapper);
            activatedUserIds = policyList.stream()
                    .map(UserPolicy::getUserId)
                    .collect(Collectors.toSet());
        }
        // 转换基础信息并设置激活状态
        List<UserAccountOut> result = new ArrayList<>();
        for (UserAccount user : userAccounts) {
            UserAccountOut out = ConverterUtil.convert(user, UserAccountOut.class);
            // 设置激活状态
            out.setActivate(activatedUserIds.contains(user.getId()));
            result.add(out);
        }
        // 递归加载下级用户
        loadSubordinateUsersRecursive(result, maxLevel);
@@ -290,7 +320,6 @@
            List<UserAccount> subordinates = userAccountService.list(queryWrapper);
            List<UserAccountOut> result = ConverterUtil.convertToList(subordinates, UserAccountOut.class);
            return AjaxResult.success(result);
        } catch (Exception e) {
            log.error("获取直接下级列表失败", e);
ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/UserKycDto.java
@@ -10,6 +10,8 @@
@Data
public class UserKycDto {
    private Integer id;
    // 系统生成的用户ID
    @NotEmpty(message = "用户账号不能为空")
    private String account;