ipo
zyy
2025-12-30 e9520b1f4906738caddd3a6193159fc858d23ce8
ipo
13 files modified
1 files added
216 ■■■■■ changed files
trading-order-admin/src/main/java/com/yami/trading/admin/controller/ipo/ApplyNewSharesOrderController.java 8 ●●●● patch | view | raw | blame | history
trading-order-admin/src/main/java/com/yami/trading/admin/controller/ipo/model/NewSharesConfigModel.java 4 ●●●● patch | view | raw | blame | history
trading-order-admin/src/main/java/com/yami/trading/admin/task/NewSharesTask.java 73 ●●●●● patch | view | raw | blame | history
trading-order-admin/src/main/java/com/yami/trading/api/controller/exchange/ApiChannelBlockchainController.java 4 ●●●● patch | view | raw | blame | history
trading-order-admin/src/main/java/com/yami/trading/api/controller/ipo/ApiNewSharesConfigContorller.java 4 ●●●● patch | view | raw | blame | history
trading-order-admin/src/main/java/com/yami/trading/api/controller/ipo/ApiSpotStocksController.java 7 ●●●●● patch | view | raw | blame | history
trading-order-admin/src/main/java/com/yami/trading/api/controller/ipo/dto/SpotStocksDataDto.java 3 ●●●●● patch | view | raw | blame | history
trading-order-bean/src/main/java/com/yami/trading/bean/ipo/NewSharesConfig.java 3 ●●●●● patch | view | raw | blame | history
trading-order-bean/src/main/java/com/yami/trading/bean/ipo/dto/ApplyNewSharesOrderSharesDto.java 3 ●●●●● patch | view | raw | blame | history
trading-order-bean/src/main/java/com/yami/trading/bean/ipo/dto/NewSharesConfigDto.java 6 ●●●●● patch | view | raw | blame | history
trading-order-bean/src/main/java/com/yami/trading/bean/model/Wallet.java 3 ●●●●● patch | view | raw | blame | history
trading-order-service/src/main/java/com/yami/trading/service/ipo/ApplyNewSharesOrderService.java 2 ●●●●● patch | view | raw | blame | history
trading-order-service/src/main/java/com/yami/trading/service/ipo/impl/ApplyNewSharesOrderServiceImpl.java 92 ●●●●● patch | view | raw | blame | history
trading-order-service/src/main/resources/mapper/ipo/ApplyNewSharesOrderSharesMapper.xml 4 ●●● patch | view | raw | blame | history
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!=''">