fix: 批量导入、批量分析完成

dev_refactor_0120_qoder
Lxy 4 months ago
parent c25a262dc1
commit a0a0c3a839

@ -350,6 +350,16 @@ public class StockDataController extends BaseController
return AjaxResult.success(result);
}
/**
*
*/
@GetMapping("/unanalyzedDates")
public AjaxResult getUnanalyzedDates()
{
List<String> unanalyzedDates = stockDailyTradeService.selectUnanalyzedDates();
return AjaxResult.success(unanalyzedDates);
}
// ========================= 个股新高新低状态相关接口 =========================
/**

@ -135,4 +135,11 @@ public interface TTrendsMapper
* @return
*/
public List<TTrends> getTrendsByDateAndType(TTrends tTrends);
/**
*
*
* @return yyyy-MM-dd
*/
public String selectLastAnalyzedDate();
}

@ -117,4 +117,11 @@ public interface IStockDailyTradeService
* @return
*/
public boolean checkTrendsExists(Date tradeDate);
/**
*
*
* @return yyyy-MM-dd
*/
public List<String> selectUnanalyzedDates();
}

@ -11,6 +11,8 @@ import java.util.Map;
import java.util.Arrays;
import java.util.Calendar;
import java.util.stream.Collectors;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import com.ruoyi.newstocksystem.domain.*;
import com.ruoyi.newstocksystem.mapper.TStocksInTrendMapper;
@ -409,6 +411,66 @@ public class StockDailyTradeServiceImpl implements IStockDailyTradeService
}
}
@Override
public List<String> selectUnanalyzedDates()
{
logger.info("开始获取未分析的交易日期");
try {
// 1. 从t_trends获取最后一个交易日已分析的最后日期
String lastAnalyzedDateStr = trendsMapper.selectLastAnalyzedDate();
Date lastAnalyzedDate = null;
if (lastAnalyzedDateStr != null) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
lastAnalyzedDate = sdf.parse(lastAnalyzedDateStr);
logger.info("最后一个已分析的交易日: {}", lastAnalyzedDateStr);
} else {
logger.info("没有已分析的交易日,将获取所有交易日期");
}
// 2. 在t_stock_daily_trade中获取该日之后所有有数据的交易日
List<String> allTradeDates = stockDailyTradeMapper.selectTradeDates();
logger.info("所有交易日期数量: {}", allTradeDates.size());
// 3. 过滤掉已经分析过的日期,返回未分析的日期列表
List<String> unanalyzedDates = new ArrayList<>();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
for (String dateStr : allTradeDates) {
Date tradeDate = sdf.parse(dateStr);
// 如果没有已分析的日期,或者当前日期在最后分析日期之后
if (lastAnalyzedDate == null || tradeDate.after(lastAnalyzedDate)) {
// 检查该日期是否已分析
if (!checkTrendsExists(tradeDate)) {
unanalyzedDates.add(dateStr);
}
}
}
// 4. 对未分析日期列表按照日期升序排列(时间更早的在前面)
unanalyzedDates.sort((date1, date2) -> {
try {
Date d1 = sdf.parse(date1);
Date d2 = sdf.parse(date2);
return d1.compareTo(d2);
} catch (ParseException e) {
logger.error("日期排序失败", e);
throw new RuntimeException("日期排序失败: " + e.getMessage());
}
});
logger.info("未分析的交易日期数量: {}", unanalyzedDates.size());
if (!unanalyzedDates.isEmpty()) {
logger.info("最早的未分析交易日: {}", unanalyzedDates.get(0));
logger.info("最晚的未分析交易日: {}", unanalyzedDates.get(unanalyzedDates.size() - 1));
}
return unanalyzedDates;
} catch (Exception e) {
logger.error("获取未分析的交易日期失败", e);
throw new RuntimeException("获取未分析的交易日期失败: " + e.getMessage());
}
}
/**
*
*

@ -189,4 +189,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
AND momentum_type = #{momentumType}
ORDER BY `rank`
</select>
<!-- 获取最后一个已分析的交易日 -->
<select id="selectLastAnalyzedDate" resultType="String">
SELECT DATE_FORMAT(MAX(trade_date), '%Y-%m-%d') AS last_date
FROM t_trends
</select>
</mapper>

@ -176,6 +176,14 @@ export default {
})
},
// 获取所有未分析的交易日期
getUnanalyzedDates() {
return request({
url: '/newstocksystem/stockdata/unanalyzedDates',
method: 'get'
})
},
// ========================= 个股新高新低状态相关 =========================
// 查询个股新高新低状态列表

@ -28,6 +28,11 @@
导入新高新低数据
</el-button>
</el-col>
<el-col :span="8">
<el-button type="danger" icon="el-icon-data-analysis" @click="handleBatchAnalysis">
批量分析数据
</el-button>
</el-col>
</el-row>
</el-card>
@ -390,6 +395,48 @@
<el-button @click="batchUpload.open = false" :disabled="batchUpload.loading"> </el-button>
</div>
</el-dialog>
<!-- 批量分析对话框 -->
<el-dialog title="批量分析数据" :visible.sync="batchAnalysis.open" width="600px" append-to-body>
<div v-if="batchAnalysis.loading" style="text-align: center; padding: 40px;">
<el-icon class="is-loading"><i class="el-icon-loading"></i></el-icon>
<span style="margin-left: 10px;">正在获取未分析的交易日期...</span>
</div>
<div v-else-if="batchAnalysis.unanalyzedDates.length === 0" style="text-align: center; padding: 40px;">
<el-icon><i class="el-icon-success"></i></el-icon>
<span style="margin-left: 10px;">所有交易日期都已分析</span>
</div>
<div v-else style="margin-top: 10px;">
<el-divider>未分析的交易日期</el-divider>
<el-table :data="batchAnalysis.unanalyzedDates" stripe style="width: 100%;">
<el-table-column type="index" label="序号" width="80" />
<el-table-column prop="tradeDate" label="交易日期" width="150" />
<el-table-column prop="status" label="状态" width="100">
<template slot-scope="scope">
<el-tag v-if="scope.row.status === 'pending'" type="info" size="small"></el-tag>
<el-tag v-else-if="scope.row.status === 'success'" type="success" size="small">成功</el-tag>
<el-tag v-else-if="scope.row.status === 'error'" type="danger" size="small">失败</el-tag>
</template>
</el-table-column>
</el-table>
</div>
<div slot="footer" class="dialog-footer">
<el-button
type="primary"
@click="submitBatchAnalysis"
:loading="batchAnalysis.analyzing"
:disabled="batchAnalysis.unanalyzedDates.length === 0 || batchAnalysis.analyzing"
>
{{ batchAnalysis.analyzing ? '分析中...' : '开始分析' }}
</el-button>
<el-button
@click="batchAnalysis.open = false"
:disabled="batchAnalysis.analyzing"
>
</el-button>
</div>
</el-dialog>
</div>
</template>
@ -489,6 +536,14 @@ export default {
},
batchFileList: [],
// ========================= =========================
batchAnalysis: {
open: false,
loading: false,
analyzing: false,
unanalyzedDates: []
},
// ========================= =========================
analysisStatus: {
isAnalyzed: false, //
@ -1008,6 +1063,85 @@ export default {
resolve() // 使
})
})
},
// ========================= =========================
/** 打开批量分析对话框 */
handleBatchAnalysis() {
this.batchAnalysis.open = true
this.batchAnalysis.loading = true
this.batchAnalysis.unanalyzedDates = []
//
this.getUnanalyzedDates()
},
/** 获取未分析的交易日期 */
getUnanalyzedDates() {
stockdataApi.getUnanalyzedDates().then(response => {
this.batchAnalysis.loading = false
if (response.data && Array.isArray(response.data)) {
//
this.batchAnalysis.unanalyzedDates = response.data.map(date => ({
tradeDate: date,
status: 'pending'
}))
}
}).catch(error => {
this.batchAnalysis.loading = false
this.$message.error('获取未分析的交易日期失败:' + (error.msg || error.message || '未知错误'))
})
},
/** 提交批量分析 */
submitBatchAnalysis() {
if (this.batchAnalysis.unanalyzedDates.length === 0) {
this.$message.warning('没有未分析的交易日期')
return
}
this.batchAnalysis.analyzing = true
//
const processAnalysis = async (index) => {
if (index >= this.batchAnalysis.unanalyzedDates.length) {
//
this.batchAnalysis.analyzing = false
this.batchAnalysis.open = false
this.$message.success('批量分析完成')
//
this.getDailyTradeList()
return
}
const dateItem = this.batchAnalysis.unanalyzedDates[index]
try {
await this.processBatchAnalysis(dateItem)
//
processAnalysis(index + 1)
} catch (error) {
this.batchAnalysis.analyzing = false
this.$message.error('批量分析过程中发生错误:' + (error.message || '未知错误'))
}
}
//
processAnalysis(0)
},
/** 处理单个日期的分析 */
processBatchAnalysis(dateItem) {
return new Promise((resolve, reject) => {
stockdataApi.analysis({ tradeDate: dateItem.tradeDate }).then(response => {
//
dateItem.status = 'success'
resolve()
}).catch(error => {
//
dateItem.status = 'error'
resolve() // 使
})
})
}
}
}

Loading…
Cancel
Save