From 8375eaed431fddab6f717c4698a9ddbfdb2694bf Mon Sep 17 00:00:00 2001 From: Achilles Date: Thu, 4 Jan 2024 15:04:43 +0800 Subject: [PATCH 01/27] =?UTF-8?q?=E8=82=A1=E7=A5=A8=E8=AF=A6=E6=83=85?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E6=8F=90=E4=BE=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../infrastructure/job/MoneyScraper.java | 2 +- .../stock/market/web/MoneyApiController.java | 147 ++++++++++++++++++ 2 files changed, 148 insertions(+), 1 deletion(-) create mode 100644 src/main/java/cn/stock/market/web/MoneyApiController.java diff --git a/src/main/java/cn/stock/market/infrastructure/job/MoneyScraper.java b/src/main/java/cn/stock/market/infrastructure/job/MoneyScraper.java index ef38799..ebb3e50 100644 --- a/src/main/java/cn/stock/market/infrastructure/job/MoneyScraper.java +++ b/src/main/java/cn/stock/market/infrastructure/job/MoneyScraper.java @@ -180,7 +180,7 @@ public class MoneyScraper { } } catch (IOException e) { retryAttempts++; - log.error(Thread.currentThread().getName()+",Exception during HTTP request: " +retryAttempts); + log.error(Thread.currentThread().getName()+",Exception during HTTP request time: " +retryAttempts); } } diff --git a/src/main/java/cn/stock/market/web/MoneyApiController.java b/src/main/java/cn/stock/market/web/MoneyApiController.java new file mode 100644 index 0000000..17101c6 --- /dev/null +++ b/src/main/java/cn/stock/market/web/MoneyApiController.java @@ -0,0 +1,147 @@ +package cn.stock.market.web; + +import com.alibaba.fastjson.JSONObject; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiResponse; +import io.swagger.annotations.ApiResponses; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpMethod; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.client.RestTemplate; + +/** + * @author gs + * @date 2024/1/4 10:25 + */ +@RestController +@Api(value = "/MoneyApiController", tags = "money股票行情") +public class MoneyApiController { + + + @Autowired + private RestTemplate restTemplate; + + + @ApiOperation(value = "股票详情信息",httpMethod = "GET") + @ApiImplicitParams({ + @ApiImplicitParam(name="stockType",value = "BSE或者NSE"), + @ApiImplicitParam(name="symbol",value = "scId值"), + }) + @ApiResponses(value = { + @ApiResponse(code = 200, message = "" + + "HN: 公司的名称(हिन्दी में - Hindi)\n" + + "HP: 当前股价\n" + + "DISPID: 行业/部门代码\n" + + "cl5yPerChange: 过去5年的百分比变化\n" + + "BIDQ 和 BIDP: 买入报价和数量\n" + + "newSubsector: 新的子部门\n" + + "cl1mDt: 过去1个月的数据日期\n" + + "P_C: 市盈率\n" + + "YR: 年份\n" + + "cl2yVal: 过去2年的数值\n" + + "SC_SUBSEC: 子部门\n" + + "sc_ttm_cons 和 SC_TTM: 市盈率\n" + + "clYtdVal: 本年度截至目前的数值\n" + + "cl6mDt: 过去6个月的数据日期\n" + + "cl1wVal: 过去1周的数值\n" + + "lastupd_epoch: 最后更新时间的 Epoch 时间戳\n" + + "cl1mChange: 过去1个月的数值变化\n" + + "cl3mChange: 过去3个月的数值变化\n" + + "pricecurrent: 当前股价\n" + + "150DayAvg: 过去150天的平均值\n" + + "clYtdChange: 本年度截至目前的数值变化\n" + + "tot_buy_qty: 总买入数量\n" + + "clYtdDt: 本年度截至目前的数据日期\n" + + "Group: 组别\n" + + "ACCOD: 账户代码\n" + + "cl3yDt: 过去3年的数据日期\n" + + "LTHDate: 最高值的日期\n" + + "cl3mDt: 过去3个月的数据日期\n" + + "DYCONS: 息率\n" + + "NSEID: NSE 股票代码\n" + + "52H: 52周最高价\n" + + "AvgDelVolPer_8day: 过去8天的平均成交量百分比\n" + + "52L: 52周最低价\n" + + "BV: 每股净值\n" + + "MKTLOT: 市场手数\n" + + "DVolAvg20: 过去20天的平均成交量\n" + + "OFFERP 和 OFFERQ: 卖出报价和数量\n" + + "cl6mVal: 过去6个月的数值\n" + + "AvgVolQtyDel_20day: 过去20天的平均成交量数量\n" + + "cl1mVal: 过去1个月的数值\n" + + "PBCONS: 市净率\n" + + "5DayAvg: 过去5天的平均值\n" + + "AvgDelVolPer_3day: 过去3天的平均成交量百分比\n" + + "sessionId: 会话ID\n" + + "TID: 交易ID\n" + + "SHRS: 股本总额\n" + + "50DayAvg: 过去50天的平均值\n" + + "cl3yChange: 过去3年的数值变化\n" + + "im_scid: 未知字段\n" + + "DVolAvg10: 过去10天的平均成交量\n" + + "AvgVolQtyTraded_20day: 过去20天的平均成交量交易数量\n" + + "symbol: 股票符号\n" + + "LP: 最后价格\n" + + "lower_circuit_limit 和 upper_circuit_limit: 跌停价和涨停价\n" + + "ty: 未知字段\n" + + "cl1wDt: 过去1周的数据日期\n" + + "cl5yDt: 过去5年的数据日期\n" + + "IND_PE: 行业市盈率\n" + + "cl1yPerChange: 过去1年的百分比变化\n" + + "cl3yVal: 过去3年的数值\n" + + "52HDate: 52周最高价的日期\n" + + "OPN: 开盘价\n" + + "cl1mPerChange: 过去1个月的百分比变化\n" + + "DTTIME: 交易时间\n" + + "SC_FULLNM: 完整的行业/部门名称\n" + + "DVolAvg5: 过去5天的平均成交量\n" + + "LTLDate: 最低值的日期\n" + + "DY: 息率\n" + + "etf: 是否为ETF\n" + + "clYtdPerChange: 本年度截至目前的百分比变化\n" + + "isinid: ISIN 编号\n" + + "cl2yDt: 过去2年的数据日期\n" + + "slug: 股票的 slug\n" + + "AvgDelVolPer_20day: 过去20天的平均成交量百分比\n" + + "cl5yVal: 过去5年的数值\n" + + "market_state: 市场状态\n" + + "cl2yPerChange: 过去2年的百分比变化\n" + + "pricechange: 价格变化\n" + + "AvgDelVolPer_5day: 过去5天的平均成交量百分比\n" + + "200DayAvg: 过去200天的平均值\n" + + "VOL: 成交量\n" + + "pricepercentchange: 价格百分比变化\n" + + "exchange: 交易所\n" + + "sc_mapindex: 行业/部门地图索引\n" + + "DVolAvg30: 过去30天的平均成交量\n" + + "cl1wChange: 过去1周的数值变化\n" + + "AVGP: 平均价格\n" + + "LTH: 最高价\n" + + "cl3yPerChange: 过去3年的百分比变化\n" + + "LTL: 最低价\n" + + "cl3mPerChange: 过去3个月的百分比变化\n" + + "PECONS: 市盈率\n" + + "priceprevclose: 前一交易日的收盘价\n" + + "30DayAvg: 过去30天的平均", response = JSONObject.class), + }) + @GetMapping("/api/market/money/getStockDetail") + @ResponseBody + public JSONObject forwardRequest(@RequestParam String stockType, @RequestParam String symbol) { + String url = String.format("https://priceapi.moneycontrol.com/pricefeed/%s/equitycash/%s",stockType,symbol); + ResponseEntity responseEntity = restTemplate.exchange(url, HttpMethod.GET, null, String.class); + if (responseEntity.getStatusCode().value()==200&&responseEntity.getBody()!=null){ + return JSONObject.parseObject(responseEntity.getBody()); + } + return null; + } + +} From b62d6e18c85837649bb3fb6063e92a06ab433ba2 Mon Sep 17 00:00:00 2001 From: Achilles Date: Thu, 4 Jan 2024 15:20:43 +0800 Subject: [PATCH 02/27] =?UTF-8?q?=E8=82=A1=E7=A5=A8=E8=AF=A6=E6=83=85?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E6=8F=90=E4=BE=9B=E9=87=8D=E8=AF=95=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../stock/market/web/MoneyApiController.java | 24 +++++++++++++++---- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/src/main/java/cn/stock/market/web/MoneyApiController.java b/src/main/java/cn/stock/market/web/MoneyApiController.java index 17101c6..7c359d1 100644 --- a/src/main/java/cn/stock/market/web/MoneyApiController.java +++ b/src/main/java/cn/stock/market/web/MoneyApiController.java @@ -10,9 +10,7 @@ import io.swagger.annotations.ApiResponses; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpMethod; import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; @@ -137,9 +135,25 @@ public class MoneyApiController { @ResponseBody public JSONObject forwardRequest(@RequestParam String stockType, @RequestParam String symbol) { String url = String.format("https://priceapi.moneycontrol.com/pricefeed/%s/equitycash/%s",stockType,symbol); - ResponseEntity responseEntity = restTemplate.exchange(url, HttpMethod.GET, null, String.class); - if (responseEntity.getStatusCode().value()==200&&responseEntity.getBody()!=null){ - return JSONObject.parseObject(responseEntity.getBody()); + + // 设置重试次数 + int maxRetries = 3; + for (int retry = 1; retry <= maxRetries; retry++) { + ResponseEntity responseEntity = restTemplate.exchange(url, HttpMethod.GET, null, String.class); + + if (responseEntity.getStatusCode().value() == 200 && responseEntity.getBody() != null) { + return JSONObject.parseObject(responseEntity.getBody()); + } + + // 如果不是最后一次重试,则等待一段时间再进行下一次重试 + if (retry < maxRetries) { + try { + // 你可以根据需要调整等待的时间 + Thread.sleep(100); // 1秒钟 + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } } return null; } From 92f3d6f3dd47a2ed421113a01e83262306f780f7 Mon Sep 17 00:00:00 2001 From: Achilles Date: Sat, 6 Jan 2024 12:22:32 +0800 Subject: [PATCH 03/27] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E9=83=A8=E5=88=86?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/stock/market/MoneyStockSuggestDTO.java | 25 ++ .../stock/market/web/MoneyApiController.java | 385 +++++++++++++++++- 2 files changed, 403 insertions(+), 7 deletions(-) create mode 100644 src/main/java/cn/stock/market/MoneyStockSuggestDTO.java diff --git a/src/main/java/cn/stock/market/MoneyStockSuggestDTO.java b/src/main/java/cn/stock/market/MoneyStockSuggestDTO.java new file mode 100644 index 0000000..5298486 --- /dev/null +++ b/src/main/java/cn/stock/market/MoneyStockSuggestDTO.java @@ -0,0 +1,25 @@ +package cn.stock.market; + +import lombok.Data; + +/** + * @author gs + * @date 2024/1/6 11:12 + */ +@Data +public class MoneyStockSuggestDTO { + + private String stockType; + private String stockName; + private String stockUrl; + private String highPrice; + private String lowPrice; + private String lastPrice; + private String prevClosePrice; + private String change; + private String changePercent; + + private String scId; + + +} diff --git a/src/main/java/cn/stock/market/web/MoneyApiController.java b/src/main/java/cn/stock/market/web/MoneyApiController.java index 7c359d1..b253b16 100644 --- a/src/main/java/cn/stock/market/web/MoneyApiController.java +++ b/src/main/java/cn/stock/market/web/MoneyApiController.java @@ -1,12 +1,23 @@ package cn.stock.market.web; +import cn.stock.market.MoneyStockSuggestDTO; +import cn.stock.market.domain.basic.entity.MoneyStock; +import cn.stock.market.domain.basic.repository.MoneyStockRepository; +import cn.stock.market.infrastructure.db.po.QMoneyStockPO; import com.alibaba.fastjson.JSONObject; +import com.google.common.collect.Lists; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpMethod; import org.springframework.http.ResponseEntity; @@ -16,18 +27,27 @@ import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; +import java.io.IOException; +import java.util.Collection; +import java.util.List; +import java.util.stream.Collectors; + /** * @author gs * @date 2024/1/4 10:25 */ @RestController @Api(value = "/MoneyApiController", tags = "money股票行情") +@Slf4j public class MoneyApiController { @Autowired private RestTemplate restTemplate; + @Autowired + private MoneyStockRepository moneyStockRepository; + @ApiOperation(value = "股票详情信息",httpMethod = "GET") @ApiImplicitParams({ @@ -133,23 +153,26 @@ public class MoneyApiController { }) @GetMapping("/api/market/money/getStockDetail") @ResponseBody - public JSONObject forwardRequest(@RequestParam String stockType, @RequestParam String symbol) { + public JSONObject getStockDetail(@RequestParam String stockType, @RequestParam String symbol) { String url = String.format("https://priceapi.moneycontrol.com/pricefeed/%s/equitycash/%s",stockType,symbol); // 设置重试次数 int maxRetries = 3; for (int retry = 1; retry <= maxRetries; retry++) { - ResponseEntity responseEntity = restTemplate.exchange(url, HttpMethod.GET, null, String.class); + try { + ResponseEntity responseEntity = restTemplate.exchange(url, HttpMethod.GET, null, String.class); - if (responseEntity.getStatusCode().value() == 200 && responseEntity.getBody() != null) { - return JSONObject.parseObject(responseEntity.getBody()); + if (responseEntity.getStatusCode().value() == 200 && responseEntity.getBody() != null) { + return JSONObject.parseObject(responseEntity.getBody()); + } + + } catch (Exception e) { } - // 如果不是最后一次重试,则等待一段时间再进行下一次重试 if (retry < maxRetries) { try { - // 你可以根据需要调整等待的时间 - Thread.sleep(100); // 1秒钟 + // 1秒钟 + Thread.sleep(100); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } @@ -158,4 +181,352 @@ public class MoneyApiController { return null; } + + + private static void nseActives() { + String url = "https://www.moneycontrol.com/stocks/marketstats/nse-mostactive-stocks/nifty-50-9/"; + try { + Document doc = Jsoup.connect(url).get(); + int size = doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div.bsr_table.hist_tbl_hm > table > tbody > tr").size(); + System.err.println(size); + for (int i =1;i<=size;i++){ + Element company_a = doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div.bsr_table.hist_tbl_hm > table > tbody > tr:nth-child("+i+") > td.PR > span > a").first(); + if (company_a != null) { + String stockUrl = company_a.attr("href"); + String stockName = company_a.text(); + log.info(stockName); + log.info(stockUrl); + } + + String highPrice = getTextOrEmpty(doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div.bsr_table.hist_tbl_hm > table > tbody > tr:nth-child("+i+") > td:nth-child(2)").first()); + log.info(highPrice); + + String lowPrice = getTextOrEmpty(doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div.bsr_table.hist_tbl_hm > table > tbody > tr:nth-child(" + i + ") > td:nth-child(3)").first()); + log.info(lowPrice); + + String lastPrice = getTextOrEmpty(doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div.bsr_table.hist_tbl_hm > table > tbody > tr:nth-child(" + i + ") > td:nth-child(4)").first()); + log.info(lastPrice); + + String change = getTextOrEmpty(doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div.bsr_table.hist_tbl_hm > table > tbody > tr:nth-child(" + i + ") > td:nth-child(5)").first()); + log.info(change); + + String changePercent = getTextOrEmpty(doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div.bsr_table.hist_tbl_hm > table > tbody > tr:nth-child(" + i + ") > td:nth-child(6)").first()); + log.info(changePercent); + + log.info("---------------------------------------------" + i); + } + + } catch (IOException e) { + e.printStackTrace(); + } + } + + private static void bseActives() { + String url = "https://www.moneycontrol.com/stocks/marketstats/bsemact1/index.php"; + try { + Document doc = Jsoup.connect(url).get(); + int size = doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div > div.bsr_table.hist_tbl_hm > table > tbody > tr").size(); + System.err.println(size); + for (int i =1;i<=size;i++){ + Element company_a = doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div > div.bsr_table.hist_tbl_hm > table > tbody > tr:nth-child("+i+") > td.PR > span > a").first(); + if (company_a != null) { + String stockUrl = company_a.attr("href"); + String stockName = company_a.text(); + log.info(stockName); + log.info(stockUrl); + } + + String highPrice = getTextOrEmpty(doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div > div.bsr_table.hist_tbl_hm > table > tbody > tr:nth-child(" + i + ") > td:nth-child(2)").first()); + log.info(highPrice); + + String lowPrice = getTextOrEmpty(doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div > div.bsr_table.hist_tbl_hm > table > tbody > tr:nth-child(" + i + ") > td:nth-child(3)").first()); + log.info(lowPrice); + + String lastPrice = getTextOrEmpty(doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div > div.bsr_table.hist_tbl_hm > table > tbody > tr:nth-child(" + i + ") > td:nth-child(4)").first()); + log.info(lastPrice); + + String prevClosePrice = getTextOrEmpty(doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div > div.bsr_table.hist_tbl_hm > table > tbody > tr:nth-child(" + i + ") > td:nth-child(5)").first()); + log.info(prevClosePrice); + + String change = getTextOrEmpty(doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div > div.bsr_table.hist_tbl_hm > table > tbody > tr:nth-child(" + i + ") > td:nth-child(6)").first()); + log.info(change); + + String changePercent = getTextOrEmpty(doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div > div.bsr_table.hist_tbl_hm > table > tbody > tr:nth-child(" + i + ") > td:nth-child(7)").first()); + log.info(changePercent); + + log.info("---------------------------------------------" + i); + } + + } catch (IOException e) { + e.printStackTrace(); + } + } + + private static List bseGainer() { + String url = "https://www.moneycontrol.com/stocks/marketstats/bse-gainer/sensex_4/"; + List list = Lists.newArrayList(); + try { + Document doc = Jsoup.connect(url).get(); + int size = doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div > div.bsr_table.hist_tbl_hm > table > tbody > tr").size(); + for (int i =1;i<=size;i++){ + Element company_a = doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div > div.bsr_table.hist_tbl_hm > table > tbody > tr:nth-child("+i+") > td.PR > span > a").first(); + MoneyStockSuggestDTO dto = new MoneyStockSuggestDTO(); + if (company_a != null) { + String stockUrl = company_a.attr("href"); + String stockName = company_a.text(); + log.info(stockName); + log.info(stockUrl); + dto.setStockName(stockName); + dto.setStockUrl(stockUrl); + } + + String highPrice = getTextOrEmpty(doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div > div.bsr_table.hist_tbl_hm > table > tbody > tr:nth-child(" + i + ") > td:nth-child(2)").first()); + dto.setHighPrice(highPrice); + + String lowPrice = getTextOrEmpty(doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div > div.bsr_table.hist_tbl_hm > table > tbody > tr:nth-child(" + i + ") > td:nth-child(3)").first()); + dto.setLowPrice(lowPrice); + + String lastPrice = getTextOrEmpty(doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div > div.bsr_table.hist_tbl_hm > table > tbody > tr:nth-child(" + i + ") > td:nth-child(4)").first()); + dto.setLastPrice(lastPrice); + + String prevClosePrice = getTextOrEmpty(doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div > div.bsr_table.hist_tbl_hm > table > tbody > tr:nth-child(" + i + ") > td:nth-child(5)").first()); + dto.setPrevClosePrice(prevClosePrice); + + String change = getTextOrEmpty(doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div > div.bsr_table.hist_tbl_hm > table > tbody > tr:nth-child(" + i + ") > td:nth-child(6)").first()); + dto.setChange(change); + + String changePercent = getTextOrEmpty(doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div > div.bsr_table.hist_tbl_hm > table > tbody > tr:nth-child(" + i + ") > td:nth-child(7)").first()); + dto.setChangePercent(changePercent); + + dto.setStockType("bse"); + list.add(dto); + log.info("---------------------------------------------" + i); + } + + } catch (IOException e) { + e.printStackTrace(); + } + return list; + } + + private static List nseGainer() { + String url = "https://www.moneycontrol.com/stocks/marketstats/nsegainer/index.php"; + List list = Lists.newArrayList(); + try { + Document doc = Jsoup.connect(url).get(); + int size = doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div > div.bsr_table.hist_tbl_hm > table > tbody > tr").size(); + for (int i =1;i<=size;i++){ + MoneyStockSuggestDTO dto = new MoneyStockSuggestDTO(); + Element company_a = doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div > div.bsr_table.hist_tbl_hm > table > tbody > tr:nth-child("+i+") > td.PR > span > h3 > a").first(); + if (company_a != null) { + String stockUrl = company_a.attr("href"); + String stockName = company_a.text(); + dto.setStockUrl(stockUrl); + dto.setStockName(stockName); + } + + String highPrice = getTextOrEmpty(doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div > div.bsr_table.hist_tbl_hm > table > tbody > tr:nth-child(" + i + ") > td:nth-child(2)").first()); + dto.setHighPrice(highPrice); + + String lowPrice = getTextOrEmpty(doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div > div.bsr_table.hist_tbl_hm > table > tbody > tr:nth-child(" + i + ") > td:nth-child(3)").first()); + dto.setLowPrice(lowPrice); + + String lastPrice = getTextOrEmpty(doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div > div.bsr_table.hist_tbl_hm > table > tbody > tr:nth-child(" + i + ") > td:nth-child(4)").first()); + dto.setLastPrice(lastPrice); + + String prevClosePrice = getTextOrEmpty(doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div > div.bsr_table.hist_tbl_hm > table > tbody > tr:nth-child(" + i + ") > td:nth-child(5)").first()); + dto.setPrevClosePrice(prevClosePrice); + + String change = getTextOrEmpty(doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div > div.bsr_table.hist_tbl_hm > table > tbody > tr:nth-child(" + i + ") > td:nth-child(6)").first()); + dto.setChange(change); + + String changePercent = getTextOrEmpty(doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div > div.bsr_table.hist_tbl_hm > table > tbody > tr:nth-child(" + i + ") > td:nth-child(7)").first()); + dto.setChangePercent(changePercent); + dto.setStockType("nse"); + list.add(dto); + } + + } catch (IOException e) { + e.printStackTrace(); + } + return list; + } + + private static List nseTopLoser() { + String url = "https://www.moneycontrol.com/stocks/marketstats/nseloser/index.php"; + List list = Lists.newArrayList(); + + try { + Document doc = Jsoup.connect(url).get(); + int size = doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div > div.bsr_table.hist_tbl_hm > table > tbody > tr").size(); + for (int i =1;i<=size;i++){ + MoneyStockSuggestDTO dto = new MoneyStockSuggestDTO(); + Element company_a = doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div > div.bsr_table.hist_tbl_hm > table > tbody > tr:nth-child("+i+") > td.PR > span > h3 > a").first(); + if (company_a != null) { + String stockUrl = company_a.attr("href"); + String stockName = company_a.text(); + dto.setStockUrl(stockUrl); + dto.setStockName(stockName); + } + + String highPrice = getTextOrEmpty(doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div > div.bsr_table.hist_tbl_hm > table > tbody > tr:nth-child(" + i + ") > td:nth-child(2)").first()); + dto.setHighPrice(highPrice); + String lowPrice = getTextOrEmpty(doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div > div.bsr_table.hist_tbl_hm > table > tbody > tr:nth-child(" + i + ") > td:nth-child(3)").first()); + dto.setLowPrice(lowPrice); + String lastPrice = getTextOrEmpty(doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div > div.bsr_table.hist_tbl_hm > table > tbody > tr:nth-child(" + i + ") > td:nth-child(4)").first()); + dto.setLastPrice(lastPrice); + + String prevClosePrice = getTextOrEmpty(doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div > div.bsr_table.hist_tbl_hm > table > tbody > tr:nth-child(" + i + ") > td:nth-child(5)").first()); + dto.setPrevClosePrice(prevClosePrice); + + String change = getTextOrEmpty(doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div > div.bsr_table.hist_tbl_hm > table > tbody > tr:nth-child(" + i + ") > td:nth-child(6)").first()); + dto.setChange(change); + + String changePercent = getTextOrEmpty(doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div > div.bsr_table.hist_tbl_hm > table > tbody > tr:nth-child(" + i + ") > td:nth-child(7)").first()); + dto.setChangePercent(changePercent); + dto.setStockType("nse"); + list.add(dto); + log.info("---------------------------------------------" + i); + } + + } catch (IOException e) { + e.printStackTrace(); + } + return list; + } + + private static List bseTopLoser() { + String url = "https://www.moneycontrol.com/stocks/marketstats/bse-loser/sensex_4/"; + List list = Lists.newArrayList(); + + try { + Document doc = Jsoup.connect(url).get(); + int size = doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div > div.bsr_table.hist_tbl_hm > table > tbody > tr").size(); + for (int i =1;i<=size;i++){ + Element company_a = doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div > div.bsr_table.hist_tbl_hm > table > tbody > tr:nth-child(" + i + ") > td.PR > span > a").first(); + MoneyStockSuggestDTO dto = new MoneyStockSuggestDTO(); + if (company_a != null) { + String stockUrl = company_a.attr("href"); + String stockName = company_a.text(); + dto.setStockName(stockName); + dto.setStockUrl(stockUrl); + + } + + String highPrice = getTextOrEmpty(doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div > div.bsr_table.hist_tbl_hm > table > tbody > tr:nth-child(" + i + ") > td:nth-child(2)").first()); + dto.setHighPrice(highPrice); + + String lowPrice = getTextOrEmpty(doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div > div.bsr_table.hist_tbl_hm > table > tbody > tr:nth-child(" + i + ") > td:nth-child(3)").first()); + dto.setLowPrice(lowPrice); + + String lastPrice = getTextOrEmpty(doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div > div.bsr_table.hist_tbl_hm > table > tbody > tr:nth-child(" + i + ") > td:nth-child(4)").first()); + dto.setLastPrice(lastPrice); + + String prevClosePrice = getTextOrEmpty(doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div > div.bsr_table.hist_tbl_hm > table > tbody > tr:nth-child(" + i + ") > td:nth-child(5)").first()); + dto.setPrevClosePrice(prevClosePrice); + + String change = getTextOrEmpty(doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div > div.bsr_table.hist_tbl_hm > table > tbody > tr:nth-child(" + i + ") > td:nth-child(6)").first()); + dto.setChange(change); + + String changePercent = getTextOrEmpty(doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div > div.bsr_table.hist_tbl_hm > table > tbody > tr:nth-child(" + i + ") > td:nth-child(7)").first()); + dto.setChangePercent(changePercent); + list.add(dto); + log.info("---------------------------------------------" + i); + } + + } catch (IOException e) { + e.printStackTrace(); + } + return list; + } + + // 辅助方法,获取元素的文本或返回空字符串 + private static String getTextOrEmpty(Element element) { + return element != null ? element.text() : ""; + } + + + + + @ApiOperation(value = "股票推荐TopGainer",httpMethod = "GET") + @ApiImplicitParams({ + @ApiImplicitParam(name="stockType",value = "BSE或者NSE"), + }) + @ApiResponses(value = { + @ApiResponse(code = 200, message = "" + + "股票推荐相关: top gainer", response = JSONObject.class), + }) + @GetMapping("/api/market/money/getTopGainer") + @ResponseBody + public List getTopGainer(@RequestParam String stockType) { + List moneyStockSuggestDTOS = null; + if(StringUtils.equals(stockType,"nse")){ + moneyStockSuggestDTOS = nseGainer(); + }else if(StringUtils.equals(stockType,"bse")){ + moneyStockSuggestDTOS = bseGainer(); + } + if(CollectionUtils.isNotEmpty(moneyStockSuggestDTOS)){ + moneyStockSuggestDTOS.stream().forEach(f-> + f.getStockUrl().replaceAll("(? selfUlrList = moneyStockSuggestDTOS.stream().map(MoneyStockSuggestDTO::getStockUrl).collect(Collectors.toList()); + if(CollectionUtils.isNotEmpty(selfUlrList)){ + List all = moneyStockRepository.findAll(QMoneyStockPO.moneyStockPO.selfUrl.in(selfUlrList)); + if(CollectionUtils.isNotEmpty(all)){ + moneyStockSuggestDTOS.stream().filter(f->all.stream().anyMatch(s->s.getSelfUrl().equals(f.getStockUrl()))) + .forEach(f->f.setScId(all.stream().filter(s->s.getSelfUrl().equals(f.getStockUrl())).findFirst().orElse(null).getMoneyScId())); + } + } + } + return moneyStockSuggestDTOS; + } + + + @ApiOperation(value = "股票推荐TopLoser",httpMethod = "GET") + @ApiImplicitParams({ + @ApiImplicitParam(name="stockType",value = "BSE或者NSE"), + }) + @ApiResponses(value = { + @ApiResponse(code = 200, message = "" + + "股票推荐相关: top gainer", response = JSONObject.class), + }) + @GetMapping("/api/market/money/getTopLoser") + @ResponseBody + public List getTopLoser(@RequestParam String stockType) { + List moneyStockSuggestDTOS = null; + if(StringUtils.equals(stockType,"nse")){ + moneyStockSuggestDTOS = nseTopLoser(); + }else if(StringUtils.equals(stockType,"bse")){ + moneyStockSuggestDTOS = bseTopLoser(); + } + if (CollectionUtils.isNotEmpty(moneyStockSuggestDTOS)){ + moneyStockSuggestDTOS.stream().forEach(f-> + f.getStockUrl().replaceAll("(? selfUlrList = moneyStockSuggestDTOS.stream().map(MoneyStockSuggestDTO::getStockUrl).collect(Collectors.toList()); + if(CollectionUtils.isNotEmpty(selfUlrList)){ + List all = moneyStockRepository.findAll(QMoneyStockPO.moneyStockPO.selfUrl.in(selfUlrList)); + if(CollectionUtils.isNotEmpty(all)){ + moneyStockSuggestDTOS.stream().filter(f->all.stream().anyMatch(s->s.getSelfUrl().equals(f.getStockUrl()))) + .forEach(f->f.setScId(all.stream().filter(s->s.getSelfUrl().equals(f.getStockUrl())).findFirst().orElse(null).getMoneyScId())); + } + } + } + + return moneyStockSuggestDTOS; + } + + + + + + public static void main(String[] args) { + nseGainer(); + nseActives(); + nseTopLoser(); + + bseActives(); + bseGainer(); + bseTopLoser(); + } + } From b762b366a5015ab6e21782481b9972af4e98edd8 Mon Sep 17 00:00:00 2001 From: Achilles Date: Sat, 6 Jan 2024 12:35:43 +0800 Subject: [PATCH 04/27] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E9=83=A8=E5=88=86?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../stock/market/web/MoneyApiController.java | 85 ++++++++++++++----- 1 file changed, 65 insertions(+), 20 deletions(-) diff --git a/src/main/java/cn/stock/market/web/MoneyApiController.java b/src/main/java/cn/stock/market/web/MoneyApiController.java index b253b16..31abf28 100644 --- a/src/main/java/cn/stock/market/web/MoneyApiController.java +++ b/src/main/java/cn/stock/market/web/MoneyApiController.java @@ -28,6 +28,7 @@ import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; import java.io.IOException; +import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.stream.Collectors; @@ -183,83 +184,93 @@ public class MoneyApiController { - private static void nseActives() { + private static List nseActives() { + List list = new ArrayList<>(); String url = "https://www.moneycontrol.com/stocks/marketstats/nse-mostactive-stocks/nifty-50-9/"; try { Document doc = Jsoup.connect(url).get(); int size = doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div.bsr_table.hist_tbl_hm > table > tbody > tr").size(); - System.err.println(size); for (int i =1;i<=size;i++){ + MoneyStockSuggestDTO dto = new MoneyStockSuggestDTO(); Element company_a = doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div.bsr_table.hist_tbl_hm > table > tbody > tr:nth-child("+i+") > td.PR > span > a").first(); if (company_a != null) { String stockUrl = company_a.attr("href"); String stockName = company_a.text(); - log.info(stockName); - log.info(stockUrl); + dto.setStockName(stockName); + dto.setStockUrl(stockUrl); } String highPrice = getTextOrEmpty(doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div.bsr_table.hist_tbl_hm > table > tbody > tr:nth-child("+i+") > td:nth-child(2)").first()); - log.info(highPrice); + dto.setHighPrice(highPrice); String lowPrice = getTextOrEmpty(doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div.bsr_table.hist_tbl_hm > table > tbody > tr:nth-child(" + i + ") > td:nth-child(3)").first()); - log.info(lowPrice); + dto.setLowPrice(lowPrice); String lastPrice = getTextOrEmpty(doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div.bsr_table.hist_tbl_hm > table > tbody > tr:nth-child(" + i + ") > td:nth-child(4)").first()); - log.info(lastPrice); + dto.setLastPrice(lastPrice); String change = getTextOrEmpty(doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div.bsr_table.hist_tbl_hm > table > tbody > tr:nth-child(" + i + ") > td:nth-child(5)").first()); - log.info(change); + dto.setChange(change); String changePercent = getTextOrEmpty(doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div.bsr_table.hist_tbl_hm > table > tbody > tr:nth-child(" + i + ") > td:nth-child(6)").first()); - log.info(changePercent); + dto.setChangePercent(changePercent); + dto.setStockType("nse"); + + list.add(dto); log.info("---------------------------------------------" + i); } } catch (IOException e) { e.printStackTrace(); } + return list; } - private static void bseActives() { + private static List bseActives() { + List list = new ArrayList<>(); + String url = "https://www.moneycontrol.com/stocks/marketstats/bsemact1/index.php"; try { Document doc = Jsoup.connect(url).get(); int size = doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div > div.bsr_table.hist_tbl_hm > table > tbody > tr").size(); System.err.println(size); for (int i =1;i<=size;i++){ + MoneyStockSuggestDTO dto = new MoneyStockSuggestDTO(); Element company_a = doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div > div.bsr_table.hist_tbl_hm > table > tbody > tr:nth-child("+i+") > td.PR > span > a").first(); if (company_a != null) { String stockUrl = company_a.attr("href"); String stockName = company_a.text(); - log.info(stockName); - log.info(stockUrl); + dto.setStockName(stockName); + dto.setStockUrl(stockUrl); } String highPrice = getTextOrEmpty(doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div > div.bsr_table.hist_tbl_hm > table > tbody > tr:nth-child(" + i + ") > td:nth-child(2)").first()); - log.info(highPrice); + dto.setHighPrice(highPrice); String lowPrice = getTextOrEmpty(doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div > div.bsr_table.hist_tbl_hm > table > tbody > tr:nth-child(" + i + ") > td:nth-child(3)").first()); - log.info(lowPrice); + dto.setLowPrice(lowPrice); String lastPrice = getTextOrEmpty(doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div > div.bsr_table.hist_tbl_hm > table > tbody > tr:nth-child(" + i + ") > td:nth-child(4)").first()); - log.info(lastPrice); + dto.setLastPrice(lastPrice); String prevClosePrice = getTextOrEmpty(doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div > div.bsr_table.hist_tbl_hm > table > tbody > tr:nth-child(" + i + ") > td:nth-child(5)").first()); - log.info(prevClosePrice); + dto.setPrevClosePrice(prevClosePrice); String change = getTextOrEmpty(doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div > div.bsr_table.hist_tbl_hm > table > tbody > tr:nth-child(" + i + ") > td:nth-child(6)").first()); - log.info(change); + dto.setChange(change); String changePercent = getTextOrEmpty(doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div > div.bsr_table.hist_tbl_hm > table > tbody > tr:nth-child(" + i + ") > td:nth-child(7)").first()); - log.info(changePercent); + dto.setChangePercent(changePercent); + list.add(dto); log.info("---------------------------------------------" + i); } } catch (IOException e) { - e.printStackTrace(); + log.error("occur Exception",e); } + return list; } private static List bseGainer() { @@ -488,7 +499,7 @@ public class MoneyApiController { }) @ApiResponses(value = { @ApiResponse(code = 200, message = "" + - "股票推荐相关: top gainer", response = JSONObject.class), + "股票推荐相关: TopLoser", response = JSONObject.class), }) @GetMapping("/api/market/money/getTopLoser") @ResponseBody @@ -518,6 +529,40 @@ public class MoneyApiController { + @ApiOperation(value = "股票推荐TopActive",httpMethod = "GET") + @ApiImplicitParams({ + @ApiImplicitParam(name="stockType",value = "BSE或者NSE"), + }) + @ApiResponses(value = { + @ApiResponse(code = 200, message = "" + + "股票推荐相关: top active", response = JSONObject.class), + }) + @GetMapping("/api/market/money/getTopActive") + @ResponseBody + public List getTopActive(@RequestParam String stockType) { + List moneyStockSuggestDTOS = null; + if(StringUtils.equals(stockType,"nse")){ + moneyStockSuggestDTOS = nseActives(); + }else if(StringUtils.equals(stockType,"bse")){ + moneyStockSuggestDTOS = bseActives(); + } + if (CollectionUtils.isNotEmpty(moneyStockSuggestDTOS)){ + moneyStockSuggestDTOS.stream().forEach(f-> + f.getStockUrl().replaceAll("(? selfUlrList = moneyStockSuggestDTOS.stream().map(MoneyStockSuggestDTO::getStockUrl).collect(Collectors.toList()); + if(CollectionUtils.isNotEmpty(selfUlrList)){ + List all = moneyStockRepository.findAll(QMoneyStockPO.moneyStockPO.selfUrl.in(selfUlrList)); + if(CollectionUtils.isNotEmpty(all)){ + moneyStockSuggestDTOS.stream().filter(f->all.stream().anyMatch(s->s.getSelfUrl().equals(f.getStockUrl()))) + .forEach(f->f.setScId(all.stream().filter(s->s.getSelfUrl().equals(f.getStockUrl())).findFirst().orElse(null).getMoneyScId())); + } + } + } + + return moneyStockSuggestDTOS; + } + + public static void main(String[] args) { nseGainer(); From f0bd124afb1b814bdbb6eafa6daaf5c0d5f54be6 Mon Sep 17 00:00:00 2001 From: Achilles Date: Sat, 6 Jan 2024 12:52:03 +0800 Subject: [PATCH 05/27] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E9=83=A8=E5=88=86?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../stock/market/web/MoneyApiController.java | 48 ++++++++++--------- 1 file changed, 25 insertions(+), 23 deletions(-) diff --git a/src/main/java/cn/stock/market/web/MoneyApiController.java b/src/main/java/cn/stock/market/web/MoneyApiController.java index 31abf28..d1ec100 100644 --- a/src/main/java/cn/stock/market/web/MoneyApiController.java +++ b/src/main/java/cn/stock/market/web/MoneyApiController.java @@ -285,8 +285,6 @@ public class MoneyApiController { if (company_a != null) { String stockUrl = company_a.attr("href"); String stockName = company_a.text(); - log.info(stockName); - log.info(stockUrl); dto.setStockName(stockName); dto.setStockUrl(stockUrl); } @@ -477,15 +475,12 @@ public class MoneyApiController { moneyStockSuggestDTOS = bseGainer(); } if(CollectionUtils.isNotEmpty(moneyStockSuggestDTOS)){ - moneyStockSuggestDTOS.stream().forEach(f-> - f.getStockUrl().replaceAll("(? selfUlrList = moneyStockSuggestDTOS.stream().map(MoneyStockSuggestDTO::getStockUrl).collect(Collectors.toList()); + List selfUlrList = moneyStockSuggestDTOS.stream().map(MoneyStockSuggestDTO::getStockName).collect(Collectors.toList()); if(CollectionUtils.isNotEmpty(selfUlrList)){ - List all = moneyStockRepository.findAll(QMoneyStockPO.moneyStockPO.selfUrl.in(selfUlrList)); + List all = moneyStockRepository.findAll(QMoneyStockPO.moneyStockPO.stockName.in(selfUlrList)); if(CollectionUtils.isNotEmpty(all)){ - moneyStockSuggestDTOS.stream().filter(f->all.stream().anyMatch(s->s.getSelfUrl().equals(f.getStockUrl()))) - .forEach(f->f.setScId(all.stream().filter(s->s.getSelfUrl().equals(f.getStockUrl())).findFirst().orElse(null).getMoneyScId())); + moneyStockSuggestDTOS.stream().filter(f->all.stream().anyMatch(s->s.getStockName().equals(f.getStockName()))) + .forEach(f->f.setScId(all.stream().filter(s->s.getStockName().equals(f.getStockName())).findFirst().orElse(null).getMoneyScId())); } } } @@ -510,15 +505,13 @@ public class MoneyApiController { }else if(StringUtils.equals(stockType,"bse")){ moneyStockSuggestDTOS = bseTopLoser(); } - if (CollectionUtils.isNotEmpty(moneyStockSuggestDTOS)){ - moneyStockSuggestDTOS.stream().forEach(f-> - f.getStockUrl().replaceAll("(? selfUlrList = moneyStockSuggestDTOS.stream().map(MoneyStockSuggestDTO::getStockUrl).collect(Collectors.toList()); + if(CollectionUtils.isNotEmpty(moneyStockSuggestDTOS)){ + List selfUlrList = moneyStockSuggestDTOS.stream().map(MoneyStockSuggestDTO::getStockName).collect(Collectors.toList()); if(CollectionUtils.isNotEmpty(selfUlrList)){ - List all = moneyStockRepository.findAll(QMoneyStockPO.moneyStockPO.selfUrl.in(selfUlrList)); + List all = moneyStockRepository.findAll(QMoneyStockPO.moneyStockPO.stockName.in(selfUlrList)); if(CollectionUtils.isNotEmpty(all)){ - moneyStockSuggestDTOS.stream().filter(f->all.stream().anyMatch(s->s.getSelfUrl().equals(f.getStockUrl()))) - .forEach(f->f.setScId(all.stream().filter(s->s.getSelfUrl().equals(f.getStockUrl())).findFirst().orElse(null).getMoneyScId())); + moneyStockSuggestDTOS.stream().filter(f->all.stream().anyMatch(s->s.getStockName().equals(f.getStockName()))) + .forEach(f->f.setScId(all.stream().filter(s->s.getStockName().equals(f.getStockName())).findFirst().orElse(null).getMoneyScId())); } } } @@ -546,15 +539,13 @@ public class MoneyApiController { }else if(StringUtils.equals(stockType,"bse")){ moneyStockSuggestDTOS = bseActives(); } - if (CollectionUtils.isNotEmpty(moneyStockSuggestDTOS)){ - moneyStockSuggestDTOS.stream().forEach(f-> - f.getStockUrl().replaceAll("(? selfUlrList = moneyStockSuggestDTOS.stream().map(MoneyStockSuggestDTO::getStockUrl).collect(Collectors.toList()); + if(CollectionUtils.isNotEmpty(moneyStockSuggestDTOS)){ + List selfUlrList = moneyStockSuggestDTOS.stream().map(MoneyStockSuggestDTO::getStockName).collect(Collectors.toList()); if(CollectionUtils.isNotEmpty(selfUlrList)){ - List all = moneyStockRepository.findAll(QMoneyStockPO.moneyStockPO.selfUrl.in(selfUlrList)); + List all = moneyStockRepository.findAll(QMoneyStockPO.moneyStockPO.stockName.in(selfUlrList)); if(CollectionUtils.isNotEmpty(all)){ - moneyStockSuggestDTOS.stream().filter(f->all.stream().anyMatch(s->s.getSelfUrl().equals(f.getStockUrl()))) - .forEach(f->f.setScId(all.stream().filter(s->s.getSelfUrl().equals(f.getStockUrl())).findFirst().orElse(null).getMoneyScId())); + moneyStockSuggestDTOS.stream().filter(f->all.stream().anyMatch(s->s.getStockName().equals(f.getStockName()))) + .forEach(f->f.setScId(all.stream().filter(s->s.getStockName().equals(f.getStockName())).findFirst().orElse(null).getMoneyScId())); } } } @@ -563,6 +554,17 @@ public class MoneyApiController { } + private static String extractLastSegment(String url) { + if (url == null) { + return null; + } + int lastSlashIndex = url.lastIndexOf('/'); + if (lastSlashIndex != -1 && lastSlashIndex < url.length() - 1) { + return url.substring(lastSlashIndex + 1); + } + return url; // 如果没有斜杠,或者斜杠位于字符串的末尾,则返回原始字符串 + } + public static void main(String[] args) { nseGainer(); From bf81ef6a4463194eb71349163ab53b991fe85d61 Mon Sep 17 00:00:00 2001 From: Achilles Date: Sat, 6 Jan 2024 13:00:50 +0800 Subject: [PATCH 06/27] =?UTF-8?q?=E7=BB=A7=E7=BB=AD=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/stock/market/web/MoneyApiController.java | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/main/java/cn/stock/market/web/MoneyApiController.java b/src/main/java/cn/stock/market/web/MoneyApiController.java index d1ec100..76e06b1 100644 --- a/src/main/java/cn/stock/market/web/MoneyApiController.java +++ b/src/main/java/cn/stock/market/web/MoneyApiController.java @@ -242,7 +242,7 @@ public class MoneyApiController { String stockUrl = company_a.attr("href"); String stockName = company_a.text(); dto.setStockName(stockName); - dto.setStockUrl(stockUrl); + //dto.setStockUrl(stockUrl); } String highPrice = getTextOrEmpty(doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div > div.bsr_table.hist_tbl_hm > table > tbody > tr:nth-child(" + i + ") > td:nth-child(2)").first()); @@ -263,6 +263,7 @@ public class MoneyApiController { String changePercent = getTextOrEmpty(doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div > div.bsr_table.hist_tbl_hm > table > tbody > tr:nth-child(" + i + ") > td:nth-child(7)").first()); dto.setChangePercent(changePercent); + dto.setStockType("bse"); list.add(dto); log.info("---------------------------------------------" + i); } @@ -286,7 +287,7 @@ public class MoneyApiController { String stockUrl = company_a.attr("href"); String stockName = company_a.text(); dto.setStockName(stockName); - dto.setStockUrl(stockUrl); + // dto.setStockUrl(stockUrl); } String highPrice = getTextOrEmpty(doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div > div.bsr_table.hist_tbl_hm > table > tbody > tr:nth-child(" + i + ") > td:nth-child(2)").first()); @@ -330,7 +331,7 @@ public class MoneyApiController { if (company_a != null) { String stockUrl = company_a.attr("href"); String stockName = company_a.text(); - dto.setStockUrl(stockUrl); + //dto.setStockUrl(stockUrl); dto.setStockName(stockName); } @@ -374,7 +375,7 @@ public class MoneyApiController { if (company_a != null) { String stockUrl = company_a.attr("href"); String stockName = company_a.text(); - dto.setStockUrl(stockUrl); + // dto.setStockUrl(stockUrl); dto.setStockName(stockName); } @@ -418,7 +419,7 @@ public class MoneyApiController { String stockUrl = company_a.attr("href"); String stockName = company_a.text(); dto.setStockName(stockName); - dto.setStockUrl(stockUrl); + //dto.setStockUrl(stockUrl); } @@ -439,6 +440,7 @@ public class MoneyApiController { String changePercent = getTextOrEmpty(doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div > div.bsr_table.hist_tbl_hm > table > tbody > tr:nth-child(" + i + ") > td:nth-child(7)").first()); dto.setChangePercent(changePercent); + dto.setStockType("bse"); list.add(dto); log.info("---------------------------------------------" + i); } @@ -530,7 +532,7 @@ public class MoneyApiController { @ApiResponse(code = 200, message = "" + "股票推荐相关: top active", response = JSONObject.class), }) - @GetMapping("/api/market/money/getTopActive") + @GetMapping("/api/market/money/getTopActives") @ResponseBody public List getTopActive(@RequestParam String stockType) { List moneyStockSuggestDTOS = null; From c056454b1deb881b88a6f0b6a613f6e660a8cc48 Mon Sep 17 00:00:00 2001 From: Achilles Date: Sat, 6 Jan 2024 15:25:38 +0800 Subject: [PATCH 07/27] =?UTF-8?q?=E7=BB=A7=E7=BB=AD=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../infrastructure/db/po/QMoneyStockPO.java | 6 ++++++ .../assembler/MoneyStockAssembler.java | 2 +- .../basic/convert/MoneyStockConvert.java | 2 +- .../domain/basic/entity/MoneyStock.java | 2 +- .../basic/factory/MoneyStockFactory.java | 2 +- .../repository/MoneyStockRepository.java | 2 +- .../basic/service/MoneyStockService.java | 2 +- .../cn/stock/market/dto/MoneyStockDTO.java | 2 +- .../dto/command/MoneyStockCreateCommand.java | 14 ++++++++++++- .../dto/command/MoneyStockModifyCommand.java | 2 +- .../infrastructure/db/po/MoneyStockPO.java | 14 ++++++++++++- .../db/repo/MoneyStockRepo.java | 2 +- .../infrastructure/job/MoneyScraper.java | 21 +++++++++++++++++-- 13 files changed, 60 insertions(+), 13 deletions(-) diff --git a/src/main/generated/cn/stock/market/infrastructure/db/po/QMoneyStockPO.java b/src/main/generated/cn/stock/market/infrastructure/db/po/QMoneyStockPO.java index 6e9dc91..b719747 100644 --- a/src/main/generated/cn/stock/market/infrastructure/db/po/QMoneyStockPO.java +++ b/src/main/generated/cn/stock/market/infrastructure/db/po/QMoneyStockPO.java @@ -23,10 +23,16 @@ public class QMoneyStockPO extends EntityPathBase { public final NumberPath id = createNumber("id", Integer.class); + public final NumberPath isLock = createNumber("isLock", Integer.class); + + public final NumberPath isShow = createNumber("isShow", Integer.class); + public final StringPath moneyScId = createString("moneyScId"); public final DateTimePath saveTime = createDateTime("saveTime", java.util.Date.class); + public final StringPath selfDispId = createString("selfDispId"); + public final StringPath selfUrl = createString("selfUrl"); public final StringPath stockName = createString("stockName"); diff --git a/src/main/java/cn/stock/market/application/assembler/MoneyStockAssembler.java b/src/main/java/cn/stock/market/application/assembler/MoneyStockAssembler.java index e308295..3e000b7 100644 --- a/src/main/java/cn/stock/market/application/assembler/MoneyStockAssembler.java +++ b/src/main/java/cn/stock/market/application/assembler/MoneyStockAssembler.java @@ -12,7 +12,7 @@ import org.springframework.stereotype.Component; * * @author rplees * @email rplees.i.ly@gmail.com - * @created 2024/01/03 + * @created 2024/01/06 */ @Component @Lazy diff --git a/src/main/java/cn/stock/market/domain/basic/convert/MoneyStockConvert.java b/src/main/java/cn/stock/market/domain/basic/convert/MoneyStockConvert.java index b990c1e..3a0ad51 100644 --- a/src/main/java/cn/stock/market/domain/basic/convert/MoneyStockConvert.java +++ b/src/main/java/cn/stock/market/domain/basic/convert/MoneyStockConvert.java @@ -12,7 +12,7 @@ import org.springframework.stereotype.Component; * * @author rplees * @email rplees.i.ly@gmail.com - * @created 2024/01/03 + * @created 2024/01/06 */ @Component @Lazy diff --git a/src/main/java/cn/stock/market/domain/basic/entity/MoneyStock.java b/src/main/java/cn/stock/market/domain/basic/entity/MoneyStock.java index 77a6a25..fcd5321 100644 --- a/src/main/java/cn/stock/market/domain/basic/entity/MoneyStock.java +++ b/src/main/java/cn/stock/market/domain/basic/entity/MoneyStock.java @@ -13,7 +13,7 @@ import lombok.experimental.SuperBuilder; * * @author rplees * @email rplees.i.ly@gmail.com - * @created 2024/01/03 + * @created 2024/01/06 */ @Data @NoArgsConstructor diff --git a/src/main/java/cn/stock/market/domain/basic/factory/MoneyStockFactory.java b/src/main/java/cn/stock/market/domain/basic/factory/MoneyStockFactory.java index 8f9dfd2..764db2b 100644 --- a/src/main/java/cn/stock/market/domain/basic/factory/MoneyStockFactory.java +++ b/src/main/java/cn/stock/market/domain/basic/factory/MoneyStockFactory.java @@ -11,7 +11,7 @@ import org.springframework.stereotype.Component; * * @author rplees * @email rplees.i.ly@gmail.com - * @created 2024/01/03 + * @created 2024/01/06 */ @Component @Lazy diff --git a/src/main/java/cn/stock/market/domain/basic/repository/MoneyStockRepository.java b/src/main/java/cn/stock/market/domain/basic/repository/MoneyStockRepository.java index dd70882..5cda981 100644 --- a/src/main/java/cn/stock/market/domain/basic/repository/MoneyStockRepository.java +++ b/src/main/java/cn/stock/market/domain/basic/repository/MoneyStockRepository.java @@ -19,7 +19,7 @@ import org.springframework.stereotype.Repository; * * @author rplees * @email rplees.i.ly@gmail.com - * @created 2024/01/03 + * @created 2024/01/06 */ @Repository @RequiredArgsConstructor( diff --git a/src/main/java/cn/stock/market/domain/basic/service/MoneyStockService.java b/src/main/java/cn/stock/market/domain/basic/service/MoneyStockService.java index 0c3b1e7..b524393 100644 --- a/src/main/java/cn/stock/market/domain/basic/service/MoneyStockService.java +++ b/src/main/java/cn/stock/market/domain/basic/service/MoneyStockService.java @@ -12,7 +12,7 @@ import org.springframework.stereotype.Service; * * @author rplees * @email rplees.i.ly@gmail.com - * @created 2024/01/03 + * @created 2024/01/06 */ @Service @RequiredArgsConstructor( diff --git a/src/main/java/cn/stock/market/dto/MoneyStockDTO.java b/src/main/java/cn/stock/market/dto/MoneyStockDTO.java index 0cf6efb..1a6552c 100644 --- a/src/main/java/cn/stock/market/dto/MoneyStockDTO.java +++ b/src/main/java/cn/stock/market/dto/MoneyStockDTO.java @@ -11,7 +11,7 @@ import lombok.experimental.SuperBuilder; * * @author rplees * @email rplees.i.ly@gmail.com - * @created 2024/01/03 + * @created 2024/01/06 */ @Data @NoArgsConstructor diff --git a/src/main/java/cn/stock/market/dto/command/MoneyStockCreateCommand.java b/src/main/java/cn/stock/market/dto/command/MoneyStockCreateCommand.java index 3306f01..d867ada 100644 --- a/src/main/java/cn/stock/market/dto/command/MoneyStockCreateCommand.java +++ b/src/main/java/cn/stock/market/dto/command/MoneyStockCreateCommand.java @@ -12,7 +12,7 @@ import lombok.experimental.SuperBuilder; * * @author rplees * @email rplees.i.ly@gmail.com - * @created 2024/01/03 + * @created 2024/01/06 */ @Data @SuperBuilder @@ -34,6 +34,10 @@ public class MoneyStockCreateCommand { * money Control的id */ String moneyScId; + /** + * 展示表示 */ + String selfDispId; + /** * 自有self_url */ String selfUrl; @@ -45,4 +49,12 @@ public class MoneyStockCreateCommand { /** * 保存时间 */ Date saveTime; + + /** + * 是否锁定 0否 1是 */ + Integer isLock; + + /** + * 是否展示 0是 1否 */ + Integer isShow; } diff --git a/src/main/java/cn/stock/market/dto/command/MoneyStockModifyCommand.java b/src/main/java/cn/stock/market/dto/command/MoneyStockModifyCommand.java index f6c4816..ca74282 100644 --- a/src/main/java/cn/stock/market/dto/command/MoneyStockModifyCommand.java +++ b/src/main/java/cn/stock/market/dto/command/MoneyStockModifyCommand.java @@ -11,7 +11,7 @@ import lombok.experimental.SuperBuilder; * * @author rplees * @email rplees.i.ly@gmail.com - * @created 2024/01/03 + * @created 2024/01/06 */ @Data @SuperBuilder diff --git a/src/main/java/cn/stock/market/infrastructure/db/po/MoneyStockPO.java b/src/main/java/cn/stock/market/infrastructure/db/po/MoneyStockPO.java index 78d83b7..7b6d464 100644 --- a/src/main/java/cn/stock/market/infrastructure/db/po/MoneyStockPO.java +++ b/src/main/java/cn/stock/market/infrastructure/db/po/MoneyStockPO.java @@ -19,7 +19,7 @@ import org.hibernate.annotations.DynamicUpdate; * * @author rplees * @email rplees.i.ly@gmail.com - * @created 2024/01/03 + * @created 2024/01/06 */ @SuperBuilder @Data @@ -52,6 +52,10 @@ public class MoneyStockPO { * money Control的id */ String moneyScId; + /** + * 展示表示 */ + String selfDispId; + /** * 自有self_url */ String selfUrl; @@ -63,4 +67,12 @@ public class MoneyStockPO { /** * 保存时间 */ Date saveTime; + + /** + * 是否锁定 0否 1是 */ + Integer isLock; + + /** + * 是否展示 0是 1否 */ + Integer isShow; } diff --git a/src/main/java/cn/stock/market/infrastructure/db/repo/MoneyStockRepo.java b/src/main/java/cn/stock/market/infrastructure/db/repo/MoneyStockRepo.java index 883bc4e..eebe02a 100644 --- a/src/main/java/cn/stock/market/infrastructure/db/repo/MoneyStockRepo.java +++ b/src/main/java/cn/stock/market/infrastructure/db/repo/MoneyStockRepo.java @@ -9,7 +9,7 @@ import java.lang.Integer; * * @author rplees * @email rplees.i.ly@gmail.com - * @created 2024/01/03 + * @created 2024/01/06 */ public interface MoneyStockRepo extends GenericJpaRepository { } diff --git a/src/main/java/cn/stock/market/infrastructure/job/MoneyScraper.java b/src/main/java/cn/stock/market/infrastructure/job/MoneyScraper.java index ebb3e50..e4ba798 100644 --- a/src/main/java/cn/stock/market/infrastructure/job/MoneyScraper.java +++ b/src/main/java/cn/stock/market/infrastructure/job/MoneyScraper.java @@ -5,6 +5,7 @@ import cn.stock.market.domain.basic.entity.MoneyStock; import cn.stock.market.domain.basic.repository.MoneyStockRepository; import cn.stock.market.infrastructure.db.po.QMoneyStockPO; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; @@ -227,6 +228,7 @@ public class MoneyScraper { MoneyStock build = MoneyStock.builder().stockName(textContent).stockType(exchangeValue.toLowerCase(Locale.ROOT)) .detailUrl(String.format("https://priceapi.moneycontrol.com/pricefeed/%s/equitycash/%s", exchangeValue.toLowerCase(), companyCodeId)) .selfUrl(linkAttribute) + .selfDispId(extractDispId(linkAttribute)) .moneyScId(companyCodeId).saveTime(new Date()).build(); List all = moneyStockRepository.findAll(QMoneyStockPO.moneyStockPO.stockName.eq(textContent), QMoneyStockPO.moneyStockPO.stockType.eq(exchangeValue.toLowerCase(Locale.ROOT))); if(CollectionUtil.isEmpty(all)){ @@ -238,6 +240,7 @@ public class MoneyScraper { MoneyStock build = MoneyStock.builder().stockName(textContent) .detailUrl(String.format("https://priceapi.moneycontrol.com/pricefeed/%s/equitycash/%s", exchangeValue.toLowerCase(), companyCodeId)) .selfUrl(linkAttribute) + .selfDispId(extractDispId(linkAttribute)) .moneyScId(companyCodeId).saveTime(new Date()).build(); List all = moneyStockRepository.findAll(QMoneyStockPO.moneyStockPO.stockName.eq(textContent)); if(CollectionUtil.isEmpty(all)){ @@ -248,7 +251,7 @@ public class MoneyScraper { } else { log.info("stockName: " + textContent + ", self_link: " + linkAttribute + " has no current exchange types"); - MoneyStock build = MoneyStock.builder().stockName(textContent).selfUrl(linkAttribute) + MoneyStock build = MoneyStock.builder().stockName(textContent).selfUrl(linkAttribute) .selfDispId(extractDispId(linkAttribute)) .moneyScId(companyCodeId).saveTime(new Date()).build(); List all = moneyStockRepository.findAll(QMoneyStockPO.moneyStockPO.stockName.eq(textContent)); if(CollectionUtil.isEmpty(all)){ @@ -259,7 +262,7 @@ public class MoneyScraper { } else { log.info(Thread.currentThread().getName()+",stockName: " + textContent + ", self_link: " + linkAttribute + " cannot find corresponding stock id"); - MoneyStock build = MoneyStock.builder().stockName(textContent).selfUrl(linkAttribute) + MoneyStock build = MoneyStock.builder().stockName(textContent).selfUrl(linkAttribute) .selfDispId(extractDispId(linkAttribute)) .saveTime(new Date()).build(); List all = moneyStockRepository.findAll(QMoneyStockPO.moneyStockPO.stockName.eq(textContent)); if(CollectionUtil.isEmpty(all)){ @@ -270,7 +273,21 @@ public class MoneyScraper { } } + private static String extractDispId(String selfUrl) { + if(StringUtils.isBlank(selfUrl)||!StringUtils.startsWith(selfUrl,"http")){ + return null; + } + // 找到最后一个斜杠的位置 + int lastSlashIndex = selfUrl.lastIndexOf('/'); + // 如果找到了斜杠,就提取它之后的部分 + if (lastSlashIndex != -1 && lastSlashIndex < selfUrl.length() - 1) { + return selfUrl.substring(lastSlashIndex + 1); + } + + // 如果没有斜杠,或者斜杠位于字符串的末尾,则返回原始字符串 + return selfUrl; + } From ae1f1c3d46bd46f86602f8fac50d804f41a85b3d Mon Sep 17 00:00:00 2001 From: Achilles Date: Sat, 6 Jan 2024 17:11:46 +0800 Subject: [PATCH 08/27] =?UTF-8?q?=E7=BB=A7=E7=BB=AD=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/stock/market/MoneyStockSuggestDTO.java | 2 +- .../stock/market/web/MoneyApiController.java | 30 +++++++++++++++---- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/src/main/java/cn/stock/market/MoneyStockSuggestDTO.java b/src/main/java/cn/stock/market/MoneyStockSuggestDTO.java index 5298486..fcf019c 100644 --- a/src/main/java/cn/stock/market/MoneyStockSuggestDTO.java +++ b/src/main/java/cn/stock/market/MoneyStockSuggestDTO.java @@ -18,7 +18,7 @@ public class MoneyStockSuggestDTO { private String prevClosePrice; private String change; private String changePercent; - + private String dispId; private String scId; diff --git a/src/main/java/cn/stock/market/web/MoneyApiController.java b/src/main/java/cn/stock/market/web/MoneyApiController.java index 76e06b1..1c3558c 100644 --- a/src/main/java/cn/stock/market/web/MoneyApiController.java +++ b/src/main/java/cn/stock/market/web/MoneyApiController.java @@ -242,7 +242,7 @@ public class MoneyApiController { String stockUrl = company_a.attr("href"); String stockName = company_a.text(); dto.setStockName(stockName); - //dto.setStockUrl(stockUrl); + dto.setStockUrl(stockUrl); } String highPrice = getTextOrEmpty(doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div > div.bsr_table.hist_tbl_hm > table > tbody > tr:nth-child(" + i + ") > td:nth-child(2)").first()); @@ -287,7 +287,7 @@ public class MoneyApiController { String stockUrl = company_a.attr("href"); String stockName = company_a.text(); dto.setStockName(stockName); - // dto.setStockUrl(stockUrl); + dto.setStockUrl(stockUrl); } String highPrice = getTextOrEmpty(doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div > div.bsr_table.hist_tbl_hm > table > tbody > tr:nth-child(" + i + ") > td:nth-child(2)").first()); @@ -331,7 +331,7 @@ public class MoneyApiController { if (company_a != null) { String stockUrl = company_a.attr("href"); String stockName = company_a.text(); - //dto.setStockUrl(stockUrl); + dto.setStockUrl(stockUrl); dto.setStockName(stockName); } @@ -375,7 +375,7 @@ public class MoneyApiController { if (company_a != null) { String stockUrl = company_a.attr("href"); String stockName = company_a.text(); - // dto.setStockUrl(stockUrl); + dto.setStockUrl(stockUrl); dto.setStockName(stockName); } @@ -419,7 +419,7 @@ public class MoneyApiController { String stockUrl = company_a.attr("href"); String stockName = company_a.text(); dto.setStockName(stockName); - //dto.setStockUrl(stockUrl); + dto.setStockUrl(stockUrl); } @@ -508,6 +508,7 @@ public class MoneyApiController { moneyStockSuggestDTOS = bseTopLoser(); } if(CollectionUtils.isNotEmpty(moneyStockSuggestDTOS)){ + moneyStockSuggestDTOS.stream().forEach(f->f.setDispId(extractLastSegment(f.getStockUrl()))); List selfUlrList = moneyStockSuggestDTOS.stream().map(MoneyStockSuggestDTO::getStockName).collect(Collectors.toList()); if(CollectionUtils.isNotEmpty(selfUlrList)){ List all = moneyStockRepository.findAll(QMoneyStockPO.moneyStockPO.stockName.in(selfUlrList)); @@ -515,6 +516,15 @@ public class MoneyApiController { moneyStockSuggestDTOS.stream().filter(f->all.stream().anyMatch(s->s.getStockName().equals(f.getStockName()))) .forEach(f->f.setScId(all.stream().filter(s->s.getStockName().equals(f.getStockName())).findFirst().orElse(null).getMoneyScId())); } + List noScIdList = moneyStockSuggestDTOS.stream().filter(f->StringUtils.isBlank(f.getScId())).collect(Collectors.toList()); + if(CollectionUtils.isNotEmpty(noScIdList)){ + List dispIdList = noScIdList.stream().map(MoneyStockSuggestDTO::getDispId).collect(Collectors.toList()); + List all1 = moneyStockRepository.findAll(QMoneyStockPO.moneyStockPO.selfDispId.in(dispIdList)); + if(CollectionUtils.isNotEmpty(all1)){ + moneyStockSuggestDTOS.stream().filter(f->all1.stream().anyMatch(s->s.getSelfDispId().equals(f.getDispId()))) + .forEach(f->f.setScId(all.stream().filter(s->s.getSelfDispId().equals(f.getDispId())).findFirst().orElse(null).getMoneyScId())); + } + } } } @@ -542,6 +552,7 @@ public class MoneyApiController { moneyStockSuggestDTOS = bseActives(); } if(CollectionUtils.isNotEmpty(moneyStockSuggestDTOS)){ + moneyStockSuggestDTOS.stream().forEach(f->f.setDispId(extractLastSegment(f.getStockUrl()))); List selfUlrList = moneyStockSuggestDTOS.stream().map(MoneyStockSuggestDTO::getStockName).collect(Collectors.toList()); if(CollectionUtils.isNotEmpty(selfUlrList)){ List all = moneyStockRepository.findAll(QMoneyStockPO.moneyStockPO.stockName.in(selfUlrList)); @@ -549,6 +560,15 @@ public class MoneyApiController { moneyStockSuggestDTOS.stream().filter(f->all.stream().anyMatch(s->s.getStockName().equals(f.getStockName()))) .forEach(f->f.setScId(all.stream().filter(s->s.getStockName().equals(f.getStockName())).findFirst().orElse(null).getMoneyScId())); } + List noScIdList = moneyStockSuggestDTOS.stream().filter(f->StringUtils.isBlank(f.getScId())).collect(Collectors.toList()); + if(CollectionUtils.isNotEmpty(noScIdList)){ + List dispIdList = noScIdList.stream().map(MoneyStockSuggestDTO::getDispId).collect(Collectors.toList()); + List all1 = moneyStockRepository.findAll(QMoneyStockPO.moneyStockPO.selfDispId.in(dispIdList)); + if(CollectionUtils.isNotEmpty(all1)){ + moneyStockSuggestDTOS.stream().filter(f->all1.stream().anyMatch(s->s.getSelfDispId().equals(f.getDispId()))) + .forEach(f->f.setScId(all.stream().filter(s->s.getSelfDispId().equals(f.getDispId())).findFirst().orElse(null).getMoneyScId())); + } + } } } From 636bd0a82a711e570dd3393b3e7083e5ab50fbbd Mon Sep 17 00:00:00 2001 From: Achilles Date: Sat, 6 Jan 2024 17:53:09 +0800 Subject: [PATCH 09/27] =?UTF-8?q?=E7=BB=A7=E7=BB=AD=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../infrastructure/job/MoneyScraper.java | 46 +++++++++++++++++-- 1 file changed, 43 insertions(+), 3 deletions(-) diff --git a/src/main/java/cn/stock/market/infrastructure/job/MoneyScraper.java b/src/main/java/cn/stock/market/infrastructure/job/MoneyScraper.java index e4ba798..dec0321 100644 --- a/src/main/java/cn/stock/market/infrastructure/job/MoneyScraper.java +++ b/src/main/java/cn/stock/market/infrastructure/job/MoneyScraper.java @@ -92,6 +92,47 @@ public class MoneyScraper { } + @GetMapping("testScraperGetMoneyControlStockNoScId") + public String testScraperGetMoneyControlStockNoScId() { + String url = "http://www.moneycontrol.com/india/stockpricequote/foodprocessing/nestleindia/NI"; + /* Document soup2 = fetchCompanyDetails(url); + + if (soup2 != null) { + Element comIdInput = soup2.selectFirst("input[id=ap_sc_id]"); + String companyCodeId = null; + if (comIdInput != null) { + companyCodeId = comIdInput.val(); + log.info(Thread.currentThread().getName() + ",the stock url: " + url + ", THE input id: " + companyCodeId); + } else { + log.error(Thread.currentThread().getName() + " No with id='ap_sc_id' found on the website."); + } + + if (soup2 != null) { + Element ulElement = soup2.selectFirst("ul[id=nseBseTab]"); + + if (ulElement != null) { + for (Element aElement : ulElement.select("a")) { + String exchangeValue = aElement.text().trim(); + if ("BSE".equals(exchangeValue) || "NSE".equals(exchangeValue)) { + log.info(Thread.currentThread().getName() + ",the stock url: " + url + + ", the exchange Value: " + exchangeValue); + MoneyStock build = MoneyStock.builder().stockName("sss").stockType(exchangeValue.toLowerCase(Locale.ROOT)) + .detailUrl(String.format("https://priceapi.moneycontrol.com/pricefeed/%s/equitycash/%s", exchangeValue.toLowerCase(), companyCodeId)) + .selfUrl(url) + .selfDispId(extractDispId(url)) + .moneyScId(companyCodeId).saveTime(new Date()).build(); + List all = moneyStockRepository.findAll(QMoneyStockPO.moneyStockPO.stockName.eq("Nestle"), QMoneyStockPO.moneyStockPO.stockType.eq(exchangeValue.toLowerCase(Locale.ROOT))); + if (CollectionUtil.isEmpty(all)) { + moneyStockRepository.save(build); + } + } + } + } + } + }*/ + return "ok"; + } + /** * 带有A B 分组的url @@ -132,8 +173,7 @@ public class MoneyScraper { break; // 如果成功则跳出循环 } catch (IOException | RuntimeException e) { // 处理异常的逻辑 - e.printStackTrace(); - log.error("Attempt " + attempt + " failed. Retrying..."); + log.error("Attempt " + attempt + " failed. Retrying...",e); attempt++; try { Thread.sleep(1000); // 休眠1秒 @@ -207,7 +247,7 @@ public class MoneyScraper { if (soup2 != null) { Element comIdInput = soup2.selectFirst("input[id=ap_sc_id]"); - String companyCodeId = ""; + String companyCodeId = null; if (comIdInput != null) { companyCodeId = comIdInput.val(); log.info(Thread.currentThread().getName()+",the stockName: " + textContent + ", THE input id: " + companyCodeId); From 7b0517cc3374700d3e571efa090ae9bd4e6397ef Mon Sep 17 00:00:00 2001 From: Achilles Date: Sat, 6 Jan 2024 17:54:11 +0800 Subject: [PATCH 10/27] =?UTF-8?q?=E7=BB=A7=E7=BB=AD=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/stock/market/infrastructure/job/MoneyScraper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/cn/stock/market/infrastructure/job/MoneyScraper.java b/src/main/java/cn/stock/market/infrastructure/job/MoneyScraper.java index dec0321..a0df9e6 100644 --- a/src/main/java/cn/stock/market/infrastructure/job/MoneyScraper.java +++ b/src/main/java/cn/stock/market/infrastructure/job/MoneyScraper.java @@ -247,7 +247,7 @@ public class MoneyScraper { if (soup2 != null) { Element comIdInput = soup2.selectFirst("input[id=ap_sc_id]"); - String companyCodeId = null; + String companyCodeId = ""; if (comIdInput != null) { companyCodeId = comIdInput.val(); log.info(Thread.currentThread().getName()+",the stockName: " + textContent + ", THE input id: " + companyCodeId); From d5a3fddbd46c6656a4b1e2004b323ff4770c6ce9 Mon Sep 17 00:00:00 2001 From: Achilles Date: Sat, 6 Jan 2024 18:31:20 +0800 Subject: [PATCH 11/27] =?UTF-8?q?=E7=BB=A7=E7=BB=AD=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../stock/market/dto/StockHistoryRequest.java | 14 ++++++ .../market/dto/StockHistoryResponse.java | 17 +++++++ .../stock/market/web/MoneyApiController.java | 49 +++++++++++++++++++ 3 files changed, 80 insertions(+) create mode 100644 src/main/java/cn/stock/market/dto/StockHistoryRequest.java create mode 100644 src/main/java/cn/stock/market/dto/StockHistoryResponse.java diff --git a/src/main/java/cn/stock/market/dto/StockHistoryRequest.java b/src/main/java/cn/stock/market/dto/StockHistoryRequest.java new file mode 100644 index 0000000..ef4c781 --- /dev/null +++ b/src/main/java/cn/stock/market/dto/StockHistoryRequest.java @@ -0,0 +1,14 @@ +package cn.stock.market.dto; + +import lombok.Data; + +@Data +public class StockHistoryRequest { + private String symbol; + private String resolution; + private long from; + private long to; + private int countback; + private String currencyCode; + +} \ No newline at end of file diff --git a/src/main/java/cn/stock/market/dto/StockHistoryResponse.java b/src/main/java/cn/stock/market/dto/StockHistoryResponse.java new file mode 100644 index 0000000..66d27aa --- /dev/null +++ b/src/main/java/cn/stock/market/dto/StockHistoryResponse.java @@ -0,0 +1,17 @@ +package cn.stock.market.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class StockHistoryResponse { + private String s; + private List t; + private List o; + private List h; + private List l; + private List c; + private List v; + +} \ No newline at end of file diff --git a/src/main/java/cn/stock/market/web/MoneyApiController.java b/src/main/java/cn/stock/market/web/MoneyApiController.java index 1c3558c..046f7a5 100644 --- a/src/main/java/cn/stock/market/web/MoneyApiController.java +++ b/src/main/java/cn/stock/market/web/MoneyApiController.java @@ -3,6 +3,8 @@ package cn.stock.market.web; import cn.stock.market.MoneyStockSuggestDTO; import cn.stock.market.domain.basic.entity.MoneyStock; import cn.stock.market.domain.basic.repository.MoneyStockRepository; +import cn.stock.market.dto.StockHistoryRequest; +import cn.stock.market.dto.StockHistoryResponse; import cn.stock.market.infrastructure.db.po.QMoneyStockPO; import com.alibaba.fastjson.JSONObject; import com.google.common.collect.Lists; @@ -49,6 +51,9 @@ public class MoneyApiController { @Autowired private MoneyStockRepository moneyStockRepository; + private static final String EXTERNAL_API_URL = "https://priceapi.moneycontrol.com/techCharts/indianMarket/stock/history"; + + @ApiOperation(value = "股票详情信息",httpMethod = "GET") @ApiImplicitParams({ @@ -576,6 +581,50 @@ public class MoneyApiController { } + + @GetMapping("/api/market/money/history/kLine") + @ApiOperation(value = "获取kline的money数据源", notes = "获取kline的money数据源",response = StockHistoryResponse.class) + @ApiImplicitParams({ + @ApiImplicitParam(name = "symbol", value = "Stock symbol", required = true, dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "resolution", value = "Resolution", required = true, dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "from", value = "Start timestamp", required = true, dataType = "long", paramType = "query"), + @ApiImplicitParam(name = "to", value = "End timestamp", required = true, dataType = "long", paramType = "query"), + @ApiImplicitParam(name = "countback", value = "Countback", required = true, dataType = "int", paramType = "query"), + @ApiImplicitParam(name = "currencyCode", value = "Currency code", required = true, dataType = "String", paramType = "query") + }) + @ResponseBody + public ResponseEntity getStockHistory( @RequestParam String symbol, + @RequestParam String resolution, + @RequestParam long from, + @RequestParam long to, + @RequestParam int countback, + @RequestParam String currencyCode) { + // 创建一个RestTemplate实例 + RestTemplate restTemplate = new RestTemplate(); + // 向外部API发起请求,并获取响应 + StockHistoryRequest request = new StockHistoryRequest(); + request.setSymbol(symbol); + request.setResolution(resolution); + request.setFrom(from); + request.setTo(to); + request.setCountback(countback); + request.setCurrencyCode(currencyCode); + String apiUrl = buildApiUrl(request); + StockHistoryResponse response = restTemplate.getForObject(apiUrl, StockHistoryResponse.class); + + // 返回响应 + return ResponseEntity.ok(response); + } + + + private String buildApiUrl(StockHistoryRequest request) { + // 构建外部API的URL + return String.format("%s?symbol=%s&resolution=%s&from=%d&to=%d&countback=%d¤cyCode=%s", + EXTERNAL_API_URL, request.getSymbol(), request.getResolution(), request.getFrom(), + request.getTo(), request.getCountback(), request.getCurrencyCode()); + }; + + private static String extractLastSegment(String url) { if (url == null) { return null; From f1c3f718f06351a4221096e610480905b31f6321 Mon Sep 17 00:00:00 2001 From: Achilles Date: Mon, 8 Jan 2024 15:15:30 +0800 Subject: [PATCH 12/27] =?UTF-8?q?=E8=B0=83=E6=95=B4=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/cn/stock/market/web/MoneyApiController.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/cn/stock/market/web/MoneyApiController.java b/src/main/java/cn/stock/market/web/MoneyApiController.java index 046f7a5..486899a 100644 --- a/src/main/java/cn/stock/market/web/MoneyApiController.java +++ b/src/main/java/cn/stock/market/web/MoneyApiController.java @@ -6,6 +6,7 @@ import cn.stock.market.domain.basic.repository.MoneyStockRepository; import cn.stock.market.dto.StockHistoryRequest; import cn.stock.market.dto.StockHistoryResponse; import cn.stock.market.infrastructure.db.po.QMoneyStockPO; +import cn.stock.market.utils.ServerResponse; import com.alibaba.fastjson.JSONObject; import com.google.common.collect.Lists; import io.swagger.annotations.Api; @@ -159,17 +160,16 @@ public class MoneyApiController { }) @GetMapping("/api/market/money/getStockDetail") @ResponseBody - public JSONObject getStockDetail(@RequestParam String stockType, @RequestParam String symbol) { + public ServerResponse getStockDetail(@RequestParam String stockType, @RequestParam String symbol) { String url = String.format("https://priceapi.moneycontrol.com/pricefeed/%s/equitycash/%s",stockType,symbol); - // 设置重试次数 int maxRetries = 3; for (int retry = 1; retry <= maxRetries; retry++) { try { ResponseEntity responseEntity = restTemplate.exchange(url, HttpMethod.GET, null, String.class); - if (responseEntity.getStatusCode().value() == 200 && responseEntity.getBody() != null) { - return JSONObject.parseObject(responseEntity.getBody()); + if (responseEntity.getStatusCode().value() == 200 && responseEntity.getBody() != null ) { + return ServerResponse.createBySuccess(JSONObject.parseObject(responseEntity.getBody()).getJSONObject("data")); } } catch (Exception e) { From 95468dba5cd2edb8bdacd19d6f50e5749d5423f6 Mon Sep 17 00:00:00 2001 From: Achilles Date: Mon, 8 Jan 2024 16:18:44 +0800 Subject: [PATCH 13/27] =?UTF-8?q?=E8=B0=83=E6=95=B4=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../stock/market/web/MoneyApiController.java | 28 +++++++++++++++++-- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/src/main/java/cn/stock/market/web/MoneyApiController.java b/src/main/java/cn/stock/market/web/MoneyApiController.java index 486899a..3667748 100644 --- a/src/main/java/cn/stock/market/web/MoneyApiController.java +++ b/src/main/java/cn/stock/market/web/MoneyApiController.java @@ -60,6 +60,7 @@ public class MoneyApiController { @ApiImplicitParams({ @ApiImplicitParam(name="stockType",value = "BSE或者NSE"), @ApiImplicitParam(name="symbol",value = "scId值"), + @ApiImplicitParam(name="id",value = "id值"), }) @ApiResponses(value = { @ApiResponse(code = 200, message = "" + @@ -160,16 +161,37 @@ public class MoneyApiController { }) @GetMapping("/api/market/money/getStockDetail") @ResponseBody - public ServerResponse getStockDetail(@RequestParam String stockType, @RequestParam String symbol) { + public ServerResponse getStockDetail(@RequestParam String stockType, @RequestParam String symbol,@RequestParam String id ) { String url = String.format("https://priceapi.moneycontrol.com/pricefeed/%s/equitycash/%s",stockType,symbol); + /* MoneyStock moneyStock = moneyStockRepository.findOne(QMoneyStockPO.moneyStockPO.stockType.eq(stockType).and(QMoneyStockPO.moneyStockPO.moneyScId.eq(symbol))).orElse(null); + if(moneyStock==null){ + return ServerResponse.createByErrorMsg("没有找到该股票"); + }*/ // 设置重试次数 int maxRetries = 3; for (int retry = 1; retry <= maxRetries; retry++) { try { ResponseEntity responseEntity = restTemplate.exchange(url, HttpMethod.GET, null, String.class); - + JSONObject json1 = new JSONObject(); if (responseEntity.getStatusCode().value() == 200 && responseEntity.getBody() != null ) { - return ServerResponse.createBySuccess(JSONObject.parseObject(responseEntity.getBody()).getJSONObject("data")); + JSONObject data = JSONObject.parseObject(responseEntity.getBody()).getJSONObject("data"); + if(data!=null){ + json1.put("company",data.getString("company")); + json1.put("pricepercentchange",data.getString("pricepercentchange")); + json1.put("stockType",stockType); + json1.put("pricechange",data.getString("pricechange")); + json1.put("pricecurrent",data.getString("pricecurrent")); + json1.put("priceprevclose",data.getString("priceprevclose")); + json1.put("PREVDATE",data.getString("PREVDATE")); + json1.put("VOL",data.getString("VOL")); + json1.put("dataSourceType","3"); + json1.put("symbol",data.getString("symbol")); + json1.put("LTH",data.getString("LTH")); + json1.put("LTL",data.getString("LTL")); + json1.put("OPN",data.getString("OPN")); + json1.put("id",id); + } + return ServerResponse.createBySuccess(json1); } } catch (Exception e) { From a0bd21b645f51b1126624eb7cef9389149607135 Mon Sep 17 00:00:00 2001 From: Achilles Date: Mon, 8 Jan 2024 16:24:35 +0800 Subject: [PATCH 14/27] =?UTF-8?q?=E8=B0=83=E6=95=B4=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/cn/stock/market/web/MoneyApiController.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/cn/stock/market/web/MoneyApiController.java b/src/main/java/cn/stock/market/web/MoneyApiController.java index 3667748..3729fa5 100644 --- a/src/main/java/cn/stock/market/web/MoneyApiController.java +++ b/src/main/java/cn/stock/market/web/MoneyApiController.java @@ -163,10 +163,10 @@ public class MoneyApiController { @ResponseBody public ServerResponse getStockDetail(@RequestParam String stockType, @RequestParam String symbol,@RequestParam String id ) { String url = String.format("https://priceapi.moneycontrol.com/pricefeed/%s/equitycash/%s",stockType,symbol); - /* MoneyStock moneyStock = moneyStockRepository.findOne(QMoneyStockPO.moneyStockPO.stockType.eq(stockType).and(QMoneyStockPO.moneyStockPO.moneyScId.eq(symbol))).orElse(null); + MoneyStock moneyStock = moneyStockRepository.findOne(QMoneyStockPO.moneyStockPO.stockType.eq(stockType).and(QMoneyStockPO.moneyStockPO.moneyScId.eq(symbol))).orElse(null); if(moneyStock==null){ return ServerResponse.createByErrorMsg("没有找到该股票"); - }*/ + } // 设置重试次数 int maxRetries = 3; for (int retry = 1; retry <= maxRetries; retry++) { @@ -189,7 +189,7 @@ public class MoneyApiController { json1.put("LTH",data.getString("LTH")); json1.put("LTL",data.getString("LTL")); json1.put("OPN",data.getString("OPN")); - json1.put("id",id); + json1.put("id",moneyStock.getId()); } return ServerResponse.createBySuccess(json1); } From 2601d5cf77236af45cfde8584a248a22e8594389 Mon Sep 17 00:00:00 2001 From: Achilles Date: Mon, 8 Jan 2024 16:25:04 +0800 Subject: [PATCH 15/27] =?UTF-8?q?=E8=B0=83=E6=95=B4=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/cn/stock/market/web/MoneyApiController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/cn/stock/market/web/MoneyApiController.java b/src/main/java/cn/stock/market/web/MoneyApiController.java index 3729fa5..3a52a0d 100644 --- a/src/main/java/cn/stock/market/web/MoneyApiController.java +++ b/src/main/java/cn/stock/market/web/MoneyApiController.java @@ -161,7 +161,7 @@ public class MoneyApiController { }) @GetMapping("/api/market/money/getStockDetail") @ResponseBody - public ServerResponse getStockDetail(@RequestParam String stockType, @RequestParam String symbol,@RequestParam String id ) { + public ServerResponse getStockDetail(@RequestParam String stockType, @RequestParam String symbol ) { String url = String.format("https://priceapi.moneycontrol.com/pricefeed/%s/equitycash/%s",stockType,symbol); MoneyStock moneyStock = moneyStockRepository.findOne(QMoneyStockPO.moneyStockPO.stockType.eq(stockType).and(QMoneyStockPO.moneyStockPO.moneyScId.eq(symbol))).orElse(null); if(moneyStock==null){ From 28f33672e5bbcde2801a937f60da7a1deacf742d Mon Sep 17 00:00:00 2001 From: Achilles Date: Mon, 8 Jan 2024 16:27:41 +0800 Subject: [PATCH 16/27] =?UTF-8?q?=E8=B0=83=E6=95=B4=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/cn/stock/market/web/MoneyApiController.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/cn/stock/market/web/MoneyApiController.java b/src/main/java/cn/stock/market/web/MoneyApiController.java index 3a52a0d..62c1705 100644 --- a/src/main/java/cn/stock/market/web/MoneyApiController.java +++ b/src/main/java/cn/stock/market/web/MoneyApiController.java @@ -164,9 +164,9 @@ public class MoneyApiController { public ServerResponse getStockDetail(@RequestParam String stockType, @RequestParam String symbol ) { String url = String.format("https://priceapi.moneycontrol.com/pricefeed/%s/equitycash/%s",stockType,symbol); MoneyStock moneyStock = moneyStockRepository.findOne(QMoneyStockPO.moneyStockPO.stockType.eq(stockType).and(QMoneyStockPO.moneyStockPO.moneyScId.eq(symbol))).orElse(null); - if(moneyStock==null){ + /* if(moneyStock==null){ return ServerResponse.createByErrorMsg("没有找到该股票"); - } + }*/ // 设置重试次数 int maxRetries = 3; for (int retry = 1; retry <= maxRetries; retry++) { @@ -189,7 +189,9 @@ public class MoneyApiController { json1.put("LTH",data.getString("LTH")); json1.put("LTL",data.getString("LTL")); json1.put("OPN",data.getString("OPN")); - json1.put("id",moneyStock.getId()); + if(null!=moneyStock){ + json1.put("id",moneyStock.getId()); + } } return ServerResponse.createBySuccess(json1); } From 9264f08c77b617b78f253c34835ecc1c0f225551 Mon Sep 17 00:00:00 2001 From: Achilles Date: Mon, 8 Jan 2024 17:09:20 +0800 Subject: [PATCH 17/27] =?UTF-8?q?=E8=B0=83=E6=95=B4=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../market/infrastructure/job/MoneyScraper.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/cn/stock/market/infrastructure/job/MoneyScraper.java b/src/main/java/cn/stock/market/infrastructure/job/MoneyScraper.java index a0df9e6..91f5826 100644 --- a/src/main/java/cn/stock/market/infrastructure/job/MoneyScraper.java +++ b/src/main/java/cn/stock/market/infrastructure/job/MoneyScraper.java @@ -16,6 +16,7 @@ import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import java.io.BufferedReader; @@ -93,9 +94,8 @@ public class MoneyScraper { } @GetMapping("testScraperGetMoneyControlStockNoScId") - public String testScraperGetMoneyControlStockNoScId() { - String url = "http://www.moneycontrol.com/india/stockpricequote/foodprocessing/nestleindia/NI"; - /* Document soup2 = fetchCompanyDetails(url); + public String testScraperGetMoneyControlStockNoScId(@RequestParam("url") String url) { + Document soup2 = fetchCompanyDetails(url); if (soup2 != null) { Element comIdInput = soup2.selectFirst("input[id=ap_sc_id]"); @@ -109,19 +109,19 @@ public class MoneyScraper { if (soup2 != null) { Element ulElement = soup2.selectFirst("ul[id=nseBseTab]"); - + String name = soup2.selectFirst("#stockName > h1").text(); if (ulElement != null) { for (Element aElement : ulElement.select("a")) { String exchangeValue = aElement.text().trim(); if ("BSE".equals(exchangeValue) || "NSE".equals(exchangeValue)) { log.info(Thread.currentThread().getName() + ",the stock url: " + url + ", the exchange Value: " + exchangeValue); - MoneyStock build = MoneyStock.builder().stockName("sss").stockType(exchangeValue.toLowerCase(Locale.ROOT)) + MoneyStock build = MoneyStock.builder().stockName(name).stockType(exchangeValue.toLowerCase(Locale.ROOT)) .detailUrl(String.format("https://priceapi.moneycontrol.com/pricefeed/%s/equitycash/%s", exchangeValue.toLowerCase(), companyCodeId)) .selfUrl(url) .selfDispId(extractDispId(url)) .moneyScId(companyCodeId).saveTime(new Date()).build(); - List all = moneyStockRepository.findAll(QMoneyStockPO.moneyStockPO.stockName.eq("Nestle"), QMoneyStockPO.moneyStockPO.stockType.eq(exchangeValue.toLowerCase(Locale.ROOT))); + List all = moneyStockRepository.findAll(QMoneyStockPO.moneyStockPO.stockName.eq(name), QMoneyStockPO.moneyStockPO.stockType.eq(exchangeValue.toLowerCase(Locale.ROOT))); if (CollectionUtil.isEmpty(all)) { moneyStockRepository.save(build); } @@ -129,7 +129,7 @@ public class MoneyScraper { } } } - }*/ + } return "ok"; } From 90c5eb964400e8c210e3bf21a39fba6b88d5e5f9 Mon Sep 17 00:00:00 2001 From: Achilles Date: Mon, 8 Jan 2024 18:54:24 +0800 Subject: [PATCH 18/27] =?UTF-8?q?=E8=B0=83=E6=95=B4=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/cn/stock/market/web/MoneyApiController.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/cn/stock/market/web/MoneyApiController.java b/src/main/java/cn/stock/market/web/MoneyApiController.java index 62c1705..97cbbbd 100644 --- a/src/main/java/cn/stock/market/web/MoneyApiController.java +++ b/src/main/java/cn/stock/market/web/MoneyApiController.java @@ -609,12 +609,12 @@ public class MoneyApiController { @GetMapping("/api/market/money/history/kLine") @ApiOperation(value = "获取kline的money数据源", notes = "获取kline的money数据源",response = StockHistoryResponse.class) @ApiImplicitParams({ - @ApiImplicitParam(name = "symbol", value = "Stock symbol", required = true, dataType = "String", paramType = "query"), - @ApiImplicitParam(name = "resolution", value = "Resolution", required = true, dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "symbol", value = "Stock symbol 对应的是scId", required = true, dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "resolution", value = "单位:60 1D 1W 1D 对应H,D,W,Y", required = true, dataType = "String", paramType = "query"), @ApiImplicitParam(name = "from", value = "Start timestamp", required = true, dataType = "long", paramType = "query"), @ApiImplicitParam(name = "to", value = "End timestamp", required = true, dataType = "long", paramType = "query"), - @ApiImplicitParam(name = "countback", value = "Countback", required = true, dataType = "int", paramType = "query"), - @ApiImplicitParam(name = "currencyCode", value = "Currency code", required = true, dataType = "String", paramType = "query") + @ApiImplicitParam(name = "countback", value = "开始时间和结束时间区间的计划展示的数量", required = true, dataType = "int", paramType = "query"), + @ApiImplicitParam(name = "currencyCode", value = "INR 不变", required = true, dataType = "String", paramType = "query") }) @ResponseBody public ResponseEntity getStockHistory( @RequestParam String symbol, From bc852cbf7c47d5e1d42b498417138f29debd1d68 Mon Sep 17 00:00:00 2001 From: Achilles Date: Mon, 8 Jan 2024 21:04:59 +0800 Subject: [PATCH 19/27] =?UTF-8?q?k=20line=E6=8E=A5=E5=8F=A3=E8=B0=83?= =?UTF-8?q?=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../stock/market/web/MoneyApiController.java | 77 ++++++++++++++++--- 1 file changed, 65 insertions(+), 12 deletions(-) diff --git a/src/main/java/cn/stock/market/web/MoneyApiController.java b/src/main/java/cn/stock/market/web/MoneyApiController.java index 97cbbbd..57f0fe2 100644 --- a/src/main/java/cn/stock/market/web/MoneyApiController.java +++ b/src/main/java/cn/stock/market/web/MoneyApiController.java @@ -23,11 +23,13 @@ import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; import java.io.IOException; @@ -186,6 +188,8 @@ public class MoneyApiController { json1.put("VOL",data.getString("VOL")); json1.put("dataSourceType","3"); json1.put("symbol",data.getString("symbol")); + json1.put("BSEID",data.getString("BSEID")); + json1.put("NSEID",data.getString("NSEID")); json1.put("LTH",data.getString("LTH")); json1.put("LTL",data.getString("LTL")); json1.put("OPN",data.getString("OPN")); @@ -609,7 +613,7 @@ public class MoneyApiController { @GetMapping("/api/market/money/history/kLine") @ApiOperation(value = "获取kline的money数据源", notes = "获取kline的money数据源",response = StockHistoryResponse.class) @ApiImplicitParams({ - @ApiImplicitParam(name = "symbol", value = "Stock symbol 对应的是scId", required = true, dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "symbol", value = "Stock symbol 对应的是NSEID 或者是BSEID", required = true, dataType = "String", paramType = "query"), @ApiImplicitParam(name = "resolution", value = "单位:60 1D 1W 1D 对应H,D,W,Y", required = true, dataType = "String", paramType = "query"), @ApiImplicitParam(name = "from", value = "Start timestamp", required = true, dataType = "long", paramType = "query"), @ApiImplicitParam(name = "to", value = "End timestamp", required = true, dataType = "long", paramType = "query"), @@ -618,29 +622,78 @@ public class MoneyApiController { }) @ResponseBody public ResponseEntity getStockHistory( @RequestParam String symbol, - @RequestParam String resolution, - @RequestParam long from, - @RequestParam long to, - @RequestParam int countback, - @RequestParam String currencyCode) { - // 创建一个RestTemplate实例 - RestTemplate restTemplate = new RestTemplate(); + @RequestParam String resolution + ) { // 向外部API发起请求,并获取响应 StockHistoryRequest request = new StockHistoryRequest(); request.setSymbol(symbol); - request.setResolution(resolution); + Long to = null; + Long from = null; + int countback = 5; + if(StringUtils.equals("H",resolution)){ + to = (long) (System.currentTimeMillis() / 1000); + from = to - (5 * 24 * 60 * 60 ); + countback = 10; + request.setResolution("60"); + }else if(StringUtils.equals("D",resolution)){ + to = (long) (System.currentTimeMillis() / 1000); + from = to - (10 * 24 * 60 * 60 ); + countback = 5; + request.setResolution("1D"); + }else if(StringUtils.equals("W",resolution)){ + to = (long) (System.currentTimeMillis() / 1000); + from = to - (15 * 24 * 60 * 60 ); + countback = 5; + request.setResolution("1W"); + }else if(StringUtils.equals("M",resolution)){ + to = (long) (System.currentTimeMillis() / 1000); + from = to - (365 * 24 * 60 * 60 ); + countback = 10; + request.setResolution("1D"); + } + request.setFrom(from); request.setTo(to); request.setCountback(countback); - request.setCurrencyCode(currencyCode); + request.setCurrencyCode("INR"); String apiUrl = buildApiUrl(request); - StockHistoryResponse response = restTemplate.getForObject(apiUrl, StockHistoryResponse.class); + log.info("request url:"+apiUrl); + StockHistoryResponse response = null; + int maxRetries = 3; + int retryCount = 0; + while (response == null && retryCount < maxRetries) { + try { + response = restTemplate.getForObject(apiUrl, StockHistoryResponse.class); + } catch (RestClientException e) { + // Log the exception or perform any other error handling + log.error("Error while making API request. Retrying... (Retry count: {})", retryCount + 1); + + // Increment the retry count + retryCount++; + // Add some delay before the next retry (you can adjust this as needed) + try { + Thread.sleep(300); // 1 second delay + } catch (InterruptedException ex) { + Thread.currentThread().interrupt(); + } + } + } + + if (response != null) { + // API request successful, return the response + return ResponseEntity.ok(response); + } else { + // All retries failed, return an error response + log.error("Failed to get a successful response after {} retries.", maxRetries); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); + } // 返回响应 - return ResponseEntity.ok(response); } + + private String buildApiUrl(StockHistoryRequest request) { // 构建外部API的URL return String.format("%s?symbol=%s&resolution=%s&from=%d&to=%d&countback=%d¤cyCode=%s", From 163c92970d97dd4a9ae8336b57958d87eb46bed8 Mon Sep 17 00:00:00 2001 From: Achilles Date: Tue, 9 Jan 2024 11:12:11 +0800 Subject: [PATCH 20/27] =?UTF-8?q?actives=20=E6=8E=A5=E5=8F=A3=E8=B0=83?= =?UTF-8?q?=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/stock/market/web/MoneyApiController.java | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/main/java/cn/stock/market/web/MoneyApiController.java b/src/main/java/cn/stock/market/web/MoneyApiController.java index 57f0fe2..ec12e00 100644 --- a/src/main/java/cn/stock/market/web/MoneyApiController.java +++ b/src/main/java/cn/stock/market/web/MoneyApiController.java @@ -242,10 +242,8 @@ public class MoneyApiController { String lastPrice = getTextOrEmpty(doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div.bsr_table.hist_tbl_hm > table > tbody > tr:nth-child(" + i + ") > td:nth-child(4)").first()); dto.setLastPrice(lastPrice); - String change = getTextOrEmpty(doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div.bsr_table.hist_tbl_hm > table > tbody > tr:nth-child(" + i + ") > td:nth-child(5)").first()); - dto.setChange(change); + String changePercent = getTextOrEmpty(doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div.bsr_table.hist_tbl_hm > table > tbody > tr:nth-child(" + i + ") > td:nth-child(5)").first()); - String changePercent = getTextOrEmpty(doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div.bsr_table.hist_tbl_hm > table > tbody > tr:nth-child(" + i + ") > td:nth-child(6)").first()); dto.setChangePercent(changePercent); dto.setStockType("nse"); @@ -290,10 +288,7 @@ public class MoneyApiController { String prevClosePrice = getTextOrEmpty(doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div > div.bsr_table.hist_tbl_hm > table > tbody > tr:nth-child(" + i + ") > td:nth-child(5)").first()); dto.setPrevClosePrice(prevClosePrice); - String change = getTextOrEmpty(doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div > div.bsr_table.hist_tbl_hm > table > tbody > tr:nth-child(" + i + ") > td:nth-child(6)").first()); - dto.setChange(change); - - String changePercent = getTextOrEmpty(doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div > div.bsr_table.hist_tbl_hm > table > tbody > tr:nth-child(" + i + ") > td:nth-child(7)").first()); + String changePercent = getTextOrEmpty(doc.select("#mc_content > section > section > div.clearfix.stat_container > div.columnst.FR.wbg.brdwht > div > div > div.bsr_table.hist_tbl_hm > table > tbody > tr:nth-child(" + i + ") > td:nth-child(6)").first()); dto.setChangePercent(changePercent); dto.setStockType("bse"); From c9f0d8f4cf891964c0c5ff482103f48396407571 Mon Sep 17 00:00:00 2001 From: Achilles Date: Tue, 9 Jan 2024 11:20:41 +0800 Subject: [PATCH 21/27] =?UTF-8?q?actives=20=E6=8E=A5=E5=8F=A3=E8=B0=83?= =?UTF-8?q?=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../stock/market/web/MoneyApiController.java | 22 +++++++------------ 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/main/java/cn/stock/market/web/MoneyApiController.java b/src/main/java/cn/stock/market/web/MoneyApiController.java index ec12e00..cbfbad1 100644 --- a/src/main/java/cn/stock/market/web/MoneyApiController.java +++ b/src/main/java/cn/stock/market/web/MoneyApiController.java @@ -504,16 +504,7 @@ public class MoneyApiController { }else if(StringUtils.equals(stockType,"bse")){ moneyStockSuggestDTOS = bseGainer(); } - if(CollectionUtils.isNotEmpty(moneyStockSuggestDTOS)){ - List selfUlrList = moneyStockSuggestDTOS.stream().map(MoneyStockSuggestDTO::getStockName).collect(Collectors.toList()); - if(CollectionUtils.isNotEmpty(selfUlrList)){ - List all = moneyStockRepository.findAll(QMoneyStockPO.moneyStockPO.stockName.in(selfUlrList)); - if(CollectionUtils.isNotEmpty(all)){ - moneyStockSuggestDTOS.stream().filter(f->all.stream().anyMatch(s->s.getStockName().equals(f.getStockName()))) - .forEach(f->f.setScId(all.stream().filter(s->s.getStockName().equals(f.getStockName())).findFirst().orElse(null).getMoneyScId())); - } - } - } + moneyStockSuggestDTOS = moneyStockSuggestDTOS.stream().filter(f->StringUtils.isNotBlank(f.getStockName())).collect(Collectors.toList()); return moneyStockSuggestDTOS; } @@ -544,7 +535,7 @@ public class MoneyApiController { moneyStockSuggestDTOS.stream().filter(f->all.stream().anyMatch(s->s.getStockName().equals(f.getStockName()))) .forEach(f->f.setScId(all.stream().filter(s->s.getStockName().equals(f.getStockName())).findFirst().orElse(null).getMoneyScId())); } - List noScIdList = moneyStockSuggestDTOS.stream().filter(f->StringUtils.isBlank(f.getScId())).collect(Collectors.toList()); + /* List noScIdList = moneyStockSuggestDTOS.stream().filter(f->StringUtils.isBlank(f.getScId())).collect(Collectors.toList()); if(CollectionUtils.isNotEmpty(noScIdList)){ List dispIdList = noScIdList.stream().map(MoneyStockSuggestDTO::getDispId).collect(Collectors.toList()); List all1 = moneyStockRepository.findAll(QMoneyStockPO.moneyStockPO.selfDispId.in(dispIdList)); @@ -552,10 +543,13 @@ public class MoneyApiController { moneyStockSuggestDTOS.stream().filter(f->all1.stream().anyMatch(s->s.getSelfDispId().equals(f.getDispId()))) .forEach(f->f.setScId(all.stream().filter(s->s.getSelfDispId().equals(f.getDispId())).findFirst().orElse(null).getMoneyScId())); } - } + }*/ } } + moneyStockSuggestDTOS = moneyStockSuggestDTOS.stream().filter(f->StringUtils.isNotBlank(f.getStockName())).collect(Collectors.toList()); + + return moneyStockSuggestDTOS; } @@ -588,7 +582,7 @@ public class MoneyApiController { moneyStockSuggestDTOS.stream().filter(f->all.stream().anyMatch(s->s.getStockName().equals(f.getStockName()))) .forEach(f->f.setScId(all.stream().filter(s->s.getStockName().equals(f.getStockName())).findFirst().orElse(null).getMoneyScId())); } - List noScIdList = moneyStockSuggestDTOS.stream().filter(f->StringUtils.isBlank(f.getScId())).collect(Collectors.toList()); + /* List noScIdList = moneyStockSuggestDTOS.stream().filter(f->StringUtils.isBlank(f.getScId())).collect(Collectors.toList()); if(CollectionUtils.isNotEmpty(noScIdList)){ List dispIdList = noScIdList.stream().map(MoneyStockSuggestDTO::getDispId).collect(Collectors.toList()); List all1 = moneyStockRepository.findAll(QMoneyStockPO.moneyStockPO.selfDispId.in(dispIdList)); @@ -596,7 +590,7 @@ public class MoneyApiController { moneyStockSuggestDTOS.stream().filter(f->all1.stream().anyMatch(s->s.getSelfDispId().equals(f.getDispId()))) .forEach(f->f.setScId(all.stream().filter(s->s.getSelfDispId().equals(f.getDispId())).findFirst().orElse(null).getMoneyScId())); } - } + }*/ } } From 88baedb546d2d79730e7bcb0cb66b9b8ab0ef611 Mon Sep 17 00:00:00 2001 From: Achilles Date: Tue, 9 Jan 2024 11:57:47 +0800 Subject: [PATCH 22/27] =?UTF-8?q?actives=20=E6=8E=A5=E5=8F=A3=E8=B0=83?= =?UTF-8?q?=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/cn/stock/market/web/MoneyApiController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/cn/stock/market/web/MoneyApiController.java b/src/main/java/cn/stock/market/web/MoneyApiController.java index cbfbad1..d04a623 100644 --- a/src/main/java/cn/stock/market/web/MoneyApiController.java +++ b/src/main/java/cn/stock/market/web/MoneyApiController.java @@ -190,8 +190,8 @@ public class MoneyApiController { json1.put("symbol",data.getString("symbol")); json1.put("BSEID",data.getString("BSEID")); json1.put("NSEID",data.getString("NSEID")); - json1.put("LTH",data.getString("LTH")); - json1.put("LTL",data.getString("LTL")); + json1.put("LTH",data.getString("HP")); + json1.put("LTL",data.getString("LP")); json1.put("OPN",data.getString("OPN")); if(null!=moneyStock){ json1.put("id",moneyStock.getId()); From 32e65dc2c25ab112b034dddbb6611d2f9d363138 Mon Sep 17 00:00:00 2001 From: Achilles Date: Tue, 9 Jan 2024 13:40:09 +0800 Subject: [PATCH 23/27] =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../stock/market/web/MoneyApiController.java | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/main/java/cn/stock/market/web/MoneyApiController.java b/src/main/java/cn/stock/market/web/MoneyApiController.java index d04a623..1b17926 100644 --- a/src/main/java/cn/stock/market/web/MoneyApiController.java +++ b/src/main/java/cn/stock/market/web/MoneyApiController.java @@ -504,7 +504,18 @@ public class MoneyApiController { }else if(StringUtils.equals(stockType,"bse")){ moneyStockSuggestDTOS = bseGainer(); } + if(CollectionUtils.isNotEmpty(moneyStockSuggestDTOS)){ + List selfUlrList = moneyStockSuggestDTOS.stream().map(MoneyStockSuggestDTO::getStockName).collect(Collectors.toList()); + if(CollectionUtils.isNotEmpty(selfUlrList)){ + List all = moneyStockRepository.findAll(QMoneyStockPO.moneyStockPO.stockName.in(selfUlrList)); + if(CollectionUtils.isNotEmpty(all)){ + moneyStockSuggestDTOS.stream().filter(f->all.stream().anyMatch(s->s.getStockName().equals(f.getStockName()))) + .forEach(f->f.setScId(all.stream().filter(s->s.getStockName().equals(f.getStockName())).findFirst().orElse(null).getMoneyScId())); + } + } + } moneyStockSuggestDTOS = moneyStockSuggestDTOS.stream().filter(f->StringUtils.isNotBlank(f.getStockName())).collect(Collectors.toList()); + return moneyStockSuggestDTOS; } @@ -535,7 +546,7 @@ public class MoneyApiController { moneyStockSuggestDTOS.stream().filter(f->all.stream().anyMatch(s->s.getStockName().equals(f.getStockName()))) .forEach(f->f.setScId(all.stream().filter(s->s.getStockName().equals(f.getStockName())).findFirst().orElse(null).getMoneyScId())); } - /* List noScIdList = moneyStockSuggestDTOS.stream().filter(f->StringUtils.isBlank(f.getScId())).collect(Collectors.toList()); + List noScIdList = moneyStockSuggestDTOS.stream().filter(f->StringUtils.isBlank(f.getScId())).collect(Collectors.toList()); if(CollectionUtils.isNotEmpty(noScIdList)){ List dispIdList = noScIdList.stream().map(MoneyStockSuggestDTO::getDispId).collect(Collectors.toList()); List all1 = moneyStockRepository.findAll(QMoneyStockPO.moneyStockPO.selfDispId.in(dispIdList)); @@ -543,7 +554,7 @@ public class MoneyApiController { moneyStockSuggestDTOS.stream().filter(f->all1.stream().anyMatch(s->s.getSelfDispId().equals(f.getDispId()))) .forEach(f->f.setScId(all.stream().filter(s->s.getSelfDispId().equals(f.getDispId())).findFirst().orElse(null).getMoneyScId())); } - }*/ + } } } @@ -582,7 +593,7 @@ public class MoneyApiController { moneyStockSuggestDTOS.stream().filter(f->all.stream().anyMatch(s->s.getStockName().equals(f.getStockName()))) .forEach(f->f.setScId(all.stream().filter(s->s.getStockName().equals(f.getStockName())).findFirst().orElse(null).getMoneyScId())); } - /* List noScIdList = moneyStockSuggestDTOS.stream().filter(f->StringUtils.isBlank(f.getScId())).collect(Collectors.toList()); + List noScIdList = moneyStockSuggestDTOS.stream().filter(f->StringUtils.isBlank(f.getScId())).collect(Collectors.toList()); if(CollectionUtils.isNotEmpty(noScIdList)){ List dispIdList = noScIdList.stream().map(MoneyStockSuggestDTO::getDispId).collect(Collectors.toList()); List all1 = moneyStockRepository.findAll(QMoneyStockPO.moneyStockPO.selfDispId.in(dispIdList)); @@ -590,7 +601,7 @@ public class MoneyApiController { moneyStockSuggestDTOS.stream().filter(f->all1.stream().anyMatch(s->s.getSelfDispId().equals(f.getDispId()))) .forEach(f->f.setScId(all.stream().filter(s->s.getSelfDispId().equals(f.getDispId())).findFirst().orElse(null).getMoneyScId())); } - }*/ + } } } From 65656ef10b82ce454754c599d007161f1c07c40a Mon Sep 17 00:00:00 2001 From: Achilles Date: Tue, 9 Jan 2024 13:42:24 +0800 Subject: [PATCH 24/27] =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/cn/stock/market/web/MoneyApiController.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/cn/stock/market/web/MoneyApiController.java b/src/main/java/cn/stock/market/web/MoneyApiController.java index 1b17926..d25e600 100644 --- a/src/main/java/cn/stock/market/web/MoneyApiController.java +++ b/src/main/java/cn/stock/market/web/MoneyApiController.java @@ -504,6 +504,7 @@ public class MoneyApiController { }else if(StringUtils.equals(stockType,"bse")){ moneyStockSuggestDTOS = bseGainer(); } + moneyStockSuggestDTOS = moneyStockSuggestDTOS.stream().filter(f->StringUtils.isNotBlank(f.getStockName())).collect(Collectors.toList()); if(CollectionUtils.isNotEmpty(moneyStockSuggestDTOS)){ List selfUlrList = moneyStockSuggestDTOS.stream().map(MoneyStockSuggestDTO::getStockName).collect(Collectors.toList()); if(CollectionUtils.isNotEmpty(selfUlrList)){ @@ -514,8 +515,6 @@ public class MoneyApiController { } } } - moneyStockSuggestDTOS = moneyStockSuggestDTOS.stream().filter(f->StringUtils.isNotBlank(f.getStockName())).collect(Collectors.toList()); - return moneyStockSuggestDTOS; } @@ -537,6 +536,7 @@ public class MoneyApiController { }else if(StringUtils.equals(stockType,"bse")){ moneyStockSuggestDTOS = bseTopLoser(); } + moneyStockSuggestDTOS = moneyStockSuggestDTOS.stream().filter(f->StringUtils.isNotBlank(f.getStockName())).collect(Collectors.toList()); if(CollectionUtils.isNotEmpty(moneyStockSuggestDTOS)){ moneyStockSuggestDTOS.stream().forEach(f->f.setDispId(extractLastSegment(f.getStockUrl()))); List selfUlrList = moneyStockSuggestDTOS.stream().map(MoneyStockSuggestDTO::getStockName).collect(Collectors.toList()); @@ -558,7 +558,6 @@ public class MoneyApiController { } } - moneyStockSuggestDTOS = moneyStockSuggestDTOS.stream().filter(f->StringUtils.isNotBlank(f.getStockName())).collect(Collectors.toList()); return moneyStockSuggestDTOS; @@ -584,6 +583,7 @@ public class MoneyApiController { }else if(StringUtils.equals(stockType,"bse")){ moneyStockSuggestDTOS = bseActives(); } + moneyStockSuggestDTOS = moneyStockSuggestDTOS.stream().filter(f->StringUtils.isNotBlank(f.getStockName())).collect(Collectors.toList()); if(CollectionUtils.isNotEmpty(moneyStockSuggestDTOS)){ moneyStockSuggestDTOS.stream().forEach(f->f.setDispId(extractLastSegment(f.getStockUrl()))); List selfUlrList = moneyStockSuggestDTOS.stream().map(MoneyStockSuggestDTO::getStockName).collect(Collectors.toList()); From 53b4223370a320ce8f3a5098fd6180d54861b8b1 Mon Sep 17 00:00:00 2001 From: Achilles Date: Tue, 9 Jan 2024 15:01:39 +0800 Subject: [PATCH 25/27] =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../stock/market/web/MoneyApiController.java | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/main/java/cn/stock/market/web/MoneyApiController.java b/src/main/java/cn/stock/market/web/MoneyApiController.java index d25e600..2f04b8d 100644 --- a/src/main/java/cn/stock/market/web/MoneyApiController.java +++ b/src/main/java/cn/stock/market/web/MoneyApiController.java @@ -632,23 +632,23 @@ public class MoneyApiController { int countback = 5; if(StringUtils.equals("H",resolution)){ to = (long) (System.currentTimeMillis() / 1000); - from = to - (5 * 24 * 60 * 60 ); - countback = 10; - request.setResolution("60"); + from = to - (1 * 60 * 60 ); + countback = 60; + request.setResolution("1"); }else if(StringUtils.equals("D",resolution)){ to = (long) (System.currentTimeMillis() / 1000); - from = to - (10 * 24 * 60 * 60 ); - countback = 5; - request.setResolution("1D"); + from = to - (24 * 60 * 60 ); + countback = 9; + request.setResolution("60"); }else if(StringUtils.equals("W",resolution)){ to = (long) (System.currentTimeMillis() / 1000); - from = to - (15 * 24 * 60 * 60 ); - countback = 5; - request.setResolution("1W"); + from = to - (10 * 24 * 60 * 60 ); + countback = 7; + request.setResolution("1D"); }else if(StringUtils.equals("M",resolution)){ to = (long) (System.currentTimeMillis() / 1000); - from = to - (365 * 24 * 60 * 60 ); - countback = 10; + from = to - (35 * 24 * 60 * 60 ); + countback = 30; request.setResolution("1D"); } From c24f3a86fbeb65bfa52a898a40138feefa2ec485 Mon Sep 17 00:00:00 2001 From: Achilles Date: Tue, 9 Jan 2024 16:51:01 +0800 Subject: [PATCH 26/27] =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../stock/market/web/MoneyApiController.java | 155 +++++++++++------- 1 file changed, 94 insertions(+), 61 deletions(-) diff --git a/src/main/java/cn/stock/market/web/MoneyApiController.java b/src/main/java/cn/stock/market/web/MoneyApiController.java index 2f04b8d..238d26d 100644 --- a/src/main/java/cn/stock/market/web/MoneyApiController.java +++ b/src/main/java/cn/stock/market/web/MoneyApiController.java @@ -6,8 +6,11 @@ import cn.stock.market.domain.basic.repository.MoneyStockRepository; import cn.stock.market.dto.StockHistoryRequest; import cn.stock.market.dto.StockHistoryResponse; import cn.stock.market.infrastructure.db.po.QMoneyStockPO; +import cn.stock.market.utils.RequestCacheUtils; import cn.stock.market.utils.ServerResponse; import com.alibaba.fastjson.JSONObject; +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; import com.google.common.collect.Lists; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; @@ -36,6 +39,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; /** @@ -499,21 +503,30 @@ public class MoneyApiController { @ResponseBody public List getTopGainer(@RequestParam String stockType) { List moneyStockSuggestDTOS = null; - if(StringUtils.equals(stockType,"nse")){ - moneyStockSuggestDTOS = nseGainer(); - }else if(StringUtils.equals(stockType,"bse")){ - moneyStockSuggestDTOS = bseGainer(); - } - moneyStockSuggestDTOS = moneyStockSuggestDTOS.stream().filter(f->StringUtils.isNotBlank(f.getStockName())).collect(Collectors.toList()); - if(CollectionUtils.isNotEmpty(moneyStockSuggestDTOS)){ - List selfUlrList = moneyStockSuggestDTOS.stream().map(MoneyStockSuggestDTO::getStockName).collect(Collectors.toList()); - if(CollectionUtils.isNotEmpty(selfUlrList)){ - List all = moneyStockRepository.findAll(QMoneyStockPO.moneyStockPO.stockName.in(selfUlrList)); - if(CollectionUtils.isNotEmpty(all)){ - moneyStockSuggestDTOS.stream().filter(f->all.stream().anyMatch(s->s.getStockName().equals(f.getStockName()))) - .forEach(f->f.setScId(all.stream().filter(s->s.getStockName().equals(f.getStockName())).findFirst().orElse(null).getMoneyScId())); - } + // 尝试从缓存中获取结果 + moneyStockSuggestDTOS = gainerStockSuggestCache.getIfPresent(stockType); + + if (moneyStockSuggestDTOS == null) { + // 缓存未命中,执行业务查询 + if (StringUtils.equals(stockType, "nse")) { + moneyStockSuggestDTOS = nseGainer(); + } else if (StringUtils.equals(stockType, "bse")) { + moneyStockSuggestDTOS = bseGainer(); } + + moneyStockSuggestDTOS = moneyStockSuggestDTOS.stream().filter(f->StringUtils.isNotBlank(f.getStockName())).collect(Collectors.toList()); + if(CollectionUtils.isNotEmpty(moneyStockSuggestDTOS)){ + List selfUlrList = moneyStockSuggestDTOS.stream().map(MoneyStockSuggestDTO::getStockName).collect(Collectors.toList()); + if(CollectionUtils.isNotEmpty(selfUlrList)){ + List all = moneyStockRepository.findAll(QMoneyStockPO.moneyStockPO.stockName.in(selfUlrList)); + if(CollectionUtils.isNotEmpty(all)){ + moneyStockSuggestDTOS.stream().filter(f->all.stream().anyMatch(s->s.getStockName().equals(f.getStockName()))) + .forEach(f->f.setScId(all.stream().filter(s->s.getStockName().equals(f.getStockName())).findFirst().orElse(null).getMoneyScId())); + } + } + gainerStockSuggestCache.put(stockType, moneyStockSuggestDTOS); + } + // 将结果放入缓存 } return moneyStockSuggestDTOS; } @@ -531,35 +544,36 @@ public class MoneyApiController { @ResponseBody public List getTopLoser(@RequestParam String stockType) { List moneyStockSuggestDTOS = null; - if(StringUtils.equals(stockType,"nse")){ - moneyStockSuggestDTOS = nseTopLoser(); - }else if(StringUtils.equals(stockType,"bse")){ - moneyStockSuggestDTOS = bseTopLoser(); - } - moneyStockSuggestDTOS = moneyStockSuggestDTOS.stream().filter(f->StringUtils.isNotBlank(f.getStockName())).collect(Collectors.toList()); - if(CollectionUtils.isNotEmpty(moneyStockSuggestDTOS)){ - moneyStockSuggestDTOS.stream().forEach(f->f.setDispId(extractLastSegment(f.getStockUrl()))); - List selfUlrList = moneyStockSuggestDTOS.stream().map(MoneyStockSuggestDTO::getStockName).collect(Collectors.toList()); - if(CollectionUtils.isNotEmpty(selfUlrList)){ - List all = moneyStockRepository.findAll(QMoneyStockPO.moneyStockPO.stockName.in(selfUlrList)); - if(CollectionUtils.isNotEmpty(all)){ - moneyStockSuggestDTOS.stream().filter(f->all.stream().anyMatch(s->s.getStockName().equals(f.getStockName()))) - .forEach(f->f.setScId(all.stream().filter(s->s.getStockName().equals(f.getStockName())).findFirst().orElse(null).getMoneyScId())); - } - List noScIdList = moneyStockSuggestDTOS.stream().filter(f->StringUtils.isBlank(f.getScId())).collect(Collectors.toList()); - if(CollectionUtils.isNotEmpty(noScIdList)){ - List dispIdList = noScIdList.stream().map(MoneyStockSuggestDTO::getDispId).collect(Collectors.toList()); - List all1 = moneyStockRepository.findAll(QMoneyStockPO.moneyStockPO.selfDispId.in(dispIdList)); - if(CollectionUtils.isNotEmpty(all1)){ - moneyStockSuggestDTOS.stream().filter(f->all1.stream().anyMatch(s->s.getSelfDispId().equals(f.getDispId()))) - .forEach(f->f.setScId(all.stream().filter(s->s.getSelfDispId().equals(f.getDispId())).findFirst().orElse(null).getMoneyScId())); + moneyStockSuggestDTOS = loserStockSuggestCache.getIfPresent(stockType); + if(null==moneyStockSuggestDTOS){ + if(StringUtils.equals(stockType,"nse")){ + moneyStockSuggestDTOS = nseTopLoser(); + }else if(StringUtils.equals(stockType,"bse")){ + moneyStockSuggestDTOS = bseTopLoser(); + } + moneyStockSuggestDTOS = moneyStockSuggestDTOS.stream().filter(f->StringUtils.isNotBlank(f.getStockName())).collect(Collectors.toList()); + if(CollectionUtils.isNotEmpty(moneyStockSuggestDTOS)){ + moneyStockSuggestDTOS.stream().forEach(f->f.setDispId(extractLastSegment(f.getStockUrl()))); + List selfUlrList = moneyStockSuggestDTOS.stream().map(MoneyStockSuggestDTO::getStockName).collect(Collectors.toList()); + if(CollectionUtils.isNotEmpty(selfUlrList)){ + List all = moneyStockRepository.findAll(QMoneyStockPO.moneyStockPO.stockName.in(selfUlrList)); + if(CollectionUtils.isNotEmpty(all)){ + moneyStockSuggestDTOS.stream().filter(f->all.stream().anyMatch(s->s.getStockName().equals(f.getStockName()))) + .forEach(f->f.setScId(all.stream().filter(s->s.getStockName().equals(f.getStockName())).findFirst().orElse(null).getMoneyScId())); + } + List noScIdList = moneyStockSuggestDTOS.stream().filter(f->StringUtils.isBlank(f.getScId())).collect(Collectors.toList()); + if(CollectionUtils.isNotEmpty(noScIdList)){ + List dispIdList = noScIdList.stream().map(MoneyStockSuggestDTO::getDispId).collect(Collectors.toList()); + List all1 = moneyStockRepository.findAll(QMoneyStockPO.moneyStockPO.selfDispId.in(dispIdList)); + if(CollectionUtils.isNotEmpty(all1)){ + moneyStockSuggestDTOS.stream().filter(f->all1.stream().anyMatch(s->s.getSelfDispId().equals(f.getDispId()))) + .forEach(f->f.setScId(all.stream().filter(s->s.getSelfDispId().equals(f.getDispId())).findFirst().orElse(null).getMoneyScId())); + } } } + loserStockSuggestCache.put(stockType, moneyStockSuggestDTOS); } } - - - return moneyStockSuggestDTOS; } @@ -578,30 +592,34 @@ public class MoneyApiController { @ResponseBody public List getTopActive(@RequestParam String stockType) { List moneyStockSuggestDTOS = null; - if(StringUtils.equals(stockType,"nse")){ - moneyStockSuggestDTOS = nseActives(); - }else if(StringUtils.equals(stockType,"bse")){ - moneyStockSuggestDTOS = bseActives(); - } - moneyStockSuggestDTOS = moneyStockSuggestDTOS.stream().filter(f->StringUtils.isNotBlank(f.getStockName())).collect(Collectors.toList()); - if(CollectionUtils.isNotEmpty(moneyStockSuggestDTOS)){ - moneyStockSuggestDTOS.stream().forEach(f->f.setDispId(extractLastSegment(f.getStockUrl()))); - List selfUlrList = moneyStockSuggestDTOS.stream().map(MoneyStockSuggestDTO::getStockName).collect(Collectors.toList()); - if(CollectionUtils.isNotEmpty(selfUlrList)){ - List all = moneyStockRepository.findAll(QMoneyStockPO.moneyStockPO.stockName.in(selfUlrList)); - if(CollectionUtils.isNotEmpty(all)){ - moneyStockSuggestDTOS.stream().filter(f->all.stream().anyMatch(s->s.getStockName().equals(f.getStockName()))) - .forEach(f->f.setScId(all.stream().filter(s->s.getStockName().equals(f.getStockName())).findFirst().orElse(null).getMoneyScId())); - } - List noScIdList = moneyStockSuggestDTOS.stream().filter(f->StringUtils.isBlank(f.getScId())).collect(Collectors.toList()); - if(CollectionUtils.isNotEmpty(noScIdList)){ - List dispIdList = noScIdList.stream().map(MoneyStockSuggestDTO::getDispId).collect(Collectors.toList()); - List all1 = moneyStockRepository.findAll(QMoneyStockPO.moneyStockPO.selfDispId.in(dispIdList)); - if(CollectionUtils.isNotEmpty(all1)){ - moneyStockSuggestDTOS.stream().filter(f->all1.stream().anyMatch(s->s.getSelfDispId().equals(f.getDispId()))) - .forEach(f->f.setScId(all.stream().filter(s->s.getSelfDispId().equals(f.getDispId())).findFirst().orElse(null).getMoneyScId())); + moneyStockSuggestDTOS = activesStockSuggestCache.getIfPresent(stockType); + if(moneyStockSuggestDTOS ==null){ + if(StringUtils.equals(stockType,"nse")){ + moneyStockSuggestDTOS = nseActives(); + }else if(StringUtils.equals(stockType,"bse")){ + moneyStockSuggestDTOS = bseActives(); + } + moneyStockSuggestDTOS = moneyStockSuggestDTOS.stream().filter(f->StringUtils.isNotBlank(f.getStockName())).collect(Collectors.toList()); + if(CollectionUtils.isNotEmpty(moneyStockSuggestDTOS)){ + moneyStockSuggestDTOS.stream().forEach(f->f.setDispId(extractLastSegment(f.getStockUrl()))); + List selfUlrList = moneyStockSuggestDTOS.stream().map(MoneyStockSuggestDTO::getStockName).collect(Collectors.toList()); + if(CollectionUtils.isNotEmpty(selfUlrList)){ + List all = moneyStockRepository.findAll(QMoneyStockPO.moneyStockPO.stockName.in(selfUlrList)); + if(CollectionUtils.isNotEmpty(all)){ + moneyStockSuggestDTOS.stream().filter(f->all.stream().anyMatch(s->s.getStockName().equals(f.getStockName()))) + .forEach(f->f.setScId(all.stream().filter(s->s.getStockName().equals(f.getStockName())).findFirst().orElse(null).getMoneyScId())); + } + List noScIdList = moneyStockSuggestDTOS.stream().filter(f->StringUtils.isBlank(f.getScId())).collect(Collectors.toList()); + if(CollectionUtils.isNotEmpty(noScIdList)){ + List dispIdList = noScIdList.stream().map(MoneyStockSuggestDTO::getDispId).collect(Collectors.toList()); + List all1 = moneyStockRepository.findAll(QMoneyStockPO.moneyStockPO.selfDispId.in(dispIdList)); + if(CollectionUtils.isNotEmpty(all1)){ + moneyStockSuggestDTOS.stream().filter(f->all1.stream().anyMatch(s->s.getSelfDispId().equals(f.getDispId()))) + .forEach(f->f.setScId(all.stream().filter(s->s.getSelfDispId().equals(f.getDispId())).findFirst().orElse(null).getMoneyScId())); + } } } + activesStockSuggestCache.put(stockType, moneyStockSuggestDTOS); } } @@ -724,4 +742,19 @@ public class MoneyApiController { bseTopLoser(); } + private Cache> gainerStockSuggestCache = CacheBuilder.newBuilder() + .maximumSize(100) // 设置缓存的最大大小 + .expireAfterWrite(1, TimeUnit.HOURS) // 设置缓存条目的过期时间 + .build(); + + private Cache> loserStockSuggestCache = CacheBuilder.newBuilder() + .maximumSize(100) // 设置缓存的最大大小 + .expireAfterWrite(1, TimeUnit.HOURS) // 设置缓存条目的过期时间 + .build(); + + private Cache> activesStockSuggestCache = CacheBuilder.newBuilder() + .maximumSize(100) // 设置缓存的最大大小 + .expireAfterWrite(1, TimeUnit.MINUTES) // 设置缓存条目的过期时间 + .build(); + } From 175bc87824638fa1a6d84115354583f9386b8d5d Mon Sep 17 00:00:00 2001 From: Achilles Date: Tue, 9 Jan 2024 20:18:06 +0800 Subject: [PATCH 27/27] =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/cn/stock/market/web/MoneyApiController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/cn/stock/market/web/MoneyApiController.java b/src/main/java/cn/stock/market/web/MoneyApiController.java index 238d26d..7c6846f 100644 --- a/src/main/java/cn/stock/market/web/MoneyApiController.java +++ b/src/main/java/cn/stock/market/web/MoneyApiController.java @@ -754,7 +754,7 @@ public class MoneyApiController { private Cache> activesStockSuggestCache = CacheBuilder.newBuilder() .maximumSize(100) // 设置缓存的最大大小 - .expireAfterWrite(1, TimeUnit.MINUTES) // 设置缓存条目的过期时间 + .expireAfterWrite(30, TimeUnit.MINUTES) // 设置缓存条目的过期时间 .build(); }