fix
Hentua
2023-04-25 53527ce48ac92c402e4c83daa93c3017a71842af
fix
2 files added
7 files modified
195 ■■■■ changed files
src/main/java/cc/mrbird/febs/common/enumerates/MoneyFlowTypeEnum.java 5 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/entity/MallBonusRecord.java 27 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/entity/MallSystemSetting.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/mapper/MallBonusRecordMapper.java 7 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java 3 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java 132 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/rabbit/consumer/AgentConsumer.java 2 ●●● patch | view | raw | blame | history
src/test/java/cc/mrbird/febs/AgentTest.java 15 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/common/enumerates/MoneyFlowTypeEnum.java
@@ -42,6 +42,11 @@
    BUY_TC(6),
    /**
     * 推荐奖
     */
    RECOMMEND_BONUS(7),
    /**
     * 提现
     */
    WITHDRAWAL(8),
src/main/java/cc/mrbird/febs/mall/entity/MallBonusRecord.java
New file
@@ -0,0 +1,27 @@
package cc.mrbird.febs.mall.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
@Data
@TableName("mall_bonus_record")
public class MallBonusRecord {
    @TableId(type = IdType.AUTO)
    private Long id;
    private BigDecimal amount;
    private int type;
    private Long orderId;
    private Long orderItemId;
    private Date createTime;
}
src/main/java/cc/mrbird/febs/mall/entity/MallSystemSetting.java
@@ -22,5 +22,7 @@
    private BigDecimal agentBonus;
    private BigDecimal partnerBonus;
    private Integer revision;
}
src/main/java/cc/mrbird/febs/mall/mapper/MallBonusRecordMapper.java
New file
@@ -0,0 +1,7 @@
package cc.mrbird.febs.mall.mapper;
import cc.mrbird.febs.mall.entity.MallBonusRecord;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
public interface MallBonusRecordMapper extends BaseMapper<MallBonusRecord> {
}
src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java
@@ -93,6 +93,7 @@
        for (DataDictionaryCustom dataDictionaryCustom : dicList) {
            if (Integer.parseInt(dataDictionaryCustom.getValue()) == parentNode.CHILD.size()) {
                dic = dataDictionaryCustom;
                break;
            }
        }
@@ -102,7 +103,7 @@
        MallMember parentMember = memberMapper.selectById(parentNode.getMemberId());
        int levelCode = MemberLevelEnum.getLevelCode(parentMember.getLevel());
        if (Integer.parseInt(dic.getValue()) > levelCode) {
        if (Integer.parseInt(dic.getValue()) >= levelCode) {
            parentMember.setChildNodeCnt(parentNode.CHILD.size());
            parentMember.setLevel(dic.getCode());
            memberMapper.updateById(parentMember);
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java
@@ -350,6 +350,8 @@
                    if (item.getIsNormal() == 2 && goodsLevel < item.getGoodsLevel()) {
                        goodsLevel = item.getGoodsLevel();
                    }
                    mallAchieveService.add(item.getId());
                }
                // 根据用户购买的商品设置其等级
src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java
@@ -91,6 +91,7 @@
                continue;
            }
            // ----- 直推奖 start -------
            // 直推返利比例
            BigDecimal profitPer = BigDecimal.ZERO;
            int isSameLevel = 0;
@@ -123,15 +124,15 @@
            changeScoreAndCommission(parentMember.getId(), profit, MoneyFlowTypeEnum.DIRECT_BONUS.getValue(), orderInfo.getOrderNo());
            // 代理推代理
            if (isSameLevel == 1) {
                MallMember doubleParentMember = mallMemberMapper.selectInfoByInviteId(parentMember.getReferrerId());
                if (doubleParentMember == null) {
                    continue;
                }
                BigDecimal doubleParentProfit = profit.multiply(indirectPer);
                changeScoreAndCommission(doubleParentMember.getId(), doubleParentProfit, MoneyFlowTypeEnum.DIRECT_BONUS.getValue(), orderInfo.getOrderNo());
            }
