From bc246043c82d372f7e636d40dcda540a93790f67 Mon Sep 17 00:00:00 2001 From: lanyuanxiaoyao Date: Sun, 7 Sep 2025 11:08:29 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=97=A5=E7=BA=BF?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E9=87=87=E9=9B=86=E6=97=B6=E5=87=BA=E7=8E=B0?= =?UTF-8?q?null=E5=80=BC=E7=9A=84=E6=83=85=E5=86=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../leopard/server/entity/Daily.java | 2 ++ .../server/repository/DailyRepository.java | 3 ++ .../leopard/server/service/DailyService.java | 4 +++ .../server/service/task/UpdateDailyNode.java | 28 +++++++++---------- .../src/test/resources/tushare.http | 2 +- 5 files changed, 23 insertions(+), 16 deletions(-) diff --git a/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/entity/Daily.java b/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/entity/Daily.java index 07c7ed3..bd5b47a 100644 --- a/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/entity/Daily.java +++ b/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/entity/Daily.java @@ -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; } diff --git a/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/repository/DailyRepository.java b/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/repository/DailyRepository.java index 75ce150..cfb449b 100644 --- a/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/repository/DailyRepository.java +++ b/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/repository/DailyRepository.java @@ -11,4 +11,7 @@ import org.springframework.stereotype.Repository; public interface DailyRepository extends SimpleRepository { @Query("select distinct daily.tradeDate from Daily daily") List findDistinctTradeDate(); + + @Query("select distinct daily.tradeDate from Daily daily where daily.stock.id = ?1") + List findDistinctTradeDateByStockId(Long stockId); } diff --git a/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/service/DailyService.java b/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/service/DailyService.java index 161824d..20ac92c 100644 --- a/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/service/DailyService.java +++ b/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/service/DailyService.java @@ -19,4 +19,8 @@ public class DailyService extends SimpleServiceSupport { public List findDistinctTradeDate() { return dailyRepository.findDistinctTradeDate(); } + + public List findDistinctTradeDateByStockId(Long stockId) { + return dailyRepository.findDistinctTradeDateByStockId(stockId); + } } diff --git a/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/service/task/UpdateDailyNode.java b/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/service/task/UpdateDailyNode.java index d90b9f1..c3405b6 100644 --- a/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/service/task/UpdateDailyNode.java +++ b/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/service/task/UpdateDailyNode.java @@ -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(); for (List 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 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); } } } diff --git a/leopard-server/src/test/resources/tushare.http b/leopard-server/src/test/resources/tushare.http index 68d6e1d..2732b0c 100644 --- a/leopard-server/src/test/resources/tushare.http +++ b/leopard-server/src/test/resources/tushare.http @@ -58,7 +58,7 @@ Content-Type: application/json "api_name": "daily", "token": "{{api_key}}", "params": { - "trade_date": "19901219" + "trade_date": "19931213" }, "fields": [ "ts_code",