From fef806f79656a557dbfe77a54c51d5df2c493b82 Mon Sep 17 00:00:00 2001 From: fish Date: Thu, 7 May 2026 22:49:33 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=88=E7=BA=A6=E5=85=A8=E6=99=AF=E5=88=B7?= =?UTF-8?q?=E6=96=B0=E6=97=B6=E8=87=AA=E5=8A=A8=E6=8B=89=E5=8F=96=E6=89=93?= =?UTF-8?q?=E5=88=86=EF=BC=8C=E5=B9=B6=E5=90=8C=E6=AD=A5=E5=9B=9E=E5=86=99?= =?UTF-8?q?=E5=AE=8C=E6=95=B4=E5=90=88=E7=BA=A6=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.7 --- web/frontend/src/views/ContractFullView.vue | 44 ++++++++++++++++----- 1 file changed, 34 insertions(+), 10 deletions(-) diff --git a/web/frontend/src/views/ContractFullView.vue b/web/frontend/src/views/ContractFullView.vue index df3dd30..2c6ab72 100644 --- a/web/frontend/src/views/ContractFullView.vue +++ b/web/frontend/src/views/ContractFullView.vue @@ -36,25 +36,32 @@ async function reload() { ]) candles.value = candleData scores.value = scoreData + + // 如果数据库里没有该合约数据,自动拉取并打分 + if (candleData.length === 0) { + await doFetchAndScore(true) + } } finally { loading.value = false } } -async function handleFetchAndScore() { +async function doFetchAndScore(skipConfirm: boolean) { if (!filter.ts_code) { ElMessage.warning('请输入或选择合约') return } - try { - await ElMessageBox.confirm( - `即将拉取 ${filter.ts_code} 的全部历史数据并逐日打分,这可能需要一些时间。`, - '拉取并打分', - { confirmButtonText: '确认', cancelButtonText: '取消', type: 'warning' }, - ) - } catch { - return + if (!skipConfirm) { + try { + await ElMessageBox.confirm( + `即将拉取 ${filter.ts_code} 的全部历史数据并逐日打分,这可能需要一些时间。`, + '拉取并打分', + { confirmButtonText: '确认', cancelButtonText: '取消', type: 'warning' }, + ) + } catch { + return + } } fullLoading.value = true @@ -62,8 +69,10 @@ async function handleFetchAndScore() { try { const resp = await runFull({ ts_code: filter.ts_code }) fullResult.value = resp + // 用后端返回的完整代码(含交易所后缀)更新输入框 + filter.ts_code = resp.ts_code ElMessage.success(`完成: ${resp.scored_count} 天已打分, ${resp.skipped_count} 天跳过`) - await reload() + await loadData() } catch (err: any) { const msg = err?.response?.data?.error || err.message || '请求失败' ElMessage.error(msg) @@ -72,6 +81,21 @@ async function handleFetchAndScore() { } } +async function handleFetchAndScore() { + await doFetchAndScore(false) +} + +async function loadData() { + if (!filter.ts_code) return + const [start, end] = filter.range || [] + const [candleData, scoreData] = await Promise.all([ + listCandles(filter.ts_code, start, end), + listScores({ ts_code: filter.ts_code, start, end, limit: 1000 }), + ]) + candles.value = candleData + scores.value = scoreData +} + onMounted(async () => { contracts.value = await listContracts().catch(() => []) if (contracts.value.length > 0) {