Files
Mutual_Fund/design-preview/index.html
T

1087 lines
65 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>华夏基金 · 界面设计总览</title>
<style>
:root{
--navy:#12304f; --indigo:#4f46e5; --indigo-dark:#4338ca;
--bg:#f8fafc; --panel:#ffffff; --border:#e2e8f0; --border-soft:#f1f5f9;
--text:#0f172a; --muted:#64748b; --faint:#94a3b8;
--red:#dc2626; --green:#16a34a; --amber:#d97706; --blue:#2563eb;
--radius:12px;
}
*{box-sizing:border-box}
body{margin:0;background:#eef2f7;color:var(--text);
font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Microsoft YaHei",sans-serif;
font-size:14px;line-height:1.6}
h1,h2,h3,h4,p{margin:0}
/* ---------- 预览工具条 ---------- */
/* 页面内可点击导航(替代原先顶部的切屏标签栏) */
.navlink{cursor:pointer;transition:.15s}
.navlink:hover{color:var(--indigo)}
.site-nav .links span{cursor:pointer;transition:.15s}
.site-nav .links span:hover{color:var(--indigo)}
.screen{display:none}
.screen.active{display:block}
/* ---------- 通用组件 ---------- */
.card{background:var(--panel);border:1px solid var(--border);border-radius:var(--radius)}
.card-head{padding:16px 18px;border-bottom:1px solid var(--border-soft);display:flex;
align-items:flex-start;justify-content:space-between;gap:12px}
.card-title{font-size:14px;font-weight:600}
.card-desc{font-size:12px;color:var(--muted);margin-top:2px}
.card-body{padding:16px 18px}
.grid{display:grid;gap:16px}
.g4{grid-template-columns:repeat(4,1fr)}
.g3{grid-template-columns:repeat(3,1fr)}
.g2{grid-template-columns:repeat(2,1fr)}
.row{display:flex;align-items:center;gap:10px}
.between{display:flex;align-items:center;justify-content:space-between;gap:12px}
.wrap{flex-wrap:wrap}
.muted{color:var(--muted)}
.faint{color:var(--faint)}
.xs{font-size:12px}.sm{font-size:13px}.lg{font-size:15px}
.mt8{margin-top:8px}.mt12{margin-top:12px}.mt16{margin-top:16px}.mt24{margin-top:24px}
.b{font-weight:600}
.nowrap{white-space:nowrap}
.stat{padding:16px 18px}
.stat .label{font-size:12px;color:var(--muted)}
.stat .value{font-size:24px;font-weight:600;margin-top:6px;letter-spacing:-.02em}
.stat .sub{font-size:11px;color:var(--faint);margin-top:4px}
table{width:100%;border-collapse:collapse;font-size:13px}
th{text-align:left;font-weight:500;color:var(--muted);font-size:12px;
padding:10px 14px;border-bottom:1px solid var(--border);background:#f8fafc;white-space:nowrap}
td{padding:12px 14px;border-bottom:1px solid var(--border-soft);white-space:nowrap}
tbody tr:hover{background:#f8fafc}
.table-wrap{overflow-x:auto}
.badge{display:inline-flex;align-items:center;gap:4px;border-radius:999px;padding:2px 9px;
font-size:11px;font-weight:500;line-height:18px}
.b-red{background:#fef2f2;color:var(--red)} .b-green{background:#f0fdf4;color:var(--green)}
.b-amber{background:#fffbeb;color:var(--amber)} .b-blue{background:#eff6ff;color:var(--blue)}
.b-slate{background:#f1f5f9;color:var(--muted)} .b-indigo{background:#eef2ff;color:var(--indigo)}
.btn{border:1px solid var(--border);background:#fff;color:var(--text);border-radius:8px;
padding:7px 14px;font-size:13px;cursor:pointer;transition:.15s;font-family:inherit}
.btn:hover{background:#f8fafc}
.btn-primary{background:var(--indigo);border-color:var(--indigo);color:#fff}
.btn-primary:hover{background:var(--indigo-dark)}
.btn-danger{background:#fff;border-color:#fecaca;color:var(--red)}
.btn-sm{padding:4px 10px;font-size:12px;border-radius:6px}
.btn-ghost{border-color:transparent;background:transparent;color:var(--muted)}
.btn-ghost:hover{background:#f1f5f9}
.btn:disabled{opacity:.5;cursor:not-allowed}
.input,.select,textarea{width:100%;border:1px solid var(--border);border-radius:8px;
padding:8px 12px;font-size:13px;font-family:inherit;color:var(--text);background:#fff}
.input:focus,.select:focus,textarea:focus{outline:none;border-color:#a5b4fc}
.chip{border:1px solid var(--border);border-radius:999px;padding:3px 11px;font-size:12px;
color:var(--muted);cursor:pointer;background:#fff}
.chip:hover{border-color:#a5b4fc;color:var(--indigo)}
.empty{padding:48px 0;text-align:center;color:var(--faint);font-size:13px}
.skeleton{background:#f1f5f9;border-radius:6px;height:12px;animation:pulse 1.4s infinite}
@keyframes pulse{0%,100%{opacity:1}50%{opacity:.5}}
.spin{display:inline-block;width:13px;height:13px;border:2px solid #cbd5e1;
border-top-color:var(--indigo);border-radius:50%;animation:rot .8s linear infinite}
@keyframes rot{to{transform:rotate(360deg)}}
/* ---------- 后台壳层 ---------- */
.shell{min-height:100vh}
.sidebar{position:fixed;inset-y:0;left:0;width:224px;background:var(--navy);color:#fff;
display:flex;flex-direction:column;z-index:20}
.brand{display:flex;align-items:center;gap:10px;padding:18px 20px}
.brand-logo{width:34px;height:34px;border-radius:9px;background:var(--indigo);
display:flex;align-items:center;justify-content:center;font-weight:700;font-size:15px}
.brand-name{font-size:13px;font-weight:600}
.brand-sub{font-size:11px;color:#94a3b8}
.side-nav{flex:1;padding:6px 12px;overflow-y:auto}
.zone-label{font-size:10px;letter-spacing:.08em;color:#64748b;padding:12px 10px 4px;
text-transform:uppercase;font-weight:600}
.nav-item{display:flex;align-items:center;gap:10px;width:100%;padding:9px 10px;border:0;
background:transparent;color:#94a3b8;border-radius:8px;font-size:13px;cursor:pointer;
text-align:left;font-family:inherit;margin-bottom:2px}
.nav-item:hover{background:rgba(255,255,255,.06);color:#fff}
.nav-item.active{background:rgba(255,255,255,.12);color:#fff}
.nav-item .ico{width:16px;text-align:center;font-size:13px}
.nav-item .lock{margin-left:auto;font-size:10px;background:#1e293b;color:#94a3b8;
border-radius:4px;padding:1px 5px}
.side-foot{border-top:1px solid rgba(255,255,255,.1);padding:14px 20px;font-size:12px;color:#94a3b8}
.main{margin-left:224px;min-height:100vh}
.topbar{position:sticky;top:0;z-index:30;height:60px;background:#fff;
border-bottom:1px solid var(--border);display:flex;align-items:center;
justify-content:space-between;padding:0 22px}
.page-title{font-size:14px;font-weight:600}
.page-sub{font-size:12px;color:var(--muted)}
.avatar{width:32px;height:32px;border-radius:50%;background:#eef2ff;color:var(--indigo);
display:flex;align-items:center;justify-content:center;font-size:13px;font-weight:600}
.bell{position:relative;border:0;background:transparent;cursor:pointer;font-size:16px;padding:6px}
.dot{position:absolute;top:2px;right:2px;min-width:15px;height:15px;border-radius:999px;
background:var(--red);color:#fff;font-size:10px;display:flex;align-items:center;
justify-content:center;padding:0 3px}
.content{max-width:1360px;padding:22px}
/* ---------- 悬浮助手 ---------- */
.fab{position:fixed;right:24px;bottom:24px;z-index:60;width:56px;height:56px;border-radius:50%;
background:var(--indigo);color:#fff;border:0;cursor:pointer;box-shadow:0 10px 24px rgba(79,70,229,.35);
font-size:22px;display:flex;align-items:center;justify-content:center}
.fab:hover{background:var(--indigo-dark)}
.fab .cnt{position:absolute;top:-2px;right:-2px;min-width:20px;height:20px;border-radius:999px;
background:var(--red);color:#fff;font-size:11px;display:flex;align-items:center;justify-content:center}
.drawer-mask{position:fixed;inset:0;background:rgba(15,23,42,.12);z-index:70}
.drawer{position:fixed;top:0;right:0;bottom:0;width:560px;max-width:100%;background:#fff;z-index:80;
display:flex;flex-direction:column;box-shadow:-8px 0 32px rgba(15,23,42,.12)}
.drawer-head{display:flex;align-items:center;gap:10px;padding:14px 18px;border-bottom:1px solid var(--border)}
.drawer-body{flex:1;overflow-y:auto;padding:16px 18px;background:#f8fafc}
.drawer-foot{border-top:1px solid var(--border);padding:12px 18px;background:#fff}
.msg{display:flex;gap:9px;margin-bottom:14px}
.msg.me{flex-direction:row-reverse}
.msg-ava{width:28px;height:28px;border-radius:50%;background:#f1f5f9;color:var(--muted);
display:flex;align-items:center;justify-content:center;font-size:12px;flex-shrink:0}
.msg.me .msg-ava{background:#eef2ff;color:var(--indigo)}
.bubble{max-width:78%;background:#f1f5f9;color:var(--text);border-radius:12px;
padding:10px 14px;font-size:13px;line-height:1.7}
.msg.me .bubble{background:var(--indigo);color:#fff}
.seg{display:inline-flex;background:#f1f5f9;border-radius:8px;padding:2px}
.seg button{border:0;background:transparent;padding:5px 12px;font-size:12px;border-radius:6px;
cursor:pointer;color:var(--muted);font-family:inherit}
.seg button.on{background:#fff;color:var(--text);box-shadow:0 1px 2px rgba(15,23,42,.08)}
/* ---------- 弹窗 ---------- */
.modal-mask{position:fixed;inset:0;background:rgba(15,23,42,.45);z-index:90;
display:flex;align-items:center;justify-content:center;padding:24px}
.modal{background:#fff;border-radius:14px;width:100%;max-width:640px;max-height:88vh;
display:flex;flex-direction:column}
.modal-head{padding:16px 20px;border-bottom:1px solid var(--border-soft);
display:flex;align-items:center;justify-content:space-between}
.modal-body{padding:18px 20px;overflow-y:auto}
.modal-foot{padding:14px 20px;border-top:1px solid var(--border-soft);
display:flex;justify-content:flex-end;gap:10px}
.kv{display:grid;grid-template-columns:96px 1fr;gap:8px 14px;font-size:13px}
.kv .k{color:var(--muted)}
.subtabs{display:flex;gap:2px;border-bottom:1px solid var(--border);margin-bottom:14px}
.subtabs button{border:0;background:transparent;padding:8px 14px;font-size:13px;cursor:pointer;
color:var(--muted);border-bottom:2px solid transparent;font-family:inherit}
.subtabs button.on{color:var(--indigo);border-bottom-color:var(--indigo);font-weight:500}
/* ---------- 客户端 ---------- */
.site{background:#fff;min-height:100vh}
.site-nav{display:flex;align-items:center;justify-content:space-between;padding:16px 40px;
border-bottom:1px solid var(--border-soft);position:sticky;top:0;background:#fff;z-index:10}
.site-nav .links{display:flex;gap:26px;font-size:13px;color:var(--muted)}
.hero{padding:80px 40px;background:linear-gradient(180deg,#f8fafc,#fff)}
.hero h1{font-size:56px;line-height:1.1;font-weight:600;letter-spacing:-.02em;max-width:760px}
.hero p{color:var(--muted);margin-top:20px;font-size:16px;max-width:520px}
.section{padding:56px 40px}
.section h2{font-size:30px;font-weight:600;letter-spacing:-.01em}
.section .lead{color:var(--muted);margin-top:10px;font-size:15px}
.auth{min-height:100vh;display:grid;grid-template-columns:1fr 1fr}
.auth-left{background:var(--navy);color:#fff;padding:60px;display:flex;flex-direction:column;
justify-content:center}
.auth-left h1{font-size:38px;line-height:1.25;font-weight:600}
.auth-right{display:flex;align-items:center;justify-content:center;padding:60px;background:#fff}
.auth-box{width:100%;max-width:340px}
.auth-box h2{font-size:24px;font-weight:600}
.field{margin-top:16px}
.field label{display:block;font-size:12px;color:var(--muted);margin-bottom:6px}
.site-foot{border-top:1px solid var(--border-soft);padding:24px 40px;color:var(--faint);font-size:12px}
.nav-line{height:3px;background:var(--border);border-radius:2px;overflow:hidden}
.nav-line i{display:block;height:100%;background:var(--indigo);width:34%}
.bar-row{display:flex;align-items:center;gap:10px;font-size:12px;margin-bottom:8px}
.bar-track{flex:1;height:8px;background:#f1f5f9;border-radius:4px;overflow:hidden}
.bar-fill{height:100%;border-radius:4px}
/* 客户 / 游客侧智能助手(全局挂载) */
.ca-win{position:fixed;right:28px;bottom:92px;width:380px;height:520px;background:#fff;
border-radius:16px;border:1px solid var(--border);box-shadow:0 20px 48px rgba(15,23,42,.18);
display:flex;flex-direction:column;z-index:80;overflow:hidden}
.ca-head{background:var(--navy);color:#fff;padding:13px 18px;display:flex;
align-items:center;justify-content:space-between}
.ca-head .t{font-size:13px;font-weight:600}
.ca-head .s{font-size:11px;color:#bfdbfe}
.ca-body{flex:1;overflow-y:auto;padding:16px;background:#f8fafc}
.ca-body .m{margin-bottom:12px;display:flex}
.ca-body .m.bot{justify-content:flex-start}
.ca-body .m.usr{justify-content:flex-end}
.ca-body .bl{max-width:82%;border-radius:14px;padding:10px 14px;font-size:13px;line-height:1.7}
.ca-body .m.bot .bl{border:1px solid var(--border);background:#fff;color:var(--text)}
.ca-body .m.usr .bl{background:var(--indigo);color:#fff}
.ca-foot{border-top:1px solid var(--border);padding:12px;display:flex;gap:8px;background:#fff}
.price{font-size:34px;font-weight:600;letter-spacing:-.02em}
.up{color:var(--red)} .down{color:var(--green)}
.note{background:#fffbeb;border:1px solid #fde68a;color:#92400e;border-radius:8px;
padding:12px 14px;font-size:12px;line-height:1.7}
</style>
</head>
<body>
<!-- ============ 后台工作台(共享壳层) ============ -->
<div class="screen active" id="screen-admin">
<div class="shell">
<aside class="sidebar">
<div class="brand">
<div class="brand-logo">华</div>
<div><div class="brand-name">华夏基金</div><div class="brand-sub">统一员工工作台</div></div>
</div>
<nav class="side-nav" id="side-nav"></nav>
<div class="side-foot"><span class="navlink" onclick="navTo('screen-home')">返回官网</span>
· <span class="navlink" onclick="navTo('screen-login')">退出登录</span></div>
</aside>
<div class="main">
<header class="topbar">
<div class="row">
<button class="btn btn-ghost btn-sm">☰</button>
<div><div class="page-title" id="pg-title">工作台概览</div>
<div class="page-sub" id="pg-sub">按当前角色展示核心经营指标</div></div>
</div>
<div class="row">
<button class="bell">🔔<span class="dot">6</span></button>
<div class="avatar">李</div>
<div class="xs"><div class="b">李静</div><div class="faint">投顾</div></div>
</div>
</header>
<div class="content" id="admin-content"></div>
</div>
</div>
<button class="fab" id="fab" title="打开投顾助手">🤖<span class="cnt">3</span></button>
<div id="drawer-root" style="display:none">
<div class="drawer-mask" onclick="closeDrawer()"></div>
<aside class="drawer">
<div class="drawer-head">
<div class="brand-logo" style="width:34px;height:34px;font-size:16px">🤖</div>
<div style="flex:1">
<div class="sm b">投顾助手</div>
<div class="xs faint">会话 #8f2a1c · <span id="dw-status">空闲</span></div>
</div>
<select class="select" style="width:170px">
<option>#10231 王伟明</option><option>#10245 陈晓琳</option>
<option selected>未指定客户(通用问答)</option>
</select>
<button class="btn btn-sm" onclick="endSession()">结束会话</button>
<button class="btn btn-ghost btn-sm" onclick="closeDrawer()">-</button>
</div>
<div style="padding:10px 18px;border-bottom:1px solid var(--border-soft)">
<div class="seg">
<button class="on" onclick="switchDw(this,'dw-chat')">对话</button>
<button onclick="switchDw(this,'dw-drafts')">草稿 (3)</button>
</div>
</div>
<div class="drawer-body" id="dw-chat">
<div class="msg"><div class="msg-ava">🤖</div>
<div class="bubble">我可以帮你查询客户数据、分析基金、生成沟通话术和调仓建议。<br>
<span class="faint xs">指定客户后,助手只能读取你名下已授权的客户数据。</span></div></div>
<div class="msg me"><div class="msg-ava">李</div>
<div class="bubble">帮我看看王伟明的持仓,最近需要调仓吗?</div></div>
<div class="msg"><div class="msg-ava">🤖</div>
<div class="bubble">客户王伟明(C3·稳健型)当前持仓 5 只基金,权益类占比 <b>62%</b>,
高于其风险等级建议上限 <b>50%</b>,主要超配来自「华夏成长混合」单只占比 28%。<br><br>
近 3 月组合回撤 6.4%,同期基准 4.1%。建议将权益仓位下调至 50% 以内,
优先减持单一集中度较高的成长风格产品。<br><br>
<span class="faint xs">意图:portfolio_rebalance · 已生成草稿</span></div></div>
</div>
<div class="drawer-body" id="dw-drafts" style="display:none">
<div class="card"><div class="card-body" style="padding:14px 16px">
<div class="between"><div><div class="sm b">调仓建议 · 王伟明</div>
<div class="xs muted mt8">建议将权益仓位由 62% 降至 50%…</div></div>
<span class="badge b-amber">待发送</span></div>
<div class="row mt12"><span class="badge b-indigo">rebalance</span>
<span class="xs faint">09-14 18:22</span>
<span style="flex:1"></span>
<button class="btn btn-sm btn-ghost">编辑</button>
<button class="btn btn-sm btn-ghost">🗑</button></div>
</div></div>
<div class="card mt12"><div class="card-body" style="padding:14px 16px">
<div class="between"><div><div class="sm b">市场波动沟通话术</div>
<div class="xs muted mt8">近期市场震荡,建议主动联系…</div></div>
<span class="badge b-slate">草稿</span></div>
<div class="row mt12"><span class="badge b-indigo">dialogue-script</span>
<span class="xs faint">09-13 15:40</span></div>
</div></div>
</div>
<div class="drawer-foot">
<div class="row wrap" style="margin-bottom:10px">
<span class="chip">🔍 查客户数据</span><span class="chip">📊 基金分析</span>
<span class="chip">💬 生成话术</span><span class="chip">🔄 调仓再平衡</span>
</div>
<div class="row" style="align-items:flex-end">
<textarea rows="2" placeholder="描述你的问题,回车发送(Shift+Enter 换行)"
style="flex:1;resize:none"></textarea>
<button class="btn btn-primary">发送</button>
</div>
</div>
</aside>
</div>
<div id="cust-modal" style="display:none">
<div class="modal-mask" onclick="closeModal()">
<div class="modal" onclick="event.stopPropagation()">
<div class="modal-head"><div class="b">客户详情 · 王伟明</div>
<button class="btn btn-ghost btn-sm" onclick="closeModal()">✕</button></div>
<div class="modal-body">
<div class="subtabs">
<button class="on">基本资料</button><button>持仓</button><button>组合诊断</button><button>历史报告</button>
</div>
<div class="kv">
<div class="k">客户编号</div><div>#10231</div>
<div class="k">手机号</div><div>138****6721 <button class="btn btn-sm btn-ghost">查看</button></div>
<div class="k">客户等级</div><div><span class="badge b-blue">A</span></div>
<div class="k">风险等级</div><div><span class="badge b-amber">C3 稳健型</span></div>
<div class="k">风险评分</div><div>62 / 100</div>
<div class="k">总资产</div><div>¥ 1,284,600.00</div>
<div class="k">关系状态</div><div><span class="badge b-green">已签约</span></div>
<div class="k">签约时间</div><div>2024-03-11</div>
</div>
<div class="note mt16">查看完整手机号会写入审计日志,仅可用于本人名下客户的合规服务场景。</div>
</div>
<div class="modal-foot"><button class="btn" onclick="closeModal()">关闭</button></div>
</div>
</div>
</div>
</div>
<!-- ============ 客户 / 游客侧智能助手(全局挂载,后台不显示) ============ -->
<div id="client-agent" style="display:none">
<div class="ca-win" id="ca-win" style="display:none">
<div class="ca-head">
<div class="row" style="gap:10px">
<div class="brand-logo" style="width:34px;height:34px;font-size:15px">🤖</div>
<div><div class="t">华夏基金智能助手</div><div class="s" id="ca-state">在线为您提供基金信息服务</div></div>
</div>
<button class="btn btn-ghost btn-sm" style="color:#bfdbfe" onclick="closeCA()">✕</button>
</div>
<div class="ca-body">
<div id="ca-connecting" class="xs" style="color:#94a3b8;padding:6px 0">正在建立会话...</div>
<div id="ca-messages" style="display:none">
<div class="m bot"><div class="bl">您好,我是华夏基金智能助手。您可以咨询基金产品、风险等级和净值信息。</div></div>
<div class="m usr"><div class="bl">稳健型的我能买股票型基金吗?</div></div>
<div class="m bot"><div class="bl">风险等级 C2(保守型)通常不建议购买 R4 股票型基金,
两者风险等级不匹配。您可以关注 R2 债券型或 R3 混合型产品。<br><br>
<span class="faint xs">以上信息仅供参考,不构成投资建议。</span></div></div>
</div>
</div>
<div class="ca-foot">
<input class="input" placeholder="输入您的问题">
<button class="btn btn-primary">发送</button>
</div>
</div>
<button class="fab" onclick="toggleCA()" title="华夏基金智能助手"
style="right:28px;bottom:20px">💬</button>
</div>
<!-- ============ 知识库管理(独立后台页,不在工作台壳层内) ============ -->
<div class="screen" id="screen-knowledge">
<div style="background:#f8fafc;min-height:100vh;padding:32px 24px">
<div style="max-width:960px;margin:0 auto">
<div class="xs navlink" style="color:#64748b" onclick="navTo('screen-admin')">← 返回统一工作台</div>
<h1 style="font-size:24px;font-weight:600;margin-top:18px">知识库管理</h1>
<p class="s" style="margin-top:6px">上传投顾 / 客服 Agent 可检索的文档,入库前可先预览切分效果</p>
<div class="card mt16"><div class="card-head"><div><div class="card-title">上传文档</div>
<div class="card-desc">先预览切分效果,确认无误后再入库</div></div></div>
<div class="card-body">
<div class="row" style="gap:12px">
<span class="btn btn-sm">选择文件</span>
<span class="s muted">投顾话术手册_v3.pdf</span>
</div>
<div class="grid g3 mt16" style="gap:12px">
<div><div class="xs muted mb8" style="margin-bottom:6px">标题</div>
<input class="input" value="投顾话术手册_v3.pdf"></div>
<div><div class="xs muted mb8" style="margin-bottom:6px">切分策略</div>
<select class="input"><option>默认(按段落递归切分)</option>
<option>固定长度切分</option><option>按句子切分</option></select></div>
<div class="row" style="gap:8px">
<div style="flex:1"><div class="xs muted" style="margin-bottom:6px">分片长度</div>
<input class="input" placeholder="留空用默认"></div>
<div style="flex:1"><div class="xs muted" style="margin-bottom:6px">重叠长度</div>
<input class="input" placeholder="留空用默认"></div>
</div>
</div>
<div class="row mt16" style="gap:8px">
<button class="btn btn-sm">预览切分</button>
<button class="btn btn-primary btn-sm">确认入库</button>
<button class="btn btn-ghost btn-sm">取消</button>
</div>
<div style="border:1px solid var(--border);background:#f8fafc;border-radius:8px;padding:14px;margin-top:16px">
<div class="row" style="gap:8px;flex-wrap:wrap">
<span class="badge b-info">default</span>
<span class="xs muted">分片 800</span><span class="xs muted">重叠 120</span>
<span class="xs" style="font-weight:600;color:#334155">共切出 42 段</span>
</div>
<div style="margin-top:10px;max-height:150px;overflow:auto">
<div class="bl" style="background:#fff;border:1px solid var(--border);border-radius:6px;
padding:8px 12px;font-size:12px;line-height:1.7;color:#475569;margin-bottom:6px">
第 1 段:本手册适用于一线投顾在客户沟通场景中使用,所有表述须通过合规校验后方可对外发送。</div>
<div class="bl" style="background:#fff;border:1px solid var(--border);border-radius:6px;
padding:8px 12px;font-size:12px;line-height:1.7;color:#475569;margin-bottom:6px">
第 2 段:风险揭示话术:任何基金产品均不承诺保本,历史业绩不代表未来表现,请在客户理解后确认。</div>
<div class="xs muted" style="padding:0 12px">仅展示前 20 段,共 42 段</div>
</div>
</div>
</div>
</div>
<div class="card mt16"><div class="card-head"><div><div class="card-title">已入库文档</div>
<div class="card-desc">共 3 篇</div></div></div>
<div class="card-body" style="padding:0">
<div class="table-wrap"><table>
<thead><tr><th>文档</th><th>集合</th><th>分段</th><th>入库时间</th><th></th></tr></thead>
<tbody>
<tr><td>投顾话术手册_v3.pdf</td><td>advisor_kb</td><td>42 段</td>
<td class="muted">2026-09-10 14:22</td><td class="muted">删除</td></tr>
<tr><td>基金产品说明书汇总.docx</td><td>product_kb</td><td>128 段</td>
<td class="muted">2026-09-08 09:41</td><td class="muted">删除</td></tr>
<tr><td>合规红线与禁语清单.md</td><td>compliance_kb</td><td>17 段</td>
<td class="muted">2026-09-02 16:05</td><td class="muted">删除</td></tr>
</tbody>
</table></div>
</div>
</div>
</div>
</div>
</div>
<!-- ============ 客户端各页 ============ -->
<div class="screen" id="screen-home"><div class="site">
<div class="site-nav"><div class="b lg">华夏基金</div>
<div class="links"><span onclick="navTo('screen-home')">首页</span><span onclick="navTo('screen-products')">基金产品</span><span onclick="toggleCA()">智能投顾</span><span onclick="navTo('screen-risk')">风险管理</span><span onclick="navTo('screen-admin')">员工工作台</span></div>
<div class="row"><button class="btn btn-sm" onclick="navTo('screen-login')">登录</button><button class="btn btn-primary btn-sm" onclick="navTo('screen-login')">开户</button></div>
</div>
<div class="hero">
<h1>让每一份长期信任,<br>变成清晰的选择。</h1>
<p>基于你的风险承受能力与投资目标,提供更合适的方案。</p>
<div class="row mt24"><button class="btn btn-primary" onclick="navTo('screen-risk')">开始风险测评</button>
<button class="btn" onclick="navTo('screen-products')">浏览基金产品</button></div>
</div>
<div class="section" style="padding-top:24px">
<div class="grid g3">
<div class="card"><div class="card-body"><div class="b">公募基金</div>
<div class="xs muted mt8">覆盖股票、债券、混合、指数等多类型产品。</div></div></div>
<div class="card"><div class="card-body"><div class="b">风险管理</div>
<div class="xs muted mt8">全流程风险识别与预警,守住投资底线。</div></div></div>
<div class="card"><div class="card-body"><div class="b">智能投顾</div>
<div class="xs muted mt8">数据驱动的持仓诊断与配置建议。</div></div></div>
</div>
</div>
<div class="section" style="padding-top:0">
<h2>找到适合自己的基金。</h2><div class="lead">精选白名单产品,数据每日更新。</div>
<div class="grid g3 mt16">
<div class="card navlink" onclick="navTo('screen-detail')"><div class="card-body"><div class="xs faint">000001 · 混合型</div>
<div class="b mt8">华夏成长混合</div>
<div class="row mt12"><span class="price up">2.1840</span>
<span class="xs up">+1.24%</span></div></div></div>
<div class="card navlink" onclick="navTo('screen-detail')"><div class="card-body"><div class="xs faint">000311 · 股票型</div>
<div class="b mt8">华夏复兴股票</div>
<div class="row mt12"><span class="price down">3.0420</span>
<span class="xs down">-0.62%</span></div></div></div>
<div class="card navlink" onclick="navTo('screen-detail')"><div class="card-body"><div class="xs faint">001056 · 债券型</div>
<div class="b mt8">华夏稳健债券</div>
<div class="row mt12"><span class="price up">1.3260</span>
<span class="xs up">+0.18%</span></div></div></div>
</div>
</div>
<div class="site-foot">基金投资有风险,过往业绩不代表未来表现。</div>
</div></div>
<div class="screen" id="screen-products"><div class="site">
<div class="site-nav"><div class="b lg">华夏基金</div>
<div class="links"><span onclick="navTo('screen-home')">首页</span><span onclick="navTo('screen-products')">基金产品</span><span onclick="toggleCA()">智能投顾</span><span onclick="navTo('screen-risk')">风险管理</span><span onclick="navTo('screen-admin')">员工工作台</span></div>
<div class="avatar navlink" onclick="navTo('screen-account')">李</div></div>
<div class="section" style="padding-bottom:0">
<h1 style="font-size:40px;font-weight:600">基金产品</h1>
<div class="row mt16 wrap">
<input class="input" style="max-width:320px" placeholder="搜索基金名称或代码">
<select class="select" style="max-width:150px"><option>全部类型</option></select>
<select class="select" style="max-width:150px"><option>全部风险等级</option></select>
</div>
</div>
<div class="section" style="padding-top:20px">
<div class="card"><div class="table-wrap"><table>
<thead><tr><th>基金代码</th><th>基金名称</th><th>类型</th><th>风险等级</th>
<th>单位净值</th><th>日涨跌</th><th>净值日期</th><th>基金经理</th><th></th></tr></thead>
<tbody>
<tr><td>000001</td><td class="b">华夏成长混合</td><td>混合型</td>
<td><span class="badge b-amber">R3</span></td><td>2.1840</td>
<td class="up">+1.24%</td><td>2026-09-13</td><td>张伟</td>
<td><button class="btn btn-sm btn-ghost" onclick="navTo('screen-detail')">详情</button></td></tr>
<tr><td>000311</td><td class="b">华夏复兴股票</td><td>股票型</td>
<td><span class="badge b-red">R4</span></td><td>3.0420</td>
<td class="down">-0.62%</td><td>2026-09-13</td><td>李娜</td>
<td><button class="btn btn-sm btn-ghost" onclick="navTo('screen-detail')">详情</button></td></tr>
<tr><td>001056</td><td class="b">华夏稳健债券</td><td>债券型</td>
<td><span class="badge b-green">R2</span></td><td>1.3260</td>
<td class="up">+0.18%</td><td>2026-09-13</td><td>王强</td>
<td><button class="btn btn-sm btn-ghost" onclick="navTo('screen-detail')">详情</button></td></tr>
</tbody></table></div></div>
</div>
</div></div>
<div class="screen" id="screen-detail"><div class="site">
<div class="site-nav"><div class="b lg">华夏基金</div>
<div class="links"><span onclick="navTo('screen-home')">首页</span><span onclick="navTo('screen-products')">基金产品</span><span onclick="toggleCA()">智能投顾</span><span onclick="navTo('screen-risk')">风险管理</span><span onclick="navTo('screen-admin')">员工工作台</span></div>
<div class="avatar navlink" onclick="navTo('screen-account')">李</div></div>
<div class="section" style="padding-bottom:0">
<div class="xs faint">000001 · 混合型 · R3</div>
<h1 style="font-size:34px;font-weight:600;margin-top:6px">华夏成长混合</h1>
<div class="row mt16" style="gap:32px">
<div><div class="xs muted">单位净值</div>
<div class="price up">2.1840</div></div>
<div><div class="xs muted">日涨跌</div><div class="lg b up">+1.24%</div></div>
<div><div class="xs muted">近一年</div><div class="lg b up">+18.62%</div></div>
<div><div class="xs muted">基金经理</div><div class="lg b">张伟</div></div>
</div>
<div class="row mt24"><button class="btn btn-primary">申购</button><button class="btn">赎回</button></div>
</div>
<div class="section" style="padding-top:24px">
<h2 style="font-size:22px">历史净值走势</h2>
<div class="card mt16"><div class="card-body">
<svg viewBox="0 0 800 220" style="width:100%;height:220px">
<polyline fill="none" stroke="#dc2626" stroke-width="2"
points="0,180 80,165 160,172 240,140 320,150 400,118 480,126 560,92 640,100 720,68 800,54"/>
<polyline fill="rgba(220,38,38,.08)" stroke="none"
points="0,180 80,165 160,172 240,140 320,150 400,118 480,126 560,92 640,100 720,68 800,54 800,220 0,220"/>
</svg>
<div class="row between xs faint"><span>2025-09</span><span>2026-03</span><span>2026-09</span></div>
</div></div>
<div class="note mt16">基金过往业绩不预示其未来表现,投资须谨慎。</div>
</div>
</div></div>
<div class="screen" id="screen-login">
<div class="auth">
<div class="auth-left">
<div class="b lg">华夏基金</div>
<h1 class="mt24">专业研究,<br>陪伴长期价值。</h1>
<p style="color:#94a3b8;margin-top:20px;max-width:320px">以长期视角管理每一笔托付,
用纪律与数据应对市场波动。</p>
</div>
<div class="auth-right"><div class="auth-box">
<h2>欢迎回来</h2>
<div class="xs muted mt8">请使用您的账号登录员工工作台或用户中心</div>
<div class="field"><label>用户名</label><input class="input" value=""></div>
<div class="field"><label>密码</label><input class="input" type="password" value=""></div>
<button class="btn btn-primary mt16" style="width:100%" onclick="navTo('screen-account')">登录</button>
<div class="between mt16 xs"><span class="muted">还没有账号?</span>
<span style="color:var(--indigo)">立即注册</span></div>
</div></div>
</div>
</div>
<div class="screen" id="screen-risk"><div class="site">
<div class="site-nav"><div class="b lg">华夏基金</div>
<div class="links"><span onclick="navTo('screen-home')">首页</span><span onclick="navTo('screen-products')">基金产品</span><span onclick="navTo('screen-account')">用户中心</span><span onclick="navTo('screen-admin')">员工工作台</span></div>
<div class="avatar navlink" onclick="navTo('screen-account')">李</div></div>
<div class="section" style="max-width:720px;margin:0 auto;padding-bottom:0">
<div class="xs faint">投资前必做</div>
<h1 style="font-size:28px;font-weight:600;color:var(--navy)">风险承受能力测评</h1>
<div class="nav-line mt16"><i></i></div>
<div class="xs muted mt8">第 3 / 10 题 · 完成约需 2 分钟</div>
</div>
<div class="section" style="max-width:720px;margin:0 auto;padding-top:20px">
<div class="card"><div class="card-body">
<div class="b">您的投资期限通常是?</div>
<div class="xs muted mt8">单选,请选择最符合您实际情况的一项</div>
<div class="mt16">
<label class="row" style="padding:10px;border:1px solid var(--border);border-radius:8px;margin-bottom:8px">
<input type="radio" name="q"> <span class="sm">1 年以内</span></label>
<label class="row" style="padding:10px;border:1px solid var(--indigo);border-radius:8px;margin-bottom:8px;background:#f5f7ff">
<input type="radio" name="q" checked> <span class="sm">1 - 3 年</span></label>
<label class="row" style="padding:10px;border:1px solid var(--border);border-radius:8px;margin-bottom:8px">
<input type="radio" name="q"> <span class="sm">3 - 5 年</span></label>
<label class="row" style="padding:10px;border:1px solid var(--border);border-radius:8px">
<input type="radio" name="q"> <span class="sm">5 年以上</span></label>
</div>
<div class="between mt16"><button class="btn">上一题</button>
<button class="btn btn-primary">下一题</button></div>
</div></div>
<div class="note mt16">测评结果仅用于评估您的风险承受能力,不构成投资建议。</div>
</div>
</div></div>
<div class="screen" id="screen-account"><div class="site">
<div class="site-nav"><div class="b lg">华夏基金</div>
<div class="links"><span onclick="navTo('screen-home')">首页</span><span onclick="navTo('screen-products')">基金产品</span><span onclick="navTo('screen-account')">用户中心</span><span onclick="navTo('screen-admin')">员工工作台</span></div>
<div class="avatar navlink" onclick="navTo('screen-account')">李</div></div>
<div class="section" style="padding-bottom:0">
<div class="xs faint">Personal Account</div>
<h1 style="font-size:34px;font-weight:600;color:var(--navy)">用户中心</h1>
<div class="xs muted mt8">139****0041</div>
</div>
<div class="section" style="padding-top:20px">
<div class="row between" style="margin-bottom:16px">
<span class="navlink xs" onclick="navTo('screen-home')">← 返回首页</span>
<button class="btn btn-sm">刷新账户数据</button></div>
<div class="grid g3">
<div class="card stat" style="background:var(--navy);border-color:var(--navy)">
<div class="label" style="color:#bfdbfe">账户余额</div>
<div class="value" style="color:#fff">¥0.00</div>
<div class="sub" style="color:#93c5fd">该账户暂无余额记录</div></div>
<div class="card stat"><div class="label">持仓总金额</div>
<div class="value">¥6,740.45</div><div class="sub">共 1 只基金</div></div>
<div class="card stat"><div class="label">风险测评</div>
<div class="value" style="font-size:19px">待完成测评</div>
<div class="sub">当前后端仅提供提交接口</div></div>
</div>
<div class="grid g2 mt16">
<div class="card"><div class="card-head"><div>
<div class="card-title">我的持仓</div>
<div class="card-desc">点击任一行查看该基金详情</div></div></div>
<div class="table-wrap"><table>
<thead><tr><th>基金</th><th>持有份额</th><th>市值</th><th>盈亏</th></tr></thead>
<tbody>
<tr class="navlink" onclick="navTo('screen-detail')">
<td><div class="b sm">XX沪港深灵活配置</div>
<div class="xs faint">110011 · R4</div></td>
<td>3,910.0000</td><td>¥6,740.45</td><td class="down">-10.11</td></tr>
</tbody></table></div></div>
<div class="card"><div class="card-head"><div>
<div class="card-title">快捷操作</div></div></div>
<div class="card-body">
<div class="row wrap">
<button class="btn btn-primary">申购基金</button><button class="btn">赎回基金</button></div>
<div class="mt16 b sm">交易记录</div>
<div class="xs muted mt8">当前后端暂未提供交易记录查询接口,页面不会展示虚构数据。</div>
<div class="mt16 b sm">消息通知</div>
<div class="xs muted mt8">当前后端暂未提供用户消息查询接口。</div>
</div></div>
</div>
</div>
</div></div>
<!-- ============ 后台各分区模板 ============ -->
<template id="tpl-overview">
<div class="grid g4">
<div class="card stat"><div class="label">名下客户</div><div class="value">48</div>
<div class="sub">本月新增 3</div></div>
<div class="card stat"><div class="label">管理资产</div><div class="value">¥ 6,842 万</div>
<div class="sub">较上月 +4.2%</div></div>
<div class="card stat"><div class="label">客户流失率</div><div class="value">2.1%</div>
<div class="sub">低于团队均值</div></div>
<div class="card stat"><div class="label">待办事项</div><div class="value">7</div>
<div class="sub">2 项已逾期</div></div>
</div>
<div class="grid g2 mt16">
<div class="card"><div class="card-head"><div>
<div class="card-title">客户风险分层</div><div class="card-desc">按风险等级分布</div></div></div>
<div class="card-body">
<div class="bar-row"><span style="width:34px">C1</span>
<span class="bar-track"><span class="bar-fill" style="width:12%;background:#16a34a"></span></span>
<span class="muted" style="width:34px">6</span></div>
<div class="bar-row"><span style="width:34px">C2</span>
<span class="bar-track"><span class="bar-fill" style="width:28%;background:#65a30d"></span></span>
<span class="muted" style="width:34px">13</span></div>
<div class="bar-row"><span style="width:34px">C3</span>
<span class="bar-track"><span class="bar-fill" style="width:42%;background:#d97706"></span></span>
<span class="muted" style="width:34px">20</span></div>
<div class="bar-row"><span style="width:34px">C4</span>
<span class="bar-track"><span class="bar-fill" style="width:14%;background:#dc2626"></span></span>
<span class="muted" style="width:34px">7</span></div>
<div class="bar-row"><span style="width:34px">C5</span>
<span class="bar-track"><span class="bar-fill" style="width:4%;background:#991b1b"></span></span>
<span class="muted" style="width:34px">2</span></div>
</div></div>
<div class="card"><div class="card-head"><div>
<div class="card-title">待办提醒</div><div class="card-desc">按截止时间排序</div></div>
<button class="btn btn-sm btn-ghost" onclick="go('todos')">全部</button></div>
<div class="card-body">
<div class="between" style="padding:10px 0;border-bottom:1px solid var(--border-soft)">
<div><div class="sm b">回访提醒</div>
<div class="xs muted">客户 #10231 王伟明 · 截止 09-15</div></div>
<span class="badge b-red">高</span></div>
<div class="between" style="padding:10px 0;border-bottom:1px solid var(--border-soft)">
<div><div class="sm b">报告待发送</div>
<div class="xs muted">客户 #10245 陈晓琳 · 截止 09-18</div></div>
<span class="badge b-amber">中</span></div>
<div class="between" style="padding:10px 0">
<div><div class="sm b">签约跟进</div>
<div class="xs muted">客户 #10288 刘洋 · 截止 09-22</div></div>
<span class="badge b-slate">低</span></div>
</div></div>
</div>
</template>
<template id="tpl-todos">
<div class="card"><div class="card-head"><div>
<div class="card-title">我的待办</div><div class="card-desc">投顾待办事项的处理与跟踪</div></div>
<div class="row"><select class="select" style="width:130px"><option>全部状态</option></select></div></div>
<div class="table-wrap"><table>
<thead><tr><th>待办类型</th><th>关联客户</th><th>优先级</th><th>状态</th>
<th>截止时间</th><th></th></tr></thead>
<tbody>
<tr><td class="b">回访提醒</td><td>#10231 王伟明</td>
<td><span class="badge b-red">高</span></td><td><span class="badge b-slate">待处理</span></td>
<td>2026-09-15</td><td><button class="btn btn-sm">处理</button></td></tr>
<tr><td class="b">报告待发送</td><td>#10245 陈晓琳</td>
<td><span class="badge b-amber">中</span></td><td><span class="badge b-slate">待处理</span></td>
<td>2026-09-18</td><td><button class="btn btn-sm">处理</button></td></tr>
<tr><td class="b">签约跟进</td><td>#10288 刘洋</td>
<td><span class="badge b-slate">低</span></td><td><span class="badge b-green">已完成</span></td>
<td>2026-09-22</td><td><button class="btn btn-sm" disabled>处理</button></td></tr>
</tbody></table></div></div>
</template>
<template id="tpl-customers">
<div class="card"><div class="card-head"><div>
<div class="card-title">客户管理</div><div class="card-desc">名下客户、持仓、诊断与签约状态</div></div>
<div class="row"><input class="input" style="width:200px" placeholder="搜索姓名或编号">
<select class="select" style="width:120px"><option>全部等级</option></select></div></div>
<div class="table-wrap"><table>
<thead><tr><th>客户</th><th>客户等级</th><th>风险等级</th><th>总资产</th>
<th>关系状态</th><th></th></tr></thead>
<tbody>
<tr><td class="b">#10231 王伟明</td><td><span class="badge b-blue">A</span></td>
<td><span class="badge b-amber">C3 稳健型</span></td><td>¥ 1,284,600</td>
<td><span class="badge b-green">已签约</span></td>
<td><button class="btn btn-sm" onclick="openModal()">查看</button></td></tr>
<tr><td class="b">#10245 陈晓琳</td><td><span class="badge b-blue">A</span></td>
<td><span class="badge b-red">C4 进取型</span></td><td>¥ 862,300</td>
<td><span class="badge b-green">已签约</span></td>
<td><button class="btn btn-sm" onclick="openModal()">查看</button></td></tr>
<tr><td class="b">#10288 刘洋</td><td><span class="badge b-slate">B</span></td>
<td><span class="badge b-green">C2 保守型</span></td><td>¥ 318,900</td>
<td><span class="badge b-amber">待签约</span></td>
<td><button class="btn btn-sm" onclick="openModal()">查看</button></td></tr>
</tbody></table></div>
<div class="between" style="padding:12px 18px">
<span class="xs muted">共 48 条</span>
<div class="row"><button class="btn btn-sm">上一页</button>
<span class="xs muted">1 / 4</span><button class="btn btn-sm">下一页</button></div></div>
</div>
</template>
<template id="tpl-drafts">
<div class="card"><div class="card-head"><div>
<div class="card-title">草稿列表</div><div class="card-desc">建议草稿的编辑、发送与废弃</div></div>
<select class="select" style="width:130px"><option>全部状态</option></select></div>
<div class="card-body">
<div class="card" style="background:#f8fafc">
<div class="card-body" style="padding:14px 16px">
<div class="between"><div><div class="b">资产配置建议 · 王伟明</div>
<div class="xs muted mt8">建议将权益仓位由 62% 下调至 50%…</div></div>
<span class="badge b-amber">待发送</span></div>
<div class="row mt12"><span class="badge b-indigo">rebalance</span>
<span class="xs faint">更新于 09-14 18:22</span><span style="flex:1"></span>
<button class="btn btn-sm">编辑</button><button class="btn btn-sm btn-primary">发送</button>
<button class="btn btn-sm btn-danger">废弃</button></div>
</div></div>
<div class="card mt12" style="background:#f8fafc">
<div class="card-body" style="padding:14px 16px">
<div class="between"><div><div class="b">季度服务报告 · 陈晓琳</div>
<div class="xs muted mt8">本季度组合收益 4.8%,跑赢基准 1.2 个百分点…</div></div>
<span class="badge b-slate">草稿</span></div>
<div class="row mt12"><span class="badge b-indigo">report</span>
<span class="xs faint">更新于 09-13 11:05</span><span style="flex:1"></span>
<button class="btn btn-sm">编辑</button><button class="btn btn-sm btn-primary">发送</button>
<button class="btn btn-sm btn-danger">废弃</button></div>
</div></div>
</div></div>
</template>
<template id="tpl-visits">
<div class="grid g2">
<div class="card"><div class="card-head"><div>
<div class="card-title">历史回访</div><div class="card-desc">回访留痕与跟进</div></div>
<button class="btn btn-sm btn-primary">新增回访</button></div>
<div class="card-body">
<div style="padding:12px 0;border-bottom:1px solid var(--border-soft)">
<div class="between"><div class="b sm">王伟明 · 电话回访</div>
<span class="xs faint">09-12 15:20</span></div>
<div class="xs muted mt8">沟通市场波动,客户表示可接受短期回撤,暂不调仓。</div></div>
<div style="padding:12px 0;border-bottom:1px solid var(--border-soft)">
<div class="between"><div class="b sm">陈晓琳 · 线下拜访</div>
<span class="xs faint">09-08 10:00</span></div>
<div class="xs muted mt8">介绍新发债券基金,客户有意向配置 20 万。</div></div>
<div style="padding:12px 0">
<div class="between"><div class="b sm">刘洋 · 微信沟通</div>
<span class="xs faint">09-03 19:44</span></div>
<div class="xs muted mt8">解答赎回费率问题,客户已完成风险测评。</div></div>
</div></div>
<div class="card"><div class="card-head"><div>
<div class="card-title">合规话术库</div><div class="card-desc">按场景取用,发送前请核对合规要求</div></div></div>
<div class="card-body">
<div class="chip" style="display:block;margin-bottom:8px;text-align:left">
市场波动安抚 · 用于净值回撤期的主动沟通</div>
<div class="chip" style="display:block;margin-bottom:8px;text-align:left">
客户投诉应对 · 先共情后解释,避免承诺收益</div>
<div class="chip" style="display:block;margin-bottom:8px;text-align:left">
风控拦截说明 · 说明拦截依据与后续处理流程</div>
<div class="chip" style="display:block;text-align:left">
组合偏离告知 · 提示持仓偏离与再平衡建议</div>
<div class="note mt16">话术仅作参考,不得承诺收益或代客交易;涉及具体产品需先核对客户风险等级。</div>
</div></div>
</div>
</template>
<template id="tpl-risk">
<div class="grid g3">
<div class="card stat"><div class="label">当前预警</div><div class="value">18</div></div>
<div class="card stat"><div class="label">本页高风险</div>
<div class="value" style="color:var(--red)">4</div></div>
<div class="card stat"><div class="label">待处置</div><div class="value">11</div></div>
</div>
<div class="card mt16"><div class="card-head"><div>
<div class="card-title">风险预警处置</div><div class="card-desc">待处置预警与人工处置通道</div></div>
<select class="select" style="width:130px"><option>未处理</option></select></div>
<div class="table-wrap"><table>
<thead><tr><th>预警类型</th><th>客户 / 订单</th><th>触发详情</th><th>级别</th>
<th>置信度</th><th>状态</th><th>创建时间</th><th></th></tr></thead>
<tbody>
<tr><td class="b">大额赎回</td><td>#10245 / ORD-8821</td>
<td class="muted">单日赎回占持仓 62%</td><td><span class="badge b-red">高</span></td>
<td>0.92</td><td><span class="badge b-amber">未处理</span></td><td>09-14 09:12</td>
<td class="row"><button class="btn btn-sm">放行</button>
<button class="btn btn-sm btn-danger">拦截</button>
<button class="btn btn-sm btn-danger">冻结</button></td></tr>
<tr><td class="b">异常登录</td><td>#10231 / —</td>
<td class="muted">异地设备 3 次失败</td><td><span class="badge b-amber">中</span></td>
<td>0.74</td><td><span class="badge b-amber">未处理</span></td><td>09-14 08:30</td>
<td class="row"><button class="btn btn-sm">放行</button>
<button class="btn btn-sm btn-danger">拦截</button>
<button class="btn btn-sm btn-danger">冻结</button></td></tr>
<tr><td class="b">持仓集中度</td><td>#10288 / —</td>
<td class="muted">单一产品占比 71%</td><td><span class="badge b-slate">低</span></td>
<td>0.61</td><td><span class="badge b-green">已放行</span></td><td>09-13 16:02</td>
<td><span class="xs faint">已处置</span></td></tr>
</tbody></table></div>
<div class="note" style="margin:14px 18px">放行 = 订单落账并排除预警;拦截 = 订单作废 + 站内信 + 可疑交易上报工单;
冻结 = 订单作废 + 客户冻结 + 冻结复核工单。操作前会二次确认。</div>
</div>
</template>
<template id="tpl-workorders">
<div class="grid g3">
<div class="card stat"><div class="label">工单总数</div><div class="value">26</div></div>
<div class="card stat"><div class="label">本页待认领</div><div class="value">5</div></div>
<div class="card stat"><div class="label">本页待复核</div><div class="value">3</div></div>
</div>
<div class="card mt16"><div class="card-head"><div>
<div class="card-title">工单处理</div><div class="card-desc">认领、提交审核与复核闭环</div></div>
<select class="select" style="width:130px"><option>全部状态</option></select></div>
<div class="table-wrap"><table>
<thead><tr><th>工单号</th><th>类型</th><th>客户</th><th>当前节点</th><th>优先级</th>
<th>状态</th><th>创建时间</th><th></th></tr></thead>
<tbody>
<tr><td class="b">WO-20260914-003</td><td>可疑交易上报</td><td>#10245</td>
<td>待认领</td><td><span class="badge b-red">高</span></td>
<td><span class="badge b-slate">待处理</span></td><td>09-14 09:15</td>
<td><button class="btn btn-sm">认领</button></td></tr>
<tr><td class="b">WO-20260913-011</td><td>冻结复核</td><td>#10231</td>
<td>处理中</td><td><span class="badge b-amber">中</span></td>
<td><span class="badge b-blue">处理中</span></td><td>09-13 17:40</td>
<td><button class="btn btn-sm">提交审核</button></td></tr>
<tr><td class="b">WO-20260912-008</td><td>客户投诉</td><td>#10288</td>
<td>待复核</td><td><span class="badge b-slate">低</span></td>
<td><span class="badge b-indigo">待审核</span></td><td>09-12 14:20</td>
<td class="row"><button class="btn btn-sm">通过</button>
<button class="btn btn-sm btn-danger">驳回</button></td></tr>
</tbody></table></div></div>
</template>
<template id="tpl-funds">
<div class="card"><div class="card-head"><div>
<div class="card-title">基金数据</div><div class="card-desc">白名单产品与净值数据</div></div>
<div class="row"><input class="input" style="width:200px" placeholder="搜索名称或代码"></div></div>
<div class="table-wrap"><table>
<thead><tr><th>基金代码</th><th>基金名称</th><th>类型</th><th>风险等级</th>
<th>单位净值</th><th>净值日期</th><th>基金经理</th><th>状态</th></tr></thead>
<tbody>
<tr><td>000001</td><td class="b">华夏成长混合</td><td>混合型</td>
<td><span class="badge b-amber">R3</span></td><td>2.1840</td>
<td>2026-09-13</td><td>张伟</td><td><span class="badge b-green">在售</span></td></tr>
<tr><td>000311</td><td class="b">华夏复兴股票</td><td>股票型</td>
<td><span class="badge b-red">R4</span></td><td>3.0420</td>
<td>2026-09-13</td><td>李娜</td><td><span class="badge b-green">在售</span></td></tr>
<tr><td>001056</td><td class="b">华夏稳健债券</td><td>债券型</td>
<td><span class="badge b-green">R2</span></td><td>1.3260</td>
<td>2026-09-13</td><td>王强</td><td><span class="badge b-slate">暂停申购</span></td></tr>
</tbody></table></div></div>
</template>
<template id="tpl-nl2sql">
<div class="card"><div class="card-head"><div>
<div class="card-title">智能问数</div>
<div class="card-desc">用自然语言提问,系统自动生成 SQL 并返回结果(受当前账号的数据权限约束)</div></div></div>
<div class="card-body">
<textarea rows="3" placeholder="例如:近一个月成交额排名前十的客户有哪些?"></textarea>
<div class="between mt12 wrap">
<div class="row wrap">
<span class="chip">近一个月成交额排名前十的客户有哪些?</span>
<span class="chip">统计各风险等级客户的数量</span>
<span class="chip">查询本月新增签约客户名单</span></div>
<div class="row"><span class="xs muted">返回上限</span>
<select class="select" style="width:90px"><option>200</option></select>
<button class="btn btn-primary">开始问数</button></div>
</div>
<div class="xs faint mt8">快捷键 Ctrl / ⌘ + Enter 直接提交</div>
</div></div>
<div class="card mt16"><div class="card-head"><div>
<div class="card-title">查询结果</div><div class="card-desc">共 10 行</div></div>
<span class="badge b-blue">耗时 318 ms</span></div>
<div class="card-body">
<div class="table-wrap"><table>
<thead><tr><th>customer_id</th><th>real_name</th><th>total_amount</th></tr></thead>
<tbody>
<tr><td>10245</td><td>陈晓琳</td><td>¥ 862,300</td></tr>
<tr><td>10231</td><td>王伟明</td><td>¥ 684,100</td></tr>
<tr><td>10288</td><td>刘洋</td><td>¥ 318,900</td></tr>
</tbody></table></div>
</div></div>
<div class="card mt16">
<div class="card-head" style="border-bottom:0"><div>
<div class="card-title">▸ 权限与运维面板</div>
<div class="card-desc">只读展示 · 排查问题时展开(角色 / 表权限 / 列权限 / 敏感字段 / 运行指标 / 运维任务)</div>
</div><span class="badge b-slate">默认折叠</span></div>
</div>
</template>
<template id="tpl-admin">
<div class="grid g2">
<div class="card"><div class="card-head"><div>
<div class="card-title">系统管理</div><div class="card-desc">NL2SQL 配置、知识库与数据管理</div></div></div>
<div class="card-body">
<div class="between" style="padding:12px 0;border-bottom:1px solid var(--border-soft)">
<div><div class="b sm">知识库文档</div>
<div class="xs muted">上传、索引与检索公司产品资料</div></div>
<button class="btn btn-sm" onclick="navTo('screen-knowledge')">前往</button></div>
<div class="between" style="padding:12px 0;border-bottom:1px solid var(--border-soft)">
<div><div class="b sm">NL2SQL 配置</div>
<div class="xs muted">运行配置、语义层与权限(只读)</div></div>
<button class="btn btn-sm" onclick="navSection('nl2sql')">前往</button></div>
<div class="between" style="padding:12px 0">
<div><div class="b sm">系统健康检查</div>
<div class="xs muted">/health 与 /health/ready</div></div>
<span class="badge b-green">正常</span></div>
</div></div>
<div class="card"><div class="card-head"><div>
<div class="card-title">权限说明</div><div class="card-desc">当前账号可见范围由服务端控制</div></div></div>
<div class="card-body">
<div class="kv">
<div class="k">账号</div><div>admin / 管理员</div>
<div class="k">工作台</div><div>全部模块</div>
<div class="k">NL2SQL</div><div>配置管理 + 查询</div>
<div class="k">知识库</div><div>读写</div>
<div class="k">客户数据</div><div>按表 / 列 / 敏感字段三级授权</div>
</div>
<div class="note mt16">前端仅做菜单显隐与提示,真正的鉴权在服务端 require_advisor / require_risk_officer。</div>
</div></div>
</div>
</template>
<template id="tpl-denied">
<div class="card"><div class="card-body" style="padding:56px 24px;text-align:center">
<div style="font-size:36px">🔒</div>
<div class="lg b mt12">无权限访问「风险预警」</div>
<div class="sm muted mt8">该模块需要风控权限,当前账号不具备操作权限。</div>
<div class="xs faint mt8">你仍可使用其它有权限的模块。</div>
</div></div>
</template>
<script>
const ADMIN_SECTIONS = [
{id:"overview", zone:"概览", label:"工作台概览", icon:"▦", title:"工作台概览", sub:"按当前角色展示核心经营指标"},
{id:"todos", zone:"投顾作业", label:"我的待办", icon:"✓", title:"我的待办", sub:"投顾待办事项的处理与跟踪"},
{id:"customers", zone:"投顾作业", label:"客户管理", icon:"👥", title:"客户管理", sub:"名下客户、持仓、诊断与签约状态"},
{id:"drafts", zone:"投顾作业", label:"投顾草稿", icon:"✎", title:"投顾草稿", sub:"建议草稿的编辑、发送与废弃"},
{id:"visits", zone:"投顾作业", label:"客户回访", icon:"☎", title:"客户回访", sub:"回访留痕与合规话术参考"},
{id:"risk", zone:"风控处置", label:"风险预警", icon:"⚠", title:"风险预警", sub:"待处置预警与人工处置通道", lock:true},
{id:"workorders",zone:"风控处置", label:"工单处理", icon:"📄", title:"工单处理", sub:"认领、提交审核与复核闭环", lock:true},
{id:"funds", zone:"数据工具", label:"基金数据", icon:"🗄", title:"基金数据", sub:"白名单产品与净值数据"},
{id:"nl2sql", zone:"数据工具", label:"智能问数", icon:"✦", title:"智能问数", sub:"自然语言查数,自动生成 SQL 并返回结果"},
{id:"admin", zone:"系统管理", label:"系统管理", icon:"⚙", title:"系统管理", sub:"NL2SQL 配置、知识库与数据管理", lock:true},
{id:"denied", zone:"状态示例", label:"无权限态", icon:"🚫", title:"风险预警", sub:"无权限时的降级展示"},
];
/** 不显示客户/游客智能助手的页面 */
const NO_CLIENT_AGENT = ["screen-admin", "screen-knowledge"];
const nav = document.getElementById("side-nav");
let zone = "";
ADMIN_SECTIONS.forEach(s=>{
if (s.zone !== zone){ zone = s.zone;
const p = document.createElement("div"); p.className="zone-label"; p.textContent=zone; nav.appendChild(p); }
const b = document.createElement("button");
b.className="nav-item"; b.dataset.id=s.id;
b.innerHTML = `<span class="ico">${s.icon}</span>${s.label}${s.lock?'<span class="lock">无权限</span>':''}`;
b.onclick = ()=>go(s.id);
nav.appendChild(b);
});
/** 切到某个独立页面(官网 / 基金列表 / 登录 / 知识库管理 等) */
function navTo(id){ showScreen(id); window.scrollTo({top:0}); }
/** 切回后台工作台并定位到某个分区 */
function navSection(id){ showScreen("screen-admin"); go(id); window.scrollTo({top:0}); }
function showScreen(id){
document.querySelectorAll(".screen").forEach(s=>s.classList.toggle("active", s.id===id));
/* 客户/游客助手挂在全局 layout,后台不显示(后台用投顾助手悬浮球) */
document.getElementById("client-agent").style.display =
NO_CLIENT_AGENT.includes(id) ? "none" : "block";
closeCA();
}
/* 打开面板 = 先建会话(session/create),拿到会话号后才允许对话 */
function openCA(){
const w = document.getElementById("ca-win");
if (w.style.display !== "none") return;
w.style.display = "flex";
const state = document.getElementById("ca-state");
document.getElementById("ca-connecting").style.display = "block";
document.getElementById("ca-messages").style.display = "none";
state.textContent = "正在建立会话...";
clearTimeout(window.__caTimer);
window.__caTimer = setTimeout(()=>{
state.textContent = "会话 #" + Math.random().toString(16).slice(2,8) + " · 已接入您的账户数据";
document.getElementById("ca-connecting").style.display = "none";
document.getElementById("ca-messages").style.display = "block";
}, 700);
}
/* 关闭面板 = 结束会话(session/end),丢弃服务端上下文 */
function closeCA(){
const w = document.getElementById("ca-win");
if (w.style.display === "none") return;
w.style.display = "none";
clearTimeout(window.__caTimer);
document.getElementById("ca-state").textContent = "会话已结束";
}
function toggleCA(){
const w = document.getElementById("ca-win");
w.style.display === "none" ? openCA() : closeCA();
}
function go(id){
const sec = ADMIN_SECTIONS.find(s=>s.id===id);
showScreen("screen-admin");
document.getElementById("pg-title").textContent = sec.title;
document.getElementById("pg-sub").textContent = sec.sub;
document.querySelectorAll(".nav-item").forEach(n=>n.classList.toggle("active", n.dataset.id===id));
const tpl = document.getElementById("tpl-"+id);
document.getElementById("admin-content").innerHTML = tpl ? tpl.innerHTML : "";
window.scrollTo({top:0});
}
function openModal(){ document.getElementById("cust-modal").style.display="block"; }
function closeModal(){ document.getElementById("cust-modal").style.display="none"; }
document.getElementById("fab").onclick = ()=>{ document.getElementById("drawer-root").style.display="block"; };
function closeDrawer(){ document.getElementById("drawer-root").style.display="none"; }
function endSession(){
document.getElementById("dw-status").textContent = "已关闭,新会话已开启";
}
function switchDw(btn, id){
btn.parentElement.querySelectorAll("button").forEach(b=>b.classList.remove("on"));
btn.classList.add("on");
document.getElementById("dw-chat").style.display = id==="dw-chat"?"block":"none";
document.getElementById("dw-drafts").style.display = id==="dw-drafts"?"block":"none";
}
go("overview");
</script>
</body>
</html>