diff --git a/app/static/portal/employee-advisor/dashboard/actions-module.js b/app/static/portal/employee-advisor/dashboard/actions-module.js index 161b249..44bb4e1 100644 --- a/app/static/portal/employee-advisor/dashboard/actions-module.js +++ b/app/static/portal/employee-advisor/dashboard/actions-module.js @@ -231,7 +231,30 @@ export function createActionsModule({ output, alert, steps, amountInput, horizon + ''; } if (!products.length) { - html += note('当前没有通过适当性与证据校验的产品。', 'info'); + // 空候选池**必须说清为什么**:只写"没有产品",运营既不知道是谁的问题、 + // 也不知道下一步做什么。这里把证据门的口径与可执行动作一并给出。 + const summary = data.selection_summary || {}; + html += note( + '当前没有通过「适当性与证据校验」的产品。投顾推荐对每个产品都要求' + + '①销售机构的**已验证**适当性证据、②基金合同快照,且两者都要带可核查的' + + '来源链接与文档 sha256 —— 缺任一项即整只排除(fail closed)。' + + '本环境这两类证据暂无数据,因此候选为 0。', + 'info', + ); + if (summary.candidate_count !== undefined) { + html += note( + `本轮候选 ${summary.candidate_count ?? 0} 只:入选 ${summary.selected_count ?? 0} 只、` + + `排除 ${summary.excluded_count ?? 0} 只。`, + 'info', + ); + } + html += note( + '要看真实方案:先由产品治理线导入适当性证据与合同快照' + + '(`tools/import_product_governance_reference.py`,CSV 需带 source_url 与 document_sha256);' + + '只想先看呈现效果:可切到页面顶部的「本地演示数据」,那里的方案会明确标注' + + '"规则模拟、不构成真实推荐"。', + 'info', + ); } else { html += table(['产品', '风险级', '评分', '推荐依据'], products.map((product) => { const evidence = product.recommendation_evidence_card || {};