Helius
2021-09-26 f2e8d9c23748ce7bd19a355098d97860d454401e
add return money
13 files modified
198 ■■■■■ changed files
src/main/java/cc/mrbird/febs/common/configure/RabbitConfigure.java 15 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/common/enumerates/MoneyFlowTypeEnum.java 10 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/entity/AgentInfo.java 3 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/entity/MallMoneyFlow.java 2 ●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/mapper/MallMemberMapper.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java 120 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java 1 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/rabbit/constants/QueueConstants.java 1 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/rabbit/consumer/AgentConsumer.java 22 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/rabbit/enumerates/RabbitQueueEnum.java 4 ●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/rabbit/producter/AgentProducer.java 5 ●●●●● patch | view | raw | blame | history
src/main/resources/mapper/modules/MallMemberMapper.xml 9 ●●●●● patch | view | raw | blame | history
src/test/java/cc/mrbird/febs/AgentTest.java 4 ●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/common/configure/RabbitConfigure.java
@@ -91,4 +91,19 @@
        return BindingBuilder.bind(autoLevelUpAgentQueue()).to(defaultExchange()).with(RouteKeyConstants.ROUTE_KEY_DEFAULT);
    }
    @Bean
    public DirectExchange agentReturnMoneyExchange() {
        return new DirectExchange(RabbitQueueEnum.AGENT_REUTRN_MONEY.getExchange());
    }
    @Bean
    public Queue agentReturnMoneyQueue() {
        return new Queue(QueueConstants.AGENT_RETURN_MONEY);
    }
    @Bean
    public Binding agentReturnMoneyBind() {
        return BindingBuilder.bind(agentReturnMoneyQueue()).to(agentReturnMoneyExchange()).with(RabbitQueueEnum.AGENT_REUTRN_MONEY.getRoute());
    }
}
src/main/java/cc/mrbird/febs/common/enumerates/MoneyFlowTypeEnum.java
@@ -10,11 +10,11 @@
@Getter
public enum MoneyFlowTypeEnum {
    /**
     * 分红
     * 直推奖励
     */
    BONUS(1),
    /**
     * 业绩
     * 团队奖励
     */
    ACHIEVE(2),
    /**
@@ -32,7 +32,11 @@
    /**
     * 提现
     */
    WITHDRAWAL(6);
    WITHDRAWAL(6),
    /**
     * 排名奖励
     */
    RANK(7);
    private final int value;
src/main/java/cc/mrbird/febs/mall/entity/AgentInfo.java
@@ -42,5 +42,6 @@
     * 团队收益 1-指定金额 2-比例
     */
    private Integer teamIncomeType;
    public static final Integer TEAM_INCOME_TYPE_AMOUNT = 1;
    public static final Integer TEAM_INCOME_TYPE_RATIO = 2;
}
src/main/java/cc/mrbird/febs/mall/entity/MallMoneyFlow.java
@@ -19,7 +19,7 @@
    private BigDecimal amount;
    /**
     * 流水类型 1-分红收入 2-业绩奖励 3-订单支付 4-退款 5-转账
     * 流水类型 1-直推奖励 2-团队奖励 3-订单支付 4-退款 5-转账 6-提现 7-排名奖励
     */
    private Integer type;
