15 files modified
2 files added
| | |
| | | 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()); |
| | | } |
| | | } |
| | |
| | | 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); |
| | | // } |
| | | // } |
| | | } |
| | | } |
| | | } |
| | |
| | | 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; |
| | | } |
| | |
| | | * 层级遍历,查到子节点未满3个的节点 |
| | | * @return |
| | | */ |
| | | public MemberNode findNotWholeNode() { |
| | | public MemberNode findNotWholeNode(MemberNode root) { |
| | | ArrayDeque<MemberNode> deque = new ArrayDeque<>(); |
| | | deque.add(root); |
| | | |
| | |
| | | return result; |
| | | } |
| | | |
| | | public MemberNode findNotWholeNode() { |
| | | return findNotWholeNode(root); |
| | | } |
| | | |
| | | /** |
| | | * 查找整个树下对应节点 |
| | | * @param param memberId/address/inviteId |
| | |
| | | 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); |
| | |
| | | return node; |
| | | } |
| | | |
| | | return getNode(node.CHILD, param); |
| | | MemberNode childNode = getNode(node.CHILD, param); |
| | | if (childNode != null) { |
| | | return childNode; |
| | | } |
| | | } |
| | | |
| | | return null; |
| | |
| | | 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(); |
| | | } |
| | | |
| | | |
New file |
| | |
| | | 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); |
| | | } |
| | |
| | | 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) |
| | |
| | | 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; |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | 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); |
| | | } |
| | | |
| | | /** |
| | |
| | | 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; |
| | |
| | | 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"); |
| | | |
New file |
| | |
| | | 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); |
| | | } |
| | | } |
| | |
| | | } 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")) { |
| | |
| | | |
| | | int index = 1; |
| | | for (MallMember mallMember : mallMembers) { |
| | | if (!item.getGoodsLevel().equals(mallMember.getAccountLevel())) { |
| | | break; |
| | | if (mallMember.getAccountLevel() == 1) { |
| | | continue; |
| | | } |
| | | |
| | | if (index == 2) { |
| | |
| | | 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"; |
| | | /** |
| | | * 补贴金额 , |
| | | * 分享补贴,星级补贴 |
| | |
| | | |
| | | 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; |
| | |
| | | private IAgentService agentService; |
| | | @Autowired |
| | | private IMemberProfitService memberProfitService; |
| | | |
| | | @Autowired |
| | | private IMatrixTreeNodeService matrixTreeNodeService; |
| | | |
| | | @RabbitListener(queues = "meye_queue_order_delay") |
| | | public void orderCancelDelay(String id) { |
| | |
| | | } |
| | | } |
| | | |
| | | @RabbitListener(queues = QueueConstants.MATRIX_TREE) |
| | | public void matrixTree(Long memberId) { |
| | | log.info("矩阵节点消息:{}", memberId); |
| | | matrixTreeNodeService.addTreeNode(memberId); |
| | | } |
| | | |
| | | } |
| | |
| | | |
| | | 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; |
| | | |
| | |
| | | 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); |
| | | } |
| | | } |
| | |
| | | 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 |
| | |
| | | <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; |
| | |
| | | } |
| | | }, 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) { |
| | |
| | | <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> |
| | |
| | | {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'} |
| | | ]] |
| | | }); |
| | | } |
| | |
| | | |
| | | 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 |
| | |
| | | |
| | | 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); |
| | | } |
| | | |
| | | } |