From 9785a391a200ec42d4fc4e4b37c93bf041c722aa Mon Sep 17 00:00:00 2001 From: VoGiaHuy2058 <39868777+vogiahuy2058@users.noreply.github.com> Date: Wed, 18 Jun 2025 17:51:36 +0700 Subject: [PATCH] home-page --- .../domain/basic/service/StockService.java | 4 +- .../cn/stock/market/dto/model/StockIndex.java | 31 ++++++++ .../infrastructure/api/HomeApiIndex.java | 75 +++++++++++++++++++ .../stock/market/web/StockApiController.java | 8 +- 4 files changed, 115 insertions(+), 3 deletions(-) create mode 100644 src/main/java/cn/stock/market/dto/model/StockIndex.java create mode 100644 src/main/java/cn/stock/market/infrastructure/api/HomeApiIndex.java diff --git a/src/main/java/cn/stock/market/domain/basic/service/StockService.java b/src/main/java/cn/stock/market/domain/basic/service/StockService.java index b0ad5c3..c6536d8 100644 --- a/src/main/java/cn/stock/market/domain/basic/service/StockService.java +++ b/src/main/java/cn/stock/market/domain/basic/service/StockService.java @@ -13,6 +13,7 @@ import cn.hutool.core.text.StrFormatter; import cn.stock.market.dto.model.*; import cn.stock.market.infrastructure.api.EttechchartsApis; import cn.stock.market.infrastructure.api.GrowwInApis; +import cn.stock.market.infrastructure.api.HomeApiIndex; import cn.stock.market.infrastructure.api.TodayApis; import cn.stock.market.infrastructure.api.investing.IndiaIndexVo; import cn.stock.market.infrastructure.api.investing.IndiaStockVO; @@ -1048,7 +1049,8 @@ public class StockService { return ServerResponse.createBySuccess(indexVoList); } - public ServerResponse getIndexByBtoday(){ + public ServerResponse getIndexByBtoday() throws Exception { + List list = HomeApiIndex.fetchStockIndices(); List indexVoList = new ArrayList<>(); try { String exchange = "bse"; diff --git a/src/main/java/cn/stock/market/dto/model/StockIndex.java b/src/main/java/cn/stock/market/dto/model/StockIndex.java new file mode 100644 index 0000000..9dd8a84 --- /dev/null +++ b/src/main/java/cn/stock/market/dto/model/StockIndex.java @@ -0,0 +1,31 @@ +package cn.stock.market.dto.model; + +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +public class StockIndex { + private String id; + private String symbol; + private String name; + private String exchange; + private String micCode; + private String datetime; + private long timestamp; + private Double open; + private Double high; + private Double low; + private Double close; + private Long volume; + private Double previousClose; + private Double change; + private Double percentChange; + private Long averageVolume; + private Boolean isMarketOpen; + private Long marketCap; + private String fiftyTwoWeek; + private Integer icon; + + // Getters & setters (hoặc dùng @Data nếu có Lombok) +} \ No newline at end of file diff --git a/src/main/java/cn/stock/market/infrastructure/api/HomeApiIndex.java b/src/main/java/cn/stock/market/infrastructure/api/HomeApiIndex.java new file mode 100644 index 0000000..0165415 --- /dev/null +++ b/src/main/java/cn/stock/market/infrastructure/api/HomeApiIndex.java @@ -0,0 +1,75 @@ +package cn.stock.market.infrastructure.api; +import cn.stock.market.dto.model.StockIndex; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import org.json.JSONArray; +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.List; + +public class HomeApiIndex { + private static final OkHttpClient client = new OkHttpClient(); + private static final String API_URL = "https://apinode-dgdev.moneytj.com/api/ger-market/stocks/query-list?symbols=XETR:DAX,XETR:MDAX,XETR:SDXP,XETR:HDAX"; + + + public static List fetchStockIndices() throws Exception { + List result = new ArrayList<>(); + + Request request = new Request.Builder() + .url(API_URL) + .addHeader("User-Agent", "Mozilla/5.0") + .addHeader("Accept", "application/json") + .build(); + + Response response = client.newCall(request).execute(); + + if (!response.isSuccessful()) { + throw new RuntimeException("HTTP error code: " + response.code()); + } + + String body = response.body().string(); + JSONObject json = new JSONObject(body); + JSONArray data = json.getJSONArray("data"); + + for (int i = 0; i < data.length(); i++) { + JSONObject obj = data.getJSONObject(i); + StockIndex index = new StockIndex(); + + index.setId(obj.optString("id")); + index.setSymbol(obj.optString("symbol")); + index.setName(obj.optString("name")); + index.setExchange(obj.optString("exchange")); + index.setMicCode(obj.optString("mic_code")); + index.setDatetime(obj.optString("datetime")); + index.setTimestamp(obj.optLong("timestamp")); + index.setOpen(getDoubleOrNull(obj, "open")); + index.setHigh(getDoubleOrNull(obj, "high")); + index.setLow(getDoubleOrNull(obj, "low")); + index.setClose(getDoubleOrNull(obj, "close")); + index.setVolume(getLongOrNull(obj, "volume")); + index.setPreviousClose(getDoubleOrNull(obj, "previous_close")); + index.setChange(getDoubleOrNull(obj, "change")); + index.setPercentChange(getDoubleOrNull(obj, "percent_change")); + index.setAverageVolume(getLongOrNull(obj, "average_volume")); + index.setIsMarketOpen(obj.optBoolean("is_market_open")); + index.setMarketCap(getLongOrNull(obj, "market_cap")); + index.setFiftyTwoWeek(obj.optString("fifty_two_week", null)); + index.setIcon(obj.optInt("icon", 0)); + + result.add(index); + } + + return result; + } + + // Helper to safely parse nullable numbers + private static Double getDoubleOrNull(JSONObject obj, String key) { + return obj.isNull(key) ? null : obj.optDouble(key); + } + + private static Long getLongOrNull(JSONObject obj, String key) { + return obj.isNull(key) ? null : obj.optLong(key); + } +} diff --git a/src/main/java/cn/stock/market/web/StockApiController.java b/src/main/java/cn/stock/market/web/StockApiController.java index 3d25e95..16bb8d9 100644 --- a/src/main/java/cn/stock/market/web/StockApiController.java +++ b/src/main/java/cn/stock/market/web/StockApiController.java @@ -249,8 +249,12 @@ public class StockApiController { public ServerResponse getIndiaIndexByToday() { String INDEX_CODE = "TODAY_INDEX"; return RequestCacheUtils.cache("getIndiaIndexByToday.do", INDEX_CODE,6000, (string) -> { - return this.stockService.getIndexByBtoday(); - }); + try { + return this.stockService.getIndexByBtoday(); + } catch (Exception e) { + throw new RuntimeException(e); + } + }); } @RequestMapping({"getIndiaIndexByEttech.do"}) @ApiOperation(value = "印度--获取指定指数信息-Ettech", httpMethod = "GET")