|
|
@@ -43,6 +43,7 @@ import java.util.*;
|
|
|
import java.util.concurrent.*;
|
|
|
import java.util.function.Function;
|
|
|
import java.util.stream.Collectors;
|
|
|
+import java.util.stream.Stream;
|
|
|
|
|
|
/**
|
|
|
* Coin ServiceImpl
|
|
|
@@ -193,6 +194,88 @@ public class CoinServiceImpl implements CoinService {
|
|
|
log.warn("syncData4TraderList 结束:time={},totalNum={}", stopWatch.getTotalTimeSeconds(), totalNum);
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void syncCoinmarketcapCMap() {
|
|
|
+ StopWatch stopWatch = new StopWatch();
|
|
|
+ stopWatch.start();
|
|
|
+
|
|
|
+ String coinmarketcapApikey = InitRunner.dicCodeMap.get("coinmarketcap_apikey").getCodeValue();
|
|
|
+ String coinmarketcapIdmapUrl = InitRunner.dicCodeMap.get("coinmarketcap_idmap_url").getCodeValue();
|
|
|
+ String coinmarketcapIdmapParams4listingStatus = InitRunner.dicCodeMap.get("coinmarketcap_idmap_params_listing_status").getCodeValue();
|
|
|
+ String coinmarketcapIdmapParams4aux = InitRunner.dicCodeMap.get("coinmarketcap_idmap_params_aux").getCodeValue();
|
|
|
+ Map<String, String> headerMap = new HashMap<>();
|
|
|
+ headerMap.put("Accept", "application/json");
|
|
|
+ headerMap.put("Accept-Encoding", "deflate, gzip");
|
|
|
+ headerMap.put("X-CMC_PRO_API_KEY", coinmarketcapApikey);
|
|
|
+
|
|
|
+ String[] listingStatusArr = coinmarketcapIdmapParams4listingStatus.split(",");
|
|
|
+ Map<String, String> paramMap = new LinkedHashMap<>();
|
|
|
+ int MAX_NUMBER = 1000;
|
|
|
+ int MAX_NUMBER2 = 5000;
|
|
|
+ Long totalNum = 0L;
|
|
|
+ for (String listingStatus : listingStatusArr) {
|
|
|
+ paramMap.put("listing_status", listingStatus);
|
|
|
+ paramMap.put("aux", coinmarketcapIdmapParams4aux);
|
|
|
+
|
|
|
+ try {
|
|
|
+ int j = 0;
|
|
|
+ Long totalNum2 = 0L;
|
|
|
+ for (; ; ) {
|
|
|
+ Thread.sleep(3000L);
|
|
|
+
|
|
|
+ j++;
|
|
|
+
|
|
|
+ paramMap.put("start", String.valueOf((j - 1) * MAX_NUMBER2 + 1));
|
|
|
+ paramMap.put("limit", String.valueOf(MAX_NUMBER2));
|
|
|
+
|
|
|
+ Connection.Response response = JsoupUtil.requestBody(coinmarketcapIdmapUrl, JsoupUtil.HTTP_GET, InitRunner.proxy, headerMap, paramMap);
|
|
|
+ JSONObject result = JSONObject.parseObject(response.body());
|
|
|
+ JSONArray dataJA = result.getJSONArray("data");
|
|
|
+
|
|
|
+ List<CoinCmcMap> cmcMapList = new ArrayList<>();
|
|
|
+ CoinCmcMap coinCmcMap;
|
|
|
+ for (int i = 0; i < dataJA.size(); i++) {
|
|
|
+ JSONObject dataJO = dataJA.getJSONObject(i);
|
|
|
+
|
|
|
+ coinCmcMap = new CoinCmcMap();
|
|
|
+ coinCmcMap.setCmcId(dataJO.getLong("id"));
|
|
|
+ coinCmcMap.setCmcRank(dataJO.getLong("rank"));
|
|
|
+ coinCmcMap.setName(dataJO.getString("name"));
|
|
|
+ coinCmcMap.setSymbol(dataJO.getString("symbol"));
|
|
|
+ coinCmcMap.setSlug(dataJO.getString("slug"));
|
|
|
+ coinCmcMap.setIsActive(dataJO.getInteger("is_active"));
|
|
|
+ coinCmcMap.setStatus(dataJO.getString("status"));
|
|
|
+ coinCmcMap.setFirstHistoricalData(DateUtils.stringutcToLocalDateTime(dataJO.getString("first_historical_data")));
|
|
|
+ coinCmcMap.setLastHistoricalData(DateUtils.stringutcToLocalDateTime(dataJO.getString("last_historical_data")));
|
|
|
+ coinCmcMap.setPlatform(dataJO.getString("platform"));
|
|
|
+
|
|
|
+ cmcMapList.add(coinCmcMap);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 新增或者更新
|
|
|
+ Stream.iterate(0, n -> n + 1).limit((cmcMapList.size() + MAX_NUMBER - 1) / MAX_NUMBER)
|
|
|
+ .forEach(i -> {
|
|
|
+ List<CoinCmcMap> list = cmcMapList.stream().skip((long) i * MAX_NUMBER).limit(MAX_NUMBER).collect(Collectors.toList());
|
|
|
+ coinMapper.insertCmcMapList(list);
|
|
|
+ });
|
|
|
+ totalNum += cmcMapList.size();
|
|
|
+ totalNum2 += cmcMapList.size();
|
|
|
+
|
|
|
+ if (dataJA.size() < MAX_NUMBER2) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ log.warn("syncCoinmarketcapCMap {} success,totalNum={}", listingStatus, totalNum2);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("syncCoinmarketcapCMap {} error", listingStatus, e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ log.warn("syncCoinmarketcapCMap 结束:time={},totalNum={}", stopWatch.getTotalTimeSeconds(), totalNum);
|
|
|
+ }
|
|
|
+
|
|
|
@Override
|
|
|
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
|
|
|
public void syncData4TraderListSub(JSONArray dataList) {
|
|
|
@@ -719,29 +802,53 @@ public class CoinServiceImpl implements CoinService {
|
|
|
|
|
|
JSONObject marketData = jsonObject.getJSONObject("market_data");
|
|
|
// 总市值排名
|
|
|
- Integer totalMarketRanking = marketData.getInteger("market_cap_rank");
|
|
|
- coinWatchlist.setTotalMarketRanking(totalMarketRanking);
|
|
|
+ if (marketData.containsKey("market_cap_rank") && null != marketData.get("market_cap_rank")) {
|
|
|
+ Integer totalMarketRanking = marketData.getInteger("market_cap_rank");
|
|
|
+ coinWatchlist.setTotalMarketRanking(totalMarketRanking);
|
|
|
+ }
|
|
|
+
|
|
|
// 总市值
|
|
|
- BigDecimal totalMarketValue = marketData.getJSONObject("market_cap").getBigDecimal("usd");
|
|
|
- coinWatchlist.setTotalMarketValue(totalMarketValue);
|
|
|
+ if (marketData.containsKey("market_cap") && null != marketData.get("market_cap")) {
|
|
|
+ BigDecimal totalMarketValue = marketData.getJSONObject("market_cap").getBigDecimal("usd");
|
|
|
+ coinWatchlist.setTotalMarketValue(totalMarketValue);
|
|
|
+ }
|
|
|
+
|
|
|
// 市场价格
|
|
|
- String markPrice = marketData.getJSONObject("current_price").getString("usd");
|
|
|
- coinWatchlist.setMarkPrice(markPrice);
|
|
|
+ if (marketData.containsKey("current_price") && null != marketData.get("current_price")) {
|
|
|
+ String markPrice = marketData.getJSONObject("current_price").getString("usd");
|
|
|
+ coinWatchlist.setMarkPrice(markPrice);
|
|
|
+ }
|
|
|
+
|
|
|
// 历史最高价格
|
|
|
- String highestHistoricalPrice = marketData.getJSONObject("ath").getString("usd");
|
|
|
- coinWatchlist.setHighestHistoricalPrice(highestHistoricalPrice);
|
|
|
+ if (marketData.containsKey("ath") && null != marketData.get("ath")) {
|
|
|
+ String highestHistoricalPrice = marketData.getJSONObject("ath").getString("usd");
|
|
|
+ coinWatchlist.setHighestHistoricalPrice(highestHistoricalPrice);
|
|
|
+ }
|
|
|
+
|
|
|
// 历史最高日期
|
|
|
- LocalDate highestHistoricalDate = LocalDate.parse(marketData.getJSONObject("ath_date").getString("usd"), DateUtils.utcTimeFormatter);
|
|
|
- coinWatchlist.setHighestHistoricalDate(highestHistoricalDate);
|
|
|
+ if (marketData.containsKey("ath_date") && null != marketData.get("ath_date")) {
|
|
|
+ LocalDate highestHistoricalDate = LocalDate.parse(marketData.getJSONObject("ath_date").getString("usd"), DateUtils.utcTimeFormatter);
|
|
|
+ coinWatchlist.setHighestHistoricalDate(highestHistoricalDate);
|
|
|
+ }
|
|
|
+
|
|
|
// 历史最低价格
|
|
|
- String lowestHistoricalPrice = marketData.getJSONObject("atl").getString("usd");
|
|
|
- coinWatchlist.setLowestHistoricalPrice(lowestHistoricalPrice);
|
|
|
+ if (marketData.containsKey("atl") && null != marketData.get("atl")) {
|
|
|
+ String lowestHistoricalPrice = marketData.getJSONObject("atl").getString("usd");
|
|
|
+ coinWatchlist.setLowestHistoricalPrice(lowestHistoricalPrice);
|
|
|
+ }
|
|
|
+
|
|
|
// 历史最低日期
|
|
|
- LocalDate lowestHistoricalDate = LocalDate.parse(marketData.getJSONObject("atl_date").getString("usd"), DateUtils.utcTimeFormatter);
|
|
|
- coinWatchlist.setLowestHistoricalDate(lowestHistoricalDate);
|
|
|
+ if (marketData.containsKey("atl_date") && null != marketData.get("atl_date")) {
|
|
|
+ LocalDate lowestHistoricalDate = LocalDate.parse(marketData.getJSONObject("atl_date").getString("usd"), DateUtils.utcTimeFormatter);
|
|
|
+ coinWatchlist.setLowestHistoricalDate(lowestHistoricalDate);
|
|
|
+ }
|
|
|
+
|
|
|
// 涨幅倍数
|
|
|
- BigDecimal increaseMultiple = new BigDecimal(highestHistoricalPrice).divide(new BigDecimal(lowestHistoricalPrice), 0, RoundingMode.HALF_UP);
|
|
|
- coinWatchlist.setIncreaseMultiple(increaseMultiple.intValue());
|
|
|
+ if (StringUtils.isNotEmpty(coinWatchlist.getHighestHistoricalPrice()) && StringUtils.isNotEmpty(coinWatchlist.getLowestHistoricalPrice())) {
|
|
|
+ BigDecimal increaseMultiple = new BigDecimal(coinWatchlist.getHighestHistoricalPrice()).divide(new BigDecimal(coinWatchlist.getLowestHistoricalPrice()), 0, RoundingMode.HALF_UP);
|
|
|
+ coinWatchlist.setIncreaseMultiple(increaseMultiple.intValue());
|
|
|
+ }
|
|
|
+
|
|
|
// 发行日期
|
|
|
// 发行天数
|
|
|
if (coinWatchlist.getIssuingDate() != null) {
|