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,62 @@
    @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(),
                DataDictionaryEnum.FCM_DESTORY_TOTAL.getCode()
        );
        BigDecimal fcmDestoryTotal = new BigDecimal(fcmDestoryTotalDic.getValue());
        fcmDestoryTotal = fcmDestoryTotal.add(destoryCnt);
        commonService.updateDataDic(
                DataDictionaryEnum.FCM_DESTORY_TOTAL.getType(),
                DataDictionaryEnum.FCM_DESTORY_TOTAL.getCode(),
                fcmDestoryTotal.toString());
        DataDictionaryCustom fcmDestoryCntDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                DataDictionaryEnum.FCM_DESTORY_CNT.getType(),
                DataDictionaryEnum.FCM_DESTORY_CNT.getCode()
@@ -1129,8 +1186,8 @@
        BigDecimal divide = fcmDestoryCntAdd.divide(AppContants.FCM_BASIC, 0, BigDecimal.ROUND_DOWN);
        if(BigDecimal.ZERO.compareTo(divide) == 0){
            commonService.updateDataDic(
                    DataDictionaryEnum.BANK_TRANS_URL.getType(),
                    DataDictionaryEnum.BANK_TRANS_URL.getCode(),
                    DataDictionaryEnum.FCM_DESTORY_CNT.getType(),
                    DataDictionaryEnum.FCM_DESTORY_CNT.getCode(),
                    fcmDestoryCntAdd.toString());
        }
@@ -1141,18 +1198,6 @@
                    DataDictionaryEnum.FCM_DESTORY_CNT.getType(),
                    DataDictionaryEnum.FCM_DESTORY_CNT.getCode(),
                    fcmDestoryCntReal.toString());
            //更新总销毁数量
            DataDictionaryCustom fcmDestoryTotalDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                    DataDictionaryEnum.FCM_DESTORY_TOTAL.getType(),
                    DataDictionaryEnum.FCM_DESTORY_TOTAL.getCode()
            );
            BigDecimal fcmDestoryTotal = new BigDecimal(fcmDestoryTotalDic.getValue());
            fcmDestoryTotal = fcmDestoryTotal.add(destoryCnt);
            commonService.updateDataDic(
                    DataDictionaryEnum.FCM_DESTORY_TOTAL.getType(),
                    DataDictionaryEnum.FCM_DESTORY_TOTAL.getCode(),
                    fcmDestoryTotal.toString());
            //更新价格
            DataDictionaryCustom fcmPriceDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                    DataDictionaryEnum.FCM_PRICE.getType(),
@@ -1200,32 +1245,138 @@
        //已完成的买单
        List<MallProductSellRecord> mallProductSellRecords = mallProductSellRecordMapper.selectListBySellId(sellId,ProductEnum.PRODUCT_MATE_STATE_FINISH.getValue());
        if(CollUtil.isEmpty(mallProductSellRecords)){
            return;
        if(CollUtil.isNotEmpty(mallProductSellRecords)){
            //实际支付总数
            BigDecimal nftCntTotal = mallProductSellRecords.stream().map(MallProductSellRecord::getNftCnt).reduce(BigDecimal.ZERO, BigDecimal::add);
            MallProductSell mallProductSell = mallProductSellMapper.selectById(sellId);
            if(nftCntTotal.compareTo(mallProductSell.getNftCnt()) >= 0){
                mallProductSell.setState(ProductEnum.PRODUCT_SELL_SUCCESS.getValue());
                mallProductSellMapper.updateById(mallProductSell);
            }
        }
        //实际支付总数
        BigDecimal nftCntTotal = mallProductSellRecords.stream().map(MallProductSellRecord::getNftCnt).reduce(BigDecimal.ZERO, BigDecimal::add);
        MallProductSell mallProductSell = mallProductSellMapper.selectById(sellId);
        if(nftCntTotal.compareTo(mallProductSell.getNftCnt()) < 0){
            return;
        }
        mallProductSell.setState(ProductEnum.PRODUCT_SELL_SUCCESS.getValue());
        mallProductSellMapper.updateById(mallProductSell);
        Long buyId = mallProductBuyRecord.getBuyId();
        List<MallProductBuyRecord> mallProductBuyRecords = mallProductBuyRecordMapper.selectListByBuyId(buyId,ProductEnum.PRODUCT_MATE_STATE_FINISH.getValue());
        if(CollUtil.isEmpty(mallProductBuyRecords)){
        if(CollUtil.isNotEmpty(mallProductBuyRecords)){
            //实际支付总数
            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);
                        }
                    }
                }
            }
        }
    }
    @Override
    public void fcmOrderBuyCancelMsg(Long buyRecordId) {
        MallProductBuyRecord mallProductBuyRecord = mallProductBuyRecordMapper.selectById(buyRecordId);
        if(ProductEnum.PRODUCT_MATE_STATE_WAIT_PAY.getValue() != mallProductBuyRecord.getState()){
            return;
        }
        //实际支付总数
        BigDecimal nftCntTotalBuy = mallProductBuyRecords.stream().map(MallProductBuyRecord::getPickNftCnt).reduce(BigDecimal.ZERO, BigDecimal::add);
        MallProductBuy mallProductBuy = mallProductBuyMapper.selectById(buyId);
        if(nftCntTotalBuy.compareTo(mallProductBuy.getNftTotal()) < 0){
            return;
        }
        mallProductBuy.setState(ProductEnum.PRODUCT_BUY_SUCCESS.getValue());
        mallProductBuy.setPayTime(DateUtil.date());
        Long sellRecordId = mallProductBuyRecord.getSellRecordId();
        //更新买单子表的数据
        mallProductBuyRecord.setState(ProductEnum.PRODUCT_MATE_STATE_FAIL.getValue());
        mallProductBuyRecordMapper.updateById(mallProductBuyRecord);
        //更新买单主表
        MallProductBuy mallProductBuy = mallProductBuyMapper.selectById(mallProductBuyRecord.getBuyId());
        mallProductBuy.setNftAva(mallProductBuy.getNftAva().add(mallProductBuyRecord.getPickNftCnt()));
        mallProductBuyMapper.updateById(mallProductBuy);
        Long memberId = mallProductBuy.getMemberId();
        MallMember mallMember = mallMemberMapper.selectById(memberId);
        mallMember.setIsFrozen(ProductEnum.MEMBER_FROZEN.getValue());
        mallMemberMapper.updateById(mallMember);
        //更新卖单子表的数据
        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);
    }
    public static void main(String[] args) {