API接口全部修正

This commit is contained in:
easonzhu 2025-03-23 13:19:42 +08:00
parent 06a585cd9a
commit e285cc4932
37 changed files with 1173 additions and 56 deletions

41
deploy.bat Normal file
View File

@ -0,0 +1,41 @@
@echo off
:: 1. 设置动态参数
set REMOTE_IP=8.138.144.54
set REMOTE_PORT=22
set REMOTE_PATH=/root
set REMOTE_USER=root
set START_SCRIPT=/root/start_diagnose.sh
:: 2. 运行 Maven 打包
echo Running mvn clean package...
:: call mvn clean package -P thin-jar
call mvn clean package
:: 检查是否打包成功
IF %ERRORLEVEL% NEQ 0 (
echo Maven build failed, exiting...
exit /b %ERRORLEVEL%
)
:: 3. 将 JAR 包传输到 Linux 服务器
echo Copying JAR file to Linux server...
call scp -P %REMOTE_PORT% target\DiagnoseApiServer-2.6.7.jar %REMOTE_USER%@%REMOTE_IP%:%REMOTE_PATH%
:: 检查 SCP 命令是否成功
IF %ERRORLEVEL% NEQ 0 (
echo File transfer failed, exiting...
exit /b %ERRORLEVEL%
)
:: 4. 通过 SSH 运行 start.sh 脚本
echo Running start_diagnose.sh script on Linux server...
call ssh -p %REMOTE_PORT% %REMOTE_USER%@%REMOTE_IP% "bash %START_SCRIPT%"
:: 检查 SSH 命令是否成功
IF %ERRORLEVEL% NEQ 0 (
echo Failed to start the application, exiting...
exit /b %ERRORLEVEL%
)
echo Deployment successful!

41
deploy_prod.bat Normal file
View File

@ -0,0 +1,41 @@
@echo off
:: 1. 设置动态参数
set REMOTE_IP=119.29.151.152
set REMOTE_PORT=22101
set REMOTE_PATH=/tmp
set REMOTE_USER=ubuntu
set DEPLOY_SCRIPT=/home/ubuntu/deploy_diagnose.sh
:: 2. 运行 Maven 打包
echo Running mvn clean package...
:: call mvn clean package -P thin-jar
call mvn clean package
:: 检查是否打包成功
IF %ERRORLEVEL% NEQ 0 (
echo Maven build failed, exiting...
exit /b %ERRORLEVEL%
)
:: 3. 将 JAR 包传输到 Linux 服务器
echo Copying JAR file to Linux server...
call scp -P %REMOTE_PORT% target\DiagnoseApiServer-2.6.7.jar %REMOTE_USER%@%REMOTE_IP%:%REMOTE_PATH%
:: 检查 SCP 命令是否成功
IF %ERRORLEVEL% NEQ 0 (
echo File transfer failed, exiting...
exit /b %ERRORLEVEL%
)
:: 4. 通过 SSH 运行 deploy.sh 脚本
echo Running deploy_diagnose.sh script on Linux server...
call ssh -p %REMOTE_PORT% %REMOTE_USER%@%REMOTE_IP% "bash %DEPLOY_SCRIPT%"
:: 检查 SSH 命令是否成功
IF %ERRORLEVEL% NEQ 0 (
echo Failed to start the application, exiting...
exit /b %ERRORLEVEL%
)
echo Deployment successful!

View File

@ -0,0 +1,30 @@
@echo off
:: 1. 设置动态参数
set REMOTE_IP=119.29.151.152
set REMOTE_PORT=22101
set REMOTE_PATH=/tmp
set REMOTE_USER=ubuntu
set DEPLOY_SCRIPT=/home/ubuntu/deploy_diagnose.sh
:: 2. 将 JAR 包传输到 Linux 服务器
echo Copying JAR file to Linux server...
call scp -P %REMOTE_PORT% target\DiagnoseApiServer-2.6.7.jar %REMOTE_USER%@%REMOTE_IP%:%REMOTE_PATH%
:: 检查 SCP 命令是否成功
IF %ERRORLEVEL% NEQ 0 (
echo File transfer failed, exiting...
exit /b %ERRORLEVEL%
)
:: 3. 通过 SSH 运行 deploy.sh 脚本
echo Running deploy_diagnose.sh script on Linux server...
call ssh -p %REMOTE_PORT% %REMOTE_USER%@%REMOTE_IP% "bash %DEPLOY_SCRIPT%"
:: 检查 SSH 命令是否成功
IF %ERRORLEVEL% NEQ 0 (
echo Failed to start the application, exiting...
exit /b %ERRORLEVEL%
)
echo Deployment successful!

View File

@ -16,7 +16,7 @@ public class ScheduleConfig implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
// 开启定时任务多线程防止默认单线程阻塞问题超过核心线程数后还是会阻塞
taskRegistrar.setScheduler(Executors.newScheduledThreadPool(10));
taskRegistrar.setScheduler(Executors.newScheduledThreadPool(16));
}
}

View File

@ -0,0 +1,37 @@
package com.diagnose.constant;
public enum ELineType {
HDT_DAY_KLINE(0),
HDT_MIN1_KLINE(1),
HDT_MIN5_KLINE(2),
HDT_MIN15_KLINE(3),
HDT_MIN30_KLINE(4),
HDT_MIN60_KLINE(5),
HDT_RTMIN(6),
HDT_WEEK_KLINE(7),
HDT_MONTH_KLINE(8),
HDT_SEASON_KLINE(9),
HDT_YEAR_KLINE(10),
HDT_DAY_MONEYFLOW(11),
HDT_TICK(12),
HDT_WEEK_MONEYFLOW(13),
HDT_MONTH_MONEYFLOW(14),
HDT_SEASON_MONEYFLOW(15),
HDT_YEAR_MONEYFLOW(16),
HDT_FLOW_MIN1(17),
HDT_FLOW_MIN5(18),
HDT_FLOW_MIN15(19),
HDT_FLOW_MIN30(20),
HDT_FLOW_MIN60(21),
HDT_MIN120_KLINE(22),
HDT_FLOW_MIN120(23);
;
public final int value;
ELineType(int value) {
this.value = value;
}
}

View File

