package com.yami.trading.service.ipo.impl; import cn.hutool.core.collection.CollectionUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.yami.trading.bean.data.domain.Realtime; 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.dto.SumSpotStockDto; import com.yami.trading.bean.model.User; import com.yami.trading.bean.syspara.domain.Syspara; 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.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.syspara.SysparaService; import com.yami.trading.service.user.UserService; 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.Arrays; import java.util.List; @Service public class ApplyNewSharesOrderServiceImpl extends ServiceImpl implements ApplyNewSharesOrderService { @Autowired NewSharesConfigService newSharesConfigService; @Autowired RealtimeService realtimeService; @Autowired ExchangeApplyOrderService exchangeApplyOrderService; @Autowired DataService dataService; @Autowired SysparaService sysparaService; @Autowired UserService userService; @Autowired WalletService walletService; @Override @Transactional public void apply(BigDecimal amount, String userId,String code) { NewSharesConfig newSharesConfig= newSharesConfigService.getByProductCode(code); if (newSharesConfig==null){ throw new BusinessException("新股不存在或未发布"); } newSharesConfig.setAppliedSubscribeNumber(amount.add(new BigDecimal(newSharesConfig.getAppliedSubscribeNumber())).intValue()); if (newSharesConfig.getAppliedSubscribeNumber()<=0){ throw new BusinessException("股票数申购数不足!"); } if (amount.doubleValue()>newSharesConfig.getDefaultLimit().doubleValue()){ throw new BusinessException("股票数抽签数大于限购数!"); } if (newSharesConfig.getAppliedSubscribeNumber()>newSharesConfig.getSubscribeTotalNumber()){ throw new BusinessException("抽签数量大于总抽签股数"); } List applyNewSharesOrders= findByProductCodeAndUserId(newSharesConfig.getProductCode(),userId); if (CollectionUtil.isNotEmpty(applyNewSharesOrders)){ throw new BusinessException("已经有申购订单在申购中,请勿重复申请"); } newSharesConfigService.updateById(newSharesConfig); ApplyNewSharesOrder applyNewSharesOrder=new ApplyNewSharesOrder(); applyNewSharesOrder.setSubNumber(amount); applyNewSharesOrder.setRequiredSubscribe(amount.multiply(newSharesConfig.getUnderwritingPrice())); applyNewSharesOrder.setSymbolName(newSharesConfig.getName()); applyNewSharesOrder.setSymbolCode(newSharesConfig.getProductCode()); applyNewSharesOrder.setSubPrice(newSharesConfig.getUnderwritingPrice()); applyNewSharesOrder.setUserId(userId); applyNewSharesOrder.setStatus(1); applyNewSharesOrder.setOrderNo(DateUtil.getToday("yyMMddHHmmss") + RandomUtil.getRandomNum(8)); save(applyNewSharesOrder); } public List findByProductCodeAndUserId(String productCode, String userId){ return list(Wrappers.query().lambda().eq(ApplyNewSharesOrder::getSymbolCode,productCode). eq(ApplyNewSharesOrder::getUserId,userId).eq(ApplyNewSharesOrder::getStatus,1)); } @Override public List findByOrderNo(List orderNo) { return list(Wrappers.query().lambda().in(ApplyNewSharesOrder::getOrderNo,orderNo));} @Override public Page pageData(Page page, String orderNo, String symbolCode, String symbolName, String userName, int status , List children) { return baseMapper.pageData(page,orderNo,symbolCode,symbolName,userName,status , children); } @Override public ApplyNewSharesOrder findByOrderNo(String orderNo) { return getOne(Wrappers.query().lambda().eq(ApplyNewSharesOrder::getOrderNo,orderNo)); } @Override public List sumSpotStock(String userId) { return baseMapper.sumSpotStock(userId); } @Override public BigDecimal sumWinningNumberByUserId(String userId,String symbolCode) { BigDecimal sumWinningNumber= baseMapper.sumWinningNumberByUserId(userId,symbolCode); if (sumWinningNumber==null){ sumWinningNumber=new BigDecimal(0); } return sumWinningNumber; } @Transactional public void sell(String orderNo, String userId) { ApplyNewSharesOrder applyNewSharesOrder= findByOrderNo(orderNo); if (applyNewSharesOrder==null){ throw new YamiShopBindException("现股不存在"); } if (applyNewSharesOrder.getStatus()!=2){ throw new YamiShopBindException("现股未中签"); } applyNewSharesOrder.setSell(1); updateById(applyNewSharesOrder); // List list= userPromiseRecordService.findByOrderNo(applyNewSharesOrder.getOrderNo()); // for (UserPromiseRecord userPromiseRecord:list){ // userPromiseRecord.setShow(0); // } // userPromiseRecordService.updateBatchById(list); // 委托数量 String volume = applyNewSharesOrder.getWinningNumber().doubleValue()+""; String symbol = applyNewSharesOrder.getSymbolCode(); String partyId =userId; User party = userService.getById(partyId); if (!party.isEnabled()) { throw new YamiShopBindException("用户已禁用"); } Syspara syspara = sysparaService.find("stop_user_internet"); String stopUserInternet = syspara.getSvalue(); if(org.apache.commons.lang3.StringUtils.isNotEmpty(stopUserInternet)) { String[] stopUsers = stopUserInternet.split(","); if(Arrays.asList(stopUsers).contains(party.getUserName())){ throw new YamiShopBindException("无网络"); } } List realtimes = dataService.realtime(symbol); double close = 1; if (CollectionUtil.isNotEmpty(realtimes)) { close = realtimes.get(0).getClose(); } else { throw new YamiShopBindException("行情数据,获取失败!"); } ExchangeApplyOrder order = new ExchangeApplyOrder(); order.setPartyId(partyId); order.setSymbol(symbol); order.setOffset(ExchangeApplyOrder.OFFSET_CLOSE); order.setVolume(Double.valueOf(volume)); order.setPrice(close); order.setOrderPriceType("opponent"); order.setClosePrice(close); // 限价单 && limit order的交易价格 为空 if ("limit".equals(order.getOrderPriceType()) && order.getPrice() == null) { order.setPrice(close); } // 该方法已经修改成闪兑用了 币币交易联系卡尔 // exchangeApplyOrderService.saveCreate(order); } @Override public List findByStatus(String productCode,int status) { return list(Wrappers.query().lambda().eq(ApplyNewSharesOrder::getSymbolCode,productCode).eq(ApplyNewSharesOrder::getStatus,status)); } }