{"token":"0a26359c-af4b-492e-9845-e06b12ce9989","title":"活动营销案例","dashboard_str":"{\"title\":\"活动营销案例\",\"viewInfos\":[{\"file_name\":\"paid-ad-performance.xlsx\",\"file_url\":\"https://excelup.kyou.ltd/dashboard/paid-ad-performance.xlsx\",\"id\":0,\"hashId\":\"\"}],\"query\":\"原样输出该html,不要有任何修改:\\n\u003c!DOCTYPE html\u003e\\n\u003chtml lang=\\\"zh-CN\\\"\u003e\\n\u003chead\u003e\\n\u003cmeta charset=\\\"UTF-8\\\"\u003e\\n\u003cmeta name=\\\"viewport\\\" content=\\\"width=device-width, initial-scale=1.0\\\"\u003e\\n\u003ctitle\u003e广告投放决策中心\u003c/title\u003e\\n\u003clink rel=\\\"preconnect\\\" href=\\\"https://fonts.googleapis.com\\\"\u003e\\n\u003clink href=\\\"https://fonts.googleapis.com/css2?family=Inter:opsz,wght@14..32,400;14..32,500;14..32,600;14..32,700;14..32,800\u0026display=swap\\\" rel=\\\"stylesheet\\\"\u003e\\n\u003clink rel=\\\"stylesheet\\\" href=\\\"https://cdn.jsdelivr.net/npm/bulma@1.0.4/css/bulma.min.css\\\"\u003e\\n\u003cscript src=\\\"https://cdn.jsdelivr.net/npm/echarts@5.5.0/dist/echarts.min.js\\\"\u003e\u003c/script\u003e\\n\u003cstyle\u003e\\n:root {\\n --bg-body: #050a14;\\n --bg-card: rgba(0, 15, 35, 0.85);\\n --bg-card-alt: rgba(0, 20, 50, 0.7);\\n --border-subtle: rgba(0, 200, 255, 0.12);\\n --border-glow: rgba(0, 200, 255, 0.3);\\n --text-primary: #e0f0ff;\\n --text-secondary: #80b0d0;\\n --text-muted: #406080;\\n --neon-cyan: #00f0ff;\\n --neon-blue: #0088ff;\\n --neon-purple: #7b2ff7;\\n --neon-pink: #ff2d95;\\n --neon-green: #00ff88;\\n --neon-amber: #ffb800;\\n --neon-red: #ff3355;\\n --gradient-header: linear-gradient(135deg, #000814 0%, #001a33 50%, #000814 100%);\\n --gradient-card: linear-gradient(145deg, rgba(0,15,35,0.92) 0%, rgba(0,25,50,0.88) 100%);\\n --shadow-card: 0 4px 24px rgba(0,0,0,0.6), 0 0 0 1px rgba(0,200,255,0.06);\\n --shadow-glow: 0 0 30px rgba(0,200,255,0.08), 0 0 60px rgba(0,200,255,0.04);\\n --radius-sm: 8px;\\n --radius-md: 12px;\\n --radius-lg: 16px;\\n --radius-xl: 20px;\\n}\\n* { box-sizing: border-box; }\\nhtml { background: var(--bg-body); }\\nbody {\\n font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;\\n background: var(--bg-body);\\n background-image:\\n linear-gradient(rgba(0, 200, 255, 0.03) 1px, transparent 1px),\\n linear-gradient(90deg, rgba(0, 200, 255, 0.03) 1px, transparent 1px);\\n background-size: 40px 40px;\\n color: var(--text-primary);\\n min-height: 100vh;\\n -webkit-font-smoothing: antialiased;\\n -moz-osx-font-smoothing: grayscale;\\n}\\n.dashboard-wrap { max-width: 1440px; margin: 0 auto; padding: 0 20px 40px; }\\n\\n/* === Header === */\\n.header {\\n padding: 18px 0 8px;\\n position: sticky;\\n top: 0;\\n z-index: 100;\\n backdrop-filter: blur(20px);\\n -webkit-backdrop-filter: blur(20px);\\n background: linear-gradient(180deg, rgba(0,8,20,0.95) 0%, rgba(0,8,20,0.7) 100%);\\n }\\n.header-inner {\\n display: flex;\\n align-items: center;\\n justify-content: space-between;\\n max-width: 1440px;\\n margin: 0 auto;\\n padding: 0 20px;\\n}\\n.header-brand {\\n display: flex;\\n align-items: center;\\n gap: 12px;\\n position: relative;\\n}\\n.header-title {\\n font-size: 1.25rem;\\n font-weight: 700;\\n letter-spacing: -0.02em;\\n color: var(--text-primary);\\n line-height: 1.2;\\n text-shadow: 0 0 20px rgba(0, 200, 255, 0.15);\\n}\\n.header-title::after {\\n content: '广告决策中心';\\n position: absolute;\\n top: 0;\\n left: 0;\\n color: var(--neon-cyan);\\n opacity: 0.08;\\n clip-path: inset(0 0 50% 0);\\n pointer-events: none;\\n}\\n.header-sub {\\n font-size: 0.7rem;\\n color: var(--neon-cyan);\\n letter-spacing: 0.12em;\\n text-transform: uppercase;\\n font-weight: 500;\\n opacity: 0.7;\\n}\\n.header-meta {\\n display: flex;\\n align-items: center;\\n gap: 16px;\\n}\\n.header-badge {\\n background: rgba(0, 200, 255, 0.05);\\n border: 1px solid rgba(0, 200, 255, 0.15);\\n border-radius: 20px;\\n padding: 5px 14px;\\n font-size: 0.7rem;\\n color: var(--text-secondary);\\n display: flex;\\n align-items: center;\\n gap: 6px;\\n font-weight: 500;\\n}\\n.header-badge .dot {\\n width: 6px;\\n height: 6px;\\n border-radius: 50%;\\n background: var(--neon-green);\\n box-shadow: 0 0 8px var(--neon-green);\\n animation: pulse-dot 2s ease-in-out infinite;\\n}\\n@keyframes pulse-dot {\\n 0%, 100% { opacity: 1; box-shadow: 0 0 8px var(--neon-green); }\\n 50% { opacity: 0.4; box-shadow: 0 0 2px var(--neon-green); }\\n}\\n\\n/* === Filter Bar === */\\n.filter-bar {\\n background: rgba(0, 15, 35, 0.8);\\n border: 1px solid rgba(0, 200, 255, 0.1);\\n border-radius: var(--radius-md);\\n padding: 12px 20px;\\n margin: 8px 0 20px;\\n backdrop-filter: blur(10px);\\n display: flex;\\n align-items: center;\\n flex-wrap: wrap;\\n gap: 12px;\\n box-shadow: 0 0 20px rgba(0, 200, 255, 0.03);\\n}\\n.filter-label {\\n font-size: 0.7rem;\\n font-weight: 600;\\n text-transform: uppercase;\\n letter-spacing: 0.06em;\\n color: var(--neon-cyan);\\n display: flex;\\n align-items: center;\\n gap: 6px;\\n opacity: 0.8;\\n}\\n.filter-select {\\n background: rgba(0, 50, 80, 0.2) !important;\\n border: 1px solid rgba(0, 200, 255, 0.15) !important;\\n color: var(--text-primary) !important;\\n border-radius: 8px !important;\\n font-size: 0.78rem !important;\\n font-family: 'Inter', sans-serif !important;\\n padding: 0 28px 0 12px !important;\\n height: 34px !important;\\n min-width: 130px;\\n cursor: pointer;\\n transition: all 0.2s;\\n -webkit-appearance: none;\\n -moz-appearance: none;\\n appearance: none;\\n background-image: url(\\\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' fill='none'%3E%3Cpath d='M1 1l4 4 4-4' stroke='%2300f0ff' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E\\\") !important;\\n background-repeat: no-repeat !important;\\n background-position: right 10px center !important;\\n background-size: 10px 6px !important;\\n}\\n.filter-select:hover, .filter-select:focus { border-color: rgba(0, 240, 255, 0.5) !important; box-shadow: 0 0 12px rgba(0, 240, 255, 0.1) !important; }\\n.filter-select option { background: #00122a; color: #e0f0ff; }\\n.btn-reset {\\n background: rgba(0, 200, 255, 0.05);\\n border: 1px solid rgba(0, 200, 255, 0.12);\\n border-radius: 8px;\\n color: var(--text-secondary);\\n padding: 6px 16px;\\n font-size: 0.75rem;\\n font-family: 'Inter', sans-serif;\\n font-weight: 500;\\n cursor: pointer;\\n transition: all 0.2s;\\n display: flex;\\n align-items: center;\\n gap: 4px;\\n}\\n.btn-reset:hover { background: rgba(0, 200, 255, 0.1); color: var(--neon-cyan); box-shadow: 0 0 10px rgba(0, 200, 255, 0.1); }\\n\\n/* === KPI Cards === */\\n.kpi-grid {\\n display: grid;\\n grid-template-columns: repeat(8, 1fr);\\n gap: 12px;\\n margin-bottom: 20px;\\n}\\n@media (max-width: 1200px) { .kpi-grid { grid-template-columns: repeat(4, 1fr); } }\\n@media (max-width: 640px) { .kpi-grid { grid-template-columns: repeat(2, 1fr); } }\\n\\n.kpi-card {\\n background: var(--gradient-card);\\n border: 1px solid rgba(0, 200, 255, 0.08);\\n border-radius: var(--radius-md);\\n padding: 16px 14px;\\n box-shadow: var(--shadow-card);\\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\\n position: relative;\\n overflow: hidden;\\n cursor: default;\\n}\\n.kpi-card:hover {\\n transform: translateY(-2px);\\n border-color: rgba(0, 200, 255, 0.2);\\n box-shadow: var(--shadow-card), 0 0 30px rgba(0, 200, 255, 0.06);\\n}\\n.kpi-card::after {\\n content: '';\\n position: absolute;\\n top: 0;\\n left: 0;\\n right: 0;\\n height: 1px;\\n background: linear-gradient(90deg, transparent, rgba(0,200,255,0.3), transparent);\\n opacity: 0;\\n transition: opacity 0.4s;\\n}\\n.kpi-card:hover::after { opacity: 1; }\\n.kpi-icon {\\n width: 28px;\\n height: 28px;\\n border-radius: 8px;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n font-size: 14px;\\n margin-bottom: 8px;\\n border: 1px solid rgba(0, 200, 255, 0.1);\\n}\\n.kpi-label {\\n font-size: 0.65rem;\\n font-weight: 500;\\n text-transform: uppercase;\\n letter-spacing: 0.05em;\\n color: var(--text-muted);\\n margin-bottom: 2px;\\n}\\n.kpi-value {\\n font-size: 1.5rem;\\n font-weight: 700;\\n letter-spacing: -0.02em;\\n color: var(--text-primary);\\n line-height: 1.1;\\n margin-bottom: 2px;\\n text-shadow: 0 0 20px currentColor;\\n}\\n.kpi-sub {\\n font-size: 0.65rem;\\n color: var(--text-muted);\\n font-weight: 400;\\n}\\n.kpi-trend {\\n display: inline-flex;\\n align-items: center;\\n gap: 3px;\\n font-size: 0.6rem;\\n font-weight: 600;\\n padding: 1px 6px;\\n border-radius: 4px;\\n margin-left: 4px;\\n}\\n.kpi-trend.up { color: var(--neon-green); background: rgba(0, 255, 136, 0.1); }\\n.kpi-trend.down { color: var(--neon-red); background: rgba(255, 51, 85, 0.1); }\\n\\n/* === Cards === */\\n.dashboard-card {\\n background: var(--gradient-card);\\n border: 1px solid rgba(0, 200, 255, 0.08);\\n border-radius: var(--radius-lg);\\n box-shadow: var(--shadow-card);\\n overflow: hidden;\\n transition: all 0.3s;\\n}\\n.dashboard-card:hover { border-color: rgba(0, 200, 255, 0.15); box-shadow: var(--shadow-card), 0 0 25px rgba(0, 200, 255, 0.04); }\\n.card-header-custom {\\n padding: 14px 20px 8px;\\n display: flex;\\n align-items: center;\\n justify-content: space-between;\\n border-bottom: 1px solid rgba(0, 200, 255, 0.06);\\n}\\n.card-title {\\n font-size: 0.8rem;\\n font-weight: 600;\\n color: var(--text-primary);\\n letter-spacing: -0.01em;\\n display: flex;\\n align-items: center;\\n gap: 8px;\\n text-shadow: 0 0 15px rgba(0, 200, 255, 0.1);\\n}\\n.card-title .emoji-icon { font-size: 0.9rem; }\\n.card-badge {\\n font-size: 0.6rem;\\n padding: 2px 10px;\\n border-radius: 12px;\\n background: rgba(0, 200, 255, 0.06);\\n color: var(--neon-cyan);\\n border: 1px solid rgba(0, 200, 255, 0.1);\\n font-weight: 500;\\n}\\n.card-body {\\n padding: 8px 16px 12px;\\n}\\n.chart-box { width: 100%; height: 330px; }\\n.chart-box-lg { width: 100%; height: 380px; }\\n@media (max-width: 768px) { .chart-box { height: 260px; } .chart-box-lg { height: 300px; } }\\n\\n/* === Table === */\\n.table-wrap {\\n max-height: 340px;\\n overflow-y: auto;\\n scrollbar-width: thin;\\n scrollbar-color: rgba(0, 200, 255, 0.1) transparent;\\n}\\n.table-wrap::-webkit-scrollbar { width: 4px; }\\n.table-wrap::-webkit-scrollbar-track { background: transparent; }\\n.table-wrap::-webkit-scrollbar-thumb { background: rgba(0, 200, 255, 0.15); border-radius: 4px; }\\n\\n.data-table {\\n width: 100%;\\n border-collapse: separate;\\n border-spacing: 0;\\n font-size: 0.75rem;\\n}\\n.data-table thead { position: sticky; top: 0; z-index: 2; }\\n.data-table th {\\n background: rgba(0, 8, 20, 0.95);\\n color: var(--neon-cyan);\\n font-weight: 600;\\n font-size: 0.65rem;\\n text-transform: uppercase;\\n letter-spacing: 0.05em;\\n padding: 10px 12px;\\n text-align: right;\\n border-bottom: 1px solid rgba(0, 200, 255, 0.08);\\n}\\n.data-table th:first-child { text-align: left; padding-left: 8px; }\\n.data-table th:nth-child(2) { text-align: left; }\\n.data-table td {\\n padding: 9px 12px;\\n text-align: right;\\n color: var(--text-secondary);\\n border-bottom: 1px solid rgba(0, 200, 255, 0.03);\\n font-weight: 400;\\n}\\n.data-table td:first-child { text-align: left; padding-left: 8px; font-weight: 600; color: var(--text-primary); }\\n.data-table td:nth-child(2) { text-align: left; }\\n.data-table tr:hover td { background: rgba(0, 200, 255, 0.03); }\\n.data-table tr:last-child td { border-bottom: none; }\\n\\n/* === Tags === */\\n.tag-custom {\\n display: inline-flex;\\n align-items: center;\\n padding: 2px 10px;\\n border-radius: 6px;\\n font-size: 0.65rem;\\n font-weight: 600;\\n letter-spacing: 0.01em;\\n border: 1px solid rgba(0, 200, 255, 0.08);\\n}\\n.tag-roas { background: rgba(0, 136, 255, 0.1); color: var(--neon-cyan); border-color: rgba(0, 200, 255, 0.15); }\\n.tag-cpc { background: rgba(255, 51, 85, 0.1); color: var(--neon-red); border-color: rgba(255, 51, 85, 0.15); }\\n.tag-ctr { background: rgba(0, 240, 255, 0.08); color: var(--neon-cyan); border-color: rgba(0, 240, 255, 0.12); }\\n.tag-platform { background: rgba(0, 200, 255, 0.05); color: var(--text-primary); padding: 2px 10px; border-radius: 6px; font-size: 0.7rem; font-weight: 600; border: 1px solid rgba(0, 200, 255, 0.08); }\\n.tag-campaign { background: rgba(123, 47, 247, 0.1); color: #b080ff; border-color: rgba(123, 47, 247, 0.15); }\\n\\n/* === Grid Layout === */\\n.dash-grid-2 { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; margin-bottom: 16px; }\\n.dash-grid-3 { display: grid; grid-template-columns: 2fr 1fr; gap: 16px; margin-bottom: 16px; }\\n.dash-grid-full { margin-bottom: 16px; }\\n@media (max-width: 960px) { .dash-grid-2, .dash-grid-3 { grid-template-columns: 1fr; } }\\n\\n/* === Animations === */\\n@keyframes fadeInUp {\\n from { opacity: 0; transform: translateY(12px); }\\n to { opacity: 1; transform: translateY(0); }\\n}\\n@keyframes scanline {\\n 0% { transform: translateY(-100%); }\\n 100% { transform: translateY(100vh); }\\n}\\n.anim-fade { animation: fadeInUp 0.5s ease-out both; }\\n.anim-fade-1 { animation-delay: 0.05s; }\\n.anim-fade-2 { animation-delay: 0.1s; }\\n.anim-fade-3 { animation-delay: 0.15s; }\\n.anim-fade-4 { animation-delay: 0.2s; }\\n.anim-fade-5 { animation-delay: 0.25s; }\\n.anim-fade-6 { animation-delay: 0.3s; }\\n.anim-fade-7 { animation-delay: 0.35s; }\\n.anim-fade-8 { animation-delay: 0.4s; }\\n\\n/* === Scrollbar === */\\n::-webkit-scrollbar { width: 6px; height: 6px; }\\n::-webkit-scrollbar-track { background: transparent; }\\n::-webkit-scrollbar-thumb { background: rgba(0, 200, 255, 0.1); border-radius: 4px; }\\n::-webkit-scrollbar-thumb:hover { background: rgba(0, 200, 255, 0.2); }\\n\\n/* === Responsive === */\\n@media (max-width: 640px) {\\n .dashboard-wrap { padding: 0 12px 24px; }\\n .header-inner { flex-direction: column; align-items: flex-start; gap: 8px; }\\n .header-meta { width: 100%; justify-content: flex-start; }\\n .kpi-value { font-size: 1.2rem; }\\n .filter-bar { flex-direction: column; align-items: stretch; }\\n}\\n\u003c/style\u003e\\n\u003c/head\u003e\\n\u003cbody\u003e\\n\\n\u003c!-- ============ HEADER ============ --\u003e\\n\u003cheader class=\\\"header\\\"\u003e\\n \u003cdiv class=\\\"header-inner\\\"\u003e\\n \u003cdiv class=\\\"header-brand\\\"\u003e\\n \u003cdiv\u003e\\n \u003cdiv class=\\\"header-title\\\"\u003e广告决策中心\u003c/div\u003e\\n \u003cdiv class=\\\"header-sub\\\"\u003e// PAID AD PERFORMANCE · NEXUS v2.4\u003c/div\u003e\\n \u003c/div\u003e\\n \u003c/div\u003e\\n \u003cdiv class=\\\"header-meta\\\"\u003e\\n \u003cdiv class=\\\"header-badge\\\"\u003e\\n \u003cspan class=\\\"dot\\\"\u003e\u003c/span\u003e\\n SYSTEM ONLINE\\n \u003c/div\u003e\\n \u003cdiv class=\\\"header-badge\\\"\u003e\\n ⚡ 2024.01.01 — 01.12\\n \u003c/div\u003e\\n \u003c/div\u003e\\n \u003c/div\u003e\\n\u003c/header\u003e\\n\\n\u003cdiv class=\\\"dashboard-wrap\\\"\u003e\\n\\n \u003c!-- ============ FILTER BAR ============ --\u003e\\n \u003cdiv class=\\\"filter-bar anim-fade anim-fade-1\\\"\u003e\\n \u003cspan class=\\\"filter-label\\\"\u003e◈ 筛选维度\u003c/span\u003e\\n \u003cselect class=\\\"filter-select\\\" id=\\\"filterPlatform\\\"\u003e\\n \u003coption value=\\\"all\\\"\u003e全部平台\u003c/option\u003e\\n \u003coption value=\\\"Meta Ads\\\"\u003eMeta Ads\u003c/option\u003e\\n \u003coption value=\\\"Google Ads\\\"\u003eGoogle Ads\u003c/option\u003e\\n \u003coption value=\\\"YouTube Ads\\\"\u003eYouTube Ads\u003c/option\u003e\\n \u003coption value=\\\"TikTok Ads\\\"\u003eTikTok Ads\u003c/option\u003e\\n \u003c/select\u003e\\n \u003cselect class=\\\"filter-select\\\" id=\\\"filterCampaign\\\"\u003e\\n \u003coption value=\\\"all\\\"\u003e全部广告类型\u003c/option\u003e\\n \u003coption value=\\\"Prospecting\\\"\u003eProspecting\u003c/option\u003e\\n \u003coption value=\\\"Retargeting\\\"\u003eRetargeting\u003c/option\u003e\\n \u003coption value=\\\"Search\\\"\u003eSearch\u003c/option\u003e\\n \u003coption value=\\\"Shopping\\\"\u003eShopping\u003c/option\u003e\\n \u003coption value=\\\"Video\\\"\u003eVideo\u003c/option\u003e\\n \u003c/select\u003e\\n \u003cbutton class=\\\"btn-reset\\\" id=\\\"resetFilters\\\"\u003e↺ 重置\u003c/button\u003e\\n \u003c/div\u003e\\n\\n \u003c!-- ============ KPI ROW ============ --\u003e\\n \u003cdiv class=\\\"kpi-grid\\\"\u003e\\n \u003cdiv class=\\\"kpi-card anim-fade anim-fade-1\\\"\u003e\\n \u003cdiv class=\\\"kpi-icon\\\"\u003e💰\u003c/div\u003e\\n \u003cdiv class=\\\"kpi-label\\\"\u003e广告总支出\u003c/div\u003e\\n \u003cdiv class=\\\"kpi-value\\\" id=\\\"kpiSpend\\\" style=\\\"color:#00f0ff;\\\"\u003e—\u003c/div\u003e\\n \u003cdiv class=\\\"kpi-sub\\\"\u003e投放成本 · 整体\u003c/div\u003e\\n \u003c/div\u003e\\n \u003cdiv class=\\\"kpi-card anim-fade anim-fade-2\\\"\u003e\\n \u003cdiv class=\\\"kpi-icon\\\"\u003e📈\u003c/div\u003e\\n \u003cdiv class=\\\"kpi-label\\\"\u003e销售收入\u003c/div\u003e\\n \u003cdiv class=\\\"kpi-value\\\" id=\\\"kpiRevenue\\\" style=\\\"color:#00f0ff;\\\"\u003e—\u003c/div\u003e\\n \u003cdiv class=\\\"kpi-sub\\\"\u003e广告驱动收入\u003c/div\u003e\\n \u003c/div\u003e\\n \u003cdiv class=\\\"kpi-card anim-fade anim-fade-3\\\"\u003e\\n \u003cdiv class=\\\"kpi-icon\\\"\u003e⚡\u003c/div\u003e\\n \u003cdiv class=\\\"kpi-label\\\"\u003eROAS 回报率\u003c/div\u003e\\n \u003cdiv class=\\\"kpi-value\\\" id=\\\"kpiRoas\\\" style=\\\"color:#00f0ff;\\\"\u003e—\u003c/div\u003e\\n \u003cdiv class=\\\"kpi-sub\\\"\u003e每¥1投入回报\u003c/div\u003e\\n \u003c/div\u003e\\n \u003cdiv class=\\\"kpi-card anim-fade anim-fade-4\\\"\u003e\\n \u003cdiv class=\\\"kpi-icon\\\"\u003e🛒\u003c/div\u003e\\n \u003cdiv class=\\\"kpi-label\\\"\u003e总购买数\u003c/div\u003e\\n \u003cdiv class=\\\"kpi-value\\\" id=\\\"kpiPurchases\\\" style=\\\"color:#00f0ff;\\\"\u003e—\u003c/div\u003e\\n \u003cdiv class=\\\"kpi-sub\\\"\u003e转化订单\u003c/div\u003e\\n \u003c/div\u003e\\n \u003cdiv class=\\\"kpi-card anim-fade anim-fade-5\\\"\u003e\\n \u003cdiv class=\\\"kpi-icon\\\"\u003e👆\u003c/div\u003e\\n \u003cdiv class=\\\"kpi-label\\\"\u003e总点击量\u003c/div\u003e\\n \u003cdiv class=\\\"kpi-value\\\" id=\\\"kpiClicks\\\" style=\\\"color:#00f0ff;\\\"\u003e—\u003c/div\u003e\\n \u003cdiv class=\\\"kpi-sub\\\"\u003e广告点击\u003c/div\u003e\\n \u003c/div\u003e\\n \u003cdiv class=\\\"kpi-card anim-fade anim-fade-6\\\"\u003e\\n \u003cdiv class=\\\"kpi-icon\\\"\u003e👁️\u003c/div\u003e\\n \u003cdiv class=\\\"kpi-label\\\"\u003e总展示量\u003c/div\u003e\\n \u003cdiv class=\\\"kpi-value\\\" id=\\\"kpiImpressions\\\" style=\\\"color:#00f0ff;\\\"\u003e—\u003c/div\u003e\\n \u003cdiv class=\\\"kpi-sub\\\"\u003e曝光次数\u003c/div\u003e\\n \u003c/div\u003e\\n \u003cdiv class=\\\"kpi-card anim-fade anim-fade-7\\\"\u003e\\n \u003cdiv class=\\\"kpi-icon\\\"\u003e🎯\u003c/div\u003e\\n \u003cdiv class=\\\"kpi-label\\\"\u003e平均 CPC\u003c/div\u003e\\n \u003cdiv class=\\\"kpi-value\\\" id=\\\"kpiCpc\\\" style=\\\"color:#00f0ff;\\\"\u003e—\u003c/div\u003e\\n \u003cdiv class=\\\"kpi-sub\\\"\u003e每次点击成本\u003c/div\u003e\\n \u003c/div\u003e\\n \u003cdiv class=\\\"kpi-card anim-fade anim-fade-8\\\"\u003e\\n \u003cdiv class=\\\"kpi-icon\\\"\u003e📊\u003c/div\u003e\\n \u003cdiv class=\\\"kpi-label\\\"\u003e平均 CTR\u003c/div\u003e\\n \u003cdiv class=\\\"kpi-value\\\" id=\\\"kpiCtr\\\" style=\\\"color:#00f0ff;\\\"\u003e—\u003c/div\u003e\\n \u003cdiv class=\\\"kpi-sub\\\"\u003e点击率\u003c/div\u003e\\n \u003c/div\u003e\\n \u003c/div\u003e\\n\\n \u003c!-- ============ ROW 1: Daily Trend + Platform ROAS ============ --\u003e\\n \u003cdiv class=\\\"dash-grid-3\\\"\u003e\\n \u003cdiv class=\\\"dashboard-card\\\"\u003e\\n \u003cdiv class=\\\"card-header-custom\\\"\u003e\\n \u003cspan class=\\\"card-title\\\"\u003e\u003cspan class=\\\"emoji-icon\\\"\u003e📈\u003c/span\u003e 每日趋势 · 支出 vs 收入\u003c/span\u003e\\n \u003cspan class=\\\"card-badge\\\"\u003e12d 数据流\u003c/span\u003e\\n \u003c/div\u003e\\n \u003cdiv class=\\\"card-body\\\"\u003e\\n \u003cdiv class=\\\"chart-box-lg\\\" id=\\\"chartDailyTrend\\\"\u003e\u003c/div\u003e\\n \u003c/div\u003e\\n \u003c/div\u003e\\n \u003cdiv class=\\\"dashboard-card\\\"\u003e\\n \u003cdiv class=\\\"card-header-custom\\\"\u003e\\n \u003cspan class=\\\"card-title\\\"\u003e\u003cspan class=\\\"emoji-icon\\\"\u003e🏆\u003c/span\u003e 平台 ROAS 排名\u003c/span\u003e\\n \u003cspan class=\\\"card-badge\\\"\u003e回报率分析\u003c/span\u003e\\n \u003c/div\u003e\\n \u003cdiv class=\\\"card-body\\\"\u003e\\n \u003cdiv class=\\\"chart-box\\\" id=\\\"chartPlatformRoas\\\"\u003e\u003c/div\u003e\\n \u003c/div\u003e\\n \u003c/div\u003e\\n \u003c/div\u003e\\n\\n \u003c!-- ============ ROW 2: Platform Compare + Campaign Compare ============ --\u003e\\n \u003cdiv class=\\\"dash-grid-2\\\"\u003e\\n \u003cdiv class=\\\"dashboard-card\\\"\u003e\\n \u003cdiv class=\\\"card-header-custom\\\"\u003e\\n \u003cspan class=\\\"card-title\\\"\u003e\u003cspan class=\\\"emoji-icon\\\"\u003e🏢\u003c/span\u003e 平台对比 · 支出与收入\u003c/span\u003e\\n \u003cspan class=\\\"card-badge\\\"\u003e4 节点\u003c/span\u003e\\n \u003c/div\u003e\\n \u003cdiv class=\\\"card-body\\\"\u003e\\n \u003cdiv class=\\\"chart-box\\\" id=\\\"chartPlatformCompare\\\"\u003e\u003c/div\u003e\\n \u003c/div\u003e\\n \u003c/div\u003e\\n \u003cdiv class=\\\"dashboard-card\\\"\u003e\\n \u003cdiv class=\\\"card-header-custom\\\"\u003e\\n \u003cspan class=\\\"card-title\\\"\u003e\u003cspan class=\\\"emoji-icon\\\"\u003e📋\u003c/span\u003e 广告类型效果对比\u003c/span\u003e\\n \u003cspan class=\\\"card-badge\\\"\u003e5 类型\u003c/span\u003e\\n \u003c/div\u003e\\n \u003cdiv class=\\\"card-body\\\"\u003e\\n \u003cdiv class=\\\"chart-box\\\" id=\\\"chartCampaignCompare\\\"\u003e\u003c/div\u003e\\n \u003c/div\u003e\\n \u003c/div\u003e\\n \u003c/div\u003e\\n\\n \u003c!-- ============ ROW 3: Daily Platform Stack ============ --\u003e\\n \u003cdiv class=\\\"dash-grid-full\\\"\u003e\\n \u003cdiv class=\\\"dashboard-card\\\"\u003e\\n \u003cdiv class=\\\"card-header-custom\\\"\u003e\\n \u003cspan class=\\\"card-title\\\"\u003e\u003cspan class=\\\"emoji-icon\\\"\u003e📊\u003c/span\u003e 每日平台预算分配\u003c/span\u003e\\n \u003cspan class=\\\"card-badge\\\"\u003e堆叠矩阵\u003c/span\u003e\\n \u003c/div\u003e\\n \u003cdiv class=\\\"card-body\\\"\u003e\\n \u003cdiv class=\\\"chart-box-lg\\\" id=\\\"chartDailyPlatform\\\"\u003e\u003c/div\u003e\\n \u003c/div\u003e\\n \u003c/div\u003e\\n \u003c/div\u003e\\n\\n \u003c!-- ============ ROW 4: Detail Table ============ --\u003e\\n \u003cdiv class=\\\"dash-grid-full\\\"\u003e\\n \u003cdiv class=\\\"dashboard-card\\\"\u003e\\n \u003cdiv class=\\\"card-header-custom\\\"\u003e\\n \u003cspan class=\\\"card-title\\\"\u003e\u003cspan class=\\\"emoji-icon\\\"\u003e📑\u003c/span\u003e 平台 × 广告类型 明细\u003c/span\u003e\\n \u003cspan class=\\\"card-badge\\\"\u003e6 记录\u003c/span\u003e\\n \u003c/div\u003e\\n \u003cdiv class=\\\"card-body\\\"\u003e\\n \u003cdiv class=\\\"table-wrap\\\"\u003e\\n \u003ctable class=\\\"data-table\\\"\u003e\\n \u003cthead\u003e\\n \u003ctr\u003e\\n \u003cth\u003e平台\u003c/th\u003e\\n \u003cth\u003e广告类型\u003c/th\u003e\\n \u003cth\u003e广告支出\u003c/th\u003e\\n \u003cth\u003e销售收入\u003c/th\u003e\\n \u003cth\u003e购买数\u003c/th\u003e\\n \u003cth\u003e点击量\u003c/th\u003e\\n \u003cth\u003e展示量\u003c/th\u003e\\n \u003cth\u003eROAS\u003c/th\u003e\\n \u003cth\u003eCPC\u003c/th\u003e\\n \u003cth\u003eCTR\u003c/th\u003e\\n \u003c/tr\u003e\\n \u003c/thead\u003e\\n \u003ctbody id=\\\"detailTableBody\\\"\u003e\u003c/tbody\u003e\\n \u003c/table\u003e\\n \u003c/div\u003e\\n \u003c/div\u003e\\n \u003c/div\u003e\\n \u003c/div\u003e\\n\\n\u003c/div\u003e\\n\\n\u003cscript\u003e\\n/* DATA_START */\\nconst DASHBOARD_DATA = {\\\"by_platform\\\":[{\\\"platform\\\":\\\"Google Ads\\\",\\\"ad_spend\\\":523200,\\\"impressions\\\":49050000,\\\"clicks\\\":1765800,\\\"purchases\\\":30738,\\\"sales_revenue\\\":1955460,\\\"roas\\\":3.74,\\\"cpc\\\":0.3,\\\"ctr\\\":3.6,\\\"cpm\\\":10.67,\\\"conversion_rate\\\":1.74},{\\\"platform\\\":\\\"Meta Ads\\\",\\\"ad_spend\\\":386400,\\\"impressions\\\":55406666,\\\"clicks\\\":1294100,\\\"purchases\\\":26397,\\\"sales_revenue\\\":1441260,\\\"roas\\\":3.73,\\\"cpc\\\":0.3,\\\"ctr\\\":2.34,\\\"cpm\\\":6.97,\\\"conversion_rate\\\":2.04},{\\\"platform\\\":\\\"TikTok Ads\\\",\\\"ad_spend\\\":135600,\\\"impressions\\\":33900000,\\\"clicks\\\":678000,\\\"purchases\\\":8136,\\\"sales_revenue\\\":569520,\\\"roas\\\":4.2,\\\"cpc\\\":0.2,\\\"ctr\\\":2.0,\\\"cpm\\\":4.0,\\\"conversion_rate\\\":1.2},{\\\"platform\\\":\\\"YouTube Ads\\\",\\\"ad_spend\\\":169500,\\\"impressions\\\":50850000,\\\"clicks\\\":406800,\\\"purchases\\\":6102,\\\"sales_revenue\\\":427140,\\\"roas\\\":2.52,\\\"cpc\\\":0.42,\\\"ctr\\\":0.8,\\\"cpm\\\":3.33,\\\"conversion_rate\\\":1.5}],\\\"by_campaign\\\":[{\\\"campaign_type\\\":\\\"Prospecting\\\",\\\"ad_spend\\\":251500,\\\"impressions\\\":41916666,\\\"clicks\\\":754500,\\\"purchases\\\":14256,\\\"sales_revenue\\\":712800,\\\"roas\\\":2.83,\\\"cpc\\\":0.33,\\\"ctr\\\":1.8,\\\"cpm\\\":6.0,\\\"conversion_rate\\\":1.89},{\\\"campaign_type\\\":\\\"Retargeting\\\",\\\"ad_spend\\\":134900,\\\"impressions\\\":13490000,\\\"clicks\\\":539600,\\\"purchases\\\":12141,\\\"sales_revenue\\\":728460,\\\"roas\\\":5.4,\\\"cpc\\\":0.25,\\\"ctr\\\":4.0,\\\"cpm\\\":10.0,\\\"conversion_rate\\\":2.25},{\\\"campaign_type\\\":\\\"Search\\\",\\\"ad_spend\\\":327000,\\\"impressions\\\":19620000,\\\"clicks\\\":1177200,\\\"purchases\\\":19620,\\\"sales_revenue\\\":1177200,\\\"roas\\\":3.6,\\\"cpc\\\":0.28,\\\"ctr\\\":6.0,\\\"cpm\\\":16.67,\\\"conversion_rate\\\":1.67},{\\\"campaign_type\\\":\\\"Shopping\\\",\\\"ad_spend\\\":196200,\\\"impressions\\\":29430000,\\\"clicks\\\":588600,\\\"purchases\\\":11118,\\\"sales_revenue\\\":778260,\\\"roas\\\":3.97,\\\"cpc\\\":0.33,\\\"ctr\\\":2.0,\\\"cpm\\\":6.67,\\\"conversion_rate\\\":1.89},{\\\"campaign_type\\\":\\\"Video\\\",\\\"ad_spend\\\":305100,\\\"impressions\\\":84750000,\\\"clicks\\\":1084800,\\\"purchases\\\":14238,\\\"sales_revenue\\\":996660,\\\"roas\\\":3.27,\\\"cpc\\\":0.28,\\\"ctr\\\":1.28,\\\"cpm\\\":3.6,\\\"conversion_rate\\\":1.31}],\\\"daily_trend\\\":[{\\\"date\\\":\\\"2024-01-01\\\",\\\"ad_spend\\\":73000,\\\"impressions\\\":11300000,\\\"clicks\\\":249000,\\\"purchases\\\":4290,\\\"sales_revenue\\\":264100},{\\\"date\\\":\\\"2024-02-01\\\",\\\"ad_spend\\\":80300,\\\"impressions\\\":12430000,\\\"clicks\\\":273900,\\\"purchases\\\":4719,\\\"sales_revenue\\\":290510},{\\\"date\\\":\\\"2024-03-01\\\",\\\"ad_spend\\\":87600,\\\"impressions\\\":13560000,\\\"clicks\\\":298800,\\\"purchases\\\":5148,\\\"sales_revenue\\\":316920},{\\\"date\\\":\\\"2024-04-01\\\",\\\"ad_spend\\\":83600,\\\"impressions\\\":12943333,\\\"clicks\\\":285200,\\\"purchases\\\":4910,\\\"sales_revenue\\\":302450},{\\\"date\\\":\\\"2024-05-01\\\",\\\"ad_spend\\\":92600,\\\"impressions\\\":14436667,\\\"clicks\\\":316000,\\\"purchases\\\":5437,\\\"sales_revenue\\\":334870},{\\\"date\\\":\\\"2024-06-01\\\",\\\"ad_spend\\\":96700,\\\"impressions\\\":15063333,\\\"clicks\\\":330000,\\\"purchases\\\":5684,\\\"sales_revenue\\\":349880},{\\\"date\\\":\\\"2024-07-01\\\",\\\"ad_spend\\\":90550,\\\"impressions\\\":14123333,\\\"clicks\\\":309000,\\\"purchases\\\":5314,\\\"sales_revenue\\\":327390},{\\\"date\\\":\\\"2024-08-01\\\",\\\"ad_spend\\\":102400,\\\"impressions\\\":16005000,\\\"clicks\\\":349500,\\\"purchases\\\":6011,\\\"sales_revenue\\\":370280},{\\\"date\\\":\\\"2024-09-01\\\",\\\"ad_spend\\\":108450,\\\"impressions\\\":16935000,\\\"clicks\\\":370100,\\\"purchases\\\":6372,\\\"sales_revenue\\\":392230},{\\\"date\\\":\\\"2024-10-01\\\",\\\"ad_spend\\\":116200,\\\"impressions\\\":18190000,\\\"clicks\\\":396600,\\\"purchases\\\":6821,\\\"sales_revenue\\\":420060},{\\\"date\\\":\\\"2024-11-01\\\",\\\"ad_spend\\\":132300,\\\"impressions\\\":20666667,\\\"clicks\\\":451400,\\\"purchases\\\":7781,\\\"sales_revenue\\\":478430},{\\\"date\\\":\\\"2024-12-01\\\",\\\"ad_spend\\\":151000,\\\"impressions\\\":23553333,\\\"clicks\\\":515200,\\\"purchases\\\":8886,\\\"sales_revenue\\\":546260}],\\\"daily_by_platform\\\":[{\\\"date\\\":\\\"2024-01-01\\\",\\\"platform\\\":\\\"Google Ads\\\",\\\"spend\\\":20000,\\\"revenue\\\":72000},{\\\"date\\\":\\\"2024-01-01\\\",\\\"platform\\\":\\\"Google Ads\\\",\\\"spend\\\":12000,\\\"revenue\\\":47600},{\\\"date\\\":\\\"2024-01-01\\\",\\\"platform\\\":\\\"Meta Ads\\\",\\\"spend\\\":15000,\\\"revenue\\\":42500},{\\\"date\\\":\\\"2024-01-01\\\",\\\"platform\\\":\\\"Meta Ads\\\",\\\"spend\\\":8000,\\\"revenue\\\":43200},{\\\"date\\\":\\\"2024-01-01\\\",\\\"platform\\\":\\\"TikTok Ads\\\",\\\"spend\\\":8000,\\\"revenue\\\":33600},{\\\"date\\\":\\\"2024-01-01\\\",\\\"platform\\\":\\\"YouTube Ads\\\",\\\"spend\\\":10000,\\\"revenue\\\":25200},{\\\"date\\\":\\\"2024-02-01\\\",\\\"platform\\\":\\\"Google Ads\\\",\\\"spend\\\":22000,\\\"revenue\\\":79200},{\\\"date\\\":\\\"2024-02-01\\\",\\\"platform\\\":\\\"Google Ads\\\",\\\"spend\\\":13200,\\\"revenue\\\":52360},{\\\"date\\\":\\\"2024-02-01\\\",\\\"platform\\\":\\\"Meta Ads\\\",\\\"spend\\\":16500,\\\"revenue\\\":46750},{\\\"date\\\":\\\"2024-02-01\\\",\\\"platform\\\":\\\"Meta Ads\\\",\\\"spend\\\":8800,\\\"revenue\\\":47520},{\\\"date\\\":\\\"2024-02-01\\\",\\\"platform\\\":\\\"TikTok Ads\\\",\\\"spend\\\":8800,\\\"revenue\\\":36960},{\\\"date\\\":\\\"2024-02-01\\\",\\\"platform\\\":\\\"YouTube Ads\\\",\\\"spend\\\":11000,\\\"revenue\\\":27720},{\\\"date\\\":\\\"2024-03-01\\\",\\\"platform\\\":\\\"Google Ads\\\",\\\"spend\\\":24000,\\\"revenue\\\":86400},{\\\"date\\\":\\\"2024-03-01\\\",\\\"platform\\\":\\\"Google Ads\\\",\\\"spend\\\":14400,\\\"revenue\\\":57120},{\\\"date\\\":\\\"2024-03-01\\\",\\\"platform\\\":\\\"Meta Ads\\\",\\\"spend\\\":18000,\\\"revenue\\\":51000},{\\\"date\\\":\\\"2024-03-01\\\",\\\"platform\\\":\\\"Meta Ads\\\",\\\"spend\\\":9600,\\\"revenue\\\":51840},{\\\"date\\\":\\\"2024-03-01\\\",\\\"platform\\\":\\\"TikTok Ads\\\",\\\"spend\\\":9600,\\\"revenue\\\":40320},{\\\"date\\\":\\\"2024-03-01\\\",\\\"platform\\\":\\\"YouTube Ads\\\",\\\"spend\\\":12000,\\\"revenue\\\":30240},{\\\"date\\\":\\\"2024-04-01\\\",\\\"platform\\\":\\\"Google Ads\\\",\\\"spend\\\":23000,\\\"revenue\\\":82800},{\\\"date\\\":\\\"2024-04-01\\\",\\\"platform\\\":\\\"Google Ads\\\",\\\"spend\\\":13800,\\\"revenue\\\":54740},{\\\"date\\\":\\\"2024-04-01\\\",\\\"platform\\\":\\\"Meta Ads\\\",\\\"spend\\\":17000,\\\"revenue\\\":48150},{\\\"date\\\":\\\"2024-04-01\\\",\\\"platform\\\":\\\"Meta Ads\\\",\\\"spend\\\":9100,\\\"revenue\\\":49140},{\\\"date\\\":\\\"2024-04-01\\\",\\\"platform\\\":\\\"TikTok Ads\\\",\\\"spend\\\":9200,\\\"revenue\\\":38640},{\\\"date\\\":\\\"2024-04-01\\\",\\\"platform\\\":\\\"YouTube Ads\\\",\\\"spend\\\":11500,\\\"revenue\\\":28980},{\\\"date\\\":\\\"2024-05-01\\\",\\\"platform\\\":\\\"Google Ads\\\",\\\"spend\\\":25000,\\\"revenue\\\":90000},{\\\"date\\\":\\\"2024-05-01\\\",\\\"platform\\\":\\\"Google Ads\\\",\\\"spend\\\":15000,\\\"revenue\\\":59500},{\\\"date\\\":\\\"2024-05-01\\\",\\\"platform\\\":\\\"Meta Ads\\\",\\\"spend\\\":19000,\\\"revenue\\\":53850},{\\\"date\\\":\\\"2024-05-01\\\",\\\"platform\\\":\\\"Meta Ads\\\",\\\"spend\\\":10200,\\\"revenue\\\":55080},{\\\"date\\\":\\\"2024-05-01\\\",\\\"platform\\\":\\\"TikTok Ads\\\",\\\"spend\\\":10400,\\\"revenue\\\":43680},{\\\"date\\\":\\\"2024-05-01\\\",\\\"platform\\\":\\\"YouTube Ads\\\",\\\"spend\\\":13000,\\\"revenue\\\":32760},{\\\"date\\\":\\\"2024-06-01\\\",\\\"platform\\\":\\\"Google Ads\\\",\\\"spend\\\":26000,\\\"revenue\\\":93600},{\\\"date\\\":\\\"2024-06-01\\\",\\\"platform\\\":\\\"Google Ads\\\",\\\"spend\\\":15600,\\\"revenue\\\":61880},{\\\"date\\\":\\\"2024-06-01\\\",\\\"platform\\\":\\\"Meta Ads\\\",\\\"spend\\\":20000,\\\"revenue\\\":56700},{\\\"date\\\":\\\"2024-06-01\\\",\\\"platform\\\":\\\"Meta Ads\\\",\\\"spend\\\":10800,\\\"revenue\\\":58320},{\\\"date\\\":\\\"2024-06-01\\\",\\\"platform\\\":\\\"TikTok Ads\\\",\\\"spend\\\":10800,\\\"revenue\\\":45360},{\\\"date\\\":\\\"2024-06-01\\\",\\\"platform\\\":\\\"YouTube Ads\\\",\\\"spend\\\":13500,\\\"revenue\\\":34020},{\\\"date\\\":\\\"2024-07-01\\\",\\\"platform\\\":\\\"Google Ads\\\",\\\"spend\\\":24500,\\\"revenue\\\":88200},{\\\"date\\\":\\\"2024-07-01\\\",\\\"platform\\\":\\\"Google Ads\\\",\\\"spend\\\":14700,\\\"revenue\\\":58310},{\\\"date\\\":\\\"2024-07-01\\\",\\\"platform\\\":\\\"Meta Ads\\\",\\\"spend\\\":18500,\\\"revenue\\\":52450},{\\\"date\\\":\\\"2024-07-01\\\",\\\"platform\\\":\\\"Meta Ads\\\",\\\"spend\\\":9900,\\\"revenue\\\":53460},{\\\"date\\\":\\\"2024-07-01\\\",\\\"platform\\\":\\\"TikTok Ads\\\",\\\"spend\\\":10200,\\\"revenue\\\":42840},{\\\"date\\\":\\\"2024-07-01\\\",\\\"platform\\\":\\\"YouTube Ads\\\",\\\"spend\\\":12750,\\\"revenue\\\":32130},{\\\"date\\\":\\\"2024-08-01\\\",\\\"platform\\\":\\\"Google Ads\\\",\\\"spend\\\":27500,\\\"revenue\\\":99000},{\\\"date\\\":\\\"2024-08-01\\\",\\\"platform\\\":\\\"Google Ads\\\",\\\"spend\\\":16500,\\\"revenue\\\":65450},{\\\"date\\\":\\\"2024-08-01\\\",\\\"platform\\\":\\\"Meta Ads\\\",\\\"spend\\\":21000,\\\"revenue\\\":59550},{\\\"date\\\":\\\"2024-08-01\\\",\\\"platform\\\":\\\"Meta Ads\\\",\\\"spend\\\":11300,\\\"revenue\\\":61020},{\\\"date\\\":\\\"2024-08-01\\\",\\\"platform\\\":\\\"TikTok Ads\\\",\\\"spend\\\":11600,\\\"revenue\\\":48720},{\\\"date\\\":\\\"2024-08-01\\\",\\\"platform\\\":\\\"YouTube Ads\\\",\\\"spend\\\":14500,\\\"revenue\\\":36540},{\\\"date\\\":\\\"2024-09-01\\\",\\\"platform\\\":\\\"Google Ads\\\",\\\"spend\\\":29000,\\\"revenue\\\":104400},{\\\"date\\\":\\\"2024-09-01\\\",\\\"platform\\\":\\\"Google Ads\\\",\\\"spend\\\":17400,\\\"revenue\\\":69020},{\\\"date\\\":\\\"2024-09-01\\\",\\\"platform\\\":\\\"Meta Ads\\\",\\\"spend\\\":22500,\\\"revenue\\\":63800},{\\\"date\\\":\\\"2024-09-01\\\",\\\"platform\\\":\\\"Meta Ads\\\",\\\"spend\\\":12100,\\\"revenue\\\":65340},{\\\"date\\\":\\\"2024-09-01\\\",\\\"platform\\\":\\\"TikTok Ads\\\",\\\"spend\\\":12200,\\\"revenue\\\":51240},{\\\"date\\\":\\\"2024-09-01\\\",\\\"platform\\\":\\\"YouTube Ads\\\",\\\"spend\\\":15250,\\\"revenue\\\":38430},{\\\"date\\\":\\\"2024-10-01\\\",\\\"platform\\\":\\\"Google Ads\\\",\\\"spend\\\":31000,\\\"revenue\\\":111600},{\\\"date\\\":\\\"2024-10-01\\\",\\\"platform\\\":\\\"Google Ads\\\",\\\"spend\\\":18600,\\\"revenue\\\":73780},{\\\"date\\\":\\\"2024-10-01\\\",\\\"platform\\\":\\\"Meta Ads\\\",\\\"spend\\\":24000,\\\"revenue\\\":68000},{\\\"date\\\":\\\"2024-10-01\\\",\\\"platform\\\":\\\"Meta Ads\\\",\\\"spend\\\":12900,\\\"revenue\\\":69660},{\\\"date\\\":\\\"2024-10-01\\\",\\\"platform\\\":\\\"TikTok Ads\\\",\\\"spend\\\":13200,\\\"revenue\\\":55440},{\\\"date\\\":\\\"2024-10-01\\\",\\\"platform\\\":\\\"YouTube Ads\\\",\\\"spend\\\":16500,\\\"revenue\\\":41580},{\\\"date\\\":\\\"2024-11-01\\\",\\\"platform\\\":\\\"Google Ads\\\",\\\"spend\\\":35000,\\\"revenue\\\":126000},{\\\"date\\\":\\\"2024-11-01\\\",\\\"platform\\\":\\\"Google Ads\\\",\\\"spend\\\":21000,\\\"revenue\\\":83300},{\\\"date\\\":\\\"2024-11-01\\\",\\\"platform\\\":\\\"Meta Ads\\\",\\\"spend\\\":28000,\\\"revenue\\\":79350},{\\\"date\\\":\\\"2024-11-01\\\",\\\"platform\\\":\\\"Meta Ads\\\",\\\"spend\\\":15000,\\\"revenue\\\":81000},{\\\"date\\\":\\\"2024-11-01\\\",\\\"platform\\\":\\\"TikTok Ads\\\",\\\"spend\\\":14800,\\\"revenue\\\":62160},{\\\"date\\\":\\\"2024-11-01\\\",\\\"platform\\\":\\\"YouTube Ads\\\",\\\"spend\\\":18500,\\\"revenue\\\":46620},{\\\"date\\\":\\\"2024-12-01\\\",\\\"platform\\\":\\\"Google Ads\\\",\\\"spend\\\":40000,\\\"revenue\\\":144000},{\\\"date\\\":\\\"2024-12-01\\\",\\\"platform\\\":\\\"Google Ads\\\",\\\"spend\\\":24000,\\\"revenue\\\":95200},{\\\"date\\\":\\\"2024-12-01\\\",\\\"platform\\\":\\\"Meta Ads\\\",\\\"spend\\\":32000,\\\"revenue\\\":90700},{\\\"date\\\":\\\"2024-12-01\\\",\\\"platform\\\":\\\"Meta Ads\\\",\\\"spend\\\":17200,\\\"revenue\\\":92880},{\\\"date\\\":\\\"2024-12-01\\\",\\\"platform\\\":\\\"TikTok Ads\\\",\\\"spend\\\":16800,\\\"revenue\\\":70560},{\\\"date\\\":\\\"2024-12-01\\\",\\\"platform\\\":\\\"YouTube Ads\\\",\\\"spend\\\":21000,\\\"revenue\\\":52920}],\\\"overview_totals\\\":{\\\"total_spend\\\":1214700,\\\"total_revenue\\\":4393380,\\\"total_purchases\\\":71373,\\\"total_clicks\\\":4144700,\\\"total_impressions\\\":189206666,\\\"overall_roas\\\":3.62,\\\"overall_cpc\\\":0.29,\\\"overall_ctr\\\":2.19,\\\"overall_cpm\\\":6.42,\\\"overall_conversion_rate\\\":1.72},\\\"by_platform_campaign\\\":[{\\\"platform\\\":\\\"Google Ads\\\",\\\"campaign_type\\\":\\\"Search\\\",\\\"ad_spend\\\":327000,\\\"sales_revenue\\\":1177200,\\\"purchases\\\":19620,\\\"clicks\\\":1177200,\\\"impressions\\\":19620000},{\\\"platform\\\":\\\"Google Ads\\\",\\\"campaign_type\\\":\\\"Shopping\\\",\\\"ad_spend\\\":196200,\\\"sales_revenue\\\":778260,\\\"purchases\\\":11118,\\\"clicks\\\":588600,\\\"impressions\\\":29430000},{\\\"platform\\\":\\\"Meta Ads\\\",\\\"campaign_type\\\":\\\"Prospecting\\\",\\\"ad_spend\\\":251500,\\\"sales_revenue\\\":712800,\\\"purchases\\\":14256,\\\"clicks\\\":754500,\\\"impressions\\\":41916666},{\\\"platform\\\":\\\"Meta Ads\\\",\\\"campaign_type\\\":\\\"Retargeting\\\",\\\"ad_spend\\\":134900,\\\"sales_revenue\\\":728460,\\\"purchases\\\":12141,\\\"clicks\\\":539600,\\\"impressions\\\":13490000},{\\\"platform\\\":\\\"TikTok Ads\\\",\\\"campaign_type\\\":\\\"Video\\\",\\\"ad_spend\\\":135600,\\\"sales_revenue\\\":569520,\\\"purchases\\\":8136,\\\"clicks\\\":678000,\\\"impressions\\\":33900000},{\\\"platform\\\":\\\"YouTube Ads\\\",\\\"campaign_type\\\":\\\"Video\\\",\\\"ad_spend\\\":169500,\\\"sales_revenue\\\":427140,\\\"purchases\\\":6102,\\\"clicks\\\":406800,\\\"impressions\\\":50850000}]};\\n/* DATA_END */\\n\\n/* RAW_DAILY_START */\\nconst RAW_DAILY = [{\\\"date\\\":\\\"2024-01-01\\\",\\\"platform\\\":\\\"Meta Ads\\\",\\\"campaign_type\\\":\\\"Prospecting\\\",\\\"ad_spend\\\":15000.0,\\\"impressions\\\":2500000,\\\"clicks\\\":45000,\\\"purchases\\\":850,\\\"sales_revenue\\\":42500.0},{\\\"date\\\":\\\"2024-01-01\\\",\\\"platform\\\":\\\"Meta Ads\\\",\\\"campaign_type\\\":\\\"Retargeting\\\",\\\"ad_spend\\\":8000.0,\\\"impressions\\\":800000,\\\"clicks\\\":32000,\\\"purchases\\\":720,\\\"sales_revenue\\\":43200.0},{\\\"date\\\":\\\"2024-01-01\\\",\\\"platform\\\":\\\"Google Ads\\\",\\\"campaign_type\\\":\\\"Search\\\",\\\"ad_spend\\\":20000.0,\\\"impressions\\\":1200000,\\\"clicks\\\":72000,\\\"purchases\\\":1200,\\\"sales_revenue\\\":72000.0},{\\\"date\\\":\\\"2024-01-01\\\",\\\"platform\\\":\\\"Google Ads\\\",\\\"campaign_type\\\":\\\"Shopping\\\",\\\"ad_spend\\\":12000.0,\\\"impressions\\\":1800000,\\\"clicks\\\":36000,\\\"purchases\\\":680,\\\"sales_revenue\\\":47600.0},{\\\"date\\\":\\\"2024-01-01\\\",\\\"platform\\\":\\\"YouTube Ads\\\",\\\"campaign_type\\\":\\\"Video\\\",\\\"ad_spend\\\":10000.0,\\\"impressions\\\":3000000,\\\"clicks\\\":24000,\\\"purchases\\\":360,\\\"sales_revenue\\\":25200.0},{\\\"date\\\":\\\"2024-01-01\\\",\\\"platform\\\":\\\"TikTok Ads\\\",\\\"campaign_type\\\":\\\"Video\\\",\\\"ad_spend\\\":8000.0,\\\"impressions\\\":2000000,\\\"clicks\\\":40000,\\\"purchases\\\":480,\\\"sales_revenue\\\":33600.0},{\\\"date\\\":\\\"2024-02-01\\\",\\\"platform\\\":\\\"Meta Ads\\\",\\\"campaign_type\\\":\\\"Prospecting\\\",\\\"ad_spend\\\":16500.0,\\\"impressions\\\":2750000,\\\"clicks\\\":49500,\\\"purchases\\\":935,\\\"sales_revenue\\\":46750.0},{\\\"date\\\":\\\"2024-02-01\\\",\\\"platform\\\":\\\"Meta Ads\\\",\\\"campaign_type\\\":\\\"Retargeting\\\",\\\"ad_spend\\\":8800.0,\\\"impressions\\\":880000,\\\"clicks\\\":35200,\\\"purchases\\\":792,\\\"sales_revenue\\\":47520.0},{\\\"date\\\":\\\"2024-02-01\\\",\\\"platform\\\":\\\"Google Ads\\\",\\\"campaign_type\\\":\\\"Search\\\",\\\"ad_spend\\\":22000.0,\\\"impressions\\\":1320000,\\\"clicks\\\":79200,\\\"purchases\\\":1320,\\\"sales_revenue\\\":79200.0},{\\\"date\\\":\\\"2024-02-01\\\",\\\"platform\\\":\\\"Google Ads\\\",\\\"campaign_type\\\":\\\"Shopping\\\",\\\"ad_spend\\\":13200.0,\\\"impressions\\\":1980000,\\\"clicks\\\":39600,\\\"purchases\\\":748,\\\"sales_revenue\\\":52360.0},{\\\"date\\\":\\\"2024-02-01\\\",\\\"platform\\\":\\\"YouTube Ads\\\",\\\"campaign_type\\\":\\\"Video\\\",\\\"ad_spend\\\":11000.0,\\\"impressions\\\":3300000,\\\"clicks\\\":26400,\\\"purchases\\\":396,\\\"sales_revenue\\\":27720.0},{\\\"date\\\":\\\"2024-02-01\\\",\\\"platform\\\":\\\"TikTok Ads\\\",\\\"campaign_type\\\":\\\"Video\\\",\\\"ad_spend\\\":8800.0,\\\"impressions\\\":2200000,\\\"clicks\\\":44000,\\\"purchases\\\":528,\\\"sales_revenue\\\":36960.0},{\\\"date\\\":\\\"2024-03-01\\\",\\\"platform\\\":\\\"Meta Ads\\\",\\\"campaign_type\\\":\\\"Prospecting\\\",\\\"ad_spend\\\":18000.0,\\\"impressions\\\":3000000,\\\"clicks\\\":54000,\\\"purchases\\\":1020,\\\"sales_revenue\\\":51000.0},{\\\"date\\\":\\\"2024-03-01\\\",\\\"platform\\\":\\\"Meta Ads\\\",\\\"campaign_type\\\":\\\"Retargeting\\\",\\\"ad_spend\\\":9600.0,\\\"impressions\\\":960000,\\\"clicks\\\":38400,\\\"purchases\\\":864,\\\"sales_revenue\\\":51840.0},{\\\"date\\\":\\\"2024-03-01\\\",\\\"platform\\\":\\\"Google Ads\\\",\\\"campaign_type\\\":\\\"Search\\\",\\\"ad_spend\\\":24000.0,\\\"impressions\\\":1440000,\\\"clicks\\\":86400,\\\"purchases\\\":1440,\\\"sales_revenue\\\":86400.0},{\\\"date\\\":\\\"2024-03-01\\\",\\\"platform\\\":\\\"Google Ads\\\",\\\"campaign_type\\\":\\\"Shopping\\\",\\\"ad_spend\\\":14400.0,\\\"impressions\\\":2160000,\\\"clicks\\\":43200,\\\"purchases\\\":816,\\\"sales_revenue\\\":57120.0},{\\\"date\\\":\\\"2024-03-01\\\",\\\"platform\\\":\\\"YouTube Ads\\\",\\\"campaign_type\\\":\\\"Video\\\",\\\"ad_spend\\\":12000.0,\\\"impressions\\\":3600000,\\\"clicks\\\":28800,\\\"purchases\\\":432,\\\"sales_revenue\\\":30240.0},{\\\"date\\\":\\\"2024-03-01\\\",\\\"platform\\\":\\\"TikTok Ads\\\",\\\"campaign_type\\\":\\\"Video\\\",\\\"ad_spend\\\":9600.0,\\\"impressions\\\":2400000,\\\"clicks\\\":48000,\\\"purchases\\\":576,\\\"sales_revenue\\\":40320.0},{\\\"date\\\":\\\"2024-04-01\\\",\\\"platform\\\":\\\"Meta Ads\\\",\\\"campaign_type\\\":\\\"Prospecting\\\",\\\"ad_spend\\\":17000.0,\\\"impressions\\\":2833333,\\\"clicks\\\":51000,\\\"purchases\\\":963,\\\"sales_revenue\\\":48150.0},{\\\"date\\\":\\\"2024-04-01\\\",\\\"platform\\\":\\\"Meta Ads\\\",\\\"campaign_type\\\":\\\"Retargeting\\\",\\\"ad_spend\\\":9100.0,\\\"impressions\\\":910000,\\\"clicks\\\":36400,\\\"purchases\\\":819,\\\"sales_revenue\\\":49140.0},{\\\"date\\\":\\\"2024-04-01\\\",\\\"platform\\\":\\\"Google Ads\\\",\\\"campaign_type\\\":\\\"Search\\\",\\\"ad_spend\\\":23000.0,\\\"impressions\\\":1380000,\\\"clicks\\\":82800,\\\"purchases\\\":1380,\\\"sales_revenue\\\":82800.0},{\\\"date\\\":\\\"2024-04-01\\\",\\\"platform\\\":\\\"Google Ads\\\",\\\"campaign_type\\\":\\\"Shopping\\\",\\\"ad_spend\\\":13800.0,\\\"impressions\\\":2070000,\\\"clicks\\\":41400,\\\"purchases\\\":782,\\\"sales_revenue\\\":54740.0},{\\\"date\\\":\\\"2024-04-01\\\",\\\"platform\\\":\\\"YouTube Ads\\\",\\\"campaign_type\\\":\\\"Video\\\",\\\"ad_spend\\\":11500.0,\\\"impressions\\\":3450000,\\\"clicks\\\":27600,\\\"purchases\\\":414,\\\"sales_revenue\\\":28980.0},{\\\"date\\\":\\\"2024-04-01\\\",\\\"platform\\\":\\\"TikTok Ads\\\",\\\"campaign_type\\\":\\\"Video\\\",\\\"ad_spend\\\":9200.0,\\\"impressions\\\":2300000,\\\"clicks\\\":46000,\\\"purchases\\\":552,\\\"sales_revenue\\\":38640.0},{\\\"date\\\":\\\"2024-05-01\\\",\\\"platform\\\":\\\"Meta Ads\\\",\\\"campaign_type\\\":\\\"Prospecting\\\",\\\"ad_spend\\\":19000.0,\\\"impressions\\\":3166667,\\\"clicks\\\":57000,\\\"purchases\\\":1077,\\\"sales_revenue\\\":53850.0},{\\\"date\\\":\\\"2024-05-01\\\",\\\"platform\\\":\\\"Meta Ads\\\",\\\"campaign_type\\\":\\\"Retargeting\\\",\\\"ad_spend\\\":10200.0,\\\"impressions\\\":1020000,\\\"clicks\\\":40800,\\\"purchases\\\":918,\\\"sales_revenue\\\":55080.0},{\\\"date\\\":\\\"2024-05-01\\\",\\\"platform\\\":\\\"Google Ads\\\",\\\"campaign_type\\\":\\\"Search\\\",\\\"ad_spend\\\":25000.0,\\\"impressions\\\":1500000,\\\"clicks\\\":90000,\\\"purchases\\\":1500,\\\"sales_revenue\\\":90000.0},{\\\"date\\\":\\\"2024-05-01\\\",\\\"platform\\\":\\\"Google Ads\\\",\\\"campaign_type\\\":\\\"Shopping\\\",\\\"ad_spend\\\":15000.0,\\\"impressions\\\":2250000,\\\"clicks\\\":45000,\\\"purchases\\\":850,\\\"sales_revenue\\\":59500.0},{\\\"date\\\":\\\"2024-05-01\\\",\\\"platform\\\":\\\"YouTube Ads\\\",\\\"campaign_type\\\":\\\"Video\\\",\\\"ad_spend\\\":13000.0,\\\"impressions\\\":3900000,\\\"clicks\\\":31200,\\\"purchases\\\":468,\\\"sales_revenue\\\":32760.0},{\\\"date\\\":\\\"2024-05-01\\\",\\\"platform\\\":\\\"TikTok Ads\\\",\\\"campaign_type\\\":\\\"Video\\\",\\\"ad_spend\\\":10400.0,\\\"impressions\\\":2600000,\\\"clicks\\\":52000,\\\"purchases\\\":624,\\\"sales_revenue\\\":43680.0},{\\\"date\\\":\\\"2024-06-01\\\",\\\"platform\\\":\\\"Meta Ads\\\",\\\"campaign_type\\\":\\\"Prospecting\\\",\\\"ad_spend\\\":20000.0,\\\"impressions\\\":3333333,\\\"clicks\\\":60000,\\\"purchases\\\":1134,\\\"sales_revenue\\\":56700.0},{\\\"date\\\":\\\"2024-06-01\\\",\\\"platform\\\":\\\"Meta Ads\\\",\\\"campaign_type\\\":\\\"Retargeting\\\",\\\"ad_spend\\\":10800.0,\\\"impressions\\\":1080000,\\\"clicks\\\":43200,\\\"purchases\\\":972,\\\"sales_revenue\\\":58320.0},{\\\"date\\\":\\\"2024-06-01\\\",\\\"platform\\\":\\\"Google Ads\\\",\\\"campaign_type\\\":\\\"Search\\\",\\\"ad_spend\\\":26000.0,\\\"impressions\\\":1560000,\\\"clicks\\\":93600,\\\"purchases\\\":1560,\\\"sales_revenue\\\":93600.0},{\\\"date\\\":\\\"2024-06-01\\\",\\\"platform\\\":\\\"Google Ads\\\",\\\"campaign_type\\\":\\\"Shopping\\\",\\\"ad_spend\\\":15600.0,\\\"impressions\\\":2340000,\\\"clicks\\\":46800,\\\"purchases\\\":884,\\\"sales_revenue\\\":61880.0},{\\\"date\\\":\\\"2024-06-01\\\",\\\"platform\\\":\\\"YouTube Ads\\\",\\\"campaign_type\\\":\\\"Video\\\",\\\"ad_spend\\\":13500.0,\\\"impressions\\\":4050000,\\\"clicks\\\":32400,\\\"purchases\\\":486,\\\"sales_revenue\\\":34020.0},{\\\"date\\\":\\\"2024-06-01\\\",\\\"platform\\\":\\\"TikTok Ads\\\",\\\"campaign_type\\\":\\\"Video\\\",\\\"ad_spend\\\":10800.0,\\\"impressions\\\":2700000,\\\"clicks\\\":54000,\\\"purchases\\\":648,\\\"sales_revenue\\\":45360.0},{\\\"date\\\":\\\"2024-07-01\\\",\\\"platform\\\":\\\"Meta Ads\\\",\\\"campaign_type\\\":\\\"Prospecting\\\",\\\"ad_spend\\\":18500.0,\\\"impressions\\\":3083333,\\\"clicks\\\":55500,\\\"purchases\\\":1049,\\\"sales_revenue\\\":52450.0},{\\\"date\\\":\\\"2024-07-01\\\",\\\"platform\\\":\\\"Meta Ads\\\",\\\"campaign_type\\\":\\\"Retargeting\\\",\\\"ad_spend\\\":9900.0,\\\"impressions\\\":990000,\\\"clicks\\\":39600,\\\"purchases\\\":891,\\\"sales_revenue\\\":53460.0},{\\\"date\\\":\\\"2024-07-01\\\",\\\"platform\\\":\\\"Google Ads\\\",\\\"campaign_type\\\":\\\"Search\\\",\\\"ad_spend\\\":24500.0,\\\"impressions\\\":1470000,\\\"clicks\\\":88200,\\\"purchases\\\":1470,\\\"sales_revenue\\\":88200.0},{\\\"date\\\":\\\"2024-07-01\\\",\\\"platform\\\":\\\"Google Ads\\\",\\\"campaign_type\\\":\\\"Shopping\\\",\\\"ad_spend\\\":14700.0,\\\"impressions\\\":2205000,\\\"clicks\\\":44100,\\\"purchases\\\":833,\\\"sales_revenue\\\":58310.0},{\\\"date\\\":\\\"2024-07-01\\\",\\\"platform\\\":\\\"YouTube Ads\\\",\\\"campaign_type\\\":\\\"Video\\\",\\\"ad_spend\\\":12750.0,\\\"impressions\\\":3825000,\\\"clicks\\\":30600,\\\"purchases\\\":459,\\\"sales_revenue\\\":32130.0},{\\\"date\\\":\\\"2024-07-01\\\",\\\"platform\\\":\\\"TikTok Ads\\\",\\\"campaign_type\\\":\\\"Video\\\",\\\"ad_spend\\\":10200.0,\\\"impressions\\\":2550000,\\\"clicks\\\":51000,\\\"purchases\\\":612,\\\"sales_revenue\\\":42840.0},{\\\"date\\\":\\\"2024-08-01\\\",\\\"platform\\\":\\\"Meta Ads\\\",\\\"campaign_type\\\":\\\"Prospecting\\\",\\\"ad_spend\\\":21000.0,\\\"impressions\\\":3500000,\\\"clicks\\\":63000,\\\"purchases\\\":1191,\\\"sales_revenue\\\":59550.0},{\\\"date\\\":\\\"2024-08-01\\\",\\\"platform\\\":\\\"Meta Ads\\\",\\\"campaign_type\\\":\\\"Retargeting\\\",\\\"ad_spend\\\":11300.0,\\\"impressions\\\":1130000,\\\"clicks\\\":45200,\\\"purchases\\\":1017,\\\"sales_revenue\\\":61020.0},{\\\"date\\\":\\\"2024-08-01\\\",\\\"platform\\\":\\\"Google Ads\\\",\\\"campaign_type\\\":\\\"Search\\\",\\\"ad_spend\\\":27500.0,\\\"impressions\\\":1650000,\\\"clicks\\\":99000,\\\"purchases\\\":1650,\\\"sales_revenue\\\":99000.0},{\\\"date\\\":\\\"2024-08-01\\\",\\\"platform\\\":\\\"Google Ads\\\",\\\"campaign_type\\\":\\\"Shopping\\\",\\\"ad_spend\\\":16500.0,\\\"impressions\\\":2475000,\\\"clicks\\\":49500,\\\"purchases\\\":935,\\\"sales_revenue\\\":65450.0},{\\\"date\\\":\\\"2024-08-01\\\",\\\"platform\\\":\\\"YouTube Ads\\\",\\\"campaign_type\\\":\\\"Video\\\",\\\"ad_spend\\\":14500.0,\\\"impressions\\\":4350000,\\\"clicks\\\":34800,\\\"purchases\\\":522,\\\"sales_revenue\\\":36540.0},{\\\"date\\\":\\\"2024-08-01\\\",\\\"platform\\\":\\\"TikTok Ads\\\",\\\"campaign_type\\\":\\\"Video\\\",\\\"ad_spend\\\":11600.0,\\\"impressions\\\":2900000,\\\"clicks\\\":58000,\\\"purchases\\\":696,\\\"sales_revenue\\\":48720.0},{\\\"date\\\":\\\"2024-09-01\\\",\\\"platform\\\":\\\"Meta Ads\\\",\\\"campaign_type\\\":\\\"Prospecting\\\",\\\"ad_spend\\\":22500.0,\\\"impressions\\\":3750000,\\\"clicks\\\":67500,\\\"purchases\\\":1276,\\\"sales_revenue\\\":63800.0},{\\\"date\\\":\\\"2024-09-01\\\",\\\"platform\\\":\\\"Meta Ads\\\",\\\"campaign_type\\\":\\\"Retargeting\\\",\\\"ad_spend\\\":12100.0,\\\"impressions\\\":1210000,\\\"clicks\\\":48400,\\\"purchases\\\":1089,\\\"sales_revenue\\\":65340.0},{\\\"date\\\":\\\"2024-09-01\\\",\\\"platform\\\":\\\"Google Ads\\\",\\\"campaign_type\\\":\\\"Search\\\",\\\"ad_spend\\\":29000.0,\\\"impressions\\\":1740000,\\\"clicks\\\":104400,\\\"purchases\\\":1740,\\\"sales_revenue\\\":104400.0},{\\\"date\\\":\\\"2024-09-01\\\",\\\"platform\\\":\\\"Google Ads\\\",\\\"campaign_type\\\":\\\"Shopping\\\",\\\"ad_spend\\\":17400.0,\\\"impressions\\\":2610000,\\\"clicks\\\":52200,\\\"purchases\\\":986,\\\"sales_revenue\\\":69020.0},{\\\"date\\\":\\\"2024-09-01\\\",\\\"platform\\\":\\\"YouTube Ads\\\",\\\"campaign_type\\\":\\\"Video\\\",\\\"ad_spend\\\":15250.0,\\\"impressions\\\":4575000,\\\"clicks\\\":36600,\\\"purchases\\\":549,\\\"sales_revenue\\\":38430.0},{\\\"date\\\":\\\"2024-09-01\\\",\\\"platform\\\":\\\"TikTok Ads\\\",\\\"campaign_type\\\":\\\"Video\\\",\\\"ad_spend\\\":12200.0,\\\"impressions\\\":3050000,\\\"clicks\\\":61000,\\\"purchases\\\":732,\\\"sales_revenue\\\":51240.0},{\\\"date\\\":\\\"2024-10-01\\\",\\\"platform\\\":\\\"Meta Ads\\\",\\\"campaign_type\\\":\\\"Prospecting\\\",\\\"ad_spend\\\":24000.0,\\\"impressions\\\":4000000,\\\"clicks\\\":72000,\\\"purchases\\\":1360,\\\"sales_revenue\\\":68000.0},{\\\"date\\\":\\\"2024-10-01\\\",\\\"platform\\\":\\\"Meta Ads\\\",\\\"campaign_type\\\":\\\"Retargeting\\\",\\\"ad_spend\\\":12900.0,\\\"impressions\\\":1290000,\\\"clicks\\\":51600,\\\"purchases\\\":1161,\\\"sales_revenue\\\":69660.0},{\\\"date\\\":\\\"2024-10-01\\\",\\\"platform\\\":\\\"Google Ads\\\",\\\"campaign_type\\\":\\\"Search\\\",\\\"ad_spend\\\":31000.0,\\\"impressions\\\":1860000,\\\"clicks\\\":111600,\\\"purchases\\\":1860,\\\"sales_revenue\\\":111600.0},{\\\"date\\\":\\\"2024-10-01\\\",\\\"platform\\\":\\\"Google Ads\\\",\\\"campaign_type\\\":\\\"Shopping\\\",\\\"ad_spend\\\":18600.0,\\\"impressions\\\":2790000,\\\"clicks\\\":55800,\\\"purchases\\\":1054,\\\"sales_revenue\\\":73780.0},{\\\"date\\\":\\\"2024-10-01\\\",\\\"platform\\\":\\\"YouTube Ads\\\",\\\"campaign_type\\\":\\\"Video\\\",\\\"ad_spend\\\":16500.0,\\\"impressions\\\":4950000,\\\"clicks\\\":39600,\\\"purchases\\\":594,\\\"sales_revenue\\\":41580.0},{\\\"date\\\":\\\"2024-10-01\\\",\\\"platform\\\":\\\"TikTok Ads\\\",\\\"campaign_type\\\":\\\"Video\\\",\\\"ad_spend\\\":13200.0,\\\"impressions\\\":3300000,\\\"clicks\\\":66000,\\\"purchases\\\":792,\\\"sales_revenue\\\":55440.0},{\\\"date\\\":\\\"2024-11-01\\\",\\\"platform\\\":\\\"Meta Ads\\\",\\\"campaign_type\\\":\\\"Prospecting\\\",\\\"ad_spend\\\":28000.0,\\\"impressions\\\":4666667,\\\"clicks\\\":84000,\\\"purchases\\\":1587,\\\"sales_revenue\\\":79350.0},{\\\"date\\\":\\\"2024-11-01\\\",\\\"platform\\\":\\\"Meta Ads\\\",\\\"campaign_type\\\":\\\"Retargeting\\\",\\\"ad_spend\\\":15000.0,\\\"impressions\\\":1500000,\\\"clicks\\\":60000,\\\"purchases\\\":1350,\\\"sales_revenue\\\":81000.0},{\\\"date\\\":\\\"2024-11-01\\\",\\\"platform\\\":\\\"Google Ads\\\",\\\"campaign_type\\\":\\\"Search\\\",\\\"ad_spend\\\":35000.0,\\\"impressions\\\":2100000,\\\"clicks\\\":126000,\\\"purchases\\\":2100,\\\"sales_revenue\\\":126000.0},{\\\"date\\\":\\\"2024-11-01\\\",\\\"platform\\\":\\\"Google Ads\\\",\\\"campaign_type\\\":\\\"Shopping\\\",\\\"ad_spend\\\":21000.0,\\\"impressions\\\":3150000,\\\"clicks\\\":63000,\\\"purchases\\\":1190,\\\"sales_revenue\\\":83300.0},{\\\"date\\\":\\\"2024-11-01\\\",\\\"platform\\\":\\\"YouTube Ads\\\",\\\"campaign_type\\\":\\\"Video\\\",\\\"ad_spend\\\":18500.0,\\\"impressions\\\":5550000,\\\"clicks\\\":44400,\\\"purchases\\\":666,\\\"sales_revenue\\\":46620.0},{\\\"date\\\":\\\"2024-11-01\\\",\\\"platform\\\":\\\"TikTok Ads\\\",\\\"campaign_type\\\":\\\"Video\\\",\\\"ad_spend\\\":14800.0,\\\"impressions\\\":3700000,\\\"clicks\\\":74000,\\\"purchases\\\":888,\\\"sales_revenue\\\":62160.0},{\\\"date\\\":\\\"2024-12-01\\\",\\\"platform\\\":\\\"Meta Ads\\\",\\\"campaign_type\\\":\\\"Prospecting\\\",\\\"ad_spend\\\":32000.0,\\\"impressions\\\":5333333,\\\"clicks\\\":96000,\\\"purchases\\\":1814,\\\"sales_revenue\\\":90700.0},{\\\"date\\\":\\\"2024-12-01\\\",\\\"platform\\\":\\\"Meta Ads\\\",\\\"campaign_type\\\":\\\"Retargeting\\\",\\\"ad_spend\\\":17200.0,\\\"impressions\\\":1720000,\\\"clicks\\\":68800,\\\"purchases\\\":1548,\\\"sales_revenue\\\":92880.0},{\\\"date\\\":\\\"2024-12-01\\\",\\\"platform\\\":\\\"Google Ads\\\",\\\"campaign_type\\\":\\\"Search\\\",\\\"ad_spend\\\":40000.0,\\\"impressions\\\":2400000,\\\"clicks\\\":144000,\\\"purchases\\\":2400,\\\"sales_revenue\\\":144000.0},{\\\"date\\\":\\\"2024-12-01\\\",\\\"platform\\\":\\\"Google Ads\\\",\\\"campaign_type\\\":\\\"Shopping\\\",\\\"ad_spend\\\":24000.0,\\\"impressions\\\":3600000,\\\"clicks\\\":72000,\\\"purchases\\\":1360,\\\"sales_revenue\\\":95200.0},{\\\"date\\\":\\\"2024-12-01\\\",\\\"platform\\\":\\\"YouTube Ads\\\",\\\"campaign_type\\\":\\\"Video\\\",\\\"ad_spend\\\":21000.0,\\\"impressions\\\":6300000,\\\"clicks\\\":50400,\\\"purchases\\\":756,\\\"sales_revenue\\\":52920.0},{\\\"date\\\":\\\"2024-12-01\\\",\\\"platform\\\":\\\"TikTok Ads\\\",\\\"campaign_type\\\":\\\"Video\\\",\\\"ad_spend\\\":16800.0,\\\"impressions\\\":4200000,\\\"clicks\\\":84000,\\\"purchases\\\":1008,\\\"sales_revenue\\\":70560.0}];\\n/* RAW_DAILY_END */\\n\\n// ============ UTILS ============\\nconst RAW = DASHBOARD_DATA;\\nconst OVERVIEW = RAW.overview_totals;\\n\\nfunction fmtNum(n) {\\n if (n == null || isNaN(n)) return '—';\\n if (n \u003e= 100000000) return (n/100000000).toFixed(1)+'亿';\\n if (n \u003e= 10000) return (n/10000).toFixed(1)+'万';\\n if (n \u003e= 1000) return (n/1000).toFixed(1)+'k';\\n return Number(n).toLocaleString();\\n}\\nfunction fmtMoney(n) {\\n if (n == null || isNaN(n)) return '—';\\n if (n \u003e= 10000) return '¥'+(n/10000).toFixed(1)+'万';\\n return '¥'+Number(n).toLocaleString();\\n}\\nfunction fmt(n, d) { d = d || 2; if (n == null || isNaN(n)) return '—'; return Number(n).toFixed(d); }\\n\\nfunction renderKPI(o) {\\n document.getElementById('kpiSpend').textContent = fmtMoney(o.total_spend);\\n document.getElementById('kpiRevenue').textContent = fmtMoney(o.total_revenue);\\n document.getElementById('kpiRoas').textContent = fmt(o.overall_roas, 2)+'×';\\n document.getElementById('kpiPurchases').textContent = fmtNum(o.total_purchases);\\n document.getElementById('kpiClicks').textContent = fmtNum(o.total_clicks);\\n document.getElementById('kpiImpressions').textContent = fmtNum(o.total_impressions);\\n document.getElementById('kpiCpc').textContent = '¥'+fmt(o.overall_cpc, 2);\\n document.getElementById('kpiCtr').textContent = fmt(o.overall_ctr, 2)+'%';\\n}\\n\\n// ============ ECHARTS THEME \u0026 COLOR PALETTE ============\\n// 赛博霓虹科技风统一色谱 — 所有图表共用\\nconst PALETTE = {\\n // 语义色 · 霓虹光效\\n spend: '#ff2d95', // 霓虹粉 — 支出/成本\\n revenue: '#00f0ff', // 霓虹青 — 收入/正向\\n roas: '#0088ff', // 霓虹蓝 — ROAS/回报\\n purchase: '#7b2ff7', // 霓虹紫 — 购买/转化\\n clicks: '#00ff88', // 霓虹绿 — 点击\\n // 4平台色 (霓虹光谱)\\n platform: ['#00f0ff', '#0088ff', '#7b2ff7', '#ff2d95'],\\n // 渐变辅助\\n spendGradient: ['rgba(255,45,149,0.3)', 'rgba(255,45,149,0.01)'],\\n revenueGradient:['rgba(0,240,255,0.3)', 'rgba(0,240,255,0.01)'],\\n purchaseGradient:['rgba(123,47,247,0.25)', 'rgba(123,47,247,0.01)'],\\n roasGradient: ['rgba(0,136,255,0.25)', 'rgba(0,136,255,0.01)'],\\n};\\n\\nconst chartTheme = {\\n axisColor: 'rgba(0,200,255,0.08)',\\n axisLabelColor: 'rgba(128,176,208,0.8)',\\n axisNameColor: 'rgba(64,96,128,0.7)',\\n splitColor: 'rgba(0,200,255,0.04)',\\n tooltipBg: 'rgba(0,8,20,0.95)',\\n tooltipBorder: 'rgba(0,200,255,0.25)',\\n tooltipShadow: '0 0 20px rgba(0,200,255,0.1)',\\n};\\n\\n// ============ CHART RENDERERS ============\\nfunction renderAllCharts(data) {\\n renderDailyTrend(data.daily_trend);\\n renderPlatformRoas(data.by_platform);\\n renderPlatformCompare(data.by_platform);\\n renderCampaignCompare(data.by_campaign);\\n renderDailyPlatform(data.daily_by_platform);\\n renderDetailTable(data.by_platform_campaign);\\n}\\n\\nfunction renderDailyTrend(daily) {\\n const chart = echarts.init(document.getElementById('chartDailyTrend'));\\n const dates = daily.map(d =\u003e d.date.substring(5, 10));\\n const spend = daily.map(d =\u003e d.ad_spend);\\n const revenue = daily.map(d =\u003e d.sales_revenue);\\n const maxVal = Math.max(...spend, ...revenue);\\n chart.setOption({\\n tooltip: {\\n trigger: 'axis',\\n backgroundColor: chartTheme.tooltipBg,\\n borderColor: chartTheme.tooltipBorder,\\n borderWidth: 1,\\n textStyle: { color: '#f1f5f9', fontSize: 12 },\\n formatter: function(p) {\\n let s = '\u003cstrong style=\\\"color:#f1f5f9\\\"\u003e'+p[0].axisValue+'\u003c/strong\u003e\u003cbr/\u003e';\\n p.forEach(d =\u003e { s += d.marker + ' ' + d.seriesName + ': \u003cstrong\u003e¥' + Number(d.value).toLocaleString() + '\u003c/strong\u003e\u003cbr/\u003e'; });\\n return s;\\n }\\n },\\n legend: { bottom: 0, icon: 'circle', itemWidth: 8, itemHeight: 8, textStyle: { color: '#94a3b8', fontSize: 11 } },\\n grid: { left: 55, right: 20, top: 15, bottom: 40 },\\n xAxis: {\\n type: 'category', data: dates,\\n axisLine: { lineStyle: { color: chartTheme.axisColor } },\\n axisLabel: { color: chartTheme.axisLabelColor, fontSize: 10 },\\n axisTick: { show: false }\\n },\\n yAxis: {\\n type: 'value', max: maxVal * 1.15,\\n name: '金额 (¥)',\\n nameTextStyle: { color: chartTheme.axisNameColor, fontSize: 10 },\\n axisLine: { show: false },\\n axisLabel: { color: chartTheme.axisLabelColor, fontSize: 10, formatter: v =\u003e v \u003e= 10000 ? (v/10000)+'万' : v },\\n splitLine: { lineStyle: { color: chartTheme.splitColor, type: 'dashed' } }\\n },\\n series: [\\n {\\n name: '广告支出', type: 'line', smooth: true, symbol: 'circle', symbolSize: 6,\\n data: spend,\\n lineStyle: { width: 2.5, color: PALETTE.spend },\\n itemStyle: { color: PALETTE.spend },\\n areaStyle: { color: { type: 'linear', x: 0, y: 0, x2: 0, y2: 1, colorStops: [{ offset: 0, color: PALETTE.spendGradient[0] }, { offset: 1, color: PALETTE.spendGradient[1] }] } }\\n },\\n {\\n name: '销售收入', type: 'line', smooth: true, symbol: 'circle', symbolSize: 6,\\n data: revenue,\\n lineStyle: { width: 2.5, color: PALETTE.revenue },\\n itemStyle: { color: PALETTE.revenue },\\n areaStyle: { color: { type: 'linear', x: 0, y: 0, x2: 0, y2: 1, colorStops: [{ offset: 0, color: PALETTE.revenueGradient[0] }, { offset: 1, color: PALETTE.revenueGradient[1] }] } }\\n }\\n ]\\n });\\n window.addEventListener('resize', () =\u003e chart.resize());\\n}\\n\\nfunction renderPlatformRoas(platforms) {\\n const chart = echarts.init(document.getElementById('chartPlatformRoas'));\\n const names = platforms.map(p =\u003e p.platform.replace(' Ads', ''));\\n const roas = platforms.map(p =\u003e p.roas);\\n const colors = PALETTE.platform;\\n chart.setOption({\\n tooltip: {\\n trigger: 'axis',\\n backgroundColor: chartTheme.tooltipBg,\\n borderColor: chartTheme.tooltipBorder,\\n textStyle: { color: '#f1f5f9', fontSize: 12 },\\n formatter: p =\u003e '\u003cstrong\u003e'+p[0].name+'\u003c/strong\u003e\u003cbr/\u003eROAS: \u003cstrong\u003e'+p[0].value+'×\u003c/strong\u003e'\\n },\\n grid: { left: 40, right: 15, top: 15, bottom: 30 },\\n xAxis: {\\n type: 'category', data: names,\\n axisLine: { lineStyle: { color: chartTheme.axisColor } },\\n axisLabel: { color: chartTheme.axisLabelColor, fontSize: 10, fontWeight: '500' },\\n axisTick: { show: false }\\n },\\n yAxis: {\\n type: 'value', name: 'ROAS (×)',\\n nameTextStyle: { color: chartTheme.axisNameColor, fontSize: 10 },\\n axisLine: { show: false },\\n axisLabel: { color: chartTheme.axisLabelColor, fontSize: 10 },\\n splitLine: { lineStyle: { color: chartTheme.splitColor, type: 'dashed' } }\\n },\\n series: [{\\n type: 'bar',\\n data: roas.map((v, i) =\u003e ({\\n value: v,\\n itemStyle: { color: colors[i], borderRadius: [4,4,0,0] }\\n })),\\n barWidth: '55%',\\n label: {\\n show: true, position: 'top',\\n formatter: p =\u003e p.value + '×',\\n fontSize: 11, fontWeight: '700',\\n color: '#94a3b8'\\n }\\n }]\\n });\\n window.addEventListener('resize', () =\u003e chart.resize());\\n}\\n\\nfunction renderPlatformCompare(platforms) {\\n const chart = echarts.init(document.getElementById('chartPlatformCompare'));\\n const names = platforms.map(p =\u003e p.platform.replace(' Ads', ''));\\n const spend = platforms.map(p =\u003e p.ad_spend);\\n const revenue = platforms.map(p =\u003e p.sales_revenue);\\n const maxV = Math.max(...spend, ...revenue);\\n chart.setOption({\\n tooltip: {\\n trigger: 'axis', axisPointer: { type: 'shadow' },\\n backgroundColor: chartTheme.tooltipBg,\\n borderColor: chartTheme.tooltipBorder,\\n textStyle: { color: '#f1f5f9', fontSize: 12 },\\n formatter: function(p) {\\n let s = '\u003cstrong\u003e'+p[0].axisValue+'\u003c/strong\u003e\u003cbr/\u003e';\\n p.forEach(d =\u003e { s += d.marker + ' ' + d.seriesName + ': \u003cstrong\u003e¥' + Number(d.value).toLocaleString() + '\u003c/strong\u003e\u003cbr/\u003e'; });\\n return s;\\n }\\n },\\n legend: { bottom: 0, icon: 'circle', itemWidth: 8, itemHeight: 8, textStyle: { color: '#94a3b8', fontSize: 11 } },\\n grid: { left: 50, right: 20, top: 10, bottom: 40 },\\n xAxis: {\\n type: 'category', data: names,\\n axisLine: { lineStyle: { color: chartTheme.axisColor } },\\n axisLabel: { color: chartTheme.axisLabelColor, fontSize: 10, fontWeight: '500' },\\n axisTick: { show: false }\\n },\\n yAxis: {\\n type: 'value', max: maxV * 1.2,\\n name: '金额 (¥)',\\n nameTextStyle: { color: chartTheme.axisNameColor, fontSize: 10 },\\n axisLine: { show: false },\\n axisLabel: { color: chartTheme.axisLabelColor, fontSize: 10, formatter: v =\u003e v \u003e= 10000 ? (v/10000)+'万' : v },\\n splitLine: { lineStyle: { color: chartTheme.splitColor, type: 'dashed' } }\\n },\\n series: [\\n { name: '广告支出', type: 'bar', data: spend, barWidth: '30%', barGap: '15%',\\n itemStyle: { color: PALETTE.spend, borderRadius: [4,4,0,0] },\\n label: { show: true, position: 'top', formatter: p =\u003e p.value \u003e= 10000 ? (p.value/10000).toFixed(1)+'万' : p.value, fontSize: 9, color: '#94a3b8' } },\\n { name: '销售收入', type: 'bar', data: revenue, barWidth: '30%',\\n itemStyle: { color: PALETTE.revenue, borderRadius: [4,4,0,0] },\\n label: { show: true, position: 'top', formatter: p =\u003e p.value \u003e= 10000 ? (p.value/10000).toFixed(1)+'万' : p.value, fontSize: 9, color: '#94a3b8' } }\\n ]\\n });\\n window.addEventListener('resize', () =\u003e chart.resize());\\n}\\n\\nfunction renderCampaignCompare(campaigns) {\\n const chart = echarts.init(document.getElementById('chartCampaignCompare'));\\n const names = campaigns.map(c =\u003e c.campaign_type);\\n const purchases = campaigns.map(c =\u003e c.purchases);\\n const roas = campaigns.map(c =\u003e c.roas);\\n chart.setOption({\\n tooltip: {\\n trigger: 'axis', axisPointer: { type: 'shadow' },\\n backgroundColor: chartTheme.tooltipBg,\\n borderColor: chartTheme.tooltipBorder,\\n textStyle: { color: '#f1f5f9', fontSize: 12 },\\n formatter: function(p) {\\n let s = '\u003cstrong\u003e'+p[0].axisValue+'\u003c/strong\u003e\u003cbr/\u003e';\\n p.forEach(d =\u003e {\\n if (d.seriesName === '购买数') s += d.marker + ' 购买: \u003cstrong\u003e' + Number(d.value).toLocaleString() + '\u003c/strong\u003e\u003cbr/\u003e';\\n else s += d.marker + ' ROAS: \u003cstrong\u003e' + d.value + '×\u003c/strong\u003e\u003cbr/\u003e';\\n });\\n return s;\\n }\\n },\\n legend: { bottom: 0, icon: 'circle', itemWidth: 8, itemHeight: 8, textStyle: { color: '#94a3b8', fontSize: 11 } },\\n grid: { left: 50, right: 50, top: 10, bottom: 40 },\\n xAxis: {\\n type: 'category', data: names,\\n axisLine: { lineStyle: { color: chartTheme.axisColor } },\\n axisLabel: { color: chartTheme.axisLabelColor, fontSize: 9, rotate: 12, fontWeight: '500' },\\n axisTick: { show: false }\\n },\\n yAxis: [\\n {\\n type: 'value', name: '购买数',\\n nameTextStyle: { color: chartTheme.axisNameColor, fontSize: 10 },\\n axisLine: { show: false },\\n axisLabel: { color: chartTheme.axisLabelColor, fontSize: 10, formatter: v =\u003e v \u003e= 10000 ? (v/10000)+'万' : v },\\n splitLine: { lineStyle: { color: chartTheme.splitColor, type: 'dashed' } }\\n },\\n {\\n type: 'value', name: 'ROAS (×)',\\n nameTextStyle: { color: chartTheme.axisNameColor, fontSize: 10 },\\n axisLine: { show: false },\\n axisLabel: { color: chartTheme.axisLabelColor, fontSize: 10 },\\n splitLine: { show: false }\\n }\\n ],\\n series: [\\n {\\n name: '购买数', type: 'bar', data: purchases, barWidth: '35%',\\n itemStyle: { color: PALETTE.purchase, borderRadius: [4,4,0,0] },\\n label: { show: true, position: 'top', formatter: p =\u003e p.value, fontSize: 9, color: '#a78bfa', fontWeight: '600' }\\n },\\n {\\n name: 'ROAS', type: 'line', yAxisIndex: 1,\\n data: roas, symbol: 'diamond', symbolSize: 10,\\n lineStyle: { color: PALETTE.roas, width: 2.5 },\\n itemStyle: { color: PALETTE.roas, borderColor: PALETTE.roas, borderWidth: 2 },\\n label: { show: true, formatter: p =\u003e p.value + '×', fontSize: 10, fontWeight: '700', color: '#ffb800' }\\n }\\n ]\\n });\\n window.addEventListener('resize', () =\u003e chart.resize());\\n}\\n\\nfunction renderDailyPlatform(dailyByPlatform) {\\n const chart = echarts.init(document.getElementById('chartDailyPlatform'));\\n const agg = {};\\n dailyByPlatform.forEach(d =\u003e {\\n const key = d.date + '|' + d.platform;\\n if (!agg[key]) agg[key] = { date: d.date, platform: d.platform, spend: 0, revenue: 0 };\\n agg[key].spend += d.spend;\\n agg[key].revenue += d.revenue;\\n });\\n const aggArr = Object.values(agg);\\n const platforms = ['Meta Ads', 'Google Ads', 'YouTube Ads', 'TikTok Ads'];\\n const pShort = ['Meta', 'Google', 'YouTube', 'TikTok'];\\n const datesFull = [...new Set(aggArr.map(d =\u003e d.date))].sort();\\n const dates = datesFull.map(d =\u003e d.substring(5, 10));\\n const colors = PALETTE.platform;\\n const series = platforms.map((plat, idx) =\u003e {\\n const data = datesFull.map(d =\u003e {\\n const found = aggArr.find(item =\u003e item.date === d \u0026\u0026 item.platform === plat);\\n return found ? found.spend : 0;\\n });\\n return {\\n name: pShort[idx], type: 'bar', stack: 'total', barWidth: '60%',\\n data: data,\\n itemStyle: { color: colors[idx], borderRadius: 0 },\\n emphasis: { itemStyle: { color: colors[idx] } }\\n };\\n });\\n chart.setOption({\\n tooltip: {\\n trigger: 'axis', axisPointer: { type: 'shadow' },\\n backgroundColor: chartTheme.tooltipBg,\\n borderColor: chartTheme.tooltipBorder,\\n textStyle: { color: '#f1f5f9', fontSize: 12 },\\n formatter: function(p) {\\n let s = '\u003cstrong\u003e'+p[0].axisValue+'\u003c/strong\u003e\u003cbr/\u003e';\\n let total = 0;\\n p.forEach(d =\u003e { total += d.value; s += d.marker + ' ' + d.seriesName + ': ¥' + Number(d.value).toLocaleString() + '\u003cbr/\u003e'; });\\n s += '\u003chr style=\\\"margin:4px 0;border-color:rgba(255,255,255,0.1)\\\"\u003e合计: \u003cstrong\u003e¥' + total.toLocaleString() + '\u003c/strong\u003e';\\n return s;\\n }\\n },\\n legend: { bottom: 0, icon: 'circle', itemWidth: 8, itemHeight: 8, textStyle: { color: '#94a3b8', fontSize: 11 } },\\n grid: { left: 55, right: 20, top: 10, bottom: 40 },\\n xAxis: {\\n type: 'category', data: dates,\\n axisLine: { lineStyle: { color: chartTheme.axisColor } },\\n axisLabel: { color: chartTheme.axisLabelColor, fontSize: 10 },\\n axisTick: { show: false }\\n },\\n yAxis: {\\n type: 'value', name: '广告支出 (¥)',\\n nameTextStyle: { color: chartTheme.axisNameColor, fontSize: 10 },\\n axisLine: { show: false },\\n axisLabel: { color: chartTheme.axisLabelColor, fontSize: 10, formatter: v =\u003e v \u003e= 10000 ? (v/10000)+'万' : v },\\n splitLine: { lineStyle: { color: chartTheme.splitColor, type: 'dashed' } }\\n },\\n series: series\\n });\\n window.addEventListener('resize', () =\u003e chart.resize());\\n}\\n\\nfunction renderDetailTable(data) {\\n const tbody = document.getElementById('detailTableBody');\\n tbody.innerHTML = '';\\n data.forEach(d =\u003e {\\n const roas = d.sales_revenue / d.ad_spend;\\n const cpc = d.ad_spend / d.clicks;\\n const ctr = (d.clicks / d.impressions) * 100;\\n const tr = document.createElement('tr');\\n tr.innerHTML = `\\n \u003ctd\u003e\u003cspan class=\\\"tag-platform\\\"\u003e${d.platform}\u003c/span\u003e\u003c/td\u003e\\n \u003ctd\u003e\u003cspan class=\\\"tag-campaign tag-custom\\\"\u003e${d.campaign_type}\u003c/span\u003e\u003c/td\u003e\\n \u003ctd\u003e${fmtMoney(d.ad_spend)}\u003c/td\u003e\\n \u003ctd\u003e${fmtMoney(d.sales_revenue)}\u003c/td\u003e\\n \u003ctd\u003e${fmtNum(d.purchases)}\u003c/td\u003e\\n \u003ctd\u003e${fmtNum(d.clicks)}\u003c/td\u003e\\n \u003ctd\u003e${fmtNum(d.impressions)}\u003c/td\u003e\\n \u003ctd\u003e\u003cspan class=\\\"tag-custom tag-roas\\\"\u003e${fmt(roas, 2)}×\u003c/span\u003e\u003c/td\u003e\\n \u003ctd\u003e\u003cspan class=\\\"tag-custom tag-cpc\\\"\u003e¥${fmt(cpc, 2)}\u003c/span\u003e\u003c/td\u003e\\n \u003ctd\u003e\u003cspan class=\\\"tag-custom tag-ctr\\\"\u003e${fmt(ctr, 2)}%\u003c/span\u003e\u003c/td\u003e\\n `;\\n tbody.appendChild(tr);\\n });\\n}\\n\\n// ============ FILTER LOGIC (基于RAW_DAILY原始数据逐行过滤) ============\\nfunction buildFilteredData(rows) {\\n // rows: [{date, platform, campaign_type, ad_spend, impressions, clicks, purchases, sales_revenue}]\\n\\n // --- KPIs ---\\n const tot = {\\n total_spend: rows.reduce((s, r) =\u003e s + r.ad_spend, 0),\\n total_revenue: rows.reduce((s, r) =\u003e s + r.sales_revenue, 0),\\n total_purchases: rows.reduce((s, r) =\u003e s + r.purchases, 0),\\n total_clicks: rows.reduce((s, r) =\u003e s + r.clicks, 0),\\n total_impressions: rows.reduce((s, r) =\u003e s + r.impressions, 0)\\n };\\n tot.overall_roas = tot.total_revenue / (tot.total_spend || 1);\\n tot.overall_cpc = tot.total_spend / (tot.total_clicks || 1);\\n tot.overall_ctr = (tot.total_clicks / (tot.total_impressions || 1)) * 100;\\n tot.overall_cpm = (tot.total_spend / (tot.total_impressions || 1)) * 1000;\\n tot.overall_conversion_rate = (tot.total_purchases / (tot.total_clicks || 1)) * 100;\\n\\n // --- daily_trend ---\\n const dailyMap = {};\\n rows.forEach(r =\u003e {\\n if (!dailyMap[r.date]) dailyMap[r.date] = { date: r.date, ad_spend: 0, impressions: 0, clicks: 0, purchases: 0, sales_revenue: 0 };\\n dailyMap[r.date].ad_spend += r.ad_spend;\\n dailyMap[r.date].impressions += r.impressions;\\n dailyMap[r.date].clicks += r.clicks;\\n dailyMap[r.date].purchases += r.purchases;\\n dailyMap[r.date].sales_revenue += r.sales_revenue;\\n });\\n const daily_trend = Object.values(dailyMap).sort((a, b) =\u003e a.date.localeCompare(b.date));\\n\\n // --- by_platform ---\\n const platMap = {};\\n rows.forEach(r =\u003e {\\n if (!platMap[r.platform]) platMap[r.platform] = { platform: r.platform, ad_spend: 0, impressions: 0, clicks: 0, purchases: 0, sales_revenue: 0, roas: 0, cpc: 0, ctr: 0, cpm: 0, conversion_rate: 0 };\\n platMap[r.platform].ad_spend += r.ad_spend;\\n platMap[r.platform].impressions += r.impressions;\\n platMap[r.platform].clicks += r.clicks;\\n platMap[r.platform].purchases += r.purchases;\\n platMap[r.platform].sales_revenue += r.sales_revenue;\\n });\\n const by_platform = Object.values(platMap).map(p =\u003e {\\n p.roas = p.sales_revenue / (p.ad_spend || 1);\\n p.cpc = p.ad_spend / (p.clicks || 1);\\n p.ctr = (p.clicks / (p.impressions || 1)) * 100;\\n p.cpm = (p.ad_spend / (p.impressions || 1)) * 1000;\\n p.conversion_rate = (p.purchases / (p.clicks || 1)) * 100;\\n return p;\\n });\\n\\n // --- by_campaign ---\\n const campMap = {};\\n rows.forEach(r =\u003e {\\n if (!campMap[r.campaign_type]) campMap[r.campaign_type] = { campaign_type: r.campaign_type, ad_spend: 0, impressions: 0, clicks: 0, purchases: 0, sales_revenue: 0, roas: 0, cpc: 0, ctr: 0, cpm: 0, conversion_rate: 0 };\\n campMap[r.campaign_type].ad_spend += r.ad_spend;\\n campMap[r.campaign_type].impressions += r.impressions;\\n campMap[r.campaign_type].clicks += r.clicks;\\n campMap[r.campaign_type].purchases += r.purchases;\\n campMap[r.campaign_type].sales_revenue += r.sales_revenue;\\n });\\n const by_campaign = Object.values(campMap).map(c =\u003e {\\n c.roas = c.sales_revenue / (c.ad_spend || 1);\\n c.cpc = c.ad_spend / (c.clicks || 1);\\n c.ctr = (c.clicks / (c.impressions || 1)) * 100;\\n c.cpm = (c.ad_spend / (c.impressions || 1)) * 1000;\\n c.conversion_rate = (c.purchases / (c.clicks || 1)) * 100;\\n return c;\\n });\\n\\n // --- daily_by_platform (spend, revenue per date+platform) ---\\n const dbpMap = {};\\n rows.forEach(r =\u003e {\\n const key = r.date + '|' + r.platform;\\n if (!dbpMap[key]) dbpMap[key] = { date: r.date, platform: r.platform, spend: 0, revenue: 0 };\\n dbpMap[key].spend += r.ad_spend;\\n dbpMap[key].revenue += r.sales_revenue;\\n });\\n const daily_by_platform = Object.values(dbpMap);\\n\\n // --- by_platform_campaign ---\\n const bpcMap = {};\\n rows.forEach(r =\u003e {\\n const key = r.platform + '|' + r.campaign_type;\\n if (!bpcMap[key]) bpcMap[key] = { platform: r.platform, campaign_type: r.campaign_type, ad_spend: 0, impressions: 0, clicks: 0, purchases: 0, sales_revenue: 0 };\\n bpcMap[key].ad_spend += r.ad_spend;\\n bpcMap[key].impressions += r.impressions;\\n bpcMap[key].clicks += r.clicks;\\n bpcMap[key].purchases += r.purchases;\\n bpcMap[key].sales_revenue += r.sales_revenue;\\n });\\n const by_platform_campaign = Object.values(bpcMap);\\n\\n return {\\n overview_totals: tot,\\n daily_trend: daily_trend,\\n by_platform: by_platform,\\n by_campaign: by_campaign,\\n daily_by_platform: daily_by_platform,\\n by_platform_campaign: by_platform_campaign\\n };\\n}\\n\\ndocument.addEventListener('DOMContentLoaded', function() {\\n renderKPI(OVERVIEW);\\n renderAllCharts(RAW);\\n document.getElementById('filterPlatform').addEventListener('change', applyFilters);\\n document.getElementById('filterCampaign').addEventListener('change', applyFilters);\\n document.getElementById('resetFilters').addEventListener('click', function() {\\n document.getElementById('filterPlatform').value = 'all';\\n document.getElementById('filterCampaign').value = 'all';\\n applyFilters();\\n });\\n});\\n\\nfunction applyFilters() {\\n const platform = document.getElementById('filterPlatform').value;\\n const campaign = document.getElementById('filterCampaign').value;\\n if (platform === 'all' \u0026\u0026 campaign === 'all') {\\n renderKPI(OVERVIEW);\\n renderAllCharts(RAW);\\n return;\\n }\\n // 从RAW_DAILY逐行过滤\\n let rows = RAW_DAILY;\\n if (platform !== 'all') {\\n rows = rows.filter(r =\u003e r.platform === platform);\\n }\\n if (campaign !== 'all') {\\n rows = rows.filter(r =\u003e r.campaign_type === campaign);\\n }\\n const filtered = buildFilteredData(rows);\\n renderKPI(filtered.overview_totals);\\n renderAllCharts(filtered);\\n}\\n\u003c/script\u003e\\n\u003cfooter\u003e\\n \u003cstyle\u003e\\n .dashboard-guide-footer-link {\\n transition: transform 0.2s ease, background-color 0.2s ease, box-shadow 0.2s ease;\\n }\\n .dashboard-guide-footer-link:hover {\\n transform: translateY(-4px);\\n background: #2f4ee8 !important;\\n box-shadow: 0 12px 24px rgba(65, 95, 255, 0.24) !important;\\n }\\n \u003c/style\u003e\\n \u003cdiv style=\\\"padding: 24px 24px 40px; text-align: center; background: transparent; color: #333; font-family: inherit;\\\"\u003e\\n \u003cdiv style=\\\"display: flex; align-items: center; width: 100%; gap: 12px; font-size: 16px; line-height: 1.6; margin-bottom: 16px;\\\"\u003e\\n \u003cspan style=\\\"display: block; height: 1px; flex: 1 1 auto; background: #8a8a8a26;\\\"\u003e\u003c/span\u003e\\n \u003cspan style=\\\"flex: 0 1 auto; min-width: 0; color: #7676767a;\\\"\u003e由 RowSpeak 提供 · 数秒内创建你的 AI 看板。\u003c/span\u003e\\n \u003cspan style=\\\"display: block; height: 1px; flex: 1 1 auto; background: #8a8a8a26;\\\"\u003e\u003c/span\u003e\\n \u003c/div\u003e\\n \u003ca class=\\\"dashboard-guide-footer-link\\\" href=\\\"https://dash.rowspeak.ai/dashboard\\\" target=\\\"_top\\\" style=\\\"display: inline-flex; align-items: center; justify-content: center; min-height: 48px; padding: 8px 16px; border-radius: 8px; background: #415fff; color: #fff; text-decoration: none; box-shadow: 0 8px 18px rgba(65, 95, 255, 0.18);\\\"\u003e\\n \u003cspan\u003e免费试用\u003c/span\u003e\\n \u003cspan style=\\\"margin-left: 4px;\\\"\u003e-\u0026gt;\u003c/span\u003e\\n \u003c/a\u003e\\n \u003c/div\u003e\\n \u003c/footer\u003e\u003c/body\u003e\\n\u003c/html\u003e\",\"dashboardHtmlPreview\":{\"title\":\"广告投放决策中心\",\"metrics\":[\"广告总支出\",\"销售收入\",\"ROAS 回报率\",\"总购买数\",\"总点击量\",\"总展示量\",\"平均 CPC\",\"平均 CTR\"]},\"html_content_version\":3}","shared":true,"updated_at":1788226629}