src/main/java/cc/mrbird/febs/mall/mapper/MallMemberMapper.java
@@ -48,4 +48,6 @@
    List<MallMember> selectChildAgentListByInviteId(@Param("inviteId")String inviteId);
    List<MallMember> selectAllChildAgentListByInviteId(@Param("inviteId")String inviteId);
    List<MallMember> selectMemberParentAgentList(@Param("list") List<String> inviteIds);
}
src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java
@@ -1,13 +1,19 @@
package cc.mrbird.febs.mall.service.impl;
import cc.mrbird.febs.common.enumerates.AgentLevelEnum;
import cc.mrbird.febs.common.enumerates.MoneyFlowTypeEnum;
import cc.mrbird.febs.common.utils.AppContants;
import cc.mrbird.febs.mall.entity.AgentInfo;
import cc.mrbird.febs.mall.entity.DataDictionaryCustom;
import cc.mrbird.febs.mall.entity.MallMember;
import cc.mrbird.febs.mall.entity.MallOrderInfo;
import cc.mrbird.febs.mall.mapper.DataDictionaryCustomMapper;
import cc.mrbird.febs.mall.mapper.MallMemberMapper;
import cc.mrbird.febs.mall.mapper.MallMemberWalletMapper;
import cc.mrbird.febs.mall.mapper.MallOrderInfoMapper;
import cc.mrbird.febs.mall.service.IAgentService;
import cc.mrbird.febs.mall.service.IApiMallMemberService;
import cc.mrbird.febs.mall.service.IApiMallMemberWalletService;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject;
@@ -15,8 +21,14 @@
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * @author wzy
@@ -30,8 +42,11 @@
    private final DataDictionaryCustomMapper dataDictionaryCustomMapper;
    private final MallMemberMapper memberMapper;
    private final MallOrderInfoMapper orderInfoMapper;
    private final IApiMallMemberWalletService memberWalletService;
    private final IApiMallMemberService memberService;
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void autoUpAgentLevel(Long memberId) {
        MallMember member = memberMapper.selectById(memberId);
        if(StrUtil.isBlank(member.getReferrerIds())) {
@@ -110,8 +125,113 @@
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void returnMoneyToAgent(Long orderId) {
        MallOrderInfo orderInfo = orderInfoMapper.selectById(orderId);
        MallMember member = memberMapper.selectById(orderInfo.getMemberId());
        if (StrUtil.isBlank(member.getReferrerIds())) {
            return;
        }
        // 直推奖励
        directReturnMoney(member, orderInfo);
        // 团队奖励
        teamReturnMoney(member, orderInfo);
    }
    /**
     * 直推奖励
     * @param member
     */
    private void directReturnMoney(MallMember member, MallOrderInfo orderInfo) {
        MallMember parent = memberMapper.selectInfoByInviteId(member.getReferrerId());
        if (AgentLevelEnum.FIRST_LEVEL.name().equals(parent.getLevel())) {
            return;
        }
        AgentInfo agentInfo = getAgentInfo(parent.getLevel());
        if (agentInfo == null) {
            return;
        }
        BigDecimal returnMoney = agentInfo.getDirectIncome().divide(BigDecimal.valueOf(100), RoundingMode.UP).multiply(orderInfo.getAmount());
        memberWalletService.addBalance(returnMoney, parent.getId());
        memberService.addMoneyFlow(parent.getId(), returnMoney, MoneyFlowTypeEnum.BONUS.getValue(), orderInfo.getOrderNo(), null, null, orderInfo.getMemberId(), null);
    }
    /**
     * 团队奖励
     *
     */
    public void teamReturnMoney(MallMember member, MallOrderInfo orderInfo) {
        List<String> inviteIds = StrUtil.split(member.getReferrerIds(), ',');
        List<MallMember> agentList = memberMapper.selectMemberParentAgentList(inviteIds);
        if (CollUtil.isEmpty(agentList)) {
            return;
        }
        Map<String, Map<Long, BigDecimal>> needReturn = new HashMap<>();
        for (MallMember mallMember : agentList) {
            String level = mallMember.getLevel();
            Map<Long, BigDecimal> amount = needReturn.get(level);
            if (amount != null) {
//                amount = new HashMap<>();
//                AgentInfo agentInfo = getAgentInfo(level);
//                if (agentInfo == null) {
//                    continue;
//                }
//
//                BigDecimal returnMoney;
//                if (AgentInfo.TEAM_INCOME_TYPE_AMOUNT.equals(agentInfo.getTeamIncomeType())) {
//                    returnMoney = agentInfo.getTeamIncome();
//                } else {
//                    returnMoney = agentInfo.getTeamIncome().divide(BigDecimal.valueOf(100), RoundingMode.UP).multiply(orderInfo.getAmount());
//                }
//                amount.put(mallMember.getId(), returnMoney);
                continue;
            }
            amount = new HashMap<>();
            AgentInfo agentInfo = getAgentInfo(level);
            if (agentInfo == null) {
                continue;
            }
            BigDecimal returnMoney;
            if (AgentInfo.TEAM_INCOME_TYPE_AMOUNT.equals(agentInfo.getTeamIncomeType())) {
                returnMoney = agentInfo.getTeamIncome();
            } else {
                returnMoney = agentInfo.getTeamIncome().divide(BigDecimal.valueOf(100), RoundingMode.UP).multiply(orderInfo.getAmount());
            }
            amount.put(mallMember.getId(), returnMoney);
            needReturn.put(level, amount);
        }
        if(needReturn.isEmpty()) {
           return;
        }
        for (Map.Entry<String, Map<Long, BigDecimal>> entry : needReturn.entrySet()) {
            for (Map.Entry<Long, BigDecimal> amount : entry.getValue().entrySet()) {
                memberWalletService.addBalance(amount.getValue(), amount.getKey());
                memberService.addMoneyFlow(amount.getKey(), amount.getValue(), MoneyFlowTypeEnum.ACHIEVE.getValue(), orderInfo.getOrderNo(), null, null, orderInfo.getMemberId(), null);
            }
        }
    }
    private AgentInfo getAgentInfo(String level) {
        DataDictionaryCustom dic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(AppContants.AGENT_LEVEL_REQUIRE, level);
        if (dic == null) {
            log.info("当前用户父级等级:{}", level);
            return null;
        }
        return JSONObject.parseObject(dic.getValue(), AgentInfo.class);
    }
}
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java
@@ -277,6 +277,7 @@
        this.baseMapper.updateById(orderInfo);
        agentProducer.sendAutoLevelUpMsg(member.getId());
        agentProducer.sendReturnMoneyMsg(orderInfo.getId());
    }
    @Override
