From 5390a879e793ed27a6917c7d4060eff89c745ef1 Mon Sep 17 00:00:00 2001 From: lanyuanxiaoyao Date: Sat, 11 Oct 2025 15:01:35 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E8=82=A1=E7=A5=A8?= =?UTF-8?q?=E7=8E=B0=E4=BB=B7=E6=98=BE=E7=A4=BA=EF=BC=8C=E6=97=A5=E7=BA=BF?= =?UTF-8?q?=E6=94=B9=E4=B8=BA=E5=90=8E=E5=A4=8D=E6=9D=83=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../leopard/core/helper/NumberHelper.java | 14 + .../core/repository/DailyRepository.java | 3 + .../leopard/core/service/StockService.java | 4 + .../server/controller/StockController.java | 15 +- leopard-web/src/index.tsx | 5 - leopard-web/src/util/amis.tsx | 243 ++++++++++-------- 6 files changed, 167 insertions(+), 117 deletions(-) diff --git a/leopard-core/src/main/java/com/lanyuanxiaoyao/leopard/core/helper/NumberHelper.java b/leopard-core/src/main/java/com/lanyuanxiaoyao/leopard/core/helper/NumberHelper.java index 9a30909..7bc929d 100644 --- a/leopard-core/src/main/java/com/lanyuanxiaoyao/leopard/core/helper/NumberHelper.java +++ b/leopard-core/src/main/java/com/lanyuanxiaoyao/leopard/core/helper/NumberHelper.java @@ -42,6 +42,20 @@ public class NumberHelper { return NumberUtil.decimalFormat("0.00%", value); } + public static String formatPriceDouble(Double value) { + if (ObjectUtil.isNull(value)) { + return null; + } + return NumberUtil.decimalFormat("0.00", value); + } + + public static String formatPriceDouble(Integer value) { + if (ObjectUtil.isNull(value)) { + return null; + } + return NumberUtil.decimalFormat("0.00", value); + } + public static Double parseDouble(String value) { if (StrUtil.isBlank(value)) { return null; diff --git a/leopard-core/src/main/java/com/lanyuanxiaoyao/leopard/core/repository/DailyRepository.java b/leopard-core/src/main/java/com/lanyuanxiaoyao/leopard/core/repository/DailyRepository.java index 7222c43..b1fd0fa 100644 --- a/leopard-core/src/main/java/com/lanyuanxiaoyao/leopard/core/repository/DailyRepository.java +++ b/leopard-core/src/main/java/com/lanyuanxiaoyao/leopard/core/repository/DailyRepository.java @@ -23,6 +23,9 @@ public interface DailyRepository extends SimpleRepository { @Query("select min(daily.tradeDate) from Daily daily") LocalDate findMinTradeDate(); + @Query("from Daily daily where daily.stock.id = ?1 order by daily.tradeDate desc limit 1") + Optional findLatest(Long stockId); + @EntityGraph(attributePaths = {"stock"}) @Override Optional findOne(Predicate predicate); diff --git a/leopard-core/src/main/java/com/lanyuanxiaoyao/leopard/core/service/StockService.java b/leopard-core/src/main/java/com/lanyuanxiaoyao/leopard/core/service/StockService.java index e6b19dd..c4eeb0f 100644 --- a/leopard-core/src/main/java/com/lanyuanxiaoyao/leopard/core/service/StockService.java +++ b/leopard-core/src/main/java/com/lanyuanxiaoyao/leopard/core/service/StockService.java @@ -58,4 +58,8 @@ public class StockService extends SimpleServiceSupport { Sort.by(Sort.Direction.ASC, Daily_.TRADE_DATE) ); } + + public Optional findDailyLatest(Long stockId) { + return dailyRepository.findLatest(stockId); + } } diff --git a/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/controller/StockController.java b/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/controller/StockController.java index 776d08d..783d29a 100644 --- a/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/controller/StockController.java +++ b/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/controller/StockController.java @@ -1,6 +1,7 @@ package com.lanyuanxiaoyao.leopard.server.controller; import cn.hutool.core.bean.BeanUtil; +import com.lanyuanxiaoyao.leopard.core.entity.Daily; import com.lanyuanxiaoyao.leopard.core.entity.Stock; import com.lanyuanxiaoyao.leopard.core.helper.NumberHelper; import com.lanyuanxiaoyao.leopard.core.service.StockService; @@ -108,6 +109,18 @@ public class StockController extends SimpleControllerSupport> dailyCurrent(@PathVariable("id") Long id) { + var daily = stockService.findDailyLatest(id); + return GlobalResponse.responseMapData(Map.of( + "date", daily.map(Daily::getTradeDate).map(LocalDate::toString).orElse("/"), + "open", daily.map(Daily::getOpen).map(NumberHelper::formatPriceDouble).orElse(NumberHelper.FINANCE_NULL_DOUBLE), + "close", daily.map(Daily::getClose).map(NumberHelper::formatPriceDouble).orElse(NumberHelper.FINANCE_NULL_DOUBLE), + "low", daily.map(Daily::getLow).map(NumberHelper::formatPriceDouble).orElse(NumberHelper.FINANCE_NULL_DOUBLE), + "high", daily.map(Daily::getHigh).map(NumberHelper::formatPriceDouble).orElse(NumberHelper.FINANCE_NULL_DOUBLE) + )); + } + @GetMapping("daily/{id}") public GlobalResponse> dailyCharts(@PathVariable("id") Long id) { var data = stockService.findDailyRecent(id, 100); @@ -115,7 +128,7 @@ public class StockController extends SimpleControllerSupport>(); for (var daily : data) { xList.add(daily.getTradeDate().toString()); - yList.add(List.of(daily.getOpen(), daily.getClose(), daily.getLow(), daily.getHigh())); + yList.add(List.of(daily.getHfqOpen(), daily.getHfqClose(), daily.getHfqLow(), daily.getHfqHigh())); } return GlobalResponse.responseMapData(Map.of( "xList", xList, "yList", yList diff --git a/leopard-web/src/index.tsx b/leopard-web/src/index.tsx index 1e85008..fee3645 100644 --- a/leopard-web/src/index.tsx +++ b/leopard-web/src/index.tsx @@ -6,7 +6,6 @@ import Overview from './pages/Overview.tsx' import Root from './pages/Root.tsx' import Test from './pages/Test.tsx' import StockList from './pages/stock/StockList.tsx' -import StockDetail from './pages/stock/StockDetail.tsx' import TaskList from './pages/task/TaskList.tsx' import TaskTemplateList from './pages/task/TaskTemplateList.tsx' import TaskScheduleList from './pages/task/TaskScheduleList.tsx' @@ -35,10 +34,6 @@ const routes: RouteObject[] = [ path: 'list', Component: StockList, }, - { - path: 'detail/:id', - Component: StockDetail, - }, { path: "collection", children: [ diff --git a/leopard-web/src/util/amis.tsx b/leopard-web/src/util/amis.tsx index 32a0a20..52e7319 100644 --- a/leopard-web/src/util/amis.tsx +++ b/leopard-web/src/util/amis.tsx @@ -571,7 +571,7 @@ export function stockListColumns(idField: string = 'id', extraColumns: Array${param.name} + return `
${param.name}
开盘: ${open} @@ -829,89 +853,86 @@ export function stockListColumns(idField: string = 'id', extraColumns: Array最高: ${highest}
` - }, - }, - grid: { - left: '10%', - right: '10%', - top: '10%', - bottom: '15%', - containLabel: true, - }, - xAxis: { - data: '${xList || []}', - axisLine: { - lineStyle: { - color: '#e0e0e0', - }, - }, - axisLabel: { - color: '#666', - fontWeight: 'bold', - }, - splitLine: { - show: false, - }, - axisTick: { - show: false, - }, - }, - yAxis: { - scale: true, - axisLine: { - lineStyle: { - color: '#e0e0e0', - }, - }, - axisLabel: { - color: '#666', - fontWeight: 'bold', - formatter: function (value: number) { - return value.toFixed(2) - }, - }, - splitLine: { - lineStyle: { - type: 'dashed', - color: '#f0f0f0', - }, - }, - axisTick: { - show: false, - }, - }, - dataZoom: [ - { - type: 'inside', - start: 0, - end: 100, - }, - { - show: true, - type: 'slider', - top: '90%', - start: 0, - end: 100, - }, - ], - series: [ - { - type: 'candlestick', - data: '${yList || []}', - itemStyle: { - color: '#eb5454', - color0: '#4aaa93', - borderColor: '#eb5454', - borderColor0: '#4aaa93', - borderWidth: 1, - }, - - }, - ], }, }, - "12月线数据", - ], + grid: { + left: '2%', + right: '2%', + top: '15%', + bottom: '15%', + containLabel: true, + }, + xAxis: { + data: '${xList || []}', + axisLine: { + lineStyle: { + color: '#e0e0e0', + }, + }, + axisLabel: { + color: '#666', + fontWeight: 'bold', + }, + splitLine: { + show: false, + }, + axisTick: { + show: false, + }, + }, + yAxis: { + scale: true, + axisLine: { + lineStyle: { + color: '#e0e0e0', + }, + }, + axisLabel: { + color: '#666', + fontWeight: 'bold', + formatter: function (value: number) { + return value.toFixed(2) + }, + }, + splitLine: { + lineStyle: { + type: 'dashed', + color: '#f0f0f0', + }, + }, + axisTick: { + show: false, + }, + }, + dataZoom: [ + { + type: 'inside', + start: 0, + end: 100, + }, + { + show: true, + type: 'slider', + top: '90%', + start: 0, + end: 100, + }, + ], + series: [ + { + type: 'candlestick', + data: '${yList || []}', + itemStyle: { + color: '#eb5454', + color0: '#4aaa93', + borderColor: '#eb5454', + borderColor0: '#4aaa93', + borderWidth: 1, + }, + + }, + ], + }, }, ], },