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); } }