fix
Hentua
2023-04-19 a8a40896108ac780a55ecc504cecdfd041ab2838
fix
6 files added
12 files modified
602 ■■■■■ changed files
src/main/java/cc/mrbird/febs/common/enumerates/MemberLevelEnums.java 29 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/common/tree/MatrixTree.java 2 ●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/common/tree/MemberNode.java 6 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/ViewSystemController.java 4 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/dto/AddMallGoodsDto.java 4 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/dto/MallGoodsUpdateDto.java 4 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/entity/MallMember.java 5 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/entity/MatrixTreeNode.java 29 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/init/MatrixTreeInit.java 43 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/mapper/MatrixTreeNodeMapper.java 14 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/quartz/ProfitJob.java 94 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java 76 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java 8 ●●●● patch | view | raw | blame | history
src/main/resources/mapper/modules/MatrixTreeNodeMapper.xml 14 ●●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/goods/goodsAddNew.html 62 ●●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/goods/goodsUpdateNew.html 66 ●●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/system/bonusSetting.html 140 ●●●●● patch | view | raw | blame | history
src/test/java/cc/mrbird/febs/TreeTest.java 2 ●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/common/enumerates/MemberLevelEnums.java
New file
@@ -0,0 +1,29 @@
package cc.mrbird.febs.common.enumerates;
import lombok.Getter;
@Getter
public enum MemberLevelEnums {
    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", "贤仕");
    private int male;
    private String code;
    private String desc;
    MemberLevelEnums(int male, String code, String desc) {
        this.male = male;
        this.code = code;
        this.desc = desc;
    }
}
src/main/java/cc/mrbird/febs/common/tree/MatrixTree.java
@@ -103,7 +103,7 @@
        }
        for (MemberNode node : nodeList) {
            if (node.getMemberId().equals(param) || node.getAddress().equals(param) || node.getInviteId().equals(param)) {
            if (node.getMemberId().equals(param) || node.getPhone().equals(param) || node.getInviteId().equals(param)) {
                return node;
            }
src/main/java/cc/mrbird/febs/common/tree/MemberNode.java
@@ -14,7 +14,7 @@
    private Long memberId;
    private String address;
    private String phone;
    private String inviteId;
@@ -22,9 +22,9 @@
    public List<MemberNode> CHILD = new LinkedList<>();
    public MemberNode(Long memberId, String address, String inviteId, String refererId) {
    public MemberNode(Long memberId, String phone, String inviteId, String refererId) {
        this.memberId = memberId;
        this.address = address;
        this.phone = phone;
        this.inviteId = inviteId;
        this.refererId = refererId;
    }
src/main/java/cc/mrbird/febs/mall/controller/ViewSystemController.java
@@ -46,6 +46,10 @@
    public String profitSetting() {
        return FebsUtil.view("modules/system/profitSetting");
    }
    @GetMapping("bonusSetting")
    public String bonusSetting() {
        return FebsUtil.view("modules/system/bonusSetting");
    }
    /**
     * 积分设置
src/main/java/cc/mrbird/febs/mall/dto/AddMallGoodsDto.java
@@ -92,4 +92,8 @@
     */
    private Integer scorePercent;
    private Integer goodsLevel;
    private Integer normalPer;
}
src/main/java/cc/mrbird/febs/mall/dto/MallGoodsUpdateDto.java
@@ -95,4 +95,8 @@
     * 积分兑换比例
     */
    private Integer scorePercent;
    private Integer goodsLevel;
    private Integer normalPer;
}
src/main/java/cc/mrbird/febs/mall/entity/MallMember.java
@@ -167,4 +167,9 @@
     * 账号级别 1-会员 2-代理 3-股东
     */
    private Integer accountLevel;
    /**
     * 伞下数量
     */
    private Integer childNodeCnt;
}
src/main/java/cc/mrbird/febs/mall/entity/MatrixTreeNode.java
New file
@@ -0,0 +1,29 @@
package cc.mrbird.febs.mall.entity;
import cc.mrbird.febs.common.entity.BaseEntity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
@Data
@TableName(value = "matrix_tree_node")
public class MatrixTreeNode extends BaseEntity {
    private Long treeNode;
    private Long parentNode;
    private Integer deep;
    @TableField(exist = false)
    private String phone;
    @TableField(exist = false)
    private String name;
    @TableField(exist = false)
    private String inviteId;
    @TableField(exist = false)
    private String referrerId;
}
src/main/java/cc/mrbird/febs/mall/init/MatrixTreeInit.java
New file
@@ -0,0 +1,43 @@
package cc.mrbird.febs.mall.init;
import cc.mrbird.febs.common.tree.MatrixTree;
import cc.mrbird.febs.common.tree.MemberNode;
import cc.mrbird.febs.mall.entity.MatrixTreeNode;
import cc.mrbird.febs.mall.mapper.MatrixTreeNodeMapper;
import cn.hutool.core.collection.CollUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.util.List;
/**
 * 初始化
 */
