From 9fd87aaf89b4afc3658182bca878d7ba21886dd4 Mon Sep 17 00:00:00 2001 From: VoGiaHuy2058 <39868777+vogiahuy2058@users.noreply.github.com> Date: Wed, 23 Jul 2025 10:19:05 +0700 Subject: [PATCH] done sync us stock and change env --- .../infrastructure/job/StockNewTask.java | 70 +++++++++++++++++++ src/main/resources/application-base-alpha.yml | 10 +-- 2 files changed, 75 insertions(+), 5 deletions(-) diff --git a/src/main/java/cn/stock/market/infrastructure/job/StockNewTask.java b/src/main/java/cn/stock/market/infrastructure/job/StockNewTask.java index 5e07022..2d0f4e9 100644 --- a/src/main/java/cn/stock/market/infrastructure/job/StockNewTask.java +++ b/src/main/java/cn/stock/market/infrastructure/job/StockNewTask.java @@ -31,6 +31,9 @@ public class StockNewTask { private static final String BASE_URL = "https://symbol-search.tradingview.com/symbol_search/v3/"; private static final String PARAMS = "?start={start}&hl=1&country=DE&lang=en&search_type=stocks&domain=production&sort_by_country=US&promo=true&exchange={exchange}"; + private static final String US_URL = + "https://financialmodelingprep.com/api/v3/stock-screener"; + private static final String US_API_KEY = "57ZI1xeAsqHY7ag0FBuMkwQzt6TQ60dG"; @Autowired StockRepository stockRepository; @@ -113,4 +116,71 @@ public class StockNewTask { e.printStackTrace(); } } + + @Scheduled(cron = "0 0 8 * * *") +// @PostConstruct + public void fetchListStock() { + try { + List nasdaqStocks = fetchStocksByExchange("NASDAQ"); + List nyseStocks = fetchStocksByExchange("NYSE"); + + List allActiveStocks = new ArrayList<>(); + allActiveStocks.addAll(nasdaqStocks); + allActiveStocks.addAll(nyseStocks); + + try { + if (!allActiveStocks.isEmpty()) { + stockRepository.saveAll(allActiveStocks); + } + } catch (Exception e) { + log.error("Insert stock failed: {}", e.getMessage()); + } + } catch (Exception e) { + log.error("Error fetchListStock every day: {}", e.getMessage()); + } + } + + private static List fetchStocksByExchange(String exchange) throws Exception { + List result = new ArrayList<>(); + + String url = US_URL + "?exchange=" + exchange + "&apikey=" + US_API_KEY; + + Request request = new Request.Builder() + .url(url) + .addHeader("accept", "application/json") + .addHeader("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64)") + .build(); + + Response response = client.newCall(request).execute(); + + if (!response.isSuccessful()) { + throw new RuntimeException("HTTP error code: " + response.code()); + } + + String body = response.body().string(); + JSONArray array = new JSONArray(body); + + for (int i = 0; i < array.length(); i++) { + JSONObject obj = array.getJSONObject(i); + if (!obj.optBoolean("isActivelyTrading", false) && obj.optBoolean("isEtf", false)) { + continue; + } + + Stock stock = new Stock(); + + String stockCodeNew = obj.getString("symbol") + ":" + obj.getString("exchangeShortName"); + + stock.setStockName(obj.getString("companyName")); + stock.setStockCode(stockCodeNew); + stock.setStockSpell(obj.getString("symbol")); + stock.setStockType(obj.getString("exchangeShortName")); + stock.setStockGid(stockCodeNew); + stock.setStockSymbol(obj.getString("symbol")); + + result.add(stock); + } + + System.out.println("Fetched " + result.size() + " stocks for exchange: " + exchange); + return result; + } } diff --git a/src/main/resources/application-base-alpha.yml b/src/main/resources/application-base-alpha.yml index b2e9501..846edf1 100644 --- a/src/main/resources/application-base-alpha.yml +++ b/src/main/resources/application-base-alpha.yml @@ -3,9 +3,9 @@ spring: show-sql: true # Redis配置 redis: - host: 43.153.142.41 - password: a5v8b86P4mVzFlUqJV - port: 30041 + host: 43.160.197.177 + password: redispass123 + port: 6379 database: 1 lettuce: pool: @@ -17,9 +17,9 @@ spring: datasource: stock-market: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://43.153.142.41:30040/germany_stock?useUnicode=true&characterEncoding=utf-8 + url: jdbc:mysql://43.160.197.177:3306/germany_stock?useUnicode=true&characterEncoding=utf-8 username: root - password: uNejHIFQGJOUtYTmE + password: mysqlpass123 maxActive: 500 testWhileIdle: true validationQuery: SELECT 1