From ff811ae8df41273d7ab0011b6b7f1f278f03bbd2 Mon Sep 17 00:00:00 2001 From: luodangjia <luodangjia> Date: 星期四, 12 十二月 2024 18:06:05 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master' --- ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/AppUserServiceImpl.java | 244 +++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 237 insertions(+), 7 deletions(-) diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/AppUserServiceImpl.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/AppUserServiceImpl.java index 28554a7..64a32a1 100644 --- a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/AppUserServiceImpl.java +++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/AppUserServiceImpl.java @@ -3,12 +3,19 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.account.api.model.AppUserShop; +import com.ruoyi.account.api.model.UserChangeLog; +import com.ruoyi.account.api.model.UserPoint; import com.ruoyi.account.mapper.AppUserMapper; import com.ruoyi.account.api.model.AppUser; import com.ruoyi.account.service.AppUserService; import com.ruoyi.account.service.AppUserShopService; +import com.ruoyi.account.service.UserChangeLogService; +import com.ruoyi.account.service.UserPointService; +import com.ruoyi.account.util.weChat.EnvVersion; import com.ruoyi.account.util.weChat.WXCore; import com.ruoyi.account.util.weChat.WeChatUtil; import com.ruoyi.account.vo.*; @@ -16,17 +23,29 @@ import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.common.redis.service.RedisService; import com.ruoyi.common.security.service.TokenService; +import com.ruoyi.other.api.domain.PointSetting; import com.ruoyi.other.api.domain.Shop; +import com.ruoyi.other.api.domain.VipSetting; +import com.ruoyi.other.api.feignClient.PointSettingClient; import com.ruoyi.other.api.feignClient.ShopClient; +import com.ruoyi.other.api.feignClient.VipSettingClient; import com.ruoyi.system.api.domain.SysUser; import com.ruoyi.system.api.feignClient.SysUserClient; import com.ruoyi.system.api.model.LoginUser; +import org.apache.logging.log4j.core.util.UuidUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; import javax.annotation.Resource; import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.*; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +import static com.sun.xml.internal.ws.api.model.wsdl.WSDLBoundOperation.ANONYMOUS.optional; /** * <p> @@ -57,12 +76,27 @@ @Resource private SysUserClient sysUserClient; + @Resource + private VipSettingClient vipSettingClient; + + @Resource + private PointSettingClient pointSettingClient; + @Resource + private UserChangeLogService userChangeLogService; + + @Value("${file.upload.location}") + private String filePath; - - - - + @Value("${file.upload.accessPath}") + private String accessPath; + + @Resource + private UserPointService userPointService; + @Autowired + private AppUserMapper appUserMapper; + + /** * 小程序一键登录 * @param appletLogin @@ -107,6 +141,9 @@ Map<String, Object> tokenApplet = tokenService.createTokenApplet(loginUser); loginVo.setToken(tokenApplet.get("access_token").toString()); loginVo.setFailureTime(Long.valueOf(tokenApplet.get("expires_in").toString())); + + appUser.setLastLoginTime(LocalDateTime.now()); + this.updateById(appUser); return R.ok(loginVo); } @@ -147,6 +184,9 @@ Map<String, Object> tokenApplet = tokenService.createTokenApplet(loginUser); loginVo.setToken(tokenApplet.get("access_token").toString()); loginVo.setFailureTime(Long.valueOf(tokenApplet.get("expires_in").toString())); + + appUser.setLastLoginTime(LocalDateTime.now()); + this.updateById(appUser); return R.ok(loginVo); } @@ -258,7 +298,16 @@ appUser.setTotalRedPacketAmount(BigDecimal.ZERO); appUser.setTotalDistributionAmount(BigDecimal.ZERO); appUser.setBalance(BigDecimal.ZERO); - appUser.setLavePoint(0); + R<PointSetting> pointSettingR = pointSettingClient.getPointSetting(1); + if (R.isError(pointSettingR)){ + throw new RuntimeException("获取积分设置失败"); + } + PointSetting pointSetting = pointSettingR.getData(); + if (pointSetting == null){ + throw new RuntimeException("积分设置不存在"); + } + appUser.setLavePoint(pointSetting.getGetRegisPoint()); + appUser.setTotalPoint(0); //根据平台的配置未达标,则标注为可修改推广人 appUser.setChangePromoter(0); appUser.setLongitude(registerAccount.getLongitude()); @@ -271,6 +320,15 @@ // appUser.setDistrict(); // appUser.setDistrictCode(); this.save(appUser); + //获取微信推广二维码 + String fileName = UUID.randomUUID() + ".jpg"; + weChatUtil.getwxacodeunlimit("pages/login/login", "id=" + appUser.getId(), EnvVersion.DEVELOP, filePath + fileName); + appUser.setQrCode(accessPath + fileName); + this.updateById(appUser); + //直推用户检查是否满足升级条件 + if(null != appUser.getInviteUserId()){ + vipUpgrade(appUser.getInviteUserId()); + } //查询当前注册的手机号是都和门店管理员手机号相同 Shop shop = shopClient.getShopByPhone(registerAccount.getPhone()).getData(); @@ -300,7 +358,7 @@ } LoginVo loginVo = new LoginVo(); loginVo.setSkipPage(1); - loginVo.setFirstTime(null == appUser1 ? true : false); + loginVo.setFirstTime(null == appUser1); loginVo.setPhone(appUser.getPhone()); //构建token LoginUser loginUser = new LoginUser(); @@ -311,6 +369,67 @@ loginVo.setFailureTime(Long.valueOf(tokenApplet.get("expires_in").toString())); return R.ok(loginVo); } + + + /** + * 会员等级变化 + */ + public void vipUpgrade(Long id){ + AppUser appUser = this.getById(id); + Integer vipId = appUser.getVipId(); + //钻石会员 + VipSetting vipSetting3 = vipSettingClient.getVipSetting(3).getData(); + Integer vipLevelUpNumRole = vipSetting3.getVipLevelUpNumRole(); + Integer vipDirectNum = vipSetting3.getVipDirectNum(); + Integer vipTeamNum = vipSetting3.getVipTeamNum(); + if(1 == vipLevelUpNumRole && appUser.getVipId() < 3){ + //查询直推用户达到X人或者团队人数达到X人后,可升级 + //直推用户数 + long count = this.count(new LambdaQueryWrapper<AppUser>().eq(AppUser::getDelFlag, 0).eq(AppUser::getStatus, 1).eq(AppUser::getInviteUserId, id)); + //团队用户数 + List<AppUser> subordinate = getSubordinate(id); + if(vipDirectNum <= count || vipTeamNum <= subordinate.size()){ + appUser.setVipId(3); + 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(1); + userChangeLogService.save(userChangeLog); + return; + } + } + //黄金会员 + VipSetting vipSetting2 = vipSettingClient.getVipSetting(2).getData(); + vipLevelUpNumRole = vipSetting2.getVipLevelUpNumRole(); + vipDirectNum = vipSetting2.getVipDirectNum(); + 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, id)); + //团队用户数 + List<AppUser> subordinate = getSubordinate(id); + 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(1); + userChangeLogService.save(userChangeLog); + } + } + } + /** @@ -331,6 +450,36 @@ return getTopAppUser(list, appUser.getInviteUserId()); } + /** + * 获取所有下级数据 + * @param id + * @return + */ + public List<AppUser> getSubordinate(Long id){ + List<AppUser> list = this.list(new LambdaQueryWrapper<AppUser>().eq(AppUser::getDelFlag, 0)); + List<AppUser> result = new ArrayList<>(); + List<Long> ids = new ArrayList<>(); + ids.add(id); + return getSubordinate(list, ids, result); + } + + public List<AppUser> getSubordinate(List<AppUser> list, List<Long> ids, List<AppUser> result){ + List<Long> idss = new ArrayList<>(); + for (Long id : ids) { + List<AppUser> collect = list.stream().filter(s -> s.getInviteUserId().equals(id)).collect(Collectors.toList()); + if(collect.size() == 0){ + return result; + }else{ + result.addAll(collect); + List<Long> collect1 = collect.stream().map(AppUser::getId).collect(Collectors.toList()); + idss.addAll(collect1); + } + } + return getSubordinate(list, idss, result); + } + + + /** * 获取附近推广人 @@ -342,7 +491,7 @@ //使用地图获取省市区数据 String longitude = nearbyReferrer.getLongitude(); String latitude = nearbyReferrer.getLatitude(); - String cityCode = ""; // TODO 待完善 + String cityCode = "510100"; // TODO 待完善 List<NearbyReferrerVo> list = this.baseMapper.getNearbyReferrer(cityCode, nearbyReferrer); return list; } @@ -395,4 +544,85 @@ } return null; } + + + /** + * 定时解绑推广人 + */ + @Override + public void unbindThePromoter() { + //注册X天后没有升级成黄金会员则自动解绑推广人 + VipSetting vipSetting = vipSettingClient.getVipSetting(1).getData(); + Integer vipCancelDay = vipSetting.getVipCancelDay(); + Integer vipChangeDay = vipSetting.getVipChangeDay(); + List<AppUser> list = this.list(new LambdaQueryWrapper<AppUser>().eq(AppUser::getVipId, 1).eq(AppUser::getDelFlag, 0).isNotNull(AppUser::getInviteUserId) + .eq(AppUser::getStatus, 1).last(" and (UNIX_TIMESTAMP(create_time) + " + vipCancelDay + ") <= UNIX_TIMESTAMP()")); + for (AppUser appUser : list) { + appUser.setInviteUserId(null); + appUser.setShopId(null); + this.updateById(appUser); + } + + //可更换推广人 + list = this.list(new LambdaQueryWrapper<AppUser>().eq(AppUser::getVipId, 1).eq(AppUser::getDelFlag, 0).eq(AppUser::getChangePromoter, 0) + .isNull(AppUser::getLastShopTime).eq(AppUser::getStatus, 1).last(" and (UNIX_TIMESTAMP(create_time) + " + vipCancelDay + ") <= UNIX_TIMESTAMP()")); + for (AppUser appUser : list) { + appUser.setChangePromoter(1); + this.updateById(appUser); + } + } + + + /** + * 在线记录操作,用于赠送积分 + */ + @Override + public void onlineRecord() { + Long userid = tokenService.getLoginUserApplet().getUserid(); + Object cacheObject = redisService.getCacheObject("ONLINE_" + userid); + if(null == cacheObject){ + redisService.setCacheObject("ONLINE_" + userid, 0, 15L, TimeUnit.MINUTES); + }else{ + Long duration = (Long) cacheObject; + duration += 10; + //满足一个小时,开始发放积分,计时归0 + if(60 >= duration){ + redisService.setCacheObject("ONLINE_" + userid, 0, 15L, TimeUnit.MINUTES); + AppUser appUser = this.getById(userid); + PointSetting pointSetting = pointSettingClient.getPointSetting(appUser.getVipId()).getData(); + if(null != pointSetting){ + int hourPoint = pointSetting.getHourPoint().intValue(); + Integer lavePoint = appUser.getLavePoint(); + appUser.setTotalPoint(appUser.getTotalPoint() + hourPoint); + appUser.setLavePoint(appUser.getLavePoint() + hourPoint); + this.updateById(appUser); + //添加积分变动记录 + UserPoint userPoint = new UserPoint(); + userPoint.setType(9); + userPoint.setHistoricalPoint(lavePoint); + userPoint.setVariablePoint(hourPoint); + userPoint.setBalance(appUser.getLavePoint()); + userPoint.setCreateTime(LocalDateTime.now()); + userPoint.setAppUserId(appUser.getId()); + userPointService.save(userPoint); + } + }else{ + redisService.setCacheObject("ONLINE_" + userid, duration, 15L, TimeUnit.MINUTES); + } + } + } + + @Override + public IPage<AppUser> getAppuserPage(Integer pageNum, Integer pageSize, AppUser appUser) { + if (StringUtils.isNotEmpty(appUser.getShopName())){ + R<Set<Integer>> shopR = shopClient.getShopIdByName(appUser.getShopName()); + if (R.isSuccess(shopR)){ + Set<Integer> shopIds = shopR.getData(); + if (!CollectionUtils.isEmpty(shopIds)){ + appUser.setShopIds(shopIds); + } + } + } + return appUserMapper.getAppuserPage(new Page<>(pageNum, pageSize), appUser); + } } -- Gitblit v1.7.1