fix
Hentua
2023-04-24 c33c9c03bb90e49ad12fd237058c877e87e96ca4
fix
2 files added
1 files deleted
13 files modified
386 ■■■■ changed files
src/main/java/cc/mrbird/febs/common/enumerates/GoodsToLevelEnums.java 32 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/common/enumerates/MemberLevelEnum.java 8 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/common/enumerates/MemberLevelEnums.java 39 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/common/enumerates/MemberLevelTagDicEnums.java 43 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/common/enumerates/MoneyFlowTypeEnum.java 5 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/entity/MallGoods.java 5 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/entity/MallOrderItem.java 4 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/mapper/MallMemberMapper.java 3 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java 101 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java 47 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java 25 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/MallMemberVo.java 6 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/rabbit/consumer/AgentConsumer.java 40 ●●●●● patch | view | raw | blame | history
src/main/resources/mapper/modules/MallMemberMapper.xml 11 ●●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/goods/goodsAddNew.html 8 ●●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/goods/goodsUpdateNew.html 9 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/common/enumerates/GoodsToLevelEnums.java
New file
@@ -0,0 +1,32 @@
package cc.mrbird.febs.common.enumerates;
import lombok.Getter;
@Getter
public enum GoodsToLevelEnums {
    /**
     * 套餐对应级别
     */
    VIP(1, "FIRST_LEVEL"),
    VVIP(2, "FIFTH_LEVEL"),
    VVVIP(3, "SIX_LEVEL");
    private Integer accountLevel;
    private String level;
    GoodsToLevelEnums(Integer accountLevel, String level) {
        this.accountLevel = accountLevel;
        this.level = level;
    }
    public static String getLevelByAccountLevel(Integer accountLevel) {
        for (GoodsToLevelEnums value : values()) {
            if (value.accountLevel.equals(accountLevel)) {
                return value.level;
            }
        }
        return null;
    }
}
src/main/java/cc/mrbird/febs/common/enumerates/MemberLevelEnum.java
@@ -7,13 +7,13 @@
@Getter
public enum MemberLevelEnum {
    SEVEN_LEVEL("SEVEN_LEVEL",6),
    SIX_LEVEL("SIX_LEVEL",5),
    FIFTH_LEVEL("FIFTH_LEVEL",4),
    SIX_LEVEL("SIX_LEVEL",999),
    FIFTH_LEVEL("FIFTH_LEVEL",998),
    FOUR_LEVEL("FOUR_LEVEL",3),
    THIRD_LEVEL("THIRD_LEVEL",2),
    SECOND_LEVEL("SECOND_LEVEL",1),
    ZERO_LEVEL("ZERO_LEVEL",0);
    FIRST_LEVEL("FIRST_LEVEL",0),
    ZERO_LEVEL("ZERO_LEVEL",-1);
    private String type;
src/main/java/cc/mrbird/febs/common/enumerates/MemberLevelEnums.java
File was deleted
src/main/java/cc/mrbird/febs/common/enumerates/MemberLevelTagDicEnums.java
New file
@@ -0,0 +1,43 @@
package cc.mrbird.febs.common.enumerates;
import lombok.Getter;
@Getter
public enum MemberLevelTagDicEnums {
    ZERO_LEVEL_Y(1, "ZERO_LEVEL", "迷梦素人")
    ,ZERO_LEVEL_N(2, "ZERO_LEVEL", "迷梦素人")
    ,FIRST_LEVEL_Y(1, "FIRST_LEVEL", "觉醒须眉")
    ,FIRST_LEVEL_N(2, "FIRST_LEVEL", "觉醒丽人")
    ,SECOND_LEVEL_Y(1, "SECOND_LEVEL", "先知蓝颜")
    ,SECOND_LEVEL_N(2, "SECOND_LEVEL", "先知红颜")
    ,THIRD_LEVEL_Y(1, "THIRD_LEVEL", "追影才子")
    ,THIRD_LEVEL_N(2, "THIRD_LEVEL", "追影佳人")
    ,FOUR_LEVEL_Y(1, "FOUR_LEVEL", "赋权玉郎")
    ,FOUR_LEVEL_N(2, "FOUR_LEVEL", "赋权娇娘")
    ,FIFTH_LEVEL_Y(1, "FIFTH_LEVEL", "位极尊上")
    ,FIFTH_LEVEL_N(2, "FIFTH_LEVEL", "位极女卿")
    ,SIX_LEVEL_Y(1, "SIX_LEVEL", "权倾圣主")
    ,SIX_LEVEL_N(2, "SIX_LEVEL", "权倾女帝");
    private int male;
    private String code;
    private String desc;
    MemberLevelTagDicEnums(int male, String code, String desc) {
        this.male = male;
        this.code = code;
        this.desc = desc;
    }
    public static String getDesc(int male, String code) {
        for (MemberLevelTagDicEnums value : values()) {
            if (value.male == male && value.code.equals(code)) {
                return value.desc;
            }
        }
        return null;
    }
}
src/main/java/cc/mrbird/febs/common/enumerates/MoneyFlowTypeEnum.java
@@ -37,6 +37,11 @@
    PARTNER_BONUS(5),
    /**
     * 获得静态积分
     */
    BUY_TC(6),
    /**
     * 提现
     */
    WITHDRAWAL(8),
src/main/java/cc/mrbird/febs/mall/entity/MallGoods.java
@@ -139,4 +139,9 @@
     * 普通商品分红百分比
     */
    private Integer normalPer;
    /**
     * 普通商品分红百分比
     */
    private Integer normalBonus;
}
src/main/java/cc/mrbird/febs/mall/entity/MallOrderItem.java
@@ -43,10 +43,14 @@
     */
    private Integer hasSettle;
    private BigDecimal staticMulti;
    /**
     * 1-会员 2-代理 3-股东
     */
    private Integer goodsLevel;
    private Integer normalPer;
    private Integer normalBonus;
}
src/main/java/cc/mrbird/febs/mall/mapper/MallMemberMapper.java
@@ -107,4 +107,7 @@
    List<MallMember> selectMemberAfterLevelList(String level);
    List<MallMember> selectAgentOrPartnetMemberList(@Param("memberLevel") Integer memberLevel);
    Integer selectOwnCntByInviteIdAndAccountLevel(@Param("inviteId") String inviteId, @Param("accountLevel") Integer accountLevel);
}
src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java
@@ -57,6 +57,9 @@
    public void autoUpAgentLevel(Long memberId) {
        log.info("###代理自动升级###");
        MallMember member = memberMapper.selectById(memberId);
        if (MemberLevelEnum.ZERO_LEVEL.getType().equals(member.getLevel())) {
            return;
        }
        MatrixTree tree = MatrixTree.getInstance();
        MemberNode node = tree.getNode(member.getInviteId());
@@ -187,104 +190,6 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void perkMoneyConsumer(long orderId) {
        long start = System.currentTimeMillis();
        MallOrderInfo mallOrderInfo = mallOrderInfoMapper.selectById(orderId);
        if(ObjectUtil.isEmpty(mallOrderInfo)){
            return;
        }
//        if(2 != mallOrderInfo.getStatus()){
//            return;
//        }
        /**
         * 分享补贴 直推消费额10%
         */
        BigDecimal amount = mallOrderInfo.getAmount().subtract(mallOrderInfo.getScoreAmount());
        Long memberId = mallOrderInfo.getMemberId();
        MallMember mallMember = memberMapper.selectById(memberId);
        //补贴对象 直属上级
        MallMember mallMemberUp = memberMapper.selectInfoByInviteId(mallMember.getReferrerId());
        if(ObjectUtil.isNotEmpty(mallMemberUp)){
            //分享补贴百分比
            DataDictionaryCustom sharePerkDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                    DataDictionaryEnum.SHARE_PERK.getType(),
                    DataDictionaryEnum.SHARE_PERK.getCode());
            String sharePerk = ObjectUtil.isEmpty(sharePerkDic.getValue()) ? "0" : sharePerkDic.getValue();
            BigDecimal sharePerkPercent = new BigDecimal(sharePerk).abs().divide(new BigDecimal(100));
            //分享补贴金额
            BigDecimal sharePerkAmount = amount.multiply(sharePerkPercent).setScale(2, BigDecimal.ROUND_DOWN);;
            //所有合伙人补贴至消费礼包的三倍额度需要复购一次。
            MallMemberWallet mallMemberWallet = mallMemberWalletMapper.selectWalletByMemberId(mallMemberUp.getId());
            BigDecimal totalScore = mallMemberWallet.getTotalScore();
            if(totalScore.compareTo(sharePerkAmount) < 0){
                sharePerkAmount = totalScore;
            }
            if(BigDecimal.ZERO.compareTo(sharePerkAmount) < 0){
                //减少补贴额度
                mallMemberWalletMapper.reduceTotalScoreById(sharePerkAmount, mallMemberWallet.getId());
                reduceStar(mallMemberUp.getId(),sharePerkAmount);
                mallMemberWalletMapper.addBalanceById(sharePerkAmount, mallMemberWallet.getId());
//                mallMoneyFlowService.addMoneyFlow(
//                        mallMemberUp.getId(),
//                        sharePerkAmount,
//                        MoneyFlowTypeEnum.DYNAMIC_ACHIEVE.getValue(),
//                        mallOrderInfo.getOrderNo(),
//                        "直推奖",
//                        "补贴额度:"+totalScore,
//                        memberId,
//                        2,
//                        FlowTypeEnum.BALANCE.getValue(),
//                        1);
            }
        }
        /**
         * 星级奖励
         *  从最顶级级别的合伙人开始补贴
         *      补贴完,把已经补贴的合伙人加入下一个级别
         */
        List<MallMember> sevenLevelRecord = getStarRecord(null,  MemberLevelEnum.SEVEN_LEVEL.name(), amount, mallOrderInfo.getOrderNo(), memberId,MoneyFlowTypeEnum.STAR_PERK_SEVEN.getValue());
        List<MallMember> sixLevelRecord = getStarRecord(sevenLevelRecord,  MemberLevelEnum.SIX_LEVEL.name(), amount, mallOrderInfo.getOrderNo(), memberId,MoneyFlowTypeEnum.STAR_PERK_SIX.getValue());
        List<MallMember> fifthLevelRecord = getStarRecord(sixLevelRecord,  MemberLevelEnum.FIFTH_LEVEL.name(), amount, mallOrderInfo.getOrderNo(), memberId,MoneyFlowTypeEnum.STAR_PERK_FIVE.getValue());
        List<MallMember> fourLevelRecord = getStarRecord(fifthLevelRecord,  MemberLevelEnum.FOUR_LEVEL.name(), amount, mallOrderInfo.getOrderNo(), memberId,MoneyFlowTypeEnum.STAR_PERK_FOUR.getValue());
        List<MallMember> thirdLevelRecord = getStarRecord(fourLevelRecord,  MemberLevelEnum.THIRD_LEVEL.name(), amount, mallOrderInfo.getOrderNo(), memberId,MoneyFlowTypeEnum.STAR_PERK_THREE.getValue());
        List<MallMember> secondLevelRecord = getStarRecord(thirdLevelRecord,  MemberLevelEnum.SECOND_LEVEL.name(), amount, mallOrderInfo.getOrderNo(), memberId,MoneyFlowTypeEnum.STAR_PERK_TWO.getValue());
        /**
         * 团队补贴
         */
        //团队补贴百分比
        DataDictionaryCustom teamPerkDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                DataDictionaryEnum.TEAM_PERK.getType(),
                DataDictionaryEnum.TEAM_PERK.getCode());
        String teamPerk = ObjectUtil.isEmpty(teamPerkDic.getValue()) ? "0" : teamPerkDic.getValue();
        BigDecimal teamPerkPercent = new BigDecimal(teamPerk).abs().divide(new BigDecimal(100));
        //分享补贴金额
        BigDecimal teamPerkAmount = amount.multiply(teamPerkPercent);
        //团队补贴对象
        List<MallMember> mallMemberTeamPerkList = mallMemberTeamPerkListInfo(memberId);
        if(CollUtil.isNotEmpty(mallMemberTeamPerkList)){
            List<Long> mallMemberTeamPerkIds = mallMemberTeamPerkList.stream().map(MallMember::getId).collect(Collectors.toList());
            List<MallMemberWallet> mallMemberWallets = mallMemberWalletMapper.selectMemberWalletsByIds(mallMemberTeamPerkIds);
            flowTotalScoreBalance(
                    mallMemberWallets,
                    teamPerkAmount,
                    MoneyFlowTypeEnum.TEAM_PERK.getValue(),
                    mallOrderInfo.getOrderNo(),
                    memberId
            );
        }
        long end = System.currentTimeMillis();
        log.info("============订单:{},时间:{}===========",mallOrderInfo.getOrderNo(),(end - start)/1000);
        MallMqRecord mallMqRecord = mallMqRecordMapper.selectByOrderId(orderId);
        if(ObjectUtil.isNotEmpty(mallMqRecord)){
            mallMqRecord.setState(1);
            mallMqRecordMapper.updateById(mallMqRecord);
        }
    }
    /**
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java
@@ -192,6 +192,11 @@
                orderItem.setSkuImage(sku.getSkuImage());
                orderItem.setIsNormal(mallGoods.getIsNormal());
                orderItem.setCostPrice(sku.getCostPrice());
                orderItem.setStaticMulti(mallGoods.getStaticMulti());
                orderItem.setGoodsLevel(mallGoods.getGoodsLevel());
                orderItem.setNormalBonus(mallGoods.getNormalBonus());
                orderItem.setNormalPer(mallGoods.getNormalPer());
                total = total.add(amount);
                carriage = carriage.add(mallGoods.getCarriage());
@@ -332,12 +337,43 @@
                orderInfo.setPayResult("1");
                this.baseMapper.updateById(orderInfo);
                commonService.changeWallet(orderInfo.getId(), FlowTypeEnum.BALANCE.getValue());
                // 商品级别 会员/代理/股东
                int goodsLevel = 0;
                BigDecimal score = BigDecimal.ZERO;
                for (MallOrderItem item : orderInfo.getItems()) {
                    // 计算静态倍数
                    if(item.getIsNormal() == 2) {
                        score = score.add(item.getPrice().multiply(item.getStaticMulti()));
                    }
                //发送直推返利消息
                agentProducer.sendOrderReturn(orderInfo.getId());
                    // 判断会员层级
                    if (item.getIsNormal() == 2 && goodsLevel > item.getGoodsLevel()) {
                        goodsLevel = item.getGoodsLevel();
                    }
                }
                // 根据用户购买的商品设置其等级
                member.setLevel(GoodsToLevelEnums.getLevelByAccountLevel(goodsLevel));
                member.setAccountLevel(goodsLevel);
                this.memberMapper.updateById(member);
                memberWalletService.add(score, member.getId(), "score");
                if (orderInfo.getScoreCnt().compareTo(BigDecimal.ZERO) > 0) {
                    int reduce = memberWalletService.reduce(orderInfo.getScoreCnt(), member.getId(), "prizeScore");
                    if (reduce == 2) {
                        throw new FebsException("积分不足");
                    }
                    mallMoneyFlowService.addMoneyFlow(member.getId(), orderInfo.getScoreCnt().negate(), MoneyFlowTypeEnum.PAY.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.PRIZE_SCORE.getValue());
                }
                mallMoneyFlowService.addMoneyFlow(member.getId(), score, MoneyFlowTypeEnum.BUY_TC.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.SCORE.getValue());
                mallMoneyFlowService.addMoneyFlow(member.getId(), orderInfo.getAmount().negate(), MoneyFlowTypeEnum.PAY.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.BALANCE.getValue());
                //发送代理自动升级消息
                agentProducer.sendAutoLevelUpMsg(member.getId());
                //发送直推返利消息
                agentProducer.sendOrderReturn(orderInfo.getId());
                break;
            case "4":
                if (orderInfo.getOrderType() != 2) {
@@ -403,7 +439,6 @@
        map.put("orderNo", orderInfo.getOrderNo());
        map.put("orderId", orderInfo.getId());
        map.put("rcResult", rcResult);
        return map;
    }
@@ -440,6 +475,8 @@
        if (reduce == 2) {
            throw new FebsException("余额不足");
        }
        return orderInfo.getOrderNo();
    }
@@ -705,7 +742,7 @@
            获取单个商品的折扣积分数量
                = 现价 * 数量 * 折扣现金比例
             */
            BigDecimal scorePercent = new BigDecimal(mallGoods.getScorePercent()).multiply(new BigDecimal(0.01));
            BigDecimal scorePercent = new BigDecimal(mallGoods.getScorePercent()).multiply(BigDecimal.valueOf(0.01));
            BigDecimal amount = sku.getPresentPrice().multiply(BigDecimal.valueOf(item.getCnt())).multiply(scorePercent);
            total = total.add(amount);
        }
