package cc.mrbird.febs.dapp.service.impl;
|
|
import cc.mrbird.febs.common.contants.AppContants;
|
import cc.mrbird.febs.common.utils.LoginUserUtil;
|
import cc.mrbird.febs.common.utils.RedisUtils;
|
import cc.mrbird.febs.common.utils.SpringContextUtil;
|
import cc.mrbird.febs.dapp.dto.SystemDto;
|
import cc.mrbird.febs.dapp.entity.*;
|
import cc.mrbird.febs.dapp.mapper.*;
|
import cc.mrbird.febs.dapp.service.DappSystemService;
|
import cc.mrbird.febs.dapp.service.DappWalletService;
|
import cc.mrbird.febs.rabbit.producer.ChainProducer;
|
import cc.mrbird.febs.tree.MatrixTree;
|
import cc.mrbird.febs.tree.MemberNode;
|
import cn.hutool.core.collection.CollUtil;
|
import cn.hutool.core.date.DateUnit;
|
import cn.hutool.core.date.DateUtil;
|
import lombok.RequiredArgsConstructor;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
|
import java.math.BigDecimal;
|
import java.math.RoundingMode;
|
import java.util.*;
|
|
/**
|
* @author
|
* @date 2022-03-24
|
**/
|
@Slf4j
|
@Service
|
@RequiredArgsConstructor
|
public class DappSystemServiceImpl implements DappSystemService {
|
|
private final DappSystemDao dappSystemDao;
|
private final RedisUtils redisUtils;
|
private final DappFundFlowDao dappFundFlowDao;
|
private final DappMemberDao dappMemberDao;
|
|
private final DappAchieveTreeDao dappAchieveTreeDao;
|
private final DappAchieveMemberTreeDao dappAchieveMemberTreeDao;
|
private final DappWalletService dappWalletService;
|
|
|
@Override
|
public SystemDto system() {
|
DappMemberEntity member = LoginUserUtil.getAppUser();
|
|
SystemDto system = new SystemDto();
|
system.setBuyAmount(new BigDecimal("100"));
|
return system;
|
}
|
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
public synchronized void achieveTree(Long memberId) {
|
DappMemberEntity member = dappMemberDao.selectById(memberId);
|
|
int batchNo = 0;
|
DappAchieveTreeEntity newestTreeNode = dappAchieveTreeDao.selectNewestTreeNode();
|
if (newestTreeNode != null) {
|
if (newestTreeNode.getValidState() == 2) {
|
batchNo = newestTreeNode.getBatchNo() + 1;
|
} else {
|
batchNo = newestTreeNode.getBatchNo();
|
}
|
}
|
|
// 在大树中,插入当前节点
|
DappAchieveTreeEntity achieveTree = new DappAchieveTreeEntity();
|
achieveTree.setMidNode(memberId);
|
achieveTree.setValidState(1);
|
achieveTree.setBatchNo(batchNo);
|
dappAchieveTreeDao.insert(achieveTree);
|
|
// 在内存树(大树)中插入当前节点,并返回父节点
|
MemberNode node = new MemberNode(member.getId(), member.getAddress(), member.getInviteId(), member.getRefererId());
|
|
MatrixTree tree = MatrixTree.getInstance();
|
MemberNode exist = tree.getNode(member.getId());
|
if (exist != null) {
|
return;
|
}
|
|
MemberNode parentNode = tree.addNode(node);
|
|
// 创建该节点的矩阵
|
DappAchieveMemberTreeEntity achieveMemberTree = new DappAchieveMemberTreeEntity();
|
achieveMemberTree.setTreeNode(memberId);
|
achieveMemberTree.setTopNode(memberId);
|
achieveMemberTree.setDeep(1);
|
achieveMemberTree.setHasMoney(1);
|
if (parentNode != null) {
|
achieveMemberTree.setParentNode(parentNode.getMemberId());
|
}
|
dappAchieveMemberTreeDao.insert(achieveMemberTree);
|
|
// 激活用户状态
|
member.setActiveStatus(1);
|
dappMemberDao.updateById(member);
|
|
putIntoProfit(memberId, 2);
|
if (parentNode == null) {
|
return;
|
}
|
|
// 修改父节点在数据库中的左/右节点数据
|
DappAchieveTreeEntity treeMidNode = dappAchieveTreeDao.selectByMidNode(parentNode.getMemberId());
|
boolean isLeft = false;
|
if (parentNode.getLeft() != null && memberId.equals(parentNode.getLeft().getMemberId())) {
|
treeMidNode.setLeftNode(memberId);
|
isLeft = true;
|
} else {
|
treeMidNode.setRightNode(memberId);
|
}
|
dappAchieveTreeDao.updateById(treeMidNode);
|
|
// 更新矩阵中的数据
|
List<DappAchieveMemberTreeEntity> matrixNodes = dappAchieveMemberTreeDao.selectNotBottomNodeInMatrix(parentNode.getMemberId());
|
for (DappAchieveMemberTreeEntity matrixNode : matrixNodes) {
|
if (isLeft) {
|
matrixNode.setLeftNode(memberId);
|
} else {
|
matrixNode.setRightNode(memberId);
|
}
|
|
dappAchieveMemberTreeDao.updateById(matrixNode);
|
|
DappAchieveMemberTreeEntity newMatrixNode = new DappAchieveMemberTreeEntity();
|
newMatrixNode.setTreeNode(memberId);
|
newMatrixNode.setTopNode(matrixNode.getTopNode());
|
newMatrixNode.setParentNode(parentNode.getMemberId());
|
newMatrixNode.setHasMoney(1);
|
newMatrixNode.setDeep(matrixNode.getDeep() + 1);
|
dappAchieveMemberTreeDao.insert(newMatrixNode);
|
|
if (matrixNode.getDeep() == 2) {
|
finishMatrixTree(matrixNode.getTopNode());
|
}
|
}
|
}
|
|
// 完成矩阵树,并重置矩阵且重入
|
public void finishMatrixTree(Long memberId) {
|
List<DappAchieveMemberTreeEntity> matrixTree = dappAchieveMemberTreeDao.selectMatrixTreeByTopNode(memberId, 1);
|
// 如果达到标准,则重置该矩阵树
|
if (matrixTree.size() == 7) {
|
dappAchieveMemberTreeDao.resetMatrixTree(memberId);
|
dappAchieveMemberTreeDao.reentryMoney(memberId);
|
|
putIntoProfit(memberId, 1);
|
DappAchieveMemberTreeEntity bottomNode = dappAchieveMemberTreeDao.selectNodeByDeep(memberId, 3);
|
if (bottomNode != null) {
|
finishMatrixTree(bottomNode.getTopNode());
|
}
|
}
|
}
|
|
@Override
|
public void putIntoProfit(Long memberId, int isReIn) {
|
DappMemberEntity member = dappMemberDao.selectById(memberId);
|
DappMemberEntity parent = dappMemberDao.selectMemberInfoByInviteId(member.getRefererId());
|
|
if (parent != null) {
|
BigDecimal directProfit = new BigDecimal("100").multiply(new BigDecimal("0.15"));
|
dappWalletService.updateWalletCoinWithLock(directProfit, parent.getId());
|
|
DappFundFlowEntity fundFlow = new DappFundFlowEntity(parent.getId(), directProfit, 3, 2, null, null);
|
dappFundFlowDao.insert(fundFlow);
|
}
|
|
// 如果是复投的,则需奖励
|
if (isReIn == 1) {
|
member.setOutCnt(member.getOutCnt() + 1);
|
dappMemberDao.updateById(member);
|
|
dappWalletService.updateWalletCoinWithLock(new BigDecimal(190), member.getId());
|
|
DappFundFlowEntity matrixProfitFlow = new DappFundFlowEntity(memberId, new BigDecimal("190"), 2, 2, null, null);
|
dappFundFlowDao.insert(matrixProfitFlow);
|
|
DappFundFlowEntity rePutInFlow = new DappFundFlowEntity(memberId, new BigDecimal("100").negate(), 1, 2, null, null);
|
dappFundFlowDao.insert(rePutInFlow);
|
|
DappFundFlowEntity safePoolFlow = new DappFundFlowEntity(memberId, new BigDecimal("10").negate(), 4, 2, null, null);
|
dappFundFlowDao.insert(safePoolFlow);
|
|
DappMineDataEntity mineData = dappSystemDao.selectMineDataForOne();
|
mineData.setSafePool(mineData.getSafePool().add(BigDecimal.TEN));
|
dappSystemDao.updateMineData(mineData);
|
}
|
}
|
|
@Override
|
public void tfcNewPrice(String data) {
|
redisUtils.set(AppContants.REDIS_KEY_TFC_NEW_PRICE, new BigDecimal(data));
|
}
|
|
@Override
|
public void resetMatrix() {
|
DappAchieveTreeEntity node = dappAchieveTreeDao.selectNewestTreeNode();
|
if (node.getValidState() == 2) {
|
return;
|
}
|
|
long days = DateUtil.between(node.getCreateTime(), new Date(), DateUnit.DAY);
|
if (days < 7) {
|
return;
|
}
|
DappMineDataEntity mineDataEntity = dappSystemDao.selectMineDataForOne();
|
|
List<DappAchieveTreeEntity> list = dappAchieveTreeDao.selectLastCountTreeNode(500);
|
if (CollUtil.isNotEmpty(list)) {
|
BigDecimal preAmount = mineDataEntity.getSafePool().divide(new BigDecimal(list.size()), 2, RoundingMode.HALF_UP);
|
|
list.forEach(item -> {
|
dappWalletService.updateWalletCoinWithLock(preAmount, item.getMidNode());
|
DappFundFlowEntity flow = new DappFundFlowEntity(item.getMidNode(), preAmount, 8, 2, null, null);
|
dappFundFlowDao.insert(flow);
|
});
|
}
|
|
mineDataEntity.setSafePool(BigDecimal.ZERO);
|
dappSystemDao.updateMineData(mineDataEntity);
|
|
dappAchieveTreeDao.updateNodeValidState();
|
dappAchieveMemberTreeDao.emptyTable();
|
dappMemberDao.updateMemberActive();
|
}
|
}
|