package cc.mrbird.febs.dapp.service.impl;
|
|
import cc.mrbird.febs.common.configure.i18n.MessageSourceUtils;
|
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.ChainEnum;
|
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.dto.TeamListDto;
|
import cc.mrbird.febs.dapp.entity.*;
|
import cc.mrbird.febs.dapp.enumerate.DataDictionaryEnum;
|
import cc.mrbird.febs.dapp.mapper.*;
|
import cc.mrbird.febs.dapp.service.DappMemberService;
|
import cc.mrbird.febs.dapp.vo.*;
|
import cc.mrbird.febs.rabbit.producer.ChainProducer;
|
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;
|
|
/**
|
* @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 DappSystemProfitDao dappSystemProfitDao;
|
private final ChainProducer chainProducer;
|
private final DappFundFlowDao dappFundFlowDao;
|
|
@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");
|
}
|
|
// List<DappMemberEntity> child = dappMemberDao.selectChildMemberDirectOrNot(connectDto.getInviteId(), 1, null);
|
// if (child.size() == 6) {
|
// throw new FebsException("Invite Code is Invalid");
|
// }
|
} else {
|
connectDto.setInviteId(null);
|
}
|
member = insertMember(connectDto.getAddress(), connectDto.getInviteId());
|
//升级用户的代理等级
|
DappMemberEntity dappMemberEntity = dappMemberDao.selectMemberInfoByInviteId(connectDto.getInviteId());
|
chainProducer.sendAgentUpMsg(dappMemberEntity.getId());
|
}
|
|
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);
|
}
|
|
@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", DataDictionaryEnum.MEMBER.getCode());
|
}
|
|
@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);
|
|
dappMemberDao.insert(member);
|
|
DappWalletCoinEntity walletCoin = new DappWalletCoinEntity();
|
walletCoin.setMemberId(member.getId());
|
dappWalletCoinDao.insert(walletCoin);
|
|
DappWalletMineEntity walletMine = new DappWalletMineEntity();
|
walletMine.setMemberId(member.getId());
|
dappWalletMineDao.insert(walletMine);
|
|
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();
|
//如果没有加入动能即返回null
|
DappSystemProfit dappSystemProfit = dappSystemProfitDao.selectByMemberIdAndState(member.getId(), DappSystemProfit.STATE_IN);
|
if(ObjectUtil.isEmpty(dappSystemProfit)){
|
return null;
|
}
|
return buildTeamMatrix(member.getId());
|
}
|
|
@Override
|
public void setSystemFee(AdminSystemFeeVo adminSystemFeeVo) {
|
String rebatePercent = adminSystemFeeVo.getRebatePercent();
|
DataDictionaryCustom rebateDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.REBATE_PERCENT.getType(), DataDictionaryEnum.REBATE_PERCENT.getCode());
|
rebateDic.setValue(rebatePercent);
|
dataDictionaryCustomMapper.updateById(rebateDic);
|
|
String serviceFee = adminSystemFeeVo.getServiceFee();
|
DataDictionaryCustom serviceFeeDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.WITHDRAW_SERVICE_FEE.getType(), DataDictionaryEnum.WITHDRAW_SERVICE_FEE.getCode());
|
serviceFeeDic.setValue(serviceFee);
|
dataDictionaryCustomMapper.updateById(serviceFeeDic);
|
|
String memberFee = adminSystemFeeVo.getMemberFee();
|
DataDictionaryCustom memberFeeDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.MEMBER_FEE.getType(), DataDictionaryEnum.MEMBER_FEE.getCode());
|
memberFeeDic.setValue(memberFee);
|
dataDictionaryCustomMapper.updateById(memberFeeDic);
|
|
String symbolPrice = adminSystemFeeVo.getSymbolPrice();
|
DataDictionaryCustom symbolPriceDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.SYMBOL_PRICE.getType(), DataDictionaryEnum.SYMBOL_PRICE.getCode());
|
symbolPriceDic.setValue(symbolPrice);
|
dataDictionaryCustomMapper.updateById(symbolPriceDic);
|
}
|
|
@Override
|
public ApiRunListInfoVo findRunListInfo() {
|
ApiRunListInfoVo apiRunListInfoVo = new ApiRunListInfoVo();
|
//获取当前是第几轮队列
|
String redisKey = "QUEUE_COUNT";
|
String memberOutCount = redisUtils.getString(redisKey);
|
DataDictionaryCustom queueCountSet = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.QUEUE_COUNT.getType(), DataDictionaryEnum.QUEUE_COUNT.getCode());
|
String queueCount = queueCountSet.getValue();
|
if(StrUtil.isBlank(memberOutCount)){
|
redisUtils.set(redisKey,queueCount,0L);
|
memberOutCount = queueCount;
|
}
|
//出局条件的人数
|
/**
|
* 初始大小 5+4*0
|
* 1 1,2,3,4,5 1出局 5+4*0
|
* 2 2,3,4,5,1(复投),7,8,9,10 2出局 5+4*1
|
* 3 3,4,5,1(复投),7,8,9,10,2(复投),12,13,14,15 3出局 5+4*2
|
* 4 4,5,1(复投),7,8,9,10,2(复投),12,13,14,15,3(复投),17,18,19,20 4出局 5+4*3
|
*/
|
Integer memberCount = Integer.parseInt(memberOutCount) * 4 + 5;
|
//判断当前是否符合出局条件
|
QueryWrapper<DappSystemProfit> objectQueryWrapper = new QueryWrapper<>();
|
objectQueryWrapper.eq("state",DappSystemProfit.STATE_IN);
|
//实际投资人数
|
Integer selectCount = dappSystemProfitDao.selectCount(objectQueryWrapper);
|
BigDecimal runPercent = new BigDecimal(selectCount).divide(new BigDecimal(memberCount), 2, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(100));
|
apiRunListInfoVo.setRunPercent(runPercent);
|
//实际投资人数小于出局条件人数
|
//符合则出局 实际投资人数等于出局条件人数
|
DappSystemProfit dappSystemProfitIn = dappSystemProfitDao.selectSystemProfitInByState(DappSystemProfit.STATE_IN);
|
apiRunListInfoVo.setLuckyMemberNext(ObjectUtil.isEmpty(dappSystemProfitIn) ? 0L : dappSystemProfitIn.getId());
|
DappSystemProfit dappSystemProfitOut = dappSystemProfitDao.selectSystemProfitOutByState(DappSystemProfit.STATE_OUT);
|
apiRunListInfoVo.setLuckyMember(ObjectUtil.isEmpty(dappSystemProfitOut) ? 0L : dappSystemProfitOut.getId());
|
return apiRunListInfoVo;
|
}
|
|
@Override
|
public IPage<AdminDappSystemProfitVo> selectSystemProfitInPage(DappSystemProfit dappSystemProfit, QueryRequest request) {
|
Page<AdminDappSystemProfitVo> page = new Page<>(request.getPageNum(), request.getPageSize());
|
return dappSystemProfitDao.selectSystemProfitInPage(dappSystemProfit, page);
|
}
|
|
@Override
|
public IPage<AdminSystemProfitFlowListVo> getSystemProfitFlowList(DappSystemProfit dappSystemProfit, QueryRequest request) {
|
Page<AdminSystemProfitFlowListVo> page = new Page<>(request.getPageNum(), request.getPageSize());
|
return dappSystemProfitDao.selectSystemProfitFlowListInPage(dappSystemProfit, page);
|
}
|
|
@Override
|
public IPage<AdminTeamInfoVo> getTeamInfo(DappMemberEntity dappMemberEntity, QueryRequest request) {
|
Page<AdminTeamInfoVo> page = new Page<>(request.getPageNum(), request.getPageSize());
|
dappMemberEntity = this.baseMapper.selectById(dappMemberEntity.getId());
|
IPage<AdminTeamInfoVo> adminTeamInfoVoIPage = this.baseMapper.findTeamInfoListInPage(page, dappMemberEntity);
|
List<AdminTeamInfoVo> records = adminTeamInfoVoIPage.getRecords();
|
if(CollUtil.isNotEmpty(records)){
|
for(AdminTeamInfoVo adminTeamInfoVo : records){
|
Long memberId = adminTeamInfoVo.getId();
|
List<DappMemberEntity> direct = dappMemberDao.selectChildMemberDirectOrNot(adminTeamInfoVo.getInviteId(), 1, 1);
|
adminTeamInfoVo.setDirectCnt(direct.size());
|
DappSystemProfit dappSystemProfit = dappSystemProfitDao.selectByMemberIdAndState(memberId,DappSystemProfit.STATE_IN);
|
adminTeamInfoVo.setSystemProfitId(ObjectUtil.isEmpty(dappSystemProfit) ? 0L : dappSystemProfit.getId());
|
BigDecimal directProfit = dappFundFlowDao.selectSumAmountByMemberIdAndTypeAndStatus(memberId,3,2);
|
adminTeamInfoVo.setDirectProfit(directProfit);
|
BigDecimal levelProfit = dappFundFlowDao.selectSumAmountByMemberIdAndTypeAndStatus(memberId,4,2);
|
adminTeamInfoVo.setLevelProfit(levelProfit);
|
BigDecimal luckyProfit = dappFundFlowDao.selectSumAmountByMemberIdAndTypeAndStatus(memberId,7,2);
|
adminTeamInfoVo.setLuckyProfit(luckyProfit);
|
}
|
}
|
return adminTeamInfoVoIPage;
|
}
|
|
public TeamListVo buildTeamMatrix(Long memberId) {
|
DappMemberEntity member = dappMemberDao.selectById(memberId);
|
TeamListVo teamListVo = new TeamListVo();
|
teamListVo.setAddress(member.getAddress());
|
teamListVo.setAccountType(member.getAccountType());
|
teamListVo.setActiveStatus(member.getActiveStatus());
|
List<DappMemberEntity> dappMemberEntities = dappMemberDao.selectMemberInfoByRefererId(member.getInviteId());
|
teamListVo.setDirectCnt(dappMemberEntities.size());
|
|
if (CollUtil.isEmpty(dappMemberEntities)) {
|
return teamListVo;
|
}
|
|
List<TeamListVo> list = new ArrayList<>();
|
for (DappMemberEntity childNode : dappMemberEntities) {
|
list.add(buildTeamMatrix(childNode.getId()));
|
}
|
teamListVo.setChildren(list);
|
return teamListVo;
|
}
|
}
|