|
|
|
|
@ -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() // 继续处理下一个日期,即使当前日期分析失败
|
|
|
|
|
})
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|