package cc.mrbird.febs.dapp.service.impl;
|
|
import cc.mrbird.febs.common.contants.AppContants;
|
import cc.mrbird.febs.common.enumerates.DataDicEnum;
|
import cc.mrbird.febs.common.enumerates.FlowTypeEnum;
|
import cc.mrbird.febs.common.exception.FebsException;
|
import cc.mrbird.febs.common.utils.RedisUtils;
|
import cc.mrbird.febs.dapp.chain.ChainEnum;
|
import cc.mrbird.febs.dapp.entity.*;
|
import cc.mrbird.febs.dapp.mapper.*;
|
import cc.mrbird.febs.dapp.service.AsyncCjService;
|
import cc.mrbird.febs.dapp.utils.OnlineTransferUtil;
|
import cc.mrbird.febs.rabbit.producer.ChainProducer;
|
import cn.hutool.core.collection.CollUtil;
|
import cn.hutool.core.convert.Convert;
|
import cn.hutool.core.util.ObjectUtil;
|
import cn.hutool.core.util.StrUtil;
|
import com.alibaba.fastjson.JSONObject;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import lombok.RequiredArgsConstructor;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.stereotype.Service;
|
|
import java.math.BigDecimal;
|
import java.util.HashMap;
|
import java.util.List;
|
import java.util.Map;
|
|
@Slf4j
|
@Service
|
@RequiredArgsConstructor
|
public class AsyncCjServiceImpl extends ServiceImpl<DappAchieveMapper, DappAchieve> implements AsyncCjService {
|
|
private final RedisUtils redisUtils;
|
private final DataDictionaryCustomMapper dataDictionaryCustomMapper;
|
private final DappMemberDao dappMemberDao;
|
|
private final DappFundFlowDao dappFundFlowDao;
|
private final DappAchieveMapper dappAchieveMapper;
|
private final DappAchieveItemMapper dappAchieveItemMapper;
|
private final ChainProducer chainProducer;
|
|
@Override
|
public void redisCacheUpdate(String key, Object value, long time) {
|
String existToken = redisUtils.getString(key);
|
if (StrUtil.isNotBlank(existToken)) {
|
redisUtils.del(existToken);
|
}
|
redisUtils.set(key, value, time);
|
}
|
|
@Override
|
public void updateDataDicEnumRedis(List<String> nameList) {
|
if(CollUtil.isEmpty(nameList)){
|
return;
|
}
|
for(String name : nameList){
|
DataDictionaryCustom dataDictionaryCustom = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(name, name);
|
if(ObjectUtil.isEmpty(dataDictionaryCustom)){
|
continue;
|
}
|
if(DataDicEnum.GFA_PRICE.getValue().equals(name)){
|
continue;
|
}
|
String existToken = redisUtils.getString(dataDictionaryCustom.getCode());
|
if (StrUtil.isNotBlank(existToken)) {
|
redisUtils.del(existToken);
|
}
|
redisUtils.set(dataDictionaryCustom.getCode(), dataDictionaryCustom.getValue(), 0);
|
}
|
}
|
|
@Override
|
public void updateAmount(Integer type, Long memberId, BigDecimal amount) {
|
DappMemberEntity dappMemberEntity = dappMemberDao.selectById(memberId);
|
BigDecimal usdtBalance = dappMemberEntity.getUsdtBalance();
|
BigDecimal balance = dappMemberEntity.getBalance();
|
if(1== type){
|
dappMemberEntity.setBalance(balance.add(amount));
|
dappMemberDao.updateBalanceWithVersion(dappMemberEntity);
|
}
|
if(2== type){
|
dappMemberEntity.setUsdtBalance(usdtBalance.add(amount));
|
dappMemberDao.updateUsdtBalanceWithVersion(dappMemberEntity);
|
}
|
}
|
|
@Override
|
public void insertTeamPerk(Long flowId, Long achieveId) {
|
|
//更新第一次请求的资金划转记录
|
DappFundFlowEntity flow = dappFundFlowDao.selectById(flowId);
|
if(ObjectUtil.isEmpty(flow)){
|
return;
|
}
|
//用户质押代币数量
|
BigDecimal amount = flow.getAmount().negate();
|
Long memberId = flow.getMemberId();
|
DappMemberEntity member = dappMemberDao.selectById(memberId);
|
/*
|
新增推荐奖
|
* 团队总奖励
|
* 团队奖励层级
|
* 团队总奖励/团队奖励层级 = 每一个层级应该获得的推荐奖励代币
|
*/
|
//团队的所占比例
|
BigDecimal tuanDuiPerkTimes = new BigDecimal(redisUtils.getString(DataDicEnum.GFA_TUAN_DUI_PERCENT.getValue()));
|
BigDecimal tuanDuiPercent = new BigDecimal("0.01")
|
.multiply(tuanDuiPerkTimes
|
.setScale(2,BigDecimal.ROUND_DOWN));
|
|
BigDecimal tuanDuiPerkTotal = tuanDuiPercent.multiply(amount).setScale(2,BigDecimal.ROUND_DOWN);
|
Integer tuanDuiLevel = Convert.toInt(redisUtils.getString(DataDicEnum.GFA_TUAN_DUI_LEVEL.getValue()));
|
//分成【团队的所占比例】的份数
|
BigDecimal tuanDuiPerk = tuanDuiPerkTotal.divide(tuanDuiPerkTimes, 2, BigDecimal.ROUND_DOWN);
|
//团队奖励对象
|
HashMap<Integer, DappMemberEntity> objectObjectHashMap = new HashMap<>();//累计奖励的用户集合
|
Long refMemberId = memberId;//循环的上级用户ID
|
Integer dappMembersSize = 0;//累计层级数量
|
boolean flag = true;
|
while (flag){
|
//累计四级,停止返回
|
if(dappMembersSize >= tuanDuiLevel){
|
flag = false;
|
}else{
|
DappMemberEntity dappMemberEntity = dappMemberDao.selectById(refMemberId);
|
if(ObjectUtil.isEmpty(dappMemberEntity.getRefererId())){
|
flag = false;
|
}else{
|
DappMemberEntity dappMemberRef = dappMemberDao.selectMemberInfoByInviteId(dappMemberEntity.getRefererId());
|
if(ObjectUtil.isEmpty(dappMemberRef)){
|
flag = false;
|
}else{
|
objectObjectHashMap.put(dappMembersSize,dappMemberRef);
|
refMemberId = dappMemberRef.getId();
|
dappMembersSize ++;
|
}
|
}
|
}
|
}
|
if(CollUtil.isEmpty(objectObjectHashMap)){
|
return;
|
}
|
for (Map.Entry<Integer, DappMemberEntity> entry : objectObjectHashMap.entrySet()) {
|
Integer key = entry.getKey();
|
DappMemberEntity refMember = entry.getValue();
|
BigDecimal perkPercent = BigDecimal.ZERO;
|
if(key == 0){
|
perkPercent = new BigDecimal(redisUtils.getString(DataDicEnum.GFA_TUAN_DUI_LEVEL_YI.getValue())).setScale(2, BigDecimal.ROUND_DOWN);
|
}
|
if(key == 1){
|
perkPercent = new BigDecimal(redisUtils.getString(DataDicEnum.GFA_TUAN_DUI_LEVEL_YI.getValue())).setScale(2, BigDecimal.ROUND_DOWN);
|
}
|
if(key == 2){
|
perkPercent = new BigDecimal(redisUtils.getString(DataDicEnum.GFA_TUAN_DUI_LEVEL_YI.getValue())).setScale(2, BigDecimal.ROUND_DOWN);
|
}
|
if(key == 3){
|
perkPercent = new BigDecimal(redisUtils.getString(DataDicEnum.GFA_TUAN_DUI_LEVEL_YI.getValue())).setScale(2, BigDecimal.ROUND_DOWN);
|
}
|
if(key == 4){
|
perkPercent = new BigDecimal(redisUtils.getString(DataDicEnum.GFA_TUAN_DUI_LEVEL_WU.getValue())).setScale(2, BigDecimal.ROUND_DOWN);
|
}
|
BigDecimal realPerk = tuanDuiPerk.multiply(perkPercent).setScale(2, BigDecimal.ROUND_DOWN);
|
|
QueryWrapper<DappAchieve> objectQueryWrapper = new QueryWrapper<>();
|
objectQueryWrapper.eq("member_id",refMember.getId());
|
objectQueryWrapper.eq("state",DappAchieve.STATUS_ING);
|
List<DappAchieve> dappAchieves = dappAchieveMapper.selectList(objectQueryWrapper);
|
if(CollUtil.isEmpty(dappAchieves)){
|
DappFundFlowEntity fundFlowTuiJian = new DappFundFlowEntity(
|
refMember.getId(),
|
realPerk,
|
FlowTypeEnum.TUAN_DUI_FAIL.getValue(),
|
DappFundFlowEntity.WITHDRAW_STATUS_AGREE,
|
FlowTypeEnum.TUAN_DUI_FAIL.getDescrition(),
|
member.getAddress(),
|
refMember.getAddress());
|
dappFundFlowDao.insert(fundFlowTuiJian);
|
continue;
|
}
|
|
DappAchieveItem dappAchieveItem = new DappAchieveItem();
|
dappAchieveItem.setAchieveId(achieveId);
|
dappAchieveItem.setType(DappAchieveItem.TYPE_TUI_JIAN);
|
dappAchieveItem.setState(DappAchieveItem.STATUS_AGREE);
|
dappAchieveItem.setMemberId(refMember.getId());
|
dappAchieveItem.setAmount(realPerk);
|
dappAchieveItemMapper.insert(dappAchieveItem);
|
|
DappFundFlowEntity fundFlowTuiJian = new DappFundFlowEntity(
|
refMember.getId(),
|
realPerk,
|
FlowTypeEnum.TUAN_DUI.getValue(),
|
DappFundFlowEntity.WITHDRAW_STATUS_AGREE,
|
FlowTypeEnum.TUAN_DUI.getDescrition(),
|
member.getAddress(),
|
refMember.getAddress());
|
dappFundFlowDao.insert(fundFlowTuiJian);
|
//生成转账记录
|
OnlineTransferUtil.addTransfer(
|
refMember.getAddress(),
|
realPerk,
|
4,//推荐奖
|
1,//普通账户
|
ChainEnum.BSC_TFC_REWARD.name(),
|
DataDicEnum.GFA_COIN.getValue(),
|
fundFlowTuiJian.getId().toString());
|
|
Integer systemFlag = Integer.parseInt(redisUtils.getString(DataDicEnum.GFA_ZHUAN_ZHANG_KAI_GUAN.getValue()));
|
if(1 == systemFlag) {
|
Map<String, String> map = new HashMap<>();
|
map.put("batchNo", fundFlowTuiJian.getId().toString());
|
map.put("type", AppContants.SYMBOL_FLOW_TYPE_FLOW);
|
//发送链上转账消息
|
chainProducer.sendOnlineTransfer(JSONObject.toJSONString(map));
|
}else{
|
this.updateAmount(1,refMember.getId(),realPerk);
|
}
|
}
|
BigDecimal gfaDays = new BigDecimal(redisUtils.getString(DataDicEnum.GFA_DAYS.getValue())).setScale(2,BigDecimal.ROUND_DOWN);
|
//更新每日限额的质押总数
|
gfaDays = gfaDays.add(flow.getAmount()).setScale(2,BigDecimal.ROUND_DOWN);
|
dataDictionaryCustomMapper.updateDicValueByTypeAndCode(
|
DataDicEnum.GFA_DAYS.getValue(),
|
DataDicEnum.GFA_DAYS.getValue(),
|
gfaDays.toString()
|
);
|
this.redisCacheUpdate(DataDicEnum.GFA_DAYS.getValue(),gfaDays.toString(),0);
|
}
|
}
|