//            if (isSameLevel == 1) {
//                MallMember doubleParentMember = mallMemberMapper.selectInfoByInviteId(parentMember.getReferrerId());
//                if (doubleParentMember == null) {
//                    continue;
//                }
//
//                BigDecimal doubleParentProfit = profit.multiply(indirectPer);
//                changeScoreAndCommission(doubleParentMember.getId(), doubleParentProfit, MoneyFlowTypeEnum.DIRECT_BONUS.getValue(), orderInfo.getOrderNo());
//            }
            // 非代理推代理
            if (isSameLevel == 2) {
@@ -153,6 +154,46 @@
                    changeScoreAndCommission(mallMember.getId(), doubleParentProfit, MoneyFlowTypeEnum.DIRECT_BONUS.getValue(), orderInfo.getOrderNo());
                }
            }
            // ----- 直推奖 end -------
            // =======隔代奖== start =====
            if (StrUtil.isBlank(parentMember.getReferrerId())) {
                continue;
            }
            List<String> parents = StrUtil.split(parentMember.getReferrerIds(), ',');
            List<MallMember> members = mallMemberMapper.selectByInviteIds(parents);
            if (CollUtil.isEmpty(members)) {
                return;
            }
            BigDecimal direct = profit;
            for (MallMember parent : members) {
                if (parent.getInviteId().equals(parentMember.getInviteId())) {
                    continue;
                }
                // 隔代比例
                BigDecimal indrectDicProp = new BigDecimal(20);
                // 隔代推荐奖 收益
                direct = direct.multiply(indrectDicProp.divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP));
                // direct 收益小于1,则跳出
                if (direct.compareTo(BigDecimal.valueOf(0.01)) < 1) {
                    break;
                }
                int reduceResult = walletService.reduce(direct, parent.getId(), "score");
                if (reduceResult == 2) {
                    continue;
                }
                walletService.add(direct, parent.getId(), "commission");
                moneyFlowService.addMoneyFlow(parent.getId(), direct, MoneyFlowTypeEnum.RECOMMEND_BONUS.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.COMMISSION.getValue());
                moneyFlowService.addMoneyFlow(parent.getId(), direct.negate(), MoneyFlowTypeEnum.RECOMMEND_BONUS.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.SCORE.getValue());
                changeScoreAndCommission(parent.getId(), direct, MoneyFlowTypeEnum.RECOMMEND_BONUS.getValue(), orderInfo.getOrderNo());
            }
            // =======隔代奖== end =====
        }
    }
@@ -277,7 +318,7 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void agentProfit(Integer type) {
        log.info("#####==代理分红==start==#####");
        log.info("#####==代理分红--{}==start==#####", type);
        if (type == null) {
            return;
        }
@@ -291,12 +332,12 @@
        BigDecimal hundred = BigDecimal.valueOf(100);
        DataDictionaryCustom dic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.AGENT_BONUS_RELEASE.getType(), DataDictionaryEnum.AGENT_BONUS_RELEASE.getCode());
        if (dic == null || StrUtil.isBlank(dic.getValue()) || Integer.parseInt(dic.getValue()) == 0) {
            log.info("不进行全网分红");
            log.info("不进行代理分红");
            return;
        }
        // 全网分红
        BigDecimal waitToBonus = systemSetting.getAllBonus().multiply(new BigDecimal(dic.getValue()).divide(hundred, 2, RoundingMode.HALF_UP));
        // 代理
        BigDecimal waitToBonus = systemSetting.getAgentBonus().multiply(new BigDecimal(dic.getValue()).divide(hundred, 2, RoundingMode.HALF_UP));
        // 代理
        List<MallMember> mallMembers = mallMemberMapper.selectAgentOrPartnetMemberList(type);
