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;