src/main/java/cc/mrbird/febs/rabbit/constants/QueueConstants.java
@@ -8,4 +8,5 @@
    public static final String QUEUE_DEFAULT = "queue_default";
    public static final String AGENT_AUTO_LEVEL_UP = "queue_agent_auto_level_up";
    public static final String AGENT_RETURN_MONEY = "queue_agent_return_money";
}
src/main/java/cc/mrbird/febs/rabbit/consumer/AgentConsumer.java
@@ -34,12 +34,30 @@
    @RabbitListener(queues = "queue_order_delay")
    public void orderCancelDelay(String id) {
        log.info("订单超时支付自动取消:{}", id);
        orderInfoService.autoCancelOrder(Long.parseLong(id));
        try {
            orderInfoService.autoCancelOrder(Long.parseLong(id));
        } catch (Exception e) {
            log.error("订单超时支付异常", e);
        }
    }
    @RabbitListener(queues = QueueConstants.AGENT_AUTO_LEVEL_UP)
    public void agentAutoLevelUp(String id) {
        log.info("收到代理自动升级消息:{}", id);
        agentService.autoUpAgentLevel(Long.parseLong(id));
        try {
            agentService.autoUpAgentLevel(Long.parseLong(id));
        } catch (Exception e) {
            log.error("代理自动升级异常", e);
        }
    }
    @RabbitListener(queues = QueueConstants.AGENT_RETURN_MONEY)
    public void agentReturnMoney(String orderId) {
        log.info("收到返利消息:{}", orderId);
        try{
            agentService.returnMoneyToAgent(Long.parseLong(orderId));
        } catch (Exception e) {
            log.error("返利异常", e);
        }
    }
}
src/main/java/cc/mrbird/febs/rabbit/enumerates/RabbitQueueEnum.java
@@ -8,7 +8,9 @@
    DEFAULT("exchange_default", "route_key_default", "queue_default"),
    ORDER_CANCEL_DELAY_TTL("exchange_order_delay_ttl", "route_key_order_delay_ttl", "queue_order_delay_ttl"),
    ORDER_CANCEL_DELAY("exchange_order_delay", "route_key_order_delay", "queue_order_delay");
    ORDER_CANCEL_DELAY("exchange_order_delay", "route_key_order_delay", "queue_order_delay"),
    AGENT_REUTRN_MONEY("exchange_agent_return_money", "route_key_agent_return_money", "queue_agent_return_money");
    private String exchange;
src/main/java/cc/mrbird/febs/rabbit/producter/AgentProducer.java
@@ -71,4 +71,9 @@
        log.info("发送代理自动升级消息:{}", memberId);
        rabbitTemplate.convertAndSend(ExchangeConstants.EXCHANGE_DEFAULT, RouteKeyConstants.ROUTE_KEY_DEFAULT, memberId);
    }
    public void sendReturnMoneyMsg(Long orderId) {
        log.info("发送返利消息:{}", orderId);
        rabbitTemplate.convertAndSend(RabbitQueueEnum.AGENT_REUTRN_MONEY.getExchange(), RabbitQueueEnum.AGENT_REUTRN_MONEY.getRoute(), orderId);
    }
}
src/main/resources/mapper/modules/MallMemberMapper.xml
@@ -139,4 +139,13 @@
    <select id="selectAllChildAgentListByInviteId" resultType="cc.mrbird.febs.mall.entity.MallMember">
        select * from mall_member where  find_in_set(#{inviteId}, referrer_ids)
    </select>
    <select id="selectMemberParentAgentList" resultType="cc.mrbird.febs.mall.entity.MallMember">
        select * from mall_member
        where level != 'FIRST_LEVEL' and  invite_id IN
        <foreach collection = "list" item = "item"  separator=","  open = "(" close = ")" >
            #{item}
        </foreach >
        order by id desc
    </select>
</mapper>
src/test/java/cc/mrbird/febs/AgentTest.java
@@ -71,6 +71,8 @@
    @Test
    public void autoLevelUp() {
        // agentService.autoUpAgentLevel(3L);
        agentProducer.sendAutoLevelUpMsg(3L);
//        agentProducer.sendAutoLevelUpMsg(3L);
        agentProducer.sendReturnMoneyMsg(14L);
    }
}