@Slf4j
@Component
public class MatrixTreeInit {
    @Autowired
    private MatrixTreeNodeMapper matrixTreeNodeMapper;
    @PostConstruct
    public void init() {
        List<MatrixTreeNode> tree = matrixTreeNodeMapper.selectAllMatrixTreeNode();
        if (CollUtil.isEmpty(tree)) {
            return;
        }
        for (MatrixTreeNode node : tree) {
            MemberNode memberNode = new MemberNode();
            memberNode.setMemberId(node.getTreeNode());
            memberNode.setPhone(node.getPhone());
            memberNode.setInviteId(node.getInviteId());
            MatrixTree.getInstance().addNode(memberNode);
        }
    }
}
src/main/java/cc/mrbird/febs/mall/mapper/MatrixTreeNodeMapper.java
New file
@@ -0,0 +1,14 @@
package cc.mrbird.febs.mall.mapper;
import cc.mrbird.febs.mall.entity.MatrixTreeNode;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface MatrixTreeNodeMapper extends BaseMapper<MatrixTreeNode> {
    List<MatrixTreeNode> selectAllMatrixTreeNode();
    MatrixTreeNode selectByTreeNode(@Param("treeNode") Long treeNode);
}
src/main/java/cc/mrbird/febs/mall/quartz/ProfitJob.java
@@ -40,97 +40,9 @@
    /**
     * 代理分红
     */
