package com.yami.trading.service.ico;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.yami.trading.bean.ico.domain.Ico;
|
import com.yami.trading.bean.ico.domain.UserSubscription;
|
import com.yami.trading.bean.model.MoneyLog;
|
import com.yami.trading.bean.model.User;
|
import com.yami.trading.bean.model.Wallet;
|
import com.yami.trading.common.constants.Constants;
|
import com.yami.trading.common.domain.Result;
|
import com.yami.trading.common.exception.YamiShopBindException;
|
import com.yami.trading.common.util.Arith;
|
import com.yami.trading.common.util.C2cLock;
|
import com.yami.trading.dao.ico.IcoMapper;
|
import com.yami.trading.service.MoneyLogService;
|
import com.yami.trading.service.WalletService;
|
import com.yami.trading.service.user.UserService;
|
import lombok.extern.slf4j.Slf4j;
|
|
import org.apache.commons.lang3.StringUtils;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
|
import java.math.BigDecimal;
|
import java.util.Date;
|
|
/**
|
* 新币Service
|
|
*/
|
@Service
|
@Transactional
|
@Slf4j
|
public class IcoService extends ServiceImpl<IcoMapper, Ico> {
|
|
@Autowired
|
UserService userService;
|
|
@Autowired
|
WalletService walletService;
|
|
@Autowired
|
UserSubscriptionService userSubscriptionService;
|
|
@Autowired
|
MoneyLogService moneyLogService;
|
|
/**
|
* 新币申购
|
* @param model
|
* @return
|
*/
|
public Result<String> subscribe(UserSubscription model) {
|
try {
|
if (model == null || model.getIcoProjectId() == null) {
|
throw new YamiShopBindException("参数异常");
|
}
|
String partyId = model.getUserId();
|
Ico ico = this.getById(model.getIcoProjectId());
|
if (ico == null) {
|
throw new YamiShopBindException("新币不存在");
|
}
|
|
User party = userService.getById(partyId);
|
if (!party.isEnabled()) {
|
return Result.succeed("User is locked");
|
}
|
if (Constants.SECURITY_ROLE_TEST.equals(party.getRoleName())) {
|
throw new YamiShopBindException("无权限");
|
}
|
if (!C2cLock.add(partyId)) {
|
throw new YamiShopBindException("Please try again later");
|
}
|
|
if (model.getSubscribeNums() == null || model.getSubscribeNums() == 0) {
|
throw new YamiShopBindException("申请数量不能为空");
|
}
|
//购买金额
|
BigDecimal amount = ico.getUnitAmount().multiply(new BigDecimal(model.getSubscribeNums()));
|
Wallet wallet = walletService.saveWalletByPartyId(partyId);
|
if (amount.compareTo(wallet.getMoney()) > 0) {
|
throw new YamiShopBindException("余额不足");
|
}
|
if(amount.compareTo(ico.getMinContribution()) < 0 ){
|
throw new YamiShopBindException("最低投资额: " + ico.getMinContribution());
|
}
|
if(amount.compareTo(ico.getMaxContribution()) > 0 ){
|
throw new YamiShopBindException("最高投资额: " + ico.getMaxContribution());
|
}
|
Date currentDate = new Date();
|
if(currentDate.before(ico.getStartDate())){
|
throw new YamiShopBindException("未开售");
|
}
|
if(currentDate.after(ico.getEndDate())){
|
throw new YamiShopBindException("已结束");
|
}
|
|
model.setStatus(1);
|
model.setUserId(partyId);
|
if (model.getSubscriptionType() == null) { //默认自主申购
|
model.setSubscriptionType(1);
|
}
|
userSubscriptionService.save(model);
|
walletService.update(partyId, Arith.sub(0, amount.doubleValue()));
|
|
// 保存 资金日志
|
MoneyLog moneylog = new MoneyLog();
|
moneylog.setCategory(Constants.MONEYLOG_CONTENT_NEW_COIN);
|
moneylog.setAmountBefore(wallet.getMoney());
|
moneylog.setAmount(amount);
|
moneylog.setAmountAfter(BigDecimal.valueOf(Arith.sub(wallet.getMoney().doubleValue(), amount.doubleValue())));
|
moneylog.setLog("新币购买,申购金额[" + amount + "]");
|
moneylog.setUserId(partyId);
|
moneylog.setSymbol(ico.getSymbol());
|
moneylog.setWalletType(ico.getSymbol());
|
moneylog.setContentType(Constants.MONEYLOG_CONTENT_NEW_COIN_OPEN);
|
moneyLogService.save(moneylog);
|
return Result.ok("申请成功" );
|
} catch (Exception e) {
|
throw new RuntimeException(e);
|
}
|
}
|
|
|
}
|