From 57d138cddcd5a26eb0c5dcc2b9dccfdc6875cbef Mon Sep 17 00:00:00 2001 From: KKSU <15274802129@163.com> Date: Thu, 28 Dec 2023 09:59:38 +0800 Subject: [PATCH] 直推奖励,冻结的用户,则直推奖励销毁,用户未冻结才能领取成功 --- src/main/java/cc/mrbird/febs/common/enumerates/MemberLevelNewEnum.java | 93 +++++++++++++ src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java | 232 ++++++++++++++++++++++++++++++++ src/main/java/cc/mrbird/febs/mall/dto/TeamPerkDto.java | 13 + src/main/java/cc/mrbird/febs/mall/quartz/ProfitJob.java | 16 ++ src/main/java/cc/mrbird/febs/common/enumerates/MoneyFlowTypeNewEnum.java | 9 + src/main/java/cc/mrbird/febs/mall/service/IAgentService.java | 4 6 files changed, 361 insertions(+), 6 deletions(-) diff --git a/src/main/java/cc/mrbird/febs/common/enumerates/MemberLevelNewEnum.java b/src/main/java/cc/mrbird/febs/common/enumerates/MemberLevelNewEnum.java new file mode 100644 index 0000000..64adabc --- /dev/null +++ b/src/main/java/cc/mrbird/febs/common/enumerates/MemberLevelNewEnum.java @@ -0,0 +1,93 @@ +package cc.mrbird.febs.common.enumerates; + +import lombok.Getter; + +import java.util.ArrayList; +import java.util.List; + +@Getter +public enum MemberLevelNewEnum { +// SEVEN_LEVEL("SEVEN_LEVEL",6), +// SIX_LEVEL("SIX_LEVEL",5), + WU_LEVEL("WU_LEVEL",5), + SI_LEVEL("SI_LEVEL",4), + SAN_LEVEL("SAN_LEVEL",3), + ER_LEVEL("ER_LEVEL",2), + YI_LEVEL("YI_LEVEL",1), + ZERO_LEVEL("ZERO_LEVEL",0); + + + private String type; + + private Integer code; + + MemberLevelNewEnum(String type, Integer code) { + this.type = type; + this.code = code; + } + + public List<String> getLevelType(){ + List<String> strs = new ArrayList<>(); + for (MemberLevelNewEnum value : MemberLevelNewEnum.values()) { + strs.add(value.type); + } + return strs; + } + + public int getLevelCode(String Level){ + int codeOne = 0; + for (MemberLevelNewEnum value : MemberLevelNewEnum.values()) { + if(value.type.equals(Level)){ + codeOne = value.code; + } + } + return codeOne; + } + + public String getNextLevel(String Level){ + String levelNext = Level; + int codeOne = 0; + for (MemberLevelNewEnum value : MemberLevelNewEnum.values()) { + if(value.type.equals(Level)){ + codeOne = value.code; + break; + } + } + codeOne = codeOne + 1; + for (MemberLevelNewEnum value : MemberLevelNewEnum.values()) { + if(value.code == (codeOne)){ + levelNext = value.type; + break; + } + } + return levelNext; + } + + public static void main(String[] args) { + String zero_level = MemberLevelNewEnum.ZERO_LEVEL.getNextLevel("YI_LEVEL"); + System.out.println(zero_level); + } + + /** + * 比较两个级别的大小,levelOne大于levelTwo返回1,小于返回0,等于返回2 + */ + public int compareLevel(String levelOne ,String levelTwo) { + int codeOne = 0; + int codeTwo = 0; + for (MemberLevelNewEnum value : MemberLevelNewEnum.values()) { + if(value.type.equals(levelOne)){ + codeOne = value.code; + } + if(value.type.equals(levelTwo)){ + codeTwo = value.code; + } + } + if(codeOne > codeTwo){ + return 1; + } + if(codeOne == codeTwo){ + return 2; + } + return 0; + } +} diff --git a/src/main/java/cc/mrbird/febs/common/enumerates/MoneyFlowTypeNewEnum.java b/src/main/java/cc/mrbird/febs/common/enumerates/MoneyFlowTypeNewEnum.java index e74ef83..5ffe2ab 100644 --- a/src/main/java/cc/mrbird/febs/common/enumerates/MoneyFlowTypeNewEnum.java +++ b/src/main/java/cc/mrbird/febs/common/enumerates/MoneyFlowTypeNewEnum.java @@ -10,8 +10,15 @@ **/ @Getter public enum MoneyFlowTypeNewEnum { + + TEAM_PERK_EQUALS_DONE(22,"平级奖励"), + TEAM_PERK_DIRECT_DONE(21,"团队奖励"), + + TEAM_PERK_EQUALS(20,"即将获得平级奖励"), + TEAM_PERK_DIRECT(19,"即将获得团队奖励"), + BASIC_PERK_DIRECT_DONE(18,"直推奖励"), - BASIC_PERK_DIRECT_WRONG(17,"账户冻结,遗憾错失直推奖励"), + BASIC_PERK_DIRECT_WRONG(17,"账户冻结,遗憾错失奖励"), BASIC_PERK_DIRECT(16,"即将获得直推奖励"), SYSTEM_PEY(15,"系统拨付"), NFT_OUT_FEE_FCM(14,"NFT提现GFA手续费"), diff --git a/src/main/java/cc/mrbird/febs/mall/dto/TeamPerkDto.java b/src/main/java/cc/mrbird/febs/mall/dto/TeamPerkDto.java new file mode 100644 index 0000000..857b28f --- /dev/null +++ b/src/main/java/cc/mrbird/febs/mall/dto/TeamPerkDto.java @@ -0,0 +1,13 @@ +package cc.mrbird.febs.mall.dto; + +import lombok.Data; + +@Data +public class TeamPerkDto { + //直推人数 + private Integer directCnt; + //团队收益比例 + private String PerkPercent; + //平级比例 + private String equalsPerkPercent; +} diff --git a/src/main/java/cc/mrbird/febs/mall/quartz/ProfitJob.java b/src/main/java/cc/mrbird/febs/mall/quartz/ProfitJob.java index 1fd0fac..403caef 100644 --- a/src/main/java/cc/mrbird/febs/mall/quartz/ProfitJob.java +++ b/src/main/java/cc/mrbird/febs/mall/quartz/ProfitJob.java @@ -153,6 +153,22 @@ agentService.basicMemberPerk(); } + /** + * 团队奖励 + */ + @Scheduled(cron = "0 0 0/2 * * ? ") + public void teamMemberPerk() { + agentService.teamMemberPerk(); + } + + /** + * 平级奖励 + */ + @Scheduled(cron = "0 0 0/2 * * ? ") + public void equalsMemberPerk() { + agentService.equalsMemberPerk(); + } + // /** // * 卖单 // * 看是否是开始显示订单的时间段,超出结束时间的卖单,全部超时失败 diff --git a/src/main/java/cc/mrbird/febs/mall/service/IAgentService.java b/src/main/java/cc/mrbird/febs/mall/service/IAgentService.java index f0b1d75..a974db3 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/IAgentService.java +++ b/src/main/java/cc/mrbird/febs/mall/service/IAgentService.java @@ -49,4 +49,8 @@ void timeGetOrderBuyCancel(); void basicMemberPerk(); + + void teamMemberPerk(); + + void equalsMemberPerk(); } 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 39a22e8..eb22f3b 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 @@ -3,6 +3,8 @@ 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.*; @@ -882,11 +884,7 @@ /** * 先插入流水记录,然后定时器每小时,循环一次找寻对应的数据执行 */ - String frozenDays = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( - DataDictionaryEnum.BASIC_PERK_DIRECT_FROZEN.getType(), - DataDictionaryEnum.BASIC_PERK_DIRECT_FROZEN.getCode() - ).getValue(); - String orderNo = MallUtils.getOrderNum("FNFT"); + String orderNo = MallUtils.getOrderNum("DNFT"); mallMoneyFlowService.addMoneyFlow( directMember.getId(), basicPerkDirect, @@ -902,11 +900,90 @@ 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(); + 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()); + 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()); + 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 @@ -1077,7 +1154,18 @@ 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); /** @@ -1123,6 +1211,140 @@ } } + @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); + } + } + } + public void insertSell(Long memberId,BigDecimal nftCnt,BigDecimal nftCntAva, BigDecimal nftFee,BigDecimal fcmFeeCnt){ String orderNo = MallUtils.getOrderNum("NFT"); -- Gitblit v1.9.1