1
0

Compare commits

...

2 Commits

Author SHA1 Message Date
edf320205d perf: 直接使用仓库类简化代码 2025-09-12 00:20:58 +08:00
fe5f303241 fix: 修复财务报表的接口字段 2025-09-12 00:20:10 +08:00
14 changed files with 199 additions and 174 deletions

View File

@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="DataSourcePerFileMappings"> <component name="DataSourcePerFileMappings">
<file url="file://$APPLICATION_CONFIG_DIR$/consoles/db/a8b9cd0a-335e-42ae-991a-f2733200afbf/console.sql" value="a8b9cd0a-335e-42ae-991a-f2733200afbf" />
<file url="file://$APPLICATION_CONFIG_DIR$/consoles/db/f7d817dc-8c9c-479f-b469-583df17cb013/console.sql" value="f7d817dc-8c9c-479f-b469-583df17cb013" /> <file url="file://$APPLICATION_CONFIG_DIR$/consoles/db/f7d817dc-8c9c-479f-b469-583df17cb013/console.sql" value="f7d817dc-8c9c-479f-b469-583df17cb013" />
</component> </component>
</project> </project>

View File

@@ -36,7 +36,7 @@ public class BalanceSheet extends SimpleEntity {
private Double endingTotalShares; private Double endingTotalShares;
@Comment("原始名称cap_rese描述资本公积金") @Comment("原始名称cap_rese描述资本公积金")
private Double capitalSurplus; private Double capitalSurplus;
@Comment("原始名称undist_profit描述未分配利润") @Comment("原始名称undistr_porfit描述未分配利润")
private Double undistributedProfit; private Double undistributedProfit;
@Comment("原始名称money_cap描述货币资金") @Comment("原始名称money_cap描述货币资金")
private Double monetaryFunds; private Double monetaryFunds;
@@ -68,17 +68,17 @@ public class BalanceSheet extends SimpleEntity {
private Double accountsPayable; private Double accountsPayable;
@Comment("原始名称adv_receipts描述预收款项") @Comment("原始名称adv_receipts描述预收款项")
private Double advancesReceived; private Double advancesReceived;
@Comment("原始名称total_cur_lab描述流动负债合计") @Comment("原始名称total_cur_liab描述流动负债合计")
private Double totalCurrentLiabilities; private Double totalCurrentLiabilities;
@Comment("原始名称total_ncl描述非流动负债合计") @Comment("原始名称total_ncl描述非流动负债合计")
private Double totalNonCurrentLiabilities; private Double totalNonCurrentLiabilities;
@Comment("原始名称total_lab描述负债合计") @Comment("原始名称total_liab描述负债合计")
private Double totalLiabilities; private Double totalLiabilities;
@Comment("原始名称total_hldr_eqy_exc_min_int描述股东权益合计(不含少数股东权益)") @Comment("原始名称total_hldr_eqy_exc_min_int描述股东权益合计(不含少数股东权益)")
private Double totalShareholdersEquityExcludingMinorityInterest; private Double totalShareholdersEquityExcludingMinorityInterest;
@Comment("原始名称total_hldr_eqy_inc_min_int描述股东权益合计(含少数股东权益)") @Comment("原始名称total_hldr_eqy_inc_min_int描述股东权益合计(含少数股东权益)")
private Double totalShareholdersEquityIncludingMinorityInterest; private Double totalShareholdersEquityIncludingMinorityInterest;
@Comment("原始名称total_lab_hldr_eqy描述负债及股东权益总计") @Comment("原始名称total_liab_hldr_eqy描述负债及股东权益总计")
private Double totalLiabilitiesAndShareholdersEquity; private Double totalLiabilitiesAndShareholdersEquity;
@Comment("原始名称acc_receivable描述应收款项") @Comment("原始名称acc_receivable描述应收款项")
private Double receivables; private Double receivables;
@@ -86,7 +86,7 @@ public class BalanceSheet extends SimpleEntity {
private Double payables; private Double payables;
@Comment("原始名称accounts_receiv_bill描述应收票据及应收账款") @Comment("原始名称accounts_receiv_bill描述应收票据及应收账款")
private Double notesAndAccountsReceivable; private Double notesAndAccountsReceivable;
@Comment("原始名称accounts_pay_bill,描述:应付票据及应付账款") @Comment("原始名称accounts_pay描述应付票据及应付账款")
private Double notesAndAccountsPayable; private Double notesAndAccountsPayable;
@Comment("原始名称oth_rcv_total描述其他应收款(合计)(元)") @Comment("原始名称oth_rcv_total描述其他应收款(合计)(元)")
private Double otherReceivablesTotal; private Double otherReceivablesTotal;

View File

@@ -34,25 +34,25 @@ public class CashFlow extends SimpleEntity {
private Integer year; private Integer year;
@Comment("原始名称net_profit描述净利润") @Comment("原始名称net_profit描述净利润")
private Double netProfit; private Double netProfit;
@Comment("原始名称fin_exp描述财务费用") @Comment("原始名称finan_exp描述财务费用")
private Double financialExpense; private Double financialExpense;
@Comment("原始名称c_f_sale_sg描述销售商品、提供劳务收到的现金") @Comment("原始名称c_fr_sale_sg描述销售商品、提供劳务收到的现金")
private Double cashReceivedFromSalesAndServices; private Double cashReceivedFromSalesAndServices;
@Comment("原始名称c_f_oth_oper_a描述经营活动现金流入小计") @Comment("原始名称c_inf_fr_operate_a描述经营活动现金流入小计")
private Double subtotalOfCashInflowsFromOperatingActivities; private Double subtotalOfCashInflowsFromOperatingActivities;
@Comment("原始名称c_paid_to_for_empl描述支付给职工以及为职工支付的现金") @Comment("原始名称c_paid_to_for_empl描述支付给职工以及为职工支付的现金")
private Double cashPaidToAndForEmployees; private Double cashPaidToAndForEmployees;
@Comment("原始名称c_paid_for_taxes描述支付的各项税费") @Comment("原始名称c_paid_for_taxes描述支付的各项税费")
private Double cashPaidForVariousTaxes; private Double cashPaidForVariousTaxes;
@Comment("原始名称:st_cashflow_act描述经营活动产生的现金流量净额") @Comment("原始名称:n_cashflow_act描述经营活动产生的现金流量净额")
private Double netCashFlowFromOperatingActivities; private Double netCashFlowFromOperatingActivities;
@Comment("原始名称stoc_inflows_inv_act描述投资活动现金流入小计") @Comment("原始名称stot_inflows_inv_act描述投资活动现金流入小计")
private Double subtotalOfCashInflowsFromInvestingActivities; private Double subtotalOfCashInflowsFromInvestingActivities;
@Comment("原始名称c_paid_subs_oth_biz,描述:购置固定资产、无形资产和其他长期资产支付的现金") @Comment("原始名称c_pay_acq_const_fiolta,描述:购置固定资产、无形资产和其他长期资产支付的现金")
private Double cashPaidForAcquisitionOfFixedIntangibleAndOtherLongTermAssets; private Double cashPaidForLongTermAssets;
@Comment("原始名称stoc_cashout_inv_act描述投资活动现金流出小计") @Comment("原始名称stot_out_inv_act描述投资活动现金流出小计")
private Double subtotalOfCashOutflowsFromInvestingActivities; private Double subtotalOfCashOutflowsFromInvestingActivities;
@Comment("原始名称stoc_cashout_fin_act描述筹资活动现金流出小计") @Comment("原始名称stot_cashout_fnc_act描述筹资活动现金流出小计")
private Double subtotalOfCashOutflowsFromFinancingActivities; private Double subtotalOfCashOutflowsFromFinancingActivities;
@Comment("原始名称c_cash_equ_beg_period描述期初现金及现金等价物余额") @Comment("原始名称c_cash_equ_beg_period描述期初现金及现金等价物余额")
private Double beginningBalanceOfCashAndCashEquivalents; private Double beginningBalanceOfCashAndCashEquivalents;

View File

@@ -72,8 +72,6 @@ public class Income extends SimpleEntity {
private Double comprehensiveIncomeAttributableToMinorityShareholders; private Double comprehensiveIncomeAttributableToMinorityShareholders;
@Comment("原始名称ebit描述息税前利润") @Comment("原始名称ebit描述息税前利润")
private Double earningsBeforeInterestAndTax; private Double earningsBeforeInterestAndTax;
@Comment("原始名称ebida描述息税折旧摊销前利润")
private Double earningsBeforeInterestTaxDepreciationAndAmortization;
@Comment("原始名称undist_profit描述年初未分配利润") @Comment("原始名称undist_profit描述年初未分配利润")
private Double beginningUndistributedProfit; private Double beginningUndistributedProfit;
@Comment("原始名称distable_profit描述可分配利润") @Comment("原始名称distable_profit描述可分配利润")

View File

@@ -2,7 +2,7 @@ package com.lanyuanxiaoyao.leopard.server.controller;
import com.lanyuanxiaoyao.leopard.core.entity.Stock; import com.lanyuanxiaoyao.leopard.core.entity.Stock;
import com.lanyuanxiaoyao.leopard.core.entity.Task; import com.lanyuanxiaoyao.leopard.core.entity.Task;
import com.lanyuanxiaoyao.leopard.server.service.StockService; import com.lanyuanxiaoyao.leopard.core.repository.StockRepository;
import com.lanyuanxiaoyao.leopard.server.service.TaskTemplateService; import com.lanyuanxiaoyao.leopard.server.service.TaskTemplateService;
import com.lanyuanxiaoyao.service.template.controller.GlobalResponse; import com.lanyuanxiaoyao.service.template.controller.GlobalResponse;
import java.util.Arrays; import java.util.Arrays;
@@ -86,11 +86,11 @@ public class CommonOptionsController {
"bg-pink-900" "bg-pink-900"
); );
private final StockService stockService; private final StockRepository stockRepository;
private final TaskTemplateService taskTemplateService; private final TaskTemplateService taskTemplateService;
public CommonOptionsController(StockService stockService, TaskTemplateService taskTemplateService) { public CommonOptionsController(StockRepository stockRepository, TaskTemplateService taskTemplateService) {
this.stockService = stockService; this.stockRepository = stockRepository;
this.taskTemplateService = taskTemplateService; this.taskTemplateService = taskTemplateService;
} }
@@ -103,7 +103,7 @@ public class CommonOptionsController {
.toList() .toList()
); );
case "stock_industry" -> GlobalResponse.responseSuccess( case "stock_industry" -> GlobalResponse.responseSuccess(
stockService.findDistinctIndustries() stockRepository.findDistinctIndustries()
.stream() .stream()
.map(industry -> new Option(industry, industry)) .map(industry -> new Option(industry, industry))
.toList() .toList()

View File

@@ -3,24 +3,11 @@ package com.lanyuanxiaoyao.leopard.server.service;
import com.lanyuanxiaoyao.leopard.core.entity.Daily; import com.lanyuanxiaoyao.leopard.core.entity.Daily;
import com.lanyuanxiaoyao.leopard.core.repository.DailyRepository; import com.lanyuanxiaoyao.leopard.core.repository.DailyRepository;
import com.lanyuanxiaoyao.service.template.service.SimpleServiceSupport; import com.lanyuanxiaoyao.service.template.service.SimpleServiceSupport;
import java.time.LocalDate;
import java.util.List;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@Service @Service
public class DailyService extends SimpleServiceSupport<Daily> { public class DailyService extends SimpleServiceSupport<Daily> {
private final DailyRepository dailyRepository;
public DailyService(DailyRepository repository) { public DailyService(DailyRepository repository) {
super(repository); super(repository);
this.dailyRepository = repository;
}
public List<LocalDate> findDistinctTradeDate() {
return dailyRepository.findDistinctTradeDate();
}
public List<LocalDate> findDistinctTradeDateByStockId(Long stockId) {
return dailyRepository.findDistinctTradeDateByStockId(stockId);
} }
} }

View File

@@ -134,7 +134,6 @@ public class TuShareService {
"compr_inc_attr_p", "compr_inc_attr_p",
"compr_inc_attr_m_s", "compr_inc_attr_m_s",
"ebit", "ebit",
"ebida",
"undist_profit", "undist_profit",
"distable_profit", "distable_profit",
"rd_exp", "rd_exp",
@@ -159,7 +158,7 @@ public class TuShareService {
"ts_code", "ts_code",
"total_share", "total_share",
"cap_rese", "cap_rese",
"undist_profit", "undistr_porfit",
"money_cap", "money_cap",
"accounts_receiv", "accounts_receiv",
"inventories", "inventories",
@@ -175,16 +174,16 @@ public class TuShareService {
"st_borr", "st_borr",
"acct_payable", "acct_payable",
"adv_receipts", "adv_receipts",
"total_cur_lab", "total_cur_liab",
"total_ncl", "total_ncl",
"total_lab", "total_liab",
"total_hldr_eqy_exc_min_int", "total_hldr_eqy_exc_min_int",
"total_hldr_eqy_inc_min_int", "total_hldr_eqy_inc_min_int",
"total_lab_hldr_eqy", "total_liab_hldr_eqy",
"acc_receivable", "acc_receivable",
"payables", "payables",
"accounts_receiv_bill", "accounts_receiv_bill",
"accounts_pay_bill", "accounts_pay",
"oth_rcv_total", "oth_rcv_total",
"fix_assets_total" "fix_assets_total"
) )
@@ -204,16 +203,16 @@ public class TuShareService {
List.of( List.of(
"ts_code", "ts_code",
"net_profit", "net_profit",
"fin_exp", "finan_exp",
"c_f_sale_sg", "c_fr_sale_sg",
"c_f_oth_oper_a", "c_inf_fr_operate_a",
"c_paid_to_for_empl", "c_paid_to_for_empl",
"c_paid_for_taxes", "c_paid_for_taxes",
"st_cashflow_act", "n_cashflow_act",
"stoc_inflows_inv_act", "stot_inflows_inv_act",
"c_paid_subs_oth_biz", "c_pay_acq_const_fiolta",
"stoc_cashout_inv_act", "stot_out_inv_act",
"stoc_cashout_fin_act", "stot_cashout_fnc_act",
"c_cash_equ_beg_period", "c_cash_equ_beg_period",
"c_cash_equ_end_period" "c_cash_equ_end_period"
) )

View File

@@ -4,8 +4,8 @@ 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.core.entity.Stock; import com.lanyuanxiaoyao.leopard.core.entity.Stock;
import com.lanyuanxiaoyao.leopard.server.service.DailyService; import com.lanyuanxiaoyao.leopard.core.repository.DailyRepository;
import com.lanyuanxiaoyao.leopard.server.service.StockService; import com.lanyuanxiaoyao.leopard.core.repository.StockRepository;
import com.lanyuanxiaoyao.leopard.server.service.TaskService; import com.lanyuanxiaoyao.leopard.server.service.TaskService;
import com.lanyuanxiaoyao.leopard.server.service.TuShareService; import com.lanyuanxiaoyao.leopard.server.service.TuShareService;
import com.yomahub.liteflow.annotation.LiteflowComponent; import com.yomahub.liteflow.annotation.LiteflowComponent;
@@ -18,21 +18,22 @@ import lombok.extern.slf4j.Slf4j;
@Slf4j @Slf4j
@LiteflowComponent("check_daily") @LiteflowComponent("check_daily")
public class CheckDailyNode extends TaskNodeComponent { public class CheckDailyNode extends TaskNodeComponent {
private final StockService stockService; private final StockRepository stockRepository;
private final DailyService dailyService; private final DailyRepository dailyRepository;
private final TuShareService tuShareService; private final TuShareService tuShareService;
public CheckDailyNode(TaskService taskService, StockService stockService, DailyService dailyService, TuShareService tuShareService) { public CheckDailyNode(TaskService taskService, StockRepository stockRepository, DailyRepository dailyRepository, TuShareService tuShareService) {
super(taskService); super(taskService);
this.stockService = stockService; this.stockRepository = stockRepository;
this.dailyService = dailyService; this.dailyRepository = dailyRepository;
this.tuShareService = tuShareService; this.tuShareService = tuShareService;
} }
@Override @Override
public void process() { public void process() {
var reports = new ArrayList<MissedTradeReport>(); var reports = new ArrayList<MissedTradeReport>();
var stocks = stockService.list(); var stocks = stockRepository.findAll();
var exchanges = stocks.stream().map(Stock::getMarket).distinct().toList(); var exchanges = stocks.stream().map(Stock::getMarket).distinct().toList();
for (Stock.Market exchange : exchanges) { for (Stock.Market exchange : exchanges) {
var nowDate = LocalDate.now(); var nowDate = LocalDate.now();
@@ -48,7 +49,7 @@ public class CheckDailyNode extends TaskNodeComponent {
for (Stock stock : stocks) { for (Stock stock : stocks) {
log.info("正在处理:{} {}", stock.getCode(), stock.getName()); log.info("正在处理:{} {}", stock.getCode(), stock.getName());
if (exchange.equals(stock.getMarket())) { if (exchange.equals(stock.getMarket())) {
var existsTradeDates = dailyService.findDistinctTradeDateByStockId(stock.getId()); var existsTradeDates = dailyRepository.findDistinctTradeDateByStockId(stock.getId());
var missedTradeDates = allTradeDates.stream() var missedTradeDates = allTradeDates.stream()
.filter(date -> date.isAfter(stock.getListedDate()) || date.isEqual(stock.getListedDate())) .filter(date -> date.isAfter(stock.getListedDate()) || date.isEqual(stock.getListedDate()))
.filter(date -> !existsTradeDates.contains(date)) .filter(date -> !existsTradeDates.contains(date))

View File

@@ -4,8 +4,8 @@ import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.lanyuanxiaoyao.leopard.core.entity.Daily; import com.lanyuanxiaoyao.leopard.core.entity.Daily;
import com.lanyuanxiaoyao.leopard.core.entity.Stock; import com.lanyuanxiaoyao.leopard.core.entity.Stock;
import com.lanyuanxiaoyao.leopard.server.service.DailyService; import com.lanyuanxiaoyao.leopard.core.repository.DailyRepository;
import com.lanyuanxiaoyao.leopard.server.service.StockService; import com.lanyuanxiaoyao.leopard.core.repository.StockRepository;
import com.lanyuanxiaoyao.leopard.server.service.TuShareService; import com.lanyuanxiaoyao.leopard.server.service.TuShareService;
import com.yomahub.liteflow.annotation.LiteflowComponent; import com.yomahub.liteflow.annotation.LiteflowComponent;
import com.yomahub.liteflow.core.NodeComponent; import com.yomahub.liteflow.core.NodeComponent;
@@ -20,14 +20,16 @@ import org.springframework.transaction.support.TransactionTemplate;
@Slf4j @Slf4j
@LiteflowComponent("update_daily") @LiteflowComponent("update_daily")
public class UpdateDailyNode extends NodeComponent { public class UpdateDailyNode extends NodeComponent {
private final StockService stockService; private final StockRepository stockRepository;
private final DailyService dailyService; private final DailyRepository dailyRepository;
private final TuShareService tuShareService; private final TuShareService tuShareService;
private final TransactionTemplate transactionTemplate; private final TransactionTemplate transactionTemplate;
public UpdateDailyNode(StockService stockService, DailyService dailyService, TuShareService tuShareService, TransactionTemplate transactionTemplate) { public UpdateDailyNode(StockRepository stockRepository, DailyRepository dailyRepository, TuShareService tuShareService, TransactionTemplate transactionTemplate) {
this.stockService = stockService; this.stockRepository = stockRepository;
this.dailyService = dailyService; this.dailyRepository = dailyRepository;
this.tuShareService = tuShareService; this.tuShareService = tuShareService;
this.transactionTemplate = transactionTemplate; this.transactionTemplate = transactionTemplate;
} }
@@ -44,9 +46,9 @@ public class UpdateDailyNode extends NodeComponent {
} }
} }
} }
var existsTradeDates = dailyService.findDistinctTradeDate(); var existsTradeDates = dailyRepository.findDistinctTradeDate();
var nowDate = LocalDate.now(); var nowDate = LocalDate.now();
var stocks = stockService.list(); var stocks = stockRepository.findAll();
var stocksMap = stocks.stream().collect(Collectors.toMap(Stock::getCode, stock -> stock)); var stocksMap = stocks.stream().collect(Collectors.toMap(Stock::getCode, stock -> stock));
tradeDates.stream() tradeDates.stream()
.filter(date -> date.isBefore(nowDate) || date.isEqual(nowDate)) .filter(date -> date.isBefore(nowDate) || date.isEqual(nowDate))
@@ -83,7 +85,7 @@ public class UpdateDailyNode extends NodeComponent {
daily.setTurnover(item.get(10) == null ? null : Double.parseDouble(item.get(10)) * 1000); daily.setTurnover(item.get(10) == null ? null : Double.parseDouble(item.get(10)) * 1000);
daily.setFactor(factor); daily.setFactor(factor);
daily.setStock(stock); daily.setStock(stock);
dailyService.save(daily); dailyRepository.save(daily);
} }
} }
log.info("Trade date: {} {}", tradeDate, count); log.info("Trade date: {} {}", tradeDate, count);

View File

@@ -1,8 +1,12 @@
package com.lanyuanxiaoyao.leopard.server.service.task; package com.lanyuanxiaoyao.leopard.server.service.task;
import cn.hutool.core.util.NumberUtil;
import com.lanyuanxiaoyao.leopard.core.entity.BalanceSheet; import com.lanyuanxiaoyao.leopard.core.entity.BalanceSheet;
import com.lanyuanxiaoyao.leopard.core.entity.CashFlow; import com.lanyuanxiaoyao.leopard.core.entity.CashFlow;
import com.lanyuanxiaoyao.leopard.core.entity.Income; import com.lanyuanxiaoyao.leopard.core.entity.Income;
import com.lanyuanxiaoyao.leopard.core.entity.QBalanceSheet;
import com.lanyuanxiaoyao.leopard.core.entity.QCashFlow;
import com.lanyuanxiaoyao.leopard.core.entity.QIncome;
import com.lanyuanxiaoyao.leopard.core.entity.Stock; import com.lanyuanxiaoyao.leopard.core.entity.Stock;
import com.lanyuanxiaoyao.leopard.core.repository.BalanceSheetRepository; import com.lanyuanxiaoyao.leopard.core.repository.BalanceSheetRepository;
import com.lanyuanxiaoyao.leopard.core.repository.CashFlowRepository; import com.lanyuanxiaoyao.leopard.core.repository.CashFlowRepository;
@@ -25,20 +29,20 @@ import lombok.extern.slf4j.Slf4j;
@Slf4j @Slf4j
@LiteflowComponent("update_finance") @LiteflowComponent("update_finance")
public class UpdateFinanceNode extends TaskNodeComponent { public class UpdateFinanceNode extends TaskNodeComponent {
private final TuShareService tuShareService;
private final StockRepository stockRepository; private final StockRepository stockRepository;
private final IncomeRepository incomeRepository; private final IncomeRepository incomeRepository;
private final BalanceSheetRepository balanceSheetRepository; private final BalanceSheetRepository balanceSheetRepository;
private final CashFlowRepository cashFlowRepository; private final CashFlowRepository cashFlowRepository;
public UpdateFinanceNode(TaskService taskService, TuShareService tuShareService, StockRepository stockRepository, IncomeRepository incomeRepository, BalanceSheetRepository balanceSheetRepository, CashFlowRepository cashFlowRepository) { private final TuShareService tuShareService;
public UpdateFinanceNode(TaskService taskService, StockRepository stockRepository, IncomeRepository incomeRepository, BalanceSheetRepository balanceSheetRepository, CashFlowRepository cashFlowRepository, TuShareService tuShareService) {
super(taskService); super(taskService);
this.tuShareService = tuShareService;
this.stockRepository = stockRepository; this.stockRepository = stockRepository;
this.incomeRepository = incomeRepository; this.incomeRepository = incomeRepository;
this.balanceSheetRepository = balanceSheetRepository; this.balanceSheetRepository = balanceSheetRepository;
this.cashFlowRepository = cashFlowRepository; this.cashFlowRepository = cashFlowRepository;
this.tuShareService = tuShareService;
} }
@Override @Override
@@ -47,7 +51,6 @@ public class UpdateFinanceNode extends TaskNodeComponent {
var stocksMap = stocks.stream().collect(Collectors.toMap(Stock::getCode, stock -> stock)); var stocksMap = stocks.stream().collect(Collectors.toMap(Stock::getCode, stock -> stock));
var currentYear = LocalDate.now().getYear(); var currentYear = LocalDate.now().getYear();
for (int year = 1990; year < currentYear; year++) { for (int year = 1990; year < currentYear; year++) {
var response = tuShareService.incomeList(year); var response = tuShareService.incomeList(year);
for (List<String> item : response.data().items()) { for (List<String> item : response.data().items()) {
var code = item.get(0); var code = item.get(0);
@@ -55,36 +58,38 @@ public class UpdateFinanceNode extends TaskNodeComponent {
continue; continue;
} }
var stock = stocksMap.get(code); var stock = stocksMap.get(code);
var income = new Income(); var income = incomeRepository.findOne(
QIncome.income.year.eq(year)
.and(QIncome.income.stock.code.eq(stock.getCode()))
).orElse(new Income());
income.setStock(stock); income.setStock(stock);
income.setYear(year); income.setYear(year);
income.setBasicEarningsPerShare(Double.parseDouble(item.get(1))); income.setBasicEarningsPerShare(NumberUtil.parseDouble(item.get(1), null));
income.setDilutedEarningsPerShare(Double.parseDouble(item.get(2))); income.setDilutedEarningsPerShare(NumberUtil.parseDouble(item.get(2), null));
income.setTotalOperatingRevenue(Double.parseDouble(item.get(3))); income.setTotalOperatingRevenue(NumberUtil.parseDouble(item.get(3), null));
income.setOperatingRevenue(Double.parseDouble(item.get(4))); income.setOperatingRevenue(NumberUtil.parseDouble(item.get(4), null));
income.setTotalOperatingCost(Double.parseDouble(item.get(5))); income.setTotalOperatingCost(NumberUtil.parseDouble(item.get(5), null));
income.setOperatingCost(Double.parseDouble(item.get(6))); income.setOperatingCost(NumberUtil.parseDouble(item.get(6), null));
income.setSellingExpense(Double.parseDouble(item.get(7))); income.setSellingExpense(NumberUtil.parseDouble(item.get(7), null));
income.setAdministrativeExpense(Double.parseDouble(item.get(8))); income.setAdministrativeExpense(NumberUtil.parseDouble(item.get(8), null));
income.setFinancialExpense(Double.parseDouble(item.get(9))); income.setFinancialExpense(NumberUtil.parseDouble(item.get(9), null));
income.setOperatingExpense(Double.parseDouble(item.get(10))); income.setOperatingExpense(NumberUtil.parseDouble(item.get(10), null));
income.setOperatingProfit(Double.parseDouble(item.get(11))); income.setOperatingProfit(NumberUtil.parseDouble(item.get(11), null));
income.setAddNonOperatingIncome(Double.parseDouble(item.get(12))); income.setAddNonOperatingIncome(NumberUtil.parseDouble(item.get(12), null));
income.setLessNonOperatingExpense(Double.parseDouble(item.get(13))); income.setLessNonOperatingExpense(NumberUtil.parseDouble(item.get(13), null));
income.setTotalProfit(Double.parseDouble(item.get(14))); income.setTotalProfit(NumberUtil.parseDouble(item.get(14), null));
income.setIncomeTaxExpense(Double.parseDouble(item.get(15))); income.setIncomeTaxExpense(NumberUtil.parseDouble(item.get(15), null));
income.setNetProfitIncludingMinorityInterest(Double.parseDouble(item.get(16))); income.setNetProfitIncludingMinorityInterest(NumberUtil.parseDouble(item.get(16), null));
income.setNetProfitExcludingMinorityInterest(Double.parseDouble(item.get(17))); income.setNetProfitExcludingMinorityInterest(NumberUtil.parseDouble(item.get(17), null));
income.setComprehensiveIncomeAttributableToParent(Double.parseDouble(item.get(18))); income.setComprehensiveIncomeAttributableToParent(NumberUtil.parseDouble(item.get(18), null));
income.setComprehensiveIncomeAttributableToMinorityShareholders(Double.parseDouble(item.get(19))); income.setComprehensiveIncomeAttributableToMinorityShareholders(NumberUtil.parseDouble(item.get(19), null));
income.setEarningsBeforeInterestAndTax(Double.parseDouble(item.get(20))); income.setEarningsBeforeInterestAndTax(NumberUtil.parseDouble(item.get(20), null));
income.setEarningsBeforeInterestTaxDepreciationAndAmortization(Double.parseDouble(item.get(21))); income.setBeginningUndistributedProfit(NumberUtil.parseDouble(item.get(21), null));
income.setBeginningUndistributedProfit(Double.parseDouble(item.get(22))); income.setDistributableProfit(NumberUtil.parseDouble(item.get(22), null));
income.setDistributableProfit(Double.parseDouble(item.get(23))); income.setResearchAndDevelopmentExpense(NumberUtil.parseDouble(item.get(23), null));
income.setResearchAndDevelopmentExpense(Double.parseDouble(item.get(24))); income.setFinancialExpenseInterestExpense(NumberUtil.parseDouble(item.get(24), null));
income.setFinancialExpenseInterestExpense(Double.parseDouble(item.get(25))); income.setNetProfitFromContinuingOperations(NumberUtil.parseDouble(item.get(25), null));
income.setNetProfitFromContinuingOperations(Double.parseDouble(item.get(26))); income.setNetProfitFromDiscontinuedOperations(NumberUtil.parseDouble(item.get(26), null));
income.setNetProfitFromDiscontinuedOperations(Double.parseDouble(item.get(27)));
incomeRepository.save(income); incomeRepository.save(income);
} }
@@ -95,39 +100,42 @@ public class UpdateFinanceNode extends TaskNodeComponent {
continue; continue;
} }
var stock = stocksMap.get(code); var stock = stocksMap.get(code);
var balanceSheet = new BalanceSheet(); var balanceSheet = balanceSheetRepository.findOne(
QBalanceSheet.balanceSheet.year.eq(year)
.and(QBalanceSheet.balanceSheet.stock.code.eq(stock.getCode()))
).orElse(new BalanceSheet());
balanceSheet.setStock(stock); balanceSheet.setStock(stock);
balanceSheet.setYear(year); balanceSheet.setYear(year);
balanceSheet.setEndingTotalShares(Double.parseDouble(item.get(1))); balanceSheet.setEndingTotalShares(NumberUtil.parseDouble(item.get(1), null));
balanceSheet.setCapitalSurplus(Double.parseDouble(item.get(2))); balanceSheet.setCapitalSurplus(NumberUtil.parseDouble(item.get(2), null));
balanceSheet.setUndistributedProfit(Double.parseDouble(item.get(3))); balanceSheet.setUndistributedProfit(NumberUtil.parseDouble(item.get(3), null));
balanceSheet.setMonetaryFunds(Double.parseDouble(item.get(4))); balanceSheet.setMonetaryFunds(NumberUtil.parseDouble(item.get(4), null));
balanceSheet.setAccountsReceivable(Double.parseDouble(item.get(5))); balanceSheet.setAccountsReceivable(NumberUtil.parseDouble(item.get(5), null));
balanceSheet.setInventories(Double.parseDouble(item.get(6))); balanceSheet.setInventories(NumberUtil.parseDouble(item.get(6), null));
balanceSheet.setTotalCurrentAssets(Double.parseDouble(item.get(7))); balanceSheet.setTotalCurrentAssets(NumberUtil.parseDouble(item.get(7), null));
balanceSheet.setLongTermEquityInvestments(Double.parseDouble(item.get(8))); balanceSheet.setLongTermEquityInvestments(NumberUtil.parseDouble(item.get(8), null));
balanceSheet.setLongTermReceivables(Double.parseDouble(item.get(9))); balanceSheet.setLongTermReceivables(NumberUtil.parseDouble(item.get(9), null));
balanceSheet.setFixedAssets(Double.parseDouble(item.get(10))); balanceSheet.setFixedAssets(NumberUtil.parseDouble(item.get(10), null));
balanceSheet.setResearchAndDevelopmentExpenditures(Double.parseDouble(item.get(11))); balanceSheet.setResearchAndDevelopmentExpenditures(NumberUtil.parseDouble(item.get(11), null));
balanceSheet.setGoodwill(Double.parseDouble(item.get(12))); balanceSheet.setGoodwill(NumberUtil.parseDouble(item.get(12), null));
balanceSheet.setTotalNonCurrentAssets(Double.parseDouble(item.get(13))); balanceSheet.setTotalNonCurrentAssets(NumberUtil.parseDouble(item.get(13), null));
balanceSheet.setTotalAssets(Double.parseDouble(item.get(14))); balanceSheet.setTotalAssets(NumberUtil.parseDouble(item.get(14), null));
balanceSheet.setLongTermBorrowings(Double.parseDouble(item.get(15))); balanceSheet.setLongTermBorrowings(NumberUtil.parseDouble(item.get(15), null));
balanceSheet.setShortTermBorrowings(Double.parseDouble(item.get(16))); balanceSheet.setShortTermBorrowings(NumberUtil.parseDouble(item.get(16), null));
balanceSheet.setAccountsPayable(Double.parseDouble(item.get(17))); balanceSheet.setAccountsPayable(NumberUtil.parseDouble(item.get(17), null));
balanceSheet.setAdvancesReceived(Double.parseDouble(item.get(18))); balanceSheet.setAdvancesReceived(NumberUtil.parseDouble(item.get(18), null));
balanceSheet.setTotalCurrentLiabilities(Double.parseDouble(item.get(19))); balanceSheet.setTotalCurrentLiabilities(NumberUtil.parseDouble(item.get(19), null));
balanceSheet.setTotalNonCurrentLiabilities(Double.parseDouble(item.get(20))); balanceSheet.setTotalNonCurrentLiabilities(NumberUtil.parseDouble(item.get(20), null));
balanceSheet.setTotalLiabilities(Double.parseDouble(item.get(21))); balanceSheet.setTotalLiabilities(NumberUtil.parseDouble(item.get(21), null));
balanceSheet.setTotalShareholdersEquityExcludingMinorityInterest(Double.parseDouble(item.get(22))); balanceSheet.setTotalShareholdersEquityExcludingMinorityInterest(NumberUtil.parseDouble(item.get(22), null));
balanceSheet.setTotalShareholdersEquityIncludingMinorityInterest(Double.parseDouble(item.get(23))); balanceSheet.setTotalShareholdersEquityIncludingMinorityInterest(NumberUtil.parseDouble(item.get(23), null));
balanceSheet.setTotalLiabilitiesAndShareholdersEquity(Double.parseDouble(item.get(24))); balanceSheet.setTotalLiabilitiesAndShareholdersEquity(NumberUtil.parseDouble(item.get(24), null));
balanceSheet.setAccountsReceivable(Double.parseDouble(item.get(25))); balanceSheet.setAccountsReceivable(NumberUtil.parseDouble(item.get(25), null));
balanceSheet.setPayables(Double.parseDouble(item.get(26))); balanceSheet.setPayables(NumberUtil.parseDouble(item.get(26), null));
balanceSheet.setNotesAndAccountsReceivable(Double.parseDouble(item.get(27))); balanceSheet.setNotesAndAccountsReceivable(NumberUtil.parseDouble(item.get(27), null));
balanceSheet.setNotesAndAccountsPayable(Double.parseDouble(item.get(28))); balanceSheet.setNotesAndAccountsPayable(NumberUtil.parseDouble(item.get(28), null));
balanceSheet.setOtherReceivablesTotal(Double.parseDouble(item.get(29))); balanceSheet.setOtherReceivablesTotal(NumberUtil.parseDouble(item.get(29), null));
balanceSheet.setFixedAssetsTotal(Double.parseDouble(item.get(30))); balanceSheet.setFixedAssetsTotal(NumberUtil.parseDouble(item.get(30), null));
balanceSheetRepository.save(balanceSheet); balanceSheetRepository.save(balanceSheet);
} }
@@ -138,21 +146,25 @@ public class UpdateFinanceNode extends TaskNodeComponent {
continue; continue;
} }
var stock = stocksMap.get(code); var stock = stocksMap.get(code);
var cashFlow = new CashFlow(); var cashFlow = cashFlowRepository.findOne(
QCashFlow.cashFlow.year.eq(year)
.and(QCashFlow.cashFlow.stock.code.eq(stock.getCode()))
).orElse(new CashFlow());
NumberUtil.parseDouble(item.get(1), null);
cashFlow.setStock(stock); cashFlow.setStock(stock);
cashFlow.setYear(year); cashFlow.setYear(year);
cashFlow.setNetProfit(Double.parseDouble(item.get(1))); cashFlow.setNetProfit(NumberUtil.parseDouble(item.get(1), null));
cashFlow.setFinancialExpense(Double.parseDouble(item.get(2))); cashFlow.setFinancialExpense(NumberUtil.parseDouble(item.get(2), null));
cashFlow.setCashReceivedFromSalesAndServices(Double.parseDouble(item.get(3))); cashFlow.setCashReceivedFromSalesAndServices(NumberUtil.parseDouble(item.get(3), null));
cashFlow.setSubtotalOfCashInflowsFromOperatingActivities(Double.parseDouble(item.get(4))); cashFlow.setSubtotalOfCashInflowsFromOperatingActivities(NumberUtil.parseDouble(item.get(4), null));
cashFlow.setCashPaidToAndForEmployees(Double.parseDouble(item.get(5))); cashFlow.setCashPaidToAndForEmployees(NumberUtil.parseDouble(item.get(5), null));
cashFlow.setCashPaidForVariousTaxes(Double.parseDouble(item.get(6))); cashFlow.setCashPaidForVariousTaxes(NumberUtil.parseDouble(item.get(6), null));
cashFlow.setNetCashFlowFromOperatingActivities(Double.parseDouble(item.get(7))); cashFlow.setNetCashFlowFromOperatingActivities(NumberUtil.parseDouble(item.get(7), null));
cashFlow.setSubtotalOfCashInflowsFromInvestingActivities(Double.parseDouble(item.get(8))); cashFlow.setSubtotalOfCashInflowsFromInvestingActivities(NumberUtil.parseDouble(item.get(8), null));
cashFlow.setCashPaidForAcquisitionOfFixedIntangibleAndOtherLongTermAssets(Double.parseDouble(item.get(9))); cashFlow.setCashPaidForLongTermAssets(NumberUtil.parseDouble(item.get(9), null));
cashFlow.setSubtotalOfCashOutflowsFromInvestingActivities(Double.parseDouble(item.get(10))); cashFlow.setSubtotalOfCashOutflowsFromInvestingActivities(NumberUtil.parseDouble(item.get(10), null));
cashFlow.setSubtotalOfCashOutflowsFromFinancingActivities(Double.parseDouble(item.get(11))); cashFlow.setSubtotalOfCashOutflowsFromFinancingActivities(NumberUtil.parseDouble(item.get(11), null));
cashFlow.setBeginningBalanceOfCashAndCashEquivalents(Double.parseDouble(item.get(12))); cashFlow.setBeginningBalanceOfCashAndCashEquivalents(NumberUtil.parseDouble(item.get(12), null));
cashFlowRepository.save(cashFlow); cashFlowRepository.save(cashFlow);
} }

View File

@@ -2,7 +2,7 @@ package com.lanyuanxiaoyao.leopard.server.service.task;
import cn.hutool.core.util.EnumUtil; import cn.hutool.core.util.EnumUtil;
import com.lanyuanxiaoyao.leopard.core.entity.Stock; import com.lanyuanxiaoyao.leopard.core.entity.Stock;
import com.lanyuanxiaoyao.leopard.server.service.StockService; import com.lanyuanxiaoyao.leopard.core.repository.StockRepository;
import com.lanyuanxiaoyao.leopard.server.service.TuShareService; import com.lanyuanxiaoyao.leopard.server.service.TuShareService;
import com.yomahub.liteflow.annotation.LiteflowComponent; import com.yomahub.liteflow.annotation.LiteflowComponent;
import com.yomahub.liteflow.core.NodeComponent; import com.yomahub.liteflow.core.NodeComponent;
@@ -13,18 +13,19 @@ import java.util.stream.Collectors;
@LiteflowComponent("update_stock") @LiteflowComponent("update_stock")
public class UpdateStockNode extends NodeComponent { public class UpdateStockNode extends NodeComponent {
private final StockService stockService; private final StockRepository stockRepository;
private final TuShareService tuShareService; private final TuShareService tuShareService;
public UpdateStockNode(StockService stockService, TuShareService tuShareService) { public UpdateStockNode(StockRepository stockRepository, TuShareService tuShareService) {
this.stockService = stockService; this.stockRepository = stockRepository;
this.tuShareService = tuShareService; this.tuShareService = tuShareService;
} }
@Transactional(rollbackOn = Throwable.class) @Transactional(rollbackOn = Throwable.class)
@Override @Override
public void process() { public void process() {
var stocks = stockService.list(); var stocks = stockRepository.findAll();
var stocksMap = stocks.stream().collect(Collectors.toMap(Stock::getCode, stock -> stock)); var stocksMap = stocks.stream().collect(Collectors.toMap(Stock::getCode, stock -> stock));
var targetCodes = new HashSet<String>(); var targetCodes = new HashSet<String>();
tuShareService.stockList() tuShareService.stockList()
@@ -60,8 +61,8 @@ public class UpdateStockNode extends NodeComponent {
.filter(stock -> !targetCodes.contains(stock.getCode())) .filter(stock -> !targetCodes.contains(stock.getCode()))
.map(Stock::getId) .map(Stock::getId)
.toList(); .toList();
stockService.remove(deleteStocks); stockRepository.deleteByIds(deleteStocks);
stockService.save(stocks); stockRepository.saveAll(stocks);
} }
} }

View File

@@ -9,12 +9,9 @@ spring:
async: async:
request-timeout: 3600000 request-timeout: 3600000
datasource: datasource:
# url: jdbc:mysql://mysql.lanyuanxiaoyao.com:43780/leopard?useSSL=false
# url: jdbc:mysql://192.168.31.127:3780/leopard?useSSL=false
url: jdbc:postgresql://81.71.3.24:6785/leopard_dev url: jdbc:postgresql://81.71.3.24:6785/leopard_dev
username: leopard username: leopard
password: '9NEzFzovnddf@PyEP?e*AYAWnCyd7UhYwQK$pJf>7?ccFiN^x4$eKEZ5~E<7<+~X' password: '9NEzFzovnddf@PyEP?e*AYAWnCyd7UhYwQK$pJf>7?ccFiN^x4$eKEZ5~E<7<+~X'
# driver-class-name: com.mysql.cj.jdbc.Driver
driver-class-name: org.postgresql.Driver driver-class-name: org.postgresql.Driver
jpa: jpa:
generate-ddl: true generate-ddl: true

View File

@@ -1,13 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE flow PUBLIC "liteflow" "https://liteflow.cc/liteflow.dtd">
<flow>
<chain id="update_stock_information">
CATCH(THEN(task_start, update_stock, task_end)).DO(task_error)
</chain>
<chain id="update_daily_information">
CATCH(THEN(task_start, update_daily, task_end)).DO(task_error)
</chain>
<chain id="check_daily">
CATCH(THEN(task_start, check_daily, task_end)).DO(task_error)
</chain>
</flow>

View File

@@ -171,8 +171,20 @@ Content-Type: application/json
"period": "20231231" "period": "20231231"
}, },
"fields": [ "fields": [
"ann_date", "ts_code",
"n_cashflow_act" "net_profit",
"finan_exp",
"c_fr_sale_sg",
"c_inf_fr_operate_a",
"c_paid_to_for_empl",
"c_paid_for_taxes",
"n_cashflow_act",
"stot_inflows_inv_act",
"c_pay_acq_const_fiolta",
"stot_out_inv_act",
"stot_cashout_fnc_act",
"c_cash_equ_beg_period",
"c_cash_equ_end_period"
] ]
} }
@@ -181,16 +193,44 @@ POST {{api_url}}
Content-Type: application/json Content-Type: application/json
{ {
"api_name": "balancesheet", "api_name": "balancesheet_vip",
"token": "{{api_key}}", "token": "{{api_key}}",
"params": { "params": {
"ts_code": "000002.SZ", "ts_code": "000001.SZ",
"period": "20231231" "period": "20241231"
}, },
"fields": [ "fields": [
"ann_date", "ts_code",
"total_share",
"cap_rese",
"undistr_porfit",
"money_cap",
"accounts_receiv",
"inventories",
"total_cur_assets",
"lt_eqt_invest",
"lt_rec",
"fix_assets",
"r_and_d",
"goodwill",
"total_nca",
"total_assets",
"lt_borr",
"st_borr",
"acct_payable",
"adv_receipts",
"total_cur_liab", "total_cur_liab",
"oth_cur_liab" "total_ncl",
"total_liab",
"total_hldr_eqy_exc_min_int",
"total_hldr_eqy_inc_min_int",
"total_liab_hldr_eqy",
"acc_receivable",
"payables",
"accounts_receiv_bill",
"accounts_pay",
"oth_rcv_total",
"fix_assets_total"
] ]
} }