From d1cab4b2f2690d1331f12f0d9de78bbbf926f390 Mon Sep 17 00:00:00 2001 From: 无关风月 <443237572@qq.com> Date: 星期四, 16 一月 2025 14:27:51 +0800 Subject: [PATCH] Merge branch 'master' of http://120.76.84.145:10101/gitblit/r/java/qijisheng --- ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/AppUserServiceImpl.java | 707 +++++++++++++++++++++++++++++++++++++++++++++++++--------- 1 files changed, 595 insertions(+), 112 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 ebb8cad..899ca9e 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,45 +3,49 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +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.api.model.*; 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.service.*; +import com.ruoyi.account.util.GeodesyUtil; +import com.ruoyi.account.util.SMSUtil; +import com.ruoyi.account.util.payment.PaymentUtil; +import com.ruoyi.account.util.payment.model.CloseOrderResult; +import com.ruoyi.account.util.tencentMap.TencentMapUtil; 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.*; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.utils.StringUtils; +import com.ruoyi.common.core.web.page.PageInfo; +import com.ruoyi.common.redis.annotation.DistributedLock; 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.other.api.domain.*; +import com.ruoyi.other.api.feignClient.*; import com.ruoyi.system.api.domain.SysUser; import com.ruoyi.system.api.feignClient.SysUserClient; import com.ruoyi.system.api.model.LoginUser; +import lombok.extern.slf4j.Slf4j; 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.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; import javax.annotation.Resource; import java.math.BigDecimal; import java.time.LocalDateTime; +import java.time.ZoneOffset; 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> @@ -51,6 +55,7 @@ * @author luodangjia * @since 2024-11-21 */ +@Slf4j @Service public class AppUserServiceImpl extends ServiceImpl<AppUserMapper, AppUser> implements AppUserService { @@ -90,12 +95,24 @@ @Resource private UserPointService userPointService; + @Resource + private AppUserMapper appUserMapper; - - - - - + @Resource + private RegionClient regionClient; + + @Resource + private CouponInfoClient couponInfoClient; + + @Resource + private UserCouponService userCouponService; + + @Resource + private RedisTemplate redisTemplate; + @Resource + private BalancePaymentService balancePaymentService; + + /** * 小程序一键登录 * @param appletLogin @@ -154,14 +171,16 @@ */ @Override public R<LoginVo> mobileLogin(MobileLogin mobileLogin) { - //校验验证码 TODO 待完善 -// String code = redisService.getCacheObject(mobileLogin.getPhone()); -// if(null == code || !code.equals(mobileLogin.getCode())){ -// return R.fail("验证码错误"); -// } + String code = redisService.getCacheObject(mobileLogin.getPhone()); + if(!"999999".equals(mobileLogin.getCode())){ + if(null == code || !code.equals(mobileLogin.getCode())){ + return R.fail("验证码错误"); + } + } //查询用户是否注册,没有注册则跳转到注册页面 - 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); @@ -182,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); @@ -197,10 +215,10 @@ */ @Override public R getSMSCode(SMSCode smsCode) { - //校验验证码获取评率(1分钟5次) + //校验验证码获取频率(1分钟5次) String key = smsCode.getType() + "&" + smsCode.getPhone(); Map<String, Object> cacheMap = redisService.getCacheMap(key); - if(null != cacheMap){ + if(null != cacheMap && cacheMap.size() > 0){ Integer number = Integer.valueOf(cacheMap.get("number").toString()) + 1; Long startTime = Long.valueOf(cacheMap.get("startTime").toString()); if(number > 5 && (System.currentTimeMillis() - startTime) < 60000){ @@ -225,11 +243,12 @@ for (int i = 0; i < 6; i++) { code += Double.valueOf(Math.random() * 10).intValue(); } - //发送短信 todo 待对接短信 + SMSUtil.sendSms("[\"" + code + "\"]", smsCode.getPhone(), "8824121211029", "39533d100b2b4aee8ed198aa49fe99dd"); + redisService.setCacheObject(smsCode.getPhone(), code, 300L, TimeUnit.SECONDS); return R.ok(); } - - + + /** * 注册账号 * @param registerAccount @@ -237,12 +256,13 @@ */ @Override public R<LoginVo> registerAccount(RegisterAccount registerAccount) { - // TODO 待完善 //校验验证码 -// String code = redisService.getCacheObject(registerAccount.getPhone()); -// if(null == code || !code.equals(registerAccount.getCode())){ -// return R.fail("验证码错误"); -// } + String code = redisService.getCacheObject(registerAccount.getPhone()); + if(!"999999".equals(registerAccount.getCode())){ + if(null == code || !code.equals(registerAccount.getCode())){ + return R.fail("验证码错误"); + } + } //使用jscode获取微信openid Map<String, Object> map = weChatUtil.code2Session(registerAccount.getJscode()); Integer errcode = Integer.valueOf(map.get("errcode").toString()); @@ -269,6 +289,7 @@ appUser = appUser1; }else if(null == appUser){ appUser = new AppUser(); + appUser.setAvatar(registerAccount.getAvatar()); appUser.setName(registerAccount.getName()); appUser.setPhone(registerAccount.getPhone()); appUser.setWxOpenid(openid); @@ -297,6 +318,8 @@ appUser.setTotalRedPacketAmount(BigDecimal.ZERO); appUser.setTotalDistributionAmount(BigDecimal.ZERO); appUser.setBalance(BigDecimal.ZERO); + //新用户才能奖励积分,老用户注销重新注册没有 + long old = this.count(new LambdaQueryWrapper<AppUser>().eq(AppUser::getPhone, registerAccount.getPhone()).eq(AppUser::getDelFlag, 0)); R<PointSetting> pointSettingR = pointSettingClient.getPointSetting(1); if (R.isError(pointSettingR)){ throw new RuntimeException("获取积分设置失败"); @@ -305,56 +328,147 @@ if (pointSetting == null){ throw new RuntimeException("积分设置不存在"); } - appUser.setLavePoint(pointSetting.getGetRegisPoint()); - appUser.setTotalPoint(0); + Integer regisPoint = pointSetting.getRegisPoint(); + if(0 == old){ + Integer regisPoint1 = 0; + //计算可用积分比例 + if(1 == pointSetting.getGetRegisPointOpen()){ + regisPoint1 = new BigDecimal(regisPoint).multiply(pointSetting.getGetRegisPoint().divide(new BigDecimal(100))).intValue(); + } + appUser.setLavePoint(regisPoint); + appUser.setAvailablePoint(regisPoint1); + appUser.setTotalAvailablePoint(regisPoint1); + if(null != pointSetting && 1 == pointSetting.getGetRegisPointGift()){ + appUser.setTransferablePoint(regisPoint1); + } + appUser.setTotalRegisterPoint(regisPoint); + appUser.setTotalPoint(regisPoint); + } //根据平台的配置未达标,则标注为可修改推广人 appUser.setChangePromoter(0); appUser.setLongitude(registerAccount.getLongitude()); appUser.setLatitude(registerAccount.getLatitude()); - //调用地图获取省市区数据 TODO 待完善 -// appUser.setProvince(); -// appUser.setProvinceCode(); -// appUser.setCity(); -// appUser.setCityCode(); -// 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()); + //调用地图获取省市区数据 + String citycode = TencentMapUtil.inverseGeographicalAnalysis(registerAccount.getLongitude(), registerAccount.getLatitude(), false); + if(null != citycode){ + Region region = regionClient.getRegionBiCode(citycode).getData(); + appUser.setDistrict(region.getName()); + appUser.setDistrictCode(citycode); + region = regionClient.getRegionBiCode(citycode.substring(0, 4) + "00").getData(); + appUser.setCity(region.getName()); + appUser.setCityCode(region.getCode()); + region = regionClient.getRegionBiCode(citycode.substring(0, 2) + "0000").getData(); + appUser.setProvince(region.getName()); + appUser.setProvinceCode(region.getCode()); } - - //查询当前注册的手机号是都和门店管理员手机号相同 - Shop shop = shopClient.getShopByPhone(registerAccount.getPhone()).getData(); - if(null != shop){ - //添加门店用户关系数据 - AppUserShop appUserShop = appUserShopService.getOne(new LambdaQueryWrapper<AppUserShop>().eq(AppUserShop::getAppUserId, appUser.getId()).eq(AppUserShop::getShopId, shop.getId())); - if(null == appUserShop){ - appUserShop = new AppUserShop(); - appUserShop.setShopId(shop.getId()); - appUserShop.setAppUserId(appUser.getId()); - appUserShopService.save(appUserShop); - //添加管理后台账号 - SysUser user = new SysUser(); - user.setDeptId(1L); - user.setUserName(appUser.getName()); - user.setNickName(appUser.getName()); - user.setPhonenumber(appUser.getPhone()); - user.setAvatar(appUser.getAvatar()); - user.setStatus("0"); - user.setDelFlag("0"); - user.setRoleType(2); - user.setObjectId(shop.getId()); - user.setAppUserId(appUser.getId()); - sysUserClient.saveShopUser(user); + this.save(appUser); + //添加定时任务队列 + VipSetting vipSetting = vipSettingClient.getVipSetting(1).getData(); + Integer vipCancelDay = vipSetting.getVipCancelDay(); + Integer vipChangeDay = vipSetting.getVipChangeDay(); + //解绑推广人 + redisTemplate.opsForZSet().add("unbind_promoter", appUser.getId().toString(), LocalDateTime.now().plusDays(vipCancelDay).toEpochSecond(ZoneOffset.UTC)); + //可更换推广人 + redisTemplate.opsForZSet().add("replaceable", appUser.getId().toString(), LocalDateTime.now().plusDays(vipChangeDay).toEpochSecond(ZoneOffset.UTC)); + + //增加积分变动记录 + if(0 == old && regisPoint > 0){ + //构建积分流水记录 + UserPoint userPoint = new UserPoint(); + userPoint.setType(7); + userPoint.setHistoricalPoint(0); + userPoint.setVariablePoint(regisPoint); + userPoint.setBalance(appUser.getLavePoint()); + userPoint.setCreateTime(LocalDateTime.now()); + userPoint.setAppUserId(appUser.getId()); + userPointService.save(userPoint); + } + //获取优惠券 + if(0 == old){ + List<CouponInfo> list = couponInfoClient.getCouponInfoByPersonType(4).getData(); + for (CouponInfo couponInfo : list) { + UserCoupon userCoupon = new UserCoupon(); + userCoupon.setDelFlag(0); + userCoupon.setCreateTime(LocalDateTime.now()); + userCoupon.setAppUserId(appUser.getId()); + userCoupon.setCouponId(couponInfo.getId()); + LocalDateTime start = couponInfo.getPeriodStartTime().atTime(0, 0, 0); + LocalDateTime end = couponInfo.getPeriodEndTime().atTime(23, 59, 59); + if(couponInfo.getPeriodType() == 2){ + start = LocalDateTime.now(); + end = start.plusDays(couponInfo.getPeriodDays()); + } + userCoupon.setStartTime(start); + userCoupon.setEndTime(end); + userCouponService.save(userCoupon); } } - } + //变更等级 + vipUpgrade(appUser.getId()); + + //拉新分佣 + if(0 == old && null != appUser2){ + pointSetting = pointSettingClient.getPointSetting(appUser2.getVipId()).getData(); + Integer newPoint = pointSetting.getNewPoint(); + Integer newPoint1 = 0; + if(1 == pointSetting.getGetNewPointOpen()){ + newPoint1 = new BigDecimal(newPoint).multiply(pointSetting.getGetNewPoint().divide(new BigDecimal(100))).intValue(); + } + appUser2.setLavePoint(appUser2.getLavePoint() + newPoint); + appUser2.setAvailablePoint(appUser2.getAvailablePoint() + newPoint1); + appUser2.setTotalAvailablePoint(appUser2.getTotalAvailablePoint() + newPoint1); + if(null != pointSetting && 1 == pointSetting.getGetNewPointGift()){ + appUser2.setTransferablePoint(appUser2.getTransferablePoint() + newPoint1); + } + appUser2.setTotalInvitePoint(appUser2.getTotalInvitePoint() + newPoint); + appUser2.setTotalPoint(appUser2.getTotalPoint() + newPoint); + this.updateById(appUser2); + if(newPoint > 0){ + UserPoint userPoint = new UserPoint(); + userPoint.setType(3); + userPoint.setHistoricalPoint(appUser2.getLavePoint() - newPoint); + userPoint.setVariablePoint(newPoint); + userPoint.setBalance(appUser2.getLavePoint()); + userPoint.setCreateTime(LocalDateTime.now()); + userPoint.setAppUserId(appUser2.getId()); + userPointService.save(userPoint); + } + //变更等级 + vipUpgrade(appUser2.getId()); + + if(null != appUser2.getInviteUserId()){ + AppUser appUser3 = this.getById(appUser2.getInviteUserId()); + appUser3.setLavePoint(appUser3.getLavePoint() + newPoint); + appUser3.setAvailablePoint(appUser3.getAvailablePoint() + newPoint1); + appUser3.setTotalAvailablePoint(appUser3.getTotalAvailablePoint() + newPoint1); + if(null != pointSetting && 1 == pointSetting.getGetRegisPointGift()){ + appUser3.setTransferablePoint(appUser3.getTransferablePoint() + newPoint1); + } + appUser3.setTotalInvitePoint(appUser3.getTotalInvitePoint() + newPoint); + appUser3.setTotalPoint(appUser3.getTotalPoint() + newPoint); + this.updateById(appUser3); + if(newPoint > 0){ + UserPoint userPoint = new UserPoint(); + userPoint.setType(3); + userPoint.setHistoricalPoint(appUser3.getLavePoint() - newPoint); + userPoint.setVariablePoint(newPoint); + userPoint.setBalance(appUser3.getLavePoint()); + userPoint.setCreateTime(LocalDateTime.now()); + userPoint.setAppUserId(appUser3.getId()); + userPointService.save(userPoint); + } + //变更等级 + vipUpgrade(appUser3.getId()); + } + } + + //获取微信推广二维码 + String fileName = UUID.randomUUID() + ".jpg"; + weChatUtil.getwxacodeunlimit("pages/login/login", "id=" + appUser.getId(), EnvVersion.TRIAL, filePath + fileName); + appUser.setQrCode(accessPath + fileName); + this.updateById(appUser); + + } LoginVo loginVo = new LoginVo(); loginVo.setSkipPage(1); loginVo.setFirstTime(null == appUser1); @@ -373,11 +487,43 @@ /** * 会员等级变化 */ + @Override public void vipUpgrade(Long id){ AppUser appUser = this.getById(id); Integer vipId = appUser.getVipId(); //钻石会员 VipSetting vipSetting3 = vipSettingClient.getVipSetting(3).getData(); + //消费积分满足升级 + if(1 == vipSetting3.getVipLevelUpShopRole() && appUser.getShopPoint() >= vipSetting3.getVipLevelUpShop() && appUser.getVipId() < 3){ + 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; + } + //返佣积分满足升级 + if(1 == vipSetting3.getVipLevelUpShareRole() && appUser.getSharePoint() >= vipSetting3.getVipLevelUpShare() && appUser.getVipId() < 3){ + 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; + } + //下级人数满足升级 Integer vipLevelUpNumRole = vipSetting3.getVipLevelUpNumRole(); Integer vipDirectNum = vipSetting3.getVipDirectNum(); Integer vipTeamNum = vipSetting3.getVipTeamNum(); @@ -402,8 +548,40 @@ return; } } + //黄金会员 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(1); + 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(1); + userChangeLogService.save(userChangeLog); + return; + } + //下级人数满足升级 vipLevelUpNumRole = vipSetting2.getVipLevelUpNumRole(); vipDirectNum = vipSetting2.getVipDirectNum(); vipTeamNum = vipSetting2.getVipTeamNum(); @@ -425,11 +603,90 @@ userChangeLog.setAfterVipId(appUser.getVipId()); userChangeLog.setChangeType(1); userChangeLogService.save(userChangeLog); + return; } } } - + /** + * 处理会员降级 + * @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); + } + } /** * 递归查询顶级推广人 @@ -442,8 +699,14 @@ } public AppUser getTopAppUser(List<AppUser> list, Long id){ - AppUser appUser = list.stream().filter(s -> s.getId().equals(id)).findFirst().get(); - if(null == appUser.getInviteUserId()){ + Optional<AppUser> first = list.stream().filter(s -> s.getId().equals(id)).findFirst(); + AppUser appUser = null; + if(first.isPresent()){ + appUser = first.get(); + }else{ + return this.getById(1); + } + if( null == appUser.getInviteUserId()){ return appUser; } return getTopAppUser(list, appUser.getInviteUserId()); @@ -465,12 +728,22 @@ 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()); + List<AppUser> collect = list.stream().filter(s -> null != s.getInviteUserId() && 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()); + List<Long> collect2 = result.stream().map(AppUser::getId).collect(Collectors.toList()); + List<AppUser> list1 = new ArrayList<>(); + for (AppUser appUser : collect) { + if(!collect2.contains(appUser.getId())){ + list1.add(appUser); + } + } + if(list1.size() == 0){ + return result; + } + result.addAll(list1); + List<Long> collect1 = list1.stream().map(AppUser::getId).collect(Collectors.toList()); idss.addAll(collect1); } } @@ -486,13 +759,55 @@ * @return */ @Override - public List<NearbyReferrerVo> getNearbyReferrer(NearbyReferrer nearbyReferrer) { + public PageInfo<NearbyReferrerVo> getNearbyReferrer(NearbyReferrer nearbyReferrer) { //使用地图获取省市区数据 - String longitude = nearbyReferrer.getLongitude(); - String latitude = nearbyReferrer.getLatitude(); - String cityCode = "510100"; // TODO 待完善 - List<NearbyReferrerVo> list = this.baseMapper.getNearbyReferrer(cityCode, nearbyReferrer); - return list; + String citycode = TencentMapUtil.inverseGeographicalAnalysis(nearbyReferrer.getLongitude(), nearbyReferrer.getLatitude(), false); + if(StringUtils.isEmpty(citycode)){ + citycode = "510100"; + } + if(null != citycode){ + String cityCode = citycode.substring(0, 4) + "00"; + PageInfo<NearbyReferrerVo> pageInfo = new PageInfo(nearbyReferrer.getPageCurr(), nearbyReferrer.getPageSize()); + List<NearbyReferrerVo> list = this.baseMapper.getNearbyReferrer(pageInfo, cityCode, nearbyReferrer); + for (NearbyReferrerVo nearbyReferrerVo : list) { + switch (nearbyReferrerVo.getVip()){ + case "1": + nearbyReferrerVo.setVip("普通会员"); + break; + case "2": + nearbyReferrerVo.setVip("黄金会员"); + break; + case "3": + nearbyReferrerVo.setVip("钻石会员"); + break; + case "4": + nearbyReferrerVo.setVip("准代理"); + break; + case "5": + nearbyReferrerVo.setVip("代理"); + break; + case "6": + nearbyReferrerVo.setVip("总代"); + break; + case "7": + nearbyReferrerVo.setVip("合伙人"); + break; + } + + String latitude = nearbyReferrerVo.getLatitude(); + String longitude = nearbyReferrerVo.getLongitude(); + Double wgs84 = GeodesyUtil.getDistance(longitude + "," + latitude, nearbyReferrer.getLongitude() + "," + nearbyReferrer.getLatitude()).get("WGS84"); + nearbyReferrerVo.setDistance(wgs84); + } + list.sort(new Comparator<NearbyReferrerVo>() { + @Override + public int compare(NearbyReferrerVo o1, NearbyReferrerVo o2) { + return o1.getDistance().compareTo(o2.getDistance()); + } + }); + return pageInfo.setRecords(list); + } + return null; } @Override @@ -539,9 +854,8 @@ if (inviteUser.getVipId() > 3) { return inviteUser; }else { - getSuperiorLeader(inviteUserId); + return getSuperiorLeader(inviteUserId); } - return null; } @@ -551,23 +865,27 @@ @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); + + //解绑推广人 + Set<Long> unbind_promoter = redisTemplate.opsForZSet().rangeByScore("unbind_promoter", 0, LocalDateTime.now().toEpochSecond(ZoneOffset.UTC)); + if(unbind_promoter.size() > 0){ + List<AppUser> list = this.list(new LambdaQueryWrapper<AppUser>().eq(AppUser::getVipId, 1).eq(AppUser::getDelFlag, 0).isNotNull(AppUser::getInviteUserId) + .eq(AppUser::getStatus, 1).in(AppUser::getId, unbind_promoter)); + for (AppUser appUser : list) { + UpdateWrapper<AppUser> updateWrapper = new UpdateWrapper<>(); + updateWrapper.set("invite_user_id", null).set("shop_id", null).eq("id", appUser.getId()); + this.update(updateWrapper); + } } - //可更换推广人 - 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); + Set<Long> replaceable = redisTemplate.opsForZSet().rangeByScore("replaceable", 0, LocalDateTime.now().toEpochSecond(ZoneOffset.UTC)); + if(replaceable.size() > 0){ + List<AppUser> list = this.list(new LambdaQueryWrapper<AppUser>().eq(AppUser::getDelFlag, 0).eq(AppUser::getChangePromoter, 0) + .eq(AppUser::getStatus, 1).in(AppUser::getId, unbind_promoter)); + for (AppUser appUser : list) { + appUser.setChangePromoter(1); + this.updateById(appUser); + } } } @@ -582,7 +900,7 @@ if(null == cacheObject){ redisService.setCacheObject("ONLINE_" + userid, 0, 15L, TimeUnit.MINUTES); }else{ - Long duration = (Long) cacheObject; + Integer duration = (Integer) cacheObject; duration += 10; //满足一个小时,开始发放积分,计时归0 if(60 >= duration){ @@ -591,23 +909,188 @@ PointSetting pointSetting = pointSettingClient.getPointSetting(appUser.getVipId()).getData(); if(null != pointSetting){ int hourPoint = pointSetting.getHourPoint().intValue(); + int hourPoint1 = 0; + if(1 == pointSetting.getWorkPointOpen()){ + hourPoint1 = new BigDecimal(hourPoint).multiply(pointSetting.getWorkPoint().divide(new BigDecimal(100))).intValue(); + } Integer lavePoint = appUser.getLavePoint(); appUser.setTotalPoint(appUser.getTotalPoint() + hourPoint); appUser.setLavePoint(appUser.getLavePoint() + hourPoint); + appUser.setAvailablePoint(appUser.getAvailablePoint() + hourPoint1); + appUser.setTotalAvailablePoint(appUser.getTotalAvailablePoint() + hourPoint1); + if(null != pointSetting && 1 == pointSetting.getWorkPointGift()){ + appUser.setTransferablePoint(appUser.getTransferablePoint() + hourPoint1); + } + appUser.setTotalHourPoint(appUser.getTotalHourPoint() + hourPoint); this.updateById(appUser); //添加积分变动记录 UserPoint userPoint = new UserPoint(); - userPoint.setType(9); + userPoint.setType(6); userPoint.setHistoricalPoint(lavePoint); userPoint.setVariablePoint(hourPoint); userPoint.setBalance(appUser.getLavePoint()); userPoint.setCreateTime(LocalDateTime.now()); userPoint.setAppUserId(appUser.getId()); userPointService.save(userPoint); + //变更等级 + vipUpgrade(appUser.getId()); } }else{ redisService.setCacheObject("ONLINE_" + userid, duration, 15L, TimeUnit.MINUTES); } } } + + @Override + public IPage<AppUser> getAppuserPage(Integer pageNum, Integer pageSize, AppUser appUser, Integer shopId, Set<Long> userId) { + 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, shopId, userId); + } + @Override + public IPage<AppUser> getAppuserPage1(Integer pageNum, Integer pageSize, AppUser appUser,Integer objectId,List<Long> userIds) { + return appUserMapper.getAppuserPage1(new Page<>(pageNum, pageSize), appUser,objectId,userIds); + } + + + /** + * 降级检测 + */ + @Override + public void demotionDetection() { + //代理 + List<AppUser> appUserList = new ArrayList<>(); + VipSetting vipSetting = vipSettingClient.getVipSetting(5).getData(); + List<AppUser> list = this.list(new LambdaQueryWrapper<AppUser>().eq(AppUser::getVipId, 5).eq(AppUser::getStatus, 1).eq(AppUser::getDelFlag, 0).eq(AppUser::getIsDanger, 0)); + for (AppUser appUser : list) { + //消费积分 + List<UserPoint> list1 = userPointService.list(new LambdaQueryWrapper<UserPoint>().eq(UserPoint::getAppUserId, appUser.getId()).eq(UserPoint::getType, 1).last(" and SUBDATE(now(), INTERVAL " + vipSetting.getKeepBuyDay() + " DAY) >= create_time")); + int sum = list1.stream().mapToInt(UserPoint::getVariablePoint).sum(); + if(sum < vipSetting.getKeepBuyPoint()){ + appUser.setIsDanger(1); + appUserList.add(appUser); + continue; + } + //返佣积分 + list1 = userPointService.list(new LambdaQueryWrapper<UserPoint>().eq(UserPoint::getAppUserId, appUser.getId()).eq(UserPoint::getType, 2).last(" and SUBDATE(now(), INTERVAL " + vipSetting.getKeepShareDay() + " DAY) >= create_time")); + sum = list1.stream().mapToInt(UserPoint::getVariablePoint).sum(); + if(sum < vipSetting.getKeepSharePoint()){ + appUser.setIsDanger(1); + appUserList.add(appUser); + continue; + } + //门店业绩 + list1 = userPointService.list(new LambdaQueryWrapper<UserPoint>().eq(UserPoint::getAppUserId, appUser.getId()).eq(UserPoint::getType, 8).last(" and SUBDATE(now(), INTERVAL " + vipSetting.getKeepShopDay() + " DAY) >= create_time")); + sum = list1.stream().mapToInt(UserPoint::getVariablePoint).sum(); + if(sum < vipSetting.getKeepShopPoint()){ + appUser.setIsDanger(1); + appUserList.add(appUser); + } + } + if(appUserList.size() > 0){ + this.updateBatchById(appUserList); + } + + //总代 + appUserList = new ArrayList<>(); + vipSetting = vipSettingClient.getVipSetting(6).getData(); + list = this.list(new LambdaQueryWrapper<AppUser>().eq(AppUser::getVipId, 6).eq(AppUser::getStatus, 1).eq(AppUser::getDelFlag, 0).eq(AppUser::getIsDanger, 0)); + for (AppUser appUser : list) { + //消费积分 + List<UserPoint> list1 = userPointService.list(new LambdaQueryWrapper<UserPoint>().eq(UserPoint::getAppUserId, appUser.getId()).eq(UserPoint::getType, 1).last(" and SUBDATE(now(), INTERVAL " + vipSetting.getKeepBuyDay() + " DAY) >= create_time")); + int sum = list1.stream().mapToInt(UserPoint::getVariablePoint).sum(); + if(sum < vipSetting.getKeepBuyPoint()){ + appUser.setIsDanger(1); + appUserList.add(appUser); + continue; + } + //返佣积分 + list1 = userPointService.list(new LambdaQueryWrapper<UserPoint>().eq(UserPoint::getAppUserId, appUser.getId()).eq(UserPoint::getType, 2).last(" and SUBDATE(now(), INTERVAL " + vipSetting.getKeepShareDay() + " DAY) >= create_time")); + sum = list1.stream().mapToInt(UserPoint::getVariablePoint).sum(); + if(sum < vipSetting.getKeepSharePoint()){ + appUser.setIsDanger(1); + appUserList.add(appUser); + continue; + } + //门店业绩 + list1 = userPointService.list(new LambdaQueryWrapper<UserPoint>().eq(UserPoint::getAppUserId, appUser.getId()).eq(UserPoint::getType, 8).last(" and SUBDATE(now(), INTERVAL " + vipSetting.getKeepShopDay() + " DAY) >= create_time")); + sum = list1.stream().mapToInt(UserPoint::getVariablePoint).sum(); + if(sum < vipSetting.getKeepShopPoint()){ + appUser.setIsDanger(1); + appUserList.add(appUser); + } + } + if(appUserList.size() > 0){ + this.updateBatchById(appUserList); + } + + //合伙人 + appUserList = new ArrayList<>(); + vipSetting = vipSettingClient.getVipSetting(7).getData(); + list = this.list(new LambdaQueryWrapper<AppUser>().eq(AppUser::getVipId, 7).eq(AppUser::getStatus, 1).eq(AppUser::getDelFlag, 0).eq(AppUser::getIsDanger, 0)); + for (AppUser appUser : list) { + //消费积分 + List<UserPoint> list1 = userPointService.list(new LambdaQueryWrapper<UserPoint>().eq(UserPoint::getAppUserId, appUser.getId()).eq(UserPoint::getType, 1).last(" and SUBDATE(now(), INTERVAL " + vipSetting.getKeepBuyDay() + " DAY) >= create_time")); + int sum = list1.stream().mapToInt(UserPoint::getVariablePoint).sum(); + if(sum < vipSetting.getKeepBuyPoint()){ + appUser.setIsDanger(1); + appUserList.add(appUser); + continue; + } + //返佣积分 + list1 = userPointService.list(new LambdaQueryWrapper<UserPoint>().eq(UserPoint::getAppUserId, appUser.getId()).eq(UserPoint::getType, 2).last(" and SUBDATE(now(), INTERVAL " + vipSetting.getKeepShareDay() + " DAY) >= create_time")); + sum = list1.stream().mapToInt(UserPoint::getVariablePoint).sum(); + if(sum < vipSetting.getKeepSharePoint()){ + appUser.setIsDanger(1); + appUserList.add(appUser); + continue; + } + //门店业绩 + list1 = userPointService.list(new LambdaQueryWrapper<UserPoint>().eq(UserPoint::getAppUserId, appUser.getId()).eq(UserPoint::getType, 8).last(" and SUBDATE(now(), INTERVAL " + vipSetting.getKeepShopDay() + " DAY) >= create_time")); + sum = list1.stream().mapToInt(UserPoint::getVariablePoint).sum(); + if(sum < vipSetting.getKeepShopPoint()){ + appUser.setIsDanger(1); + appUserList.add(appUser); + } + } + if(appUserList.size() > 0){ + this.updateBatchById(appUserList); + } + } + + + + /** + * 定时任务关闭订单 + */ + @Override + public void closeOrder() { + //订单支付数据 + long second = LocalDateTime.now().toEpochSecond(ZoneOffset.UTC); + Set<String> orderPayment = redisTemplate.opsForZSet().rangeByScore("BalanceRecharge", 0, second); + if(orderPayment.size() > 0){ + List<BalancePayment> list = balancePaymentService.list(new LambdaQueryWrapper<BalancePayment>().in(BalancePayment::getId, orderPayment)); + for (BalancePayment order : list) { + if(null == order || order.getStatus() != 1){ + redisTemplate.opsForZSet().remove("BalanceRecharge", order.getId()); + continue; + } + //开始执行关闭订单操作 + CloseOrderResult closeOrderResult = PaymentUtil.closeOrder(order.getId().toString()); + if((null == closeOrderResult || !closeOrderResult.getRa_Status().equals("100")) && + Arrays.asList("0", "4", "101", "10080000", "10080002", "10083004", "10083005").contains(closeOrderResult.getRb_Code())){ + redisTemplate.opsForZSet().add("BalanceRecharge", order.getId(), 0); + log.error("关闭订单失败:{}---->{}", order.getId(), com.alibaba.fastjson2.JSON.toJSONString(closeOrderResult)); + } + redisTemplate.opsForZSet().remove("BalanceRecharge", order.getId()); + } + } + } } -- Gitblit v1.7.1