src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java
@@ -1,28 +1,14 @@
package cc.mrbird.febs.mall.service.impl;
import cc.mrbird.febs.common.enumerates.*;
import cc.mrbird.febs.common.utils.AppContants;
import cc.mrbird.febs.common.utils.MallUtils;
import cc.mrbird.febs.common.utils.RedisUtils;
import cc.mrbird.febs.mall.dto.ScorePoorDto;
import cc.mrbird.febs.mall.entity.*;
import cc.mrbird.febs.mall.mapper.*;
import cc.mrbird.febs.mall.service.*;
import cc.mrbird.febs.mall.vo.AdminTeamEqualsPerkVo;
import cc.mrbird.febs.rabbit.producter.AgentProducer;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSONObject;
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;
@@ -31,7 +17,6 @@
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;
import java.util.stream.Collectors;
/**
 * @author wzy
@@ -80,16 +65,20 @@
            log.info("积分订单无返利");
            return;
        }
        BigDecimal indirectPer = BigDecimal.valueOf(0.2);
        BigDecimal indirectPer = BigDecimal.valueOf(0.25);
        BigDecimal indirectPer2 = BigDecimal.valueOf(0.15);
        MallMember member = mallMemberMapper.selectById(orderInfo.getMemberId());
        // 父级会员
        MallMember parentMember = mallMemberMapper.selectInfoByInviteId(member.getReferrerId());
        if (parentMember.getAccountLevel() == 0 || MemberLevelEnum.ZERO_LEVEL.getType().equals(parentMember.getLevel())) {
            log.info("上级:{}未购买会员套餐,无返利", parentMember.getInviteId());
            return;
        }
        // 父级会员直推人数
        Integer directCnt = mallMemberMapper.selectOwnCntByInviteId(parentMember.getInviteId());
        Integer directCnt = mallMemberMapper.selectOwnCntByInviteIdAndAccountLevel(parentMember.getInviteId(), parentMember.getAccountLevel());
        List<DataDictionaryCustom> dataDices = dataDictionaryCustomMapper.selectDicByType(DataDictionaryEnum.DIRECT_BONUS_SETTING.getType());
        directCnt = directCnt == null ? 0 : directCnt;
@@ -358,7 +347,7 @@
        // 全网分红
        BigDecimal waitToBonus = systemSetting.getAllBonus().multiply(new BigDecimal(dic.getValue()).divide(hundred, 2, RoundingMode.HALF_UP));
        List<MallMember> mallMembers = mallMemberMapper.selectMemberAfterLevelList(MemberLevelEnums.FIRST_LEVEL_Y.getCode());
        List<MallMember> mallMembers = mallMemberMapper.selectMemberAfterLevelList(MemberLevelEnum.FIRST_LEVEL.getType());
        if (CollUtil.isEmpty(mallMembers) || waitToBonus.compareTo(BigDecimal.ZERO) < 1) {
            log.info("待分红金额不足或会员不足");
            return;
src/main/java/cc/mrbird/febs/mall/vo/MallMemberVo.java
@@ -1,8 +1,6 @@
package cc.mrbird.febs.mall.vo;
import cc.mrbird.febs.common.enumerates.AgentLevelEnum;
import cc.mrbird.febs.common.enumerates.MemberLevelEnums;
import cn.hutool.core.util.StrUtil;
import cc.mrbird.febs.common.enumerates.MemberLevelTagDicEnums;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@@ -101,7 +99,7 @@
    public String getLevelName() {
        if (sex != null) {
            return MemberLevelEnums.getDesc(sex, level);
            return MemberLevelTagDicEnums.getDesc(sex, level);
        }
        return null;
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
@@ -28,11 +28,6 @@
    private IAgentService agentService;
    @Autowired
    private IMemberProfitService memberProfitService;
    @RabbitListener(queues = QueueConstants.QUEUE_DEFAULT)
    public void agentReturn(Message message, Channel channel) {
        log.info("消费者:{}", new String(message.getBody()));
    }
    @RabbitListener(queues = "meye_queue_order_delay")
    public void orderCancelDelay(String id) {
@@ -53,16 +48,6 @@
        }
    }
    @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);
        }
    }
    @RabbitListener(queues = QueueConstants.ORDER_RETURN_MONEY)
    public void orderReturnMoney(String orderId) {
        log.info("收到订单返利消息:{}", orderId);
@@ -73,27 +58,4 @@
        }
    }
    @RabbitListener(queues = QueueConstants.PERK_MONEY)
    public void perkMoneyConsumer(String id) {
        log.info("收到补贴消息:{}", id);
        try {
            agentService.perkMoneyConsumer(Long.parseLong(id));
        } catch (Exception e) {
            log.error("用户补贴异常", e);
            // todo 更新表
        }
    }
    @RabbitListener(queues = QueueConstants.FORCE_VOUCHER_SALE)
    public void forceVoucherSaleConsumer(String price) {
        log.info("收到强制卖出消息,价格:{}",price);
        try {
//            memberProfitService.selaHalfVoucher(prisce);
        } catch (Exception e) {
            log.error("强制卖出异常", e);
            // todo 更新表
        }
    }
}
src/main/resources/mapper/modules/MallMemberMapper.xml
@@ -491,4 +491,15 @@
            a.account_level = 3
        </if>
    </select>
    <select id="selectOwnCntByInviteIdAndAccountLevel" resultType="cc.mrbird.febs.mall.entity.MallMember">
        select IFNULL(count(1),0) from mall_member x where x.referrer_id=#{inviteId}
        and x.level != 'ZERO_LEVEL'
        <if test="accountLevel == 2">
            and x.account_level = 2
        </if>
        <if test="accountLevel == 3">
            and x.accountLevel in (2, 3)
        </if>
    </select>
</mapper>
src/main/resources/templates/febs/views/modules/goods/goodsAddNew.html
@@ -131,6 +131,14 @@
                                                <div class="layui-form-mid layui-word-aux">普通商品直推奖励</div>
                                            </div>
                                        </div>
                                        <div class="layui-form-item normal-set">
                                            <label class="layui-form-label febs-form-item-require">分红比例(%)</label>
                                            <div class="layui-input-block">
                                                <input type="text" name="normalPer" placeholder="请输入分红比例"
                                                       autoComplete="off" class="layui-input">
                                                <div class="layui-form-mid layui-word-aux">普通商品分红,输入0则不分红。</div>
                                            </div>
                                        </div>
                                    </div>
                                    <div class="layui-tab-item">
src/main/resources/templates/febs/views/modules/goods/goodsUpdateNew.html
@@ -141,6 +141,15 @@
                                                <div class="layui-form-mid layui-word-aux">普通商品直推奖励</div>
                                            </div>
                                        </div>
                                        <div class="layui-form-item normal-set">
                                            <label class="layui-form-label febs-form-item-require">分红比例(%)</label>
                                            <div class="layui-input-block">
                                                <input type="text" name="normalPer" placeholder="请输入分红比例"
                                                       autoComplete="off" class="layui-input">
                                                <div class="layui-form-mid layui-word-aux">普通商品分红,输入0则不分红。</div>
                                            </div>
                                        </div>
                                    </div>
                                    <div class="layui-tab-item">