fix: 修复外部因素数据源 - 北向资金改为南向资金,修复P0-P7全部外部因素

- P0资金面:DB数据过期时用麦蕊API获取资金流向
- P1市场情绪:去掉turnover字段依赖(DB无此字段)
- P2南向资金:北向实时数据已停公布,改用南向资金(港股通)替代
- P3美股:用腾讯财经API替代失效的AKShare接口
- P4大宗商品:用腾讯财经API替代,修复var_name解析
- P7汇率:用新浪财经API替代失效的AKShare接口
- 修复评分详情API技术得分硬编码问题
- 前端传入tech_score参数确保明细与列表分数一致
This commit is contained in:
selfrelease
2026-07-18 16:45:58 +08:00
parent bb5a72767f
commit 79e869eeda
13 changed files with 637 additions and 193 deletions
+62 -2
View File
@@ -25,7 +25,7 @@
<link rel="stylesheet" href="/static/css/components.css?v=20260718v1">
<link rel="stylesheet" href="/static/css/auth.css?v=20260718v1">
<link rel="stylesheet" href="/static/css/pages.css?v=20260719v2">
<link rel="stylesheet" href="/static/css/scan.css?v=20260719v3">
<link rel="stylesheet" href="/static/css/scan.css?v=20260719v5">
<link rel="stylesheet" href="/static/css/responsive.css?v=20260719v1">
</head>
<body>
@@ -956,6 +956,66 @@
<span class="tech-recommend-rate" v-if="techSignalResult.recommend_rate">{{ techSignalResult.recommend_rate }}%</span>
<div class="tech-recommend-reason">{{ techSignalResult.recommend_reason }}</div>
</div>
<!-- 综合评分明细(外部因素) -->
<div v-if="techSignalResult.final_score != null" class="scan-score-breakdown">
<div class="score-breakdown-item">
<span class="breakdown-label">技术得分</span>
<span class="breakdown-value">{{ techSignalResult.technical_score }}</span>
</div>
<div class="score-breakdown-item">
<span class="breakdown-label">外部得分</span>
<span class="breakdown-value" :class="techSignalResult.external_score >= 0 ? 'pos' : 'neg'">
{{ techSignalResult.external_score >= 0 ? '+' : '' }}{{ techSignalResult.external_score }}
</span>
</div>
<div class="score-breakdown-item highlight">
<span class="breakdown-label">综合得分</span>
<span class="breakdown-value">{{ techSignalResult.final_score }}</span>
</div>
<div class="score-breakdown-item">
<span class="breakdown-label">评级</span>
<span class="breakdown-value">{{ techSignalResult.verdict }}</span>
</div>
</div>
<!-- 外部因素详情 -->
<div v-if="techSignalResult.score_detail_loading" class="scan-external-factors loading">
<span class="loading-spinner"></span> 正在加载外部因素...
</div>
<div v-else-if="techSignalResult.score_factors" class="scan-external-factors">
<div v-if="techSignalResult.score_factors.fund_flow" class="ext-factor-item">
<span class="ext-factor-label">💰 资金面</span>
<span class="ext-factor-score" :class="techSignalResult.score_factors.fund_flow.score >= 0 ? 'pos' : 'neg'">
{{ techSignalResult.score_factors.fund_flow.score >= 0 ? '+' : '' }}{{ techSignalResult.score_factors.fund_flow.score }}
</span>
<span class="ext-factor-summary">{{ techSignalResult.score_factors.fund_flow.summary }}</span>
</div>
<div v-if="techSignalResult.score_factors.market_sentiment" class="ext-factor-item">
<span class="ext-factor-label">📊 市场情绪</span>
<span class="ext-factor-score" :class="techSignalResult.score_factors.market_sentiment.score >= 0 ? 'pos' : 'neg'">
{{ techSignalResult.score_factors.market_sentiment.score >= 0 ? '+' : '' }}{{ techSignalResult.score_factors.market_sentiment.score }}
</span>
<span class="ext-factor-summary">{{ techSignalResult.score_factors.market_sentiment.sentiment || techSignalResult.score_factors.market_sentiment.summary }}</span>
</div>
<div v-if="techSignalResult.score_factors.external" class="ext-factor-item">
<span class="ext-factor-label">🌍 外部环境</span>
<span class="ext-factor-score" :class="techSignalResult.score_factors.external.total_score >= 0 ? 'pos' : 'neg'">
{{ techSignalResult.score_factors.external.total_score >= 0 ? '+' : '' }}{{ techSignalResult.score_factors.external.total_score }}
</span>
<span class="ext-factor-summary">{{ techSignalResult.score_factors.external.summary }}</span>
</div>
<div v-if="techSignalResult.score_factors.policy" class="ext-factor-item">
<span class="ext-factor-label">📜 政策面</span>
<span class="ext-factor-score" :class="techSignalResult.score_factors.policy.score >= 0 ? 'pos' : 'neg'">
{{ techSignalResult.score_factors.policy.score >= 0 ? '+' : '' }}{{ techSignalResult.score_factors.policy.score }}
</span>
<span class="ext-factor-summary">{{ techSignalResult.score_factors.policy.summary }}</span>
</div>
<div v-if="techSignalResult.score_factors.news" class="ext-factor-item">
<span class="ext-factor-label">📰 公告/异动</span>
<span class="ext-factor-score">{{ techSignalResult.score_factors.news.total_score }}</span>
<span class="ext-factor-summary">{{ techSignalResult.score_factors.news.summary }}</span>
</div>
</div>
<div v-if="techSignalResult.signal_status && techSignalResult.signal_status.length > 0" class="signal-status-list">
<div v-for="ss in techSignalResult.signal_status" :key="'scan-'+ss.type"
:class="['signal-status-item', ss.triggered ? 'triggered' : 'inactive']">
@@ -2239,6 +2299,6 @@
</div>
{% endraw %}
<script src="/static/js/app.js?v=20260511v3"></script>
<script src="/static/js/app.js?v=20260718v2"></script>
</body>
</html>