@ -31,58 +31,65 @@ public class DiagnoseController {
@ApiOperation("综合搜索")
@GetMapping("/diagnose/search")
public CommonResult<List<StockVO>> search(@RequestParam("关键词") @Validated @NotBlank @ApiParam(required = true) String keyword) {
public CommonResult<List<StockVO>> search(@RequestParam("keyword") @Validated @NotBlank @ApiParam(required = true, value = "关键词") String keyword) {
List<StockVO> list = searchService.search(keyword);
return CommonResult.success(list);
}
@ApiOperation("聚合数据")
@GetMapping("/diagnose/union")
public CommonResult<UnionVO> union(@RequestParam("stkUniCode") @Validated @NotNull @ApiParam(required = true, value = "证券统一编码") Long stkUniCode) {
UnionVO vo = stockService.unionWithCache(stkUniCode);
return CommonResult.success(vo);
}
@ApiOperation("综合评分")
@GetMapping("/diagnose/comprehensiveEvaluation")
public CommonResult<ComprehensiveEvaluationVO> comprehensiveEvaluation(@RequestParam("证券统一编码") @Validated @NotNull @ApiParam(required = true) Long stkUniCode) {
public CommonResult<ComprehensiveEvaluationVO> comprehensiveEvaluation(@RequestParam("stkUniCode") @Validated @NotNull @ApiParam(required = true, value = "证券统一编码") Long stkUniCode) {
ComprehensiveEvaluationVO vo = stockService.comprehensiveEvaluation(stkUniCode);
return CommonResult.success(vo);
}
@ApiOperation("财务估值")
@GetMapping("/diagnose/financialValuation")
public CommonResult<FinancialValuationVO> financialValuation(@RequestParam("证券统一编码") @Validated @NotNull @ApiParam(required = true) Long stkUniCode) {
public CommonResult<FinancialValuationVO> financialValuation(@RequestParam("stkUniCode") @Validated @NotNull @ApiParam(required = true, value = "证券统一编码") Long stkUniCode) {
FinancialValuationVO vo = stockService.financialValuation(stkUniCode);
return CommonResult.success(vo);
}
@ApiOperation("财务估值-更多")
@GetMapping("/diagnose/financialValuationExtend")
public CommonResult<FinancialValuationExtendVO> financialValuationExtend(@RequestParam("证券统一编码") @Validated @NotNull @ApiParam(required = true) Long stkUniCode) {
public CommonResult<FinancialValuationExtendVO> financialValuationExtend(@RequestParam("stkUniCode") @Validated @NotNull @ApiParam(required = true, value = "证券统一编码") Long stkUniCode) {
FinancialValuationExtendVO vo = stockService.financialValuationExtend(stkUniCode);
return CommonResult.success(vo);
}
@ApiOperation("财务估值-估值分析")
@GetMapping("/diagnose/financialValuationAnalysis")
public CommonResult<List<ValuationAnalysisVO>> 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) {
public CommonResult<List<ValuationAnalysisVO>> financialValuationAnalysis(@RequestParam("stkUniCode") @Validated @NotNull @ApiParam(required = true, value = "证券统一编码") Long stkUniCode,
@RequestParam("timeSpan") @Validated @NotNull @Min(1) @Max(10) @ApiParam(required = true, value = "周期 1、3、5、10年") Integer timeSpan,
@RequestParam("type") @Validated @NotNull @Min(2) @Max(3) @ApiParam(required = true, value = "类型 2:市盈率 3:市净率") Integer type) {
List<ValuationAnalysisVO> list = stockService.financialValuationAnalysis(stkUniCode, timeSpan, type);
return CommonResult.success(list);
}
@ApiOperation("量化分析")
@GetMapping("/diagnose/quantitativeAnalysis")
public CommonResult<QuantitativeAnalysisVO> quantitativeAnalysis(@RequestParam("证券统一编码") @Validated @NotNull @ApiParam(required = true) Long stkUniCode) {
public CommonResult<QuantitativeAnalysisVO> quantitativeAnalysis(@RequestParam("stkUniCode") @Validated @NotNull @ApiParam(required = true, value = "证券统一编码") Long stkUniCode) {
QuantitativeAnalysisVO vo = stockService.quantitativeAnalysis(stkUniCode);
return CommonResult.success(vo);
}
@ApiOperation("市场热度")
@GetMapping("/diagnose/marketSentiment")
public CommonResult<MarketSentimentVO> marketSentiment(@RequestParam("证券统一编码") @Validated @NotNull @ApiParam(required = true) Long stkUniCode) {
public CommonResult<MarketSentimentVO> marketSentiment(@RequestParam("stkUniCode") @Validated @NotNull @ApiParam(required = true, value = "证券统一编码") Long stkUniCode) {
MarketSentimentVO vo = stockService.marketSentiment(stkUniCode);
return CommonResult.success(vo);
}
@ApiOperation("主力动向")
@GetMapping("/diagnose/institutionalActivity")
public CommonResult<InstitutionalActivityVO> institutionalActivity(@RequestParam("证券统一编码") @Validated @NotNull @ApiParam(required = true) Long stkUniCode) {
public CommonResult<InstitutionalActivityVO> institutionalActivity(@RequestParam("stkUniCode") @Validated @NotNull @ApiParam(required = true, value = "证券统一编码") Long stkUniCode) {
InstitutionalActivityVO vo = stockService.institutionalActivity(stkUniCode);
return CommonResult.success(vo);
}

View File

@ -50,7 +50,7 @@ public interface DiagnoseMapper extends BaseMapper<DiagnoseRankVO> {
List<DiagnoseValuationVO> 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" +
" SELECT tech_sum_mac, stk_spt_lvl, stk_prs_lvl, score, 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")

View File

@ -13,7 +13,7 @@ import java.util.List;
public interface FinanceMapper extends BaseMapper<FinancialValuationVO> {
@Select("SELECT * FROM (" +
" SELECT fin_sum_mac, score, ROW_NUMBER() OVER (PARTITION BY stk_code, mkt_num ORDER BY trd_date DESC) AS rn\n" +
" SELECT fin_sum_mac, score, prf_abli_mac, grw_abli_mac, ass_quali_mac, solv_marg_mac, cash_flow_mac, ROW_NUMBER() OVER (PARTITION BY stk_code, mkt_num ORDER BY trd_date DESC) AS rn\n" +
" FROM fin_val_fac\n" +
" WHERE stk_code = #{stkCode} AND mkt_num = #{mktNum}\n" +
") t WHERE t.rn = 1")

View File

@ -24,14 +24,15 @@ public interface StockMapper extends BaseMapper<StockVO> {
"WHERE sc.sec_type_par = 1 AND sc.sec_small_type_par = 101 AND sc.list_status_par = 7 AND sc.isvalid = 1")
List<StockVO> 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")
@Select("SELECT end_date, close_price, stk_per_ttm, price_bookv_ratio\n" +
"FROM ${tableName}\n" +
"WHERE stk_uni_code = #{stkUniCode} AND end_date = (\n" +
" SELECT MAX(end_date)\n" +
" FROM ${tableName}\n" +
" WHERE stk_uni_code = #{stkUniCode} AND isvalid = 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" +
@Select("SELECT s.end_date as 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" +
@ -50,7 +51,7 @@ public interface StockMapper extends BaseMapper<StockVO> {
@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" +
@Select("SELECT s.trade_date AS date, s.open_price AS open, s.close_price AS close, s.high_price AS high, s.low_price AS low\n" +
"FROM ${tableName} s\n" +
"WHERE s.stk_uni_code = #{stkUniCode}\n" +
" AND s.trade_date >= DATE_SUB(CURDATE(), INTERVAL #{month} MONTH)\n" +
@ -75,7 +76,7 @@ public interface StockMapper extends BaseMapper<StockVO> {
List<InstitutionalFundFlowVO> selectInstitutionalFundFlow(@Param("tableName") String tableName, @Param("stkUniCode") Long stkUniCode, @Param("stkCode") String stkCode, @Param("secMarPar") Integer secMarPar);
@Select("SELECT * FROM (" +
" SELECT tot_hld_num, avg_share, ROW_NUMBER() OVER (PARTITION BY stk_code, sec_mar_par ORDER BY end_date DESC) AS rn\n" +
" SELECT tot_hld_num, avg_share, end_date, ROW_NUMBER() OVER (PARTITION BY stk_code, sec_mar_par ORDER BY end_date DESC) AS rn\n" +
" FROM com_hld_tot\n" +
" WHERE stk_code = #{stkCode} AND sec_mar_par = #{secMarPar}\n" +
") t WHERE t.rn <= 5")

View File

@ -0,0 +1,35 @@
package com.diagnose.query;
import com.diagnose.constant.ELineType;
import com.diagnose.service.MarketService;
import java.time.LocalDate;
public class KLineDataQuery {
private KLineQuery stReq;
public KLineDataQuery(KLineQuery kLineQuery) {
this.stReq = kLineQuery;
}
public KLineDataQuery(Integer market, String sCode, ELineType eLineType, LocalDate startDate, Integer number) {
if (startDate == null) {
this.stReq = new KLineQuery(market, sCode, eLineType.value, number);
} else {
this.stReq = new KLineQuery(market, sCode, eLineType.value, MarketService.dateToLong(startDate), number);
}
}
public KLineDataQuery(Integer market, String sCode, ELineType eLineType, Integer number) {
this.stReq = new KLineQuery(market, sCode, eLineType.value, number);
}
public KLineQuery getStReq() {
return stReq;
}
public void setStReq(KLineQuery stReq) {
this.stReq = stReq;
}
}

View File

@ -0,0 +1,71 @@
package com.diagnose.query;
public class KLineQuery {
private Integer market;
private String sCode;
private Integer eLineType;
private Long lDate;
private Integer shtStartxh;
private Integer shtWantNum;
public KLineQuery(Integer market, String sCode, Integer eLineType, Long lDate, Integer shtWantNum) {
this.market = market;
this.sCode = sCode;
this.eLineType = eLineType;
this.lDate = lDate;
this.shtWantNum = shtWantNum;
}
public KLineQuery(Integer market, String sCode, Integer eLineType, Integer shtWantNum) {
this.market = market;
this.sCode = sCode;
this.eLineType = eLineType;
this.shtWantNum = shtWantNum;
}
public Integer getMarket() {
return market;
}
public void setMarket(Integer market) {
this.market = market;
}
public String getsCode() {
return sCode;
}
public void setsCode(String sCode) {
this.sCode = sCode;
}
public Integer geteLineType() {
return eLineType;
}
public void seteLineType(Integer eLineType) {
this.eLineType = eLineType;
}
public Integer getShtStartxh() {
return shtStartxh;
}
public void setShtStartxh(Integer shtStartxh) {
this.shtStartxh = shtStartxh;
}
public Integer getShtWantNum() {
return shtWantNum;
}
public void setShtWantNum(Integer shtWantNum) {
this.shtWantNum = shtWantNum;
}
}

View File

@ -0,0 +1,24 @@
package com.diagnose.query;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class StockHqSimpleQuery {
private StockListQuery stReq;
public StockHqSimpleQuery(Integer shtSetcode, String sCode) {
List<StockQuery> vStock = Collections.singletonList(new StockQuery(shtSetcode, sCode));
this.stReq = new StockListQuery(vStock);
}
public StockListQuery getStReq() {
return stReq;
}
public void setStReq(StockListQuery stReq) {
this.stReq = stReq;
}
}

View File

@ -0,0 +1,24 @@
package com.diagnose.query;
import java.util.List;
public class StockListQuery {
private List<StockQuery> vStock;
public StockListQuery() {
}
public StockListQuery(List<StockQuery> vStock) {
this.vStock = vStock;
}
public List<StockQuery> getvStock() {
return vStock;
}
public void setvStock(List<StockQuery> vStock) {
this.vStock = vStock;
}
}

View File

@ -0,0 +1,33 @@
package com.diagnose.query;
public class StockQuery {
private Integer shtSetcode;
private String sCode;
public StockQuery() {
}
public StockQuery(Integer shtSeccode, String sCode) {
this.shtSetcode = shtSeccode;
this.sCode = sCode;
}
public Integer getShtSetcode() {
return shtSetcode;
}
public void setShtSetcode(Integer shtSetcode) {
this.shtSetcode = shtSetcode;
}
public String getsCode() {
return sCode;
}
public void setsCode(String sCode) {
this.sCode = sCode;
}
}

View File

@ -0,0 +1,105 @@
package com.diagnose.service;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.json.JSONUtil;
import com.diagnose.common.handler.BizException;
import com.diagnose.common.result.ResponseStatus;
import com.diagnose.common.util.logger.LoggerUtil;
import com.diagnose.constant.ELineType;
import com.diagnose.query.KLineDataQuery;
import com.diagnose.query.StockHqSimpleQuery;
import com.diagnose.vo.KLineVO;
import com.diagnose.vo.market.KLineDataResponseVO;
import com.diagnose.vo.market.KLineDataVO;
import com.diagnose.vo.market.StockHqSimpleResponseVO;
import com.diagnose.vo.market.StockHqSimpleVO;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.time.LocalDate;
import java.util.Collections;
import java.util.List;
@Service
public class MarketService {
@Value("${business.api.host}")
private String host = "http://wup.cnsoft.sztg.com/json";
@Value("${business.api.url.stockHqSimple}")
private String stockHqSimple = "/hs_server/stockHqSimple";
@Value("${business.api.url.kLineData}")
private String kLineData = "/hs_server/kLineData";
@Value("${business.api.timeout}")
private int timeout = 10000;
public StockHqSimpleVO stockHqSimple(Integer shtSetcode, String sCode) {
StockHqSimpleResponseVO responseVO = post(stockHqSimple, new StockHqSimpleQuery(shtSetcode, sCode), StockHqSimpleResponseVO.class);
if (responseVO == null || responseVO.getStRsp() == null || CollUtil.isEmpty(responseVO.getStRsp().getvData())) {
return null;
}
return responseVO.getStRsp().getvData().get(0);
}
/**
* 指定日期向后取{"stReq":{"market":0,"sCode":"000002","eLineType":0,"lDate":202503010000,"shtWantNum":10}}
* 指定日期向前取{"stReq":{"market":0,"sCode":"000002","eLineType":0,"lDate":202503010000,"shtWantNum":-10}}
* 当前日期向前取{"stReq":{"market":0,"sCode":"000002","eLineType":0,"shtWantNum":10}}
*/
public List<KLineDataVO> kLineData(Integer market, String sCode, ELineType eLineType, LocalDate startDate, Integer number) {
KLineDataQuery kLineDataQuery = new KLineDataQuery(market, sCode, eLineType, startDate, number);
KLineDataResponseVO kLineDataResponseVO = post(kLineData, kLineDataQuery, KLineDataResponseVO.class);
if (kLineDataResponseVO == null || kLineDataResponseVO.getStRsp() == null || CollUtil.isEmpty(kLineDataResponseVO.getStRsp().getvAnalyData())) {
return Collections.emptyList();
}
for (KLineDataVO kLineVO : kLineDataResponseVO.getStRsp().getvAnalyData()) {
if (kLineVO.getSttDateTime() != null && kLineVO.getSttDateTime().getiDate() != 0) {
kLineVO.setTradeDate(intToDate(kLineVO.getSttDateTime().getiDate()));
}
}
System.out.println(JSONUtil.toJsonStr(kLineDataResponseVO.getStRsp().getvAnalyData()));
return kLineDataResponseVO.getStRsp().getvAnalyData();
}
public List<KLineDataVO> kLineData(Integer market, String sCode, ELineType eLineType, Integer number) {
return kLineData(market, sCode, eLineType, null, number);
}
private <T> T post(String url, Object query, Class<T> type) {
T vo;
try {
String body = JSONUtil.toJsonStr(query);
LoggerUtil.api.info("url:" + url + ",body:" + body);
String response = HttpRequest.post(host + url)
.body(body, "application/json")
.timeout(timeout)//超时毫秒
.execute().body();
LoggerUtil.api.info("response:" + response);
vo = JSONUtil.toBean(response, type);
LoggerUtil.api.info("vo:" + JSONUtil.toJsonStr(vo));
return vo;
} catch (BizException e) {
throw e;
} catch (Exception e) {
throw new BizException(ResponseStatus.OUTSYS_ERROR, e);
}
}
public static long dateToLong(LocalDate date) {
return date.getYear() * 1000000 + date.getMonthValue() * 10000 + date.getDayOfMonth() * 100;
}
public static LocalDate intToDate(int date) {
return LocalDate.of(date / 10000, date % 10000 / 100, date % 100);
}
// public static void main(String[] args) {
// MarketService marketService = new MarketService();
// marketService.stockHqSimple(1, "600000");
// marketService.kLineData(0, "000002", ELineType.HDT_DAY_KLINE, LocalDate.now().plusDays(-10), 10);
// marketService.kLineData(0, "000002", ELineType.HDT_DAY_KLINE, 10);
// }
}

View File

@ -2,9 +2,11 @@ package com.diagnose.service;
import cn.hutool.core.lang.Validator;
import com.diagnose.vo.StockVO;
import com.diagnose.vo.UnionVO;
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;

View File

@ -1,18 +1,30 @@
package com.diagnose.service;
import com.diagnose.common.handler.BizException;
import com.diagnose.common.result.CommonResult;
import com.diagnose.common.result.ResponseStatus;
import com.diagnose.mapper.DiagnoseMapper;
import com.diagnose.mapper.FinanceMapper;
import com.diagnose.mapper.StockMapper;
import com.diagnose.vo.*;
import com.diagnose.vo.market.StockHqSimpleVO;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Executor;
import java.util.concurrent.TimeUnit;
import java.util.function.Function;
import java.util.stream.Collectors;
@ -38,6 +50,21 @@ public class StockService {
@Resource
private DiagnoseMapper diagnoseMapper;
@Resource
private MarketService marketService;
@Resource
private Executor taskExecutor;
private static final Integer defaultTimeSpan = 3;
private static final Integer defaultType = 2;
private static Cache<Long, UnionVO> cache = CacheBuilder.newBuilder()
.maximumSize(6000)
.expireAfterWrite(1, TimeUnit.HOURS)
.build();
public List<StockVO> selectAllStock() {
return stockMapper.selectAllStock();
}
@ -79,6 +106,7 @@ public class StockService {
}
ComprehensiveEvaluationVO vo = new ComprehensiveEvaluationVO();
vo.setStock(stock);
// 得分排名
DiagnoseRankVO diagnoseRankVO = rank(stock);
if (diagnoseRankVO == null) {
return null;
@ -88,8 +116,14 @@ public class StockService {
if (star == null) {
return vo;
}
// 回测
List<DiagnoseBackTestVO> backTestList = diagnoseMapper.selectBackTest(star);
vo.setBackTestList(backTestList);
// 行情
Integer mktNum = stock.getMktNum();
String secCode = stock.getSecCode();
StockHqSimpleVO stockHq = marketService.stockHqSimple(mktNum, secCode);
vo.setStockHq(stockHq);
return vo;
}
@ -191,7 +225,7 @@ public class StockService {
}
// 市场热度
public MarketSentimentVO marketSentiment(@NotNull Long stkUniCode) {
public MarketSentimentVO marketSentiment(Long stkUniCode) {
StockVO stock = getStock(stkUniCode);
if (stock == null) {
return null;
@ -243,4 +277,49 @@ public class StockService {
vo.setShareholderList(shareholderList);
return vo;
}
public UnionVO union(Long stkUniCode) {
// 综合评分
CompletableFuture<ComprehensiveEvaluationVO> comprehensiveEvaluationFuture =
CompletableFuture.supplyAsync(() -> comprehensiveEvaluation(stkUniCode), taskExecutor);
// 财务估值
CompletableFuture<FinancialValuationVO> financialValuationFuture =
CompletableFuture.supplyAsync(() -> financialValuation(stkUniCode), taskExecutor);
// 财务估值-更多
CompletableFuture<FinancialValuationExtendVO> financialValuationExtendFuture =
CompletableFuture.supplyAsync(() -> financialValuationExtend(stkUniCode), taskExecutor);
// 财务估值-估值分析
CompletableFuture<List<ValuationAnalysisVO>> financialValuationAnalysisFuture =
CompletableFuture.supplyAsync(() -> financialValuationAnalysis(stkUniCode, defaultTimeSpan, defaultType), taskExecutor);
// 量化分析
CompletableFuture<QuantitativeAnalysisVO> quantitativeAnalysisFuture =
CompletableFuture.supplyAsync(() -> quantitativeAnalysis(stkUniCode), taskExecutor);
// 市场热度
CompletableFuture<MarketSentimentVO> marketSentimentFuture =
CompletableFuture.supplyAsync(() -> marketSentiment(stkUniCode), taskExecutor);
// 主力动向
CompletableFuture<InstitutionalActivityVO> institutionalActivityFuture =
CompletableFuture.supplyAsync(() -> institutionalActivity(stkUniCode), taskExecutor);
CompletableFuture<Void> allFutures = CompletableFuture.allOf(comprehensiveEvaluationFuture,
financialValuationFuture, financialValuationExtendFuture, financialValuationAnalysisFuture,
quantitativeAnalysisFuture, marketSentimentFuture, institutionalActivityFuture);
try {
allFutures.get();
UnionVO vo = new UnionVO(comprehensiveEvaluationFuture.get(), financialValuationFuture.get(), financialValuationExtendFuture.get(),
financialValuationAnalysisFuture.get(), quantitativeAnalysisFuture.get(), marketSentimentFuture.get(), institutionalActivityFuture.get());
return vo;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public UnionVO unionWithCache(Long stkUniCode) {
try {
return cache.get(stkUniCode, () -> union(stkUniCode));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}

View File

@ -1,5 +1,6 @@
package com.diagnose.vo;
import com.diagnose.vo.market.StockHqSimpleVO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@ -12,6 +13,9 @@ public class ComprehensiveEvaluationVO implements Serializable {
@ApiModelProperty("股票基本信息")
private StockVO stock;
@ApiModelProperty("实时行情")
private StockHqSimpleVO stockHq;
@ApiModelProperty("评分排名")
private DiagnoseRankVO rank;
@ -34,6 +38,14 @@ public class ComprehensiveEvaluationVO implements Serializable {
this.stock = stock;
}
public StockHqSimpleVO getStockHq() {
return stockHq;
}
public void setStockHq(StockHqSimpleVO stockHq) {
this.stockHq = stockHq;
}
public List<DiagnoseBackTestVO> getBackTestList() {
return backTestList;
}

View File

@ -6,7 +6,7 @@ import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
import java.util.List;
@ApiModel("财务估值")
@ApiModel("财务估值-更多")
public class FinancialValuationExtendVO implements Serializable {
@ApiModelProperty("总结性机器语")

View File

@ -18,6 +18,21 @@ public class FinancialValuationVO implements Serializable {
@ApiModelProperty("财务分析行业排名")
private FinanceRankVO financeRank;
@ApiModelProperty("盈利能力机器语")
private String prfAblMac;
@ApiModelProperty("成长能力机器语")
private String grwAblMac;
@ApiModelProperty("资产质量机器语")
private String assQualiMac;
@ApiModelProperty("偿偾能力机器语")
private String solvMargMac;
@ApiModelProperty("现金流量机器语")
private String cashFlowMac;
@ApiModelProperty("行情估值")
private StockPriceVO stockPrice;
@ -44,6 +59,50 @@ public class FinancialValuationVO implements Serializable {
return financeRank;
}
public void setFinanceRank(FinanceRankVO financeRank) {
this.financeRank = financeRank;
}
public String getPrfAblMac() {
return prfAblMac;
}
public void setPrfAblMac(String prfAblMac) {
this.prfAblMac = prfAblMac;
}
public String getGrwAblMac() {
return grwAblMac;
}
public void setGrwAblMac(String grwAblMac) {
this.grwAblMac = grwAblMac;
}
public String getAssQualiMac() {
return assQualiMac;
}
public void setAssQualiMac(String assQualiMac) {
this.assQualiMac = assQualiMac;
}
public String getSolvMargMac() {
return solvMargMac;
}
public void setSolvMargMac(String solvMargMac) {
this.solvMargMac = solvMargMac;
}
public String getCashFlowMac() {
return cashFlowMac;
}
public void setCashFlowMac(String cashFlowMac) {
this.cashFlowMac = cashFlowMac;
}
public StockPriceVO getStockPrice() {
return stockPrice;
}
@ -52,10 +111,6 @@ public class FinancialValuationVO implements Serializable {
this.stockPrice = stockPrice;
}
public void setFinanceRank(FinanceRankVO financeRank) {
this.financeRank = financeRank;
}
public List<DiagnoseValuationVO> getDiagnoseValuationList() {
return diagnoseValuationList;
}
@ -63,5 +118,4 @@ public class FinancialValuationVO implements Serializable {
public void setDiagnoseValuationList(List<DiagnoseValuationVO> diagnoseValuationList) {
this.diagnoseValuationList = diagnoseValuationList;
}
}

View File

@ -19,6 +19,9 @@ public class QuantitativeAnalysisVO implements Serializable {
@ApiModelProperty("压力位")
private BigDecimal stkPrsLvl;
@ApiModelProperty("得分")
private Integer score;
@ApiModelProperty("K线列表")
private List<KLineVO> kLineList;
@ -46,6 +49,14 @@ public class QuantitativeAnalysisVO implements Serializable {
this.stkPrsLvl = stkPrsLvl;
}
public Integer getScore() {
return score;
}
public void setScore(Integer score) {
this.score = score;
}
public List<KLineVO> getkLineList() {
return kLineList;
}

View File

@ -0,0 +1,101 @@
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 UnionVO implements Serializable {
@ApiModelProperty("综合评分")
private ComprehensiveEvaluationVO comprehensiveEvaluation;
@ApiModelProperty("财务估值")
private FinancialValuationVO financialValuation;
@ApiModelProperty("财务估值-更多")
private FinancialValuationExtendVO financialValuationExtend;
@ApiModelProperty("财务估值-估值分析")
private List<ValuationAnalysisVO> financialValuationAnalysis;
@ApiModelProperty("量化分析")
private QuantitativeAnalysisVO quantitativeAnalysis;
@ApiModelProperty("市场热度")
private MarketSentimentVO marketSentiment;
public UnionVO() {
}
public UnionVO(ComprehensiveEvaluationVO comprehensiveEvaluation, FinancialValuationVO financialValuation, FinancialValuationExtendVO financialValuationExtend, List<ValuationAnalysisVO> financialValuationAnalysis, QuantitativeAnalysisVO quantitativeAnalysis, MarketSentimentVO marketSentiment, InstitutionalActivityVO institutionalActivity) {
this.comprehensiveEvaluation = comprehensiveEvaluation;
this.financialValuation = financialValuation;
this.financialValuationExtend = financialValuationExtend;
this.financialValuationAnalysis = financialValuationAnalysis;
this.quantitativeAnalysis = quantitativeAnalysis;
this.marketSentiment = marketSentiment;
this.institutionalActivity = institutionalActivity;
}
@ApiModelProperty("主力动向")
private InstitutionalActivityVO institutionalActivity;
public ComprehensiveEvaluationVO getComprehensiveEvaluation() {
return comprehensiveEvaluation;
}
public void setComprehensiveEvaluation(ComprehensiveEvaluationVO comprehensiveEvaluation) {
this.comprehensiveEvaluation = comprehensiveEvaluation;
}
public FinancialValuationVO getFinancialValuation() {
return financialValuation;
}
public void setFinancialValuation(FinancialValuationVO financialValuation) {
this.financialValuation = financialValuation;
}
public FinancialValuationExtendVO getFinancialValuationExtend() {
return financialValuationExtend;
}
public void setFinancialValuationExtend(FinancialValuationExtendVO financialValuationExtend) {
this.financialValuationExtend = financialValuationExtend;
}
public List<ValuationAnalysisVO> getFinancialValuationAnalysis() {
return financialValuationAnalysis;
}
public void setFinancialValuationAnalysis(List<ValuationAnalysisVO> financialValuationAnalysis) {
this.financialValuationAnalysis = financialValuationAnalysis;
}
public QuantitativeAnalysisVO getQuantitativeAnalysis() {
return quantitativeAnalysis;
}
public void setQuantitativeAnalysis(QuantitativeAnalysisVO quantitativeAnalysis) {
this.quantitativeAnalysis = quantitativeAnalysis;
}
public MarketSentimentVO getMarketSentiment() {
return marketSentiment;
}
public void setMarketSentiment(MarketSentimentVO marketSentiment) {
this.marketSentiment = marketSentiment;
}
public InstitutionalActivityVO getInstitutionalActivity() {
return institutionalActivity;
}
public void setInstitutionalActivity(InstitutionalActivityVO institutionalActivity) {
this.institutionalActivity = institutionalActivity;
}
}

View File

@ -7,7 +7,7 @@ import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDate;
@ApiModel
@ApiModel("财务估值-估值分析")
public class ValuationAnalysisVO implements Serializable {
@ApiModelProperty("日期")

View File

@ -0,0 +1,35 @@
package com.diagnose.vo.market;
public class KLineDataDateTime {
private Integer shtTime;
private Integer shtDay;
private Integer iDate;
public Integer getShtTime() {
return shtTime;
}
public void setShtTime(Integer shtTime) {
this.shtTime = shtTime;
}
public Integer getShtDay() {
return shtDay;
}
public void setShtDay(Integer shtDay) {
this.shtDay = shtDay;
}
public Integer getiDate() {
return iDate;
}
public void setiDate(Integer iDate) {
this.iDate = iDate;
}
}

View File

@ -0,0 +1,19 @@
package com.diagnose.vo.market;
import com.diagnose.vo.KLineVO;
import java.util.List;
public class KLineDataListVO {
private List<KLineDataVO> vAnalyData;
public List<KLineDataVO> getvAnalyData() {
return vAnalyData;
}
public void setvAnalyData(List<KLineDataVO> vAnalyData) {
this.vAnalyData = vAnalyData;
}
}

View File

@ -0,0 +1,14 @@
package com.diagnose.vo.market;
public class KLineDataResponseVO {
private KLineDataListVO stRsp;
public KLineDataListVO getStRsp() {
return stRsp;
}
public void setStRsp(KLineDataListVO stRsp) {
this.stRsp = stRsp;
}
}

View File

@ -0,0 +1,143 @@
package com.diagnose.vo.market;
import com.alibaba.fastjson.annotation.JSONField;
import io.swagger.annotations.ApiModelProperty;
import java.math.BigDecimal;
import java.time.LocalDate;
public class KLineDataVO {
/**
* {
* "fTurnoverRate": 0,
* "fZhenfu": 0,
* "uiAtpTradeNum": 0,
* "dAtpAmount": 0,
* "sttDateTime": {
* "shtTime": 0,
* "shtDay": 0,
* "iDate": 20250310
* },
* "fOpen": 7.54,
* "uiAtpVolume": 0,
* "fHigh": 7.57,
* "fAmount": 732008896,
* "sttZhiShu": {
* "usDown": 0,
* "usUp": 0,
* "fYClose": 0,
* "uiVolInStock": 0
* },
* "fLow": 7.44,
* "fClose": 7.48,
* "lVolume": 977810,
* "dSettlementPrice": 0}
*
* 1 optional HDateTime sttDateTime; // 时间,历史原因, 存到盘上的数据都是 *100 以后的 DWORD 型数据
* 2 optional double fOpen; // 单位开盘价
* 3 optional double fHigh; // 单位最高价
* 4 optional double fLow; // 单位最低价
* 5 optional double fClose; // 单位收盘价
* 6 optional double fAmount; // 单位成交金额 期货没有成交额 实际是持仓量
* 7 optional long lVolume; // 成交量
* 9 optional double dSettlementPrice; // 今日结算
* 10 optional HTogetherZhiShu sttZhiShu; // 指数信息
* 11 optional unsigned int uiAtpVolume = 0; // 盘后成交量
* 12 optional double dAtpAmount = 0; // 盘后成交额
* 13 optional unsigned int uiAtpTradeNum = 0; // 盘后成交笔数
* 14 optional float fZhenfu = 0; // 振幅 * 100%
* 15 optional float fTurnoverRate = 0; // 换手率 * 100%
* 16 optional double fZTPrice; // 涨停价
* 17 optional double fDTPrice; // 跌停价
* 18 optional unsigned int uiAuctionVolume; // 集合竞价成交量
* 19 optional double dAucAmount; // 竞价成交额
*/
@JSONField(serialize = false)
private KLineDataDateTime sttDateTime;
@ApiModelProperty("交易日")
private LocalDate tradeDate;
@ApiModelProperty("单位开盘价")
private BigDecimal fOpen;
@ApiModelProperty("单位最高价")
private BigDecimal fHigh;
@ApiModelProperty("单位最低价")
private BigDecimal fLow;
@ApiModelProperty("单位收盘价")
private BigDecimal fClose;
@ApiModelProperty("单位成交金额 期货没有成交额 实际是持仓量")
private BigDecimal fAmount;
@ApiModelProperty("成交量")
private BigDecimal lVolume;
public KLineDataDateTime getSttDateTime() {
return sttDateTime;
}
public void setSttDateTime(KLineDataDateTime sttDateTime) {
this.sttDateTime = sttDateTime;
}
public LocalDate getTradeDate() {
return tradeDate;
}
public void setTradeDate(LocalDate tradeDate) {
this.tradeDate = tradeDate;
}
public BigDecimal getfOpen() {
return fOpen;
}
public void setfOpen(BigDecimal fOpen) {
this.fOpen = fOpen;
}
public BigDecimal getfHigh() {
return fHigh;
}
public void setfHigh(BigDecimal fHigh) {
this.fHigh = fHigh;
}
public BigDecimal getfLow() {
return fLow;
}
public void setfLow(BigDecimal fLow) {
this.fLow = fLow;
}
public BigDecimal getfClose() {
return fClose;
}
public void setfClose(BigDecimal fClose) {
this.fClose = fClose;
}
public BigDecimal getfAmount() {
return fAmount;
}
public void setfAmount(BigDecimal fAmount) {
this.fAmount = fAmount;
}
public BigDecimal getlVolume() {
return lVolume;
}
public void setlVolume(BigDecimal lVolume) {
this.lVolume = lVolume;
}
}

View File

@ -0,0 +1,17 @@
package com.diagnose.vo.market;
import java.util.List;
public class StockHqSimpleDataVO {
private List<StockHqSimpleVO> vData;
public List<StockHqSimpleVO> getvData() {
return vData;
}
public void setvData(List<StockHqSimpleVO> vData) {
this.vData = vData;
}
}

View File

@ -0,0 +1,15 @@
package com.diagnose.vo.market;
public class StockHqSimpleResponseVO {
private StockHqSimpleDataVO stRsp;
public StockHqSimpleDataVO getStRsp() {
return stRsp;
}
public void setStRsp(StockHqSimpleDataVO stRsp) {
this.stRsp = stRsp;
}
}

View File

@ -0,0 +1,162 @@
package com.diagnose.vo.market;
import io.swagger.annotations.ApiModelProperty;
import java.math.BigDecimal;
public class StockHqSimpleVO {
@ApiModelProperty("交易日")
private String iTradeDate;
@ApiModelProperty("市场代码")
private String shtSetcode;
@ApiModelProperty("股票代码")
private String sCode;
@ApiModelProperty("股票名称")
private String sName;
@ApiModelProperty("振幅")
private BigDecimal fZhenfu;
@ApiModelProperty("涨跌幅")
private BigDecimal fChgRatio;
@ApiModelProperty("涨跌金额")
private BigDecimal fChgValue;
@ApiModelProperty("成交量")
private Long lVolume;
@ApiModelProperty("成交额")
private BigDecimal fAmount;
@ApiModelProperty("最低价")
private BigDecimal fLow;
@ApiModelProperty("现价")
private BigDecimal fNowPrice;
@ApiModelProperty("开盘价")
private BigDecimal fOpen;
@ApiModelProperty("最高价")
private BigDecimal fHigh;
@ApiModelProperty("昨日收盘价")
private BigDecimal fClose;
public String getiTradeDate() {
return iTradeDate;
}
public void setiTradeDate(String iTradeDate) {
this.iTradeDate = iTradeDate;
}
public String getShtSetcode() {
return shtSetcode;
}
public void setShtSetcode(String shtSetcode) {
this.shtSetcode = shtSetcode;
}
public String getsCode() {
return sCode;
}
public void setsCode(String sCode) {
this.sCode = sCode;
}
public String getsName() {
return sName;
}
public void setsName(String sName) {
this.sName = sName;
}
public BigDecimal getfZhenfu() {
return fZhenfu;
}
public void setfZhenfu(BigDecimal fZhenfu) {
this.fZhenfu = fZhenfu;
}
public BigDecimal getfChgRatio() {
return fChgRatio;
}
public void setfChgRatio(BigDecimal fChgRatio) {
this.fChgRatio = fChgRatio;
}
public BigDecimal getfChgValue() {
return fChgValue;
}
public void setfChgValue(BigDecimal fChgValue) {
this.fChgValue = fChgValue;
}
public Long getlVolume() {
return lVolume;
}
public void setlVolume(Long lVolume) {
this.lVolume = lVolume;
}
public BigDecimal getfAmount() {
return fAmount;
}
public void setfAmount(BigDecimal fAmount) {
this.fAmount = fAmount;
}
public BigDecimal getfLow() {
return fLow;
}
public void setfLow(BigDecimal fLow) {
this.fLow = fLow;
}
public BigDecimal getfNowPrice() {
return fNowPrice;
}
public void setfNowPrice(BigDecimal fNowPrice) {
this.fNowPrice = fNowPrice;
}
public BigDecimal getfOpen() {
return fOpen;
}
public void setfOpen(BigDecimal fOpen) {
this.fOpen = fOpen;
}
public BigDecimal getfHigh() {
return fHigh;
}
public void setfHigh(BigDecimal fHigh) {
this.fHigh = fHigh;
}
public BigDecimal getfClose() {
return fClose;
}
public void setfClose(BigDecimal fClose) {
this.fClose = fClose;
}
}

View File

@ -4,7 +4,4 @@ spring:
on-profile: dev
# 引入开发环境配置文件
import:
- optional:classpath:/dev/advisorServer.yaml
- optional:classpath:/dev/application.yaml
- optional:classpath:/dev/tencentConfig.yaml
- optional:classpath:/dev/business.yaml
- optional:classpath:/dev/application.yaml

View File

@ -1,10 +1,6 @@
spring:
config:
activate:
on-profile: prod-admin
on-profile: prod
import:
- optional:classpath:/prod/advisorServer.yaml
- optional:classpath:/prod/application.yaml
- optional:classpath:/prod/tencentConfig.yaml
- optional:classpath:/prod/business.yaml
- optional:classpath:/prod/admin.yaml
- optional:classpath:/prod/application.yaml

View File

@ -4,7 +4,4 @@ spring:
on-profile: test
# 引入开发环境配置文件
import:
- optional:classpath:/dev/advisorServer.yaml
- optional:classpath:/dev/application.yaml
- optional:classpath:/dev/tencentConfig.yaml
- optional:classpath:/dev/business.yaml
- optional:classpath:/dev/application.yaml

View File

@ -38,4 +38,13 @@ spring:
timeout-per-shutdown-phase: "10s"
springfox:
documentation:
enabled: true #是否开启swagger
enabled: true #是否开启swagger
server:
port: 9090
business:
api:
host: http://wup.cnsoft.sztg.com/json
timeout: 10000
url:
stockHqSimple: /hs_server/stockHqSimple
kLineData: /hs_server/kLineData

View File

@ -2,12 +2,12 @@
<included>
<!-- 设置日志文件路径 -->
<property name="LOG_PATH" value="/data/logs/advisor"/>
<property name="LOG_PATH" value="/data/logs/diagnose"/>
<!-- 定义多个 appender根据日志记录器的名称来决定输出的文件 -->
<appender name="default" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/advisor_server-%d{yyyyMMdd}.log</fileNamePattern>
<fileNamePattern>${LOG_PATH}/diagnose_server-%d{yyyyMMdd}.log</fileNamePattern>
<maxHistory>30</maxHistory> <!-- 保留最多30天的日志 -->
<totalSizeCap>1GB</totalSizeCap> <!-- 限制日志总大小 -->
</rollingPolicy>
@ -18,7 +18,7 @@
<appender name="data" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/advisor_server-data-%d{yyyyMMdd}.log</fileNamePattern>
<fileNamePattern>${LOG_PATH}/diagnose_server-data-%d{yyyyMMdd}.log</fileNamePattern>
<maxHistory>30</maxHistory> <!-- 保留最多30天的日志 -->
<totalSizeCap>1GB</totalSizeCap> <!-- 限制日志总大小 -->
</rollingPolicy>
@ -29,7 +29,7 @@
<appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/advisor_server-error-%d{yyyyMMdd}.log</fileNamePattern>
<fileNamePattern>${LOG_PATH}/diagnose_server-error-%d{yyyyMMdd}.log</fileNamePattern>
<maxHistory>30</maxHistory> <!-- 保留最多30天的日志 -->
<totalSizeCap>1GB</totalSizeCap> <!-- 限制日志总大小 -->
</rollingPolicy>
@ -46,10 +46,6 @@
<appender-ref ref="error"/>
</logger>
<logger name="api" level="INFO" additivity="false">
<appender-ref ref="api"/>
</logger>
<!-- 根 Logger 配置 (可以定义默认的日志记录器) -->
<root level="INFO">
<appender-ref ref="default"/>

View File

@ -7,7 +7,7 @@
<!-- 定义多个 appender根据日志记录器的名称来决定输出的文件 -->
<appender name="default" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/advisor_server-%d{yyyyMMdd}.log</fileNamePattern>
<fileNamePattern>${LOG_PATH}/diagnose_server-%d{yyyyMMdd}.log</fileNamePattern>
<maxHistory>30</maxHistory> <!-- 保留最多30天的日志 -->
<totalSizeCap>1GB</totalSizeCap> <!-- 限制日志总大小 -->
</rollingPolicy>
@ -18,7 +18,7 @@
<appender name="data" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/advisor_server-data-%d{yyyyMMdd}.log</fileNamePattern>
<fileNamePattern>${LOG_PATH}/diagnose_server-data-%d{yyyyMMdd}.log</fileNamePattern>
<maxHistory>30</maxHistory> <!-- 保留最多30天的日志 -->
<totalSizeCap>1GB</totalSizeCap> <!-- 限制日志总大小 -->
</rollingPolicy>
@ -29,7 +29,7 @@
<appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/advisor_server-error-%d{yyyyMMdd}.log</fileNamePattern>
<fileNamePattern>${LOG_PATH}/diagnose_server-error-%d{yyyyMMdd}.log</fileNamePattern>
<maxHistory>30</maxHistory> <!-- 保留最多30天的日志 -->
<totalSizeCap>1GB</totalSizeCap> <!-- 限制日志总大小 -->
</rollingPolicy>

View File

@ -38,4 +38,13 @@ spring:
timeout-per-shutdown-phase: "10s"
springfox:
documentation:
enabled: false #是否开启swagger
enabled: false #是否开启swagger
server:
port: 9090
business:
api:
host: http://172.27.1.11:18080/json
timeout: 10000
url:
stockHqSimple: /hs_server/stockHqSimple
kLineData: /hs_server/kLineData