/* 持仓跟踪智能体 */ async function load() { try { const d = await api('/api/tracking'); const items = d.items || []; renderRecords(items); loadPositions(items); } catch (e) { $('#recTb').innerHTML = '加载失败'; } loadState(); } function loadState() { api('/api/settings').then(d => { const t = d.tracking || {}; $('#trackState').innerHTML = `
自动跟踪
${t.enabled ? '✅ 开启' : '⏸ 关闭'}(每 ${t.interval_min} 分钟)
上次运行
${t.last_run || '—'}
最近跟踪标的
${t.last_stock || '—'}
最近告警影响度
${t.last_alert ? t.last_alert + '/100' : '—'}
重大判定阈值
≥ ${t.impact_threshold}
`; }).catch(() => {}); } async function loadPositions(all) { try { const w = await api('/api/watchlist'); const pos = w.items || []; if (!pos.length) { $('#posBox').innerHTML = '
自选股为空。请先在 股票池 或个股详情页 ⭐ 添加持仓/关注标的
'; return; } // 每只自选股取最近一条跟踪 const rows = []; for (const p of pos) { const latest = all.find(r => r.code === p.code); rows.push({ stock: p, latest }); } $('#posBox').innerHTML = ` ${rows.map(x => { const p = x.stock, r = x.latest; const meta = r ? (JSON.parse(r.meta || '{}')) : null; const sigCls = meta ? (meta.impact_score >= 65 ? 'tag-强烈推荐' : meta.impact_score >= 45 ? 'tag-推荐' : 'tag-关注') : 'tag-观望'; return ``; }).join('')}
股票现价最近跟踪影响度性质摘要操作
${p.name}
${p.code} · ${p.industry}
${p.close} ${r ? r.created_at : '—'} ${r && meta ? `${meta.impact_score}` : '未跟踪'} ${meta ? `${meta.change_kind}` : '—'} ${meta ? escapeHtml(meta.summary || '') : '—'}
${r ? `` : ''}
`; } catch (e) { $('#posBox').innerHTML = '
加载失败
'; } } function renderRecords(items) { if (!items.length) return; $('#recTb').innerHTML = items.map(r => { let meta = {}; try { meta = JSON.parse(r.meta || '{}'); } catch (e) {} const sigCls = meta.impact_score >= 65 ? 'tag-强烈推荐' : meta.impact_score >= 45 ? 'tag-推荐' : 'tag-关注'; return ` ${r.created_at} ${r.stock_name}
${r.code}
${escapeHtml(r.industry)} ${meta.impact_score || '—'} ${meta.change_kind || '—'} ${escapeHtml(meta.summary || '')} `; }).join(''); } async function runAll() { if (!confirm('将对全部自选股执行一次产业链深度跟踪(每只约30-60秒,逐只进行),确定?')) return; try { const r = await api('/api/tracking/run', { method: 'POST' }); toast(r.msg || '已启动'); pollRefresh(); } catch (e) { toast('启动失败:' + e.message); } } async function runOne(code) { try { await api('/api/tracking/run/' + code, { method: 'POST' }); toast('跟踪已启动,完成后自动刷新'); setTimeout(() => { load(); toast('跟踪完成'); }, 80000); } catch (e) { toast('启动失败:' + e.message); } } /* 详情弹窗:报告 + 数据源 */ async function showDetail(id) { try { const d = await api('/api/tracking/' + id); const meta = d.meta || {}, src = d.sources || {}; const sigCls = meta.impact_score >= 65 ? 'tag-强烈推荐' : meta.impact_score >= 45 ? 'tag-推荐' : 'tag-关注'; const newsBlock = (label, icon, seg) => { if (!seg) return ''; const txt = ((seg.db || '') + (seg.rag || '')).trim(); return `
${icon} ${label} ${txt.includes('[') ? txt.split('[').length - 1 : 0}
${escapeHtml(txt || '暂无')}
`; }; openModal(`

🧭 产业链跟踪:${d.stock_name}(${d.code})

${escapeHtml(d.industry)} 影响度 ${meta.impact_score || '—'}/100 ${meta.change_kind || '—'} ${d.created_at}
${mdRender(d.report)}
数据源(智能体参考内容) ${newsBlock('个股直接动态', '📄', src.direct)} ${newsBlock('上游产业链(供给/成本)', '⬆️', src.upstream)} ${newsBlock('下游产业链(需求/景气)', '⬇️', src.downstream)} ${newsBlock('同业竞争', '🏢', src.peers)}
📈 技术面 / 机构动向
${escapeHtml(src.indicators || '')}
查看个股 →
`); } catch (e) { toast('加载失败'); } } let pollTimer = null; function pollRefresh() { clearTimeout(pollTimer); pollTimer = setTimeout(() => load(), 30000); } load();