ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/AppUserClientFallbackFactory.java
@@ -111,6 +111,11 @@ } @Override public void vipDemotion(Long appUserId) { R.fail("检查会员等级降级失败:" + cause.getMessage()); } @Override public void demotionDetection() { R.fail("用户降级检测失败:" + cause.getMessage()); } ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/AppUserClient.java
@@ -101,6 +101,15 @@ /** * 检查会员降级 * @param appUserId */ @PostMapping("/app-user/vipDemotion") void vipDemotion(@RequestParam("appUserId") Long appUserId); /** * 用户降级检测 */ @PostMapping("/app-user/demotionDetection") ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/AppUserController.java
@@ -374,7 +374,7 @@ .eq(AppUser::getDelFlag, 0)); ArrayList<Long> userIds = new ArrayList<>(); userIds.add(userId); getUserAncestorList(userIds, appUserList); getUserAncestorList(user,userIds, appUserList); // Long count1 = appUserService.lambdaQuery().ne(AppUser::getStatus,3).eq(AppUser::getVipId, 1).eq(AppUser::getInviteUserId, userId).or().eq(AppUser::getTopInviteId,userId).count(); // Long count2 = appUserService.lambdaQuery().ne(AppUser::getStatus,3).eq(AppUser::getVipId, 2).eq(AppUser::getInviteUserId, userId).or().eq(AppUser::getTopInviteId,userId).count(); // Long count3 = appUserService.lambdaQuery().ne(AppUser::getStatus,3).eq(AppUser::getVipId, 3).eq(AppUser::getInviteUserId, userId).or().eq(AppUser::getTopInviteId,userId).count(); @@ -382,13 +382,13 @@ // Long count5 = appUserService.lambdaQuery().ne(AppUser::getStatus,3).eq(AppUser::getVipId, 5).eq(AppUser::getInviteUserId, userId).or().eq(AppUser::getTopInviteId,userId).count(); // Long count6 = appUserService.lambdaQuery().ne(AppUser::getStatus,3).eq(AppUser::getVipId, 6).eq(AppUser::getInviteUserId, userId).or().eq(AppUser::getTopInviteId,userId).count(); // Long count7 = appUserService.lambdaQuery().ne(AppUser::getStatus,3).eq(AppUser::getVipId, 7).eq(AppUser::getInviteUserId, userId).or().eq(AppUser::getTopInviteId,userId).count(); user.setCount1(count1); user.setCount2(count2); user.setCount3(count3); user.setCount4(count4); user.setCount5(count5); user.setCount6(count6); user.setCount7(count7); // user.setCount1(count1); // user.setCount2(count2); // user.setCount3(count3); // user.setCount4(count4); // user.setCount5(count5); // user.setCount6(count6); // user.setCount7(count7); List<UserSignRecord> list = userSignRecordService.lambdaQuery().eq(UserSignRecord::getSignDay, LocalDate.now()) .eq(UserSignRecord::getAppUserId,userId).list(); @@ -399,25 +399,18 @@ } return R.ok(user); } private Long count1 = 0L; private Long count2 = 0L; private Long count3 = 0L; private Long count4 = 0L; private Long count5 = 0L; private Long count6 = 0L; private Long count7 = 0L; public void getUserAncestorList(List<Long> userIds, List<AppUser> list) { public void getUserAncestorList(AppUser user,List<Long> userIds, List<AppUser> list) { List<AppUser> children = list.stream().filter(u -> userIds.contains(u.getInviteUserId()) || userIds.contains(u.getTopInviteId())).collect(Collectors.toList()); if(!CollectionUtils.isEmpty(children)){ count1 = count1 + children.stream().filter(e->e.getVipId() == 1).count(); count2 = count2 + children.stream().filter(e->e.getVipId() == 2).count(); count3 = count3 + children.stream().filter(e->e.getVipId() == 3).count(); count4 = count4 + children.stream().filter(e->e.getVipId() == 4).count(); count5 = count5 + children.stream().filter(e->e.getVipId() == 5).count(); count6 = count6 + children.stream().filter(e->e.getVipId() == 6).count(); count7 = count7 + children.stream().filter(e->e.getVipId() == 7).count(); user.setCount1((user.getCount1() == null ? 0L : user.getCount1()) + children.stream().filter(e->e.getVipId() == 1).count()); user.setCount2((user.getCount2() == null ? 0L : user.getCount2()) + children.stream().filter(e->e.getVipId() == 2).count()); user.setCount3((user.getCount3() == null ? 0L : user.getCount3()) + children.stream().filter(e->e.getVipId() == 3).count()); user.setCount4((user.getCount4() == null ? 0L : user.getCount4()) + children.stream().filter(e->e.getVipId() == 4).count()); user.setCount5((user.getCount5() == null ? 0L : user.getCount5()) + children.stream().filter(e->e.getVipId() == 5).count()); user.setCount6((user.getCount6() == null ? 0L : user.getCount6()) + children.stream().filter(e->e.getVipId() == 6).count()); user.setCount7((user.getCount7() == null ? 0L : user.getCount7()) + children.stream().filter(e->e.getVipId() == 7).count()); List<Long> userIdList = children.stream().map(AppUser::getId).collect(Collectors.toList()); getUserAncestorList(userIdList, children); getUserAncestorList(user,userIdList, children); } } @@ -1002,6 +995,17 @@ /** * 检查会员降级 * @param appUserId */ @PostMapping("/app-user/vipDemotion") public void vipDemotion(@RequestParam("appUserId") Long appUserId){ appUserService.vipDemotion(appUserId); } /** * 用户降级检测 */ @PostMapping("/demotionDetection") ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/AppUserService.java
@@ -94,6 +94,12 @@ */ void vipUpgrade(Long appUserId); /** * 处理用户会员降级 * @param appUserId */ void vipDemotion(Long appUserId); /** * 降级检测 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/AppUserServiceImpl.java
@@ -179,7 +179,8 @@ } //查询用户是否注册,没有注册则跳转到注册页面 AppUser appUser = this.getOne(new LambdaQueryWrapper<AppUser>().eq(AppUser::getPhone, mobileLogin.getPhone()).ne(AppUser::getStatus, 3).eq(AppUser::getDelFlag, 0)); AppUser appUser = this.getOne(new LambdaQueryWrapper<AppUser>().eq(AppUser::getPhone, mobileLogin.getPhone()) .ne(AppUser::getStatus, 3).eq(AppUser::getDelFlag, 0)); if(null == appUser){ LoginVo loginVo = new LoginVo(); loginVo.setSkipPage(2); @@ -200,8 +201,7 @@ loginUser.setUsername(appUser.getName()); Map<String, Object> tokenApplet = tokenService.createTokenApplet(loginUser); loginVo.setToken(tokenApplet.get("access_token").toString()); loginVo.setFailureTime(Long.valueOf(tokenApplet.get("expires_in").toString())); loginVo.setFailureTime(Long.valueOf(tokenApplet.get("expires_in").toString())); appUser.setLastLoginTime(LocalDateTime.now()); this.updateById(appUser); return R.ok(loginVo); @@ -608,7 +608,85 @@ } } /** * 处理会员降级 * @param appUserId */ @Override public void vipDemotion(Long appUserId) { AppUser appUser = this.getById(appUserId); Integer vipId = appUser.getVipId(); //黄金会员 VipSetting vipSetting2 = vipSettingClient.getVipSetting(2).getData(); //消费积分满足升级 if(1 == vipSetting2.getVipLevelUpShopRole() && appUser.getShopPoint() >= vipSetting2.getVipLevelUpShop() && appUser.getVipId() > 2){ appUser.setVipId(2); this.updateById(appUser); //添加等级变化记录 UserChangeLog userChangeLog = new UserChangeLog(); userChangeLog.setDelFlag(0); userChangeLog.setCreateTime(LocalDateTime.now()); userChangeLog.setAppUserId(appUser.getId()); userChangeLog.setBeforeVipId(vipId); userChangeLog.setAfterVipId(appUser.getVipId()); userChangeLog.setChangeType(0); userChangeLogService.save(userChangeLog); return; } //返佣积分满足升级 if(1 == vipSetting2.getVipLevelUpShareRole() && appUser.getSharePoint() >= vipSetting2.getVipLevelUpShare() && appUser.getVipId() > 2){ appUser.setVipId(2); this.updateById(appUser); //添加等级变化记录 UserChangeLog userChangeLog = new UserChangeLog(); userChangeLog.setDelFlag(0); userChangeLog.setCreateTime(LocalDateTime.now()); userChangeLog.setAppUserId(appUser.getId()); userChangeLog.setBeforeVipId(vipId); userChangeLog.setAfterVipId(appUser.getVipId()); userChangeLog.setChangeType(0); userChangeLogService.save(userChangeLog); return; } //下级人数满足升级 Integer vipLevelUpNumRole = vipSetting2.getVipLevelUpNumRole(); Integer vipDirectNum = vipSetting2.getVipDirectNum(); Integer vipTeamNum = vipSetting2.getVipTeamNum(); if(1 == vipLevelUpNumRole && appUser.getVipId() > 2){ //查询直推用户达到X人或者团队人数达到X人后,可升级 //直推用户数 long count = this.count(new LambdaQueryWrapper<AppUser>().eq(AppUser::getDelFlag, 0).eq(AppUser::getStatus, 1).eq(AppUser::getInviteUserId, appUserId)); //团队用户数 List<AppUser> subordinate = getSubordinate(appUserId); if(vipDirectNum <= count || vipTeamNum <= subordinate.size()){ appUser.setVipId(2); this.updateById(appUser); //添加等级变化记录 UserChangeLog userChangeLog = new UserChangeLog(); userChangeLog.setDelFlag(0); userChangeLog.setCreateTime(LocalDateTime.now()); userChangeLog.setAppUserId(appUser.getId()); userChangeLog.setBeforeVipId(vipId); userChangeLog.setAfterVipId(appUser.getVipId()); userChangeLog.setChangeType(0); userChangeLogService.save(userChangeLog); return; } } if(appUser.getVipId() > 2){ appUser.setVipId(1); this.updateById(appUser); //添加等级变化记录 UserChangeLog userChangeLog = new UserChangeLog(); userChangeLog.setDelFlag(0); userChangeLog.setCreateTime(LocalDateTime.now()); userChangeLog.setAppUserId(appUser.getId()); userChangeLog.setBeforeVipId(vipId); userChangeLog.setAfterVipId(appUser.getVipId()); userChangeLog.setChangeType(0); userChangeLogService.save(userChangeLog); } } /** * 递归查询顶级推广人 ruoyi-service/ruoyi-account/src/test/java/com/ruoyi/order/account/RuoYiAccountApplicationTests.java
@@ -22,38 +22,32 @@ @Test public void contextLoads() { List<AppUser> appUserList = appUserService.list(new LambdaQueryWrapper<AppUser>() .ne(AppUser::getStatus, 3)); .ne(AppUser::getStatus, 3) .eq(AppUser::getDelFlag, 0)); AppUser user = appUserService.getById(1879046499735789569L); ArrayList<Long> userIds = new ArrayList<>(); userIds.add(1879046499735789569L); getUserAncestorList(userIds, appUserList); System.err.println(count1); System.err.println(count2); System.err.println(count3); System.err.println(count4); System.err.println(count5); System.err.println(count6); System.err.println(count7); getUserAncestorList(user,userIds, appUserList); System.err.println(user.getCount1()); System.err.println(user.getCount2()); System.err.println(user.getCount3()); System.err.println(user.getCount4()); System.err.println(user.getCount5()); System.err.println(user.getCount6()); System.err.println(user.getCount7()); } private Long count1 = 0L; private Long count2 = 0L; private Long count3 = 0L; private Long count4 = 0L; private Long count5 = 0L; private Long count6 = 0L; private Long count7 = 0L; public void getUserAncestorList(List<Long> userIds, List<AppUser> list) { public void getUserAncestorList(AppUser user,List<Long> userIds, List<AppUser> list) { List<AppUser> children = list.stream().filter(u -> userIds.contains(u.getInviteUserId()) || userIds.contains(u.getTopInviteId())).collect(Collectors.toList()); if(!CollectionUtils.isEmpty(children)){ count1 = count1 + children.stream().filter(e->e.getVipId() == 1).count(); count2 = count2 + children.stream().filter(e->e.getVipId() == 2).count(); count3 = count3 + children.stream().filter(e->e.getVipId() == 3).count(); count4 = count4 + children.stream().filter(e->e.getVipId() == 4).count(); count5 = count5 + children.stream().filter(e->e.getVipId() == 5).count(); count6 = count6 + children.stream().filter(e->e.getVipId() == 6).count(); count7 = count7 + children.stream().filter(e->e.getVipId() == 7).count(); user.setCount1((user.getCount1() == null ? 0L : user.getCount1()) + children.stream().filter(e->e.getVipId() == 1).count()); user.setCount2((user.getCount2() == null ? 0L : user.getCount2()) + children.stream().filter(e->e.getVipId() == 2).count()); user.setCount3((user.getCount3() == null ? 0L : user.getCount3()) + children.stream().filter(e->e.getVipId() == 3).count()); user.setCount4((user.getCount4() == null ? 0L : user.getCount4()) + children.stream().filter(e->e.getVipId() == 4).count()); user.setCount5((user.getCount5() == null ? 0L : user.getCount5()) + children.stream().filter(e->e.getVipId() == 5).count()); user.setCount6((user.getCount6() == null ? 0L : user.getCount6()) + children.stream().filter(e->e.getVipId() == 6).count()); user.setCount7((user.getCount7() == null ? 0L : user.getCount7()) + children.stream().filter(e->e.getVipId() == 7).count()); List<Long> userIdList = children.stream().map(AppUser::getId).collect(Collectors.toList()); getUserAncestorList(userIdList, children); getUserAncestorList(user,userIdList, children); } } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java
@@ -6,10 +6,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.account.api.feignClient.AppUserClient; import com.ruoyi.account.api.feignClient.BalanceChangeRecordClient; import com.ruoyi.account.api.feignClient.UserCouponClient; import com.ruoyi.account.api.feignClient.UserPointClient; import com.ruoyi.account.api.feignClient.*; import com.ruoyi.account.api.model.*; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.exception.ServiceException; @@ -89,9 +86,6 @@ private UserPointClient userPointClient; @Resource private PointSettingClient pointSettingClient; @Resource private OrderBalancePaymentService orderBalancePaymentService; @Resource @@ -115,6 +109,9 @@ @Resource private UserCouponClient userCouponClient; @Resource private UserChangeLogClient userChangeLogClient; @@ -518,11 +515,6 @@ } appUser.setTotalPoint(appUser.getTotalPoint() - shopPoint); boolean vipDemotion = vipDemotion(appUser.getShopPoint(), appUser.getVipId()); if(vipDemotion){ appUser.setVipId(appUser.getVipId() - 1); } //构建积分流水明细 UserPoint userPoint = new UserPoint(); userPoint.setType(1); @@ -534,6 +526,12 @@ userPoint.setObjectId(order.getId()); userPointClient.saveUserPoint(userPoint); appUserClient.editAppUserById(appUser); //降级检测 boolean vipDemotion = vipDemotion(appUser.getShopPoint(), appUser.getVipId()); if(vipDemotion){ appUserClient.vipDemotion(appUser.getId()); } //回退优惠券状态 if(null != order.getUserCouponId()){ UserCoupon userCoupon = userCouponClient.getUserCoupon(order.getUserCouponId()).getData(); @@ -650,11 +648,6 @@ } appUser.setTotalPoint(appUser.getTotalPoint() - shopPoint); boolean vipDemotion = vipDemotion(appUser.getShopPoint(), appUser.getVipId()); if(vipDemotion){ appUser.setVipId(appUser.getVipId() - 1); } //构建积分流水明细 UserPoint userPoint = new UserPoint(); userPoint.setType(1); @@ -666,6 +659,12 @@ userPoint.setObjectId(order.getId()); userPointClient.saveUserPoint(userPoint); appUserClient.editAppUserById(appUser); //降级检测 boolean vipDemotion = vipDemotion(appUser.getShopPoint(), appUser.getVipId()); if(vipDemotion){ appUserClient.vipDemotion(appUser.getId()); } //回退优惠券状态 if(null != order.getUserCouponId()){