Hentua
2023-04-17 54bbaf1c88493368b3494928d7bd2a5c51abebb0
完成直推返利
1 files added
9 files modified
201 ■■■■■ changed files
src/main/java/cc/mrbird/febs/common/enumerates/AccountLevelEnums.java 28 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/common/enumerates/DataDictionaryEnum.java 7 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/entity/MallGoods.java 9 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/entity/MallMember.java 9 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/entity/MallOrderItem.java 7 ●●●●● 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/IMemberProfitService.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java 15 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java 110 ●●●●● patch | view | raw | blame | history
src/main/resources/mapper/modules/MallMemberMapper.xml 12 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/common/enumerates/AccountLevelEnums.java
New file
@@ -0,0 +1,28 @@
package cc.mrbird.febs.common.enumerates;
import lombok.Getter;
@Getter
public enum AccountLevelEnums {
    /**
     * 会员
     */
    VIP(1),
    /**
     * 代理
     */
    VVIP(2),
    /**
     * 股东
     */
    VVVIP(3);
    private Integer level;
    AccountLevelEnums(Integer level) {
        this.level = level;
    }
}
src/main/java/cc/mrbird/febs/common/enumerates/DataDictionaryEnum.java
@@ -75,8 +75,13 @@
    WIN_CASH("WIN_PROBABILITY", "WIN_CASH"),
    RANK_BONUS("BONUS_TYPE", "RANK_BONUS"),
    CASHOUT_SETTING("CASHOUT_SET", "CASHOUT_SETTING"),
    INDIRECT_BONUS_SETTING("INDIRECT_BONUS_SETTING", "");
    INDIRECT_BONUS_SETTING("INDIRECT_BONUS_SETTING", ""),
    /**
     * 美业直推分红设置
     */
    DIRECT_BONUS_SETTING("DIRECT_BONUS_SETTING", "");
    private String type;
    private String code;
src/main/java/cc/mrbird/febs/mall/entity/MallGoods.java
@@ -130,4 +130,13 @@
    @TableField(exist = false)
    private BigDecimal scorePercentNum;
    /**
     * 套餐 1-会员 2-代理 3-股东
     */
    private Integer goodsLevel;
    /**
     * 普通商品分红百分比
     */
    private Integer normalPer;
}
src/main/java/cc/mrbird/febs/mall/entity/MallMember.java
@@ -158,6 +158,13 @@
    @TableField(exist = false)
    private BigDecimal voucherAmount;
    //内转标识 1:开启 2:关闭
    /*
     * 内转标识 1:开启 2:关闭
     */
    private Integer insideWith;
    /**
     * 账号级别 1-会员 2-代理 3-股东
     */
    private Integer accountLevel;
}
src/main/java/cc/mrbird/febs/mall/entity/MallOrderItem.java
@@ -42,4 +42,11 @@
     * 是否结清
     */
    private Integer hasSettle;
    /**
     * 1-会员 2-代理 3-股东
     */
    private Integer goodsLevel;
    private Integer normalPer;
}
src/main/java/cc/mrbird/febs/mall/mapper/MallMemberMapper.java
@@ -101,4 +101,6 @@
     * @return
     */
    List<MallMember> selectByRole(@Param("type") int type, @Param("state")int state);
    List<MallMember> selectParentMemberList(@Param("list") List<String> inviteIds, @Param("refererId") String refererId, @Param("limit") Integer limit);
}
src/main/java/cc/mrbird/febs/mall/service/IMemberProfitService.java
@@ -18,6 +18,8 @@
     */
    void dynamicProfit(Long orderId);
    void directProfit(Long orderId);
    void dynamicProfit(Long orderId, Integer isNormal);
    /**
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java
@@ -334,18 +334,9 @@
                this.baseMapper.updateById(orderInfo);
                commonService.changeWallet(orderInfo.getId(), FlowTypeEnum.BALANCE.getValue());
                /**
                 * 插入一条待处理记录
                 * mq处理之后,更新状态
                 */
                MallMqRecord mallMqRecord = new MallMqRecord();
                mallMqRecord.setOrderId(orderInfo.getId());
                mallMqRecord.setState(2);
                mallMqRecord.setRetryTimes(2);
                mallMqRecord.setCreateTime(orderInfo.getPayTime());
                mallMqRecordMapper.insert(mallMqRecord);
                //发送补贴消息
                agentProducer.sendPerkMoneyMsg(orderInfo.getId());
                //发送直推返利消息
                agentProducer.sendOrderReturn(orderInfo.getId());
                //发送代理自动升级消息
                agentProducer.sendAutoLevelUpMsg(member.getId());
                break;
