xiaoyong931011
2023-08-15 76706e083e2f5d91b4d3346ffead2e6bce2d09c5
src/main/java/cc/mrbird/febs/dapp/service/impl/DappMemberServiceImpl.java
@@ -975,6 +975,254 @@
        return mallGoodsCategoryMapper.selectRecommendCategoryList();
    }
    @Override
    public FebsResponse balanceSystem() {
        List<DappMemberEntity> dappMemberEntities = dappMemberDao.selectAllMemberForInCome();
        if(CollUtil.isNotEmpty(dappMemberEntities)){
            if(dappMemberEntities.size() <= 100){
                for(DappMemberEntity dappMemberEntity : dappMemberEntities){
                    Long memberId = dappMemberEntity.getId();
                    BigDecimal balance = dappMemberEntity.getBalance();
                    BigDecimal cnt = balance.divide(new BigDecimal(2) , 2 ,BigDecimal.ROUND_DOWN);
                    dappMemberEntity.setBalance(balance.subtract(cnt));
                    dappMemberDao.updateById(dappMemberEntity);
                    DataDictionaryCustom packageScorePriceDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                            DataDictionaryEnum.PACKAGE_SCORE_PRICE.getType(),
                            DataDictionaryEnum.PACKAGE_SCORE_PRICE.getCode()
                    );
                    BigDecimal packageScorePrice = new BigDecimal(ObjectUtil.isEmpty(packageScorePriceDic) ? "0" : packageScorePriceDic.getValue()).setScale(2, BigDecimal.ROUND_DOWN);
                    //卖出资产乘以价格获取到预期获取的总额
                    BigDecimal totalAmount = cnt.multiply(packageScorePrice).setScale(2, BigDecimal.ROUND_DOWN);
                    //资产包卖出划入底池比例
                    DataDictionaryCustom packageToPoorPercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                            DataDictionaryEnum.PACKAGE_SALE_TO_POOR_PERCENT.getType(),
                            DataDictionaryEnum.PACKAGE_SALE_TO_POOR_PERCENT.getCode()
                    );
                    BigDecimal packageToPoorPercent = new BigDecimal(ObjectUtil.isEmpty(packageToPoorPercentDic) ? "0.1" : packageToPoorPercentDic.getValue()).setScale(2, BigDecimal.ROUND_DOWN);
                    //划入底池的金额
                    BigDecimal poorAmount = totalAmount.multiply(packageToPoorPercent).setScale(2, BigDecimal.ROUND_DOWN);
                    //实际获取的金额
                    BigDecimal realAmount = totalAmount.subtract(poorAmount);
                    //生成一条资金流水
                    DappFundFlowEntity scoreFlow = new DappFundFlowEntity(
                            memberId,
                            realAmount,
                            FundFlowEnum.SYSTEM_PACKAGE_SALE.getCode(),
                            DappFundFlowEntity.WITHDRAW_STATUS_AGREE,
                            BigDecimal.ZERO);
                    dappFundFlowDao.insert(scoreFlow);
                    dappWalletCoinDao.addTotalAndaddAvailableByMemberId(memberId,realAmount);
                    DappFundFlowEntity feeFlow = new DappFundFlowEntity(
                            memberId,
                            poorAmount.negate(),
                            FundFlowEnum.SYSTEM_PACKAGE_SALE.getCode(),
                            DappFundFlowEntity.WITHDRAW_STATUS_AGREE,
                            BigDecimal.ZERO);
                    dappFundFlowDao.insert(feeFlow);
                    //卖出积分直接销毁。
                    DataDictionaryCustom packageTotalScoreDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                            DataDictionaryEnum.PACKAGE_TOTAL_SCORE.getType(),
                            DataDictionaryEnum.PACKAGE_TOTAL_SCORE.getCode()
                    );
                    BigDecimal avaPackageTotalScore = new BigDecimal(ObjectUtil.isEmpty(packageTotalScoreDic) ? "21000" : packageTotalScoreDic.getValue()).setScale(2, BigDecimal.ROUND_DOWN);
                    //更新USDT底池
                    DataDictionaryCustom packagePoorDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                            DataDictionaryEnum.PACKAGE_POOR.getType(),
                            DataDictionaryEnum.PACKAGE_POOR.getCode()
                    );
                    BigDecimal packagePoor = new BigDecimal(ObjectUtil.isEmpty(packagePoorDic) ? "0" : packagePoorDic.getValue()).setScale(2, BigDecimal.ROUND_DOWN);
                    BigDecimal avaPackagePoor = packagePoor.add(poorAmount);
                    packagePoorDic.setValue(avaPackagePoor.toString());
                    dataDictionaryCustomMapper.updateById(packagePoorDic);
                    //计算当前价格
                    BigDecimal divide = avaPackagePoor.divide(avaPackageTotalScore, 8, BigDecimal.ROUND_DOWN);
                    packageScorePriceDic.setValue(divide.toString());
                    dataDictionaryCustomMapper.updateById(packageScorePriceDic);
                }
                return new FebsResponse().success();
            }
            List<MallAchieveRecord> mallAchieveRecordList = new ArrayList<>();
            for(DappMemberEntity dappMemberEntity : dappMemberEntities){
                //获取每个人的业绩
                //业绩集合
                List<BigDecimal> list = new ArrayList<>();
                //总业绩
                BigDecimal teamIncomeMax = BigDecimal.ZERO;
                //所有直推团队,就是这个会员的所有区域的业绩。
                // 直推用户
                List<DappMemberEntity> childs = dappMemberDao.selectMemberInfoByRefererId(dappMemberEntity.getInviteId());
                List<String> childsInviteIds = childs.stream().map(DappMemberEntity::getInviteId).collect(Collectors.toList());
                if(CollUtil.isNotEmpty(childsInviteIds)){
                    for(String inviteId : childsInviteIds){
                        BigDecimal totalIncomeMember = dappMemberDao.selectAchieveRecordByInviteId(inviteId);
                        teamIncomeMax = teamIncomeMax.add(totalIncomeMember);
                        list.add(totalIncomeMember);
                    }
                    //去掉一个最大区的业绩
                    BigDecimal bigMax = list.stream().max(BigDecimal::compareTo).get();
                    teamIncomeMax = teamIncomeMax.subtract(bigMax);
                    MallAchieveRecord mallAchieveRecord = new MallAchieveRecord();
                    mallAchieveRecord.setMemberId(dappMemberEntity.getId());
                    mallAchieveRecord.setAmount(teamIncomeMax);
                    mallAchieveRecordList.add(mallAchieveRecord);
                }
            }
            if(CollUtil.isNotEmpty(mallAchieveRecordList)){
                //按照小区业绩的多少排名
                List<MallAchieveRecord> collect = mallAchieveRecordList
                        .stream()
                        .sorted(Comparator.comparing(MallAchieveRecord::getAmount))
                        .collect(Collectors.toList());
                List<MallAchieveRecord> top100Performances = collect.stream()
                        .limit(100)
                        .collect(Collectors.toList());
                if(CollUtil.isNotEmpty(top100Performances)){
                    for(MallAchieveRecord mallAchieveRecord : top100Performances){
                        Long memberId = mallAchieveRecord.getMemberId();
                        DappMemberEntity dappMemberEntity = dappMemberDao.selectById(memberId);
                        BigDecimal balance = dappMemberEntity.getBalance();
                        BigDecimal cnt = balance.divide(new BigDecimal(2) , 2 ,BigDecimal.ROUND_DOWN);
                        dappMemberEntity.setBalance(balance.subtract(cnt));
                        dappMemberDao.updateById(dappMemberEntity);
                        DataDictionaryCustom packageScorePriceDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                                DataDictionaryEnum.PACKAGE_SCORE_PRICE.getType(),
                                DataDictionaryEnum.PACKAGE_SCORE_PRICE.getCode()
                        );
                        BigDecimal packageScorePrice = new BigDecimal(ObjectUtil.isEmpty(packageScorePriceDic) ? "0" : packageScorePriceDic.getValue()).setScale(2, BigDecimal.ROUND_DOWN);
                        //卖出资产乘以价格获取到预期获取的总额
                        BigDecimal totalAmount = cnt.multiply(packageScorePrice).setScale(2, BigDecimal.ROUND_DOWN);
                        //资产包卖出划入底池比例
                        DataDictionaryCustom packageToPoorPercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                                DataDictionaryEnum.PACKAGE_SALE_TO_POOR_PERCENT.getType(),
                                DataDictionaryEnum.PACKAGE_SALE_TO_POOR_PERCENT.getCode()
                        );
                        BigDecimal packageToPoorPercent = new BigDecimal(ObjectUtil.isEmpty(packageToPoorPercentDic) ? "0.1" : packageToPoorPercentDic.getValue()).setScale(2, BigDecimal.ROUND_DOWN);
                        //划入底池的金额
                        BigDecimal poorAmount = totalAmount.multiply(packageToPoorPercent).setScale(2, BigDecimal.ROUND_DOWN);
                        //实际获取的金额
                        BigDecimal realAmount = totalAmount.subtract(poorAmount);
                        //生成一条资金流水
                        DappFundFlowEntity scoreFlow = new DappFundFlowEntity(
                                memberId,
                                realAmount,
                                FundFlowEnum.SYSTEM_PACKAGE_SALE.getCode(),
                                DappFundFlowEntity.WITHDRAW_STATUS_AGREE,
                                BigDecimal.ZERO);
                        dappFundFlowDao.insert(scoreFlow);
                        dappWalletCoinDao.addTotalAndaddAvailableByMemberId(memberId,realAmount);
                        DappFundFlowEntity feeFlow = new DappFundFlowEntity(
                                memberId,
                                poorAmount.negate(),
                                FundFlowEnum.SYSTEM_PACKAGE_SALE.getCode(),
                                DappFundFlowEntity.WITHDRAW_STATUS_AGREE,
                                BigDecimal.ZERO);
                        dappFundFlowDao.insert(feeFlow);
                        //卖出积分直接销毁。
                        DataDictionaryCustom packageTotalScoreDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                                DataDictionaryEnum.PACKAGE_TOTAL_SCORE.getType(),
                                DataDictionaryEnum.PACKAGE_TOTAL_SCORE.getCode()
                        );
                        BigDecimal avaPackageTotalScore = new BigDecimal(ObjectUtil.isEmpty(packageTotalScoreDic) ? "21000" : packageTotalScoreDic.getValue()).setScale(2, BigDecimal.ROUND_DOWN);
                        //更新USDT底池
                        DataDictionaryCustom packagePoorDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                                DataDictionaryEnum.PACKAGE_POOR.getType(),
                                DataDictionaryEnum.PACKAGE_POOR.getCode()
                        );
                        BigDecimal packagePoor = new BigDecimal(ObjectUtil.isEmpty(packagePoorDic) ? "0" : packagePoorDic.getValue()).setScale(2, BigDecimal.ROUND_DOWN);
                        BigDecimal avaPackagePoor = packagePoor.add(poorAmount);
                        packagePoorDic.setValue(avaPackagePoor.toString());
                        dataDictionaryCustomMapper.updateById(packagePoorDic);
                        //计算当前价格
                        BigDecimal divide = avaPackagePoor.divide(avaPackageTotalScore, 8, BigDecimal.ROUND_DOWN);
                        packageScorePriceDic.setValue(divide.toString());
                        dataDictionaryCustomMapper.updateById(packageScorePriceDic);
                    }
                }
                List<MallAchieveRecord> remainingUsers = mallAchieveRecordList
                        .stream()
                        .sorted(Comparator.comparing(MallAchieveRecord::getAmount).reversed())
                        .skip(100)
                        .collect(Collectors.toList());
                if(CollUtil.isNotEmpty(remainingUsers)){
                    for(MallAchieveRecord mallAchieveRecord : remainingUsers){
                        Long memberId = mallAchieveRecord.getMemberId();
                        DappMemberEntity dappMemberEntity = dappMemberDao.selectById(memberId);
                        BigDecimal balance = dappMemberEntity.getBalance();
                        BigDecimal cnt = balance;
                        dappMemberEntity.setBalance(balance.subtract(cnt));
                        dappMemberDao.updateById(dappMemberEntity);
                        DataDictionaryCustom packageScorePriceDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                                DataDictionaryEnum.PACKAGE_SCORE_PRICE.getType(),
                                DataDictionaryEnum.PACKAGE_SCORE_PRICE.getCode()
                        );
                        BigDecimal packageScorePrice = new BigDecimal(ObjectUtil.isEmpty(packageScorePriceDic) ? "0" : packageScorePriceDic.getValue()).setScale(2, BigDecimal.ROUND_DOWN);
                        //卖出资产乘以价格获取到预期获取的总额
                        BigDecimal totalAmount = cnt.multiply(packageScorePrice).setScale(2, BigDecimal.ROUND_DOWN);
                        //资产包卖出划入底池比例
                        DataDictionaryCustom packageToPoorPercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                                DataDictionaryEnum.PACKAGE_SALE_TO_POOR_PERCENT.getType(),
                                DataDictionaryEnum.PACKAGE_SALE_TO_POOR_PERCENT.getCode()
                        );
                        BigDecimal packageToPoorPercent = new BigDecimal(ObjectUtil.isEmpty(packageToPoorPercentDic) ? "0.1" : packageToPoorPercentDic.getValue()).setScale(2, BigDecimal.ROUND_DOWN);
                        //划入底池的金额
                        BigDecimal poorAmount = totalAmount.multiply(packageToPoorPercent).setScale(2, BigDecimal.ROUND_DOWN);
                        //实际获取的金额
                        BigDecimal realAmount = totalAmount.subtract(poorAmount);
                        //生成一条资金流水
                        DappFundFlowEntity scoreFlow = new DappFundFlowEntity(
                                memberId,
                                realAmount,
                                FundFlowEnum.SYSTEM_PACKAGE_SALE.getCode(),
                                DappFundFlowEntity.WITHDRAW_STATUS_AGREE,
                                BigDecimal.ZERO);
                        dappFundFlowDao.insert(scoreFlow);
                        dappWalletCoinDao.addTotalAndaddAvailableByMemberId(memberId,realAmount);
                        DappFundFlowEntity feeFlow = new DappFundFlowEntity(
                                memberId,
                                poorAmount.negate(),
                                FundFlowEnum.SYSTEM_PACKAGE_SALE.getCode(),
                                DappFundFlowEntity.WITHDRAW_STATUS_AGREE,
                                BigDecimal.ZERO);
                        dappFundFlowDao.insert(feeFlow);
                        //卖出积分回收。
                        DataDictionaryCustom packageTotalScoreDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                                DataDictionaryEnum.PACKAGE_TOTAL_SCORE.getType(),
                                DataDictionaryEnum.PACKAGE_TOTAL_SCORE.getCode()
                        );
                        BigDecimal avaPackageTotalScore = new BigDecimal(ObjectUtil.isEmpty(packageTotalScoreDic) ? "21000" : packageTotalScoreDic.getValue()).setScale(2, BigDecimal.ROUND_DOWN);
                        //更新USDT底池
                        DataDictionaryCustom packagePoorDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                                DataDictionaryEnum.PACKAGE_POOR.getType(),
                                DataDictionaryEnum.PACKAGE_POOR.getCode()
                        );
                        BigDecimal packagePoor = new BigDecimal(ObjectUtil.isEmpty(packagePoorDic) ? "0" : packagePoorDic.getValue()).setScale(2, BigDecimal.ROUND_DOWN);
                        BigDecimal avaPackagePoor = packagePoor.add(poorAmount);
                        packagePoorDic.setValue(avaPackagePoor.toString());
                        dataDictionaryCustomMapper.updateById(packagePoorDic);
                        //计算当前价格
                        BigDecimal divide = avaPackagePoor.divide(avaPackageTotalScore, 8, BigDecimal.ROUND_DOWN);
                        packageScorePriceDic.setValue(divide.toString());
                        dataDictionaryCustomMapper.updateById(packageScorePriceDic);
                    }
                }
            }
        }
        return new FebsResponse().success();
    }
    public static List<List<String>> partitionList(List<String> originalList, int partitionSize) {
        List<List<String>> partitionedList = new ArrayList<>();
        int size = originalList.size();