v1.6.0: 目标跟踪(概念/主题/股票) - watch_targets表+概念智能体跟踪(关键词检索+受益个股+影响度判定+邮件通知), 自动化页加持仓管理和目标管理, 报告支持股票/概念双类型

This commit is contained in:
2026-08-19 23:49:37 +08:00
parent b34006c0d8
commit 9406f9de43
7 changed files with 389 additions and 65 deletions
+22 -9
View File
@@ -68,9 +68,11 @@ function renderRecords(items) {
let meta = {};
try { meta = JSON.parse(r.meta || '{}'); } catch (e) {}
const sigCls = meta.impact_score >= 65 ? 'tag-强烈推荐' : meta.impact_score >= 45 ? 'tag-推荐' : 'tag-关注';
const isConcept = r.target_type === 'concept';
return `<tr class="row-link" onclick="showDetail(${r.id})">
<td style="color:var(--muted)">${r.created_at}</td>
<td><b>${r.stock_name}</b><div style="color:var(--muted);font-size:12px">${r.code}</div></td>
<td><span class="cat-tag ${isConcept ? '行业' : '公司'}">${isConcept ? '概念/主题' : '股票'}</span></td>
<td><b>${r.stock_name}</b>${isConcept ? '' : `<div style="color:var(--muted);font-size:12px">${r.code}</div>`}</td>
<td style="color:var(--text2)">${escapeHtml(r.industry)}</td>
<td><span class="tag ${sigCls}">${meta.impact_score || '—'}</span></td>
<td><span class="tag tag-${meta.change_kind === '利好' ? '强烈推荐' : meta.change_kind === '利空' ? '负' : '关注'}">${meta.change_kind || '—'}</span></td>
@@ -109,10 +111,25 @@ async function showDetail(id) {
return `<details><summary>${icon} ${label} <span class="src-count">${txt.includes('[') ? txt.split('[').length - 1 : 0}</span></summary>
<div class="src-body"><pre class="src-pre">${escapeHtml(txt || '暂无')}</pre></div></details>`;
};
const isConcept = d.target_type === 'concept';
let sourceHtml;
if (isConcept) {
const nc = meta.news_counts || {};
sourceHtml = `
<details open><summary>🔎 相关资讯(${nc.direct || 0} 条)</summary><div class="src-body"><pre class="src-pre">${escapeHtml(src.db_news || '')}</pre></div></details>
<details><summary>🧠 语义检索命中(${nc.rag || 0} 条)</summary><div class="src-body"><pre class="src-pre">${escapeHtml(src.rag_news || '')}</pre></div></details>
<details><summary>🏢 受益个股(${nc.related || 0} 只)</summary><div class="src-body"><pre class="src-pre">${escapeHtml(src.related || '')}</pre></div></details>`;
} else {
sourceHtml = newsBlock('个股直接动态', '📄', src.direct) +
newsBlock('上游产业链(供给/成本)', '⬆️', src.upstream) +
newsBlock('下游产业链(需求/景气)', '⬇️', src.downstream) +
newsBlock('同业竞争', '🏢', src.peers) +
`<details><summary>📈 技术面 / 机构动向</summary><div class="src-body"><pre class="src-pre">${escapeHtml(src.indicators || '')}</pre></div></details>`;
}
openModal(`
<h3>🧭 产业链跟踪:${d.stock_name}${d.code}</h3>
<h3>${isConcept ? '🎯 概念主题跟踪' : '🧭 产业链跟踪'}${d.stock_name}${d.code && !isConcept ? '' + d.code + '' : ''}</h3>
<div class="news-meta" style="margin-bottom:12px">
<span class="cat-tag">${escapeHtml(d.industry)}</span>
<span class="cat-tag ${isConcept ? '行业' : '公司'}">${isConcept ? '概念/主题' : d.industry}</span>
<span class="tag ${sigCls}">影响度 ${meta.impact_score || '—'}/100</span>
<span class="tag tag-${meta.change_kind === '利好' ? '强烈推荐' : meta.change_kind === '利空' ? '负' : '关注'}">${meta.change_kind || '—'}</span>
<span style="color:var(--muted)">${d.created_at}</span>
@@ -120,15 +137,11 @@ async function showDetail(id) {
<div class="markdown-body">${mdRender(d.report)}</div>
<div style="margin-top:16px;border-top:1px solid var(--border);padding-top:10px">
<b style="color:var(--gold)">数据源(智能体参考内容)</b>
${newsBlock('个股直接动态', '📄', src.direct)}
${newsBlock('上游产业链(供给/成本)', '⬆️', src.upstream)}
${newsBlock('下游产业链(需求/景气)', '⬇️', src.downstream)}
${newsBlock('同业竞争', '🏢', src.peers)}
<details><summary>📈 技术面 / 机构动向</summary><div class="src-body"><pre class="src-pre">${escapeHtml(src.indicators || '')}</pre></div></details>
${sourceHtml}
</div>
<div style="margin-top:14px;text-align:right">
<button class="btn" onclick="document.querySelector('.modal-mask').classList.remove('show')">关闭</button>
<a class="btn btn-primary" href="/stock/${d.code}" target="_blank">查看个股 →</a>
${isConcept ? '' : `<a class="btn btn-primary" href="/stock/${d.code}" target="_blank">查看个股 →</a>`}
</div>
`);
} catch (e) { toast('加载失败'); }