//    @Scheduled(cron = "0 30 0 * * ?")
//    public void profitJob() {
//        memberProfitService.agentProfit(null);
//    }
//    @Scheduled(cron = "0 30 1 * * ?")
//    public void storeAndDirectorJob() {
//        memberProfitService.storeAndDirectorProfit(null);
//    }
//    /**
//     * 线下服务中心补贴
//     */
//    @Scheduled(cron = "0 0 1 * * ?")
//    public void thankfulJob() {
//        memberProfitService.thankfulProfit(null);
//    }
    /**
     * 代理商补贴 TODO 需要去掉注释
     */
    @Scheduled(cron = "0 0 1 * * ?")
    public void agentPerkJob() {
        memberProfitService.agentPerkJob(null);
    @Scheduled(cron = "0 30 0 * * ?")
    public void profitJob() {
        memberProfitService.agentProfit(null);
    }
    /**
     * 线下服务中心补贴
     */
    @Scheduled(cron = "0 0 1 * * ?")
    public void offLinePerkJob() {
        memberProfitService.offLinePerkJob(null);
    }
    /**
     * 平级奖励补贴
     */
    @Scheduled(cron = "0 0 1 * * ?")
    public void teamEqualsPerkJob() {
        memberProfitService.teamEqualsPerkJob(null);
    }
    /**
     * 补贴消息--重试
     *  一个小时运行一次
     */
    @Scheduled(cron = "0 0/5 * * * ?")
    public void mqPerkRetryJob() {
        memberProfitService.mqPerkRetryJob();
    }
    /**
     * 联创、合伙人的每日绿色凭证释放
     */
    @Scheduled(cron = "0 0 1 * * ?")
    public void scoreRecordReleaseJob() {
        memberProfitService.scoreRecordReleaseJob();
    }
    /**
     * 业绩产生凭证
     */
    @Scheduled(cron = "0 0 1 * * ?")
    public void achieveReleaseJob() {
        memberProfitService.achieveReleaseJob();
    }
    /**
     * 静态分红
     */
//    @Scheduled(cron = "0 0 0 * * ?")
//    public void staticProfitJob() {
//        memberProfitService.staticProfit(null);
//    }
    /**
     * 排名奖 每月1号
     */
//    @Scheduled(cron = "0 30 0 1 * ?")
//    public void rankJob() {
//        memberProfitService.rankProfit();
//    }
    /**
     * 积分池,所有消费拿出10%放到积分池,然后按1%每天释放加权平分
     */
//    @Scheduled(cron = "0 0 2 * * ?")
//    @Scheduled(cron = "0 0/5 * * * ? ")
//    public void scorePool() {
//        memberProfitService.scorePool();
//    }
}
src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java
@@ -1,6 +1,9 @@
package cc.mrbird.febs.mall.service.impl;
import cc.mrbird.febs.common.enumerates.*;
import cc.mrbird.febs.common.tree.MatrixTree;
import cc.mrbird.febs.common.tree.MemberNode;
import cc.mrbird.febs.common.utils.AppContants;
import cc.mrbird.febs.common.utils.MallUtils;
import cc.mrbird.febs.mall.entity.*;
import cc.mrbird.febs.mall.mapper.*;
@@ -41,54 +44,59 @@
    private final MallMemberMapper memberMapper;
    private final MallOrderInfoMapper mallOrderInfoMapper;
    private final IApiMallMemberWalletService iApiMallMemberWalletService;
    private final IMallMoneyFlowService mallMoneyFlowService;
    private final MallMemberWalletMapper mallMemberWalletMapper;
    private final SqlSessionTemplate sqlSessionTemplate;
    private final IApiMallMemberWalletService memberWalletService;
    private final MallMoneyFlowMapper mallMoneyFlowMapper;
    private final MallMqRecordMapper mallMqRecordMapper;
    private final MatrixTreeNodeMapper matrixTreeNodeMapper;
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void autoUpAgentLevel(Long memberId) {
        log.info("###代理自动升级###");
        MallMember member = memberMapper.selectById(memberId);
        if(StrUtil.isBlank(member.getReferrerIds())) {
        MatrixTree tree = MatrixTree.getInstance();
        MemberNode node = tree.getNode(member.getInviteId());
        if (node != null) {
            return;
        }
        List<String> ids = StrUtil.split(member.getReferrerIds(), ',');
        List<MallMember> parentMembers = memberMapper.selectByInviteIds(ids);
        for (MallMember parent : parentMembers) {
            // 没有购买套餐无法升级合伙人等级
            if (AgentLevelEnum.ZERO_LEVEL.name().equals(member.getLevel())) {
                continue;
            }
            //合伙人的下一个层级
            String parentLevel = parent.getLevel();
            String nextLevel = MemberLevelEnum.SECOND_LEVEL.getNextLevel(parentLevel);
            if (parentLevel.equals(nextLevel)) {
                log.info("当前层级无下一级:{}", parent.getLevel());
                continue;
            }
            DataDictionaryCustom nextLevelDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode("AGENT_LEVEL_REQUIRE", nextLevel);
            AgentInfo agentInfo = JSONObject.parseObject(nextLevelDic.getValue(), AgentInfo.class);
            if (!directMemberCnt(parent, agentInfo)) {
                continue;
            }
            if (!agentCntFinish(parent, agentInfo)) {
                continue;
            }
            if (!teamIncome(parent, agentInfo)) {
                continue;
            }
            parent.setLevel(nextLevel);
            memberMapper.updateById(parent);
        MatrixTreeNode matrixTreeNode = matrixTreeNodeMapper.selectByTreeNode(memberId);
        if (matrixTreeNode != null) {
            return;
        }
        node = new MemberNode();
        node.setInviteId(member.getInviteId());
        node.setPhone(member.getPhone());
        node.setRefererId(member.getReferrerId());
        node.setMemberId(member.getId());
        MemberNode parentNode = tree.addNode(node);
        matrixTreeNode = new MatrixTreeNode();
        matrixTreeNode.setTreeNode(memberId);
        matrixTreeNode.setParentNode(parentNode.getMemberId());
        matrixTreeNodeMapper.insert(matrixTreeNode);
        List<DataDictionaryCustom> dicList = dataDictionaryCustomMapper.selectDicByType(AppContants.AGENT_LEVEL);
        DataDictionaryCustom dic = null;
        for (DataDictionaryCustom dataDictionaryCustom : dicList) {
            if (Integer.parseInt(dataDictionaryCustom.getValue()) == parentNode.CHILD.size()) {
                dic = dataDictionaryCustom;
            }
        }
        if (dic == null) {
            return;
        }
        MallMember parentMember = memberMapper.selectById(parentNode.getMemberId());
        parentMember.setChildNodeCnt(parentNode.CHILD.size());
        parentMember.setLevel(dic.getCode());
        memberMapper.updateById(parentMember);
    }
    /**
src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java
@@ -382,13 +382,7 @@
    @Transactional(rollbackFor = Exception.class)
    public void agentProfit(Date profitDate) {
        log.info("#####==代理分红==start==#####");
        if (profitDate == null) {
            profitDate = DateUtil.offset(new Date(), DateField.DAY_OF_YEAR, -1);
        }
        // 套餐业绩
//        BigDecimal tcIncome = mallOrderInfoMapper.selectTotalAmountUnCostForDate(profitDate, null, "D", 2);
        // 普通商品业绩
//        BigDecimal normalIncome = mallOrderInfoMapper.selectTotalAmountUnCostForDate(profitDate, null, "D", 1);
        BigDecimal totalIncome = mallAchieveRecordMapper.selectAchieveTotal("D", profitDate);
        DataDictionaryCustom dic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.AGENT_BONUS.getType(), DataDictionaryEnum.AGENT_BONUS.getCode());
src/main/resources/mapper/modules/MatrixTreeNodeMapper.xml
New file
@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cc.mrbird.febs.mall.mapper.MatrixTreeNodeMapper">
    <select id="selectAllMatrixTreeNode" resultType="cc.mrbird.febs.mall.entity.MatrixTreeNode">
        select a.*, b.phone, b.name, b.invite_id, b.referrer_id from matrix_tree_node a
          inner join mall_member b on a.tree_node=b.id
        order by a.id
    </select>
    <select id="selectByTreeNode" resultType="cc.mrbird.febs.mall.entity.MatrixTreeNode">
        select * from matrix_tree_node where tree_node=#{treeNode}
    </select>
</mapper>
src/main/resources/templates/febs/views/modules/goods/goodsAddNew.html
@@ -75,13 +75,13 @@
                                                    <div class="layui-form-mid layui-word-aux">设置商品排序位置,想排列在前,设置的数字越小</div>
                                                </div>
                                            </div>
                                            <div class="layui-col-lg6">
                                                <label class="layui-form-label febs-form-item-require">抵扣现金(%):</label>
                                                <div class="layui-input-block">
                                                    <input type="text" name="scorePercent"  lay-verify="required|integer" placeholder="" autocomplete="off" class="layui-input">
                                                    <div class="layui-word-aux">设置50,即商品价格1000,积分可抵扣的最大金额为1000*50%=500,填写整数,如【50】</div>
                                                </div>
                                            </div>
<!--                                            <div class="layui-col-lg6">-->
<!--                                                <label class="layui-form-label febs-form-item-require">抵扣现金(%):</label>-->
<!--                                                <div class="layui-input-block">-->
<!--                                                    <input type="text" name="scorePercent"  lay-verify="required|integer" placeholder="" autocomplete="off" class="layui-input">-->
<!--                                                    <div class="layui-word-aux">设置50,即商品价格1000,积分可抵扣的最大金额为1000*50%=500,填写整数,如【50】</div>-->
<!--                                                </div>-->
<!--                                            </div>-->
                                        </div>
                                        <div class="layui-form-item">
@@ -104,29 +104,33 @@
                                            </div>
                                        </div>
                                        <div class="layui-form-item febs-hide tc-set">
                                            <label class="layui-form-label">贡献值:</label>
                                        <div class="layui-form-item tc-set">
                                            <label class="layui-form-label febs-form-item-require">商品类型</label>
                                            <div class="layui-input-block">
                                                <input type="text" name="star" placeholder="请输入贡献值" autocomplete="off" class="layui-input">
                                                <div class="layui-form-mid layui-word-aux">支付后,用户获取对应的贡献值</div>
                                                <select name="goodsLevel" class="goods-level" lay-filter="goods-level-select">
                                                    <option value="1">会员套餐</option>
                                                    <option value="2">代理套餐</option>
                                                    <option value="2">股东套餐</option>
                                                </select>
                                            </div>
                                        </div>
<!--                                        <div class="layui-form-item febs-hide tc-set">-->
<!--                                            <label class="layui-form-label">静态倍数</label>-->
<!--                                            <div class="layui-input-block">-->
<!--                                                <input type="text" name="staticMulti" placeholder="请输入静态倍数" autocomplete="off" class="layui-input">-->
<!--                                                <div class="layui-form-mid layui-word-aux">支付后,赠送(购买金额*静态倍数)的赠送积分</div>-->
<!--                                            </div>-->
<!--                                        </div>-->
                                        <div class="layui-form-item febs-hide tc-set">
                                            <label class="layui-form-label">静态倍数</label>
                                            <div class="layui-input-block">
                                                <input type="text" name="staticMulti" placeholder="请输入静态倍数" autocomplete="off" class="layui-input">
                                                <div class="layui-form-mid layui-word-aux">支付后,赠送(购买金额*静态倍数)的赠送积分</div>
                                            </div>
                                        </div>
<!--                                        <div class="layui-form-item febs-hide tc-set">-->
<!--                                            <label class="layui-form-label">静态占比(%)</label>-->
<!--                                            <div class="layui-input-block">-->
<!--                                                <input type="text" name="staticProp" placeholder="请输入静态占比" autocomplete="off" class="layui-input">-->
<!--                                                <div class="layui-form-mid layui-word-aux">所有套餐静态占比相加应等于100%</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">普通商品直推奖励</div>
                                            </div>
                                        </div>
                                    </div>
                                    <div class="layui-tab-item">
@@ -661,6 +665,14 @@
                    $(this).hide();
                }
            })
            $('.normal-set').each(function () {
                if (data.value == 2) {
                    $(this).hide();
                } else {
                    $(this).show();
                }
            })
        });
    });
</script>
src/main/resources/templates/febs/views/modules/goods/goodsUpdateNew.html
@@ -83,13 +83,13 @@
                                                    <div class="layui-form-mid layui-word-aux">设置商品排序位置,想排列在前,设置的数字越小</div>
                                                </div>
                                            </div>
                                            <div class="layui-col-lg6">
                                                <label class="layui-form-label febs-form-item-require">抵扣现金(%):</label>
                                                <div class="layui-input-block">
                                                    <input type="text" name="scorePercent"  lay-verify="required|integer" placeholder="" autocomplete="off" class="layui-input">
                                                    <div class="layui-word-aux">设置50,即商品价格1000,积分可抵扣的最大金额为1000*50%=500,填写整数,如【50】</div>
                                                </div>
                                            </div>
<!--                                            <div class="layui-col-lg6">-->
<!--                                                <label class="layui-form-label febs-form-item-require">抵扣现金(%):</label>-->
<!--                                                <div class="layui-input-block">-->
<!--                                                    <input type="text" name="scorePercent"  lay-verify="required|integer" placeholder="" autocomplete="off" class="layui-input">-->
<!--                                                    <div class="layui-word-aux">设置50,即商品价格1000,积分可抵扣的最大金额为1000*50%=500,填写整数,如【50】</div>-->
<!--                                                </div>-->
<!--                                            </div>-->
                                        </div>
                                        <div class="layui-form-item">
@@ -115,30 +115,32 @@
                                        </div>
                                        <div class="layui-form-item febs-hide tc-set">
                                            <label class="layui-form-label">贡献值:</label>
                                            <label class="layui-form-label febs-form-item-require">套餐类型</label>
                                            <div class="layui-input-block">
                                                <input type="text" name="star" lay-verify="required"  placeholder="请输入贡献值" autocomplete="off" class="layui-input">
                                                <div class="layui-form-mid layui-word-aux">支付后,用户获取对应的贡献值</div>
                                                <select name="goodsLevel" class="goods-level">
                                                    <option value="1">会员套餐</option>
                                                    <option value="2">代理套餐</option>
                                                    <option value="2">股东套餐</option>
                                                </select>
                                            </div>
                                        </div>
<!--                                        <div class="layui-form-item febs-hide tc-set">-->
<!--                                            <label class="layui-form-label">静态倍数</label>-->
<!--                                            <div class="layui-input-block">-->
<!--                                                <input type="text" name="staticMulti" placeholder="请输入静态倍数"-->
<!--                                                       autoComplete="off" class="layui-input">-->
<!--                                                <div class="layui-form-mid layui-word-aux">支付后,赠送(购买金额*静态倍数)的赠送积分-->
<!--                                                </div>-->
<!--                                            </div>-->
<!--                                        </div>-->
<!--                                        <div class="layui-form-item febs-hide tc-set">-->
<!--                                            <label class="layui-form-label">静态占比(%)</label>-->
<!--                                            <div class="layui-input-block">-->
<!--                                                <input type="text" name="staticProp" placeholder="请输入静态占比"-->
<!--                                                       autoComplete="off" class="layui-input">-->
<!--                                                <div class="layui-form-mid layui-word-aux">所有套餐静态占比相加应等于100%</div>-->
<!--                                            </div>-->
<!--                                        </div>-->
                                        <div class="layui-form-item febs-hide tc-set">
                                            <label class="layui-form-label febs-form-item-require">静态倍数</label>
                                            <div class="layui-input-block">
                                                <input type="text" name="staticMulti" placeholder="请输入静态倍数" autocomplete="off" class="layui-input">
                                                <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">普通商品直推奖励</div>
                                            </div>
                                        </div>
                                    </div>
                                    <div class="layui-tab-item">
@@ -688,6 +690,7 @@
                "star": goodsInfo.star,
                "sortCnt": goodsInfo.sortCnt,
                "scorePercent": goodsInfo.scorePercent,
                "goodsLevel": goodsInfo.goodsLevel,
                "thumbs": thumbs
            });
@@ -697,6 +700,7 @@
            if (goodsInfo.isNormal == 2) {
                $(".tc-set").show();
                $(".normal-set").hide();
            }
            if (goodsInfo.hasCarriage == 1) {
@@ -778,6 +782,14 @@
                    $(this).hide();
                }
            })
            $('.normal-set').each(function () {
                if (data.value == 2) {
                    $(this).hide();
                } else {
                    $(this).show();
                }
            })
        });
    });
src/main/resources/templates/febs/views/modules/system/bonusSetting.html
New file
@@ -0,0 +1,140 @@
<div class="layui-fluid layui-anim febs-anim" id="bonus-setting" lay-title="系统返利设置">
    <div class="layui-row layui-col-space8 febs-container">
        <form class="layui-form" action="" lay-filter="bonus-setting-form">
            <div class="layui-card">
                <div class="layui-card-body">
                    <blockquote class="layui-elem-quote blue-border">直推设置</blockquote>
                    <div class="layui-tab-item layui-show">
                        <table id="agentBonus" lay-filter="agentBonus"></table>
                    </div>
                </div>
                <div class="layui-card-body">
                    <blockquote class="layui-elem-quote blue-border">全网分红设置</blockquote>
                    <div class="layui-form-item">
                        <label class="layui-form-label  febs-form-item-require">全网分红比例(%):</label>
                        <div class="layui-input-block">
                            <input type="text" name="AGENT_BONUS" lay-verify="required|integer" autocomplete="off" class="layui-input" >
                        </div>
                        <div class="layui-word-aux" style="margin-left: 150px;">设置为0则不分红</div>
                    </div>
                    <div class="layui-form-item">
                        <label class="layui-form-label  febs-form-item-require">每天分红释放比例:</label>
                        <div class="layui-input-block">
                            <input type="text" name="allCashOut" lay-verify="required|integer" autocomplete="off" class="layui-input" >
                        </div>
                        <div class="layui-word-aux" style="margin-left: 150px;">每天从分红池中释放分红的比例,设置为0则不释放</div>
                    </div>
                    <div class="layui-form-item">
                        <label class="layui-form-label  febs-form-item-require">代理全网分红比例:</label>
                        <div class="layui-input-block">
                            <input type="text" name="allCashOut" lay-verify="required|integer" autocomplete="off" class="layui-input" >
                        </div>
                        <div class="layui-word-aux" style="margin-left: 150px;"></div>
                    </div>
                    <div class="layui-form-item">
                        <label class="layui-form-label  febs-form-item-require">股东全网分红比例:</label>
                        <div class="layui-input-block">
                            <input type="text" name="allCashOut" lay-verify="required|integer" autocomplete="off" class="layui-input" >
                        </div>
                        <div class="layui-word-aux" style="margin-left: 150px;"></div>
                    </div>
                </div>
                <div class="layui-card-footer">
                    <button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="bonus-setting-form-submit" id="submit">保存</button>
                </div>
            </div>
        </form>
    </div>
</div>
<style>
    .layui-form-label {
        width: 120px;
    }
    .layui-form-item .layui-input-block {
        margin-left: 150px;
    }
    .layui-table-form .layui-form-item {
        margin-bottom: 20px !important;
    }
</style>
<script data-th-inline="javascript" type="text/javascript">
    layui.use(['dropdown', 'jquery', 'validate', 'febs', 'form', 'eleTree', 'laytpl', 'table'], function () {
        var $ = layui.jquery,
            febs = layui.febs,
            form = layui.form,
            table = layui.table,
            validate = layui.validate,
            $view = $('#bonus-setting')
            , laytpl = layui.laytpl
            , agentBonusArr;
        form.verify(validate);
        form.render();
        table.render({
            elem: '#agentBonus'
            ,cols: [[ //表头
                {field: 'pushCnt', title: '直推(个)', edit:'text'}
                ,{field: 'prop', title: '比例', edit:'text'}
            ]]
            ,data: []
        });
        table.on('edit(agentBonus)', function(obj){
            var value = obj.value //得到修改后的值
                ,data = obj.data //得到所在行所有键值
                ,field = obj.field; //得到字段
            for (let i = 0; i < agentBonusArr.length; i++) {
                if (agentBonusArr[i].code === data.code) {
                    var valueData = {};
                    valueData.pushCnt = data.pushCnt;
                    valueData.prop = data.prop;
                    agentBonusArr[i].value = JSON.stringify(valueData);
                }
            }
        });
        dicDataReq("DIRECT_BONUS_SETTING");
        function dicDataReq(type) {
            $.get(ctx + 'admin/common/findDicByType/' + type, function (r) {
                if (r.code === 200) {
                    var data = r.data;
                    if ("DIRECT_BONUS_SETTING" == type) {
                        for (let i = 0; i < data.length; i++) {
                            data[i].pushCnt = JSON.parse(data[i].value).pushCnt;
                            data[i].prop = JSON.parse(data[i].value).prop;
                        }
                        agentBonusArr = data;
                        table.reload('agentBonus', {
                            data : data
                        });
                    }
                }
            });
        }
        form.on('submit(bonus-setting-form-submit)', function (data) {
            data.field.agentBonus = agentBonusArr;
            $.ajax({
                'url':ctx + 'admin/system/bonusSystemSetting',
                'type':'post',
                'dataType':'json',
                'headers' : {'Content-Type' : 'application/json;charset=utf-8'},
                'traditional': true,
                'data':JSON.stringify(data.field),
                'success':function (data) {
                    if (data.code == 200) {
                        febs.alert.success(data.message);
                    }
                },
                'error':function () {
                    febs.alert.warn('服务器繁忙');
                }
            })
            return false;
        });
    });
</script>
src/test/java/cc/mrbird/febs/TreeTest.java
@@ -21,7 +21,7 @@
            MemberNode node = new MemberNode();
            node.setMemberId((long) i);
            node.setInviteId(String.valueOf(i));
            node.setAddress(String.valueOf(i));
            node.setPhone(String.valueOf(i));
            instance.addNode(node);
        }