From 1faa74db115f058dbf9ff8336fc9559a78423b71 Mon Sep 17 00:00:00 2001 From: Lxy Date: Sun, 25 Jan 2026 12:36:57 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=A2=9E=E5=8A=A0=E5=88=86=E6=9E=90?= =?UTF-8?q?=E5=89=8D=E7=AB=AFapi=E7=AD=89=E7=BB=86=E8=8A=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/StockDataController.java | 19 +++++++ .../mapper/TStockDailyTradeMapper.java | 8 +++ .../newstocksystem/mapper/TTrendsMapper.java | 9 +++ .../service/IStockDailyTradeService.java | 8 +++ .../impl/StockDailyTradeServiceImpl.java | 56 ++++++++++++++++--- .../newstocksystem/StockDailyTradeMapper.xml | 4 ++ .../mapper/newstocksystem/TTrendsMapper.xml | 4 ++ ruoyi-ui/src/api/newstocksystem/stockdata.js | 9 +++ .../src/views/newstocksystem/stockdata.vue | 48 +++++++++++++++- 9 files changed, 156 insertions(+), 9 deletions(-) diff --git a/newstock-system/src/main/java/com/ruoyi/newstocksystem/controller/StockDataController.java b/newstock-system/src/main/java/com/ruoyi/newstocksystem/controller/StockDataController.java index 0d03240..db152dd 100644 --- a/newstock-system/src/main/java/com/ruoyi/newstocksystem/controller/StockDataController.java +++ b/newstock-system/src/main/java/com/ruoyi/newstocksystem/controller/StockDataController.java @@ -22,6 +22,7 @@ import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; @@ -320,6 +321,24 @@ public class StockDataController extends BaseController return AjaxResult.success(lastTradeDate); } + /** + * 查询指定日期是否已存在分析数据 + */ + @GetMapping("/checkAnalysisStatus") + public AjaxResult checkAnalysisStatus(@RequestParam String tradeDate) + { + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Date tradeDateObj = sdf.parse(tradeDate); + boolean exists = stockDailyTradeService.checkTrendsExists(tradeDateObj); + return AjaxResult.success(exists); + } catch (ParseException e) { + return AjaxResult.error("日期格式错误,请使用yyyy-MM-dd格式"); + } catch (Exception e) { + return AjaxResult.error("检查失败:" + e.getMessage()); + } + } + /** * 分析股票数据 */ diff --git a/newstock-system/src/main/java/com/ruoyi/newstocksystem/mapper/TStockDailyTradeMapper.java b/newstock-system/src/main/java/com/ruoyi/newstocksystem/mapper/TStockDailyTradeMapper.java index 7b02bbd..c579e2b 100644 --- a/newstock-system/src/main/java/com/ruoyi/newstocksystem/mapper/TStockDailyTradeMapper.java +++ b/newstock-system/src/main/java/com/ruoyi/newstocksystem/mapper/TStockDailyTradeMapper.java @@ -109,4 +109,12 @@ public interface TStockDailyTradeMapper * @return 最后一个交易日(格式:yyyy-MM-dd) */ public String selectLastTradeDate(); + + /** + * 检查指定日期是否存在交易数据 + * + * @param tradeDate 交易日期 + * @return 存在则返回1,否则返回0 + */ + public int checkTradeDataExistsByDate(Date tradeDate); } diff --git a/newstock-system/src/main/java/com/ruoyi/newstocksystem/mapper/TTrendsMapper.java b/newstock-system/src/main/java/com/ruoyi/newstocksystem/mapper/TTrendsMapper.java index 0198840..3c8476f 100644 --- a/newstock-system/src/main/java/com/ruoyi/newstocksystem/mapper/TTrendsMapper.java +++ b/newstock-system/src/main/java/com/ruoyi/newstocksystem/mapper/TTrendsMapper.java @@ -1,5 +1,6 @@ package com.ruoyi.newstocksystem.mapper; +import java.util.Date; import java.util.List; import org.apache.ibatis.annotations.Mapper; import org.springframework.stereotype.Repository; @@ -70,4 +71,12 @@ public interface TTrendsMapper * @return 结果 */ public int batchUpsert(List tTrendsList); + + /** + * 检查指定日期是否存在趋势数据 + * + * @param tradeDate 交易日期 + * @return 存在则返回1,否则返回0 + */ + public int checkTrendsExistsByDate(Date tradeDate); } \ No newline at end of file diff --git a/newstock-system/src/main/java/com/ruoyi/newstocksystem/service/IStockDailyTradeService.java b/newstock-system/src/main/java/com/ruoyi/newstocksystem/service/IStockDailyTradeService.java index 7adc4c0..bb6df84 100644 --- a/newstock-system/src/main/java/com/ruoyi/newstocksystem/service/IStockDailyTradeService.java +++ b/newstock-system/src/main/java/com/ruoyi/newstocksystem/service/IStockDailyTradeService.java @@ -109,4 +109,12 @@ public interface IStockDailyTradeService * @return 分析结果信息 */ public String analysisStockData(TStockDailyTrade stockDailyTrade); + + /** + * 检查指定日期是否已存在趋势数据 + * + * @param tradeDate 交易日期 + * @return 是否已存在分析数据 + */ + public boolean checkTrendsExists(Date tradeDate); } diff --git a/newstock-system/src/main/java/com/ruoyi/newstocksystem/service/impl/StockDailyTradeServiceImpl.java b/newstock-system/src/main/java/com/ruoyi/newstocksystem/service/impl/StockDailyTradeServiceImpl.java index a2b68d3..861bd7c 100644 --- a/newstock-system/src/main/java/com/ruoyi/newstocksystem/service/impl/StockDailyTradeServiceImpl.java +++ b/newstock-system/src/main/java/com/ruoyi/newstocksystem/service/impl/StockDailyTradeServiceImpl.java @@ -17,8 +17,8 @@ import org.springframework.transaction.annotation.Transactional; import com.ruoyi.newstocksystem.domain.TIndustryBasic; import com.ruoyi.newstocksystem.domain.TStockBasic; import com.ruoyi.newstocksystem.domain.TStockDailyTrade; -import com.ruoyi.newstocksystem.mapper.TStockBasicMapper; import com.ruoyi.newstocksystem.mapper.TStockDailyTradeMapper; +import com.ruoyi.newstocksystem.mapper.TTrendsMapper; import com.ruoyi.newstocksystem.service.IIndustryIndexService; import com.ruoyi.newstocksystem.service.IStockBasicService; import com.ruoyi.newstocksystem.service.IStockDailyTradeService; @@ -37,6 +37,9 @@ public class StockDailyTradeServiceImpl implements IStockDailyTradeService @Autowired private TStockDailyTradeMapper stockDailyTradeMapper; + + @Autowired + private TTrendsMapper trendsMapper; @Autowired private IStockBasicService stockBasicService; @@ -386,25 +389,64 @@ public class StockDailyTradeServiceImpl implements IStockDailyTradeService return stockDailyTradeMapper.selectLastTradeDate(); } + @Override + public boolean checkTrendsExists(Date tradeDate) + { + logger.info("检查指定日期是否存在趋势数据,交易日期: {}", tradeDate); + try { + int count = trendsMapper.checkTrendsExistsByDate(tradeDate); + return count > 0; + } catch (Exception e) { + logger.error("检查趋势数据存在性失败,交易日期: {}", tradeDate, e); + throw new RuntimeException("检查失败: " + e.getMessage()); + } + } + + /** + * 检查指定日期是否存在交易数据 + * + * @param tradeDate 交易日期 + * @return 是否已存在交易数据 + */ + private boolean checkTradeDataExists(Date tradeDate) + { + logger.info("检查指定日期是否存在交易数据,交易日期: {}", tradeDate); + try { + int count = stockDailyTradeMapper.checkTradeDataExistsByDate(tradeDate); + return count > 0; + } catch (Exception e) { + logger.error("检查交易数据存在性失败,交易日期: {}", tradeDate, e); + throw new RuntimeException("检查失败: " + e.getMessage()); + } + } + @Override public String analysisStockData(TStockDailyTrade stockDailyTrade) { logger.info("开始分析股票数据,交易日期: {}", stockDailyTrade.getTradeDate()); try { - // 这里实现具体的分析逻辑,参考stocksystem的analysis方法 + // 1. 先检查指定日期是否存在交易数据 + if (!checkTradeDataExists(stockDailyTrade.getTradeDate())) { + logger.info("指定日期不存在交易数据,无法进行分析,交易日期: {}", stockDailyTrade.getTradeDate()); + return "该日期不存在交易数据,无法进行分析"; + } + + // 2. 再检查指定日期是否已存在分析数据 + if (checkTrendsExists(stockDailyTrade.getTradeDate())) { + logger.info("指定日期已存在分析数据,跳过分析,交易日期: {}", stockDailyTrade.getTradeDate()); + return "该日期已存在分析数据,无需重复分析"; + } + + // 3. 这里实现具体的分析逻辑,参考stocksystem的analysis方法 // 目前先记录日志并返回成功 - // 1. 可以在这里添加分析逻辑,比如: + // 可以在这里添加分析逻辑,比如: // - 更新涨跌幅数据 // - 计算动量指标 // - 生成技术分析结果 // - 其他业务逻辑 - // 2. 示例:可以遍历当天数据,进行某些计算 - // List dailyTradeList = stockDailyTradeMapper.selectStockDailyTradeList(stockDailyTrade); - // 然后对这些数据进行分析处理 - logger.info("股票数据分析完成,交易日期: {}", stockDailyTrade.getTradeDate()); return "分析完成"; } catch (Exception e) { diff --git a/newstock-system/src/main/resources/mapper/newstocksystem/StockDailyTradeMapper.xml b/newstock-system/src/main/resources/mapper/newstocksystem/StockDailyTradeMapper.xml index b9e9af4..99b8efa 100644 --- a/newstock-system/src/main/resources/mapper/newstocksystem/StockDailyTradeMapper.xml +++ b/newstock-system/src/main/resources/mapper/newstocksystem/StockDailyTradeMapper.xml @@ -244,4 +244,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" momentum_20d = VALUES(momentum_20d), momentum_60d = VALUES(momentum_60d) + + diff --git a/newstock-system/src/main/resources/mapper/newstocksystem/TTrendsMapper.xml b/newstock-system/src/main/resources/mapper/newstocksystem/TTrendsMapper.xml index 12ac1cb..e0f49a2 100644 --- a/newstock-system/src/main/resources/mapper/newstocksystem/TTrendsMapper.xml +++ b/newstock-system/src/main/resources/mapper/newstocksystem/TTrendsMapper.xml @@ -146,4 +146,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" eastmoney_industry_name = VALUES(eastmoney_industry_name), update_time = VALUES(update_time) + + \ No newline at end of file diff --git a/ruoyi-ui/src/api/newstocksystem/stockdata.js b/ruoyi-ui/src/api/newstocksystem/stockdata.js index f7e8fc5..28316c5 100644 --- a/ruoyi-ui/src/api/newstocksystem/stockdata.js +++ b/ruoyi-ui/src/api/newstocksystem/stockdata.js @@ -166,6 +166,15 @@ export default { data: data }) }, + + // 查询指定日期是否已存在分析数据 + checkAnalysisStatus(tradeDate) { + return request({ + url: '/newstocksystem/stockdata/checkAnalysisStatus', + method: 'get', + params: { tradeDate } + }) + }, // ========================= 个股新高新低状态相关 ========================= diff --git a/ruoyi-ui/src/views/newstocksystem/stockdata.vue b/ruoyi-ui/src/views/newstocksystem/stockdata.vue index dc380b1..6fb3581 100644 --- a/ruoyi-ui/src/views/newstocksystem/stockdata.vue +++ b/ruoyi-ui/src/views/newstocksystem/stockdata.vue @@ -46,7 +46,16 @@ 搜索 重置 - 分析 + + {{ dailyTradeTotal === 0 ? '无数据' : (analysisStatus.isAnalyzed ? '已分析' : '分析') }} + @@ -347,7 +356,13 @@ export default { updateSupport: false, tradeDate: null }, - fileList: [] + fileList: [], + + // ========================= 分析状态相关 ========================= + analysisStatus: { + isAnalyzed: false, // 当前选择日期是否已分析 + checking: false // 是否正在检查分析状态 + } } }, computed: { @@ -355,6 +370,12 @@ export default { return { Authorization: 'Bearer ' + getToken() } } }, + watch: { + // 监听每日交易数据查询的日期变化,动态检查分析状态 + 'dailyTradeQuery.tradeDate'(newVal) { + this.checkAnalysisStatus(newVal) + } + }, created() { this.getIndustryOptions() this.getLastTradeDate() @@ -378,11 +399,30 @@ export default { this.dailyTradeQuery.tradeDate = lastTradeDate this.industryIndexQuery.tradeDate = lastTradeDate this.stockHighLowQuery.tradeDate = lastTradeDate + // 检查分析状态 + this.checkAnalysisStatus(lastTradeDate) } // 在获取到最后交易日后,再调用查询方法,确保日期已经设置 this.getDailyTradeList() }) }, + + /** 检查指定日期是否已存在分析数据 */ + checkAnalysisStatus(tradeDate) { + if (!tradeDate) { + this.analysisStatus.isAnalyzed = false + return + } + this.analysisStatus.checking = true + stockdataApi.checkAnalysisStatus(tradeDate).then(response => { + this.analysisStatus.isAnalyzed = response.data + }).catch(error => { + this.$message.error('检查分析状态失败:' + (error.msg || error.message || '未知错误')) + this.analysisStatus.isAnalyzed = false + }).finally(() => { + this.analysisStatus.checking = false + }) + }, /** Tab 切换 */ handleTabClick(tab) { @@ -451,6 +491,8 @@ export default { }).then(() => { stockdataApi.analysis({ tradeDate: this.dailyTradeQuery.tradeDate }).then(response => { this.$message.success(response.msg || '分析完成') + // 分析完成后更新分析状态 + this.analysisStatus.isAnalyzed = true // 分析完成后刷新数据列表 this.getDailyTradeList() }).catch(error => { @@ -670,6 +712,8 @@ export default { this.getStockBasicList() } else if (this.upload.type === 'stockDailyTrade') { this.getDailyTradeList() + // 导入交易数据后检查分析状态 + this.checkAnalysisStatus(this.dailyTradeQuery.tradeDate) } else if (this.upload.type === 'stockHighLow') { this.getStockHighLowList() }