1
0

fix: 修复日线数据采集时出现null值的情况

This commit is contained in:
2025-09-07 11:08:29 +08:00
parent 24909bae24
commit bc246043c8
5 changed files with 23 additions and 16 deletions

View File

@@ -5,6 +5,7 @@ import com.lanyuanxiaoyao.service.template.entity.SimpleEntity;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.EntityListeners;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
import java.time.LocalDate;
@@ -53,6 +54,7 @@ public class Daily extends SimpleEntity {
private Double factor;
@ManyToOne
@JoinColumn(nullable = false)
@ToString.Exclude
private Stock stock;
}

View File

@@ -11,4 +11,7 @@ import org.springframework.stereotype.Repository;
public interface DailyRepository extends SimpleRepository<Daily> {
@Query("select distinct daily.tradeDate from Daily daily")
List<LocalDate> findDistinctTradeDate();
@Query("select distinct daily.tradeDate from Daily daily where daily.stock.id = ?1")
List<LocalDate> findDistinctTradeDateByStockId(Long stockId);
}

View File

@@ -19,4 +19,8 @@ public class DailyService extends SimpleServiceSupport<Daily> {
public List<LocalDate> findDistinctTradeDate() {
return dailyRepository.findDistinctTradeDate();
}
public List<LocalDate> findDistinctTradeDateByStockId(Long stockId) {
return dailyRepository.findDistinctTradeDateByStockId(stockId);
}
}

View File

@@ -1,6 +1,5 @@
package com.lanyuanxiaoyao.leopard.server.service.task;
import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.lanyuanxiaoyao.leopard.server.entity.Daily;
@@ -52,50 +51,49 @@ public class UpdateDailyNode extends NodeComponent {
.filter(date -> !existsTradeDates.contains(date))
.sorted()
.toList();
log.info("Target: {}", targetDates);
var stocks = stockService.list();
var stocksMap = stocks.stream().collect(Collectors.toMap(Stock::getCode, stock -> stock));
for (LocalDate tradeDate : targetDates) {
log.info("Trade date: {}", tradeDate);
var factorResponse = tuShareService.factorList(tradeDate);
var factorMap = new HashMap<String, Double>();
for (List<String> item : factorResponse.data().items()) {
factorMap.put(item.get(0), Double.valueOf(item.get(2)));
}
log.info("Factor: {}", factorMap);
var response = tuShareService.dailyList(tradeDate);
transactionTemplate.execute(status -> {
try {
var count = 0;
for (List<String> item : response.data().items()) {
var code = item.get(0);
if (stocksMap.containsKey(code)) {
count++;
var stock = stocksMap.get(code);
var factor = factorMap.get(code);
var daily = new Daily();
daily.setTradeDate(LocalDate.parse(item.get(1), TuShareService.TRADE_FORMAT));
daily.setOpen(Double.valueOf(item.get(2)));
daily.setHigh(Double.valueOf(item.get(3)));
daily.setLow(Double.valueOf(item.get(4)));
daily.setClose(Double.valueOf(item.get(5)));
daily.setPreviousClose(Double.valueOf(item.get(6)));
daily.setPriceChangeAmount(Double.valueOf(item.get(7)));
daily.setPriceFluctuationRange(Double.valueOf(item.get(8)));
daily.setVolume(Double.valueOf(item.get(9)));
daily.setTurnover(Double.valueOf(item.get(10)));
daily.setOpen(item.get(2) == null ? null : Double.valueOf(item.get(2)));
daily.setHigh(item.get(3) == null ? null : Double.valueOf(item.get(3)));
daily.setLow(item.get(4) == null ? null : Double.valueOf(item.get(4)));
daily.setClose(item.get(5) == null ? null : Double.valueOf(item.get(5)));
daily.setPreviousClose(item.get(6) == null ? null : Double.valueOf(item.get(6)));
daily.setPriceChangeAmount(item.get(7) == null ? null : Double.valueOf(item.get(7)));
daily.setPriceFluctuationRange(item.get(8) == null ? null : Double.valueOf(item.get(8)));
daily.setVolume(item.get(9) == null ? null : Double.valueOf(item.get(9)));
daily.setTurnover(item.get(10) == null ? null : Double.valueOf(item.get(10)));
daily.setFactor(factor);
daily.setStock(stock);
log.info("Daily: {}", daily);
dailyService.save(daily);
}
}
log.info("Trade date: {} {}", tradeDate, count);
return true;
} catch (Exception exception) {
log.error("Error", exception);
status.setRollbackOnly();
return false;
}
});
ThreadUtil.safeSleep(1000);
}
}
}