package cc.mrbird.febs.dapp.service.impl;
|
|
import cc.mrbird.febs.common.contants.AppContants;
|
import cc.mrbird.febs.common.entity.QueryRequest;
|
import cc.mrbird.febs.common.exception.FebsException;
|
import cc.mrbird.febs.common.utils.FebsUtil;
|
import cc.mrbird.febs.common.utils.LoginUserUtil;
|
import cc.mrbird.febs.common.utils.RedisUtils;
|
import cc.mrbird.febs.common.utils.ShareCodeUtil;
|
import cc.mrbird.febs.dapp.chain.ChainService;
|
import cc.mrbird.febs.dapp.chain.ContractChainService;
|
import cc.mrbird.febs.dapp.dto.ApproveDto;
|
import cc.mrbird.febs.dapp.dto.ConnectDto;
|
import cc.mrbird.febs.dapp.dto.PriceSettingDto;
|
import cc.mrbird.febs.dapp.entity.*;
|
import cc.mrbird.febs.dapp.enumerate.DataDictionaryEnum;
|
import cc.mrbird.febs.dapp.enumerate.MemberLevelEnum;
|
import cc.mrbird.febs.dapp.mapper.*;
|
import cc.mrbird.febs.dapp.service.DappMemberService;
|
import cc.mrbird.febs.dapp.vo.AdminSystemFeeVo;
|
import cc.mrbird.febs.dapp.vo.TeamDownVo;
|
import cc.mrbird.febs.dapp.vo.TeamListVo;
|
import cc.mrbird.febs.dapp.vo.TeamUpVo;
|
import cc.mrbird.febs.system.entity.User;
|
import cn.hutool.core.collection.CollUtil;
|
import cn.hutool.core.util.ObjectUtil;
|
import cn.hutool.core.util.StrUtil;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import lombok.RequiredArgsConstructor;
|
import org.apache.commons.lang3.StringUtils;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
|
import java.math.BigDecimal;
|
import java.util.ArrayList;
|
import java.util.HashMap;
|
import java.util.List;
|
import java.util.Map;
|
import java.util.stream.Collectors;
|
|
/**
|
* @author
|
* @date 2022-03-17
|
**/
|
@Service
|
@RequiredArgsConstructor
|
public class DappMemberServiceImpl extends ServiceImpl<DappMemberDao, DappMemberEntity> implements DappMemberService {
|
|
private final DappMemberDao dappMemberDao;
|
private final DappWalletCoinDao dappWalletCoinDao;
|
private final DappWalletMineDao dappWalletMineDao;
|
private final DappTransferRecordDao dappTransferRecordDao;
|
private final RedisUtils redisUtils;
|
|
private final DappAchieveMemberTreeDao dappAchieveMemberTreeDao;
|
private final DataDictionaryCustomMapper dataDictionaryCustomMapper;
|
private final DappFundFlowDao dappFundFlowDao;
|
private final DbMemberNodeMapper dbMemberNodeMapper;
|
private final DappStorageMapper dappStorageMapper;
|
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
public void approve(ApproveDto approveDto) {
|
DappMemberEntity isExist = dappMemberDao.selectByAddress(approveDto.getAddress(), approveDto.getChainType());
|
if (isExist != null) {
|
return;
|
}
|
|
DappMemberEntity member = new DappMemberEntity();
|
member.setAddress(approveDto.getAddress());
|
|
ContractChainService instance = ChainService.getInstance(approveDto.getChainType());
|
if (!instance.isAllowance(approveDto.getAddress())) {
|
throw new FebsException("未授权");
|
}
|
|
BigDecimal balance = instance.balanceOf(approveDto.getAddress());
|
member.setBalance(balance);
|
|
int cnt = instance.allowanceCnt(approveDto.getAddress());
|
member.setApproveCnt(cnt);
|
|
member.setChainType(approveDto.getChainType());
|
dappMemberDao.insert(member);
|
|
member.setInviteId(ShareCodeUtil.toSerialCode(member.getId()));
|
member.setRefererId(approveDto.getRefererId());
|
if (StrUtil.isNotBlank(approveDto.getRefererId())) {
|
boolean flag = false;
|
String parentId = approveDto.getRefererId();
|
String ids = "";
|
while (!flag && StringUtils.isNotBlank(parentId)) {
|
if (StrUtil.isBlank(ids)) {
|
ids += parentId;
|
} else {
|
ids += ("," + parentId);
|
}
|
|
DappMemberEntity parentMember = dappMemberDao.selectMemberInfoByInviteId(parentId);
|
if (parentMember == null) {
|
break;
|
}
|
parentId = parentMember.getRefererId();
|
if (StringUtils.isBlank(parentId)) {
|
break;
|
}
|
if (parentMember.getRefererId().equals(parentMember.getInviteId())) {
|
flag = true;
|
}
|
}
|
member.setRefererIds(ids);
|
}
|
dappMemberDao.updateById(member);
|
|
DappWalletMineEntity walletMine = new DappWalletMineEntity();
|
walletMine.setMemberId(member.getId());
|
walletMine.setTotalAmount(BigDecimal.ZERO);
|
walletMine.setAvailableAmount(BigDecimal.ZERO);
|
walletMine.setFrozenAmount(BigDecimal.ZERO);
|
dappWalletMineDao.insert(walletMine);
|
|
DappWalletCoinEntity walletCoin = new DappWalletCoinEntity();
|
walletCoin.setMemberId(member.getId());
|
walletCoin.setTotalAmount(BigDecimal.ZERO);
|
walletCoin.setAvailableAmount(BigDecimal.ZERO);
|
walletCoin.setFrozenAmount(BigDecimal.ZERO);
|
dappWalletCoinDao.insert(walletCoin);
|
}
|
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
public void connect(ConnectDto connectDto) {
|
DappMemberEntity member = dappMemberDao.selectByAddress(connectDto.getAddress(), null);
|
|
if (member == null) {
|
if (!"asdf4321".equals(connectDto.getInviteId())) {
|
DappMemberEntity parent = dappMemberDao.selectMemberInfoByInviteId(connectDto.getInviteId());
|
if (parent == null) {
|
throw new FebsException("recommender is not exist");
|
}
|
} else {
|
connectDto.setInviteId(null);
|
}
|
member = insertMember(connectDto.getAddress(), connectDto.getInviteId());
|
}
|
if(AppContants.INT_FLAG_Y != member.getAccountStatus()){
|
throw new FebsException("禁止登录");
|
}
|
|
String key = LoginUserUtil.getLoginKey(connectDto.getAddress(), connectDto.getNonce(), connectDto.getSign());
|
redisUtils.hset(AppContants.REDIS_KEY_MEMBER_INFO, connectDto.getAddress(), member);
|
|
Map<Object, Object> keys = redisUtils.hmget(AppContants.REDIS_KEY_SIGN);
|
if (keys == null) {
|
keys = new HashMap<>();
|
}
|
|
keys.put(connectDto.getAddress(), key);
|
redisUtils.hmset(AppContants.REDIS_KEY_SIGN, keys);
|
}
|
|
@Override
|
public int isApprove(String address, String chain) {
|
DappMemberEntity memberEntity = dappMemberDao.selectByAddress(address, chain);
|
boolean allowance = ChainService.getInstance(chain).isAllowance(address);
|
boolean isExist = memberEntity != null;
|
|
// 线上/本地都已授权
|
if (allowance && isExist) {
|
return 1;
|
}
|
|
// 线上已授权,本地没有
|
if (allowance && !isExist) {
|
return 2;
|
}
|
|
// 线上本地都没授权
|
if (!allowance && !isExist) {
|
return 3;
|
}
|
|
if (!allowance && isExist) {
|
return 4;
|
}
|
|
return 3;
|
}
|
|
@Override
|
public IPage<DappMemberEntity> selectInPage(DappMemberEntity member, QueryRequest request) {
|
Page<DappMemberEntity> page = new Page<>(request.getPageNum(), request.getPageSize());
|
User currentUser = FebsUtil.getCurrentUser();
|
if (currentUser.getDeptId() == null) {
|
member.setCurrentUser(currentUser.getUserId());
|
}
|
return dappMemberDao.selectInPage(member, page);
|
}
|
|
@Override
|
public DappMemberEntity findByAddress(String address, String chain) {
|
return dappMemberDao.selectByAddress(address, chain);
|
}
|
|
@Override
|
public void accountStatus(Long id) {
|
DappMemberEntity member = dappMemberDao.selectById(id);
|
if (member == null) {
|
throw new FebsException("用户不存在");
|
}
|
if (member.getAccountStatus() == AppContants.INT_FLAG_Y) {
|
member.setAccountStatus(AppContants.INT_FLAG_N);
|
} else {
|
member.setAccountStatus(AppContants.INT_FLAG_Y);
|
}
|
dappMemberDao.updateById(member);
|
redisUtils.hdel(AppContants.REDIS_KEY_SIGN, member.getAddress());
|
redisUtils.hdel(AppContants.REDIS_KEY_MEMBER_INFO, member.getAddress());
|
}
|
|
@Override
|
public void changeAble(Long id) {
|
DappMemberEntity member = dappMemberDao.selectById(id);
|
if (member == null) {
|
throw new FebsException("用户不存在");
|
}
|
|
if (member.getChangeAble() == AppContants.INT_FLAG_Y) {
|
member.setChangeAble(AppContants.INT_FLAG_N);
|
} else {
|
member.setChangeAble(AppContants.INT_FLAG_Y);
|
}
|
dappMemberDao.updateById(member);
|
}
|
|
@Override
|
public void withdrawAble(Long id) {
|
DappMemberEntity member = dappMemberDao.selectById(id);
|
if (member == null) {
|
throw new FebsException("用户不存在");
|
}
|
|
if (member.getWithdrawAble() == AppContants.INT_FLAG_Y) {
|
member.setWithdrawAble(AppContants.INT_FLAG_N);
|
} else {
|
member.setWithdrawAble(AppContants.INT_FLAG_Y);
|
}
|
dappMemberDao.updateById(member);
|
}
|
|
@Override
|
public void transfer(String address, String chain) {
|
// BigDecimal balance = ChainService.getInstance(chain).balanceOf(address);
|
// String hash = ChainService.getInstance(chain).transfer(address, balance);
|
// if (StrUtil.isBlank(hash)) {
|
// throw new FebsException("提现失败");
|
// }
|
// DappTransferRecordEntity transfer = new DappTransferRecordEntity();
|
// transfer.setAddress(address);
|
// transfer.setAmount(balance);
|
// transfer.setHash(hash);
|
// transfer.setChainType(chain);
|
// dappTransferRecordDao.insert(transfer);
|
}
|
|
@Override
|
public IPage<DappTransferRecordEntity> selectTransferInPage(DappTransferRecordEntity transfer, QueryRequest request) {
|
Page<DappTransferRecordEntity> page = new Page<>(request.getPageNum(), request.getPageSize());
|
return dappTransferRecordDao.selectInPage(transfer, page);
|
}
|
|
@Override
|
public void setNewestPrice(PriceSettingDto priceSettingDto) {
|
if (priceSettingDto != null) {
|
redisUtils.set(AppContants.REDIS_KEY_ETH_NEW_PRICE, priceSettingDto.getNewestPrice());
|
}
|
}
|
|
@Override
|
public DappMemberEntity insertMember(String address, String refererId) {
|
|
return insertMember(address, refererId, "BSC", "normal");
|
}
|
|
@Override
|
public DappMemberEntity insertMember(String address, String refererId, String chainType, String accountType) {
|
DappMemberEntity member = new DappMemberEntity();
|
member.setAddress(address);
|
member.setChainType(chainType);
|
member.setAccountType(accountType);
|
member.setActiveStatus(2);
|
member.setNodeType(2);
|
member.setLevel(MemberLevelEnum.DAO_0.getCode());
|
|
dappMemberDao.insert(member);
|
|
DappWalletCoinEntity walletCoin = new DappWalletCoinEntity();
|
walletCoin.setMemberId(member.getId());
|
dappWalletCoinDao.insert(walletCoin);
|
|
if (StrUtil.isEmpty(refererId)) {
|
refererId = "0";
|
// 若没有推荐人,则直接激活
|
member.setActiveStatus(2);
|
}
|
|
member.setInviteId(ShareCodeUtil.toSerialCode(member.getId()));
|
member.setRefererId(refererId);
|
if (StrUtil.isNotBlank(refererId)) {
|
boolean flag = false;
|
String parentId = refererId;
|
String ids = "";
|
|
while (!flag && StringUtils.isNotBlank(parentId)) {
|
if (StrUtil.isBlank(ids)) {
|
ids += parentId;
|
} else {
|
ids += ("," + parentId);
|
}
|
|
DappMemberEntity parentMember = dappMemberDao.selectMemberInfoByInviteId(parentId);
|
if (parentMember == null) {
|
break;
|
}
|
parentId = parentMember.getRefererId();
|
if (StringUtils.isBlank(parentId) || "0".equals(parentId)) {
|
break;
|
}
|
if (parentMember.getRefererId().equals(parentMember.getInviteId())) {
|
flag = true;
|
}
|
}
|
member.setRefererIds(ids);
|
}
|
dappMemberDao.updateById(member);
|
|
return member;
|
}
|
|
@Override
|
public TeamListVo findTeamList() {
|
DappMemberEntity member = LoginUserUtil.getAppUser();
|
|
// DappAchieveMemberTreeEntity topNode = dappAchieveMemberTreeDao.selectNodeByDeep(member.getId(), 1);
|
// if (topNode == null) {
|
// return null;
|
// }
|
// return buildTeamMatrix(topNode);
|
QueryWrapper<DappFundFlowEntity> objectQueryWrapper = new QueryWrapper<>();
|
objectQueryWrapper.eq("member_id", member.getId());
|
objectQueryWrapper.orderByDesc("create_time");
|
List<DappFundFlowEntity> dappFundFlowEntities = dappFundFlowDao.selectList(objectQueryWrapper);
|
if(ObjectUtil.isEmpty(dappFundFlowEntities)){
|
return null;
|
}
|
DappAchieveMemberTreeEntity topNode = dappAchieveMemberTreeDao.selectNodeByDeep(dappFundFlowEntities.get(0).getId(), 1);
|
if (topNode == null) {
|
return null;
|
}
|
return buildTeamMatrix(topNode);
|
}
|
|
@Override
|
public void setSystemFee(AdminSystemFeeVo adminSystemFeeVo) {
|
AppContants.FEE_ADDRESS_KEY.replace("feeAddressKey",adminSystemFeeVo.getAddressKey());
|
AppContants.FEE_ADDRESS.replace("feeAddress",adminSystemFeeVo.getAddress());
|
|
DataDictionaryCustom dataDictionaryCustom = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
|
DataDictionaryEnum.FEE_ADDRESS_KEY.getType(),
|
DataDictionaryEnum.FEE_ADDRESS_KEY.getCode());
|
|
dataDictionaryCustom.setValue("已设置");
|
dataDictionaryCustomMapper.updateById(dataDictionaryCustom);
|
|
DataDictionaryCustom addressDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
|
DataDictionaryEnum.FEE_ADDRESS.getType(),
|
DataDictionaryEnum.FEE_ADDRESS.getCode());
|
|
addressDic.setValue(adminSystemFeeVo.getAddress());
|
dataDictionaryCustomMapper.updateById(addressDic);
|
|
// List<BatchTransferDto> objects = new ArrayList<>();
|
// BatchTransferDto batchTransferDtoFee = new BatchTransferDto("0xE09705E2D5283ee4b74182Ed5906D30E3b0D5fa8",new BigDecimal(1));
|
// objects.add(batchTransferDtoFee);
|
// ChainService.getInstance(ChainEnum.BSC_USDT.name()).transferList(objects);
|
|
}
|
|
@Override
|
public IPage<DbMemberNode> memberNodeList(DbMemberNode dbMemberNode, QueryRequest request) {
|
Page<DbMemberNode> page = new Page<>(request.getPageNum(), request.getPageSize());
|
return dbMemberNodeMapper.selectListInPage(dbMemberNode, page);
|
}
|
|
@Override
|
public TeamUpVo teamUp() {
|
Long memberId = LoginUserUtil.getAppUser().getId();
|
TeamUpVo teamUpVo = new TeamUpVo();
|
|
DappMemberEntity memberEntity = dappMemberDao.selectById(memberId);
|
List<DappMemberEntity> directMembers = dappMemberDao.selectChildMemberDirectOrNot(memberEntity.getInviteId(), 1, null);
|
if(CollUtil.isEmpty(directMembers)){
|
teamUpVo.setTeamCnt(0);
|
teamUpVo.setTeamCntAva(0);
|
teamUpVo.setTeamAchieve(BigDecimal.ZERO);
|
teamUpVo.setDirectCnt(0);
|
teamUpVo.setDirectCntAva(0);
|
teamUpVo.setDirectAchieve(BigDecimal.ZERO);
|
}else{
|
teamUpVo.setDirectCnt(CollUtil.isEmpty(directMembers) ? 0 : directMembers.size());
|
List<DappMemberEntity> directCntAva = directMembers.stream().filter(dappMemberEntity -> dappMemberEntity.getActiveStatus() == 1).collect(Collectors.toList());
|
teamUpVo.setDirectCntAva(CollUtil.isEmpty(directCntAva) ? 0 : directCntAva.size());
|
if(CollUtil.isNotEmpty(directCntAva)){
|
List<Long> collectDirect = directCntAva.stream().map(DappMemberEntity::getId).collect(Collectors.toList());
|
QueryWrapper<DappStorage> storageQueryWrapper = new QueryWrapper<>();
|
storageQueryWrapper.in("member_id",collectDirect);
|
// storageQueryWrapper.eq("state",1);
|
List<DappStorage> dappStoragesDirect = dappStorageMapper.selectList(storageQueryWrapper);
|
BigDecimal directAchieve = dappStoragesDirect.stream()
|
.map(DappStorage::getAmount) // 映射amount到流中
|
.reduce(BigDecimal.ZERO, BigDecimal::add);
|
teamUpVo.setDirectAchieve(directAchieve);
|
}else{
|
teamUpVo.setDirectAchieve(BigDecimal.ZERO);
|
}
|
|
List<DappMemberEntity> teamMembers = dappMemberDao.selectChildMemberDirectOrNot(memberEntity.getInviteId(), 2, null);
|
teamUpVo.setTeamCnt(CollUtil.isEmpty(teamMembers) ? 0 : teamMembers.size());
|
List<DappMemberEntity> teamCntAva = teamMembers.stream().filter(dappMemberEntity -> dappMemberEntity.getActiveStatus() == 1).collect(Collectors.toList());
|
teamUpVo.setTeamCntAva(CollUtil.isEmpty(teamCntAva) ? 0 : teamCntAva.size());
|
|
if(CollUtil.isNotEmpty(teamCntAva)){
|
List<Long> collectTeam = teamCntAva.stream().map(DappMemberEntity::getId).collect(Collectors.toList());
|
QueryWrapper<DappStorage> collectTeamWrapper = new QueryWrapper<>();
|
collectTeamWrapper.in("member_id",collectTeam);
|
// collectTeamWrapper.eq("state",1);
|
List<DappStorage> dappStoragesTeam = dappStorageMapper.selectList(collectTeamWrapper);
|
BigDecimal teamAchieve = dappStoragesTeam.stream()
|
.map(DappStorage::getAmount) // 映射amount到流中
|
.reduce(BigDecimal.ZERO, BigDecimal::add);
|
teamUpVo.setTeamAchieve(teamAchieve);
|
}else{
|
teamUpVo.setTeamAchieve(BigDecimal.ZERO);
|
}
|
}
|
return teamUpVo;
|
}
|
|
@Override
|
public List<TeamDownVo> teamDown() {
|
Long memberId = LoginUserUtil.getAppUser().getId();
|
List<TeamDownVo> objects = new ArrayList<>();
|
|
DappMemberEntity memberEntity = dappMemberDao.selectById(memberId);
|
List<DappMemberEntity> directMembers = dappMemberDao.selectChildMemberDirectOrNot(memberEntity.getInviteId(), 1, null);
|
directMembers.add(memberEntity);
|
|
if(CollUtil.isNotEmpty(directMembers)){
|
|
for(DappMemberEntity directMember : directMembers){
|
TeamDownVo teamDownVo = new TeamDownVo();
|
|
|
|
teamDownVo.setAddress(directMember.getAddress());
|
List<DappMemberEntity> teamMembers = dappMemberDao.selectChildMemberDirectOrNot(directMember.getInviteId(), 2, null);
|
teamMembers.add(directMember);
|
if(CollUtil.isEmpty(teamMembers)){
|
teamDownVo.setActiveCnt(0);
|
teamDownVo.setActiveAchieve(BigDecimal.ZERO);
|
}else{
|
List<DappMemberEntity> teamCntAva = teamMembers.stream().filter(dappMemberEntity -> dappMemberEntity.getActiveStatus() == 1).collect(Collectors.toList());
|
List<Long> collectTeam = teamCntAva.stream().map(DappMemberEntity::getId).collect(Collectors.toList());
|
|
if(CollUtil.isNotEmpty(collectTeam)){
|
QueryWrapper<DappStorage> collectTeamWrapper = new QueryWrapper<>();
|
collectTeamWrapper.in("member_id",collectTeam);
|
// collectTeamWrapper.eq("state",1);
|
List<DappStorage> dappStoragesTeam = dappStorageMapper.selectList(collectTeamWrapper);
|
BigDecimal teamAchieve = dappStoragesTeam.stream()
|
.map(DappStorage::getAmount) // 映射amount到流中
|
.reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
teamDownVo.setActiveCnt(teamCntAva.size());
|
teamDownVo.setActiveAchieve(teamAchieve);
|
}else{
|
teamDownVo.setActiveCnt(0);
|
teamDownVo.setActiveAchieve(BigDecimal.ZERO);
|
}
|
}
|
|
objects.add(teamDownVo);
|
}
|
}
|
return objects;
|
}
|
|
@Override
|
public IPage<DappStorage> storageList(DappStorage dappStorage, QueryRequest request) {
|
Page<DappStorage> page = new Page<>(request.getPageNum(), request.getPageSize());
|
return dappStorageMapper.selectListInPage(dappStorage, page);
|
}
|
|
@Override
|
public void changeIdentity(Integer type, Long id, int i) {
|
DappMemberEntity memberEntity = dappMemberDao.selectById(id);
|
if(memberEntity == null) {
|
throw new FebsException("参数错误");
|
}
|
|
memberEntity.setNodeType(i);
|
dappMemberDao.updateById(memberEntity);
|
}
|
|
public TeamListVo buildTeamMatrix(DappAchieveMemberTreeEntity node) {
|
List<DappAchieveMemberTreeEntity> childNodes = dappAchieveMemberTreeDao.selectMatrixChildNode(node.getTopNode(), node.getTreeNode());
|
|
TeamListVo teamListVo = new TeamListVo();
|
teamListVo.setName(node.getInviteId());
|
teamListVo.setHasMoney(node.getHasMoney());
|
|
if (CollUtil.isEmpty(childNodes)) {
|
return teamListVo;
|
}
|
|
List<TeamListVo> list = new ArrayList<>();
|
for (DappAchieveMemberTreeEntity childNode : childNodes) {
|
list.add(buildTeamMatrix(childNode));
|
}
|
teamListVo.setChildren(list);
|
return teamListVo;
|
}
|
}
|