@@ -310,7 +351,14 @@
            changeScoreAndCommission(item.getId(), perBonus, type.equals(AccountLevelEnums.VVIP.getLevel()) ? MoneyFlowTypeEnum.AGENT_BONUS.getValue() : MoneyFlowTypeEnum.PARTNER_BONUS.getValue(), null);
        });
        log.info("#####==代理分红==end==#####");
        if (type.equals(AccountLevelEnums.VVIP.getLevel())) {
            changeSystemBonus(null, waitToBonus,null);
        } else {
            changeSystemBonus(null, null, waitToBonus);
        }
        bonusRecord(waitToBonus, type, null, null);
        log.info("#####==代理分红 -- {}==end==#####", type);
    }
    private BigDecimal changeScoreAndCommission(Long memberId, BigDecimal income, Integer type, String orderNo) {
@@ -367,7 +415,14 @@
        Map<String, List<MallMember>> levelMemberMap = new HashMap<>();
        // TODO 并发处理
        mallMembers.forEach(item -> {
            List<MallMember> memberList = levelMemberMap.get(item.getLevel());
            String level = item.getLevel();
            // 全网分红 -- 代理和股东当作是女王殿下级别
            if (MemberLevelEnum.getLevelCode(level) > MemberLevelEnum.FOUR_LEVEL.getCode()) {
                level = MemberLevelEnum.FOUR_LEVEL.getType();
            }
            List<MallMember> memberList = levelMemberMap.get(level);
            if (CollUtil.isEmpty(memberList)) {
                memberList = new ArrayList<>();
            }
@@ -380,6 +435,7 @@
            return;
        }
        BigDecimal totalBonus = BigDecimal.ZERO;
        for (Map.Entry<String, List<MallMember>> entry : levelMemberMap.entrySet()) {
            BigDecimal levelBonus = levelBonusMap.get(entry.getKey());
            List<MallMember> memberList = entry.getValue();
@@ -392,13 +448,16 @@
            memberList.forEach(item -> {
                changeScoreAndCommission(item.getId(), perBonus, MoneyFlowTypeEnum.ALL_INTERNET_BONUS.getValue(), null);
            });
            totalBonus = totalBonus.add(levelBonus);
        }
        changeSystemBonus(totalBonus, null, null);
        log.info("###全网分红执行--end--###");
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void orderBonus(Long orderId) {
        log.info("###订单分红消息开始执行###");
        MallOrderInfo orderInfo = mallOrderInfoMapper.selectById(orderId);
@@ -423,8 +482,10 @@
        // 全网分红
        BigDecimal totalBonus = BigDecimal.ZERO;
        // 代理/股东分红
        // 代理分红
        BigDecimal agentTotalBonus = BigDecimal.ZERO;
        // 股东分红
        BigDecimal partnerTotalBonus = BigDecimal.ZERO;
        BigDecimal hundred = new BigDecimal(100);
        for (MallOrderItem item : items) {
            // 减去成本后算收益
@@ -433,30 +494,38 @@
                continue;
            }
            if (item.getIsNormal() == 2) {
            if (item.getIsNormal() == 1) {
                BigDecimal bonus = amount.multiply(BigDecimal.valueOf(item.getNormalBonus()).divide(hundred, 2, RoundingMode.HALF_UP));
                log.info("{}-普通商品分红:{}, 明细ID:{}", id, bonus, item.getId());
                bonusRecord(bonus, 1, item.getOrderId(), item.getId());
                totalBonus = totalBonus.add(bonus);
            } else {
                BigDecimal bonus = amount.multiply(new BigDecimal(allInternetBonusDic.getValue()).divide(hundred, 2, RoundingMode.HALF_UP));
                bonusRecord(bonus, 1, item.getOrderId(), item.getId());
                log.info("{}-套餐全网分红:{}, 明细ID:{}", id,  bonus, item.getId());
                totalBonus = totalBonus.add(bonus);
                BigDecimal agentBonus = amount.multiply(new BigDecimal(agentBonusDic.getValue()).divide(hundred, 2, RoundingMode.HALF_UP));
                bonusRecord(agentBonus, 2, item.getOrderId(), item.getId());
                log.info("{}-套餐代理分红:{}, 明细ID:{}", id,  agentBonus, item.getId());
                BigDecimal partnerBonus = amount.multiply(new BigDecimal(partnerBonusDic.getValue()).divide(hundred, 2, RoundingMode.HALF_UP));
                bonusRecord(partnerBonus, 3, item.getOrderId(), item.getId());
                log.info("{}-套餐股东分红:{}, 明细ID:{}", id,  partnerBonus, item.getId());
                agentTotalBonus = agentTotalBonus.add(agentBonus).add(partnerBonus);
                agentTotalBonus = agentTotalBonus.add(agentBonus);
                partnerTotalBonus = partnerTotalBonus.add(partnerBonus);
            }
        }
        boolean flag = false;
        changeSystemBonus(totalBonus, agentTotalBonus, partnerTotalBonus);
        log.info("###订单分红消息结束执行###");
    }
    private void changeSystemBonus(BigDecimal totalBonus, BigDecimal agentTotalBonus, BigDecimal partnerBonus) {
        boolean flag = false;
        int index = 0;
        while (!flag) {
            MallSystemSetting setting = mallSystemSettingMapper.selectById(1L);
@@ -464,20 +533,31 @@
                return;
            }
            setting.setAllBonus(setting.getAllBonus().add(totalBonus));
            setting.setAgentBonus(setting.getAgentBonus().add(agentTotalBonus));
            setting.setRevision(setting.getRevision() + 1);
            LambdaQueryWrapper<MallSystemSetting> update = new LambdaQueryWrapper<>();
            update.eq(MallSystemSetting::getId, setting.getId())
                    .eq(MallSystemSetting::getRevision, setting.getRevision());
            setting.setAllBonus(setting.getAllBonus().add(totalBonus == null ? BigDecimal.ZERO : totalBonus));
            setting.setAgentBonus(setting.getAgentBonus().add(agentTotalBonus == null ? BigDecimal.ZERO : agentTotalBonus));
            setting.setPartnerBonus(setting.getPartnerBonus().add(partnerBonus == null ? BigDecimal.ZERO : partnerBonus));
            setting.setRevision(setting.getRevision() + 1);
            int i = mallSystemSettingMapper.update(setting, update);
            if (i > 0 || index > 2) {
                flag = true;
            }
            index++;
        }
    }
        log.info("###订单分红消息结束执行###");
    private final MallBonusRecordMapper mallBonusRecordMapper;
    private void bonusRecord(BigDecimal amount, Integer type, Long orderId, Long orderItemId) {
        MallBonusRecord record = new MallBonusRecord();
        record.setAmount(amount);
        record.setCreateTime(new Date());
        record.setType(type);
        record.setOrderId(orderId);
        record.setOrderItemId(orderItemId);
        mallBonusRecordMapper.insert(record);
    }
}
src/main/java/cc/mrbird/febs/rabbit/consumer/AgentConsumer.java
@@ -19,7 +19,7 @@
 * @date 2021-09-25
 **/
