From 1df98158a5b26c03db22c865ddb302946e6ccdca Mon Sep 17 00:00:00 2001 From: KKSU <15274802129@163.com> Date: Wed, 10 Jul 2024 10:10:46 +0800 Subject: [PATCH] 后台 --- src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java | 1171 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 1,125 insertions(+), 46 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 5049623..8642dcf 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,20 +3,17 @@ 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.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.query.QueryWrapper; import lombok.RequiredArgsConstructor; @@ -24,12 +21,10 @@ import org.apache.ibatis.session.ExecutorType; import org.apache.ibatis.session.SqlSession; import org.mybatis.spring.SqlSessionTemplate; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; -import java.math.RoundingMode; import java.util.*; import java.util.stream.Collectors; @@ -820,7 +815,36 @@ 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); +// } +// } + + +// public static void main(String[] args) { +// DateTime dateTime = DateUtil.parseDate("2024-3-27"); +// System.out.println(dateTime); +// System.out.println(DateUtil.compare(DateUtil.date(),dateTime)); +// if(DateUtil.compare(DateUtil.date(),dateTime)<= 0){ +// System.out.println(dateTime); +// } +// } @Override public void BuyToSell() { /** @@ -847,25 +871,723 @@ 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); //偏移时间 - DateTime dateTime = DateUtil.offsetDay(payTime, cycle); - int compare = DateUtil.compare(now, dateTime); - if(compare <= 0){ + 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) { /** - * 更新买单状态 - * 收益生成一条卖单 - * 本金生成一条卖单 + * 用户的账户增加对应的收益 */ - mallProductBuy.setMateState(ProductEnum.PRODUCT_BUY_MATE_STATE_SUCCESS.getValue()); - mallProductBuyMapper.updateById(mallProductBuy); + + BigDecimal totalPerk = mallProductBuy.getTotalPerk(); + if(BigDecimal.ZERO.compareTo(totalPerk) >= 0){ + mallProductBuy.setTotalPerk(BigDecimal.ZERO); + mallProductBuyMapper.updateById(mallProductBuy); + continue; + } BigDecimal nftTotal = mallProductBuy.getNftTotal(); - insertSell(mallProductBuy.getMemberId(),nftTotal,nftTotal,BigDecimal.ZERO,BigDecimal.ZERO); - BigDecimal profit = nftTotal.multiply(profitPercent.multiply(new BigDecimal(0.01))); - insertSell(mallProductBuy.getMemberId(),profit,profit,BigDecimal.ZERO,BigDecimal.ZERO); + BigDecimal profit = nftTotal.multiply(profitPercent.multiply(new BigDecimal(0.01))).setScale(2,BigDecimal.ROUND_DOWN); + + 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); + } + + MallMemberAmount mallMemberAmountPerk = mallMemberAmountMapper.selectByMemberId(mallProductBuy.getMemberId()); + if(BigDecimal.ZERO.compareTo(mallMemberAmountPerk.getTotalPerk()) >= 0){ + continue; + } + if(mallMemberAmountPerk.getTotalPerk().compareTo(profit) <= 0){ + profit = mallMemberAmountPerk.getTotalPerk(); + mallMemberAmountPerk.setTotalPerk(BigDecimal.ZERO); + mallMemberAmountMapper.updateTotalPerkById(mallMemberAmountPerk); + }else{ + mallMemberAmountPerk.setTotalPerk(mallMemberAmountPerk.getTotalPerk().subtract(profit).setScale(2,BigDecimal.ROUND_DOWN)); + mallMemberAmountMapper.updateTotalPerkById(mallMemberAmountPerk); + } +// 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)){ + if(DateUtil.compare(payTime,DateUtil.parseDate("2024-3-26"))<= 0){ + //直推 + 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; + } + } + } + } } } } + } + + public void createPerk(MallMember mallMember,BigDecimal basicPerkDirect){ + /** + * 如果用户是冻结,则直接销毁 + */ + Integer isFrozen = mallMember.getIsFrozen(); + if(ProductEnum.MEMBER_FROZEN.getValue() == isFrozen){ + MallMemberAmount mallMemberAmountMine = mallMemberAmountMapper.selectByMemberId(mallMember.getId()); + if(BigDecimal.ZERO.compareTo(mallMemberAmountMine.getTotalPerk().subtract(basicPerkDirect)) >= 0){ + return; + } + mallMemberAmountMine.setTotalPerk(mallMemberAmountMine.getTotalPerk().subtract(basicPerkDirect)); + mallMemberAmountMapper.updateTrendsNftAndFrozenNftById(mallMemberAmountMine); + //插入一条流水记录 + String orderNo = MallUtils.getOrderNum("FNFTW"); + mallMoneyFlowService.addMoneyFlow( + mallMember.getId(), + basicPerkDirect.negate(), + MoneyFlowTypeNewEnum.BASIC_PERK_DIRECT_WRONG.getValue(), + orderNo, + null, + FlowTypeNewEnum.NFT.getValue(), + MoneyFlowTypeNewEnum.BASIC_PERK_DIRECT_WRONG.getDescrition(), + AppContants.MEMBER_FLOW_ING); + + }else { + MallMemberAmount mallMemberAmountMine = mallMemberAmountMapper.selectByMemberId(mallMember.getId()); + if(BigDecimal.ZERO.compareTo(mallMemberAmountMine.getTotalPerk().subtract(basicPerkDirect)) >= 0){ + return; + } + mallMemberAmountMine.setTotalPerk(mallMemberAmountMine.getTotalPerk().subtract(basicPerkDirect)); + mallMemberAmountMapper.updateTotalPerkById(mallMemberAmountMine); + + MallMemberAmount mallMemberAmountNft = mallMemberAmountMapper.selectByMemberId(mallMember.getId()); + mallMemberAmountNft.setTrendsNft(mallMemberAmountNft.getTrendsNft().add(basicPerkDirect)); + mallMemberAmountMapper.updateTrendsNftById(mallMemberAmountNft); + + //插入一条流水记录 + String orderNo = MallUtils.getOrderNum("NFT"); + mallMoneyFlowService.addMoneyFlow( + mallMember.getId(), + basicPerkDirect, + MoneyFlowTypeNewEnum.BASIC_PERK_DIRECT_DONE.getValue(), + orderNo, + null, + FlowTypeNewEnum.NFT.getValue(), + MoneyFlowTypeNewEnum.BASIC_PERK_DIRECT_DONE.getDescrition(), + AppContants.MEMBER_FLOW_DONE); + } + } + + @Override + public void BuyToSellV2() { + List<MallProductBuy> mallProductBuys = mallProductBuyMapper.selectListByStateAndMateState( + ProductEnum.PRODUCT_BUY_SUCCESS.getValue(), + ProductEnum.PRODUCT_BUY_MATE_STATE_FAIL.getValue()); + if(CollUtil.isEmpty(mallProductBuys)){ + return; + } + + log.info("等待返利总条数:"+ (CollUtil.isEmpty(mallProductBuys) ? 0 : mallProductBuys.size())); + Integer fanliSize = 0; + for(MallProductBuy mallProductBuy : mallProductBuys){ + MallProductNft mallProductNft = mallProductNftMapper.selectById(mallProductBuy.getProductNftId()); + //周期 + int cycle = mallProductBuy.getCycle(); + //收益率 + BigDecimal profitPercent = mallProductBuy.getProfit(); + 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); + mallProductBuy.setMateState(ProductEnum.PRODUCT_BUY_MATE_STATE_SUCCESS.getValue()); + mallProductBuyMapper.updateById(mallProductBuy); + continue; + } + BigDecimal nftTotal = mallProductBuy.getNftTotal(); + BigDecimal profit = nftTotal.multiply(profitPercent.multiply(new BigDecimal(0.01))).setScale(2,BigDecimal.ROUND_DOWN); + + 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); + } + + MallMemberAmount mallMemberAmountPerk = mallMemberAmountMapper.selectByMemberId(mallProductBuy.getMemberId()); + if(BigDecimal.ZERO.compareTo(mallMemberAmountPerk.getTotalPerk()) >= 0){ + continue; + } + if(mallMemberAmountPerk.getTotalPerk().compareTo(profit) <= 0){ + profit = mallMemberAmountPerk.getTotalPerk(); + mallMemberAmountPerk.setTotalPerk(BigDecimal.ZERO); + mallMemberAmountMapper.updateTotalPerkById(mallMemberAmountPerk); + }else{ + mallMemberAmountPerk.setTotalPerk(mallMemberAmountPerk.getTotalPerk().subtract(profit).setScale(2,BigDecimal.ROUND_DOWN)); + mallMemberAmountMapper.updateTotalPerkById(mallMemberAmountPerk); + } +// insertSell(mallProductBuy.getMemberId(),profit,profit,BigDecimal.ZERO,BigDecimal.ZERO); + + MallMember mallMemberMe = memberMapper.selectById(mallProductBuy.getMemberId()); + if(ObjectUtil.isEmpty(mallMemberMe)){ + continue; + } + if(ProductEnum.MEMBER_FROZEN.getValue() == mallMemberMe.getIsFrozen()){ + //插入一条流水记录 + String orderNo = MallUtils.getOrderNum("FNFTW"); + mallMoneyFlowService.addMoneyFlow( + mallProductBuy.getMemberId(), + profit.negate(), + MoneyFlowTypeNewEnum.BASIC_PERK_DIRECT_WRONG.getValue(), + orderNo, + null, + FlowTypeNewEnum.NFT.getValue(), + MoneyFlowTypeNewEnum.BASIC_PERK_DIRECT_WRONG.getDescrition(), + AppContants.MEMBER_FLOW_ING); + + }else{ + fanliSize = fanliSize +1; + 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)){ + if(DateUtil.compare(payTime,DateUtil.parseDate("2024-3-26"))<= 0){ + //直推 + 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 = nftTotal.multiply(basicPerkDirectPercent).setScale(2, BigDecimal.ROUND_DOWN); + /** + * 如果用户是冻结,则直接销毁 + */ + createPerk(directMember,basicPerkDirect.multiply(new BigDecimal("0.5"))); + if(StrUtil.isNotEmpty(directMember.getReferrerId())){ + MallMember directMemberDirect = memberMapper.selectInfoByInviteId(directMember.getReferrerId()); + createPerk(directMemberDirect,basicPerkDirect.multiply(new BigDecimal("0.5"))); + } + } + } + + /** + * 团队奖励 + * + */ + 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); + + DataDictionaryCustom dataDictionaryCustomLevel = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( + level, level + ); + TeamPerkDto teamPerkDtoLevel = JSONObject.parseObject(dataDictionaryCustomLevel.getValue(), TeamPerkDto.class); + if(compareLevel == 0){//团队奖励 + BigDecimal subtract = new BigDecimal(teamPerkDto.getPerkPercent()).subtract(new BigDecimal(teamPerkDtoLevel.getPerkPercent())); + + BigDecimal PerkPercent = subtract + .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; + } + } + } + } + } + } + + log.info("返利总条数:"+ fanliSize); + } + + public static void main(String[] args) { + DateTime payTime = DateUtil.parseDate("2024-05-24 14:17:02"); + DateTime nowTime = DateUtil.parseDate("2024-06-8 02:00:00"); + String s = String.valueOf(DateUtil.between(payTime, nowTime, DateUnit.DAY));//相差日期天数 + BigDecimal bigDecimal = new BigDecimal(s).setScale(0, BigDecimal.ROUND_DOWN);//只取整数位 + System.out.println(bigDecimal); + BigDecimal remainder = bigDecimal.remainder(new BigDecimal(String.valueOf(5)));//取余 + System.out.println(remainder); + } + + @Override + public void BuyToSellV3(DateTime date) { + List<MallProductBuy> mallProductBuys = mallProductBuyMapper.selectListByStateAndMateState( + ProductEnum.PRODUCT_BUY_SUCCESS.getValue(), + ProductEnum.PRODUCT_BUY_MATE_STATE_FAIL.getValue()); + if(CollUtil.isEmpty(mallProductBuys)){ + return; + } + + log.info("等待返利总条数:"+ (CollUtil.isEmpty(mallProductBuys) ? 0 : mallProductBuys.size())); + Integer fanliSize = 0; + for(MallProductBuy mallProductBuy : mallProductBuys){ + MallProductNft mallProductNft = mallProductNftMapper.selectById(mallProductBuy.getProductNftId()); + //周期 + int cycle = mallProductNft.getCycle(); + //收益率 + BigDecimal profitPercent = mallProductNft.getProfit(); + 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, 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); + mallProductBuy.setMateState(ProductEnum.PRODUCT_BUY_MATE_STATE_SUCCESS.getValue()); + mallProductBuyMapper.updateById(mallProductBuy); + continue; + } + BigDecimal nftTotal = mallProductBuy.getNftTotal(); + BigDecimal profit = nftTotal.multiply(profitPercent.multiply(new BigDecimal(0.01))).setScale(2,BigDecimal.ROUND_DOWN); + + 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); + } + + MallMemberAmount mallMemberAmountPerk = mallMemberAmountMapper.selectByMemberId(mallProductBuy.getMemberId()); + if(BigDecimal.ZERO.compareTo(mallMemberAmountPerk.getTotalPerk()) >= 0){ + continue; + } + if(mallMemberAmountPerk.getTotalPerk().compareTo(profit) <= 0){ + profit = mallMemberAmountPerk.getTotalPerk(); + mallMemberAmountPerk.setTotalPerk(BigDecimal.ZERO); + mallMemberAmountMapper.updateTotalPerkById(mallMemberAmountPerk); + }else{ + mallMemberAmountPerk.setTotalPerk(mallMemberAmountPerk.getTotalPerk().subtract(profit).setScale(2,BigDecimal.ROUND_DOWN)); + mallMemberAmountMapper.updateTotalPerkById(mallMemberAmountPerk); + } +// insertSell(mallProductBuy.getMemberId(),profit,profit,BigDecimal.ZERO,BigDecimal.ZERO); + + MallMember mallMemberMe = memberMapper.selectById(mallProductBuy.getMemberId()); + if(ObjectUtil.isEmpty(mallMemberMe)){ + continue; + } + if(ProductEnum.MEMBER_FROZEN.getValue() == mallMemberMe.getIsFrozen()){ + //插入一条流水记录 + String orderNo = MallUtils.getOrderNum("FNFTW"); + mallMoneyFlowService.addMoneyFlow( + mallProductBuy.getMemberId(), + profit.negate(), + MoneyFlowTypeNewEnum.BASIC_PERK_DIRECT_WRONG.getValue(), + orderNo, + null, + FlowTypeNewEnum.NFT.getValue(), + MoneyFlowTypeNewEnum.BASIC_PERK_DIRECT_WRONG.getDescrition(), + AppContants.MEMBER_FLOW_ING); + + }else{ + fanliSize = fanliSize +1; + 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)){ + if(DateUtil.compare(payTime,DateUtil.parseDate("2024-3-26"))<= 0){ + //直推 + 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); + + if(ProductEnum.MEMBER_FROZEN.getValue() == directMember.getIsFrozen()){ + //插入一条流水记录 + String orderNo = MallUtils.getOrderNum("FNFTW"); + mallMoneyFlowService.addMoneyFlow( + directMember.getId(), + profit.negate(), + MoneyFlowTypeNewEnum.BASIC_PERK_DIRECT_WRONG.getValue(), + orderNo, + null, + FlowTypeNewEnum.NFT.getValue(), + MoneyFlowTypeNewEnum.BASIC_PERK_DIRECT_WRONG.getDescrition(), + AppContants.MEMBER_FLOW_ING); + + }else{ + /** + * 先插入流水记录,然后定时器每小时,循环一次找寻对应的数据执行 + */ + 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; + } + } + } + } + } + } + + log.info("返利总条数:"+ fanliSize); + } + + /** + * 先插入流水记录,更新冻结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); + + + + MallMemberAmount mallMemberAmountTotalPerk = mallMemberAmountMapper.selectByMemberId(memberId); + mallMemberAmountTotalPerk.setTotalPerk(mallMemberAmountTotalPerk.getTotalPerk().subtract(perk)); + mallMemberAmountMapper.updateTotalPerkById(mallMemberAmountTotalPerk); } @Override @@ -880,7 +1602,8 @@ * 当前时间比结束时间大 */ if(nowTime.compareTo(endTime) >= 0){ - List<MallProductBuyRecord> mallProductBuyRecords = mallProductBuyRecordMapper.selectByState(ProductEnum.PRODUCT_MATE_STATE_WAIT_PAY.getValue()); + List<MallProductBuyRecord> mallProductBuyRecords = mallProductBuyRecordMapper.selectByState( + ProductEnum.PRODUCT_MATE_STATE_WAIT_PAY.getValue()); if(CollUtil.isNotEmpty(mallProductBuyRecords)){ for(MallProductBuyRecord mallProductBuyRecord : mallProductBuyRecords){ /** @@ -892,30 +1615,6 @@ * 3、更新卖单子表的数据 */ agentProducer.sendFcmOrderBuyCancelMsg(mallProductBuyRecord.getId()); - -// Long buyId = mallProductBuyRecord.getBuyId(); -// Long sellRecordId = mallProductBuyRecord.getSellRecordId(); -// MallProductBuy mallProductBuy = mallProductBuyMapper.selectById(buyId); -// Long memberIdBuy = mallProductBuy.getMemberId(); -// //冻结账户 -// MallMember mallMemberBuy = memberMapper.selectById(memberIdBuy); -// mallMemberBuy.setIsFrozen(ProductEnum.MEMBER_FROZEN.getValue()); -// memberMapper.updateById(mallMemberBuy); -// //更新买单子表的数据 -// mallProductBuyRecord.setState(ProductEnum.PRODUCT_MATE_STATE_FAIL.getValue()); -// mallProductBuyRecordMapper.updateById(mallProductBuyRecord); -// //更新买单主表 -// mallProductBuy.setNftAva(mallProductBuy.getNftAva().add(mallProductBuyRecord.getPickNftCnt())); -// mallProductBuyMapper.updateById(mallProductBuy); -// //更新卖单子表的数据 -// MallProductSellRecord mallProductSellRecord = mallProductSellRecordMapper.selectById(sellRecordId); -// mallProductSellRecord.setState(ProductEnum.PRODUCT_MATE_STATE_FAIL.getValue()); -// mallProductSellRecordMapper.updateById(mallProductSellRecord); -// //更新卖单主表 -// Long sellId = mallProductSellRecord.getSellId(); -// MallProductSell mallProductSell = mallProductSellMapper.selectById(sellId); -// mallProductSell.setNftCntAva(mallProductSell.getNftCntAva().add(mallProductSellRecord.getNftCnt())); -// mallProductSellMapper.updateById(mallProductSell); } } } @@ -962,12 +1661,16 @@ if(CollUtil.isEmpty(mallProductNfts)){ return; } - DateTime nowTime = DateUtil.parseTime(DateUtil.formatTime(DateUtil.date())); + 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( @@ -979,9 +1682,9 @@ } for(MallProductBuy mallProductBuy : mallProductBuys){ /** - * 当前时间比结束时间大 + * 当前时间比创建时间大 */ - if(nowTime.compareTo(endTime) >= 0){ + if(nowTime.compareTo(mallProductBuy.getCreatedTime()) >= 0){ /** * 返回令牌 * 预约记录超时 @@ -1026,6 +1729,345 @@ } } + @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.isEmpty(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_FROZEN.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 mallMemberAmountMine = mallMemberAmountMapper.selectByMemberId(memberId); + if(BigDecimal.ZERO.compareTo(mallMemberAmountMine.getTotalPerk().subtract(mallMoneyFlow.getAmount())) >= 0){ + continue; + } + mallMemberAmountMine.setTotalPerk(mallMemberAmountMine.getTotalPerk().subtract(mallMoneyFlow.getAmount())); + mallMemberAmountMapper.updateTrendsNftAndFrozenNftById(mallMemberAmountMine); + + 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(), + 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.isEmpty(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_FROZEN.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 mallMemberAmountMine = mallMemberAmountMapper.selectByMemberId(memberId); + if(BigDecimal.ZERO.compareTo(mallMemberAmountMine.getTotalPerk().subtract(mallMoneyFlow.getAmount())) >= 0){ + continue; + } + mallMemberAmountMine.setTotalPerk(mallMemberAmountMine.getTotalPerk().subtract(mallMoneyFlow.getAmount())); + mallMemberAmountMapper.updateTrendsNftAndFrozenNftById(mallMemberAmountMine); + + 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(), + 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.isEmpty(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_FROZEN.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 mallMemberAmountMine = mallMemberAmountMapper.selectByMemberId(memberId); + if(BigDecimal.ZERO.compareTo(mallMemberAmountMine.getTotalPerk().subtract(mallMoneyFlow.getAmount())) >= 0){ + continue; + } + mallMemberAmountMine.setTotalPerk(mallMemberAmountMine.getTotalPerk().subtract(mallMoneyFlow.getAmount())); + mallMemberAmountMapper.updateTrendsNftAndFrozenNftById(mallMemberAmountMine); + + 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(), + 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; + } +// if(mallMemberRef.getId() != 2366L){ +// 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()){ + int levelCode = MemberLevelNewEnum.ZERO_LEVEL.getLevelCode(level); + + List<MallMember> mallMembersAll = new ArrayList<>(); + if(levelCode > 1){ + String levelType = MemberLevelNewEnum.ZERO_LEVEL.getLevelType(levelCode - 1); + List<MallMember> mallMembersDirects = memberMapper.selectByRefererId(mallMemberRef.getInviteId()); + for(MallMember memberDirect : mallMembersDirects){ + List<MallMember> mallMembers1 = memberMapper.selectMemberWithLevelAndMemberId(levelType, memberDirect.getInviteId()); + if(CollUtil.isEmpty(mallMembers1)){ + continue; + } + mallMembersAll.add(memberDirect); + } + }else{ + String levelType = MemberLevelNewEnum.ZERO_LEVEL.getLevelType(0); + mallMembersAll = memberMapper.selectMemberWithLevelAndMemberId(levelType,mallMemberRef.getInviteId()); + } + if(teamCnt <= (CollUtil.isEmpty(mallMembersAll) ? 0 : mallMembersAll.size())){ + mallMemberRef.setLevel(level); + memberMapper.updateById(mallMemberRef); + + String nextLevel = MemberLevelNewEnum.ZERO_LEVEL.getNextLevel(level); + level = nextLevel; + if(level.equals(MemberLevelNewEnum.SIX_LEVEL.getType()) && + nextLevel.equals(MemberLevelNewEnum.SIX_LEVEL.getType()) ){ + mallMemberRef.setLevel(level); + memberMapper.updateById(mallMemberRef); + flag = true; + } + }else{ + flag = true; + } + }else{ + 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"); @@ -1041,4 +2083,41 @@ 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