From 1ff1797b0b0707e5c2f88c49466fd10528a9d9a4 Mon Sep 17 00:00:00 2001 From: vogiahuy2058 Date: Thu, 24 Oct 2024 14:10:42 +0700 Subject: [PATCH] done new logic to add moneystock --- .../infrastructure/db/po/QStockIpoPO.java | 1 + .../market/infrastructure/job/Scraper.java | 115 ++++++++++++++++-- 2 files changed, 106 insertions(+), 10 deletions(-) diff --git a/src/main/generated/cn/stock/market/infrastructure/db/po/QStockIpoPO.java b/src/main/generated/cn/stock/market/infrastructure/db/po/QStockIpoPO.java index b29a919..657c8d4 100644 --- a/src/main/generated/cn/stock/market/infrastructure/db/po/QStockIpoPO.java +++ b/src/main/generated/cn/stock/market/infrastructure/db/po/QStockIpoPO.java @@ -38,6 +38,7 @@ public class QStockIpoPO extends EntityPathBase { public final StringPath stockCode = createString("stockCode"); public final StringPath stockName = createString("stockName"); + public final StringPath exchangeType = createString("exchangeType"); public final NumberPath stockPrice = createNumber("stockPrice", java.math.BigDecimal.class); diff --git a/src/main/java/cn/stock/market/infrastructure/job/Scraper.java b/src/main/java/cn/stock/market/infrastructure/job/Scraper.java index 7394a74..f10651b 100644 --- a/src/main/java/cn/stock/market/infrastructure/job/Scraper.java +++ b/src/main/java/cn/stock/market/infrastructure/job/Scraper.java @@ -2,6 +2,7 @@ package cn.stock.market.infrastructure.job; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import cn.stock.market.domain.basic.entity.BtodayStock; import cn.stock.market.domain.basic.entity.MoneyStock; import cn.stock.market.domain.basic.entity.StockIpo; @@ -9,6 +10,7 @@ import cn.stock.market.domain.basic.repository.BtodayStockRepository; import cn.stock.market.domain.basic.repository.MoneyStockRepository; import cn.stock.market.domain.basic.repository.StockIpoRepository; import cn.stock.market.dto.StockIpoDTO; +import cn.stock.market.infrastructure.db.po.QMoneyStockPO; import cn.stock.market.infrastructure.db.po.QStockIpoPO; import cn.stock.market.infrastructure.db.po.StockIpoPO; import cn.stock.market.infrastructure.db.repo.BtodayStockRepo; @@ -58,6 +60,8 @@ public class Scraper { @Autowired private MoneyStockRepository moneyStockRepository; + private boolean times = false; + @Scheduled(cron = "0 0 1 */2 * ?") @RequestMapping("/testScraperGetBusinessToday") @@ -257,9 +261,6 @@ public class Scraper { if(CollectionUtil.isNotEmpty(listStockIpoList)){ stockIpoRepository.saveAll(listStockIpoList); - List moneyStockList = convertToMoneyStock(listStockIpoList); - moneyStockRepository.saveAll(moneyStockList); - log.info("定时任务执行获取新股ipo的方法开始结束,保存了数据:{}", JSON.toJSONString(listStockIpoList)); }else { log.info("定时任务执行获取新股ipo的方法开始结束,没有数据"); @@ -280,6 +281,36 @@ public class Scraper { } +// @Scheduled(cron = "0 0 19 * * ?") + @PostConstruct + @RequestMapping("/addMoneyStock") + public void addMoneyStock() { + log.info("定时任务执行获取新股ipo的方法开始执行"); + + List stockIpoList; + + if(!times){ + stockIpoList = stockIpoRepository.findAll(QStockIpoPO.stockIpoPO.listingDate.isNotNull() + .and(QStockIpoPO.stockIpoPO.listingDate.loe(DateTime.now())) + .and(QStockIpoPO.stockIpoPO.exchangeType.isNotNull()) + .and(QStockIpoPO.stockIpoPO.exchangeType.isNotEmpty()) + ); // first time run + + times = true; + } + else { + stockIpoList = stockIpoRepository.findAll(QStockIpoPO.stockIpoPO.listingDate.isNotNull() + .and(QStockIpoPO.stockIpoPO.listingDate.loe(DateTime.now()) + .and(QStockIpoPO.stockIpoPO.listingDate.goe(DateUtil.offsetDay(DateTime.now(), -3)))) + .and(QStockIpoPO.stockIpoPO.exchangeType.isNotNull()) + .and(QStockIpoPO.stockIpoPO.exchangeType.isNotEmpty()) + ); // from second run + } + + List moneyStockList = convertToMoneyStock(stockIpoList); + moneyStockRepository.saveAll(moneyStockList); + } + private static Timestamp convertStringToTimestamp(String dateString) { // 实现将字符串转换为 Timestamp 的逻辑 @@ -291,12 +322,6 @@ public class Scraper { } } - - - - - - private void processSubMap(Map sefUrlList) { for (Map.Entry entry : sefUrlList.entrySet()) { String companyName = entry.getKey(); @@ -479,9 +504,38 @@ public class Scraper { } public List convertToMoneyStock(List stockIpoList) { - return stockIpoList.stream().map(this::convert).collect(Collectors.toList()); + // Lấy danh sách tất cả stockCode và exchangeType từ stockIpoList + Set stockCodes = stockIpoList.stream().map(StockIpo::getStockCode).collect(Collectors.toSet()); + Set exchangeTypes = stockIpoList.stream().map(StockIpo::getExchangeType).collect(Collectors.toSet()); + + // Lấy tất cả các MoneyStock tồn tại trong database với stockCode và exchangeType trong stockIpoList + List existingMoneyStocks = moneyStockRepository.findAll( + QMoneyStockPO.moneyStockPO.moneyScId.in(stockCodes) + .and(QMoneyStockPO.moneyStockPO.stockType.in(exchangeTypes)) + ); + + // Lưu các stockCode và exchangeType đã tồn tại + Set existingKeys = existingMoneyStocks.stream() + .map(ms -> ms.getMoneyScId() + ms.getStockType()) + .collect(Collectors.toSet()); + + // Chỉ giữ những StockIpo chưa tồn tại + return stockIpoList.stream() + .filter(stockIpo -> !existingKeys.contains(stockIpo.getStockCode() + stockIpo.getExchangeType())) + .map(this::convert) + .collect(Collectors.toList()); } +// public List convertToMoneyStock(List stockIpoList) { +// return stockIpoList.stream() +// .filter(stockIpo -> !moneyStockRepository.exists( +// QMoneyStockPO.moneyStockPO.stockType.eq(stockIpo.getExchangeType()) +// .and(QMoneyStockPO.moneyStockPO.moneyScId.eq(stockIpo.getStockCode())) +// )) // Chỉ giữ những StockIpo chưa tồn tại +// .map(this::convert) +// .collect(Collectors.toList()); +// } + private MoneyStock convert(StockIpo stockIpo) { MoneyStock moneyStock = new MoneyStock(); @@ -490,7 +544,48 @@ public class Scraper { moneyStock.setSelfDispId(stockIpo.getStockCode()); moneyStock.setStockType(stockIpo.getExchangeType()); moneyStock.setSaveTime(DateTime.now()); + moneyStock.setNseIndiaId(getNSEId(stockIpo)); return moneyStock; } + + private String getNSEId(StockIpo stockIpo){ + String url = "https://priceapi.moneycontrol.com/pricefeed/" + stockIpo.getExchangeType().toLowerCase() + "/equitycash/" + stockIpo.getStockCode(); + // 创建 HttpClient 实例 + HttpClient client = HttpClients.createDefault(); + // 创建 HttpGet 请求 + HttpGet request = new HttpGet(url); + try { + // 执行请求 + HttpResponse response = client.execute(request); + + // 检查请求是否成功 + if (response.getStatusLine().getStatusCode() == 200) { + // 获取响应体 + String responseBody = EntityUtils.toString(response.getEntity()); + + if (responseBody != null) { + // 获取 JSON 数据 + + // 将 JSON 字符串解析为 Java JSONObject + JSONObject jsonObject = JSONObject.parseObject(responseBody); + log.info("获取到新股的json信息:" + jsonObject.toJSONString()); + + JSONObject jsonData = jsonObject.getJSONObject("data"); + + if(stockIpo.getExchangeType().equals("NSE")){ + return jsonData.getString("NSEID"); + } + else if(stockIpo.getExchangeType().equals("BSE")){ + return jsonData.getString("BSEID"); + } + } + } + } + catch (Exception e){ + log.info(e.getMessage()); + } + + return ""; + } }