Merge branch 'feature/update_bseindia_detail' into 'develop'

update chart

See merge request india/india_market_java!52
This commit is contained in:
vpckiet
2024-12-10 12:55:38 +00:00

View File

@@ -6,9 +6,7 @@ import cn.stock.market.domain.basic.entity.MoneyStock;
import cn.stock.market.domain.basic.entity.OptionalStock; import cn.stock.market.domain.basic.entity.OptionalStock;
import cn.stock.market.domain.basic.repository.MoneyStockRepository; import cn.stock.market.domain.basic.repository.MoneyStockRepository;
import cn.stock.market.domain.basic.repository.OptionalStockRepository; import cn.stock.market.domain.basic.repository.OptionalStockRepository;
import cn.stock.market.dto.OptionalStockResponse; import cn.stock.market.dto.*;
import cn.stock.market.dto.StockHistoryRequest;
import cn.stock.market.dto.StockHistoryResponse;
import cn.stock.market.dto.query.StockChartDto; import cn.stock.market.dto.query.StockChartDto;
import cn.stock.market.infrastructure.db.po.QMoneyStockPO; import cn.stock.market.infrastructure.db.po.QMoneyStockPO;
import cn.stock.market.utils.HttpRequest; import cn.stock.market.utils.HttpRequest;
@@ -21,6 +19,9 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.cache.Cache; import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheBuilder;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiImplicitParams;
@@ -54,6 +55,8 @@ import java.io.IOException;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.net.URLEncoder; import java.net.URLEncoder;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Instant; import java.time.Instant;
import java.time.YearMonth; import java.time.YearMonth;
import java.time.ZoneId; import java.time.ZoneId;
@@ -354,6 +357,30 @@ public class MoneyApiController {
return volume.toString(); return volume.toString();
} }
private String getChartData(String scripcode, String resolution) {
String url = "https://charting.bseindia.com/charting/RestDataProvider.svc/getDat?exch=B&type=b&mode=bseL&fromdate=01-01-1991-01%3A01%3A00-AM&scode=" + scripcode;
if (resolution.equals("H")) {
url = "https://charting.bseindia.com/charting/RestDataProvider.svc/getDatI?exch=B&type=b&mode=bseL&fromdate=01-01-1991-01%3A01%3A00-AM&scode=" + scripcode;
}
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.add("accept", "application/json, text/plain, */*");
headers.add("accept-language", "en-US,en;q=0.9,vi;q=0.8");
headers.add("origin", "https://www.bseindia.com");
headers.add("referer", "https://www.bseindia.com/");
headers.add("sec-ch-ua", "\"Google Chrome\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"");
headers.add("sec-ch-ua-mobile", "?0");
headers.add("sec-ch-ua-platform", "\"Windows\"");
headers.add("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36");
HttpEntity<String> entity = new HttpEntity<>(headers);
ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.POST, entity, String.class);
return response.getBody();
}
private static List<MoneyStockSuggestDTO> nseActives() { private static List<MoneyStockSuggestDTO> nseActives() {
List<MoneyStockSuggestDTO> list = new ArrayList<>(); List<MoneyStockSuggestDTO> list = new ArrayList<>();
String url = "https://www.moneycontrol.com/stocks/marketstats/nse-mostactive-stocks/nifty-50-9/"; String url = "https://www.moneycontrol.com/stocks/marketstats/nse-mostactive-stocks/nifty-50-9/";
@@ -769,6 +796,33 @@ public class MoneyApiController {
return moneyStockSuggestDTOS; return moneyStockSuggestDTOS;
} }
private static void addToListDouble(List<Double> list, String value) {
String[] values = value.split(",");
for (String v : values) {
list.add(Double.parseDouble(v));
}
}
private static void addToList(List<Long> list, String value) {
String[] values = value.split(",");
for (String v : values) {
list.add(Math.round(Double.parseDouble(v)));
}
}
private static void addDatesToList(List<Long> list, String value) {
String[] dates = value.split(",");
SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy hh:mm:ss a", Locale.US);
for (String dateStr : dates) {
try {
Date date = sdf.parse(dateStr);
list.add(date.getTime());
} catch (ParseException e) {
e.printStackTrace();
}
}
}
@GetMapping({"/market/api/market/money/history/kLine", "/api/market/money/history/kLine"}) @GetMapping({"/market/api/market/money/history/kLine", "/api/market/money/history/kLine"})
@ApiOperation(value = "获取kline的money数据源", notes = "获取kline的money数据源", response = StockHistoryResponse.class) @ApiOperation(value = "获取kline的money数据源", notes = "获取kline的money数据源", response = StockHistoryResponse.class)
@@ -785,6 +839,69 @@ public class MoneyApiController {
public ResponseEntity<StockHistoryResponse> getStockHistory(@RequestParam String symbol, public ResponseEntity<StockHistoryResponse> getStockHistory(@RequestParam String symbol,
@RequestParam String resolution @RequestParam String resolution
) { ) {
MoneyStock moneyStock1 = moneyStockRepository.findOne(
QMoneyStockPO.moneyStockPO.moneyScId.eq(symbol)
.and(QMoneyStockPO.moneyStockPO.isLock.eq(0))
.and(QMoneyStockPO.moneyStockPO.isShow.eq(0)))
.orElse(null);
if (moneyStock1 != null) {
String json = this.getChartData(moneyStock1.getNseIndiaId(), resolution);
Gson gson = new Gson();
JsonObject outerJson = gson.fromJson(json, JsonObject.class);
String innerJsonString;
if (resolution.equals("H")) {
innerJsonString = outerJson.get("getDatIResult").getAsString();
} else {
innerJsonString = outerJson.get("getDatResult").getAsString();
}
JsonObject innerJson = gson.fromJson(innerJsonString, JsonObject.class);
JsonArray dataInputValues = innerJson.getAsJsonArray("DataInputValues");
List<Double> openList = new ArrayList<>();
List<Double> highList = new ArrayList<>();
List<Double> lowList = new ArrayList<>();
List<Double> closeList = new ArrayList<>();
List<Long> volumeList = new ArrayList<>();
List<Long> dateList = new ArrayList<>();
if (dataInputValues.size() > 0) {
JsonObject dataObject = dataInputValues.get(0).getAsJsonObject();
JsonArray openArray = dataObject.getAsJsonArray("OpenData");
JsonArray highArray = dataObject.getAsJsonArray("HighData");
JsonArray lowArray = dataObject.getAsJsonArray("LowData");
JsonArray closeArray = dataObject.getAsJsonArray("CloseData");
JsonArray volumeArray = dataObject.getAsJsonArray("VolumeData");
JsonArray dateArray = dataObject.getAsJsonArray("DateData");
openArray.forEach(o -> addToListDouble(openList, o.getAsJsonObject().get("Open").getAsString()));
highArray.forEach(h -> addToListDouble(highList, h.getAsJsonObject().get("High").getAsString()));
lowArray.forEach(l -> addToListDouble(lowList, l.getAsJsonObject().get("Low").getAsString()));
closeArray.forEach(c -> addToListDouble(closeList, c.getAsJsonObject().get("Close").getAsString()));
volumeArray.forEach(v -> addToList(volumeList, v.getAsJsonObject().get("Volume").getAsString()));
dateArray.forEach(d -> addDatesToList(dateList, d.getAsJsonObject().get("Date").getAsString()));
StockHistoryResponse response = new StockHistoryResponse();
response.setS("ok");
response.setT(dateList);
response.setO(openList);
response.setH(highList);
response.setL(lowList);
response.setC(closeList);
response.setV(volumeList);
return ResponseEntity.ok(response);
}
}
// 向外部API发起请求并获取响应 // 向外部API发起请求并获取响应
StockHistoryRequest request = new StockHistoryRequest(); StockHistoryRequest request = new StockHistoryRequest();
request.setSymbol(symbol); request.setSymbol(symbol);