feat(recommendations): 添加合约推荐提示信息以优化用户排查流程
在后端API中新增合约推荐为空时的提示信息,指导用户检查推荐服务和策略运行状态。前端组件更新以显示该提示,提升用户体验并帮助用户更有效地进行问题排查。此改动增强了系统的可用性与用户友好性。
This commit is contained in:
parent
9a720b9a19
commit
104cb63802
|
|
@ -366,7 +366,15 @@ async def get_recommendations(
|
||||||
|
|
||||||
# 限制返回数量
|
# 限制返回数量
|
||||||
recommendations = recommendations[:limit]
|
recommendations = recommendations[:limit]
|
||||||
|
# 合约推荐为空时给出排查提示(与现货独立:现货来自定时扫描,合约来自策略/推荐服务)
|
||||||
|
hint = None
|
||||||
|
if len(recommendations) == 0:
|
||||||
|
hint = (
|
||||||
|
"合约推荐来自策略扫描:需信号强度≥5且方向明确才会写入。"
|
||||||
|
"若长期为空,请检查:1) 推荐服务(recommendations_main)或主策略(main)是否在运行;"
|
||||||
|
"2) 扫描日志中是否有「信号:N」≥5 的标的;3) 是否有推荐被时间/价格偏离过滤掉(见 meta.dropped)。"
|
||||||
|
)
|
||||||
|
|
||||||
return {
|
return {
|
||||||
"success": True,
|
"success": True,
|
||||||
"count": len(recommendations),
|
"count": len(recommendations),
|
||||||
|
|
@ -384,6 +392,7 @@ async def get_recommendations(
|
||||||
"price_drift": dropped_drift,
|
"price_drift": dropped_drift,
|
||||||
"invalid": dropped_invalid,
|
"invalid": dropped_invalid,
|
||||||
},
|
},
|
||||||
|
"hint": hint,
|
||||||
},
|
},
|
||||||
"data": recommendations
|
"data": recommendations
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,8 @@ function Recommendations() {
|
||||||
const [bookmarking, setBookmarking] = useState({}) // 记录正在标记的推荐ID
|
const [bookmarking, setBookmarking] = useState({}) // 记录正在标记的推荐ID
|
||||||
const [ordering, setOrdering] = useState({}) // 记录正在下单的推荐ID
|
const [ordering, setOrdering] = useState({}) // 记录正在下单的推荐ID
|
||||||
const [marketType, setMarketType] = useState('futures') // 'futures' | 'spot'
|
const [marketType, setMarketType] = useState('futures') // 'futures' | 'spot'
|
||||||
|
const [recommendationMeta, setRecommendationMeta] = useState(null) // 合约实时推荐的 meta(含 hint/dropped)
|
||||||
|
|
||||||
// 获取默认下单保证金(按账号存储,单位:USDT);现货时表示下单金额(USDT)
|
// 获取默认下单保证金(按账号存储,单位:USDT);现货时表示下单金额(USDT)
|
||||||
const getDefaultOrderSize = () => {
|
const getDefaultOrderSize = () => {
|
||||||
try {
|
try {
|
||||||
|
|
@ -108,6 +109,7 @@ function Recommendations() {
|
||||||
const result = await api.getSpotRecommendations({ limit: 50 })
|
const result = await api.getSpotRecommendations({ limit: 50 })
|
||||||
const data = result.data || []
|
const data = result.data || []
|
||||||
setRecommendations(data)
|
setRecommendations(data)
|
||||||
|
setRecommendationMeta(null)
|
||||||
} else {
|
} else {
|
||||||
const params = { type: typeFilter }
|
const params = { type: typeFilter }
|
||||||
if (typeFilter === 'bookmarked') {
|
if (typeFilter === 'bookmarked') {
|
||||||
|
|
@ -122,6 +124,7 @@ function Recommendations() {
|
||||||
const result = await api.getRecommendations(params)
|
const result = await api.getRecommendations(params)
|
||||||
const data = result.data || []
|
const data = result.data || []
|
||||||
setRecommendations(data)
|
setRecommendations(data)
|
||||||
|
setRecommendationMeta(result.meta || null)
|
||||||
}
|
}
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
setError(err.message)
|
setError(err.message)
|
||||||
|
|
@ -541,6 +544,11 @@ function Recommendations() {
|
||||||
) : recommendations.length === 0 ? (
|
) : recommendations.length === 0 ? (
|
||||||
<div className="empty-state">
|
<div className="empty-state">
|
||||||
<p>暂无推荐记录</p>
|
<p>暂无推荐记录</p>
|
||||||
|
{marketType === 'futures' && typeFilter === 'realtime' && recommendationMeta?.hint && (
|
||||||
|
<p style={{ marginTop: 10, fontSize: 13, color: '#666', maxWidth: 560, lineHeight: 1.5 }}>
|
||||||
|
{recommendationMeta.hint}
|
||||||
|
</p>
|
||||||
|
)}
|
||||||
<button className="btn-generate" onClick={handleGenerate}>
|
<button className="btn-generate" onClick={handleGenerate}>
|
||||||
生成推荐
|
生成推荐
|
||||||
</button>
|
</button>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user