From c6ee4fd46a9a2ab6fc9c4dba3dcd8a4374666c4e Mon Sep 17 00:00:00 2001 From: easonzhu Date: Mon, 17 Mar 2025 19:44:22 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B4=A2=E5=8A=A1=E6=8E=A5=E5=8F=A3=E5=AE=8C?= =?UTF-8?q?=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 5 - .../common/config/cache/CacheConfig.java | 2 +- .../handler/GlobalExceptionHandler.java | 2 - .../diagnose/common/service/CacheService.java | 6 +- .../com/diagnose/constant/PriceTableName.java | 19 ++++ .../controller/DiagnoseController.java | 28 +++++- .../com/diagnose/mapper/DiagnoseMapper.java | 16 ++++ .../com/diagnose/mapper/FinanceMapper.java | 8 ++ .../java/com/diagnose/mapper/StockMapper.java | 37 ++++++++ .../com/diagnose/service/SearchService.java | 1 - .../com/diagnose/service/StockService.java | 92 +++++++++++++++++-- .../java/com/diagnose/util/StringMatcher.java | 80 ---------------- .../java/com/diagnose/util/TestSearch.java | 34 ------- .../vo/ComprehensiveEvaluationVO.java | 3 +- .../com/diagnose/vo/DiagnoseValuationVO.java | 86 +++++++++++++++++ .../com/diagnose/vo/FinanceCashShortVO.java | 2 + .../diagnose/vo/FinanceIndexAnalysisVO.java | 3 +- .../java/com/diagnose/vo/FinanceRankVO.java | 65 +++++++++++++ .../vo/FinancialValuationExtendVO.java | 54 +++++++++++ .../com/diagnose/vo/FinancialValuationVO.java | 39 +++++--- src/main/java/com/diagnose/vo/KLineVO.java | 66 +++++++++++++ .../diagnose/vo/QuantitativeAnalysisVO.java | 56 +++++++++++ .../java/com/diagnose/vo/StockPriceVO.java | 55 +++++++++++ src/main/java/com/diagnose/vo/StockVO.java | 15 +++ .../com/diagnose/vo/ValuationAnalysisVO.java | 42 +++++++++ 25 files changed, 666 insertions(+), 150 deletions(-) create mode 100644 src/main/java/com/diagnose/constant/PriceTableName.java delete mode 100644 src/main/java/com/diagnose/util/StringMatcher.java delete mode 100644 src/main/java/com/diagnose/util/TestSearch.java create mode 100644 src/main/java/com/diagnose/vo/DiagnoseValuationVO.java create mode 100644 src/main/java/com/diagnose/vo/FinanceRankVO.java create mode 100644 src/main/java/com/diagnose/vo/FinancialValuationExtendVO.java create mode 100644 src/main/java/com/diagnose/vo/KLineVO.java create mode 100644 src/main/java/com/diagnose/vo/QuantitativeAnalysisVO.java create mode 100644 src/main/java/com/diagnose/vo/StockPriceVO.java create mode 100644 src/main/java/com/diagnose/vo/ValuationAnalysisVO.java diff --git a/pom.xml b/pom.xml index d23f351..6c61e7d 100644 --- a/pom.xml +++ b/pom.xml @@ -95,11 +95,6 @@ hutool-all 5.8.3 - - org.ahocorasick - ahocorasick - 0.6.3 - org.jsoup jsoup diff --git a/src/main/java/com/diagnose/common/config/cache/CacheConfig.java b/src/main/java/com/diagnose/common/config/cache/CacheConfig.java index 65f1ae8..0004d66 100644 --- a/src/main/java/com/diagnose/common/config/cache/CacheConfig.java +++ b/src/main/java/com/diagnose/common/config/cache/CacheConfig.java @@ -5,7 +5,7 @@ import com.hazelcast.config.InMemoryFormat; import java.util.HashMap; import java.util.Map; -import static com.diagnose.common.config.cache.CacheKey.*; +import static com.diagnose.common.config.cache.CacheKey.DISTRIBUTED_LOCK; public class CacheConfig { diff --git a/src/main/java/com/diagnose/common/handler/GlobalExceptionHandler.java b/src/main/java/com/diagnose/common/handler/GlobalExceptionHandler.java index 724b260..3a5f1b3 100644 --- a/src/main/java/com/diagnose/common/handler/GlobalExceptionHandler.java +++ b/src/main/java/com/diagnose/common/handler/GlobalExceptionHandler.java @@ -1,6 +1,5 @@ package com.diagnose.common.handler; -import com.google.common.collect.ImmutableSet; import com.diagnose.common.result.CommonResult; import com.diagnose.common.result.ResponseStatus; import com.diagnose.common.util.logger.LoggerUtil; @@ -16,7 +15,6 @@ import org.springframework.web.bind.annotation.ResponseBody; import javax.servlet.http.HttpServletRequest; import javax.validation.ConstraintViolationException; -import java.util.Set; @ControllerAdvice public class GlobalExceptionHandler { diff --git a/src/main/java/com/diagnose/common/service/CacheService.java b/src/main/java/com/diagnose/common/service/CacheService.java index 61ba507..1a8b343 100644 --- a/src/main/java/com/diagnose/common/service/CacheService.java +++ b/src/main/java/com/diagnose/common/service/CacheService.java @@ -1,15 +1,15 @@ package com.diagnose.common.service; import com.alibaba.fastjson.JSONObject; +import com.diagnose.common.config.cache.CacheKey; import com.diagnose.common.entity.ScheduleLog; +import com.diagnose.common.handler.BizException; +import com.diagnose.common.util.logger.LoggerUtil; import com.hazelcast.collection.ISet; import com.hazelcast.core.HazelcastInstance; import com.hazelcast.crdt.pncounter.PNCounter; import com.hazelcast.instance.impl.HazelcastInstanceProxy; import com.hazelcast.map.IMap; -import com.diagnose.common.config.cache.CacheKey; -import com.diagnose.common.handler.BizException; -import com.diagnose.common.util.logger.LoggerUtil; import org.apache.commons.lang3.exception.ExceptionUtils; import org.springframework.stereotype.Component; diff --git a/src/main/java/com/diagnose/constant/PriceTableName.java b/src/main/java/com/diagnose/constant/PriceTableName.java new file mode 100644 index 0000000..8ee6678 --- /dev/null +++ b/src/main/java/com/diagnose/constant/PriceTableName.java @@ -0,0 +1,19 @@ +package com.diagnose.constant; + +// 股票市场 1:深圳 2:上海 8:北京 +public enum PriceTableName { + + SZ("stk_basic_price_mid", "深圳"), + SH("stk_basic_price_mid", "上海"), + BJ("bse_stk_basic_price", "北京"), + ; + + public final String tableName; + public final String name; + + PriceTableName(String tableName, String name) { + this.tableName = tableName; + this.name = name; + } + +} diff --git a/src/main/java/com/diagnose/controller/DiagnoseController.java b/src/main/java/com/diagnose/controller/DiagnoseController.java index 9d7c20c..f384510 100644 --- a/src/main/java/com/diagnose/controller/DiagnoseController.java +++ b/src/main/java/com/diagnose/controller/DiagnoseController.java @@ -3,9 +3,7 @@ package com.diagnose.controller; import com.diagnose.common.result.CommonResult; import com.diagnose.service.SearchService; import com.diagnose.service.StockService; -import com.diagnose.vo.ComprehensiveEvaluationVO; -import com.diagnose.vo.FinancialValuationVO; -import com.diagnose.vo.StockVO; +import com.diagnose.vo.*; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; @@ -15,6 +13,8 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import java.util.List; @@ -50,5 +50,27 @@ public class DiagnoseController { return CommonResult.success(vo); } + @ApiOperation("财务估值-更多") + @GetMapping("/diagnose/financialValuationExtend") + public CommonResult financialValuationExtend(@RequestParam("证券统一编码") @Validated @NotNull @ApiParam(required = true) Long stkUniCode) { + FinancialValuationExtendVO vo = stockService.financialValuationExtend(stkUniCode); + return CommonResult.success(vo); + } + + @ApiOperation("财务估值-估值分析") + @GetMapping("/diagnose/financialValuationAnalysis") + public CommonResult> financialValuationAnalysis(@RequestParam("证券统一编码") @Validated @NotNull @ApiParam(required = true) Long stkUniCode, + @RequestParam("周期 1、3、5、10年") @Validated @NotNull @Min(1) @Max(10) @ApiParam(required = true) Integer timeSpan, + @RequestParam("类型 2:市盈率 3:市净率") @Validated @NotNull @Min(2) @Max(3) @ApiParam(required = true) Integer type) { + List list = stockService.financialValuationAnalysis(stkUniCode, timeSpan, type); + return CommonResult.success(list); + } + + @ApiOperation("量化分析") + @GetMapping("/diagnose/quantitativeAnalysis") + public CommonResult quantitativeAnalysis(@RequestParam("证券统一编码") @Validated @NotNull @ApiParam(required = true) Long stkUniCode) { + QuantitativeAnalysisVO vo = stockService.quantitativeAnalysis(stkUniCode); + return CommonResult.success(vo); + } } diff --git a/src/main/java/com/diagnose/mapper/DiagnoseMapper.java b/src/main/java/com/diagnose/mapper/DiagnoseMapper.java index fc753c8..0b04cd8 100644 --- a/src/main/java/com/diagnose/mapper/DiagnoseMapper.java +++ b/src/main/java/com/diagnose/mapper/DiagnoseMapper.java @@ -3,6 +3,8 @@ package com.diagnose.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.diagnose.vo.DiagnoseBackTestVO; import com.diagnose.vo.DiagnoseRankVO; +import com.diagnose.vo.DiagnoseValuationVO; +import com.diagnose.vo.QuantitativeAnalysisVO; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; @@ -31,4 +33,18 @@ public interface DiagnoseMapper extends BaseMapper { ") t WHERE t.rk = 1") List selectBackTest(@Param("star") BigDecimal star); + @Select("SELECT * FROM (" + + " SELECT TIME_SPAN, Q_30_PE, Q_70_PE, CURRENT_Q_PE, Q_30_PB, Q_70_PB, CURRENT_Q_PB, RANK() OVER (PARTITION BY stk_uni_code ORDER BY trade_date DESC) AS rk\n" + + " FROM _fe_stk_diag_valuation\n" + + " WHERE stk_uni_code = #{stkUniCode} AND isvalid = 1\n" + + ") t WHERE t.rk = 1") + List selectDiagnoseValuation(@Param("stkUniCode") Long stkUniCode); + + @Select("SELECT * FROM (" + + " SELECT tech_sum_mac, stk_spt_lvl, stk_prs_lvl, ROW_NUMBER() OVER (PARTITION BY stk_code, mkt_num ORDER BY trd_date DESC) AS rn\n" + + " FROM vol_pri_fac\n" + + " WHERE stk_code = #{stkCode} AND mkt_num = #{mktNum}\n" + + ") t WHERE t.rn = 1") + QuantitativeAnalysisVO selectQuantitativeAnalysis(@Param("stkCode") String stkCode, @Param("mktNum") Integer mktNum); + } diff --git a/src/main/java/com/diagnose/mapper/FinanceMapper.java b/src/main/java/com/diagnose/mapper/FinanceMapper.java index d1e4aa0..644076a 100644 --- a/src/main/java/com/diagnose/mapper/FinanceMapper.java +++ b/src/main/java/com/diagnose/mapper/FinanceMapper.java @@ -3,6 +3,7 @@ package com.diagnose.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.diagnose.vo.FinanceCashShortVO; import com.diagnose.vo.FinanceIndexAnalysisVO; +import com.diagnose.vo.FinanceRankVO; import com.diagnose.vo.FinancialValuationVO; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; @@ -32,4 +33,11 @@ public interface FinanceMapper extends BaseMapper { ") t WHERE t.rn <= 5") List selectFinanceCashShort(@Param("stkCode") String stkCode, @Param("secMarPar") Integer secMarPar); + @Select("SELECT * FROM (" + + " SELECT profit_indu_rank, growth_indu_rank, operate_indu_rank, debt_indu_rank, cash_indu_rank, ROW_NUMBER() OVER (PARTITION BY stk_uni_code ORDER BY end_date DESC) AS rn\n" + + " FROM _fe_stk_diag_fin_rank\n" + + " WHERE stk_uni_code = #{stkUniCode}\n" + + ") t WHERE t.rn = 1") + FinanceRankVO selectFinanceRank(@Param("stkUniCode") Long stkUniCode); + } diff --git a/src/main/java/com/diagnose/mapper/StockMapper.java b/src/main/java/com/diagnose/mapper/StockMapper.java index 1c3ed18..467b6c1 100644 --- a/src/main/java/com/diagnose/mapper/StockMapper.java +++ b/src/main/java/com/diagnose/mapper/StockMapper.java @@ -1,7 +1,11 @@ package com.diagnose.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.diagnose.vo.KLineVO; +import com.diagnose.vo.StockPriceVO; import com.diagnose.vo.StockVO; +import com.diagnose.vo.ValuationAnalysisVO; +import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; import java.util.List; @@ -16,4 +20,37 @@ public interface StockMapper extends BaseMapper { "ON sp.plate_uni_code = pi.plate_uni_code") List selectAllStock(); + @Select("SELECT * FROM (\n" + + " SELECT end_date, close_price, stk_per_ttm, price_bookv_ratio, row_number() OVER (PARTITION BY stk_uni_code ORDER BY end_date DESC) AS rn\n" + + " FROM ${tableName}\n" + + " WHERE stk_uni_code = #{stkUniCode} AND isvalid = 1\n" + + ") t WHERE t.rn = 1") + StockPriceVO selectLatestPrice(@Param("tableName") String tableName, @Param("stkUniCode") Long stkUniCode); + + @Select("SELECT s.end_date, s.${stockValueColumn} AS stock_value, p.avg_1 AS plate_value\n" + + "FROM ${tableName} s\n" + + "JOIN plate_val_info p\n" + + "ON s.end_date = p.end_date\n" + + "WHERE s.stk_uni_code = #{stkUniCode}\n" + + " AND s.end_date >= DATE_SUB(CURDATE(), INTERVAL #{year} YEAR)\n" + + " AND s.isvalid = 1\n" + + " AND p.plate_uni_code = #{plateUniCode}\n" + + " AND p.end_date >= DATE_SUB(CURDATE(), INTERVAL #{year} YEAR)\n" + + " AND p.val_index_par = #{type}" + + " AND p.isvalid = 1\n" + + "ORDER BY s.end_date") + List selectFinancialValuationAnalysis(@Param("tableName") String tableName, + @Param("stockValueColumn") String stockValueColumn, + @Param("stkUniCode") Long stkUniCode, + @Param("plateUniCode") Long plateUniCode, + @Param("year") Integer year, + @Param("type") Integer type); + + @Select("SELECT s.trade_date, s.open_price, s.close_price, s.high_price, s.low_price\n" + + "FROM ${tableName} s\n" + + "WHERE s.stk_uni_code = #{stkUniCode}\n" + + " AND s.trade_date >= DATE_SUB(CURDATE(), INTERVAL #{month} MONTH)\n" + + " AND s.isvalid = 1\n" + + "ORDER BY s.trade_date") + List selectKLine(@Param("tableName") String tableName, @Param("stkUniCode") Long stkUniCode, @Param("month") int month); } diff --git a/src/main/java/com/diagnose/service/SearchService.java b/src/main/java/com/diagnose/service/SearchService.java index bcf1b06..19ea195 100644 --- a/src/main/java/com/diagnose/service/SearchService.java +++ b/src/main/java/com/diagnose/service/SearchService.java @@ -5,7 +5,6 @@ import com.diagnose.vo.StockVO; import org.springframework.stereotype.Service; import javax.annotation.Resource; -import javax.validation.constraints.NotNull; import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; diff --git a/src/main/java/com/diagnose/service/StockService.java b/src/main/java/com/diagnose/service/StockService.java index 6acba3f..d059a21 100644 --- a/src/main/java/com/diagnose/service/StockService.java +++ b/src/main/java/com/diagnose/service/StockService.java @@ -1,5 +1,7 @@ package com.diagnose.service; +import com.diagnose.common.handler.BizException; +import com.diagnose.common.result.ResponseStatus; import com.diagnose.mapper.DiagnoseMapper; import com.diagnose.mapper.FinanceMapper; import com.diagnose.mapper.StockMapper; @@ -20,6 +22,8 @@ public class StockService { private static long cacheTime = 0; + private static final int kLineMonth = 3; + private List stockListCache = null; private Map stockMapCache = null; // @@ -55,6 +59,9 @@ public class StockService { public DiagnoseRankVO rank(StockVO stock) { DiagnoseRankVO diagnoseRankVO = diagnoseMapper.selectRank(stock.getSecUniCode()); + if (diagnoseRankVO == null) { + return null; + } Integer totalInduCount = diagnoseMapper.selectTotalInduCount(stock.getPlateUniCode()); Integer totalMktCount = diagnoseMapper.selectTotalMktCount(); diagnoseRankVO.setTotalInduCount(totalInduCount); @@ -67,15 +74,15 @@ public class StockService { if (stock == null) { return null; } - DiagnoseRankVO diagnoseRankVO = rank(stock); - BigDecimal star = diagnoseRankVO.getTotalStar(); - if (star == null) { - return null; - } - List backTestList = diagnoseMapper.selectBackTest(star); ComprehensiveEvaluationVO vo = new ComprehensiveEvaluationVO(); vo.setStock(stock); + DiagnoseRankVO diagnoseRankVO = rank(stock); vo.setRank(diagnoseRankVO); + BigDecimal star = diagnoseRankVO.getTotalStar(); + if (star == null) { + return vo; + } + List backTestList = diagnoseMapper.selectBackTest(star); vo.setBackTestList(backTestList); return vo; } @@ -85,10 +92,44 @@ public class StockService { if (stock == null) { return null; } + Long secUniCode = stock.getSecUniCode(); String secCode = stock.getSecCode(); Integer mktNum = stock.getMktNum(); + // 总结性机器语 & 财务估值得分 FinancialValuationVO vo = financeMapper.selectFinancialValuation(secCode, mktNum); + if (vo == null) { + return null; + } + // 财务分析行业排名 + FinanceRankVO financeRank = financeMapper.selectFinanceRank(secUniCode); + vo.setFinanceRank(financeRank); + // 估值分析 + List diagnoseValuationList = diagnoseMapper.selectDiagnoseValuation(secUniCode); + vo.setDiagnoseValuationList(diagnoseValuationList); + // 行情估值 + String tableName = stock.getPriceTableName(); + StockPriceVO stockPrice = stockMapper.selectLatestPrice(tableName, secUniCode); + vo.setStockPrice(stockPrice); + return vo; + } + + public FinancialValuationExtendVO financialValuationExtend(Long stkUniCode) { + StockVO stock = getStock(stkUniCode); + if (stock == null) { + return null; + } + String secCode = stock.getSecCode(); + Integer mktNum = stock.getMktNum(); Integer secMarPar = stock.getSecMarPar(); + // 总结性机器语 & 财务估值得分 + FinancialValuationVO baseVO = financeMapper.selectFinancialValuation(secCode, mktNum); + if (baseVO != null) { + return null; + } + FinancialValuationExtendVO vo = new FinancialValuationExtendVO(); + vo.setFinSumMac(baseVO.getFinSumMac()); + vo.setScore(baseVO.getScore()); + // 财务指标分析列表 List financeIndexAnalysisList = financeMapper.selectFinanceIndexAnalysis(secCode, secMarPar); financeIndexAnalysisList.forEach(fiaVO -> { if (fiaVO.getEndDate() != null && fiaVO.getEndDate().length() > 10) { @@ -96,6 +137,7 @@ public class StockService { } }); vo.setFinanceIndexAnalysisList(financeIndexAnalysisList); + // 现金流量列表 List financeCashShortList = financeMapper.selectFinanceCashShort(secCode, secMarPar); financeCashShortList.forEach(fcsVO -> { if (fcsVO.getEndDate() != null && fcsVO.getEndDate().length() > 10) { @@ -106,4 +148,42 @@ public class StockService { return vo; } + public List financialValuationAnalysis(Long stkUniCode, Integer timeSpan, Integer type) { + StockVO stock = getStock(stkUniCode); + if (stock == null) { + return null; + } + String tableName = stock.getPriceTableName(); + String stockValueColumn = getStockValueColumn(type); + Long plateUniCode = stock.getPlateUniCode(); + List list = stockMapper.selectFinancialValuationAnalysis(tableName, stockValueColumn, stkUniCode, plateUniCode, timeSpan, type); + return list; + } + + public QuantitativeAnalysisVO quantitativeAnalysis(Long stkUniCode) { + StockVO stock = getStock(stkUniCode); + if (stock == null) { + return null; + } + String secCode = stock.getSecCode(); + Integer mktNum = stock.getMktNum(); + QuantitativeAnalysisVO vo = diagnoseMapper.selectQuantitativeAnalysis(secCode, mktNum); + if (vo == null) { + return null; + } + String tableName = stock.getPriceTableName(); + List kLineList = stockMapper.selectKLine(tableName, stkUniCode, kLineMonth); + vo.setkLineList(kLineList); + return vo; + } + + private String getStockValueColumn(Integer type) { + if (type == 2) { + return "stk_per_ttm"; + } else if (type == 3) { + return "price_bookv_ratio"; + } + throw new BizException(ResponseStatus.PARM_ERROR, "类型错误"); + } + } diff --git a/src/main/java/com/diagnose/util/StringMatcher.java b/src/main/java/com/diagnose/util/StringMatcher.java deleted file mode 100644 index 16f7fee..0000000 --- a/src/main/java/com/diagnose/util/StringMatcher.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.diagnose.util; - -import java.util.*; - -public class StringMatcher { - - private final int GRAM_SIZE = 1; - - private Map> indexMap = new HashMap<>(); - private List dataList; - - public StringMatcher(List dataList) { - this.dataList = dataList; - buildIndex(); - } - - private void buildIndex() { - // 为了平衡性能和内存,可以考虑只索引n-gram - for (int i = 0; i < dataList.size(); i++) { - String s = dataList.get(i); - // 生成所有可能的子串或n-gram - for (int j = 0; j < s.length() - GRAM_SIZE + 1; j++) { - String gram = s.substring(j, j + GRAM_SIZE); // n-gram - indexMap.computeIfAbsent(gram, k -> new HashSet<>()).add(i); - } - } - } - - public List search(String query, int limit) { - // 如果查询字符串长度小于GRAM_SIZE,使用简单遍历 - if (query.length() < GRAM_SIZE) { - return simpleSearch(query, limit); - } - - Set candidates = null; - - // 使用查询的n-gram找候选集 - for (int i = 0; i <= query.length() - GRAM_SIZE; i++) { - String gram = query.substring(i, i + GRAM_SIZE); - Set indices = indexMap.getOrDefault(gram, Collections.emptySet()); - - if (candidates == null) { - candidates = new HashSet<>(indices); - } else { - candidates.retainAll(indices); - } - - if (candidates.isEmpty()) { - return Collections.emptyList(); - } - } - - // 验证候选集 - List result = new ArrayList<>(); - for (Integer idx : candidates) { - if (dataList.get(idx).contains(query)) { - result.add(dataList.get(idx)); - if (result.size() >= limit) { - break; - } - } - } - - return result; - } - - private List simpleSearch(String query, int limit) { - // 简单遍历法 - List result = new ArrayList<>(); - for (String s : dataList) { - if (s.contains(query)) { - result.add(s); - if (result.size() >= limit) { - break; - } - } - } - return result; - } -} \ No newline at end of file diff --git a/src/main/java/com/diagnose/util/TestSearch.java b/src/main/java/com/diagnose/util/TestSearch.java deleted file mode 100644 index f0627c5..0000000 --- a/src/main/java/com/diagnose/util/TestSearch.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.diagnose.util; - -import java.util.ArrayList; -import java.util.List; - -public class TestSearch { - - public static void main(String[] args) { - // 示例数据 - List list = new ArrayList<>(); - list.add("hello world"); - list.add("java programming"); - list.add("ahocorasick algorithm"); - list.add("substring matching"); - list.add("performance optimization"); - list.add("data structures"); - list.add("algorithm design"); - list.add("string search"); - list.add("efficient matching"); - list.add("aho-corasick implementation"); - list.add("another example"); - list.add("yet another example"); - list.add("example"); - list.add("abcexample"); - list.add("abcexampledef"); - - StringMatcher matcher = new StringMatcher(list); - List results = matcher.search("example", 10); - - for (String result : results) { - System.out.println(result); - } - } -} diff --git a/src/main/java/com/diagnose/vo/ComprehensiveEvaluationVO.java b/src/main/java/com/diagnose/vo/ComprehensiveEvaluationVO.java index b073d6a..3daca45 100644 --- a/src/main/java/com/diagnose/vo/ComprehensiveEvaluationVO.java +++ b/src/main/java/com/diagnose/vo/ComprehensiveEvaluationVO.java @@ -3,10 +3,11 @@ package com.diagnose.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; +import java.io.Serializable; import java.util.List; @ApiModel("综合评分") -public class ComprehensiveEvaluationVO { +public class ComprehensiveEvaluationVO implements Serializable { @ApiModelProperty("股票基本信息") private StockVO stock; diff --git a/src/main/java/com/diagnose/vo/DiagnoseValuationVO.java b/src/main/java/com/diagnose/vo/DiagnoseValuationVO.java new file mode 100644 index 0000000..5889c14 --- /dev/null +++ b/src/main/java/com/diagnose/vo/DiagnoseValuationVO.java @@ -0,0 +1,86 @@ +package com.diagnose.vo; + +import io.swagger.annotations.ApiModelProperty; + +import java.io.Serializable; +import java.math.BigDecimal; + +public class DiagnoseValuationVO implements Serializable { + + @ApiModelProperty("分析周期") + private String timeSpan; + + @ApiModelProperty("市盈率(TTM)_30分位数") + private BigDecimal q30pe; + + @ApiModelProperty("市盈率(TTM)_70分位数") + private BigDecimal q70pe; + + @ApiModelProperty("市盈率(TTM)当前分位数") + private BigDecimal currentQPe; + + @ApiModelProperty("市净率_30分位数") + private BigDecimal q30pb; + + @ApiModelProperty("市净率_70分位数") + private BigDecimal q70pb; + + @ApiModelProperty("市净率_当前分位数") + private BigDecimal currentQPb; + + public String getTimeSpan() { + return timeSpan; + } + + public void setTimeSpan(String timeSpan) { + this.timeSpan = timeSpan; + } + + public BigDecimal getQ30pe() { + return q30pe; + } + + public void setQ30pe(BigDecimal q30pe) { + this.q30pe = q30pe; + } + + public BigDecimal getQ70pe() { + return q70pe; + } + + public void setQ70pe(BigDecimal q70pe) { + this.q70pe = q70pe; + } + + public BigDecimal getCurrentQPe() { + return currentQPe; + } + + public void setCurrentQPe(BigDecimal currentQPe) { + this.currentQPe = currentQPe; + } + + public BigDecimal getQ30pb() { + return q30pb; + } + + public void setQ30pb(BigDecimal q30pb) { + this.q30pb = q30pb; + } + + public BigDecimal getQ70pb() { + return q70pb; + } + + public void setQ70pb(BigDecimal q70pb) { + this.q70pb = q70pb; + } + + public BigDecimal getCurrentQPb() { + return currentQPb; + } + + public void setCurrentQPb(BigDecimal currentQPb) { + this.currentQPb = currentQPb; + } +} diff --git a/src/main/java/com/diagnose/vo/FinanceCashShortVO.java b/src/main/java/com/diagnose/vo/FinanceCashShortVO.java index 2c7b183..cb497ce 100644 --- a/src/main/java/com/diagnose/vo/FinanceCashShortVO.java +++ b/src/main/java/com/diagnose/vo/FinanceCashShortVO.java @@ -1,7 +1,9 @@ package com.diagnose.vo; +import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; +@ApiModel("现金流量") public class FinanceCashShortVO { @ApiModelProperty("截止日期") diff --git a/src/main/java/com/diagnose/vo/FinanceIndexAnalysisVO.java b/src/main/java/com/diagnose/vo/FinanceIndexAnalysisVO.java index 8ffff4f..d36387b 100644 --- a/src/main/java/com/diagnose/vo/FinanceIndexAnalysisVO.java +++ b/src/main/java/com/diagnose/vo/FinanceIndexAnalysisVO.java @@ -3,10 +3,11 @@ package com.diagnose.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; +import java.io.Serializable; import java.math.BigDecimal; @ApiModel("财务指标分析") -public class FinanceIndexAnalysisVO { +public class FinanceIndexAnalysisVO implements Serializable { @ApiModelProperty("截止日期") private String endDate; diff --git a/src/main/java/com/diagnose/vo/FinanceRankVO.java b/src/main/java/com/diagnose/vo/FinanceRankVO.java new file mode 100644 index 0000000..27655c7 --- /dev/null +++ b/src/main/java/com/diagnose/vo/FinanceRankVO.java @@ -0,0 +1,65 @@ +package com.diagnose.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import java.io.Serializable; + +@ApiModel("财务分析行业排名") +public class FinanceRankVO implements Serializable { + + @ApiModelProperty("盈利能力行业排名") + private Integer profitInduRank; + + @ApiModelProperty("成长能力行业排名") + private Integer growthInduRank; + + @ApiModelProperty("运营能力排名") + private Integer operateInduRank; + + @ApiModelProperty("偿债能力行业排名") + private Integer debtInduRank; + + @ApiModelProperty("现金流量行业排名") + private Integer cashInduRank; + + public Integer getProfitInduRank() { + return profitInduRank; + } + + public void setProfitInduRank(Integer profitInduRank) { + this.profitInduRank = profitInduRank; + } + + public Integer getGrowthInduRank() { + return growthInduRank; + } + + public void setGrowthInduRank(Integer growthInduRank) { + this.growthInduRank = growthInduRank; + } + + public Integer getOperateInduRank() { + return operateInduRank; + } + + public void setOperateInduRank(Integer operateInduRank) { + this.operateInduRank = operateInduRank; + } + + public Integer getDebtInduRank() { + return debtInduRank; + } + + public void setDebtInduRank(Integer debtInduRank) { + this.debtInduRank = debtInduRank; + } + + public Integer getCashInduRank() { + return cashInduRank; + } + + public void setCashInduRank(Integer cashInduRank) { + this.cashInduRank = cashInduRank; + } +} diff --git a/src/main/java/com/diagnose/vo/FinancialValuationExtendVO.java b/src/main/java/com/diagnose/vo/FinancialValuationExtendVO.java new file mode 100644 index 0000000..7150cc5 --- /dev/null +++ b/src/main/java/com/diagnose/vo/FinancialValuationExtendVO.java @@ -0,0 +1,54 @@ +package com.diagnose.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import java.util.List; + +@ApiModel("财务估值") +public class FinancialValuationExtendVO { + + @ApiModelProperty("总结性机器语") + private String finSumMac; + + @ApiModelProperty("财务估值得分") + private Integer score; + + @ApiModelProperty("财务指标分析列表") + private List financeIndexAnalysisList; + + @ApiModelProperty("现金流量列表") + private List financeCashShortList; + + public String getFinSumMac() { + return finSumMac; + } + + public void setFinSumMac(String finSumMac) { + this.finSumMac = finSumMac; + } + + public Integer getScore() { + return score; + } + + public void setScore(Integer score) { + this.score = score; + } + + public List getFinanceIndexAnalysisList() { + return financeIndexAnalysisList; + } + + public void setFinanceIndexAnalysisList(List financeIndexAnalysisList) { + this.financeIndexAnalysisList = financeIndexAnalysisList; + } + + public List getFinanceCashShortList() { + return financeCashShortList; + } + + public void setFinanceCashShortList(List financeCashShortList) { + this.financeCashShortList = financeCashShortList; + } +} diff --git a/src/main/java/com/diagnose/vo/FinancialValuationVO.java b/src/main/java/com/diagnose/vo/FinancialValuationVO.java index 7a0c2a0..d5e4010 100644 --- a/src/main/java/com/diagnose/vo/FinancialValuationVO.java +++ b/src/main/java/com/diagnose/vo/FinancialValuationVO.java @@ -3,10 +3,11 @@ package com.diagnose.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; +import java.io.Serializable; import java.util.List; @ApiModel("财务估值") -public class FinancialValuationVO { +public class FinancialValuationVO implements Serializable { @ApiModelProperty("总结性机器语") private String finSumMac; @@ -14,11 +15,14 @@ public class FinancialValuationVO { @ApiModelProperty("财务估值得分") private Integer score; - @ApiModelProperty("财务指标分析列表") - private List financeIndexAnalysisList; + @ApiModelProperty("财务分析行业排名") + private FinanceRankVO financeRank; - @ApiModelProperty("现金流量列表") - private List financeCashShortList; + @ApiModelProperty("行情估值") + private StockPriceVO stockPrice; + + @ApiModelProperty("估值分析") + private List diagnoseValuationList; public String getFinSumMac() { return finSumMac; @@ -36,19 +40,28 @@ public class FinancialValuationVO { this.score = score; } - public List getFinanceIndexAnalysisList() { - return financeIndexAnalysisList; + public FinanceRankVO getFinanceRank() { + return financeRank; } - public void setFinanceIndexAnalysisList(List financeIndexAnalysisList) { - this.financeIndexAnalysisList = financeIndexAnalysisList; + public StockPriceVO getStockPrice() { + return stockPrice; } - public List getFinanceCashShortList() { - return financeCashShortList; + public void setStockPrice(StockPriceVO stockPrice) { + this.stockPrice = stockPrice; } - public void setFinanceCashShortList(List financeCashShortList) { - this.financeCashShortList = financeCashShortList; + public void setFinanceRank(FinanceRankVO financeRank) { + this.financeRank = financeRank; } + + public List getDiagnoseValuationList() { + return diagnoseValuationList; + } + + public void setDiagnoseValuationList(List diagnoseValuationList) { + this.diagnoseValuationList = diagnoseValuationList; + } + } diff --git a/src/main/java/com/diagnose/vo/KLineVO.java b/src/main/java/com/diagnose/vo/KLineVO.java new file mode 100644 index 0000000..b98ab62 --- /dev/null +++ b/src/main/java/com/diagnose/vo/KLineVO.java @@ -0,0 +1,66 @@ +package com.diagnose.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import java.math.BigDecimal; +import java.time.LocalDate; + +@ApiModel("K线") +public class KLineVO { + + @ApiModelProperty("交易日") + private LocalDate date; + + @ApiModelProperty("开盘价") + private BigDecimal open; + + @ApiModelProperty("收盘价") + private BigDecimal close; + + @ApiModelProperty("最高价") + private BigDecimal high; + + @ApiModelProperty("最低价") + private BigDecimal low; + + public LocalDate getDate() { + return date; + } + + public void setDate(LocalDate date) { + this.date = date; + } + + public BigDecimal getOpen() { + return open; + } + + public void setOpen(BigDecimal open) { + this.open = open; + } + + public BigDecimal getClose() { + return close; + } + + public void setClose(BigDecimal close) { + this.close = close; + } + + public BigDecimal getHigh() { + return high; + } + + public void setHigh(BigDecimal high) { + this.high = high; + } + + public BigDecimal getLow() { + return low; + } + + public void setLow(BigDecimal low) { + this.low = low; + } +} diff --git a/src/main/java/com/diagnose/vo/QuantitativeAnalysisVO.java b/src/main/java/com/diagnose/vo/QuantitativeAnalysisVO.java new file mode 100644 index 0000000..8e81a1d --- /dev/null +++ b/src/main/java/com/diagnose/vo/QuantitativeAnalysisVO.java @@ -0,0 +1,56 @@ +package com.diagnose.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +@ApiModel("量化分析") +public class QuantitativeAnalysisVO implements Serializable { + + @ApiModelProperty("总结性机器语") + private String techSumMac; + + @ApiModelProperty("支撑位") + private BigDecimal stkSptLvl; + + @ApiModelProperty("压力位") + private BigDecimal stkPrsLvl; + + @ApiModelProperty("K线列表") + private List kLineList; + + public String getTechSumMac() { + return techSumMac; + } + + public void setTechSumMac(String techSumMac) { + this.techSumMac = techSumMac; + } + + public BigDecimal getStkSptLvl() { + return stkSptLvl; + } + + public void setStkSptLvl(BigDecimal stkSptLvl) { + this.stkSptLvl = stkSptLvl; + } + + public BigDecimal getStkPrsLvl() { + return stkPrsLvl; + } + + public void setStkPrsLvl(BigDecimal stkPrsLvl) { + this.stkPrsLvl = stkPrsLvl; + } + + public List getkLineList() { + return kLineList; + } + + public void setkLineList(List kLineList) { + this.kLineList = kLineList; + } +} diff --git a/src/main/java/com/diagnose/vo/StockPriceVO.java b/src/main/java/com/diagnose/vo/StockPriceVO.java new file mode 100644 index 0000000..803bd9f --- /dev/null +++ b/src/main/java/com/diagnose/vo/StockPriceVO.java @@ -0,0 +1,55 @@ +package com.diagnose.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import java.math.BigDecimal; +import java.time.LocalDate; + +@ApiModel("行情估值") +public class StockPriceVO { + + @ApiModelProperty("结算日") + private LocalDate endDate; + + @ApiModelProperty("收盘价") + private BigDecimal closePrice; + + @ApiModelProperty("市盈率(TTM)") + private BigDecimal stkPerTtm; + + @ApiModelProperty("市净率(MRQ)") + private BigDecimal priceBookvRatio; + + public LocalDate getEndDate() { + return endDate; + } + + public void setEndDate(LocalDate endDate) { + this.endDate = endDate; + } + + public BigDecimal getClosePrice() { + return closePrice; + } + + public void setClosePrice(BigDecimal closePrice) { + this.closePrice = closePrice; + } + + public BigDecimal getStkPerTtm() { + return stkPerTtm; + } + + public void setStkPerTtm(BigDecimal stkPerTtm) { + this.stkPerTtm = stkPerTtm; + } + + public BigDecimal getPriceBookvRatio() { + return priceBookvRatio; + } + + public void setPriceBookvRatio(BigDecimal priceBookvRatio) { + this.priceBookvRatio = priceBookvRatio; + } +} diff --git a/src/main/java/com/diagnose/vo/StockVO.java b/src/main/java/com/diagnose/vo/StockVO.java index 2376825..8ae985f 100644 --- a/src/main/java/com/diagnose/vo/StockVO.java +++ b/src/main/java/com/diagnose/vo/StockVO.java @@ -2,6 +2,7 @@ package com.diagnose.vo; import com.diagnose.constant.MktNum; import com.diagnose.constant.MktTypePar; +import com.diagnose.constant.PriceTableName; import com.diagnose.constant.SecMarPar; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -65,6 +66,20 @@ public class StockVO implements Serializable { return null; } + public String getPriceTableName() { + if (mktTypePar == null) { + return null; + } + if (MktTypePar.SZ.value.equals(mktTypePar)) { + return PriceTableName.SZ.tableName; + } else if (MktTypePar.SH.value.equals(mktTypePar)) { + return PriceTableName.SH.tableName; + } else if (MktTypePar.BJ.value.equals(mktTypePar)) { + return PriceTableName.BJ.tableName; + } + return null; + } + public Long getSecUniCode() { return secUniCode; } diff --git a/src/main/java/com/diagnose/vo/ValuationAnalysisVO.java b/src/main/java/com/diagnose/vo/ValuationAnalysisVO.java new file mode 100644 index 0000000..8bcd2dd --- /dev/null +++ b/src/main/java/com/diagnose/vo/ValuationAnalysisVO.java @@ -0,0 +1,42 @@ +package com.diagnose.vo; + +import io.swagger.annotations.ApiModelProperty; + +import java.math.BigDecimal; +import java.time.LocalDate; + +public class ValuationAnalysisVO { + + @ApiModelProperty("日期") + private LocalDate date; + + @ApiModelProperty("股票值") + private BigDecimal stockValue; + + @ApiModelProperty("行业值") + private BigDecimal plateValue; + + public LocalDate getDate() { + return date; + } + + public void setDate(LocalDate date) { + this.date = date; + } + + public BigDecimal getStockValue() { + return stockValue; + } + + public void setStockValue(BigDecimal stockValue) { + this.stockValue = stockValue; + } + + public BigDecimal getPlateValue() { + return plateValue; + } + + public void setPlateValue(BigDecimal plateValue) { + this.plateValue = plateValue; + } +}