@Slf4j
//@Component
@Component
public class AgentConsumer {
    @Autowired
src/test/java/cc/mrbird/febs/AgentTest.java
@@ -10,6 +10,7 @@
import cc.mrbird.febs.mall.mapper.*;
import cc.mrbird.febs.mall.quartz.ProfitJob;
import cc.mrbird.febs.mall.service.IAgentService;
import cc.mrbird.febs.mall.service.IMemberProfitService;
import cc.mrbird.febs.mall.vo.ApiMallActWinDetailsVo;
import cc.mrbird.febs.mall.vo.ApiMallAwardDetailsVo;
import cc.mrbird.febs.rabbit.consumer.AgentConsumer;
@@ -44,14 +45,24 @@
    @Test
    public void autoLevelUpTest() {
        agentProducer.sendAutoLevelUpMsg(803L);
        agentProducer.sendAutoLevelUpMsg(808L);
    }
    @Test
    public void returnMoneyTest() {
        agentProducer.sendOrderReturn(5L);
        agentProducer.sendOrderBonus(1L);
    }
    @Autowired
    private IMemberProfitService memberProfitService;
    @Test
    public void bonusTest() {
        memberProfitService.allInternetProfit();
    }
//
//    @Autowired
//    private DataDictionaryCustomMapper dataDictionaryCustomMapper;