package com.yami.trading.api.controller.ipo; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.OrderItem; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.yami.trading.admin.model.IdModel; import com.yami.trading.api.controller.ipo.dto.ProspectusDto; import com.yami.trading.api.controller.ipo.model.GetProspectusModel; import com.yami.trading.api.controller.ipo.model.ListListingAndlistedModel; import com.yami.trading.api.controller.ipo.model.NewSharesConfigModel; import com.yami.trading.bean.ipo.*; import com.yami.trading.bean.ipo.dto.NewSharesConfigDto; import com.yami.trading.bean.item.domain.Item; import com.yami.trading.common.domain.Result; import com.yami.trading.common.util.StringUtils; import com.yami.trading.huobi.hobi.internal.SpiderService; import com.yami.trading.security.common.util.SecurityUtils; import com.yami.trading.service.data.DataService; import com.yami.trading.service.ipo.ApplyNewSharesOrderService; import com.yami.trading.service.ipo.NewSharesConfigService; import com.yami.trading.service.ipo.ProspectusService; import com.yami.trading.service.ipo.UserPromiseRecordService; import com.yami.trading.service.item.ItemService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.parameters.P; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; import javax.validation.Valid; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.*; import java.util.stream.Collectors; @RestController @CrossOrigin @RequestMapping("api/newSharesConfig") @Api(tags = "新股认购") @Slf4j public class ApiNewSharesConfigContorller { @Autowired NewSharesConfigService newSharesConfigService; @Autowired ProspectusService prospectusService; @Autowired DataService dataService; @Autowired ApplyNewSharesOrderService applyNewSharesOrderService; @Autowired UserPromiseRecordService userPromiseRecordService; @Autowired ItemService itemService; @Autowired private SpiderService spiderService; @ApiOperation(value = "新上市列表") @GetMapping("newIssueList") public Result> newIssue(@RequestParam(required = false) String type) { List xueQiuNewStocks = spiderService.fetchNewStocks(); if(CollectionUtil.isEmpty(xueQiuNewStocks)){ return Result.succeed(xueQiuNewStocks); } for (XueQiuNewStocks xueQiuNewStock : xueQiuNewStocks) { String symbol = xueQiuNewStock.getSymbol(); Item bySymbol = itemService.findBySymbol(symbol); if(bySymbol != null && StringUtils.isNotEmpty(bySymbol.getName())){ xueQiuNewStock.setName(bySymbol.getName()); xueQiuNewStock.setType(bySymbol.getType()); } } return Result.succeed(xueQiuNewStocks); } @ApiOperation(value = "列表") @PostMapping("list") public Result> list(@Valid NewSharesConfigModel model, HttpServletRequest request) { Page page = new Page(model.getCurrent(), model.getSize()); LambdaQueryWrapper lambdaQueryWrapper = Wrappers.query() .lambda().eq(NewSharesConfig::getStatus, 2); if (StrUtil.isNotEmpty(model.getType())){ List symbols = itemService.findDBByType(model.getType()).stream().map(Item::getSymbol).collect(Collectors.toList()); symbols.add("-1"); log.info("新股认购"+JSONUtil.toJsonStr(symbols)); lambdaQueryWrapper.in(NewSharesConfig::getProductCode,symbols); } lambdaQueryWrapper.orderByAsc(NewSharesConfig::getWeight); newSharesConfigService.page(page, lambdaQueryWrapper); List producntCode = new ArrayList<>(); for (NewSharesConfig newSharesConfig : page.getRecords()) { newSharesConfig.setPriceDifference(newSharesConfig.getUnderwritingPrice() .subtract(newSharesConfig.getMarketPrice())); producntCode.add(newSharesConfig.getProductCode()); newSharesConfig.setPriceDifferenceValue(newSharesConfig.getUnderwritingPrice() .divide(newSharesConfig.getMarketPrice(), 2, RoundingMode.HALF_UP).multiply(new BigDecimal(100)).doubleValue()); } List applyNewSharesOrders = new ArrayList<>(); if (CollectionUtil.isNotEmpty(producntCode)) { applyNewSharesOrders = applyNewSharesOrderService.list(Wrappers.query().lambda() .in(ApplyNewSharesOrder::getSymbolCode, producntCode) .eq(ApplyNewSharesOrder::getStatus, 2) .eq(ApplyNewSharesOrder::getUserId, SecurityUtils.getCurrentUserId())); } Map map = new HashMap<>(); for (ApplyNewSharesOrder order : applyNewSharesOrders) { map.put(order.getSymbolCode(), order); } for (NewSharesConfig newSharesConfig : page.getRecords()) { Item item = itemService.findBySymbol(newSharesConfig.getProductCode()); if (item != null) { newSharesConfig.setName(item.getName()); } ApplyNewSharesOrder order = map.get(newSharesConfig.getProductCode()); newSharesConfig.setShareStatus(map.containsKey(newSharesConfig.getProductCode()) ? 2 : 1); Date now =new Date(); Date startDate = newSharesConfig.getStartSubscribeDate(); Date endDate =newSharesConfig.getEndSubscribeDate(); if (newSharesConfig.getShareStatus() == 1) { if (now.getTime() endDate.getTime()) { newSharesConfig.setShareStatus(0); } } if (newSharesConfig.getShareStatus() == 2) { if (now.getTime() > endDate.getTime()) { newSharesConfig.setShareStatus(0); } } if (newSharesConfig.getShareStatus() == 2) { if (order.getSubscribedCount()>0){ if (order.getUserPromiseCount() == order.getSubscribedCount()) { newSharesConfig.setShareStatus(0); } } } } Result result= Result.succeed(page.getRecords()); result.setTotal(page.getTotal()); return result; } @ApiOperation(value = "详情接口") @PostMapping("getDesc") public Result list(@Valid IdModel model, HttpServletRequest request) { NewSharesConfig newSharesConfig = newSharesConfigService.getById(model.getId()); NewSharesConfigDto dto = new NewSharesConfigDto(); BeanUtils.copyProperties(newSharesConfig, dto); dto.setPriceDifference(newSharesConfig.getUnderwritingPrice() .subtract(newSharesConfig.getMarketPrice())); dto.setPriceDifferenceValue(newSharesConfig.getUnderwritingPrice() .divide(newSharesConfig.getMarketPrice(), 2, RoundingMode.HALF_UP).multiply(new BigDecimal(100)).doubleValue()); List applyNewSharesOrders = applyNewSharesOrderService.list(Wrappers.query().lambda() .eq(ApplyNewSharesOrder::getSymbolCode, newSharesConfig.getProductCode()).eq(ApplyNewSharesOrder::getStatus, 2).eq(ApplyNewSharesOrder::getUserId, SecurityUtils.getCurrentUserId())); List userPromiseRecords = userPromiseRecordService.findByProductCodeAndUserId(newSharesConfig.getProductCode(), SecurityUtils.getUser().getUserId()); if (CollectionUtil.isNotEmpty(applyNewSharesOrders)) { dto.setShareStatus(2); dto.setRequiredNumber(applyNewSharesOrders.get(0).getRequiredNumber()); dto.setOrderNo(applyNewSharesOrders.get(0).getOrderNo()); dto.setWinningNumber(applyNewSharesOrders.get(0).getWinningNumber()); } else { dto.setShareStatus(1); dto.setRequiredNumber(new BigDecimal(0)); } if (CollectionUtil.isNotEmpty(userPromiseRecords)) { dto.setUserPromiseCount(applyNewSharesOrders.get(0).getUserPromiseCount()-userPromiseRecords.size()); int sumNumber = 0; for (UserPromiseRecord record : userPromiseRecords) { sumNumber += record.getDeductNumber().intValue(); } if (CollectionUtil.isNotEmpty(applyNewSharesOrders)) { dto.setResiduePromiseNumber(applyNewSharesOrders.get(0).getWinningNumber().subtract(new BigDecimal(sumNumber)).intValue()); } } else { if (CollectionUtil.isNotEmpty(applyNewSharesOrders)) { dto.setUserPromiseCount(applyNewSharesOrders.get(0).getUserPromiseCount()); dto.setResiduePromiseNumber(applyNewSharesOrders.get(0).getWinningNumber().intValue()); } } // String language = request.getParameter("language"); Item item = itemService.findBySymbol(newSharesConfig.getProductCode()); if (item != null) { dto.setName(item.getName()); } return Result.succeed(dto); } @ApiOperation(value = "获取招股书") @PostMapping("getProspectus") public Result> getProspectus(@Valid GetProspectusModel pageRequest, HttpServletRequest request) { Page page = new Page(pageRequest.getCurrent(), pageRequest.getSize()); LambdaQueryWrapper lambdaQueryWrapper = Wrappers.query() .lambda(); if (StrUtil.isNotEmpty(pageRequest.getType())){ List symbols = itemService.findDBByType(pageRequest.getType()).stream().map(Item::getSymbol).collect(Collectors.toList()); symbols.add("-1"); lambdaQueryWrapper.in(Prospectus::getProductCode,symbols); } List orders = new ArrayList<>(); orders.add(OrderItem.desc("create_time")); page.setOrders(orders); prospectusService.page(page,lambdaQueryWrapper); // String language = request.getParameter("language"); List list = new ArrayList<>(); for (Prospectus prospectus : page.getRecords()) { ProspectusDto prospectusDto = new ProspectusDto(); BeanUtils.copyProperties(prospectus, prospectusDto); Item item = itemService.findBySymbol(prospectusDto.getProductCode()); if (item != null) { prospectusDto.setProductName(item.getName()); } list.add(prospectusDto); } return Result.succeed(list); } @ApiOperation(value = "待上市列表 已上市列表") @PostMapping("listListingAndlisted") public Result> listPendingListing(@Valid ListListingAndlistedModel model, HttpServletRequest request) { Page page = new Page(model.getCurrent(), model.getSize()); LambdaQueryWrapper lambdaQueryWrapper = Wrappers.query() .lambda().eq(NewSharesConfig::getIpoStatus, model.getIpoStatus()); lambdaQueryWrapper.orderByDesc(NewSharesConfig::getWeight); if (StrUtil.isNotEmpty(model.getType())){ List symbols = itemService.findDBByType(model.getType()).stream().map(Item::getSymbol).collect(Collectors.toList()); symbols.add("-1"); lambdaQueryWrapper.in(NewSharesConfig::getProductCode,symbols); } // String language = request.getParameter("language"); newSharesConfigService.page(page, lambdaQueryWrapper); for (NewSharesConfig newSharesConfig : page.getRecords()) { Item item = itemService.findBySymbol(newSharesConfig.getProductCode()); if (item != null) { newSharesConfig.setName( item.getName()); } } return Result.succeed(page.getRecords()); } }