From 68a3672999b666ca83dedf190849ac3c610b01e3 Mon Sep 17 00:00:00 2001 From: KKSU <15274802129@163.com> Date: Fri, 23 Feb 2024 11:41:04 +0800 Subject: [PATCH] 抽奖 --- src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java | 1050 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 1,039 insertions(+), 11 deletions(-) diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java index 7659087..517e151 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java @@ -1,18 +1,27 @@ package cc.mrbird.febs.mall.service.impl; import cc.mrbird.febs.common.enumerates.*; +import cc.mrbird.febs.common.utils.AppContants; import cc.mrbird.febs.common.utils.MallUtils; +import cc.mrbird.febs.mall.dto.ScoreSettingDto; +import cc.mrbird.febs.mall.dto.TeamPerkDto; import cc.mrbird.febs.mall.entity.*; import cc.mrbird.febs.mall.mapper.*; import cc.mrbird.febs.mall.service.*; import cc.mrbird.febs.mall.vo.AdminMallMoneyFlowVo; import cc.mrbird.febs.mall.vo.AdminTeamEqualsPerkVo; +import cc.mrbird.febs.rabbit.producter.AgentProducer; import cc.mrbird.febs.system.mapper.UserMapper; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUnit; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.math.MathUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONUtil; import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -39,6 +48,7 @@ private final DataDictionaryCustomMapper dataDictionaryCustomMapper; private final MallMemberMapper memberMapper; + private final MallAchieveRecordMapper mallAchieveRecordMapper; private final MallOrderInfoMapper mallOrderInfoMapper; private final IApiMallMemberWalletService iApiMallMemberWalletService; @@ -47,6 +57,18 @@ private final SqlSessionTemplate sqlSessionTemplate; private final IApiMallMemberWalletService memberWalletService; private final MallMoneyFlowMapper mallMoneyFlowMapper; + private final MallMqRecordMapper mallMqRecordMapper; + private final MallGoodsMapper mallGoodsMapper; + + private final ICommonService commonService; + + private final MallProductBuyRecordMapper mallProductBuyRecordMapper; + private final MallProductBuyMapper mallProductBuyMapper; + private final MallProductSellMapper mallProductSellMapper; + private final MallProductSellRecordMapper mallProductSellRecordMapper; + private final MallProductNftMapper mallProductNftMapper; + private final AgentProducer agentProducer; + private final MallMemberAmountMapper mallMemberAmountMapper; @Override @Transactional(rollbackFor = Exception.class) @@ -183,14 +205,31 @@ if(ObjectUtil.isEmpty(mallOrderInfo)){ return; } - if(2 != mallOrderInfo.getStatus()){ +// if(2 != mallOrderInfo.getStatus()){ +// return; +// } + + BigDecimal amount = BigDecimal.ZERO; + List<MallOrderItem> orderItems = this.mallOrderInfoMapper.getMallOrderItemByOrderId(orderId); + if (CollUtil.isNotEmpty(orderItems)) { + for (MallOrderItem orderItem : orderItems) { + MallGoods mallGoods = mallGoodsMapper.selectById(orderItem.getGoodsId()); + if (mallGoods.getIsNormal() == 2) { + amount = amount.add( + new BigDecimal(mallGoods.getPresentPrice()) + .multiply(new BigDecimal(orderItem.getCnt())) + .abs() + .setScale(2,BigDecimal.ROUND_DOWN)); + } + } + } + amount = amount.subtract(mallOrderInfo.getScoreAmount()); + if(BigDecimal.ZERO.compareTo(amount) >= 0){ return; } /** * 分享补贴 直推消费额10% */ - BigDecimal amount = mallOrderInfo.getAmount().subtract(mallOrderInfo.getScoreAmount()); - Long memberId = mallOrderInfo.getMemberId(); MallMember mallMember = memberMapper.selectById(memberId); //补贴对象 直属上级 @@ -215,6 +254,8 @@ //减少补贴额度 mallMemberWalletMapper.reduceTotalScoreById(sharePerkAmount, mallMemberWallet.getId()); + reduceStar(mallMemberUp.getId(),sharePerkAmount); + mallMemberWalletMapper.addBalanceById(sharePerkAmount, mallMemberWallet.getId()); mallMoneyFlowService.addMoneyFlow( @@ -235,12 +276,41 @@ * 从最顶级级别的合伙人开始补贴 * 补贴完,把已经补贴的合伙人加入下一个级别 */ - List<MallMember> sevenLevelRecord = getStarRecord(null, MemberLevelEnum.SEVEN_LEVEL.name(), amount, mallOrderInfo.getOrderNo(), memberId,MoneyFlowTypeEnum.STAR_PERK_SEVEN.getValue()); - List<MallMember> sixLevelRecord = getStarRecord(sevenLevelRecord, MemberLevelEnum.SIX_LEVEL.name(), amount, mallOrderInfo.getOrderNo(), memberId,MoneyFlowTypeEnum.STAR_PERK_SIX.getValue()); - List<MallMember> fifthLevelRecord = getStarRecord(sixLevelRecord, MemberLevelEnum.FIFTH_LEVEL.name(), amount, mallOrderInfo.getOrderNo(), memberId,MoneyFlowTypeEnum.STAR_PERK_FIVE.getValue()); - List<MallMember> fourLevelRecord = getStarRecord(fifthLevelRecord, MemberLevelEnum.FOUR_LEVEL.name(), amount, mallOrderInfo.getOrderNo(), memberId,MoneyFlowTypeEnum.STAR_PERK_FOUR.getValue()); - List<MallMember> thirdLevelRecord = getStarRecord(fourLevelRecord, MemberLevelEnum.THIRD_LEVEL.name(), amount, mallOrderInfo.getOrderNo(), memberId,MoneyFlowTypeEnum.STAR_PERK_THREE.getValue()); - List<MallMember> secondLevelRecord = getStarRecord(thirdLevelRecord, MemberLevelEnum.SECOND_LEVEL.name(), amount, mallOrderInfo.getOrderNo(), memberId,MoneyFlowTypeEnum.STAR_PERK_TWO.getValue()); + + DataDictionaryCustom perkAgentAchieveTotalDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( + DataDictionaryEnum.PERK_AGENT_ACHIEVE_TOTAL.getType(), + DataDictionaryEnum.PERK_AGENT_ACHIEVE_TOTAL.getCode()); + BigDecimal perkAgentAchieveTotal = new BigDecimal(perkAgentAchieveTotalDic.getValue()); + //星级奖励百分比等于每个级别的累计之和 + List<DataDictionaryCustom> starPerkDics = dataDictionaryCustomMapper.selectDicByType( + "AGENT_LEVEL_REQUIRE"); + BigDecimal totalProfitProp = BigDecimal.ZERO; + if(CollUtil.isNotEmpty(starPerkDics)){ + for(DataDictionaryCustom starPerkDic : starPerkDics){ + String starPerkStr = starPerkDic.getValue(); + AgentInfo agentInfo = JSONObject.parseObject(starPerkStr, AgentInfo.class); + BigDecimal profitProp = agentInfo.getProfitProp().abs().divide(new BigDecimal(100)); + String code = starPerkDic.getCode(); + //存在当前级别的会员,则加上这个比例的补贴 + List<MallMember> mallMembers = memberMapper.selectByLevel(code); + if(CollUtil.isNotEmpty(mallMembers)){ + totalProfitProp = totalProfitProp.add(profitProp); + } + } + } + + if(totalProfitProp.compareTo(BigDecimal.ZERO) > 0){ + BigDecimal perkTotal = amount.multiply(totalProfitProp).setScale(2,BigDecimal.ROUND_DOWN); + perkAgentAchieveTotal = perkAgentAchieveTotal.add(perkTotal); + perkAgentAchieveTotalDic.setValue(perkAgentAchieveTotal.toString()); + dataDictionaryCustomMapper.updateById(perkAgentAchieveTotalDic); + } +// List<MallMember> sevenLevelRecord = getStarRecord(null, MemberLevelEnum.SEVEN_LEVEL.name(), amount, mallOrderInfo.getOrderNo(), memberId,MoneyFlowTypeEnum.STAR_PERK_SEVEN.getValue()); +// List<MallMember> sixLevelRecord = getStarRecord(sevenLevelRecord, MemberLevelEnum.SIX_LEVEL.name(), amount, mallOrderInfo.getOrderNo(), memberId,MoneyFlowTypeEnum.STAR_PERK_SIX.getValue()); +// List<MallMember> fifthLevelRecord = getStarRecord(sixLevelRecord, MemberLevelEnum.FIFTH_LEVEL.name(), amount, mallOrderInfo.getOrderNo(), memberId,MoneyFlowTypeEnum.STAR_PERK_FIVE.getValue()); +// List<MallMember> fourLevelRecord = getStarRecord(fifthLevelRecord, MemberLevelEnum.FOUR_LEVEL.name(), amount, mallOrderInfo.getOrderNo(), memberId,MoneyFlowTypeEnum.STAR_PERK_FOUR.getValue()); +// List<MallMember> thirdLevelRecord = getStarRecord(fourLevelRecord, MemberLevelEnum.THIRD_LEVEL.name(), amount, mallOrderInfo.getOrderNo(), memberId,MoneyFlowTypeEnum.STAR_PERK_THREE.getValue()); +// List<MallMember> secondLevelRecord = getStarRecord(thirdLevelRecord, MemberLevelEnum.SECOND_LEVEL.name(), amount, mallOrderInfo.getOrderNo(), memberId,MoneyFlowTypeEnum.STAR_PERK_TWO.getValue()); /** * 团队补贴 @@ -269,6 +339,11 @@ long end = System.currentTimeMillis(); log.info("============订单:{},时间:{}===========",mallOrderInfo.getOrderNo(),(end - start)/1000); + MallMqRecord mallMqRecord = mallMqRecordMapper.selectByOrderId(orderId); + if(ObjectUtil.isNotEmpty(mallMqRecord)){ + mallMqRecord.setState(1); + mallMqRecordMapper.updateById(mallMqRecord); + } } /** @@ -334,7 +409,8 @@ * @return */ public List<MallMember> getStarRecord(List<MallMember> mallMembersOlds,String LevelParam,BigDecimal amount,String orderNo,Long memberId,int starPerkType){ - + //实际补贴总金额 + BigDecimal totalPerkAgentAmount = BigDecimal.ZERO; //根据用户的level获取用户 List<MallMember> mallMemberStars = memberMapper.selectMemberWithLevel(LevelParam); if(CollUtil.isNotEmpty(mallMembersOlds)){ @@ -345,16 +421,43 @@ if(CollUtil.isNotEmpty(mallMemberStars)){ List<Long> mallMemberStarIds = mallMemberStars.stream().map(MallMember::getId).collect(Collectors.toList()); + //排除掉本身 + mallMemberStarIds.remove(memberId); + if(CollUtil.isEmpty(mallMemberStarIds)){ + return mallMemberStars; + } //当前等级的总贡献点 List<MallMemberWallet> mallMemberWallets = mallMemberWalletMapper.selectMemberWalletsByIds(mallMemberStarIds); Integer starSum = mallMemberWallets.stream().mapToInt(MallMemberWallet::getStar).sum(); + if(starSum <= 0){ + return mallMemberStars; + } + + BigDecimal totalProfitProp = BigDecimal.ZERO; + List<DataDictionaryCustom> agentLevelRequireDics = dataDictionaryCustomMapper.selectDicByType("AGENT_LEVEL_REQUIRE"); + if(CollUtil.isNotEmpty(agentLevelRequireDics)){ + for(DataDictionaryCustom dic : agentLevelRequireDics){ + String starPerkStr = dic.getValue(); + AgentInfo agentInfo = JSONObject.parseObject(starPerkStr, AgentInfo.class); + //当前星级所占份数 + BigDecimal profitProp = agentInfo.getProfitProp().abs(); + List<MallMember> mallMembers = memberMapper.selectByLevel(dic.getCode()); + if(CollUtil.isNotEmpty(mallMembers)){ + totalProfitProp = profitProp.add(totalProfitProp); + } + } + } //星级补贴比例 DataDictionaryCustom starPerkDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( "AGENT_LEVEL_REQUIRE", LevelParam); String starPerkStr = starPerkDic.getValue(); AgentInfo agentInfo = JSONObject.parseObject(starPerkStr, AgentInfo.class); - BigDecimal profitProp = agentInfo.getProfitProp().abs().divide(new BigDecimal(100)); +// BigDecimal profitProp = agentInfo.getProfitProp().abs().divide(new BigDecimal(100)); + //当前星级所占份数 + BigDecimal profitProp = agentInfo.getProfitProp().abs(); + //每一份多少钱 + amount = amount.divide(totalProfitProp,4,BigDecimal.ROUND_DOWN); //当前等级的星级补贴 BigDecimal starPerkAmountSum = amount.multiply(profitProp); //当前等级的每一个贡献点的补贴金额 @@ -395,6 +498,9 @@ mallMoneyFlow.setRemark("补贴额度:"+mallMemberWallet.getTotalScore()); mallMoneyFlow.setFlowType(FlowTypeEnum.BALANCE.getValue()); mallMoneyFlows.add(mallMoneyFlow); + + reduceStar(mallMemberWallet.getMemberId(),starPerkAmount); + totalPerkAgentAmount = totalPerkAgentAmount.add(starPerkAmount); } count = count + 1; if (count % 1000 == 0 || count == mallMemberWallets.size()) { @@ -431,6 +537,16 @@ } } } + + log.info("============实际补贴金额:{}",totalPerkAgentAmount.setScale(2,BigDecimal.ROUND_DOWN)); + DataDictionaryCustom totalPerkAgentAmountDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( + DataDictionaryEnum.PERK_AGENT_ACHIEVE_TOTAL.getType(), + DataDictionaryEnum.PERK_AGENT_ACHIEVE_TOTAL.getCode() + ); + totalPerkAgentAmountDic.setValue( + new BigDecimal(totalPerkAgentAmountDic.getValue()).subtract(totalPerkAgentAmount).setScale(2,BigDecimal.ROUND_DOWN).toString() + ); + dataDictionaryCustomMapper.updateById(totalPerkAgentAmountDic); return mallMemberStars; } @@ -472,6 +588,9 @@ mallMoneyFlow.setRemark("补贴额度:"+mallMemberWallet.getTotalScore()); mallMoneyFlow.setFlowType(FlowTypeEnum.BALANCE.getValue()); mallMoneyFlows.add(mallMoneyFlow); + + reduceStar(mallMemberWallet.getMemberId(),amount); + } count = count + 1; if (count % 1000 == 0 || count == mallMemberWallets.size()) { @@ -508,5 +627,914 @@ } } + @Override + public void reduceStar(Long memberId,BigDecimal totalScore) { + /** + *获取用户的全部未用完的补贴额度流水 + */ + MallMemberWallet mallMemberWallet = mallMemberWalletMapper.selectWalletByMemberId(memberId); + List<MallMoneyFlow> mallMoneyFlows = mallMoneyFlowMapper.selectMoneyFlowByMemberIdAndIsRetrun(memberId,2); + //如果补贴额度全部用完则更新用户的贡献点为零 + if(CollUtil.isEmpty(mallMoneyFlows)){ + mallMemberWalletMapper.reduceStarByMemberId(mallMemberWallet.getStar(), memberId); + return; + } + for(MallMoneyFlow mallMoneyFlow : mallMoneyFlows){ + String remark = mallMoneyFlow.getRemark(); + BigDecimal remarkNum = new BigDecimal(remark); + //如果补贴额度小于记录的剩余补贴额度 + if(totalScore.compareTo(remarkNum) < 0){ + remarkNum = remarkNum.subtract(totalScore).setScale(2,BigDecimal.ROUND_DOWN); + mallMoneyFlowMapper.updateRemarkById(remarkNum.toString(),mallMoneyFlow.getId()); + break; + } + //如果补贴额度等于等于记录的剩余补贴额度 + if(totalScore.compareTo(remarkNum) == 0){ + remarkNum = remarkNum.subtract(totalScore).setScale(2,BigDecimal.ROUND_DOWN); + mallMoneyFlowMapper.updateRemarkAndIsReturnById(remarkNum.toString(),mallMoneyFlow.getId()); + + //减少用户的贡献点 + String orderNo = mallMoneyFlow.getOrderNo(); + MallMoneyFlow mallMoneyFlowStar = mallMoneyFlowMapper.selectByOrderNoAndMemberId(orderNo,memberId,2); + BigDecimal amount = mallMoneyFlowStar.getAmount(); + mallMemberWalletMapper.reduceStarByMemberId(amount.intValue(), memberId); + //更新记录的返利状态为已返利 + mallMoneyFlowMapper.updateRemarkAndIsReturnById("0",mallMoneyFlowStar.getId()); + break; + } + //如果补贴额度大于记录的剩余补贴额度 + if(totalScore.compareTo(remarkNum) > 0){ + mallMoneyFlowMapper.updateRemarkAndIsReturnById("0",mallMoneyFlow.getId()); + + //减少用户的贡献点 + String orderNo = mallMoneyFlow.getOrderNo(); + MallMoneyFlow mallMoneyFlowStar = mallMoneyFlowMapper.selectByOrderNoAndMemberId(orderNo,memberId,2); + BigDecimal amount = mallMoneyFlowStar.getAmount(); + mallMemberWalletMapper.reduceStarByMemberId(amount.intValue(), memberId); + //更新记录的返利状态为已返利 + mallMoneyFlowMapper.updateRemarkAndIsReturnById("0",mallMoneyFlowStar.getId()); + totalScore = totalScore.subtract(remarkNum); + } + } + } + + @Override + public void achieveReleasePercent() { + DataDictionaryCustom jobAchieveReleasePercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( + GreenScoreEnum.JOB_ACHIEVE_RELEASE_PERCENT.getType(), + GreenScoreEnum.JOB_ACHIEVE_RELEASE_PERCENT.getCode() + ); + + List<MallMember> mallMembers = memberMapper.selectByLevel(MemberLevelEnum.SECOND_LEVEL.getType()); + BigDecimal jobAchieveReleasePercent = new BigDecimal(jobAchieveReleasePercentDic.getValue()) + .multiply(new BigDecimal(0.001)); + BigDecimal totalAchieve = BigDecimal.ZERO; + Integer totalStar = 0; + if(CollUtil.isNotEmpty(mallMembers)){ + for(MallMember mallMember : mallMembers){ + //总业绩 + BigDecimal achieve = mallAchieveRecordMapper.selectSumAchieveByMemberId(mallMember.getId()); + totalAchieve = totalAchieve.add(achieve); + + MallMemberWallet mallMemberWallet = mallMemberWalletMapper.selectWalletByMemberId(mallMember.getId()); + Integer star = mallMemberWallet.getStar(); + totalStar = totalStar + star; + } + } + if(BigDecimal.ZERO.compareTo(totalAchieve) >= 0){ + return; + } + //总释放=总业绩*一星每日业绩每日释放业绩到余额的千分比 + totalAchieve = totalAchieve.multiply(jobAchieveReleasePercent); + + if(totalStar <= 0){ + return; + } + //一个贡献点的价值 + BigDecimal divide = totalAchieve.divide(new BigDecimal(totalStar), 2, BigDecimal.ROUND_DOWN); + + if(CollUtil.isNotEmpty(mallMembers)){ + for(MallMember mallMember : mallMembers){ + + MallMemberWallet mallMemberWallet = mallMemberWalletMapper.selectWalletByMemberId(mallMember.getId()); + Integer star = mallMemberWallet.getStar(); + //每个人贡献值数量*一个贡献点的价值=获取的收益 + BigDecimal multiply = divide.multiply(new BigDecimal(star)).setScale(2,BigDecimal.ROUND_DOWN); + + BigDecimal totalScore = mallMemberWallet.getTotalScore(); + if(BigDecimal.ZERO.compareTo(multiply) < 0){ + if(BigDecimal.ZERO.compareTo(totalScore) < 0){ + if(totalScore.compareTo(multiply) < 0){ + multiply = totalScore; + } + //减少补贴额度 + mallMemberWalletMapper.reduceTotalScoreById(multiply, mallMemberWallet.getId()); + + reduceStar(mallMember.getId(),multiply); + + mallMemberWalletMapper.addBalanceById(multiply, mallMemberWallet.getId()); + + mallMoneyFlowService.addMoneyFlow( + mallMember.getId(), + multiply, + MoneyFlowTypeEnum.STATIC_BONUS.getValue(), + MallUtils.getOrderNum(), + FlowTypeEnum.BALANCE.getValue()); + } + } + } + } + + + +// if(CollUtil.isNotEmpty(mallMembers)){ +// for(MallMember mallMember : mallMembers){ +// //总业绩 +// BigDecimal sumAchieve = mallAchieveRecordMapper.selectSumAchieveByMemberId(mallMember.getId()); +// //每个人的补贴额度 +// BigDecimal multiply = sumAchieve.multiply(jobAchieveReleasePercent); +// MallMemberWallet mallMemberWallet = mallMemberWalletMapper.selectWalletByMemberId(mallMember.getId()); +// BigDecimal totalScore = mallMemberWallet.getTotalScore(); +// if(BigDecimal.ZERO.compareTo(multiply) < 0){ +// if(BigDecimal.ZERO.compareTo(totalScore) < 0){ +// if(totalScore.compareTo(multiply) < 0){ +// multiply = totalScore; +// } +// //减少补贴额度 +// mallMemberWalletMapper.reduceTotalScoreById(multiply, mallMemberWallet.getId()); +// +// reduceStar(mallMember.getId(),multiply); +// +// mallMemberWalletMapper.addBalanceById(multiply, mallMemberWallet.getId()); +// +// mallMoneyFlowService.addMoneyFlow( +// mallMember.getId(), +// multiply, +// MoneyFlowTypeEnum.STATIC_BONUS.getValue(), +// MallUtils.getOrderNum(), +// FlowTypeEnum.BALANCE.getValue()); +// } +// } +// } +// } + } + + @Override + public void perkAgent() { + DataDictionaryCustom totalAmountDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( + DataDictionaryEnum.PERK_AGENT_ACHIEVE_TOTAL.getType(), + DataDictionaryEnum.PERK_AGENT_ACHIEVE_TOTAL.getCode() + ); + if(ObjectUtil.isEmpty(totalAmountDic)){ + return; + } + //星级补贴总数 + BigDecimal totalAmount = new BigDecimal(totalAmountDic.getValue()).setScale(2, BigDecimal.ROUND_DOWN); + if(BigDecimal.ZERO.compareTo(totalAmount) >= 0){ + return; + } + + DataDictionaryCustom perkAgentPercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( + DataDictionaryEnum.PERK_AGENT_ACHIEVE_PERCENT.getType(), + DataDictionaryEnum.PERK_AGENT_ACHIEVE_PERCENT.getCode() + ); + if(ObjectUtil.isEmpty(perkAgentPercentDic)){ + return; + } + //星级补贴百分比 + BigDecimal perkAgentPercent = new BigDecimal(perkAgentPercentDic.getValue()).abs().divide(new BigDecimal(100)); + BigDecimal amount = totalAmount.multiply(perkAgentPercent); + if(BigDecimal.ZERO.compareTo(amount) >= 0){ + return; + } +// //星级补贴总数 +// totalAmountDic.setValue(totalAmount.subtract(amount).setScale(2,BigDecimal.ROUND_DOWN).toString()); +// dataDictionaryCustomMapper.updateById(totalAmountDic); + + String orderNo = MallUtils.getOrderNum("SPA"); + /** + * 星级奖励 + * 从最顶级级别的合伙人开始补贴 + * 补贴完,把已经补贴的合伙人加入下一个级别 + */ + List<MallMember> sevenLevelRecord = getStarRecord(null, MemberLevelEnum.SEVEN_LEVEL.name(), amount, orderNo, 0L,MoneyFlowTypeEnum.STAR_PERK_SEVEN.getValue()); + List<MallMember> sixLevelRecord = getStarRecord(sevenLevelRecord, MemberLevelEnum.SIX_LEVEL.name(), amount, orderNo, 0L,MoneyFlowTypeEnum.STAR_PERK_SIX.getValue()); + List<MallMember> fifthLevelRecord = getStarRecord(sixLevelRecord, MemberLevelEnum.FIFTH_LEVEL.name(), amount, orderNo, 0L,MoneyFlowTypeEnum.STAR_PERK_FIVE.getValue()); + List<MallMember> fourLevelRecord = getStarRecord(fifthLevelRecord, MemberLevelEnum.FOUR_LEVEL.name(), amount, orderNo, 0L,MoneyFlowTypeEnum.STAR_PERK_FOUR.getValue()); + List<MallMember> thirdLevelRecord = getStarRecord(fourLevelRecord, MemberLevelEnum.THIRD_LEVEL.name(), amount, orderNo, 0L,MoneyFlowTypeEnum.STAR_PERK_THREE.getValue()); + List<MallMember> secondLevelRecord = getStarRecord(thirdLevelRecord, MemberLevelEnum.SECOND_LEVEL.name(), amount, orderNo, 0L,MoneyFlowTypeEnum.STAR_PERK_TWO.getValue()); + } + public static void main(String[] args) { +// Long number = 0L; // 这里可以替换成你需要检查的数字 +// if (number % 3 == 0) { +// System.out.println(number + " 可以被3整除"); +// } else { +// System.out.println(number + " 不能被3整除"); +// } +// +// DateTime nowTimeFormat = DateUtil.parseTime(DateUtil.formatTime(DateUtil.date())); +// System.out.println(nowTimeFormat); + BigDecimal bigDecimal = new BigDecimal("1"); + BigDecimal cycle = new BigDecimal("2"); + BigDecimal remainder = bigDecimal.divide(new BigDecimal(String.valueOf(cycle)),0,BigDecimal.ROUND_DOWN);//取余 + System.out.println(remainder); + BigDecimal remainderDirect = bigDecimal.divide(new BigDecimal(String.valueOf(cycle)),0,BigDecimal.ROUND_DOWN);//取余 + if(remainderDirect.compareTo(BigDecimal.ONE) == 0){ + System.out.println(remainderDirect); + } + } + @Override + public void BuyToSell() { + /** + * nft产品周期到期的已完成买单变成卖单 + * 计算收益,本金 + */ + List<MallProductNft> mallProductNfts = mallProductNftMapper.selectList(null); + if(CollUtil.isEmpty(mallProductNfts)){ + return; + } + DateTime now = DateUtil.date(); + for(MallProductNft mallProductNft : mallProductNfts){ + Long nftId = mallProductNft.getId(); + List<MallProductBuy> mallProductBuys = mallProductBuyMapper.selectListByStateAndProductNFTId( + ProductEnum.PRODUCT_BUY_SUCCESS.getValue(), + nftId, + ProductEnum.PRODUCT_BUY_MATE_STATE_FAIL.getValue()); + if(CollUtil.isEmpty(mallProductBuys)){ + continue; + } + //周期 + int cycle = mallProductNft.getCycle(); + //收益率 + BigDecimal profitPercent = mallProductNft.getProfit(); + for(MallProductBuy mallProductBuy : mallProductBuys){ + + + + Date payTime = mallProductBuy.getPayTime(); + + +// //偏移时间-- +// DateTime dateTime = DateUtil.offsetDay(payTime, cycle); +// int compare = DateUtil.compare(now, dateTime); +// if(compare >= 0){ +// mallProductBuy.setMateState(ProductEnum.PRODUCT_BUY_MATE_STATE_SUCCESS.getValue()); +// mallProductBuyMapper.updateById(mallProductBuy); + //偏移时间 + String s = String.valueOf(DateUtil.between(payTime, DateUtil.date(), DateUnit.DAY));//相差日期天数 + BigDecimal bigDecimal = new BigDecimal(s).setScale(0, BigDecimal.ROUND_DOWN);//只取整数位 + if(bigDecimal.compareTo(BigDecimal.ZERO) <= 0){ + continue; + } + BigDecimal remainder = bigDecimal.remainder(new BigDecimal(String.valueOf(cycle)));//取余 + if (remainder.compareTo(BigDecimal.ZERO) == 0) { + /** + * 用户的账户增加对应的收益 + */ + + BigDecimal totalPerk = mallProductBuy.getTotalPerk(); + if(BigDecimal.ZERO.compareTo(totalPerk) >= 0){ + mallProductBuy.setTotalPerk(BigDecimal.ZERO); + mallProductBuyMapper.updateById(mallProductBuy); + continue; + } + BigDecimal nftTotal = mallProductBuy.getNftTotal(); + BigDecimal profit = nftTotal.multiply(profitPercent.multiply(new BigDecimal(0.01))); + + if(totalPerk.compareTo(profit) <= 0){ + profit = totalPerk; + mallProductBuy.setTotalPerk(BigDecimal.ZERO); + mallProductBuyMapper.updateById(mallProductBuy); + }else{ + mallProductBuy.setTotalPerk(totalPerk.subtract(profit).setScale(2,BigDecimal.ROUND_DOWN)); + mallProductBuyMapper.updateById(mallProductBuy); + } +// insertSell(mallProductBuy.getMemberId(),profit,profit,BigDecimal.ZERO,BigDecimal.ZERO); + String orderNoSY = MallUtils.getOrderNum("SYNFT"); + mallMoneyFlowService.addMoneyFlow( + mallProductBuy.getMemberId(), + profit, + MoneyFlowTypeNewEnum.PERK_CYCLE.getValue(), + orderNoSY, + null, + FlowTypeNewEnum.NFT.getValue(), + MoneyFlowTypeNewEnum.PERK_CYCLE.getDescrition(), + AppContants.MEMBER_FLOW_DONE); + + MallMemberAmount mallMemberAmountMine = mallMemberAmountMapper.selectByMemberId(mallProductBuy.getMemberId()); + mallMemberAmountMine.setTrendsNft(mallMemberAmountMine.getTrendsNft().add(profit)); + mallMemberAmountMapper.updateTrendsNftById(mallMemberAmountMine); + + + BigDecimal remainderDirect = bigDecimal.divide(new BigDecimal(String.valueOf(cycle)),0,BigDecimal.ROUND_DOWN);//取余 + if(remainderDirect.compareTo(BigDecimal.ONE) == 0){ + /** + * 更新用户上级收益,冻结7天,7天时间到期自动释放到动态钱包 + */ + Long memberId = mallProductBuy.getMemberId(); + MallMember mallMember = memberMapper.selectById(memberId); + if(ObjectUtil.isNotEmpty(mallMember)){ + //直推 + String referrerId = mallMember.getReferrerId(); + MallMember directMember = memberMapper.selectInfoByInviteId(referrerId); + if(ObjectUtil.isNotEmpty(directMember)){ + BigDecimal basicPerkDirectPercent = new BigDecimal(dataDictionaryCustomMapper.selectDicDataByTypeAndCode( + DataDictionaryEnum.BASIC_PERK_DIRECT.getType(), + DataDictionaryEnum.BASIC_PERK_DIRECT.getCode() + ).getValue()).multiply(new BigDecimal("0.01")); +// BigDecimal basicPerkDirect = profit.multiply(basicPerkDirectPercent).setScale(2, BigDecimal.ROUND_DOWN); + BigDecimal basicPerkDirect = nftTotal.multiply(basicPerkDirectPercent).setScale(2, BigDecimal.ROUND_DOWN); + /** + * 先插入流水记录,然后定时器每小时,循环一次找寻对应的数据执行 + */ + String orderNo = MallUtils.getOrderNum("DNFT"); + mallMoneyFlowService.addMoneyFlow( + directMember.getId(), + basicPerkDirect, + MoneyFlowTypeNewEnum.BASIC_PERK_DIRECT.getValue(), + orderNo, + null, + FlowTypeNewEnum.NFT.getValue(), + MoneyFlowTypeNewEnum.BASIC_PERK_DIRECT.getDescrition(), + AppContants.MEMBER_FLOW_ING); + + MallMemberAmount mallMemberAmountDirect = mallMemberAmountMapper.selectByMemberId(directMember.getId()); + mallMemberAmountDirect.setFrozenNft(mallMemberAmountDirect.getFrozenNft().add(basicPerkDirect)); + mallMemberAmountMapper.updateFrozenNftById(mallMemberAmountDirect); + } + + /** + * 团队奖励 + * + */ + String level = MemberLevelNewEnum.ZERO_LEVEL.getType(); + BigDecimal equalsPerkBasic = BigDecimal.ZERO;//平级收益,假设平级,则算平级收益的百分比收益 + boolean flag = false; + String parentId = mallMember.getReferrerId(); + if (StrUtil.isBlank(parentId)) { + flag = true; + } + while (!flag) { + MallMember mallMemberRef = memberMapper.selectInfoByInviteId(parentId); + String levelRef = mallMemberRef.getLevel(); + //会员等级为ZERO_LEVEL,则不参与团队返佣 + if(!MemberLevelNewEnum.ZERO_LEVEL.getType().equals(levelRef)){ + int compareLevel = MemberLevelNewEnum.ZERO_LEVEL.compareLevel(level, levelRef); + DataDictionaryCustom dataDictionaryCustom = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( + levelRef, levelRef + ); + TeamPerkDto teamPerkDto = JSONObject.parseObject(dataDictionaryCustom.getValue(), TeamPerkDto.class); + if(compareLevel == 0){//团队奖励 + BigDecimal PerkPercent = new BigDecimal(teamPerkDto.getPerkPercent()) + .multiply(new BigDecimal("0.01")); + BigDecimal teamPerk = PerkPercent.multiply(profit).setScale(2,BigDecimal.ROUND_DOWN); + /** + * 先插入流水记录,然后定时器循环,找寻对应的数据执行 + */ + String orderNo = MallUtils.getOrderNum("TNFT"); + + if(teamPerk.compareTo(BigDecimal.ZERO) > 0){ + insertFlowUpdateFrozenNft( + orderNo, + mallMemberRef.getId(), + teamPerk, + MoneyFlowTypeNewEnum.TEAM_PERK_DIRECT.getValue(), + FlowTypeNewEnum.NFT.getValue(), + MoneyFlowTypeNewEnum.TEAM_PERK_DIRECT.getDescrition(), + AppContants.MEMBER_FLOW_ING); + } + equalsPerkBasic = teamPerk; + level = levelRef; + }else if(compareLevel == 2){//平级奖励 + BigDecimal equalsPerkPercent = new BigDecimal(teamPerkDto.getEqualsPerkPercent()) + .multiply(new BigDecimal("0.01")); + BigDecimal equalsPerk = equalsPerkPercent.multiply(equalsPerkBasic).setScale(2,BigDecimal.ROUND_DOWN); + String orderNo = MallUtils.getOrderNum("PJNFT"); + if(equalsPerk.compareTo(BigDecimal.ZERO) > 0){ + insertFlowUpdateFrozenNft( + orderNo, + mallMemberRef.getId(), + equalsPerk, + MoneyFlowTypeNewEnum.TEAM_PERK_EQUALS.getValue(), + FlowTypeNewEnum.NFT.getValue(), + MoneyFlowTypeNewEnum.TEAM_PERK_EQUALS.getDescrition(), + AppContants.MEMBER_FLOW_ING); + } + equalsPerkBasic = equalsPerk; + } + } + parentId = mallMemberRef.getReferrerId(); + if (StrUtil.isBlank(mallMemberRef.getReferrerId())) { + flag = true; + } + } + } + } + } + } + } + } + + /** + * 先插入流水记录,更新冻结NFT,后续定时器循环,找寻对应的数据执行 + */ + public void insertFlowUpdateFrozenNft(String orderNo,Long memberId,BigDecimal perk,Integer type,Integer flowType,String desc, + Integer isReturn){ + mallMoneyFlowService.addMoneyFlow( + memberId, + perk, + type, + orderNo, + null, + flowType, + desc, + isReturn); + + MallMemberAmount mallMemberAmountDirect = mallMemberAmountMapper.selectByMemberId(memberId); + mallMemberAmountDirect.setFrozenNft(mallMemberAmountDirect.getFrozenNft().add(perk)); + mallMemberAmountMapper.updateFrozenNftById(mallMemberAmountDirect); + } + + @Override + public void timeGetOrderBuy() { + DateTime nowTime = DateUtil.parseTime(DateUtil.formatTime(DateUtil.date())); + DataDictionaryCustom endTimeDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( + DataDictionaryEnum.YU_YUE_END_TIME.getType(), + DataDictionaryEnum.YU_YUE_END_TIME.getCode() + ); + DateTime endTime = DateUtil.parseTime(endTimeDic.getValue()); + /** + * 当前时间比结束时间大 + */ + if(nowTime.compareTo(endTime) >= 0){ + List<MallProductBuyRecord> mallProductBuyRecords = mallProductBuyRecordMapper.selectByState(ProductEnum.PRODUCT_MATE_STATE_WAIT_PAY.getValue()); + if(CollUtil.isNotEmpty(mallProductBuyRecords)){ + for(MallProductBuyRecord mallProductBuyRecord : mallProductBuyRecords){ + /** + * 用户有超时未支付的订单 + * 1、冻结账户 + * 2、更新买单主表 + * 2、更新卖单主表 + * 3、更新买单子表的数据 + * 3、更新卖单子表的数据 + */ + agentProducer.sendFcmOrderBuyCancelMsg(mallProductBuyRecord.getId()); + } + } + } + + } + + @Override + public void timeGetOrderSell() { + DateTime nowTime = DateUtil.parseTime(DateUtil.formatTime(DateUtil.date())); + DataDictionaryCustom endTimeDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( + DataDictionaryEnum.YU_YUE_END_TIME.getType(), + DataDictionaryEnum.YU_YUE_END_TIME.getCode() + ); + DateTime endTime = DateUtil.parseTime(endTimeDic.getValue()); + /** + * 当前时间比结束时间大 + */ + if(nowTime.compareTo(endTime) >= 0){ + List<MallProductSellRecord> mallProductSellRecords = mallProductSellRecordMapper.selectListByState( + ProductEnum.PRODUCT_MATE_STATE_PAY.getValue()); + if(CollUtil.isNotEmpty(mallProductSellRecords)){ + for(MallProductSellRecord mallProductSellRecord : mallProductSellRecords){ + /** + * 卖方 + * 1:冻结账户 + */ + Long sellId = mallProductSellRecord.getSellId(); + MallProductSell mallProductSell = mallProductSellMapper.selectById(sellId); + MallMember mallMember = memberMapper.selectById(mallProductSell.getMemberId()); + mallMember.setIsFrozen(ProductEnum.MEMBER_FROZEN.getValue()); + memberMapper.updateById(mallMember); + } + } + } + } + + @Override + public void timeGetOrderBuyCancel() { + /** + * nft产品周期到期的已完成买单变成卖单 + * 计算收益,本金 + */ + List<MallProductNft> mallProductNfts = mallProductNftMapper.selectList(null); + if(CollUtil.isEmpty(mallProductNfts)){ + return; + } + DateTime nowTime = DateUtil.date(); + DateTime nowTimeFormat = DateUtil.parseTime(DateUtil.formatTime(nowTime)); + DataDictionaryCustom endTimeDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( + DataDictionaryEnum.YU_YUE_END_TIME.getType(), + DataDictionaryEnum.YU_YUE_END_TIME.getCode() + ); + DateTime endTime = DateUtil.parseTime(endTimeDic.getValue()); + if(nowTimeFormat.compareTo(endTime) < 0){ + return; + } + for(MallProductNft mallProductNft : mallProductNfts){ + Long nftId = mallProductNft.getId(); + List<MallProductBuy> mallProductBuys = mallProductBuyMapper.selectListByStateAndProductNFTId( + ProductEnum.PRODUCT_BUY_ON_GOING.getValue(), + nftId, + ProductEnum.PRODUCT_BUY_MATE_STATE_FAIL.getValue()); + if(CollUtil.isEmpty(mallProductBuys)){ + continue; + } + for(MallProductBuy mallProductBuy : mallProductBuys){ + /** + * 当前时间比创建时间大 + */ + if(nowTime.compareTo(mallProductBuy.getCreatedTime()) >= 0){ + /** + * 返回令牌 + * 预约记录超时 + */ + String orderNo = mallProductBuy.getOrderNo(); + /** + * 只要存在匹配记录,则不退回。 + */ + List<MallProductBuyRecord> mallProductBuyRecords = mallProductBuyRecordMapper.selectRecordListByBuyId(mallProductBuy.getId()); + if(CollUtil.isNotEmpty(mallProductBuyRecords)){ + continue; + } + mallProductBuy.setState(ProductEnum.PRODUCT_BUY_TIMEOUT.getValue()); + mallProductBuyMapper.updateById(mallProductBuy); + + Long memberId = mallProductBuy.getMemberId(); + MallMoneyFlow mallMoneyFlow = mallMoneyFlowMapper.selectByOrderAndType(orderNo, + MoneyFlowTypeNewEnum.TOKEN_BUY_FROZEN.getValue(), + FlowTypeNewEnum.TOKEN.getValue(), + memberId); + if(ObjectUtil.isEmpty(mallMoneyFlow)){ + continue; + } + BigDecimal absAmount = mallMoneyFlow.getAmount().abs(); + MallMemberAmount mallMemberAmount = mallMemberAmountMapper.selectByMemberId(memberId); + mallMemberAmount.setTokenAva(mallMemberAmount.getTokenAva().add(absAmount)); + mallMemberAmount.setTokenFrozen(mallMemberAmount.getTokenFrozen().subtract(absAmount)); + mallMemberAmountMapper.updateTokenAvaAndTokenFrozenById(mallMemberAmount); + + mallMoneyFlowService.addMoneyFlow( + memberId, + absAmount, + MoneyFlowTypeNewEnum.TOKEN_BUY_FROZEN_RETURN.getValue(), + orderNo, + null, + FlowTypeNewEnum.TOKEN.getValue(), + MoneyFlowTypeNewEnum.TOKEN_BUY_FROZEN_RETURN.getDescrition()); + + + } + } + } + } + + @Override + public void basicMemberPerk() { + QueryWrapper<MallMoneyFlow> queryMallMoneyFlow = new QueryWrapper<>(); + queryMallMoneyFlow.eq("type",MoneyFlowTypeNewEnum.BASIC_PERK_DIRECT.getValue()); + queryMallMoneyFlow.eq("is_return",AppContants.MEMBER_FLOW_ING); + queryMallMoneyFlow.eq("flow_type",FlowTypeNewEnum.NFT.getValue()); + List<MallMoneyFlow> mallMoneyFlows = mallMoneyFlowMapper.selectList(queryMallMoneyFlow); + if(CollUtil.isNotEmpty(mallMoneyFlows)){ + return; + } + + String frozenDays = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( + DataDictionaryEnum.BASIC_PERK_DIRECT_FROZEN.getType(), + DataDictionaryEnum.BASIC_PERK_DIRECT_FROZEN.getCode() + ).getValue(); + for(MallMoneyFlow mallMoneyFlow : mallMoneyFlows){ + //创建时间往后增加冻结天数,与当前时间进行比较,如果大于当前时间,则跳出循环。 + Date createdTime = mallMoneyFlow.getCreatedTime(); + DateTime dateTime = DateUtil.offsetDay(createdTime, Integer.parseInt(frozenDays)); + if(DateUtil.compare(dateTime, new Date()) > 0){ + continue; + } + mallMoneyFlow.setIsReturn(AppContants.MEMBER_FLOW_DONE); + mallMoneyFlowMapper.updateById(mallMoneyFlow); + /** + * 如果用户是冻结,则直接销毁 + */ + Long memberId = mallMoneyFlow.getMemberId(); + MallMember mallMember = memberMapper.selectById(memberId); + Integer isFrozen = mallMember.getIsFrozen(); + if(ProductEnum.MEMBER_UNFROZEN.getValue() == isFrozen){ + MallMemberAmount mallMemberAmount = mallMemberAmountMapper.selectByMemberId(memberId); + mallMemberAmount.setFrozenNft(mallMemberAmount.getFrozenNft().subtract(mallMoneyFlow.getAmount())); + mallMemberAmountMapper.updateFrozenNftById(mallMemberAmount); + //插入一条流水记录 + String orderNo = MallUtils.getOrderNum("FNFTW"); + mallMoneyFlowService.addMoneyFlow( + memberId, + mallMoneyFlow.getAmount().negate(), + MoneyFlowTypeNewEnum.BASIC_PERK_DIRECT_WRONG.getValue(), + orderNo, + null, + FlowTypeNewEnum.NFT.getValue(), + MoneyFlowTypeNewEnum.BASIC_PERK_DIRECT_WRONG.getDescrition(), + AppContants.MEMBER_FLOW_ING); + + }else { + MallMemberAmount mallMemberAmount = mallMemberAmountMapper.selectByMemberId(memberId); + mallMemberAmount.setFrozenNft(mallMemberAmount.getFrozenNft().subtract(mallMoneyFlow.getAmount())); + mallMemberAmount.setTrendsNft(mallMemberAmount.getTrendsNft().add(mallMoneyFlow.getAmount())); + mallMemberAmountMapper.updateTrendsNftAndFrozenNftById(mallMemberAmount); + + //插入一条流水记录 + String orderNo = MallUtils.getOrderNum("NFT"); + mallMoneyFlowService.addMoneyFlow( + memberId, + mallMoneyFlow.getAmount().negate(), + MoneyFlowTypeNewEnum.BASIC_PERK_DIRECT_DONE.getValue(), + orderNo, + null, + FlowTypeNewEnum.NFT.getValue(), + MoneyFlowTypeNewEnum.BASIC_PERK_DIRECT_DONE.getDescrition(), + AppContants.MEMBER_FLOW_DONE); + } + } + } + + @Override + public void teamMemberPerk() { + QueryWrapper<MallMoneyFlow> queryMallMoneyFlow = new QueryWrapper<>(); + queryMallMoneyFlow.eq("type",MoneyFlowTypeNewEnum.TEAM_PERK_DIRECT.getValue()); + queryMallMoneyFlow.eq("is_return",AppContants.MEMBER_FLOW_ING); + queryMallMoneyFlow.eq("flow_type",FlowTypeNewEnum.NFT.getValue()); + List<MallMoneyFlow> mallMoneyFlows = mallMoneyFlowMapper.selectList(queryMallMoneyFlow); + if(CollUtil.isNotEmpty(mallMoneyFlows)){ + return; + } + + String frozenDays = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( + DataDictionaryEnum.BASIC_PERK_DIRECT_FROZEN.getType(), + DataDictionaryEnum.BASIC_PERK_DIRECT_FROZEN.getCode() + ).getValue(); + for(MallMoneyFlow mallMoneyFlow : mallMoneyFlows){ + //创建时间往后增加冻结天数,与当前时间进行比较,如果大于当前时间,则跳出循环。 + Date createdTime = mallMoneyFlow.getCreatedTime(); + DateTime dateTime = DateUtil.offsetDay(createdTime, Integer.parseInt(frozenDays)); + if(DateUtil.compare(dateTime, new Date()) > 0){ + continue; + } + mallMoneyFlow.setIsReturn(AppContants.MEMBER_FLOW_DONE); + mallMoneyFlowMapper.updateById(mallMoneyFlow); + /** + * 如果用户是冻结,则直接销毁 + */ + Long memberId = mallMoneyFlow.getMemberId(); + MallMember mallMember = memberMapper.selectById(memberId); + Integer isFrozen = mallMember.getIsFrozen(); + if(ProductEnum.MEMBER_UNFROZEN.getValue() == isFrozen){ + MallMemberAmount mallMemberAmount = mallMemberAmountMapper.selectByMemberId(memberId); + mallMemberAmount.setFrozenNft(mallMemberAmount.getFrozenNft().subtract(mallMoneyFlow.getAmount())); + mallMemberAmountMapper.updateFrozenNftById(mallMemberAmount); + //插入一条流水记录 + String orderNo = MallUtils.getOrderNum("FNFTW"); + mallMoneyFlowService.addMoneyFlow( + memberId, + mallMoneyFlow.getAmount().negate(), + MoneyFlowTypeNewEnum.BASIC_PERK_DIRECT_WRONG.getValue(), + orderNo, + null, + FlowTypeNewEnum.NFT.getValue(), + MoneyFlowTypeNewEnum.BASIC_PERK_DIRECT_WRONG.getDescrition(), + AppContants.MEMBER_FLOW_ING); + + }else { + MallMemberAmount mallMemberAmount = mallMemberAmountMapper.selectByMemberId(memberId); + mallMemberAmount.setFrozenNft(mallMemberAmount.getFrozenNft().subtract(mallMoneyFlow.getAmount())); + mallMemberAmount.setTrendsNft(mallMemberAmount.getTrendsNft().add(mallMoneyFlow.getAmount())); + mallMemberAmountMapper.updateTrendsNftAndFrozenNftById(mallMemberAmount); + + //插入一条流水记录 + String orderNo = MallUtils.getOrderNum("NFT"); + mallMoneyFlowService.addMoneyFlow( + memberId, + mallMoneyFlow.getAmount().negate(), + MoneyFlowTypeNewEnum.TEAM_PERK_DIRECT_DONE.getValue(), + orderNo, + null, + FlowTypeNewEnum.NFT.getValue(), + MoneyFlowTypeNewEnum.TEAM_PERK_DIRECT_DONE.getDescrition(), + AppContants.MEMBER_FLOW_DONE); + } + } + } + + @Override + public void equalsMemberPerk() { + QueryWrapper<MallMoneyFlow> queryMallMoneyFlow = new QueryWrapper<>(); + queryMallMoneyFlow.eq("type",MoneyFlowTypeNewEnum.TEAM_PERK_EQUALS.getValue()); + queryMallMoneyFlow.eq("is_return",AppContants.MEMBER_FLOW_ING); + queryMallMoneyFlow.eq("flow_type",FlowTypeNewEnum.NFT.getValue()); + List<MallMoneyFlow> mallMoneyFlows = mallMoneyFlowMapper.selectList(queryMallMoneyFlow); + if(CollUtil.isNotEmpty(mallMoneyFlows)){ + return; + } + + String frozenDays = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( + DataDictionaryEnum.BASIC_PERK_DIRECT_FROZEN.getType(), + DataDictionaryEnum.BASIC_PERK_DIRECT_FROZEN.getCode() + ).getValue(); + for(MallMoneyFlow mallMoneyFlow : mallMoneyFlows){ + //创建时间往后增加冻结天数,与当前时间进行比较,如果大于当前时间,则跳出循环。 + Date createdTime = mallMoneyFlow.getCreatedTime(); + DateTime dateTime = DateUtil.offsetDay(createdTime, Integer.parseInt(frozenDays)); + if(DateUtil.compare(dateTime, new Date()) > 0){ + continue; + } + mallMoneyFlow.setIsReturn(AppContants.MEMBER_FLOW_DONE); + mallMoneyFlowMapper.updateById(mallMoneyFlow); + /** + * 如果用户是冻结,则直接销毁 + */ + Long memberId = mallMoneyFlow.getMemberId(); + MallMember mallMember = memberMapper.selectById(memberId); + Integer isFrozen = mallMember.getIsFrozen(); + if(ProductEnum.MEMBER_UNFROZEN.getValue() == isFrozen){ + MallMemberAmount mallMemberAmount = mallMemberAmountMapper.selectByMemberId(memberId); + mallMemberAmount.setFrozenNft(mallMemberAmount.getFrozenNft().subtract(mallMoneyFlow.getAmount())); + mallMemberAmountMapper.updateFrozenNftById(mallMemberAmount); + //插入一条流水记录 + String orderNo = MallUtils.getOrderNum("FNFTW"); + mallMoneyFlowService.addMoneyFlow( + memberId, + mallMoneyFlow.getAmount().negate(), + MoneyFlowTypeNewEnum.BASIC_PERK_DIRECT_WRONG.getValue(), + orderNo, + null, + FlowTypeNewEnum.NFT.getValue(), + MoneyFlowTypeNewEnum.BASIC_PERK_DIRECT_WRONG.getDescrition(), + AppContants.MEMBER_FLOW_ING); + + }else { + MallMemberAmount mallMemberAmount = mallMemberAmountMapper.selectByMemberId(memberId); + mallMemberAmount.setFrozenNft(mallMemberAmount.getFrozenNft().subtract(mallMoneyFlow.getAmount())); + mallMemberAmount.setTrendsNft(mallMemberAmount.getTrendsNft().add(mallMoneyFlow.getAmount())); + mallMemberAmountMapper.updateTrendsNftAndFrozenNftById(mallMemberAmount); + + //插入一条流水记录 + String orderNo = MallUtils.getOrderNum("NFT"); + mallMoneyFlowService.addMoneyFlow( + memberId, + mallMoneyFlow.getAmount().negate(), + MoneyFlowTypeNewEnum.TEAM_PERK_EQUALS_DONE.getValue(), + orderNo, + null, + FlowTypeNewEnum.NFT.getValue(), + MoneyFlowTypeNewEnum.TEAM_PERK_EQUALS_DONE.getDescrition(), + AppContants.MEMBER_FLOW_DONE); + } + } + } + + @Override + public void memberLevelUp() { + /** + * 获取当前所有的已完成、未转换的买单的用户 + */ + QueryWrapper<MallProductBuy> query = new QueryWrapper<>(); + query.eq("state",ProductEnum.PRODUCT_BUY_SUCCESS.getValue()); + query.eq("mate_state",ProductEnum.PRODUCT_BUY_MATE_STATE_FAIL.getValue()); + List<MallProductBuy> mallProductBuys = mallProductBuyMapper.selectList(query); + if(CollUtil.isEmpty(mallProductBuys)){ + return; + } + + Set<Long> collect = mallProductBuys.stream().map(MallProductBuy::getMemberId).collect(Collectors.toSet()); + if(CollUtil.isEmpty(collect)){ + return; + } + for(Long memberId : collect){ + MallMember mallMember = memberMapper.selectById(memberId); + if(ObjectUtil.isEmpty(mallMember)){ + continue; + } + //上级 + String referrerId = mallMember.getReferrerId(); + MallMember mallMemberRef = memberMapper.selectInfoByInviteId(referrerId); + if(ObjectUtil.isEmpty(mallMemberRef)){ + continue; + } + List<MallMember> mallMembersAll = memberMapper.selectAllChildAgentListByInviteId(referrerId); + if(ObjectUtil.isEmpty(mallMembersAll)){ + continue; + } + List<MallMember> mallMembers = memberMapper.selectByRefererId(referrerId); + Set<Long> mallMembersSet = mallMembers.stream().map(MallMember::getId).collect(Collectors.toSet()); + mallMembersSet.retainAll(collect); + List<Long> intersection = new ArrayList<>(mallMembersSet);//上级直推有效人数 + if(CollUtil.isEmpty(intersection)){ + mallMemberRef.setLevel(MemberLevelNewEnum.ZERO_LEVEL.getType()); + memberMapper.updateById(mallMemberRef); + continue; + } + /** + * 从会员等级最低到最高,比较intersection与会员设置的直推人数directCntLevel比较 + * directCntLevel >= intersection.size(),则满足升级会员等级条件,跳出循环 + * teamCnt >= mallMembersAll.size(),则满足升级会员等级条件,跳出循环 + * 达到最高级别后,升级会员等级,跳出循环 + */ + String level = MemberLevelNewEnum.ZERO_LEVEL.getType(); + boolean flag = false; + while (!flag){ + DataDictionaryCustom levelDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( + level, level + ); + TeamPerkDto teamPerkDto = JSONObject.parseObject(levelDic.getValue(), TeamPerkDto.class); + Integer directCntLevel = teamPerkDto.getDirectCnt(); + Integer teamCnt = teamPerkDto.getTeamCnt(); + if(directCntLevel >= intersection.size() && + teamCnt >= mallMembersAll.size()){ + mallMemberRef.setLevel(level); + memberMapper.updateById(mallMemberRef); + flag = true; + } + String nextLevel = MemberLevelNewEnum.ZERO_LEVEL.getNextLevel(level); + level = nextLevel; + if(level.equals(MemberLevelNewEnum.WU_LEVEL.getType()) && + nextLevel.equals(MemberLevelNewEnum.WU_LEVEL.getType()) ){ + mallMemberRef.setLevel(level); + memberMapper.updateById(mallMemberRef); + flag = true; + } + } + } + } + + @Override + public void memberLevelDown() { + List<MallProductBuy> mallProductBuys = mallProductBuyMapper.selectTotalPerk(); + if(CollUtil.isEmpty(mallProductBuys)){ + return; + } + for(MallProductBuy mallProductBuy : mallProductBuys){ + BigDecimal totalPerk = mallProductBuy.getTotalPerk(); + if(BigDecimal.ZERO.compareTo(totalPerk) >= 0 ){ + Long memberId = mallProductBuy.getMemberId(); + MallMember mallMember = memberMapper.selectById(memberId); + mallMember.setLevel(AgentLevelEnum.ZERO_LEVEL.getCode()); + memberMapper.updateById(mallMember); + } + } + } + + public void insertSell(Long memberId,BigDecimal nftCnt,BigDecimal nftCntAva, + BigDecimal nftFee,BigDecimal fcmFeeCnt){ + String orderNo = MallUtils.getOrderNum("NFT"); + MallProductSell mallProductSell = new MallProductSell(); + mallProductSell.setMemberId(memberId); + mallProductSell.setOrderNo(orderNo); + mallProductSell.setNftTotal(nftCnt); + mallProductSell.setNftCnt(nftCntAva); + mallProductSell.setNftCntAva(nftCntAva); + mallProductSell.setNftFee(nftFee); + mallProductSell.setFcmFee(fcmFeeCnt); + mallProductSell.setState(ProductEnum.PRODUCT_SELL_ON_GOING.getValue()); + mallProductSellMapper.insert(mallProductSell); + } + + public static List<Integer> findMissingNumbers(int[] nums) { + //定义一个标记数组,标记出现过的下表为true + boolean[] flag = new boolean[nums.length+1]; + for(int temp:nums){ + flag[temp] = true; + } + List<Integer> arr = new ArrayList<Integer>(); + //以连续的i作为本应该的下标,查找之前的标记数组,没有被标记过的下标,就是消失的数字 + for(int i = 1;i <= nums.length; i++){ + if(!flag[i]){ + arr.add(i); + } + } + return arr; + } + + public static List<Integer> findDisappearedNumbers(int[] nums) { + Set<Integer> set = new HashSet<>(); // 利用Set对象元素不重复的特性 + // 把nums里的每一个数字都添加至set中 + for(int i = 0; i < nums.length; ++i) { + set.add(nums[i]); + } + List<Integer> list = new ArrayList<>(); + // 把1~n的每一个数字都添加至set中,若添加成功则说明原数组不存在该数字,加入list即可 + for(int i = 1; i <= nums.length; ++i) { + if(set.add(i)) { + list.add(i); + } + } + return list; + } +// public static void main(String[] args) { +// int[] nums = {1, 2, 2, 5, 2}; +// List<Integer> missingNumbers = findDisappearedNumbers(nums); +// System.out.println("缺失的数字为:" + missingNumbers); +// } } -- Gitblit v1.9.1