fix: 修复日线数据采集时出现null值的情况
This commit is contained in:
@@ -5,6 +5,7 @@ import com.lanyuanxiaoyao.service.template.entity.SimpleEntity;
|
|||||||
import jakarta.persistence.Column;
|
import jakarta.persistence.Column;
|
||||||
import jakarta.persistence.Entity;
|
import jakarta.persistence.Entity;
|
||||||
import jakarta.persistence.EntityListeners;
|
import jakarta.persistence.EntityListeners;
|
||||||
|
import jakarta.persistence.JoinColumn;
|
||||||
import jakarta.persistence.ManyToOne;
|
import jakarta.persistence.ManyToOne;
|
||||||
import jakarta.persistence.Table;
|
import jakarta.persistence.Table;
|
||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
@@ -53,6 +54,7 @@ public class Daily extends SimpleEntity {
|
|||||||
private Double factor;
|
private Double factor;
|
||||||
|
|
||||||
@ManyToOne
|
@ManyToOne
|
||||||
|
@JoinColumn(nullable = false)
|
||||||
@ToString.Exclude
|
@ToString.Exclude
|
||||||
private Stock stock;
|
private Stock stock;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,4 +11,7 @@ import org.springframework.stereotype.Repository;
|
|||||||
public interface DailyRepository extends SimpleRepository<Daily> {
|
public interface DailyRepository extends SimpleRepository<Daily> {
|
||||||
@Query("select distinct daily.tradeDate from Daily daily")
|
@Query("select distinct daily.tradeDate from Daily daily")
|
||||||
List<LocalDate> findDistinctTradeDate();
|
List<LocalDate> findDistinctTradeDate();
|
||||||
|
|
||||||
|
@Query("select distinct daily.tradeDate from Daily daily where daily.stock.id = ?1")
|
||||||
|
List<LocalDate> findDistinctTradeDateByStockId(Long stockId);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,4 +19,8 @@ public class DailyService extends SimpleServiceSupport<Daily> {
|
|||||||
public List<LocalDate> findDistinctTradeDate() {
|
public List<LocalDate> findDistinctTradeDate() {
|
||||||
return dailyRepository.findDistinctTradeDate();
|
return dailyRepository.findDistinctTradeDate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<LocalDate> findDistinctTradeDateByStockId(Long stockId) {
|
||||||
|
return dailyRepository.findDistinctTradeDateByStockId(stockId);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
package com.lanyuanxiaoyao.leopard.server.service.task;
|
package com.lanyuanxiaoyao.leopard.server.service.task;
|
||||||
|
|
||||||
import cn.hutool.core.thread.ThreadUtil;
|
|
||||||
import cn.hutool.core.util.ObjectUtil;
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.core.util.StrUtil;
|
||||||
import com.lanyuanxiaoyao.leopard.server.entity.Daily;
|
import com.lanyuanxiaoyao.leopard.server.entity.Daily;
|
||||||
@@ -52,50 +51,49 @@ public class UpdateDailyNode extends NodeComponent {
|
|||||||
.filter(date -> !existsTradeDates.contains(date))
|
.filter(date -> !existsTradeDates.contains(date))
|
||||||
.sorted()
|
.sorted()
|
||||||
.toList();
|
.toList();
|
||||||
log.info("Target: {}", targetDates);
|
|
||||||
var stocks = stockService.list();
|
var stocks = stockService.list();
|
||||||
var stocksMap = stocks.stream().collect(Collectors.toMap(Stock::getCode, stock -> stock));
|
var stocksMap = stocks.stream().collect(Collectors.toMap(Stock::getCode, stock -> stock));
|
||||||
for (LocalDate tradeDate : targetDates) {
|
for (LocalDate tradeDate : targetDates) {
|
||||||
log.info("Trade date: {}", tradeDate);
|
|
||||||
var factorResponse = tuShareService.factorList(tradeDate);
|
var factorResponse = tuShareService.factorList(tradeDate);
|
||||||
var factorMap = new HashMap<String, Double>();
|
var factorMap = new HashMap<String, Double>();
|
||||||
for (List<String> item : factorResponse.data().items()) {
|
for (List<String> item : factorResponse.data().items()) {
|
||||||
factorMap.put(item.get(0), Double.valueOf(item.get(2)));
|
factorMap.put(item.get(0), Double.valueOf(item.get(2)));
|
||||||
}
|
}
|
||||||
log.info("Factor: {}", factorMap);
|
|
||||||
|
|
||||||
var response = tuShareService.dailyList(tradeDate);
|
var response = tuShareService.dailyList(tradeDate);
|
||||||
transactionTemplate.execute(status -> {
|
transactionTemplate.execute(status -> {
|
||||||
try {
|
try {
|
||||||
|
var count = 0;
|
||||||
for (List<String> item : response.data().items()) {
|
for (List<String> item : response.data().items()) {
|
||||||
var code = item.get(0);
|
var code = item.get(0);
|
||||||
if (stocksMap.containsKey(code)) {
|
if (stocksMap.containsKey(code)) {
|
||||||
|
count++;
|
||||||
var stock = stocksMap.get(code);
|
var stock = stocksMap.get(code);
|
||||||
var factor = factorMap.get(code);
|
var factor = factorMap.get(code);
|
||||||
var daily = new Daily();
|
var daily = new Daily();
|
||||||
daily.setTradeDate(LocalDate.parse(item.get(1), TuShareService.TRADE_FORMAT));
|
daily.setTradeDate(LocalDate.parse(item.get(1), TuShareService.TRADE_FORMAT));
|
||||||
daily.setOpen(Double.valueOf(item.get(2)));
|
daily.setOpen(item.get(2) == null ? null : Double.valueOf(item.get(2)));
|
||||||
daily.setHigh(Double.valueOf(item.get(3)));
|
daily.setHigh(item.get(3) == null ? null : Double.valueOf(item.get(3)));
|
||||||
daily.setLow(Double.valueOf(item.get(4)));
|
daily.setLow(item.get(4) == null ? null : Double.valueOf(item.get(4)));
|
||||||
daily.setClose(Double.valueOf(item.get(5)));
|
daily.setClose(item.get(5) == null ? null : Double.valueOf(item.get(5)));
|
||||||
daily.setPreviousClose(Double.valueOf(item.get(6)));
|
daily.setPreviousClose(item.get(6) == null ? null : Double.valueOf(item.get(6)));
|
||||||
daily.setPriceChangeAmount(Double.valueOf(item.get(7)));
|
daily.setPriceChangeAmount(item.get(7) == null ? null : Double.valueOf(item.get(7)));
|
||||||
daily.setPriceFluctuationRange(Double.valueOf(item.get(8)));
|
daily.setPriceFluctuationRange(item.get(8) == null ? null : Double.valueOf(item.get(8)));
|
||||||
daily.setVolume(Double.valueOf(item.get(9)));
|
daily.setVolume(item.get(9) == null ? null : Double.valueOf(item.get(9)));
|
||||||
daily.setTurnover(Double.valueOf(item.get(10)));
|
daily.setTurnover(item.get(10) == null ? null : Double.valueOf(item.get(10)));
|
||||||
daily.setFactor(factor);
|
daily.setFactor(factor);
|
||||||
daily.setStock(stock);
|
daily.setStock(stock);
|
||||||
log.info("Daily: {}", daily);
|
|
||||||
dailyService.save(daily);
|
dailyService.save(daily);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
log.info("Trade date: {} {}", tradeDate, count);
|
||||||
return true;
|
return true;
|
||||||
} catch (Exception exception) {
|
} catch (Exception exception) {
|
||||||
|
log.error("Error", exception);
|
||||||
status.setRollbackOnly();
|
status.setRollbackOnly();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
ThreadUtil.safeSleep(1000);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ Content-Type: application/json
|
|||||||
"api_name": "daily",
|
"api_name": "daily",
|
||||||
"token": "{{api_key}}",
|
"token": "{{api_key}}",
|
||||||
"params": {
|
"params": {
|
||||||
"trade_date": "19901219"
|
"trade_date": "19931213"
|
||||||
},
|
},
|
||||||
"fields": [
|
"fields": [
|
||||||
"ts_code",
|
"ts_code",
|
||||||
|
|||||||
Reference in New Issue
Block a user