支持手动指定品种和日期进行打分
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
139
web/frontend/src/views/RunView.vue
Normal file
139
web/frontend/src/views/RunView.vue
Normal file
@@ -0,0 +1,139 @@
|
||||
<script setup lang="ts">
|
||||
import { onMounted, reactive, ref } from 'vue'
|
||||
import { ElMessage } from 'element-plus'
|
||||
import { listContracts } from '@/api/scores'
|
||||
import { runPipeline, type RunResponse } from '@/api/run'
|
||||
|
||||
const form = reactive<{
|
||||
ts_code: string
|
||||
symbol: string
|
||||
trade_date: string
|
||||
}>({
|
||||
ts_code: '',
|
||||
symbol: 'FG',
|
||||
trade_date: '',
|
||||
})
|
||||
|
||||
const contracts = ref<string[]>([])
|
||||
const loading = ref(false)
|
||||
const result = ref<RunResponse | null>(null)
|
||||
|
||||
async function submit() {
|
||||
if (!form.ts_code && !form.symbol) {
|
||||
ElMessage.warning('请选择合约或填写品种代号')
|
||||
return
|
||||
}
|
||||
|
||||
loading.value = true
|
||||
result.value = null
|
||||
try {
|
||||
const req: { ts_code?: string; symbol?: string; trade_date?: string } = {}
|
||||
if (form.ts_code) {
|
||||
req.ts_code = form.ts_code
|
||||
} else {
|
||||
req.symbol = form.symbol
|
||||
}
|
||||
if (form.trade_date) {
|
||||
req.trade_date = form.trade_date.replace(/-/g, '')
|
||||
}
|
||||
const resp = await runPipeline(req)
|
||||
result.value = resp
|
||||
ElMessage.success('打分完成')
|
||||
} catch (err: any) {
|
||||
const msg = err?.response?.data?.error || err.message || '请求失败'
|
||||
ElMessage.error(msg)
|
||||
} finally {
|
||||
loading.value = false
|
||||
}
|
||||
}
|
||||
|
||||
function signalTagType(s: string) {
|
||||
if (s.includes('强烈看多')) return 'success'
|
||||
if (s.includes('偏多')) return ''
|
||||
if (s.includes('偏空')) return 'warning'
|
||||
if (s.includes('强烈看空')) return 'danger'
|
||||
return 'info'
|
||||
}
|
||||
|
||||
onMounted(async () => {
|
||||
contracts.value = await listContracts().catch(() => [])
|
||||
})
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="page">
|
||||
<el-card shadow="never" title="手动打分">
|
||||
<template #header>
|
||||
<span>手动打分</span>
|
||||
</template>
|
||||
<el-form :model="form" label-width="100px" style="max-width: 480px">
|
||||
<el-form-item label="合约">
|
||||
<el-select
|
||||
v-model="form.ts_code"
|
||||
placeholder="选择已有合约(优先)"
|
||||
clearable
|
||||
filterable
|
||||
style="width: 100%"
|
||||
>
|
||||
<el-option
|
||||
v-for="c in contracts"
|
||||
:key="c"
|
||||
:label="c"
|
||||
:value="c"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="品种代号">
|
||||
<el-input
|
||||
v-model="form.symbol"
|
||||
placeholder="未选合约时按此品种选主力,如 FG"
|
||||
clearable
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="打分日期">
|
||||
<el-date-picker
|
||||
v-model="form.trade_date"
|
||||
type="date"
|
||||
placeholder="留空则对最新日期打分"
|
||||
value-format="YYYY-MM-DD"
|
||||
style="width: 100%"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" :loading="loading" @click="submit">
|
||||
执行打分
|
||||
</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</el-card>
|
||||
|
||||
<el-card v-if="result" shadow="never" class="result-card">
|
||||
<template #header>
|
||||
<span>打分结果</span>
|
||||
</template>
|
||||
<el-descriptions :column="2" border>
|
||||
<el-descriptions-item label="合约">{{ result.ts_code }}</el-descriptions-item>
|
||||
<el-descriptions-item label="日期">{{ result.trade_date }}</el-descriptions-item>
|
||||
<el-descriptions-item label="收盘">{{ result.close }}</el-descriptions-item>
|
||||
<el-descriptions-item label="持仓">{{ result.oi }}</el-descriptions-item>
|
||||
<el-descriptions-item label="短期(7d)">{{ result.short_term }}</el-descriptions-item>
|
||||
<el-descriptions-item label="中期(15d)">{{ result.medium_term }}</el-descriptions-item>
|
||||
<el-descriptions-item label="长期(30d)">{{ result.long_term }}</el-descriptions-item>
|
||||
<el-descriptions-item label="综合">
|
||||
<strong>{{ result.composite }}</strong>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="信号" :span="2">
|
||||
<el-tag :type="signalTagType(result.signal)">{{ result.signal }}</el-tag>
|
||||
</el-descriptions-item>
|
||||
</el-descriptions>
|
||||
</el-card>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
.page {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 16px;
|
||||
}
|
||||
</style>
|
||||
Reference in New Issue
Block a user