Hentua
2023-06-06 09eca02701d369e82b29c08b403688648c1d4bc6
矩阵修改
15 files modified
2 files added
283 ■■■■ changed files
src/main/java/cc/mrbird/febs/common/configure/RabbitConfigure.java 20 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/common/runner/FebsStartedUpRunner.java 18 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/common/tree/MatrixTree.java 30 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/init/MatrixTreeInit.java 5 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/IMatrixTreeNodeService.java 10 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java 32 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/MatrixTreeNodeServiceImpl.java 64 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java 6 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/rabbit/constants/QueueConstants.java 1 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/rabbit/consumer/AgentConsumer.java 10 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/rabbit/enumerates/RabbitQueueEnum.java 6 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/rabbit/producter/AgentProducer.java 5 ●●●●● patch | view | raw | blame | history
src/main/resources/application-dev.yml 2 ●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/mallMember/mallMemberList.html 9 ●●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/order/orderList.html 23 ●●●●● patch | view | raw | blame | history
src/test/java/cc/mrbird/febs/TreeTest.java 40 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/common/configure/RabbitConfigure.java
@@ -185,4 +185,24 @@
        return BindingBuilder.bind(orderBonusQueue()).to(orderBonusExchange()).with(RabbitQueueEnum.ORDER_BONUS.getRoute());
    }
    //订单分红 end
    /**
     * 矩阵节点
     * @return
     */
    @Bean
    public DirectExchange matrixTreeExchange() {
        return new DirectExchange(RabbitQueueEnum.MATRIX_TREE.getExchange());
    }
    @Bean
    public Queue matrixTreeQueue() {
        return new Queue(QueueConstants.MATRIX_TREE);
    }
    @Bean
    public Binding matrixTreeBind() {
        return BindingBuilder.bind(matrixTreeQueue()).to(matrixTreeExchange()).with(RabbitQueueEnum.MATRIX_TREE.getRoute());
    }
}
src/main/java/cc/mrbird/febs/common/runner/FebsStartedUpRunner.java
@@ -65,15 +65,15 @@
            log.info("                                                      ");
            log.info("国潮奢美 权限系统启动完毕,地址:{}", url);
            boolean auto = febsProperties.isAutoOpenBrowser();
            if (auto && StringUtils.equalsIgnoreCase(active, FebsConstant.DEVELOP)) {
                String os = System.getProperty("os.name");
                // 默认为 windows时才自动打开页面
                if (StringUtils.containsIgnoreCase(os, FebsConstant.SYSTEM_WINDOWS)) {
                    //使用默认浏览器打开系统登录页
                    Runtime.getRuntime().exec("cmd  /c  start " + url);
                }
            }
//            boolean auto = febsProperties.isAutoOpenBrowser();
//            if (auto && StringUtils.equalsIgnoreCase(active, FebsConstant.DEVELOP)) {
//                String os = System.getProperty("os.name");
//                // 默认为 windows时才自动打开页面
//                if (StringUtils.containsIgnoreCase(os, FebsConstant.SYSTEM_WINDOWS)) {
//                    //使用默认浏览器打开系统登录页
//                    Runtime.getRuntime().exec("cmd  /c  start " + url);
//                }
//            }
        }
    }
}
src/main/java/cc/mrbird/febs/common/tree/MatrixTree.java
@@ -40,7 +40,20 @@
            return null;
        }
        MemberNode parentNode = findNotWholeNode();
        MemberNode childTreeRoot = getNode(node.getRefererId());
        MemberNode parentNode = findNotWholeNode(childTreeRoot == null ? root : childTreeRoot);
        parentNode.addNode(node);
        return parentNode;
    }
    public MemberNode addNode(MemberNode node, Long parentNodeId) {
        if (parentNodeId == null) {
            root = node;
            return null;
        }
        MemberNode parentNode = getNode(parentNodeId);
        parentNode.addNode(node);
        return parentNode;
    }
