package com.xcong.excoin.modules.coin.service.impl;
|
|
import cn.hutool.core.collection.CollUtil;
|
import cn.hutool.core.util.RandomUtil;
|
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.core.util.ObjectUtil;
|
import cn.hutool.core.date.DateUtil;
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.xcong.excoin.common.LoginUserUtils;
|
import com.xcong.excoin.common.enumerates.MemberWalletCoinEnum;
|
import com.xcong.excoin.common.response.Result;
|
import com.xcong.excoin.modules.coin.dao.MemberAccountMoneyChangeDao;
|
import com.xcong.excoin.modules.coin.dao.ZhiYaDao;
|
import com.xcong.excoin.modules.coin.dao.ZhiYaRecordDao;
|
import com.xcong.excoin.modules.coin.dao.ZhiyaRewardDao;
|
import com.xcong.excoin.modules.coin.entity.MemberAccountMoneyChange;
|
import com.xcong.excoin.modules.coin.entity.ZhiYaEntity;
|
import com.xcong.excoin.modules.coin.entity.ZhiYaRecordEntity;
|
import com.xcong.excoin.modules.coin.entity.ZhiyaRewardEntity;
|
import com.xcong.excoin.modules.coin.parameter.dto.RecordsPageDto;
|
import com.xcong.excoin.modules.coin.parameter.dto.ZhiyaRewardRecordsPageDto;
|
import com.xcong.excoin.modules.coin.parameter.vo.MemberGusdInfoVo;
|
import com.xcong.excoin.modules.coin.parameter.vo.UsdtToGusdVo;
|
import com.xcong.excoin.modules.coin.parameter.vo.ZhiyaInfoVo;
|
import com.xcong.excoin.modules.coin.parameter.vo.ZhiyaRewardVo;
|
import com.xcong.excoin.modules.coin.service.ZhiyaService;
|
import com.xcong.excoin.modules.member.dao.MemberWalletCoinDao;
|
import com.xcong.excoin.modules.member.entity.MemberWalletCoinEntity;
|
import com.xcong.excoin.utils.MessageSourceUtils;
|
import com.xcong.excoin.utils.RedisUtils;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
|
import javax.annotation.Resource;
|
import java.math.BigDecimal;
|
import java.text.SimpleDateFormat;
|
import java.util.Calendar;
|
import java.util.Date;
|
import java.util.GregorianCalendar;
|
import java.util.List;
|
|
@Service
|
public class ZhiyaServiceImpl extends ServiceImpl<ZhiYaDao, ZhiYaEntity> implements ZhiyaService {
|
|
@Resource
|
MemberWalletCoinDao memberWalletCoinDao;
|
@Resource
|
MemberAccountMoneyChangeDao memberAccountMoneyChangeDao;
|
@Resource
|
ZhiYaRecordDao zhiYaRecordDao;
|
@Resource
|
ZhiyaRewardDao zhiyaRewardDao;
|
@Resource
|
ZhiYaDao zhiYaDao;
|
@Resource
|
RedisUtils redisUtils;
|
@Override
|
@Transactional
|
public Result usdtToGusd(BigDecimal balance, Integer type) {
|
//获取用户ID
|
Long memberId = LoginUserUtils.getAppLoginUser().getId();
|
if (balance.compareTo(BigDecimal.ZERO) <= 0) {
|
return Result.fail(MessageSourceUtils.getString("member_service_0004"));
|
}
|
if(1 == type){
|
// 扣币
|
String walletCode = MemberWalletCoinEnum.WALLETCOINCODE.getValue();
|
MemberWalletCoinEntity memberWalletCoinEntity = memberWalletCoinDao.selectWalletCoinBymIdAndCode(memberId, walletCode);
|
BigDecimal availableBalance = memberWalletCoinEntity.getAvailableBalance();
|
BigDecimal totalBalance = memberWalletCoinEntity.getTotalBalance();
|
|
BigDecimal available = availableBalance.subtract(balance);
|
if (available.compareTo(BigDecimal.ZERO) < 0) {
|
return Result.fail(MessageSourceUtils.getString("member_service_0005"));
|
}
|
BigDecimal total = totalBalance.subtract(balance);
|
if (total.compareTo(BigDecimal.ZERO) < 0) {
|
return Result.fail(MessageSourceUtils.getString("member_service_0005"));
|
}
|
|
memberWalletCoinEntity.setAvailableBalance(available);
|
memberWalletCoinEntity.setTotalBalance(total);
|
int i = memberWalletCoinDao.updateById(memberWalletCoinEntity);
|
if (i < 1) {
|
return Result.fail(MessageSourceUtils.getString("member_service_0096"));
|
}
|
//添加资金划转历史记录
|
MemberAccountMoneyChange memberAccountRecord = new MemberAccountMoneyChange();
|
//获取usdt兑换gusd的兑换比例
|
BigDecimal usdtToGusd = new BigDecimal(redisUtils.getString("USDTTOGSD"));
|
BigDecimal gusdBalance = balance.multiply(usdtToGusd);
|
|
ZhiYaEntity zhiya = zhiYaDao.selectByMemberId(memberId);
|
BigDecimal gusdAvailableBalance = zhiya.getAvailableBalance();
|
BigDecimal gusdTotalBalance = zhiya.getTotalBalance();
|
zhiya.setAvailableBalance(gusdAvailableBalance.add(gusdBalance));
|
zhiya.setTotalBalance(gusdTotalBalance.add(gusdBalance));
|
|
int updateById = zhiYaDao.updateById(zhiya);
|
if (updateById < 1) {
|
return Result.fail(MessageSourceUtils.getString("member_service_0096"));
|
}
|
|
//添加资金划转历史记录
|
memberAccountRecord.setMemberId(memberId);
|
memberAccountRecord.setStatus(MemberAccountMoneyChange.STATUS_SUCCESS_INTEGER);
|
memberAccountRecord.setSymbol(walletCode);
|
memberAccountRecord.setContent(MemberWalletCoinEnum.ZHIYATOGUSD.getValue());
|
memberAccountRecord.setType(MemberAccountMoneyChange.TYPE_WALLET_COIN);
|
memberAccountRecord.setAmount(gusdBalance);
|
memberAccountMoneyChangeDao.insert(memberAccountRecord);
|
}else if(2 == type){
|
// 扣币
|
ZhiYaEntity zhiya = zhiYaDao.selectByMemberId(memberId);
|
BigDecimal availableBalance = zhiya.getAvailableBalance();
|
BigDecimal totalBalance = zhiya.getTotalBalance();
|
|
BigDecimal available = availableBalance.subtract(balance);
|
if (available.compareTo(BigDecimal.ZERO) < 0) {
|
return Result.fail(MessageSourceUtils.getString("member_service_0005"));
|
}
|
BigDecimal total = totalBalance.subtract(balance);
|
if (total.compareTo(BigDecimal.ZERO) < 0) {
|
return Result.fail(MessageSourceUtils.getString("member_service_0005"));
|
}
|
|
zhiya.setAvailableBalance(available);
|
zhiya.setTotalBalance(total);
|
int i = zhiYaDao.updateById(zhiya);
|
if (i < 1) {
|
return Result.fail(MessageSourceUtils.getString("member_service_0096"));
|
}
|
//添加资金划转历史记录
|
MemberAccountMoneyChange memberAccountRecord = new MemberAccountMoneyChange();
|
//获取usdt兑换gusd的兑换比例
|
BigDecimal usdtToGusd = new BigDecimal(redisUtils.getString("USDTTOGSD"));
|
BigDecimal usdtBalance = balance.divide(usdtToGusd);
|
|
String walletCode = MemberWalletCoinEnum.WALLETCOINCODE.getValue();
|
MemberWalletCoinEntity memberWalletCoinEntity = memberWalletCoinDao.selectWalletCoinBymIdAndCode(memberId, walletCode);
|
|
BigDecimal gusdAvailableBalance = memberWalletCoinEntity.getAvailableBalance();
|
BigDecimal gusdTotalBalance = memberWalletCoinEntity.getTotalBalance();
|
memberWalletCoinEntity.setAvailableBalance(gusdAvailableBalance.add(usdtBalance));
|
memberWalletCoinEntity.setTotalBalance(gusdTotalBalance.add(usdtBalance));
|
|
int updateById = memberWalletCoinDao.updateById(memberWalletCoinEntity);
|
if (updateById < 1) {
|
return Result.fail(MessageSourceUtils.getString("member_service_0096"));
|
}
|
|
//添加资金划转历史记录
|
memberAccountRecord.setMemberId(memberId);
|
memberAccountRecord.setStatus(MemberAccountMoneyChange.STATUS_SUCCESS_INTEGER);
|
memberAccountRecord.setSymbol(walletCode);
|
memberAccountRecord.setContent(MemberWalletCoinEnum.ZHIYATOUSDT.getValue());
|
memberAccountRecord.setType(MemberAccountMoneyChange.TYPE_WALLET_COIN);
|
memberAccountRecord.setAmount(usdtBalance);
|
memberAccountMoneyChangeDao.insert(memberAccountRecord);
|
|
}else{
|
return Result.fail("member_controller_0005");
|
}
|
|
return Result.ok(MessageSourceUtils.getString("member_service_0024"));
|
}
|
|
@Override
|
@Transactional
|
public Result zhiYaGusd(BigDecimal balance) {
|
//获取用户ID
|
Long memberId = LoginUserUtils.getAppLoginUser().getId();
|
if (balance.compareTo(new BigDecimal(100)) < 0) {
|
return Result.fail(MessageSourceUtils.getString("zhiya_service_0006"));
|
}
|
|
//质押Gusd,质押数量进入冻结余额,
|
ZhiYaEntity zhiya = zhiYaDao.selectByMemberId(memberId);
|
BigDecimal gusdAvailableBalance = zhiya.getAvailableBalance();
|
BigDecimal gusdTotalBalance = zhiya.getTotalBalance();
|
BigDecimal gusdfrozenBalance = zhiya.getFrozenBalance();
|
|
BigDecimal available = gusdAvailableBalance.subtract(balance);
|
if (available.compareTo(BigDecimal.ZERO) < 0) {
|
return Result.fail(MessageSourceUtils.getString("zhiya_service_0005"));
|
}
|
BigDecimal total = gusdTotalBalance.subtract(balance);
|
if (total.compareTo(BigDecimal.ZERO) < 0) {
|
return Result.fail(MessageSourceUtils.getString("zhiya_service_0005"));
|
}
|
zhiya.setFrozenBalance(gusdfrozenBalance.add(balance));
|
zhiya.setAvailableBalance(gusdAvailableBalance.subtract(balance));
|
|
int updateById = zhiYaDao.updateById(zhiya);
|
if (updateById < 1) {
|
return Result.fail(MessageSourceUtils.getString("member_service_0096"));
|
}
|
//产生质押单,当前有的话,累加质押数量
|
// ZhiYaRecordEntity zhiYaRecord = zhiYaRecordDao.selectByMemberIdAndOrderStatus(memberId,1);
|
// if(ObjectUtil.isEmpty(zhiYaRecord)){
|
//产生一条质押记录
|
ZhiYaRecordEntity zhiYaRecordEntity = new ZhiYaRecordEntity();
|
zhiYaRecordEntity.setMemberId(memberId);
|
zhiYaRecordEntity.setOrderNo(generateSimpleSerialno(memberId.toString()));
|
zhiYaRecordEntity.setSymbol(MemberWalletCoinEnum.WALLETGUSDCOINCODE.getValue());
|
zhiYaRecordEntity.setZhiyaCnt(balance);
|
zhiYaRecordEntity.setOrderStatus(1);
|
Date date = new Date();
|
Date newDate = DateUtil.offsetDay(date, 1);
|
zhiYaRecordEntity.setEffectDate(newDate);
|
zhiYaRecordDao.insert(zhiYaRecordEntity);
|
// }else{
|
// zhiYaRecord.setZhiyaCnt(zhiYaRecord.getZhiyaCnt().add(balance));
|
// Date date = new Date();
|
// Date newDate = DateUtil.offsetDay(date, 1);
|
// zhiYaRecord.setEffectDate(newDate);
|
// zhiYaRecordDao.updateById(zhiYaRecord);
|
// }
|
//更新团队算力表
|
//只计算直属团队的算力信息
|
|
|
return Result.ok(MessageSourceUtils.getString("member_service_0024"));
|
}
|
|
@Override
|
@Transactional
|
public Result shuhuiGusd(BigDecimal balance,Long id) {
|
//获取用户ID
|
Long memberId = LoginUserUtils.getAppLoginUser().getId();
|
if (balance.compareTo(BigDecimal.ZERO) <= 0) {
|
return Result.fail(MessageSourceUtils.getString("zhiya_service_0004"));
|
}
|
//赎回Gusd,获取质押单据,
|
ZhiYaRecordEntity zhiYaRecordEntity = zhiYaRecordDao.selectByIdAndMemberId(id,memberId);
|
if(ObjectUtil.isEmpty(zhiYaRecordEntity)){
|
return Result.fail(MessageSourceUtils.getString("zhiya_service_0002"));
|
}
|
if(1 != zhiYaRecordEntity.getOrderStatus()){
|
return Result.fail(MessageSourceUtils.getString("zhiya_service_0003"));
|
}
|
BigDecimal zhiyaCnt = zhiYaRecordEntity.getZhiyaCnt();
|
if(balance.compareTo(zhiyaCnt) > 0){
|
return Result.fail(MessageSourceUtils.getString("zhiya_service_0004"));
|
}
|
// zhiYaRecordEntity.setZhiyaCnt(zhiyaCnt.subtract(balance));
|
if(zhiyaCnt.compareTo(balance) != 0){
|
return Result.fail(MessageSourceUtils.getString("zhiya_service_0001"));
|
}
|
zhiYaRecordEntity.setOrderStatus(2);
|
zhiYaRecordDao.updateById(zhiYaRecordEntity);
|
//赎回Gusd,质押数量进入可用余额,
|
ZhiYaEntity zhiya = zhiYaDao.selectByMemberId(memberId);
|
BigDecimal gusdAvailableBalance = zhiya.getAvailableBalance();
|
BigDecimal gusdTotalBalance = zhiya.getTotalBalance();
|
BigDecimal gusdfrozenBalance = zhiya.getFrozenBalance();
|
|
BigDecimal frozen = gusdfrozenBalance.subtract(balance);
|
if (frozen.compareTo(BigDecimal.ZERO) < 0) {
|
return Result.fail(MessageSourceUtils.getString("zhiya_service_0001"));
|
}
|
BigDecimal total = gusdTotalBalance.subtract(balance);
|
if (total.compareTo(BigDecimal.ZERO) < 0) {
|
return Result.fail(MessageSourceUtils.getString("member_service_0005"));
|
}
|
zhiya.setFrozenBalance(gusdfrozenBalance.subtract(balance));
|
zhiya.setAvailableBalance(gusdAvailableBalance.add(balance));
|
zhiYaDao.updateById(zhiya);
|
return Result.ok(MessageSourceUtils.getString("member_service_0024"));
|
}
|
|
@Override
|
public Result findMemberGusdInfo() {
|
//获取用户ID
|
Long memberId = LoginUserUtils.getAppLoginUser().getId();
|
ZhiYaEntity zhiYaEntity = zhiYaDao.selectByMemberId(memberId);
|
MemberGusdInfoVo memberGusdInfoVo = new MemberGusdInfoVo();
|
memberGusdInfoVo.setMemberId(memberId);
|
memberGusdInfoVo.setFrozenBalance(zhiYaEntity.getFrozenBalance());
|
memberGusdInfoVo.setTotalBalance(zhiYaEntity.getTotalBalance());
|
memberGusdInfoVo.setAvailableBalance(zhiYaEntity.getAvailableBalance());
|
return Result.ok(memberGusdInfoVo);
|
}
|
|
@Override
|
public Result getZhiyaRecords(RecordsPageDto recordsPageDto) {
|
//获取用户ID
|
Long memberId = LoginUserUtils.getAppLoginUser().getId();
|
|
Page<ZhiyaInfoVo> page = new Page<>(recordsPageDto.getPageNum(), recordsPageDto.getPageSize());
|
ZhiYaEntity zhiya = new ZhiYaEntity();
|
zhiya.setMemberId(memberId);
|
IPage<ZhiyaInfoVo> lists = zhiYaRecordDao.selectByMemberIdInPage(page, zhiya);
|
return Result.ok(lists);
|
}
|
|
@Override
|
public Result getusdtToGusdRecords(RecordsPageDto recordsPageDto) {
|
//获取用户ID
|
Long memberId = LoginUserUtils.getAppLoginUser().getId();
|
|
Page<UsdtToGusdVo> page = new Page<>(recordsPageDto.getPageNum(), recordsPageDto.getPageSize());
|
MemberAccountMoneyChange memberAccountMoneyChange = new MemberAccountMoneyChange();
|
memberAccountMoneyChange.setMemberId(memberId);
|
IPage<UsdtToGusdVo> lists = memberAccountMoneyChangeDao.selectByMemberIdInPage(page, memberAccountMoneyChange);
|
return Result.ok(lists);
|
}
|
|
@Override
|
@Transactional
|
public void grantZhiyaAmount() {
|
//获取每日总产出
|
BigDecimal gusdReward = new BigDecimal(redisUtils.getString("GUSDREWARD"));
|
//静态算力 = 每日总产出的80%
|
BigDecimal fixedGusdReward = gusdReward.multiply(new BigDecimal(0.8));
|
//获取每日全网总算力
|
Long totalGusd = zhiYaRecordDao.selectTotalGusdByStatueAndTime(1,new Date());
|
BigDecimal totalGusdBigDecimal = new BigDecimal(totalGusd);
|
if(totalGusdBigDecimal.compareTo(BigDecimal.ZERO) > 0){
|
//获取今天之前满足发放奖励的全部质押单
|
//生效时间小于当前时间
|
//状态为生效中
|
List<ZhiYaRecordEntity> lists = zhiYaRecordDao.selectZhiYaRewardByStatueAndTime(1,new Date());
|
if(CollUtil.isNotEmpty(lists)){
|
for(ZhiYaRecordEntity zhiYaRecordEntity : lists){
|
ZhiyaRewardEntity zhiyaRewardEntity = new ZhiyaRewardEntity();
|
zhiyaRewardEntity.setRecordId(zhiYaRecordEntity.getId());
|
zhiyaRewardEntity.setRecordNo(zhiYaRecordEntity.getOrderNo());
|
zhiyaRewardEntity.setMemberId(zhiYaRecordEntity.getMemberId());
|
//(个人算力/每日全网总算力)*静态算力
|
BigDecimal divide1 = zhiYaRecordEntity.getZhiyaCnt().divide(totalGusdBigDecimal, 2, BigDecimal.ROUND_HALF_UP);
|
BigDecimal multiply = divide1.multiply(fixedGusdReward);
|
zhiyaRewardEntity.setRewardAmout(multiply);
|
zhiyaRewardDao.insert(zhiyaRewardEntity);
|
}
|
}
|
}
|
}
|
|
@Override
|
public Result getZhiyaReward(ZhiyaRewardRecordsPageDto recordsPageDto) {
|
|
//获取用户ID
|
Long memberId = LoginUserUtils.getAppLoginUser().getId();
|
|
Page<ZhiyaRewardVo> page = new Page<>(recordsPageDto.getPageNum(), recordsPageDto.getPageSize());
|
ZhiyaRewardEntity zhiyaRewardEntity = new ZhiyaRewardEntity();
|
zhiyaRewardEntity.setMemberId(memberId);
|
zhiyaRewardEntity.setRecordNo(recordsPageDto.getOrderNo());
|
IPage<ZhiyaRewardVo> lists = zhiYaRecordDao.selectZhiyaRewardByMemberIdInPage(page, zhiyaRewardEntity);
|
return Result.ok(lists);
|
}
|
|
public String generateSimpleSerialno(String userId) {
|
StringBuilder sb = new StringBuilder();
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
|
SimpleDateFormat sd = new SimpleDateFormat("yyyyMMdd");
|
Date now = new Date();
|
sb.append(sd.format(now));
|
Calendar calendar = new GregorianCalendar();
|
calendar.setTime(now);
|
calendar.add(calendar.DATE, 1);
|
Date nextDate = calendar.getTime();
|
if (StrUtil.isNotEmpty(userId)) {
|
sb.append(userId);
|
}
|
sb.append(RandomUtil.randomInt(2));
|
long count = zhiYaRecordDao.getOrderCountByToday(sdf.format(now), sdf.format(nextDate));
|
count++;
|
int size = 4;
|
for (int i = 0; i < size - String.valueOf(count).length(); i++) {
|
sb.append("0");
|
}
|
sb.append(count);
|
return sb.toString();
|
}
|
}
|