From 338554c5231c137baf41f6948f71bf24caca05b2 Mon Sep 17 00:00:00 2001 From: lanyuanxiaoyao Date: Fri, 12 Sep 2025 16:18:39 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E8=82=A1=E7=A5=A8=E8=AF=A6=E6=83=85?= =?UTF-8?q?=E9=A1=B5=E6=98=BE=E7=A4=BA=E8=B4=A2=E6=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/controller/StockController.java | 84 ++++++++++++++++++- .../leopard/server/service/StockService.java | 40 ++++++++- .../src/main/resources/logback-spring.xml | 6 +- leopard-web/src/pages/stock/StockDetail.tsx | 35 ++++++++ 4 files changed, 159 insertions(+), 6 deletions(-) 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 78ff084..418bc61 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,11 +1,14 @@ package com.lanyuanxiaoyao.leopard.server.controller; import com.lanyuanxiaoyao.leopard.core.entity.Stock; +import com.lanyuanxiaoyao.leopard.server.helper.NumberHelper; import com.lanyuanxiaoyao.leopard.server.service.StockService; import com.lanyuanxiaoyao.service.template.controller.GlobalResponse; import com.lanyuanxiaoyao.service.template.controller.SimpleControllerSupport; import java.time.LocalDate; import java.util.function.Function; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -16,8 +19,11 @@ import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("stock") public class StockController extends SimpleControllerSupport { - public StockController(StockService service) { + private final StockService stockService; + + public StockController(StockService service, StockService stockService) { super(service); + this.stockService = stockService; } @Override @@ -25,6 +31,37 @@ public class StockController extends SimpleControllerSupport finance(@PathVariable("id") Long id) { + // 财报默认是上一年的 + var year = LocalDate.now().minusYears(1).getYear(); + var balanceSheet = stockService.findBalanceSheet(id, year); + var income = stockService.findIncome(id, year); + var cashFlow = stockService.findCashFlow(id, year); + return GlobalResponse.responseSuccess(new FinanceItem( + id, + year, + balanceSheet + .map(bs -> new BalanceSheetItem( + NumberHelper.formatFinanceDouble(bs.getTotalAssets()), + NumberHelper.formatFinanceDouble(bs.getTotalLiabilities()) + )) + .orElse(new BalanceSheetItem()), + income + .map(ic -> new IncomeItem( + NumberHelper.formatFinanceDouble(ic.getTotalOperatingRevenue()), + NumberHelper.formatFinanceDouble(ic.getTotalOperatingCost()), + NumberHelper.formatFinanceDouble(ic.getTotalProfit()) + )) + .orElse(new IncomeItem()), + cashFlow + .map(cf -> new CashFlowItem( + NumberHelper.formatFinanceDouble(cf.getNetProfit()) + )) + .orElse(new CashFlowItem()) + )); + } + @Override protected Function saveItemMapper() { throw new UnsupportedOperationException(); @@ -62,4 +99,49 @@ public class StockController extends SimpleControllerSupport { private final StockRepository stockRepository; + private final BalanceSheetRepository balanceSheetRepository; + private final IncomeRepository incomeRepository; + private final CashFlowRepository cashFlowRepository; - public StockService(StockRepository repository) { + public StockService(StockRepository repository, BalanceSheetRepository balanceSheetRepository, IncomeRepository incomeRepository, CashFlowRepository cashFlowRepository) { super(repository); this.stockRepository = repository; + this.balanceSheetRepository = balanceSheetRepository; + this.incomeRepository = incomeRepository; + this.cashFlowRepository = cashFlowRepository; } - public List findDistinctIndustries() { - return stockRepository.findDistinctIndustries(); + public Optional findBalanceSheet(Long stockId, Integer year) { + return balanceSheetRepository.findOne( + QBalanceSheet.balanceSheet.year.eq(year) + .and(QBalanceSheet.balanceSheet.stock.id.eq(stockId)) + ); + } + + public Optional findIncome(Long stockId, Integer year) { + return incomeRepository.findOne( + QIncome.income.year.eq(year) + .and(QIncome.income.stock.id.eq(stockId)) + ); + } + + public Optional findCashFlow(Long stockId, Integer year) { + return cashFlowRepository.findOne( + QCashFlow.cashFlow.year.eq(year) + .and(QCashFlow.cashFlow.stock.id.eq(stockId)) + ); } } diff --git a/leopard-server/src/main/resources/logback-spring.xml b/leopard-server/src/main/resources/logback-spring.xml index a857bbe..0bb27ac 100644 --- a/leopard-server/src/main/resources/logback-spring.xml +++ b/leopard-server/src/main/resources/logback-spring.xml @@ -30,8 +30,12 @@ - + + + + + \ No newline at end of file diff --git a/leopard-web/src/pages/stock/StockDetail.tsx b/leopard-web/src/pages/stock/StockDetail.tsx index db16bfb..cc8308f 100644 --- a/leopard-web/src/pages/stock/StockDetail.tsx +++ b/leopard-web/src/pages/stock/StockDetail.tsx @@ -26,9 +26,44 @@ function StockDetail() { }, }, {label: '行业', content: '${industry}'}, + {label: '上市日期', content: '${listedDate}'}, ], }, {type: 'divider'}, + { + type: 'service', + api: `get:${commonInfo.baseUrl}/stock/finance/${id}`, + body: [ + '资产负债表', + { + className: 'my-2', + type: 'property', + items: [ + {label: '总资产', content: '${balanceSheet.totalAssets}'}, + {label: '总负债', content: '${balanceSheet.totalLiabilities}'}, + ], + }, + '利润表', + { + className: 'my-2', + type: 'property', + items: [ + {label: '营业总收入', content: '${income.totalOperatingRevenue}'}, + {label: '营业总成本', content: '${income.totalOperatingCost}'}, + {label: '营业总利润', content: '${income.totalProfit}'}, + ], + }, + '现金流量表', + { + className: 'my-2', + type: 'property', + items: [ + {label: '净利润', content: '${cashFlow.netProfit}'}, + ], + }, + {type: 'divider'}, + ], + }, ], }, )}