| | |
| | | |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.yami.trading.bean.ico.domain.Ico; |
| | | import com.yami.trading.bean.ico.domain.UserSubscriptionRecord; |
| | | 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 |
| | |
| | | @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(UserSubscriptionRecord model) { |
| | | 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("新币不存在"); |
| | | } |
| | | |
| | | return Result.ok("保存产品成功" ); |
| | | 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); |
| | | } |
| | | } |
| | | |
| | | |