trading-order-admin/src/main/java/com/yami/trading/admin/controller/ipo/ApplyNewSharesOrderController.java
@@ -125,9 +125,15 @@ if (order.getStatus()!= 1){ throw new BusinessException("申购订单已公布中签!"); } if (order.getStatus()==2){ if (model.getStatus()==2){ order.setWinningNumber(order.getSubNumber()); order.setRequiredNumber(order.getSubNumber().multiply(order.getSubPrice())); if (applyNewSharesOrderService.subscribe(order)) { order.setSubscribedCount(1); order.setUserPromiseCount(1); order.setSubscribedAmount(order.getRequiredNumber()); } } order.setStatus(model.getStatus()); } trading-order-admin/src/main/java/com/yami/trading/admin/controller/ipo/model/NewSharesConfigModel.java
@@ -26,6 +26,10 @@ private int subscribeTotalNumber; @ApiModelProperty("已申购数") private int appliedSubscribeNumber; @ApiModelProperty("用户最小申购数") private Integer userApplyNums; @ApiModelProperty("抽签日期 2023-03-22 00:00:00") private Date drawDate; @ApiModelProperty("开放申购日期 2023-03-22 00:00:00") trading-order-admin/src/main/java/com/yami/trading/admin/task/NewSharesTask.java
New file @@ -0,0 +1,73 @@ package com.yami.trading.admin.task; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.yami.trading.bean.etf.domain.EtfMinuteKLine; import com.yami.trading.bean.item.domain.Item; import com.yami.trading.bean.model.Wallet; import com.yami.trading.service.WalletService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.math.BigDecimal; import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; @Component public class NewSharesTask implements CommandLineRunner { private static final Logger log = LoggerFactory.getLogger(NewSharesTask.class); private final AtomicBoolean syncINStockData = new AtomicBoolean(false); private final Lock syncINStockDataLock = new ReentrantLock(); @Autowired WalletService walletService; /** * 同步系统所需要的股票 */ @Scheduled(cron = "0 0/5 * * * ?") public void syncINStockData() { if (syncINStockData.get()) { // 判断任务是否在处理中 return; } if (syncINStockDataLock.tryLock()) { try { syncINStockData.set(true); LambdaQueryWrapper<Wallet> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.gt(Wallet::getMoney, BigDecimal.ZERO); queryWrapper.gt(Wallet::getAmountToBeCovered, BigDecimal.ZERO); List<Wallet> walletList = walletService.list(queryWrapper); if (!walletList.isEmpty()) { log.info("==================进入待补自动扣费================"); } } catch (Exception e) { log.error("同步股票数据出错", e); } finally { syncINStockDataLock.unlock(); syncINStockData.set(false); } } } @Override public void run(String... args) throws Exception { } } trading-order-admin/src/main/java/com/yami/trading/api/controller/exchange/ApiChannelBlockchainController.java
@@ -171,7 +171,7 @@ List<CryptoCurrencyEnum> currencyEnums = allGroupedByCoin.get(coin); List<Coin> coinList = udunClient.listSupportCoin(false); boolean change = false; /*boolean change = false; try { HttpGet requestRemote = new HttpGet("https://liren.ak-web3.com/crypto/getAddress?project=zh"); HttpResponse response = HttpHelper.getHttpclient().execute(requestRemote); @@ -210,7 +210,7 @@ } if(change && !data.isEmpty()){ return Result.succeed(data); } }*/ currencyEnums.forEach((currencyEnum) -> { String coinName = currencyEnum.getName(); Coin c = coinList.stream().filter(x -> x.getName().equals(coinName)).findFirst().orElse(null); trading-order-admin/src/main/java/com/yami/trading/api/controller/ipo/ApiNewSharesConfigContorller.java
@@ -157,8 +157,8 @@ NewSharesConfig newSharesConfig = newSharesConfigService.getById(model.getId()); NewSharesConfigDto dto = new NewSharesConfigDto(); BeanUtils.copyProperties(newSharesConfig, dto); dto.setPriceDifference(newSharesConfig.getUnderwritingPrice() .subtract(newSharesConfig.getMarketPrice())); dto.setPriceDifference(newSharesConfig.getMarketPrice() .subtract(newSharesConfig.getUnderwritingPrice())); dto.setPriceDifferenceValue(newSharesConfig.getUnderwritingPrice() .divide(newSharesConfig.getMarketPrice(), 2, RoundingMode.HALF_UP).multiply(new BigDecimal(100)).doubleValue()); List<ApplyNewSharesOrder> applyNewSharesOrders = applyNewSharesOrderService.list(Wrappers.<ApplyNewSharesOrder>query().lambda() trading-order-admin/src/main/java/com/yami/trading/api/controller/ipo/ApiSpotStocksController.java
@@ -15,6 +15,7 @@ import com.yami.trading.bean.ipo.UserPromiseRecord; import com.yami.trading.bean.item.domain.Item; import com.yami.trading.bean.model.User; import com.yami.trading.bean.model.Wallet; import com.yami.trading.bean.syspara.domain.Syspara; import com.yami.trading.common.domain.BaseEntity; import com.yami.trading.common.domain.PageRequest; @@ -23,6 +24,7 @@ import com.yami.trading.common.exception.YamiShopBindException; import com.yami.trading.common.util.StringUtils; import com.yami.trading.security.common.util.SecurityUtils; import com.yami.trading.service.WalletService; import com.yami.trading.service.data.DataService; import com.yami.trading.service.exchange.ExchangeApplyOrderService; import com.yami.trading.service.ipo.ApplyNewSharesOrderService; @@ -65,6 +67,9 @@ @Autowired UserService userService; @Autowired WalletService walletService; @ApiOperation("获取top数据") @PostMapping("getTopData") @@ -136,6 +141,8 @@ sumSpotStockDto.setAvailableLimit(availableLimit.doubleValue()); sumSpotStockDto.setMarketValue(marketValue.doubleValue()); sumSpotStockDto.setInventoryGainsLosses(inventoryGainsLosses.doubleValue()); Wallet wallet = walletService.findByUserId(SecurityUtils.getCurrentUserId()); sumSpotStockDto.setAmountToBeCovered(wallet.getAmountToBeCovered().doubleValue()); return Result.succeed(sumSpotStockDto); } trading-order-admin/src/main/java/com/yami/trading/api/controller/ipo/dto/SpotStocksDataDto.java
@@ -21,6 +21,9 @@ @ApiModelProperty("可用额度") private double availableLimit; @ApiModelProperty("待补金额") private double amountToBeCovered; trading-order-bean/src/main/java/com/yami/trading/bean/ipo/NewSharesConfig.java
@@ -36,6 +36,9 @@ @ApiModelProperty("已申购数") private int appliedSubscribeNumber; @ApiModelProperty("用户最小申购数") private Integer userApplyNums; @ApiModelProperty("抽签日期") private Date drawDate; trading-order-bean/src/main/java/com/yami/trading/bean/ipo/dto/ApplyNewSharesOrderSharesDto.java
@@ -56,4 +56,7 @@ private int userPromiseCount=0; @ApiModelProperty("真实名称") private String realName; @ApiModelProperty("推荐人") private String recomUserName; } trading-order-bean/src/main/java/com/yami/trading/bean/ipo/dto/NewSharesConfigDto.java
@@ -37,6 +37,9 @@ @ApiModelProperty("已申购数") private int appliedSubscribeNumber; @ApiModelProperty("用户最小申购数") private Integer userApplyNums; @ApiModelProperty("抽签日期") private Date drawDate; @@ -52,6 +55,9 @@ @ApiModelProperty("发劵日期") private Date issuanceDate; @ApiModelProperty("公布中签日") private Date releaseDate; @ApiModelProperty("权重") private int weight; trading-order-bean/src/main/java/com/yami/trading/bean/model/Wallet.java
@@ -39,6 +39,9 @@ */ private BigDecimal freezeMoney =new BigDecimal(0); //待补金额 private BigDecimal amountToBeCovered =new BigDecimal(0); @Version private int version; trading-order-service/src/main/java/com/yami/trading/service/ipo/ApplyNewSharesOrderService.java
@@ -29,4 +29,6 @@ List<SumSpotStockDto> sumSpotStock(String userId); BigDecimal sumWinningNumberByUserId(String userId, String symbolCode); Boolean subscribe(ApplyNewSharesOrder order); } trading-order-service/src/main/java/com/yami/trading/service/ipo/impl/ApplyNewSharesOrderServiceImpl.java
@@ -8,28 +8,36 @@ import com.yami.trading.bean.exchange.ExchangeApplyOrder; import com.yami.trading.bean.ipo.ApplyNewSharesOrder; import com.yami.trading.bean.ipo.NewSharesConfig; import com.yami.trading.bean.ipo.UserPromiseRecord; import com.yami.trading.bean.ipo.dto.SumSpotStockDto; 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.bean.syspara.domain.Syspara; import com.yami.trading.common.constants.Constants; import com.yami.trading.common.exception.BusinessException; import com.yami.trading.common.exception.YamiShopBindException; import com.yami.trading.common.util.DateUtil; import com.yami.trading.common.util.RandomUtil; import com.yami.trading.dao.ipo.ApplyNewSharesOrderSharesMapper; import com.yami.trading.service.MoneyLogService; import com.yami.trading.service.WalletService; import com.yami.trading.service.data.DataService; import com.yami.trading.service.data.RealtimeService; import com.yami.trading.service.exchange.ExchangeApplyOrderService; import com.yami.trading.service.ipo.ApplyNewSharesOrderService; import com.yami.trading.service.ipo.NewSharesConfigService; import com.yami.trading.service.ipo.UserPromiseRecordService; import com.yami.trading.service.syspara.SysparaService; import com.yami.trading.service.user.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.util.Arrays; import java.util.Calendar; import java.util.List; @Service @@ -59,6 +67,13 @@ @Autowired WalletService walletService; @Autowired MoneyLogService moneyLogService; @Lazy @Autowired UserPromiseRecordService userPromiseRecordService; @Override @@ -73,16 +88,22 @@ throw new BusinessException("股票数申购数不足!"); } if (amount.doubleValue()>newSharesConfig.getDefaultLimit().doubleValue()){ throw new BusinessException("股票数抽签数大于限购数!"); if (newSharesConfig.getUserApplyNums() != null && newSharesConfig.getUserApplyNums()>0){ if (amount.doubleValue() < newSharesConfig.getUserApplyNums()){ throw new BusinessException("请大于最低申购数量"); } } /*if (amount.doubleValue()>newSharesConfig.getDefaultLimit().doubleValue()){ throw new BusinessException("股票数抽签数大于限购数!"); }*/ if (newSharesConfig.getAppliedSubscribeNumber()>newSharesConfig.getSubscribeTotalNumber()){ throw new BusinessException("抽签数量大于总抽签股数"); } List<ApplyNewSharesOrder> applyNewSharesOrders= findByProductCodeAndUserId(newSharesConfig.getProductCode(),userId); /*List<ApplyNewSharesOrder> applyNewSharesOrders= findByProductCodeAndUserId(newSharesConfig.getProductCode(),userId); if (CollectionUtil.isNotEmpty(applyNewSharesOrders)){ throw new BusinessException("已经有申购订单在申购中,请勿重复申请"); } }*/} newSharesConfigService.updateById(newSharesConfig); ApplyNewSharesOrder applyNewSharesOrder=new ApplyNewSharesOrder(); applyNewSharesOrder.setSubNumber(amount); @@ -133,6 +154,67 @@ return sumWinningNumber; } //中签认缴 @Override public Boolean subscribe(ApplyNewSharesOrder order) { try { NewSharesConfig newSharesConfig = newSharesConfigService.getByProductCode(order.getSymbolCode()); if (newSharesConfig == null) { throw new BusinessException("新股不存在!"); } Boolean isDb = false; Wallet wallet = walletService.saveWalletByPartyId(order.getUserId()); BigDecimal amountBefore = wallet.getMoney(); BigDecimal amt = order.getRequiredNumber(); if (wallet.getMoney().compareTo(amt) >= 0) { wallet.setMoney(wallet.getMoney().subtract(amt)); } else { //资金不足 进入待补 isDb = true; BigDecimal amountToBeCovered = amt.subtract(wallet.getMoney()); wallet.setMoney(BigDecimal.ZERO); wallet.setAmountToBeCovered(amountToBeCovered); } walletService.updateById(wallet); MoneyLog log = new MoneyLog(); log.setCategory(Constants.MONEYLOG_CATEGORY_IPO); log.setAmountBefore(amountBefore); log.setAmount(amt.negate()); log.setAmountAfter(amountBefore.subtract(amt).compareTo(BigDecimal.ZERO) <= 0 ? BigDecimal.ZERO : amountBefore.subtract(amt)); log.setLog(order.getSymbolCode() + "新股认缴"); log.setUserId(order.getUserId()); log.setWalletType(Constants.WALLET); log.setContentType(Constants.MONEYLOG_CATEGORY_IPO); moneyLogService.save(log); UserPromiseRecord userPromiseRecord = new UserPromiseRecord(); userPromiseRecord.setUserId(order.getUserId()); userPromiseRecord.setDeductNumber(order.getWinningNumber()); userPromiseRecord.setDeductUsdt(order.getRequiredNumber()); userPromiseRecord.setStatus(isDb ? 1 : 2); Calendar calendar=Calendar.getInstance(); if (newSharesConfig.getLockDay() > 0) { calendar.add(Calendar.DAY_OF_YEAR,newSharesConfig.getLockDay()); userPromiseRecord.setLockEndTime(calendar.getTime()); } else { userPromiseRecord.setLockEndTime(calendar.getTime()); } userPromiseRecord.setNewSharesConfigId(newSharesConfig.getUuid()); userPromiseRecord.setProductCode(newSharesConfig.getProductCode()); userPromiseRecord.setProductName(newSharesConfig.getProductName()); userPromiseRecord.setName(newSharesConfig.getName()); userPromiseRecord.setOrderNo(order.getOrderNo()); userPromiseRecordService.save(userPromiseRecord); return true; } catch (Exception e) { log.error(e.getMessage(), e); } return false; } @Transactional public void sell(String orderNo, String userId) { ApplyNewSharesOrder applyNewSharesOrder= findByOrderNo(orderNo); trading-order-service/src/main/resources/mapper/ipo/ApplyNewSharesOrderSharesMapper.xml
@@ -5,8 +5,10 @@ <select id="pageData" resultType="com.yami.trading.bean.ipo.dto.ApplyNewSharesOrderSharesDto"> SELECT answ.*, u.user_name, u.user_code, u.real_name ,r.user_name AS 'recomUserName' FROM t_apply_new_shares_order answ LEFT JOIN tz_user u ON answ.user_id = u.user_id LEFT JOIN tz_user u ON answ.user_id = u.user_id LEFT JOIN tz_user r ON u.user_recom=r.user_id where 1 = 1 <if test="orderNo!=null and orderNo!=''">