@@ -49,7 +62,7 @@
     * 层级遍历,查到子节点未满3个的节点
     * @return
     */
    public MemberNode findNotWholeNode() {
    public MemberNode findNotWholeNode(MemberNode root) {
        ArrayDeque<MemberNode> deque = new ArrayDeque<>();
        deque.add(root);
@@ -77,6 +90,10 @@
        return result;
    }
    public MemberNode findNotWholeNode() {
        return findNotWholeNode(root);
    }
    /**
     * 查找整个树下对应节点
     * @param param memberId/address/inviteId
@@ -85,6 +102,10 @@
    public MemberNode getNode(Object param) {
        if (root == null) {
            return null;
        }
        if (root.getMemberId().equals(param) || root.getPhone().equals(param) || root.getInviteId().equals(param)) {
            return root;
        }
        return getNode(root.CHILD, param);
@@ -107,7 +128,10 @@
                return node;
            }
            return getNode(node.CHILD, param);
            MemberNode childNode = getNode(node.CHILD, param);
            if (childNode != null) {
                return childNode;
            }
        }
        return null;
src/main/java/cc/mrbird/febs/mall/init/MatrixTreeInit.java
@@ -35,8 +35,11 @@
            memberNode.setMemberId(node.getTreeNode());
            memberNode.setPhone(node.getPhone());
            memberNode.setInviteId(node.getInviteId());
            MatrixTree.getInstance().addNode(memberNode);
            memberNode.setRefererId(node.getReferrerId());
            MatrixTree.getInstance().addNode(memberNode, node.getParentNode());
        }
        MatrixTree instance = MatrixTree.getInstance();
    }
src/main/java/cc/mrbird/febs/mall/service/IMatrixTreeNodeService.java
New file
@@ -0,0 +1,10 @@
package cc.mrbird.febs.mall.service;
import cc.mrbird.febs.common.tree.MemberNode;
import cc.mrbird.febs.mall.entity.MatrixTreeNode;
import com.baomidou.mybatisplus.extension.service.IService;
public interface IMatrixTreeNodeService extends IService<MatrixTreeNode> {
    public MemberNode addTreeNode(Long memberId);
}
src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java
@@ -49,8 +49,7 @@
    private final SqlSessionTemplate sqlSessionTemplate;
    private final MallMoneyFlowMapper mallMoneyFlowMapper;
    private final MallMqRecordMapper mallMqRecordMapper;
    private final MatrixTreeNodeMapper matrixTreeNodeMapper;
    private final IMatrixTreeNodeService matrixTreeNodeService;
    @Override
    @Transactional(rollbackFor = Exception.class)
@@ -61,30 +60,9 @@
            return;
        }
        MatrixTree tree = MatrixTree.getInstance();
        MemberNode node = tree.getNode(member.getInviteId());
        if (node != null) {
            return;
        }
        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 == null ? null : parentNode.getMemberId());
        matrixTreeNodeMapper.insert(matrixTreeNode);
        MemberNode parentNode = matrixTreeNodeService.addTreeNode(memberId);
        if (parentNode == null) {
            log.info("父级节点未找到:{}", memberId);
            return;
        }
@@ -102,12 +80,12 @@
        }
        MallMember parentMember = memberMapper.selectById(parentNode.getMemberId());
        parentMember.setChildNodeCnt(parentNode.CHILD.size());
        int levelCode = MemberLevelEnum.getLevelCode(parentMember.getLevel());
        if (Integer.parseInt(dic.getValue()) >= levelCode) {
            parentMember.setChildNodeCnt(parentNode.CHILD.size());
            parentMember.setLevel(dic.getCode());
            memberMapper.updateById(parentMember);
        }
        memberMapper.updateById(parentMember);
    }
    /**
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java
@@ -15,6 +15,7 @@
import cc.mrbird.febs.mall.service.IApiMallMemberWalletService;
import cc.mrbird.febs.mall.service.ICommonService;
import cc.mrbird.febs.mall.vo.*;
import cc.mrbird.febs.rabbit.producter.AgentProducer;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.IdUtil;
@@ -114,6 +115,7 @@
        mallMember.setAccountType(MallMember.ACCOUNT_TYPE_NORMAL);
        mallMember.setLevel(AgentLevelEnum.ZERO_LEVEL.getCode());
        mallMember.setSex(registerDto.getSex());
        mallMember.setInsideWith(1);
        mallMember.setBindPhone(registerDto.getAccount());
        mallMember.setSkin("default");
src/main/java/cc/mrbird/febs/mall/service/impl/MatrixTreeNodeServiceImpl.java
New file
@@ -0,0 +1,64 @@
package cc.mrbird.febs.mall.service.impl;
import cc.mrbird.febs.common.tree.MatrixTree;
import cc.mrbird.febs.common.tree.MemberNode;
import cc.mrbird.febs.mall.entity.MallMember;
import cc.mrbird.febs.mall.entity.MatrixTreeNode;
import cc.mrbird.febs.mall.mapper.MallMemberMapper;
import cc.mrbird.febs.mall.mapper.MatrixTreeNodeMapper;
import cc.mrbird.febs.mall.service.IMatrixTreeNodeService;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@Slf4j
@Service
@RequiredArgsConstructor
public class MatrixTreeNodeServiceImpl extends ServiceImpl<MatrixTreeNodeMapper, MatrixTreeNode> implements IMatrixTreeNodeService {
    private final MallMemberMapper mallMemberMapper;
    private final MatrixTreeNodeMapper matrixTreeNodeMapper;
    @Override
    public MemberNode addTreeNode(Long memberId) {
        MallMember mallMember = mallMemberMapper.selectById(memberId);
        if (mallMember == null) {
            return null;
        }
        MatrixTree instance = MatrixTree.getInstance();
        MemberNode node = instance.getNode(memberId);
        if (node != null) {
            return null;
        }
        if (StrUtil.isNotBlank(mallMember.getReferrerId())) {
            MemberNode parentNode = instance.getNode(mallMember.getReferrerId());
            MemberNode notWholeNode = null;
            if (parentNode != null) {
                notWholeNode = instance.findNotWholeNode(parentNode);
            } else {
                notWholeNode = instance.findNotWholeNode();
            }
            MatrixTreeNode treeNode = new MatrixTreeNode();
            treeNode.setTreeNode(mallMember.getId());
            treeNode.setParentNode(notWholeNode.getMemberId());
            matrixTreeNodeMapper.insert(treeNode);
        } else {
            MatrixTreeNode treeNode = new MatrixTreeNode();
            treeNode.setTreeNode(mallMember.getId());
            matrixTreeNodeMapper.insert(treeNode);
        }
        node = new MemberNode();
        node.setPhone(mallMember.getPhone());
        node.setMemberId(memberId);
        node.setInviteId(mallMember.getInviteId());
        node.setRefererId(mallMember.getReferrerId());
        return instance.addNode(node);
    }
}
src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java
@@ -116,7 +116,7 @@
            } else {
                // 判断上级是否与自己购买的套餐符合,若符合则走3级直推逻辑,若不符合则另外一个
                if (parentMember.getAccountLevel() >= item.getGoodsLevel()) {
                if (parentMember.getAccountLevel() == 1 && item.getGoodsLevel() != 1) {
                    for (DataDictionaryCustom dataDic : dataDices) {
                        JSONObject jsonObject = JSONObject.parseObject(dataDic.getValue());
                        if (directCnt >= jsonObject.getInteger("pushCnt")) {
@@ -149,8 +149,8 @@
                int index = 1;
                for (MallMember mallMember : mallMembers) {
                    if (!item.getGoodsLevel().equals(mallMember.getAccountLevel())) {
                        break;
                    if (mallMember.getAccountLevel() == 1) {
                        continue;
                    }
                    if (index == 2) {
src/main/java/cc/mrbird/febs/rabbit/constants/QueueConstants.java
@@ -11,6 +11,7 @@
    public static final String AGENT_RETURN_MONEY = "meye_queue_agent_return_money";
    public static final String ORDER_RETURN_MONEY = "meye_queue_order_return_money";
    public static final String ORDER_BONUS = "meye_queue_order_bonus";
    public static final String MATRIX_TREE = "meye_queue_matrix_tree";
    /**
     * 补贴金额 ,
     *      分享补贴,星级补贴
src/main/java/cc/mrbird/febs/rabbit/consumer/AgentConsumer.java
@@ -2,6 +2,7 @@
import cc.mrbird.febs.mall.service.IAgentService;
import cc.mrbird.febs.mall.service.IApiMallOrderInfoService;
import cc.mrbird.febs.mall.service.IMatrixTreeNodeService;
import cc.mrbird.febs.mall.service.IMemberProfitService;
import cc.mrbird.febs.rabbit.constants.QueueConstants;
import cc.mrbird.febs.rabbit.enumerates.RabbitQueueEnum;
@@ -28,6 +29,9 @@
    private IAgentService agentService;
    @Autowired
    private IMemberProfitService memberProfitService;
    @Autowired
    private IMatrixTreeNodeService matrixTreeNodeService;
    @RabbitListener(queues = "meye_queue_order_delay")
    public void orderCancelDelay(String id) {
@@ -68,4 +72,10 @@
        }
    }
    @RabbitListener(queues = QueueConstants.MATRIX_TREE)
    public void matrixTree(Long memberId) {
        log.info("矩阵节点消息:{}", memberId);
        matrixTreeNodeService.addTreeNode(memberId);
    }
}
src/main/java/cc/mrbird/febs/rabbit/enumerates/RabbitQueueEnum.java
@@ -34,7 +34,11 @@
    FORCE_VOUCHER_SALE("meye_exchange_force_voucher_sale",
            "meye_route_key_force_voucher_sale",
            "meye_queue_force_voucher_sale");
            "meye_queue_force_voucher_sale"),
    MATRIX_TREE("meye_exchange_matrix_tree",
                               "meye_route_key_matrix_tree",
                               "meye_queue_matrix_tree");
    private String exchange;
src/main/java/cc/mrbird/febs/rabbit/producter/AgentProducer.java
@@ -92,4 +92,9 @@
        log.info("发送订单分红消息:{}", orderId);
        rabbitTemplate.convertAndSend(RabbitQueueEnum.ORDER_BONUS.getExchange(), RabbitQueueEnum.ORDER_BONUS.getRoute(), orderId);
    }
    public void sendMatrixTree(Long memberId) {
        log.info("发送矩阵节点消息:{}", memberId);
        rabbitTemplate.convertAndSend(RabbitQueueEnum.MATRIX_TREE.getExchange(), RabbitQueueEnum.MATRIX_TREE.getRoute(), memberId);
    }
}
src/main/resources/application-dev.yml
@@ -18,7 +18,7 @@
          username: ct_test
          password: 123456
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://120.27.238.55:3406/db_meiye_prd?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&allowMultiQueries=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2b8
          url: jdbc:mysql://120.27.238.55:3406/db_meiye_mall?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&allowMultiQueries=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2b8
#          username: db_meiye
#          password: meiye#@!321
#          driver-class-name: com.mysql.cj.jdbc.Driver
src/main/resources/templates/febs/views/modules/mallMember/mallMemberList.html
@@ -71,6 +71,14 @@
    <input type="checkbox" value={{d.id}} lay-text="正常|禁用" lay-skin="switch" lay-filter="switchStatus">
    {{# } }}
</script>
<script type="text/html" id="switchInsideWith">
    {{# if(d.insideWith === 1) { }}
    <input type="checkbox" value={{d.id}} lay-text="正常|禁用" checked lay-skin="switch" lay-filter="switchInsideWith">
    {{# } else { }}
    <input type="checkbox" value={{d.id}} lay-text="正常|禁用" lay-skin="switch" lay-filter="switchInsideWith">
    {{# } }}
</script>
<style>
    .layui-form-onswitch {
        background-color: #5FB878 !important;
@@ -248,6 +256,7 @@
                            }
                        }, minWidth: 100,align:'left'},
                    {field: 'accountStatus', title: '账号状态', templet: '#switchStatus', minWidth: 100,align:'left'},
                    {field: 'insideWith', title: '余额转增', templet: '#switchInsideWith', minWidth: 100,align:'left'},
                    {field: 'createdTime', title: '注册时间', minWidth: 180,align:'left'},
                    // {title: '操作',
                    //     templet: function (d) {
src/main/resources/templates/febs/views/modules/order/orderList.html
@@ -100,8 +100,6 @@
        <button class="layui-btn layui-btn-normal layui-btn-xs" type="button" shiro:hasPermission="orderDetail:view" lay-event="seeOrder">详情</button>
        <button class="layui-btn layui-btn-normal layui-btn-xs" type="button" shiro:hasPermission="orderMoneyFlow:update" lay-event="orderMoneyFlow">资金流水</button>
    {{# } else if(d.status === 7) { }}
<!--    <button class="layui-btn layui-btn-normal layui-btn-xs" type="button" shiro:hasPermission="orderDetail:view" lay-event="seeOrder">详情</button>-->
<!--    <button class="layui-btn layui-btn-normal layui-btn-xs" type="button" shiro:hasPermission="orderMoneyFlow:update" lay-event="orderMoneyFlow">资金流水</button>-->
    <button class="layui-btn layui-btn-normal layui-btn-xs" type="button" shiro:hasPermission="orderMoneyFlow:update" lay-event="delOrder">删除</button>
    {{# } else { }}
    <button class="layui-btn layui-btn-normal layui-btn-xs" type="button" shiro:hasPermission="orderDetail:view" lay-event="seeOrder">详情</button>
@@ -330,27 +328,6 @@
                        {field: 'payOrderNo', title: '支付订单号', minWidth: 200,align:'left'},
                        {title: '操作', minWidth: 200 ,toolbar: '#mall-order-option',hide:mallOrderOption,align:'left', fixed:'right'},
                        // {title: '操作',
                        //     templet: function (d) {
                        //             if (d.status === 2) {
                        //                 if(d.deliverType ===2){
                        //                     return '<button class="layui-btn layui-btn-normal layui-btn-xs layui-btn-success" lay-event="takeGoods" shiro:hasPermission="user:update">自提</button>'
                        //                     +'<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="seeOrder" shiro:hasPermission="user:update">详情</button>'
                        //                     +'<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="orderMoneyFlow" shiro:hasPermission="orderMoneyFlow:update">资金流水</button>'
                        //                 }else{
                        //                     return '<button class="layui-btn layui-btn-normal layui-btn-xs layui-btn-success" lay-event="deliverGoods" shiro:hasPermission="user:update">发货</button>'
                        //                         +'<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="seeOrder" shiro:hasPermission="user:update">详情</button>'
                        //                         +'<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="orderMoneyFlow" shiro:hasPermission="orderMoneyFlow:update">资金流水</button>'
                        //                 }
                        //             }else if(d.status === 7){
                        //                 return '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="seeOrder" shiro:hasPermission="user:update">详情</button>'
                        //                     +'<button class="layui-btn layui-btn-xs layui-btn-normal layui-btn-danger" lay-event="delOrder" shiro:hasPermission="user:update">删除</button>'
                        //                     +'<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="orderMoneyFlow" shiro:hasPermission="orderMoneyFlow:update">资金流水</button>'
                        //             }else{
                        //                 return '<button class="layui-btn layui-btn-normal layui-btn-xs " lay-event="seeOrder" shiro:hasPermission="user:update">详情</button>'
                        //                     +'<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="orderMoneyFlow" shiro:hasPermission="orderMoneyFlow:update">资金流水</button>'
                        //             }
                        //     },minWidth: 200,align:'center', fixed:'right'}
                ]]
            });
        }
src/test/java/cc/mrbird/febs/TreeTest.java
@@ -2,9 +2,20 @@
import cc.mrbird.febs.common.tree.MatrixTree;
import cc.mrbird.febs.common.tree.MemberNode;
import cc.mrbird.febs.mall.entity.MallMember;
import cc.mrbird.febs.mall.entity.MallOrderInfo;
import cc.mrbird.febs.mall.mapper.MallMemberMapper;
import cc.mrbird.febs.mall.mapper.MallOrderInfoMapper;
import cc.mrbird.febs.mall.service.IAgentService;
import cc.mrbird.febs.mall.service.IMatrixTreeNodeService;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
/**
 * @author wzy
@@ -27,4 +38,33 @@
        System.out.println(111);
    }
    @Autowired
    private MallMemberMapper mallMemberMapper;
    @Autowired
    private IMatrixTreeNodeService matrixTreeNodeService;
    @Autowired
    private MallOrderInfoMapper mallOrderInfoMapper;
    @Autowired
    private IAgentService agentService;
    @Test
    public void initMemberTreeTest() {
        LambdaQueryWrapper<MallOrderInfo> orderQuery = new LambdaQueryWrapper<>();
        orderQuery.eq(MallOrderInfo::getStatus, 2)
                .eq(MallOrderInfo::getOrderType, 1)
                .orderByAsc(MallOrderInfo::getId);
        List<MallOrderInfo> mallOrderInfos = mallOrderInfoMapper.selectList(orderQuery);
        for (MallOrderInfo mallOrderInfo : mallOrderInfos) {
            agentService.autoUpAgentLevel(mallOrderInfo.getMemberId());
        }
        MatrixTree instance = MatrixTree.getInstance();
        System.out.println(111);
    }
}