xiaoyong931011
2023-08-07 c4957c48499e767280485216ef06f769e3ec7908
数据修改
19 files modified
1 files added
651 ■■■■■ changed files
src/main/java/cc/mrbird/febs/dapp/controller/ApiCommonController.java 3 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/entity/DappAccountMoneyChangeEntity.java 10 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/entity/DappFundFlowEntity.java 9 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/entity/TeamLevelPerk.java 54 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/enumerate/DataDictionaryEnum.java 4 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/enumerate/FundFlowEnum.java 12 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/mapper/DappFundFlowDao.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/mapper/DappMemberDao.java 6 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/service/DappSystemService.java 10 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/service/impl/DappMemberServiceImpl.java 2 ●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/service/impl/DappSystemServiceImpl.java 394 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/job/BnbTransferJob.java 20 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/rabbit/QueueConstants.java 10 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/rabbit/QueueEnum.java 8 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/rabbit/RabbitConfiguration.java 34 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/rabbit/consumer/ChainConsumer.java 26 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/rabbit/producer/ChainProducer.java 21 ●●●●● patch | view | raw | blame | history
src/main/resources/mapper/dapp/DappFundFlowDao.xml 9 ●●●●● patch | view | raw | blame | history
src/main/resources/mapper/dapp/DappMemberDao.xml 16 ●●●● patch | view | raw | blame | history
src/main/resources/mapper/dapp/MallAchieveRecordMapper.xml 1 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/controller/ApiCommonController.java
@@ -36,9 +36,6 @@
public class ApiCommonController {
    private final DappMemberService dappMemberService;
    private final DappSystemService dappSystemService;
    @Autowired
    private ChainProducer chainProducer;
    @ApiOperation(value = "地址是否存在", notes = "地址是否存在")
    @GetMapping(value = "/exist/{address}")
src/main/java/cc/mrbird/febs/dapp/entity/DappAccountMoneyChangeEntity.java
@@ -19,19 +19,13 @@
    public DappAccountMoneyChangeEntity() {
    }
    public DappAccountMoneyChangeEntity(Long memberId, BigDecimal preAmount, BigDecimal amount, BigDecimal afterAmount, String content, Integer type) {
    public DappAccountMoneyChangeEntity(Long memberId, BigDecimal preAmount, BigDecimal amount, BigDecimal afterAmount, Integer type, String content) {
        this.memberId = memberId;
        this.preAmount = preAmount;
        this.amount = amount;
        this.afterAmount = afterAmount;
        this.content = content;
        this.type = type;
        this.setCreateBy("system");
        this.setUpdateBy("system");
        this.setCreateTime(new Date());
        this.setUpdateTime(new Date());
        this.setVersion(1);
        this.content = content;
    }
    private Long memberId;
src/main/java/cc/mrbird/febs/dapp/entity/DappFundFlowEntity.java
@@ -73,6 +73,15 @@
        this.systemProfitId = systemProfitId;
    }
    public DappFundFlowEntity(Long memberId, BigDecimal amount, Integer type, Integer status, BigDecimal fee, Long systemProfitId) {
        this.memberId = memberId;
        this.amount = amount;
        this.type = type;
        this.status = status;
        this.fee = fee;
        this.systemProfitId = systemProfitId;
    }
    private Long memberId;
    private BigDecimal amount;
src/main/java/cc/mrbird/febs/dapp/entity/TeamLevelPerk.java
New file
@@ -0,0 +1,54 @@
package cc.mrbird.febs.dapp.entity;
import lombok.Data;
import java.math.BigDecimal;
/**
 * shareSpeedPercent 共享区加速百分比
 * shareMaxPercent 共享区加速最大值
 * smallAchieve    升级要求业绩
 * teamPercent      团队静态收益
 * orderSalePercent 全网销售额加权平分分红
 *  {"shareMinPercent":"0.00004","shareMaxPercent":"0.01","smallAchieve":"20000","teamPercent":"0.15","orderSalePercent":"0"}
 *  {"shareMinPercent":"0.00005","shareMaxPercent":"0.012","smallAchieve":"60000","teamPercent":"0.3","orderSalePercent":"0"}
 *  {"shareMinPercent":"0.00006","shareMaxPercent":"0.014","smallAchieve":"200000","teamPercent":"0.45","orderSalePercent":"0"}
 *  {"shareMinPercent":"0.00007","shareMaxPercent":"0.016","smallAchieve":"600000","teamPercent":"0.60","orderSalePercent":"0"}
 *  {"shareMinPercent":"0.00008","shareMaxPercent":"0.018","smallAchieve":"2000000","teamPercent":"0.75","orderSalePercent":"0.02"}
 *  {"shareMinPercent":"0.00009","shareMaxPercent":"0.020","smallAchieve":"6000000","teamPercent":"0.90","orderSalePercent":"0.02"}
 *  {"shareMinPercent":"0.0001","shareMaxPercent":"0.022","smallAchieve":"20000000","teamPercent":"1","orderSalePercent":"0.02"}
 */
@Data
public class TeamLevelPerk {
    /**
     * 共享区加速百分比
     */
    private BigDecimal shareMinPercent;
    /**
     * 共享区加速最大值
     */
    private BigDecimal shareMaxPercent;
    /**
     * 升级要求业绩
     */
    private BigDecimal smallAchieve;
    /**
     * 团队静态收益
     */
    private BigDecimal teamPercent;
    /**
     * 全网销售额加权平分分红
     */
    private BigDecimal orderSalePercent;
    /**
     * 上一级代理数量
     */
    private Integer lastAgentCnt;
    /**
     * 购买上限
     */
    private Integer buyMaxAmount;
}
src/main/java/cc/mrbird/febs/dapp/enumerate/DataDictionaryEnum.java
@@ -5,6 +5,10 @@
@Getter
public enum DataDictionaryEnum {
    /**
     *  商城入单的10%入底池
     */
    TEAM_PERK_LEVEL_EQUALS("TEAM_PERK_LEVEL_EQUALS","TEAM_PERK_LEVEL_EQUALS"),
    /**
     * shareSpeedPercent 共享区加速百分比
     * shareMaxPercent 共享区加速最大值
     * smallAchieve    升级要求业绩
src/main/java/cc/mrbird/febs/dapp/enumerate/FundFlowEnum.java
@@ -7,7 +7,17 @@
 */
@Getter
public enum FundFlowEnum {
    //赠送积分
    //团队静态收益
    TEAM_PERK("TEAM_PERK", 7),
    //直推
    DIRECT_AMOUNT("DIRECT_AMOUNT", 6),
    //增加余额
    ADD_AMOUNT("ADD_AMOUNT", 5),
    //减少赠送积分
    REDUCE_SCORE("REDUCE_SCORE", 4),
    //静态补贴
    STATIC_RELEASE("STATIC_RELEASE", 3),
    //支付订单
    PAY_ORDER("PAY_ORDER", 2),
    //赠送积分
    DONATE_SCORE("DONATE_SCORE", 1);
src/main/java/cc/mrbird/febs/dapp/mapper/DappFundFlowDao.java
@@ -55,4 +55,6 @@
    BigDecimal selectSumAmountByType(@Param("type")int code);
    IPage<AdminMallMoneyFlowVo> selectOrderMoneyFlowInPage(Page<AdminMallMoneyFlowVo> page, @Param("record")MallOrderInfo mallOrder);
    List<DappFundFlowEntity> selectListByMemberIdAndTypeAndDate(@Param("memberId")Long memberId, @Param("type")int code, @Param("dateStr")String now);
}
src/main/java/cc/mrbird/febs/dapp/mapper/DappMemberDao.java
@@ -92,4 +92,10 @@
    DappMemberEntity selectInviteRight(@Param("inviteId")String inviteId);
    List<DappMemberEntity> selectMemberByActiveStatus();
    BigDecimal selectAchieveRecordByInviteId(@Param("inviteId")String inviteId);
    List<DappMemberEntity> selectChildAgentList(@Param("inviteId")String inviteId, @Param("accountType")String accountType);
    List<MallMember> selectMemberByInviteIds(List<String> referrerIdList);
}
src/main/java/cc/mrbird/febs/dapp/service/DappSystemService.java
@@ -106,4 +106,14 @@
    void speedAutoLevelUpMsg(Long memberId);
    void memberPerk();
    void speedAutoLevelUpTeamMsg(Long memberId);
    BigDecimal getRealNum(Long memberId,BigDecimal amount);
    void directMemberPerk();
    void speedDirectPerkMsg(Long memberId);
    void teamStaticPerk();
}
src/main/java/cc/mrbird/febs/dapp/service/impl/DappMemberServiceImpl.java
@@ -946,7 +946,7 @@
         * todo 发送一条订单出的消息
         */
        chainProducer.sendSpeedPayOrderMsg(id);
        chainProducer.sendAutoLevelUpMsg(member.getId());
        chainProducer.sendAutoLevelUpTeamMsg(member.getId());
    }
    public static List<List<String>> partitionList(List<String> originalList, int partitionSize) {
src/main/java/cc/mrbird/febs/dapp/service/impl/DappSystemServiceImpl.java
@@ -76,6 +76,7 @@
    private final MallOrderInfoMapper mallOrderInfoMapper;
    private final MallAchieveRecordMapper mallAchieveRecordMapper;
    private final DappAccountMoneyChangeDao dappAccountMoneyChangeDao;
@@ -2562,29 +2563,402 @@
        }
        for(DappMemberEntity dappMemberEntity :  dappMemberEntityList){
            if(1 != dappMemberEntity.getActiveStatus()){
                break;
                continue;
            }
            List<MallAchieveRecord> mallAchieveRecords = mallAchieveRecordMapper.selectListByMemberId(dappMemberEntity.getId());
            Long perkMemberId = dappMemberEntity.getId();
            //获取当前用户所有进行中的业绩释放
            List<MallAchieveRecord> mallAchieveRecords = mallAchieveRecordMapper.selectListByMemberId(perkMemberId);
            if(CollUtil.isEmpty(mallAchieveRecords)){
                continue;
            }
            /**
             * 按照订单、比例生成对应的静态释放
             */
            for(MallAchieveRecord mallAchieveRecord : mallAchieveRecords){
                //释放总额
                BigDecimal costAmount = mallAchieveRecord.getCostAmount();
                //剩余
                BigDecimal amount = mallAchieveRecord.getAmount();
                if(BigDecimal.ZERO.compareTo(amount) >= 0){
                    mallAchieveRecord.setIsNormal(2);
                    mallAchieveRecordMapper.updateById(mallAchieveRecord);
                    continue;
                }
                //每日释放金额
                BigDecimal eachDayPerk = costAmount.multiply(staticRelease).setScale(2,BigDecimal.ROUND_DOWN);
                /**
                 * 生成一条静态补贴的流水
                 * 增加账户余额
                 * 生成减少赠送积分流水
                 * 减少账户的赠送积分
                 * 业绩记录减少实际业绩amount
                 *
                 */
                if(eachDayPerk.compareTo(amount) >= 0){
                    eachDayPerk = amount;
                    mallAchieveRecord.setIsNormal(2);
                }
                DappMemberEntity mallAchieveMemberEntity = dappMemberDao.selectById(mallAchieveRecord.getMemberId());
                sendPerk(mallAchieveMemberEntity,eachDayPerk,mallAchieveRecord.getOrderId(),FundFlowEnum.STATIC_RELEASE.getCode());
                //实时更新用户等级
                chainProducer.sendAutoLevelUpTeamMsg(perkMemberId);
            }
        }
    }
    @Override
    public void speedAutoLevelUpTeamMsg(Long memberId) {
        DappMemberEntity member = dappMemberDao.selectById(memberId);
        if(StrUtil.isBlank(member.getRefererIds())) {
            return;
        }
        List<String> ids = StrUtil.split(member.getRefererIds(), ',');
        List<DappMemberEntity> parentMembers = dappMemberDao.selectByInviteIds(ids);
        for (DappMemberEntity parent : parentMembers) {
            //V7不能再升级了
            if (MemberLevelEnum.V7.getType().equals(member.getAccountType())) {
                continue;
            }
            String nextLevelName = MemberLevelEnum.MEMBER.getNextLevel(parent.getAccountType());
            DataDictionaryCustom newLevelDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode("TEAM_LEVEL", nextLevelName);
            if(ObjectUtil.isEmpty(newLevelDic)){
                continue;
            }
            TeamLevelPerk teamLevelPerk = JSONObject.parseObject(newLevelDic.getValue(), TeamLevelPerk.class);
            //需要判断小区业绩
            if( MemberLevelEnum.V1.getType().equals(nextLevelName)){
                if (!teamAchieve(parent, teamLevelPerk)) {
                    continue;
                }
            }else{
                if (!agentCntFinish(parent, teamLevelPerk)) {
                    continue;
                }
                if (!teamAchieveOther(parent, teamLevelPerk)) {
                    continue;
                }
            }
            parent.setAccountType(nextLevelName);
            dappMemberDao.updateById(parent);
        }
    }
    /**
     * 判断下级代理数量是否达标
     *
     * @return
     */
    private boolean agentCntFinish(DappMemberEntity member,TeamLevelPerk teamLevelPerk) {
        if (teamLevelPerk.getLastAgentCnt() == null || teamLevelPerk.getLastAgentCnt() == 0) {
            return true;
        }
        // 直推用户
        List<DappMemberEntity> directMember = dappMemberDao.selectMemberInfoByRefererId(member.getInviteId());
        if (CollUtil.isEmpty(directMember)) {
            return false;
        }
        // 用户团队达到指定代理数量,且都不在同一条线
        int i = 0;
        for (DappMemberEntity child : directMember) {
            List<DappMemberEntity> mallMembers = dappMemberDao.selectChildAgentList(child.getInviteId(), member.getAccountType());
            if (CollUtil.isNotEmpty(mallMembers)) {
                i++;
            }
        }
        if (i >= teamLevelPerk.getLastAgentCnt()) {
            return true;
        }
        log.info("用户:{}代理数量未达标, 当前等级:{}, 当前数量:{}, 目标数量:{}", member.getAddress(), member.getAccountType(), i, teamLevelPerk.getLastAgentCnt());
        return false;
    }
    /**
     * 团队业绩是否达标
     *  除去直属的最大的一个业绩团队,剩余的所有业绩之和
     */
    private boolean teamAchieveOther(DappMemberEntity member, TeamLevelPerk teamLevelPerk ) {
        BigDecimal teamIncome = teamLevelPerk.getSmallAchieve();
        //总业绩
        BigDecimal teamIncomeMax = BigDecimal.ZERO;
        //所有直推团队,就是这个会员的所有区域的业绩。
        // 直推用户
        List<DappMemberEntity> childs = dappMemberDao.selectMemberInfoByRefererId(member.getInviteId());
        List<String> childsInviteIds = childs.stream().map(DappMemberEntity::getInviteId).collect(Collectors.toList());
        for(String inviteId : childsInviteIds){
            BigDecimal totalIncomeMember = dappMemberDao.selectAchieveRecordByInviteId(inviteId);
            teamIncomeMax = teamIncomeMax.add(totalIncomeMember);
        }
        if (teamIncomeMax.compareTo(teamIncome) >= 0) {
            return true;
        }
        log.info("用户:{}团队业绩未达标, 当前等级:{}, 当前业绩:{}, 目标业绩:{}", member.getAddress(), member.getAccountType(), teamIncomeMax, teamIncome);
        return false;
    }
    /**
     * 团队业绩是否达标
     *  除去直属的最大的一个业绩团队,剩余的所有业绩之和
     */
    private boolean teamAchieve(DappMemberEntity member, TeamLevelPerk teamLevelPerk ) {
        BigDecimal teamIncome = teamLevelPerk.getSmallAchieve();
        //业绩集合
        List<BigDecimal> list = new ArrayList<>();
        //总业绩
        BigDecimal teamIncomeMax = BigDecimal.ZERO;
        //所有直推团队,就是这个会员的所有区域的业绩。
        // 直推用户
        List<DappMemberEntity> childs = dappMemberDao.selectMemberInfoByRefererId(member.getInviteId());
        List<String> childsInviteIds = childs.stream().map(DappMemberEntity::getInviteId).collect(Collectors.toList());
        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);
        if (teamIncomeMax.compareTo(teamIncome) >= 0) {
            return true;
        }
        log.info("用户:{}团队业绩未达标, 当前等级:{}, 当前业绩:{}, 目标业绩:{}", member.getAddress(), member.getAccountType(), teamIncomeMax, teamIncome);
        return false;
    }
    @Override
    public BigDecimal getRealNum(Long memberId, BigDecimal amount) {
        BigDecimal returnAmount = BigDecimal.ZERO;
        DappWalletMineEntity dappWalletMineEntity = dappWalletMineDao.selectByMemberId(memberId);
        BigDecimal totalScore = dappWalletMineEntity.getTotalAmount();
        if(totalScore.compareTo(amount) >= 0){
            returnAmount = amount;
        }else{
            returnAmount = totalScore;
        }
        return returnAmount;
    }
    @Override
    public void directMemberPerk() {
        List<DappMemberEntity> dappMemberEntityList = dappMemberDao.selectMemberByActiveStatus();
        if(CollUtil.isEmpty(dappMemberEntityList)){
            return;
        }
        /**
         * 直推消费分享:享受直接分享人每日消费金额释放的100%加速;
         */
        for(DappMemberEntity dappMemberEntity : dappMemberEntityList){
            Long memberId = dappMemberEntity.getId();
            String inviteId = dappMemberEntity.getInviteId();
            //该用户全部的直推用户
            List<DappMemberEntity> dappMemberEntities = dappMemberDao.selectChildMemberDirectOrNot(inviteId, 1, 1);
            for(DappMemberEntity directMember : dappMemberEntities){
                Long directMemberId = directMember.getId();
                chainProducer.sendDirectPerkMsg(directMemberId);
            }
        }
    }
    @Override
    public void speedDirectPerkMsg(Long memberId) {
        DappMemberEntity dappMemberEntity = dappMemberDao.selectById(memberId);
        if(1 != dappMemberEntity.getActiveStatus()){
            return;
        }
        DataDictionaryCustom directReleaseDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                DataDictionaryEnum.DIRECT_RELEASE.getType(),
                DataDictionaryEnum.DIRECT_RELEASE.getCode()
        );
        if(ObjectUtil.isEmpty(directReleaseDic)){
            return;
        }
        BigDecimal directRelease = new BigDecimal(directReleaseDic.getValue() == null ? "0" : directReleaseDic.getValue());
        if(BigDecimal.ZERO.compareTo(directRelease) >= 0){
            return;
        }
        DappMemberEntity parentMember = dappMemberDao.selectMemberInfoByInviteId(dappMemberEntity.getRefererId());
        /**
         * 获取用户前一天的所有返利记录
         */
        List<DappFundFlowEntity> dappFundFlowEntities = dappFundFlowDao.selectListByMemberIdAndTypeAndDate(memberId,
                FundFlowEnum.STATIC_RELEASE.getCode(),DateUtil.now());
        for(DappFundFlowEntity dappFundFlowEntity : dappFundFlowEntities){
            BigDecimal staticReleaseAmount = dappFundFlowEntity.getAmount();
            BigDecimal directReleaseAmount = staticReleaseAmount.multiply(directRelease).setScale(2, BigDecimal.ROUND_DOWN);
            sendPerk(parentMember,directReleaseAmount,dappFundFlowEntity.getSystemProfitId(),FundFlowEnum.DIRECT_AMOUNT.getCode());
        }
    }
    @Override
    public void teamStaticPerk() {
        List<DappMemberEntity> dappMemberEntities = dappMemberDao.selectMemberByAccountType(MemberLevelEnum.V1.getType());
        if(CollUtil.isEmpty(dappMemberEntities)){
            return;
        }
        //平级
        DataDictionaryCustom teamPerkEqualsDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                DataDictionaryEnum.TEAM_PERK_LEVEL_EQUALS.getType(),
                DataDictionaryEnum.TEAM_PERK_LEVEL_EQUALS.getCode());
        BigDecimal teamPerkEquals = new BigDecimal(ObjectUtil.isEmpty(teamPerkEqualsDic) ? "0.1" : teamPerkEqualsDic.getValue());
        DataDictionaryCustom staticReleaseDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                DataDictionaryEnum.STATIC_RELEASE.getType(),
                DataDictionaryEnum.STATIC_RELEASE.getCode());
        BigDecimal staticRelease = new BigDecimal(ObjectUtil.isEmpty(staticReleaseDic) ? "0.006" : staticReleaseDic.getValue());
        for(DappMemberEntity dappMemberEntity : dappMemberEntities){
            if(StrUtil.isNotEmpty(dappMemberEntity.getRefererIds())){
                String referrerIds = dappMemberEntity.getRefererIds();
                List<String> referrerIdList = StrUtil.splitTrim(referrerIds, ",");
                if(CollUtil.isNotEmpty(referrerIdList)){
                    List<DappMemberEntity> mallMemberTeamPerk = dappMemberDao.selectByInviteIds(referrerIdList);
                    if(CollUtil.isNotEmpty(mallMemberTeamPerk)){
                        String levelNormal = MemberLevelEnum.V1.getType();
                        BigDecimal cashPercentNormal = BigDecimal.ZERO;
                        for(DappMemberEntity teamPerkMember : mallMemberTeamPerk){
                            String level = teamPerkMember.getAccountType();
                            //比较两个级别的大小,level大于levelNormal返回1
                            int compareMin = MemberLevelEnum.V1.compareLevel(level, levelNormal);
                            int compareMax = MemberLevelEnum.V1.compareLevel(MemberLevelEnum.V7.getType(), level);
                            if(compareMin >= 1 && compareMax >= 1){
                                DataDictionaryCustom teamPerkMemberDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                                        "TEAM_LEVEL", level);
                                TeamLevelPerk adminAgentInfo = JSONObject.parseObject(teamPerkMemberDic.getValue(), TeamLevelPerk.class);
                                BigDecimal cashPercent = adminAgentInfo.getTeamPercent();
                                //极差
                                if(MemberLevelEnum.V1.compareLevel(levelNormal, level) == 0){
                                    //平级
                                    cashPercent = cashPercent.subtract(teamPerkEquals);
                                }else{
                                    cashPercent = cashPercent.subtract(cashPercentNormal);
                                }
                                //总业绩
                                BigDecimal teamIncomeMax = BigDecimal.ZERO;
                                //所有直推团队,就是这个会员的所有区域的业绩。
                                // 直推用户
                                List<DappMemberEntity> childs = dappMemberDao.selectMemberInfoByRefererId(teamPerkMember.getInviteId());
                                List<String> childsInviteIds = childs.stream().map(DappMemberEntity::getInviteId).collect(Collectors.toList());
                                for(String inviteId : childsInviteIds){
                                    BigDecimal totalIncomeMember = dappMemberDao.selectAllAchieveByInviteId(inviteId);
                                    teamIncomeMax = teamIncomeMax.add(totalIncomeMember);
                                }
                                if(BigDecimal.ZERO.compareTo(teamIncomeMax) >= 0){
                                    continue;
                                }
                                //V1加速团队静态收益的15%=每日静态的20000*6‰*15%=18元的额外释放加速
                                BigDecimal cashAmount = teamIncomeMax.multiply(cashPercent).multiply(staticRelease).setScale(2, BigDecimal.ROUND_DOWN);
                                BigDecimal bigDecimal = sendPerk(teamPerkMember, cashAmount, null, FundFlowEnum.TEAM_PERK.getCode());
                                levelNormal = level;
                                cashPercentNormal = adminAgentInfo.getTeamPercent();
                            }
                        }
                    }
                }
            }
        }
    }
    private BigDecimal sendPerk(DappMemberEntity parentMember,BigDecimal directReleaseAmount,Long orderId
                ,Integer fundFlowEnumType){
        BigDecimal realScoreReduce = BigDecimal.ZERO;
        //用户减少赠送积分
        DappWalletMineEntity dappWalletMineEntity = dappWalletMineDao.selectByMemberId(parentMember.getId());
        BigDecimal totalScore = dappWalletMineEntity.getTotalAmount();
        BigDecimal availableScore = dappWalletMineEntity.getAvailableAmount();
        if(BigDecimal.ZERO.compareTo(totalScore) >= 0){
            parentMember.setActiveStatus(2);
            dappMemberDao.updateById(parentMember);
            return realScoreReduce;
        }
        if(directReleaseAmount.compareTo(totalScore) > 0){
            realScoreReduce = totalScore;
        }else{
            realScoreReduce = directReleaseAmount;
        }
        BigDecimal totalScoreRelease = totalScore.subtract(realScoreReduce);
        BigDecimal availableScoreRelease = availableScore.subtract(realScoreReduce);
        //更新积分账户
        dappWalletMineEntity.setTotalAmount(totalScoreRelease);
        dappWalletMineEntity.setAvailableAmount(availableScoreRelease);
        dappWalletMineDao.updateById(dappWalletMineEntity);
        //插入积分流水
        DappFundFlowEntity scoreFlow = new DappFundFlowEntity(
                parentMember.getId(),
                realScoreReduce.negate(),
                FundFlowEnum.REDUCE_SCORE.getCode(),
                DappFundFlowEntity.WITHDRAW_STATUS_AGREE,
                BigDecimal.ZERO,
                orderId);
        dappFundFlowDao.insert(scoreFlow);
        DappAccountMoneyChangeEntity reduceScoreAMC = new DappAccountMoneyChangeEntity(
                parentMember.getId(),
                totalScore,
                realScoreReduce.negate(),
                totalScoreRelease,
                FundFlowEnum.REDUCE_SCORE.getCode(),
                orderId.toString());
        dappAccountMoneyChangeDao.insert(reduceScoreAMC);
        //生成一条静态补贴的流水
        DappFundFlowEntity realUsdtAmountFlow = new DappFundFlowEntity(
                parentMember.getId(),
                realScoreReduce,
                fundFlowEnumType,
                DappFundFlowEntity.WITHDRAW_STATUS_AGREE,
                BigDecimal.ZERO,
                orderId);
        dappFundFlowDao.insert(realUsdtAmountFlow);
        //用户增加余额
        DappWalletCoinEntity dappWalletCoinEntity = dappWalletCoinDao.selectByMemberId(parentMember.getId());
        BigDecimal totalAmount = dappWalletCoinEntity.getTotalAmount();
        BigDecimal availableAmount = dappWalletCoinEntity.getAvailableAmount();
        BigDecimal totalAmountRelease = totalAmount.add(realScoreReduce);
        BigDecimal availableAmountRelease = availableAmount.add(realScoreReduce);
        //更新余额账户
        dappWalletCoinEntity.setTotalAmount(totalAmountRelease);
        dappWalletCoinEntity.setAvailableAmount(availableAmountRelease);
        dappWalletCoinDao.updateById(dappWalletCoinEntity);
        //插入余额流水
        DappFundFlowEntity amountFlow = new DappFundFlowEntity(
                parentMember.getId(),
                realScoreReduce,
                FundFlowEnum.ADD_AMOUNT.getCode(),
                DappFundFlowEntity.WITHDRAW_STATUS_AGREE,
                BigDecimal.ZERO,
                orderId);
        dappFundFlowDao.insert(amountFlow);
        DappAccountMoneyChangeEntity addAmountAMC = new DappAccountMoneyChangeEntity(
                parentMember.getId(),
                totalAmount,
                realScoreReduce,
                totalAmountRelease,
                FundFlowEnum.ADD_AMOUNT.getCode(),
                orderId.toString());
        dappAccountMoneyChangeDao.insert(addAmountAMC);
        return realScoreReduce;
    }
    /**
     * 测试转账
     * @param args
src/main/java/cc/mrbird/febs/job/BnbTransferJob.java
@@ -34,9 +34,27 @@
     * (设置多少,全部按照最新的来释放)
     */
    @Scheduled(cron = "0 0 0 * * ?")
    public void aKlineJobDay() {
    public void memberPerk() {
        dappSystemService.memberPerk();
    }
    /**
     * 直推消费分享:享受直接分享人每日消费金额释放的100%加速;
     */
    @Scheduled(cron = "0 0 0 * * ?")
    public void directMemberPerk() {
        dappSystemService.directMemberPerk();
    }
    /**
     * 加速团队静态收益的70%(业绩全算)
     * 加速团队静态收益为极差制,平级10%
     * 如V1加速团队静态收益的15%=每日静态的20000*6‰*15%=18元的额外释放加速
     */
    @Scheduled(cron = "0 0 0 * * ?")
    public void teamStaticPerk() {
        dappSystemService.teamStaticPerk();
    }
}
src/main/java/cc/mrbird/febs/rabbit/QueueConstants.java
@@ -7,6 +7,16 @@
public class QueueConstants {
    /**
     * speed 直推返利
     */
    public static final String QUEUE_SPEED_DIRECT_PERK = "queue_speed_direct_perk";
    /**
     * speed 代理升级
     */
    public static final String QUEUE_SPEED_LEVEL_UP_TEAM = "queue_speed_level_up_team";
    /**
     * speed 代理升级
     */
    public static final String QUEUE_SPEED_LEVEL_UP = "queue_speed_level_up";
src/main/java/cc/mrbird/febs/rabbit/QueueEnum.java
@@ -6,6 +6,14 @@
@Getter
public enum QueueEnum {
    /**
     * speed 直推返利
     */
    SPEED_DIRECT_PERK("exchange_speed_direct_perk", "route_key_speed_direct_perk", QueueConstants.QUEUE_SPEED_DIRECT_PERK),
    /**
     * speed 代理升级
     */
    SPEED_LEVEL_UP_TEAM("exchange_speed_level_up_team", "route_key_speed_level_up_team", QueueConstants.QUEUE_SPEED_LEVEL_UP_TEAM),
    /**
     * speed 代理升级
     */
    SPEED_LEVEL_UP("exchange_speed_level_up", "route_key_speed_level_up", QueueConstants.QUEUE_SPEED_LEVEL_UP),
src/main/java/cc/mrbird/febs/rabbit/RabbitConfiguration.java
@@ -62,4 +62,38 @@
        return BindingBuilder.bind(speedLevelUpQueue()).to(speedLevelUpExchange()).with(QueueEnum.SPEED_LEVEL_UP.getRoute());
    }
    // === speed 代理升级  end ===
    // === speed 代理升级  start ===
    @Bean
    public DirectExchange speedLevelUpTeamExchange() {
        return new DirectExchange(QueueEnum.SPEED_LEVEL_UP.getExchange());
    }
    @Bean
    public Queue speedLevelUpTeamQueue() {
        return new Queue(QueueEnum.SPEED_LEVEL_UP.getQueue());
    }
    @Bean
    public Binding speedLevelUpTeamBind() {
        return BindingBuilder.bind(speedLevelUpTeamQueue()).to(speedLevelUpTeamExchange()).with(QueueEnum.SPEED_LEVEL_UP_TEAM.getRoute());
    }
    // === speed 代理升级  end ===
    // === speed 直推返利  start ===
    @Bean
    public DirectExchange speedDirectPerkExchange() {
        return new DirectExchange(QueueEnum.SPEED_DIRECT_PERK.getExchange());
    }
    @Bean
    public Queue speedDirectPerkQueue() {
        return new Queue(QueueEnum.SPEED_DIRECT_PERK.getQueue());
    }
    @Bean
    public Binding speedDirectPerkBind() {
        return BindingBuilder.bind(speedDirectPerkQueue()).to(speedDirectPerkExchange()).with(QueueEnum.SPEED_DIRECT_PERK.getRoute());
    }
    // === speed 代理升级  end ===
}
src/main/java/cc/mrbird/febs/rabbit/consumer/ChainConsumer.java
@@ -39,6 +39,19 @@
    /**
     * speed 代理升级
     */
    @RabbitListener(queues = QueueConstants.QUEUE_SPEED_LEVEL_UP_TEAM)
    public void speedAutoLevelUpTeamMsg(Long memberId) {
        log.info("speedAutoLevelUpTeamMsg:{}", memberId);
        try {
            dappSystemService.speedAutoLevelUpTeamMsg(memberId);
        } catch (Exception e) {
            log.error("speedAutoLevelUpTeamErr:", e);
        }
    }
    /**
     * speed 代理升级
     */
    @RabbitListener(queues = QueueConstants.QUEUE_SPEED_LEVEL_UP)
    public void speedAutoLevelUpMsg(Long memberId) {
        log.info("speedAutoLevelUpMsg:{}", memberId);
@@ -48,4 +61,17 @@
            log.error("speedAutoLevelUpErr:", e);
        }
    }
    /**
     * speed 直推返利
     */
    @RabbitListener(queues = QueueConstants.QUEUE_SPEED_DIRECT_PERK)
    public void speedDirectPerkMsg(Long memberId) {
        log.info("speedDirectPerkMsg:{}", memberId);
        try {
            dappSystemService.speedDirectPerkMsg(memberId);
        } catch (Exception e) {
            log.error("speedDirectPerkErr:", e);
        }
    }
}
src/main/java/cc/mrbird/febs/rabbit/producer/ChainProducer.java
@@ -50,10 +50,31 @@
     * speed 代理升级
     * @param memberId
     */
    public void sendAutoLevelUpTeamMsg(@NotNull Long memberId) {
        log.info("sendAutoLevelUpTeamMsg:{}", memberId);
        CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString());
        rabbitTemplate.convertAndSend(QueueEnum.SPEED_LEVEL_UP_TEAM.getExchange(), QueueEnum.SPEED_LEVEL_UP_TEAM.getRoute(), memberId, correlationData);
    }
    /**
     * speed 代理升级
     * @param memberId
     */
    public void sendAutoLevelUpMsg(@NotNull Long memberId) {
        log.info("sendAutoLevelUpMsg:{}", memberId);
        CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString());
        rabbitTemplate.convertAndSend(QueueEnum.SPEED_LEVEL_UP.getExchange(), QueueEnum.SPEED_LEVEL_UP.getRoute(), memberId, correlationData);
    }
    /**
     * speed 直推返利
     */
    public void sendDirectPerkMsg(@NotNull Long memberId) {
        log.info("sendDirectPerkMsg:{}", memberId);
        CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString());
        rabbitTemplate.convertAndSend(QueueEnum.SPEED_DIRECT_PERK.getExchange(), QueueEnum.SPEED_DIRECT_PERK.getRoute(), memberId, correlationData);
    }
}
src/main/resources/mapper/dapp/DappFundFlowDao.xml
@@ -179,4 +179,13 @@
        where a.system_profit_id = #{record.id}
        order by a.CREATE_TIME desc
    </select>
    <select id="selectListByMemberIdAndTypeAndDate" resultType="cc.mrbird.febs.dapp.entity.DappFundFlowEntity">
        select * from dapp_fund_flow
        where
              member_id = #{memberId}
          and date_format(create_time, '%Y-%m-%d') = date_format(#{dateStr}, '%Y-%m-%d')
          and type = #{type}
          and status = 2
    </select>
</mapper>
src/main/resources/mapper/dapp/DappMemberDao.xml
@@ -237,8 +237,8 @@
    </select>
    <select id="selectAllAchieveByInviteId" resultType="java.math.BigDecimal">
        select IFNULL(sum(IFNULL(a.achieve_amount, 0)),0)
        from dapp_usdt_perk a
        select IFNULL(sum(IFNULL(a.amount, 0)),0)
        from mall_achieve_record a
        inner join dapp_member b on a.member_id = b.id
        where find_in_set(#{inviteId}, b.referer_ids) or b.invite_id = #{inviteId}
    </select>
@@ -313,4 +313,16 @@
    <select id="selectMemberByActiveStatus" resultType="cc.mrbird.febs.dapp.entity.DappMemberEntity">
        select * from dapp_member where active_status = 1
    </select>
    <select id="selectAchieveRecordByInviteId" resultType="java.math.BigDecimal">
        select IFNULL(sum(IFNULL(a.amount, 0)),0)
        from mall_achieve_record a
                 inner join dapp_member b on a.member_id = b.id
        where find_in_set(#{inviteId}, b.referer_ids) or b.invite_id = #{inviteId}
    </select>
    <select id="selectChildAgentList" resultType="cc.mrbird.febs.dapp.entity.DappMemberEntity">
        select * from dapp_member
        where (find_in_set(#{inviteId}, referer_ids) or invite_id=#{inviteId}) and account_type=#{accountType}
    </select>
</mapper>
src/main/resources/mapper/dapp/MallAchieveRecordMapper.xml
@@ -40,6 +40,7 @@
    <select id="selectListByMemberId" resultType="cc.mrbird.febs.dapp.entity.MallAchieveRecord">
        select * from mall_achieve_record
        where member_id = #{memberId}
        and is_normal = 1
        order by CREATE_TIME asc
    </select>