src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java
@@ -22,6 +22,7 @@
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.models.auth.In;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@@ -151,8 +152,112 @@
    @Override
    public void dynamicProfit(Long orderId) {
        return;
//        dynamicProfit(orderId, 2);
//        return;
        dynamicProfit(orderId, 2);
    }
    /**
     * 直推收益
     *
     * 1、直推收益 1:20;2:30;3:40 返利,隔代奖拿直推收益20%
     * 2、若非代理推代理,只拿10%,往上找代理给15%,再往上找代理给15%,往上找连续两层。股东套餐同理
     * 3、代理推代理按照第1点结算
     *
     * @param orderId
     */
    @Override
    public void directProfit(Long orderId) {
        log.info("######直推奖励, 订单ID:{}######", orderId);
        MallOrderInfo orderInfo = mallOrderInfoMapper.selectById(orderId);
        if (orderInfo.getOrderType() == 2) {
            log.info("积分订单无返利");
            return;
        }
        BigDecimal indirectPer = BigDecimal.valueOf(0.2);
        BigDecimal indirectPer2 = BigDecimal.valueOf(0.15);
        MallMember member = mallMemberMapper.selectById(orderInfo.getMemberId());
        // 父级会员
        MallMember parentMember = mallMemberMapper.selectInfoByInviteId(member.getReferrerId());
        // 父级会员直推人数
        Integer directCnt = mallMemberMapper.selectOwnCntByInviteId(parentMember.getInviteId());
        List<DataDictionaryCustom> dataDices = dataDictionaryCustomMapper.selectDicByType(DataDictionaryEnum.DIRECT_BONUS_SETTING.getType());
        directCnt = directCnt == null ? 0 : directCnt;
        List<MallOrderItem> items = mallOrderInfoMapper.getMallOrderItemByOrderId(orderId);
        if (CollUtil.isEmpty(items)) {
            return;
        }
        for (MallOrderItem item : items) {
            // 减去成本后算收益
            BigDecimal amount = item.getPrice().subtract(item.getCostPrice()).multiply(BigDecimal.valueOf(item.getCnt()));
            if (amount.compareTo(BigDecimal.ZERO) < 1) {
                continue;
            }
            // 直推返利比例
            BigDecimal profitPer = BigDecimal.ZERO;
            int isSameLevel = 0;
            // 普通商品 -- 直推上级可拿百分比直推奖励
            if (item.getIsNormal() == 1) {
                profitPer = new BigDecimal(item.getNormalPer());
                // 套餐商品
            } else {
                // 判断上级是否与自己购买的套餐符合,若符合则走3级直推逻辑,若不符合则另外一个
                if (parentMember.getAccountLevel().equals(item.getGoodsLevel()) || AccountLevelEnums.VIP.getLevel().equals(parentMember.getAccountLevel())) {
                    for (DataDictionaryCustom dataDic : dataDices) {
                        JSONObject jsonObject = JSONObject.parseObject(dataDic.getValue());
                        if (directCnt >= jsonObject.getInteger("pushCnt")) {
                            profitPer = jsonObject.getBigDecimal("prop");
                        }
                    }
                    isSameLevel = 1;
                    // 非代理推代理/非股东推股东
                } else {
                    profitPer = BigDecimal.valueOf(0.1);
                    isSameLevel = 2;
                }
            }
            // 直推奖
            BigDecimal profit = amount.multiply(profitPer.divide(new BigDecimal(100), 2, RoundingMode.HALF_UP));
            changeScoreAndCommission(parentMember.getId(), profit, MoneyFlowTypeEnum.DYNAMIC_ACHIEVE.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.RECOMMEND_BONUS.getValue(), orderInfo.getOrderNo());
            }
            // 非代理推代理
            if (isSameLevel == 2) {
                List<MallMember> mallMembers = mallMemberMapper.selectParentMemberList(StrUtil.split(parentMember.getReferrerIds(), ','), parentMember.getReferrerId(), 2);
                if (CollUtil.isEmpty(mallMembers)) {
                    continue;
                }
                for (MallMember mallMember : mallMembers) {
                    if (!item.getGoodsLevel().equals(mallMember.getAccountLevel())) {
                        break;
                    }
                    BigDecimal doubleParentProfit = profit.multiply(indirectPer2);
                    changeScoreAndCommission(mallMember.getId(), doubleParentProfit, MoneyFlowTypeEnum.RECOMMEND_BONUS.getValue(), orderInfo.getOrderNo());
                }
            }
        }
    }
    /**
@@ -164,7 +269,6 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void dynamicProfit(Long orderId, Integer isNormal) {
        log.info("######直推奖励, 订单ID:{}######", orderId);
        MallOrderInfo orderInfo = mallOrderInfoMapper.selectById(orderId);
        if (orderInfo.getOrderType() == 2) {
            log.info("积分订单无返利");
src/main/resources/mapper/modules/MallMemberMapper.xml
@@ -445,4 +445,16 @@
            </if>
        </where>
    </select>
    <select id="selectParentMemberList" resultType="cc.mrbird.febs.mall.entity.MallMember">
        select * from mall_member
        where invite_id!=#{refererId} and invite_id IN
        <foreach collection = "list" item = "item"  separator=","  open = "(" close = ")" >
            #{item}
        </foreach >
        order by id desc
        <if test="limit != null">
            limit #{limit}
        </if>
    </select>
</mapper>