KKSU
2024-03-26 38371de8bcb3b06d200a61b93356bad3507a1896
src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java
@@ -64,6 +64,9 @@
    private final MallProductBuyMapper mallProductBuyMapper;
    private final MallProductSellMapper mallProductSellMapper;
    private final MallProductSellRecordMapper mallProductSellRecordMapper;
    private final MallMemberAmountMapper mallMemberAmountMapper;
    private final IMallMoneyFlowService iMallMoneyFlowService;
    private final MallProductNftMapper mallProductNftMapper;
    @Override
    @Transactional(rollbackFor = Exception.class)
@@ -1113,8 +1116,50 @@
    @Override
    public void fcmNFTExchangeMsg(String cnt) {
        /**
         * 销毁数量 按照比例销毁或者返利给节点
         */
        BigDecimal destoryCntTotal = new BigDecimal(cnt);
        DataDictionaryCustom totalPercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                DataDictionaryEnum.FCM_DESTORY_TOTAL_PERCENT.getType(),
                DataDictionaryEnum.FCM_DESTORY_TOTAL_PERCENT.getCode()
        );
        BigDecimal totalPercent = new BigDecimal(totalPercentDic.getValue()).multiply(AppContants.BASIC_PERCENT);
        //销毁数量
        BigDecimal destoryCnt = new BigDecimal(cnt);
        BigDecimal destoryCnt = destoryCntTotal.multiply(totalPercent).setScale(2,BigDecimal.ROUND_DOWN);
        DataDictionaryCustom pointPercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                DataDictionaryEnum.FCM_DESTORY_POINT_PERCENT.getType(),
                DataDictionaryEnum.FCM_DESTORY_POINT_PERCENT.getCode()
        );
        BigDecimal pointPercent = new BigDecimal(pointPercentDic.getValue()).multiply(AppContants.BASIC_PERCENT);
        //节点评分总数量
        BigDecimal pointCnt = destoryCntTotal.multiply(pointPercent).setScale(2,BigDecimal.ROUND_DOWN);
        //给每个节点平分pointCnt。
        QueryWrapper<MallMember> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("partner",1);
        List<MallMember> mallMembers = mallMemberMapper.selectList(queryWrapper);
        if(CollUtil.isNotEmpty(mallMembers)){
            BigDecimal dividePointCnt = pointCnt.divide(new BigDecimal(mallMembers.size()), 2, BigDecimal.ROUND_DOWN);
            for(MallMember mallMember : mallMembers){
                Long memberId = mallMember.getId();
                MallMemberAmount mallMemberAmount = mallMemberAmountMapper.selectByMemberId(memberId);
                mallMemberAmount.setFcmCntAva(mallMemberAmount.getFcmCntAva().add(dividePointCnt));
                mallMemberAmountMapper.updateFcmCntAvaById(mallMemberAmount);
                String orderNo = MallUtils.getOrderNum("JD");
                iMallMoneyFlowService.addMoneyFlow(
                        memberId,
                        dividePointCnt,
                        MoneyFlowTypeNewEnum.PERK_POINT.getValue(),
                        orderNo,
                        mallMember.getId(),
                        FlowTypeNewEnum.FCM_COIN.getValue(),
                        MoneyFlowTypeNewEnum.PERK_POINT.getDescrition());
            }
        }
        //更新总销毁数量
        DataDictionaryCustom fcmDestoryTotalDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                DataDictionaryEnum.FCM_DESTORY_TOTAL.getType(),
@@ -1218,9 +1263,89 @@
            BigDecimal nftCntTotalBuy = mallProductBuyRecords.stream().map(MallProductBuyRecord::getPickNftCnt).reduce(BigDecimal.ZERO, BigDecimal::add);
            MallProductBuy mallProductBuy = mallProductBuyMapper.selectById(buyId);
            if(nftCntTotalBuy.compareTo(mallProductBuy.getNftTotal()) >= 0){
                Long productNftId = mallProductBuy.getProductNftId();
                MallProductNft mallProductNft = mallProductNftMapper.selectById(productNftId);
                BigDecimal perkTime = mallProductNft.getPerkTime();
                BigDecimal totalPerk = perkTime.multiply(mallProductBuy.getNftTotal()).setScale(2, BigDecimal.ROUND_DOWN);
                mallProductBuy.setTotalPerk(totalPerk);
                mallProductBuy.setState(ProductEnum.PRODUCT_BUY_SUCCESS.getValue());
                mallProductBuy.setPayTime(DateUtil.date());
                mallProductBuyMapper.updateById(mallProductBuy);
                MallMemberAmount mallMemberAmount = mallMemberAmountMapper.selectByMemberId(mallProductBuy.getMemberId());
                mallMemberAmount.setTotalPerk(mallMemberAmount.getTotalPerk().add(totalPerk));
                mallMemberAmountMapper.updateTotalPerkById(mallMemberAmount);
                /**
                 * 更新用户上级收益,冻结7天,7天时间到期自动释放到动态钱包
                 */
                Long memberId = mallProductBuy.getMemberId();
                MallMember mallMember = mallMemberMapper.selectById(memberId);
                if(ObjectUtil.isNotEmpty(mallMember)){
                    //直推
                    String referrerId = mallMember.getReferrerId();
                    MallMember directMember = mallMemberMapper.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 nftTotal = mallProductBuy.getNftTotal();
                        BigDecimal basicPerkDirect = nftTotal.multiply(basicPerkDirectPercent).setScale(2, BigDecimal.ROUND_DOWN);
                        /**
                         * 如果用户是冻结,则直接销毁
                         */
                        Integer isFrozen = directMember.getIsFrozen();
                        if(ProductEnum.MEMBER_FROZEN.getValue() == isFrozen){
                            MallMemberAmount mallMemberAmountMine = mallMemberAmountMapper.selectByMemberId(directMember.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(
                                    memberId,
                                    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(directMember.getId());
                            if(BigDecimal.ZERO.compareTo(mallMemberAmountMine.getTotalPerk().subtract(basicPerkDirect)) >= 0){
                                return;
                            }
                            mallMemberAmountMine.setTotalPerk(mallMemberAmountMine.getTotalPerk().subtract(basicPerkDirect));
                            mallMemberAmountMapper.updateTrendsNftAndFrozenNftById(mallMemberAmountMine);
                            MallMemberAmount mallMemberAmountNft = mallMemberAmountMapper.selectByMemberId(directMember.getId());
                            mallMemberAmountNft.setTrendsNft(mallMemberAmountNft.getTrendsNft().add(basicPerkDirect));
                            mallMemberAmountMapper.updateTrendsNftById(mallMemberAmountNft);
                            //插入一条流水记录
                            String orderNo = MallUtils.getOrderNum("NFT");
                            mallMoneyFlowService.addMoneyFlow(
                                    memberId,
                                    basicPerkDirect,
                                    MoneyFlowTypeNewEnum.BASIC_PERK_DIRECT_DONE.getValue(),
                                    orderNo,
                                    null,
                                    FlowTypeNewEnum.NFT.getValue(),
                                    MoneyFlowTypeNewEnum.BASIC_PERK_DIRECT_DONE.getDescrition(),
                                    AppContants.MEMBER_FLOW_DONE);
                        }
                    }
                }
            }
        }
    }