{"token":"36d27d90-c9ea-41ac-816f-96f1e39581ef","title":"销售案例","dashboard_str":"{\"title\":\"销售案例\",\"viewInfos\":[{\"file_name\":\"sales_demo.xlsx\",\"file_url\":\"https://excelup.kyou.ltd/uploads/2lrac31mny36/file-7af2cea0-982d-4f.xlsx\",\"id\":19896,\"hashId\":\"c76027fd13c5af43ea19672293ed5557\"}],\"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=\\\"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 * { box-sizing: border-box; }\\n body {\\n margin: 0; padding: 0;\\n background: #f0f2f5;\\n font-family: -apple-system, BlinkMacSystemFont, \\\"Segoe UI\\\", \\\"PingFang SC\\\", \\\"Microsoft YaHei\\\", sans-serif;\\n color: #1e293b;\\n }\\n /* ---- top navbar ---- */\\n .topbar {\\n background: linear-gradient(135deg, #1e3a5f, #1a56db);\\n padding: 0 2rem;\\n height: 64px;\\n display: flex;\\n align-items: center;\\n justify-content: space-between;\\n color: #fff;\\n position: sticky;\\n top: 0;\\n z-index: 100;\\n box-shadow: 0 2px 8px rgba(26,86,219,0.2);\\n }\\n .topbar-brand {\\n display: flex;\\n align-items: center;\\n gap: 12px;\\n font-size: 1.2rem;\\n font-weight: 600;\\n letter-spacing: 1px;\\n }\\n .topbar-brand .logo-icon {\\n width: 34px; height: 34px;\\n background: rgba(255,255,255,0.18);\\n border-radius: 8px;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n font-size: 1.1rem;\\n }\\n .topbar-right {\\n display: flex;\\n align-items: center;\\n gap: 16px;\\n font-size: 0.85rem;\\n opacity: 0.9;\\n }\\n .topbar-right .badge {\\n background: rgba(255,255,255,0.15);\\n padding: 4px 14px;\\n border-radius: 20px;\\n font-size: 0.75rem;\\n border: 1px solid rgba(255,255,255,0.08);\\n }\\n\\n /* ---- page layout ---- */\\n .page { max-width: 1440px; margin: 0 auto; padding: 20px 24px; }\\n\\n /* ---- filter bar ---- */\\n .filter-bar {\\n background: #fff;\\n border-radius: 12px;\\n padding: 14px 20px;\\n margin-bottom: 20px;\\n box-shadow: 0 1px 4px rgba(0,0,0,0.04);\\n display: flex;\\n flex-wrap: wrap;\\n align-items: center;\\n gap: 12px 20px;\\n }\\n .filter-group {\\n display: flex;\\n align-items: center;\\n gap: 8px;\\n min-width: 0;\\n }\\n .filter-group label {\\n font-size: 0.78rem;\\n font-weight: 500;\\n color: #555;\\n white-space: nowrap;\\n flex-shrink: 0;\\n }\\n .select-wrap {\\n position: relative;\\n display: inline-flex;\\n align-items: center;\\n }\\n .select-wrap select {\\n height: 36px;\\n border: 1px solid #d0d5dd;\\n border-radius: 8px;\\n padding: 0 32px 0 12px;\\n font-size: 0.82rem;\\n background: #fff;\\n color: #1e293b;\\n outline: none;\\n cursor: pointer;\\n transition: border-color 0.15s, box-shadow 0.15s;\\n -webkit-appearance: none;\\n -moz-appearance: none;\\n appearance: none;\\n min-width: 120px;\\n font-family: inherit;\\n }\\n .select-wrap select:focus {\\n border-color: #1a56db;\\n box-shadow: 0 0 0 3px rgba(26,86,219,0.1);\\n }\\n .select-wrap .arrow {\\n position: absolute;\\n right: 10px;\\n top: 50%;\\n transform: translateY(-50%);\\n width: 0;\\n height: 0;\\n border-left: 5px solid transparent;\\n border-right: 5px solid transparent;\\n border-top: 5px solid #888;\\n pointer-events: none;\\n transition: border-top-color 0.15s;\\n }\\n .select-wrap select:focus + .arrow { border-top-color: #1a56db; }\\n .filter-bar .btn-reset {\\n height: 36px;\\n background: #1a56db;\\n color: #fff;\\n border: none;\\n border-radius: 8px;\\n font-size: 0.82rem;\\n font-weight: 500;\\n padding: 0 18px;\\n cursor: pointer;\\n white-space: nowrap;\\n transition: background 0.15s;\\n display: inline-flex;\\n align-items: center;\\n gap: 4px;\\n font-family: inherit;\\n }\\n .filter-bar .btn-reset:hover { background: #1e3a5f; }\\n .filter-bar .spacer { flex: 1; min-width: 0; }\\n\\n /* ---- KPI row ---- */\\n .kpi-grid {\\n display: grid;\\n grid-template-columns: repeat(4, 1fr);\\n gap: 16px;\\n margin-bottom: 20px;\\n }\\n .kpi-card {\\n background: #fff;\\n border-radius: 12px;\\n padding: 18px 20px;\\n box-shadow: 0 1px 4px rgba(0,0,0,0.04);\\n position: relative;\\n overflow: hidden;\\n transition: transform 0.15s, box-shadow 0.15s;\\n }\\n .kpi-card:hover { transform: translateY(-2px); box-shadow: 0 4px 16px rgba(0,0,0,0.08); }\\n .kpi-card .kpi-accent {\\n position: absolute; top: 0; left: 0; width: 4px; height: 100%;\\n border-radius: 0 2px 2px 0;\\n }\\n .kpi-card .kpi-label { font-size: 0.75rem; font-weight: 500; color: #999; margin-bottom: 6px; }\\n .kpi-card .kpi-value { font-size: 1.6rem; font-weight: 700; line-height: 1.2; }\\n .kpi-card .kpi-sub { font-size: 0.72rem; color: #aaa; margin-top: 4px; }\\n .kpi-card .kpi-trend { font-size: 0.72rem; margin-top: 2px; }\\n\\n /* ---- chart cards ---- */\\n .chart-grid2 { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; margin-bottom: 16px; }\\n .chart-grid3 { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 16px; margin-bottom: 16px; }\\n .chart-grid-full { display: grid; grid-template-columns: 1fr; gap: 16px; margin-bottom: 16px; }\\n .chart-card {\\n background: #fff;\\n border-radius: 12px;\\n box-shadow: 0 1px 4px rgba(0,0,0,0.04);\\n overflow: hidden;\\n }\\n .chart-card .card-head {\\n padding: 14px 18px 0 18px;\\n font-size: 0.88rem;\\n font-weight: 600;\\n color: #1e293b;\\n display: flex;\\n align-items: center;\\n gap: 8px;\\n }\\n .chart-card .card-head .dot {\\n width: 8px; height: 8px; border-radius: 50%;\\n display: inline-block;\\n flex-shrink: 0;\\n }\\n .chart-card .card-body { padding: 8px 10px 10px 10px; }\\n .chart-box { width: 100%; height: 290px; }\\n .chart-box-lg { height: 340px; }\\n\\n /* ---- responsive ---- */\\n @media (max-width: 1024px) {\\n .kpi-grid { grid-template-columns: repeat(2, 1fr); }\\n .chart-grid2, .chart-grid3 { grid-template-columns: 1fr; }\\n }\\n @media (max-width: 640px) {\\n .kpi-grid { grid-template-columns: 1fr; }\\n .topbar { padding: 0 1rem; }\\n .topbar-brand { font-size: 1rem; }\\n .page { padding: 12px; }\\n .filter-bar { flex-wrap: wrap; gap: 8px; }\\n .filter-group { flex: 1 1 100%; }\\n .filter-group label { width: 3em; font-size: 0.72rem; }\\n .select-wrap select { min-width: 0; width: 100%; }\\n .filter-bar .spacer { display: none; }\\n .chart-box { height: 240px; }\\n .chart-box-lg { height: 280px; }\\n }\\n\u003c/style\u003e\\n\u003c/head\u003e\\n\u003cbody\u003e\\n\\n\u003c!-- Topbar --\u003e\\n\u003cdiv class=\\\"topbar\\\"\u003e\\n \u003cdiv class=\\\"topbar-brand\\\"\u003e\\n \u003cspan class=\\\"logo-icon\\\"\u003e📊\u003c/span\u003e\\n \u003cspan\u003e销售管理驾驶舱\u003c/span\u003e\\n \u003c/div\u003e\\n \u003cdiv class=\\\"topbar-right\\\"\u003e\\n \u003cspan class=\\\"badge\\\"\u003e2025 年度\u003c/span\u003e\\n \u003cspan\u003e👤 销售经理\u003c/span\u003e\\n \u003c/div\u003e\\n\u003c/div\u003e\\n\\n\u003c!-- Page --\u003e\\n\u003cdiv class=\\\"page\\\"\u003e\\n\\n \u003c!-- Filters --\u003e\\n \u003cdiv class=\\\"filter-bar\\\"\u003e\\n \u003cdiv class=\\\"filter-group\\\"\u003e\\n \u003clabel\u003e月份\u003c/label\u003e\\n \u003cdiv class=\\\"select-wrap\\\"\u003e\\n \u003cselect id=\\\"monthFilter\\\"\u003e\u003coption value=\\\"all\\\"\u003e全部月份\u003c/option\u003e\u003c/select\u003e\\n \u003cspan class=\\\"arrow\\\"\u003e\u003c/span\u003e\\n \u003c/div\u003e\\n \u003c/div\u003e\\n \u003cdiv class=\\\"filter-group\\\"\u003e\\n \u003clabel\u003e地区\u003c/label\u003e\\n \u003cdiv class=\\\"select-wrap\\\"\u003e\\n \u003cselect id=\\\"regionFilter\\\"\u003e\u003coption value=\\\"all\\\"\u003e全部地区\u003c/option\u003e\u003c/select\u003e\\n \u003cspan class=\\\"arrow\\\"\u003e\u003c/span\u003e\\n \u003c/div\u003e\\n \u003c/div\u003e\\n \u003cdiv class=\\\"filter-group\\\"\u003e\\n \u003clabel\u003e品类\u003c/label\u003e\\n \u003cdiv class=\\\"select-wrap\\\"\u003e\\n \u003cselect id=\\\"categoryFilter\\\"\u003e\u003coption value=\\\"all\\\"\u003e全部品类\u003c/option\u003e\u003c/select\u003e\\n \u003cspan class=\\\"arrow\\\"\u003e\u003c/span\u003e\\n \u003c/div\u003e\\n \u003c/div\u003e\\n \u003cspan class=\\\"spacer\\\"\u003e\u003c/span\u003e\\n \u003cbutton class=\\\"btn-reset\\\" id=\\\"resetFilterBtn\\\"\u003e↻ 重置\u003c/button\u003e\\n \u003c/div\u003e\\n\\n \u003c!-- KPI --\u003e\\n \u003cdiv class=\\\"kpi-grid\\\"\u003e\\n \u003cdiv class=\\\"kpi-card\\\"\u003e\\n \u003cdiv class=\\\"kpi-accent\\\" style=\\\"background:#1a56db;\\\"\u003e\u003c/div\u003e\\n \u003cdiv class=\\\"kpi-label\\\"\u003e总销售额\u003c/div\u003e\\n \u003cdiv class=\\\"kpi-value\\\" style=\\\"color:#1a56db;\\\"\u003e¥\u003cspan id=\\\"kpiRevenue\\\"\u003e0\u003c/span\u003e\u003c/div\u003e\\n \u003cdiv class=\\\"kpi-sub\\\"\u003e已完成订单金额\u003c/div\u003e\\n \u003c/div\u003e\\n \u003cdiv class=\\\"kpi-card\\\"\u003e\\n \u003cdiv class=\\\"kpi-accent\\\" style=\\\"background:#0ea5e9;\\\"\u003e\u003c/div\u003e\\n \u003cdiv class=\\\"kpi-label\\\"\u003e总订单数\u003c/div\u003e\\n \u003cdiv class=\\\"kpi-value\\\" style=\\\"color:#0ea5e9;\\\"\u003e\u003cspan id=\\\"kpiOrders\\\"\u003e0\u003c/span\u003e\u003c/div\u003e\\n \u003cdiv class=\\\"kpi-sub\\\"\u003e已完成 \u003cspan id=\\\"kpiCompleted\\\"\u003e0\u003c/span\u003e 单\u003c/div\u003e\\n \u003c/div\u003e\\n \u003cdiv class=\\\"kpi-card\\\"\u003e\\n \u003cdiv class=\\\"kpi-accent\\\" style=\\\"background:#f59e0b;\\\"\u003e\u003c/div\u003e\\n \u003cdiv class=\\\"kpi-label\\\"\u003e平均订单金额\u003c/div\u003e\\n \u003cdiv class=\\\"kpi-value\\\" style=\\\"color:#f59e0b;\\\"\u003e¥\u003cspan id=\\\"kpiAvgOrder\\\"\u003e0\u003c/span\u003e\u003c/div\u003e\\n \u003cdiv class=\\\"kpi-sub\\\"\u003e已完成订单均价\u003c/div\u003e\\n \u003c/div\u003e\\n \u003cdiv class=\\\"kpi-card\\\"\u003e\\n \u003cdiv class=\\\"kpi-accent\\\" style=\\\"background:#ef4444;\\\"\u003e\u003c/div\u003e\\n \u003cdiv class=\\\"kpi-label\\\"\u003e订单完成率\u003c/div\u003e\\n \u003cdiv class=\\\"kpi-value\\\" style=\\\"color:#ef4444;\\\"\u003e\u003cspan id=\\\"kpiCompletion\\\"\u003e0\u003c/span\u003e%\u003c/div\u003e\\n \u003cdiv class=\\\"kpi-sub\\\"\u003e退款/取消 \u003cspan id=\\\"kpiBadOrders\\\"\u003e0\u003c/span\u003e 单\u003c/div\u003e\\n \u003c/div\u003e\\n \u003c/div\u003e\\n\\n \u003c!-- Row 1: Monthly trend + Status --\u003e\\n \u003cdiv class=\\\"chart-grid2\\\"\u003e\\n \u003cdiv class=\\\"chart-card\\\"\u003e\\n \u003cdiv class=\\\"card-head\\\"\u003e\u003cspan class=\\\"dot\\\" style=\\\"background:#1a56db;\\\"\u003e\u003c/span\u003e 月度销售额 vs 目标\u003c/div\u003e\\n \u003cdiv class=\\\"card-body\\\"\u003e\u003cdiv id=\\\"chartMonthlyTrend\\\" class=\\\"chart-box chart-box-lg\\\"\u003e\u003c/div\u003e\u003c/div\u003e\\n \u003c/div\u003e\\n \u003cdiv class=\\\"chart-card\\\"\u003e\\n \u003cdiv class=\\\"card-head\\\"\u003e\u003cspan class=\\\"dot\\\" style=\\\"background:#0ea5e9;\\\"\u003e\u003c/span\u003e 订单状态分布\u003c/div\u003e\\n \u003cdiv class=\\\"card-body\\\"\u003e\u003cdiv id=\\\"chartOrderStatus\\\" class=\\\"chart-box chart-box-lg\\\"\u003e\u003c/div\u003e\u003c/div\u003e\\n \u003c/div\u003e\\n \u003c/div\u003e\\n\\n \u003c!-- Row 2: Region + Category + Channel --\u003e\\n \u003cdiv class=\\\"chart-grid3\\\"\u003e\\n \u003cdiv class=\\\"chart-card\\\"\u003e\\n \u003cdiv class=\\\"card-head\\\"\u003e\u003cspan class=\\\"dot\\\" style=\\\"background:#f59e0b;\\\"\u003e\u003c/span\u003e 各地区销售额\u003c/div\u003e\\n \u003cdiv class=\\\"card-body\\\"\u003e\u003cdiv id=\\\"chartRegion\\\" class=\\\"chart-box\\\"\u003e\u003c/div\u003e\u003c/div\u003e\\n \u003c/div\u003e\\n \u003cdiv class=\\\"chart-card\\\"\u003e\\n \u003cdiv class=\\\"card-head\\\"\u003e\u003cspan class=\\\"dot\\\" style=\\\"background:#8b5cf6;\\\"\u003e\u003c/span\u003e 各品类销售\u003c/div\u003e\\n \u003cdiv class=\\\"card-body\\\"\u003e\u003cdiv id=\\\"chartCategory\\\" class=\\\"chart-box\\\"\u003e\u003c/div\u003e\u003c/div\u003e\\n \u003c/div\u003e\\n \u003cdiv class=\\\"chart-card\\\"\u003e\\n \u003cdiv class=\\\"card-head\\\"\u003e\u003cspan class=\\\"dot\\\" style=\\\"background:#06b6d4;\\\"\u003e\u003c/span\u003e 销售渠道\u003c/div\u003e\\n \u003cdiv class=\\\"card-body\\\"\u003e\u003cdiv id=\\\"chartChannel\\\" class=\\\"chart-box\\\"\u003e\u003c/div\u003e\u003c/div\u003e\\n \u003c/div\u003e\\n \u003c/div\u003e\\n\\n \u003c!-- Row 3: Rep ranking + Top products --\u003e\\n \u003cdiv class=\\\"chart-grid2\\\"\u003e\\n \u003cdiv class=\\\"chart-card\\\"\u003e\\n \u003cdiv class=\\\"card-head\\\"\u003e\u003cspan class=\\\"dot\\\" style=\\\"background:#ef4444;\\\"\u003e\u003c/span\u003e 销售代表业绩排行\u003c/div\u003e\\n \u003cdiv class=\\\"card-body\\\"\u003e\u003cdiv id=\\\"chartSalesRep\\\" class=\\\"chart-box\\\"\u003e\u003c/div\u003e\u003c/div\u003e\\n \u003c/div\u003e\\n \u003cdiv class=\\\"chart-card\\\"\u003e\\n \u003cdiv class=\\\"card-head\\\"\u003e\u003cspan class=\\\"dot\\\" style=\\\"background:#1a56db;\\\"\u003e\u003c/span\u003e 热销产品 Top 8\u003c/div\u003e\\n \u003cdiv class=\\\"card-body\\\"\u003e\u003cdiv id=\\\"chartTopProducts\\\" class=\\\"chart-box\\\"\u003e\u003c/div\u003e\u003c/div\u003e\\n \u003c/div\u003e\\n \u003c/div\u003e\\n\\n \u003c!-- Row 4: Monthly category trend --\u003e\\n \u003cdiv class=\\\"chart-grid-full\\\"\u003e\\n \u003cdiv class=\\\"chart-card\\\"\u003e\\n \u003cdiv class=\\\"card-head\\\"\u003e\u003cspan class=\\\"dot\\\" style=\\\"background:#f59e0b;\\\"\u003e\u003c/span\u003e 各品类月度趋势\u003c/div\u003e\\n \u003cdiv class=\\\"card-body\\\"\u003e\u003cdiv id=\\\"chartMonthlyCategory\\\" class=\\\"chart-box chart-box-lg\\\"\u003e\u003c/div\u003e\u003c/div\u003e\\n \u003c/div\u003e\\n \u003c/div\u003e\\n\\n \u003c!-- Row 5: Achieve rate --\u003e\\n \u003cdiv class=\\\"chart-grid-full\\\"\u003e\\n \u003cdiv class=\\\"chart-card\\\"\u003e\\n \u003cdiv class=\\\"card-head\\\"\u003e\u003cspan class=\\\"dot\\\" style=\\\"background:#3b82f6;\\\"\u003e\u003c/span\u003e 各区域目标达成率\u003c/div\u003e\\n \u003cdiv class=\\\"card-body\\\"\u003e\u003cdiv id=\\\"chartAchieveRate\\\" class=\\\"chart-box chart-box-lg\\\"\u003e\u003c/div\u003e\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 = {\\\"kpi\\\":{\\\"total_revenue\\\":427944.43,\\\"total_orders\\\":181,\\\"completed_orders\\\":113,\\\"cancelled_refunded_orders\\\":68,\\\"avg_order_value\\\":3787.12,\\\"completion_rate\\\":62.4},\\\"monthly_sales\\\":[{\\\"month\\\":\\\"2025-01\\\",\\\"sales\\\":53166.79,\\\"target\\\":310825,\\\"achieve_rate\\\":17.1},{\\\"month\\\":\\\"2025-02\\\",\\\"sales\\\":32198.72,\\\"target\\\":354871,\\\"achieve_rate\\\":9.1},{\\\"month\\\":\\\"2025-03\\\",\\\"sales\\\":8944.4,\\\"target\\\":370552,\\\"achieve_rate\\\":2.4},{\\\"month\\\":\\\"2025-04\\\",\\\"sales\\\":31671.74,\\\"target\\\":286521,\\\"achieve_rate\\\":11.1},{\\\"month\\\":\\\"2025-05\\\",\\\"sales\\\":33731.48,\\\"target\\\":385438,\\\"achieve_rate\\\":8.8},{\\\"month\\\":\\\"2025-06\\\",\\\"sales\\\":29674.38,\\\"target\\\":358041,\\\"achieve_rate\\\":8.3},{\\\"month\\\":\\\"2025-07\\\",\\\"sales\\\":30080.93,\\\"target\\\":429567,\\\"achieve_rate\\\":7.0},{\\\"month\\\":\\\"2025-08\\\",\\\"sales\\\":17981.19,\\\"target\\\":419824,\\\"achieve_rate\\\":4.3},{\\\"month\\\":\\\"2025-09\\\",\\\"sales\\\":17005.71,\\\"target\\\":358825,\\\"achieve_rate\\\":4.7},{\\\"month\\\":\\\"2025-10\\\",\\\"sales\\\":13431.22,\\\"target\\\":359384,\\\"achieve_rate\\\":3.7},{\\\"month\\\":\\\"2025-11\\\",\\\"sales\\\":41392.39,\\\"target\\\":328350,\\\"achieve_rate\\\":12.6},{\\\"month\\\":\\\"2025-12\\\",\\\"sales\\\":118665.48,\\\"target\\\":343328,\\\"achieve_rate\\\":34.6}],\\\"monthly_sales_by_region\\\":[{\\\"month\\\":\\\"2025-01\\\",\\\"region\\\":\\\"华东\\\",\\\"sales\\\":0.0,\\\"target\\\":59520,\\\"achieve_rate\\\":0.0},{\\\"month\\\":\\\"2025-01\\\",\\\"region\\\":\\\"华中\\\",\\\"sales\\\":9538.65,\\\"target\\\":78455,\\\"achieve_rate\\\":12.2},{\\\"month\\\":\\\"2025-01\\\",\\\"region\\\":\\\"华北\\\",\\\"sales\\\":21340.8,\\\"target\\\":56018,\\\"achieve_rate\\\":38.1},{\\\"month\\\":\\\"2025-01\\\",\\\"region\\\":\\\"华南\\\",\\\"sales\\\":1610.34,\\\"target\\\":66827,\\\"achieve_rate\\\":2.4},{\\\"month\\\":\\\"2025-01\\\",\\\"region\\\":\\\"西南\\\",\\\"sales\\\":20677.0,\\\"target\\\":50005,\\\"achieve_rate\\\":41.3},{\\\"month\\\":\\\"2025-02\\\",\\\"region\\\":\\\"华东\\\",\\\"sales\\\":9613.1,\\\"target\\\":86499,\\\"achieve_rate\\\":11.1},{\\\"month\\\":\\\"2025-02\\\",\\\"region\\\":\\\"华中\\\",\\\"sales\\\":2768.97,\\\"target\\\":57707,\\\"achieve_rate\\\":4.8},{\\\"month\\\":\\\"2025-02\\\",\\\"region\\\":\\\"华北\\\",\\\"sales\\\":0.0,\\\"target\\\":79773,\\\"achieve_rate\\\":0.0},{\\\"month\\\":\\\"2025-02\\\",\\\"region\\\":\\\"华南\\\",\\\"sales\\\":19816.65,\\\"target\\\":52472,\\\"achieve_rate\\\":37.8},{\\\"month\\\":\\\"2025-02\\\",\\\"region\\\":\\\"西南\\\",\\\"sales\\\":0.0,\\\"target\\\":78420,\\\"achieve_rate\\\":0.0},{\\\"month\\\":\\\"2025-03\\\",\\\"region\\\":\\\"华东\\\",\\\"sales\\\":3325.8,\\\"target\\\":67896,\\\"achieve_rate\\\":4.9},{\\\"month\\\":\\\"2025-03\\\",\\\"region\\\":\\\"华中\\\",\\\"sales\\\":0.0,\\\"target\\\":54679,\\\"achieve_rate\\\":0.0},{\\\"month\\\":\\\"2025-03\\\",\\\"region\\\":\\\"华北\\\",\\\"sales\\\":151.05,\\\"target\\\":92669,\\\"achieve_rate\\\":0.2},{\\\"month\\\":\\\"2025-03\\\",\\\"region\\\":\\\"华南\\\",\\\"sales\\\":4242.05,\\\"target\\\":68009,\\\"achieve_rate\\\":6.2},{\\\"month\\\":\\\"2025-03\\\",\\\"region\\\":\\\"西南\\\",\\\"sales\\\":1225.5,\\\"target\\\":87299,\\\"achieve_rate\\\":1.4},{\\\"month\\\":\\\"2025-04\\\",\\\"region\\\":\\\"华东\\\",\\\"sales\\\":21047.79,\\\"target\\\":60484,\\\"achieve_rate\\\":34.8},{\\\"month\\\":\\\"2025-04\\\",\\\"region\\\":\\\"华中\\\",\\\"sales\\\":2709.0,\\\"target\\\":57928,\\\"achieve_rate\\\":4.7},{\\\"month\\\":\\\"2025-04\\\",\\\"region\\\":\\\"华北\\\",\\\"sales\\\":0.0,\\\"target\\\":54597,\\\"achieve_rate\\\":0.0},{\\\"month\\\":\\\"2025-04\\\",\\\"region\\\":\\\"华南\\\",\\\"sales\\\":7914.95,\\\"target\\\":51737,\\\"achieve_rate\\\":15.3},{\\\"month\\\":\\\"2025-04\\\",\\\"region\\\":\\\"西南\\\",\\\"sales\\\":0.0,\\\"target\\\":61775,\\\"achieve_rate\\\":0.0},{\\\"month\\\":\\\"2025-05\\\",\\\"region\\\":\\\"华东\\\",\\\"sales\\\":8984.4,\\\"target\\\":56370,\\\"achieve_rate\\\":15.9},{\\\"month\\\":\\\"2025-05\\\",\\\"region\\\":\\\"华中\\\",\\\"sales\\\":21518.36,\\\"target\\\":94751,\\\"achieve_rate\\\":22.7},{\\\"month\\\":\\\"2025-05\\\",\\\"region\\\":\\\"华北\\\",\\\"sales\\\":774.0,\\\"target\\\":55018,\\\"achieve_rate\\\":1.4},{\\\"month\\\":\\\"2025-05\\\",\\\"region\\\":\\\"华南\\\",\\\"sales\\\":916.32,\\\"target\\\":84478,\\\"achieve_rate\\\":1.1},{\\\"month\\\":\\\"2025-05\\\",\\\"region\\\":\\\"西南\\\",\\\"sales\\\":1538.4,\\\"target\\\":94821,\\\"achieve_rate\\\":1.6},{\\\"month\\\":\\\"2025-06\\\",\\\"region\\\":\\\"华东\\\",\\\"sales\\\":2635.13,\\\"target\\\":87959,\\\"achieve_rate\\\":3.0},{\\\"month\\\":\\\"2025-06\\\",\\\"region\\\":\\\"华中\\\",\\\"sales\\\":1196.0,\\\"target\\\":77382,\\\"achieve_rate\\\":1.5},{\\\"month\\\":\\\"2025-06\\\",\\\"region\\\":\\\"华北\\\",\\\"sales\\\":2374.05,\\\"target\\\":56609,\\\"achieve_rate\\\":4.2},{\\\"month\\\":\\\"2025-06\\\",\\\"region\\\":\\\"华南\\\",\\\"sales\\\":3721.55,\\\"target\\\":49938,\\\"achieve_rate\\\":7.5},{\\\"month\\\":\\\"2025-06\\\",\\\"region\\\":\\\"西南\\\",\\\"sales\\\":19747.65,\\\"target\\\":86153,\\\"achieve_rate\\\":22.9},{\\\"month\\\":\\\"2025-07\\\",\\\"region\\\":\\\"华东\\\",\\\"sales\\\":1277.1,\\\"target\\\":75405,\\\"achieve_rate\\\":1.7},{\\\"month\\\":\\\"2025-07\\\",\\\"region\\\":\\\"华中\\\",\\\"sales\\\":3162.32,\\\"target\\\":82976,\\\"achieve_rate\\\":3.8},{\\\"month\\\":\\\"2025-07\\\",\\\"region\\\":\\\"华北\\\",\\\"sales\\\":2226.0,\\\"target\\\":81944,\\\"achieve_rate\\\":2.7},{\\\"month\\\":\\\"2025-07\\\",\\\"region\\\":\\\"华南\\\",\\\"sales\\\":20024.01,\\\"target\\\":94443,\\\"achieve_rate\\\":21.2},{\\\"month\\\":\\\"2025-07\\\",\\\"region\\\":\\\"西南\\\",\\\"sales\\\":3391.5,\\\"target\\\":94799,\\\"achieve_rate\\\":3.6},{\\\"month\\\":\\\"2025-08\\\",\\\"region\\\":\\\"华东\\\",\\\"sales\\\":2033.2,\\\"target\\\":74419,\\\"achieve_rate\\\":2.7},{\\\"month\\\":\\\"2025-08\\\",\\\"region\\\":\\\"华中\\\",\\\"sales\\\":1345.0,\\\"target\\\":86634,\\\"achieve_rate\\\":1.6},{\\\"month\\\":\\\"2025-08\\\",\\\"region\\\":\\\"华北\\\",\\\"sales\\\":550.16,\\\"target\\\":81994,\\\"achieve_rate\\\":0.7},{\\\"month\\\":\\\"2025-08\\\",\\\"region\\\":\\\"华南\\\",\\\"sales\\\":10816.43,\\\"target\\\":89638,\\\"achieve_rate\\\":12.1},{\\\"month\\\":\\\"2025-08\\\",\\\"region\\\":\\\"西南\\\",\\\"sales\\\":3236.4,\\\"target\\\":87139,\\\"achieve_rate\\\":3.7},{\\\"month\\\":\\\"2025-09\\\",\\\"region\\\":\\\"华东\\\",\\\"sales\\\":2795.95,\\\"target\\\":85928,\\\"achieve_rate\\\":3.3},{\\\"month\\\":\\\"2025-09\\\",\\\"region\\\":\\\"华中\\\",\\\"sales\\\":9582.56,\\\"target\\\":54893,\\\"achieve_rate\\\":17.5},{\\\"month\\\":\\\"2025-09\\\",\\\"region\\\":\\\"华北\\\",\\\"sales\\\":4309.2,\\\"target\\\":86105,\\\"achieve_rate\\\":5.0},{\\\"month\\\":\\\"2025-09\\\",\\\"region\\\":\\\"华南\\\",\\\"sales\\\":318.0,\\\"target\\\":66181,\\\"achieve_rate\\\":0.5},{\\\"month\\\":\\\"2025-09\\\",\\\"region\\\":\\\"西南\\\",\\\"sales\\\":0.0,\\\"target\\\":65718,\\\"achieve_rate\\\":0.0},{\\\"month\\\":\\\"2025-10\\\",\\\"region\\\":\\\"华东\\\",\\\"sales\\\":4607.6,\\\"target\\\":73820,\\\"achieve_rate\\\":6.2},{\\\"month\\\":\\\"2025-10\\\",\\\"region\\\":\\\"华中\\\",\\\"sales\\\":3416.24,\\\"target\\\":86378,\\\"achieve_rate\\\":4.0},{\\\"month\\\":\\\"2025-10\\\",\\\"region\\\":\\\"华北\\\",\\\"sales\\\":2645.82,\\\"target\\\":75731,\\\"achieve_rate\\\":3.5},{\\\"month\\\":\\\"2025-10\\\",\\\"region\\\":\\\"华南\\\",\\\"sales\\\":0.0,\\\"target\\\":49475,\\\"achieve_rate\\\":0.0},{\\\"month\\\":\\\"2025-10\\\",\\\"region\\\":\\\"西南\\\",\\\"sales\\\":2761.56,\\\"target\\\":73980,\\\"achieve_rate\\\":3.7},{\\\"month\\\":\\\"2025-11\\\",\\\"region\\\":\\\"华东\\\",\\\"sales\\\":3522.24,\\\"target\\\":64845,\\\"achieve_rate\\\":5.4},{\\\"month\\\":\\\"2025-11\\\",\\\"region\\\":\\\"华中\\\",\\\"sales\\\":1219.05,\\\"target\\\":68064,\\\"achieve_rate\\\":1.8},{\\\"month\\\":\\\"2025-11\\\",\\\"region\\\":\\\"华北\\\",\\\"sales\\\":19216.5,\\\"target\\\":83759,\\\"achieve_rate\\\":22.9},{\\\"month\\\":\\\"2025-11\\\",\\\"region\\\":\\\"华南\\\",\\\"sales\\\":8214.2,\\\"target\\\":63001,\\\"achieve_rate\\\":13.0},{\\\"month\\\":\\\"2025-11\\\",\\\"region\\\":\\\"西南\\\",\\\"sales\\\":9220.4,\\\"target\\\":48681,\\\"achieve_rate\\\":18.9},{\\\"month\\\":\\\"2025-12\\\",\\\"region\\\":\\\"华东\\\",\\\"sales\\\":108626.28,\\\"target\\\":78248,\\\"achieve_rate\\\":138.8},{\\\"month\\\":\\\"2025-12\\\",\\\"region\\\":\\\"华中\\\",\\\"sales\\\":2781.2,\\\"target\\\":74616,\\\"achieve_rate\\\":3.7},{\\\"month\\\":\\\"2025-12\\\",\\\"region\\\":\\\"华北\\\",\\\"sales\\\":0.0,\\\"target\\\":65342,\\\"achieve_rate\\\":0.0},{\\\"month\\\":\\\"2025-12\\\",\\\"region\\\":\\\"华南\\\",\\\"sales\\\":7258.0,\\\"target\\\":49862,\\\"achieve_rate\\\":14.6},{\\\"month\\\":\\\"2025-12\\\",\\\"region\\\":\\\"西南\\\",\\\"sales\\\":0.0,\\\"target\\\":75260,\\\"achieve_rate\\\":0.0}],\\\"sales_by_region\\\":[{\\\"region\\\":\\\"华东\\\",\\\"sales\\\":168468.59},{\\\"region\\\":\\\"华中\\\",\\\"sales\\\":59237.35},{\\\"region\\\":\\\"华北\\\",\\\"sales\\\":53587.58},{\\\"region\\\":\\\"华南\\\",\\\"sales\\\":84852.5},{\\\"region\\\":\\\"西南\\\",\\\"sales\\\":61798.41}],\\\"sales_by_category\\\":[{\\\"品类\\\":\\\"办公家具\\\",\\\"sales\\\":302050.96,\\\"order_count\\\":26},{\\\"品类\\\":\\\"数码配件\\\",\\\"sales\\\":38598.34,\\\"order_count\\\":30},{\\\"品类\\\":\\\"智能穿戴\\\",\\\"sales\\\":40985.28,\\\"order_count\\\":15},{\\\"品类\\\":\\\"生活电器\\\",\\\"sales\\\":46309.85,\\\"order_count\\\":42}],\\\"sales_by_channel\\\":[{\\\"销售渠道\\\":\\\"企业直销\\\",\\\"sales\\\":190257.38,\\\"order_count\\\":30},{\\\"销售渠道\\\":\\\"线上商城\\\",\\\"sales\\\":78818.15,\\\"order_count\\\":26},{\\\"销售渠道\\\":\\\"线下门店\\\",\\\"sales\\\":83207.99,\\\"order_count\\\":32},{\\\"销售渠道\\\":\\\"经销商\\\",\\\"sales\\\":75660.91,\\\"order_count\\\":25}],\\\"sales_by_product\\\":[{\\\"产品名称\\\":\\\"人体工学椅\\\",\\\"品类\\\":\\\"办公家具\\\",\\\"sales\\\":187162.81,\\\"quantity\\\":218.0},{\\\"产品名称\\\":\\\"升降桌\\\",\\\"品类\\\":\\\"办公家具\\\",\\\"sales\\\":114888.15,\\\"quantity\\\":76.0},{\\\"产品名称\\\":\\\"运动手环\\\",\\\"品类\\\":\\\"智能穿戴\\\",\\\"sales\\\":40985.28,\\\"quantity\\\":113.0},{\\\"产品名称\\\":\\\"蓝牙耳机\\\",\\\"品类\\\":\\\"数码配件\\\",\\\"sales\\\":29508.31,\\\"quantity\\\":107.0},{\\\"产品名称\\\":\\\"智能台灯\\\",\\\"品类\\\":\\\"生活电器\\\",\\\"sales\\\":19946.35,\\\"quantity\\\":78.0},{\\\"产品名称\\\":\\\"便携榨汁杯\\\",\\\"品类\\\":\\\"生活电器\\\",\\\"sales\\\":14180.74,\\\"quantity\\\":77.0},{\\\"产品名称\\\":\\\"智能水杯\\\",\\\"品类\\\":\\\"生活电器\\\",\\\"sales\\\":12182.76,\\\"quantity\\\":104.0},{\\\"产品名称\\\":\\\"无线键盘\\\",\\\"品类\\\":\\\"数码配件\\\",\\\"sales\\\":9090.03,\\\"quantity\\\":66.0}],\\\"monthly_sales_by_category\\\":[{\\\"月份\\\":\\\"2025-01\\\",\\\"品类\\\":\\\"办公家具\\\",\\\"销售额\\\":39865.0},{\\\"月份\\\":\\\"2025-01\\\",\\\"品类\\\":\\\"数码配件\\\",\\\"销售额\\\":6536.14},{\\\"月份\\\":\\\"2025-01\\\",\\\"品类\\\":\\\"智能穿戴\\\",\\\"销售额\\\":4389.0},{\\\"月份\\\":\\\"2025-01\\\",\\\"品类\\\":\\\"生活电器\\\",\\\"销售额\\\":2376.65},{\\\"月份\\\":\\\"2025-02\\\",\\\"品类\\\":\\\"办公家具\\\",\\\"销售额\\\":25022.6},{\\\"月份\\\":\\\"2025-02\\\",\\\"品类\\\":\\\"数码配件\\\",\\\"销售额\\\":1779.05},{\\\"月份\\\":\\\"2025-02\\\",\\\"品类\\\":\\\"智能穿戴\\\",\\\"销售额\\\":2374.05},{\\\"月份\\\":\\\"2025-02\\\",\\\"品类\\\":\\\"生活电器\\\",\\\"销售额\\\":3023.02},{\\\"月份\\\":\\\"2025-03\\\",\\\"品类\\\":\\\"数码配件\\\",\\\"销售额\\\":3077.05},{\\\"月份\\\":\\\"2025-03\\\",\\\"品类\\\":\\\"生活电器\\\",\\\"销售额\\\":5867.35},{\\\"月份\\\":\\\"2025-04\\\",\\\"品类\\\":\\\"办公家具\\\",\\\"销售额\\\":17272.95},{\\\"月份\\\":\\\"2025-04\\\",\\\"品类\\\":\\\"数码配件\\\",\\\"销售额\\\":2990.0},{\\\"月份\\\":\\\"2025-04\\\",\\\"品类\\\":\\\"智能穿戴\\\",\\\"销售额\\\":7441.35},{\\\"月份\\\":\\\"2025-04\\\",\\\"品类\\\":\\\"生活电器\\\",\\\"销售额\\\":3967.44},{\\\"月份\\\":\\\"2025-05\\\",\\\"品类\\\":\\\"办公家具\\\",\\\"销售额\\\":28113.4},{\\\"月份\\\":\\\"2025-05\\\",\\\"品类\\\":\\\"数码配件\\\",\\\"销售额\\\":1281.56},{\\\"月份\\\":\\\"2025-05\\\",\\\"品类\\\":\\\"生活电器\\\",\\\"销售额\\\":4336.52},{\\\"月份\\\":\\\"2025-06\\\",\\\"品类\\\":\\\"办公家具\\\",\\\"销售额\\\":19747.65},{\\\"月份\\\":\\\"2025-06\\\",\\\"品类\\\":\\\"数码配件\\\",\\\"销售额\\\":5960.68},{\\\"月份\\\":\\\"2025-06\\\",\\\"品类\\\":\\\"智能穿戴\\\",\\\"销售额\\\":2374.05},{\\\"月份\\\":\\\"2025-06\\\",\\\"品类\\\":\\\"生活电器\\\",\\\"销售额\\\":1592.0},{\\\"月份\\\":\\\"2025-07\\\",\\\"品类\\\":\\\"办公家具\\\",\\\"销售额\\\":9514.05},{\\\"月份\\\":\\\"2025-07\\\",\\\"品类\\\":\\\"数码配件\\\",\\\"销售额\\\":6461.96},{\\\"月份\\\":\\\"2025-07\\\",\\\"品类\\\":\\\"智能穿戴\\\",\\\"销售额\\\":8179.5},{\\\"月份\\\":\\\"2025-07\\\",\\\"品类\\\":\\\"生活电器\\\",\\\"销售额\\\":5925.42},{\\\"月份\\\":\\\"2025-08\\\",\\\"品类\\\":\\\"办公家具\\\",\\\"销售额\\\":13869.75},{\\\"月份\\\":\\\"2025-08\\\",\\\"品类\\\":\\\"数码配件\\\",\\\"销售额\\\":2583.36},{\\\"月份\\\":\\\"2025-08\\\",\\\"品类\\\":\\\"生活电器\\\",\\\"销售额\\\":1528.08},{\\\"月份\\\":\\\"2025-09\\\",\\\"品类\\\":\\\"办公家具\\\",\\\"销售额\\\":7587.56},{\\\"月份\\\":\\\"2025-09\\\",\\\"品类\\\":\\\"数码配件\\\",\\\"销售额\\\":318.0},{\\\"月份\\\":\\\"2025-09\\\",\\\"品类\\\":\\\"智能穿戴\\\",\\\"销售额\\\":6304.2},{\\\"月份\\\":\\\"2025-09\\\",\\\"品类\\\":\\\"生活电器\\\",\\\"销售额\\\":2795.95},{\\\"月份\\\":\\\"2025-10\\\",\\\"品类\\\":\\\"数码配件\\\",\\\"销售额\\\":2161.4},{\\\"月份\\\":\\\"2025-10\\\",\\\"品类\\\":\\\"智能穿戴\\\",\\\"销售额\\\":5027.4},{\\\"月份\\\":\\\"2025-10\\\",\\\"品类\\\":\\\"生活电器\\\",\\\"销售额\\\":6242.42},{\\\"月份\\\":\\\"2025-11\\\",\\\"品类\\\":\\\"办公家具\\\",\\\"销售额\\\":32458.8},{\\\"月份\\\":\\\"2025-11\\\",\\\"品类\\\":\\\"数码配件\\\",\\\"销售额\\\":4304.34},{\\\"月份\\\":\\\"2025-11\\\",\\\"品类\\\":\\\"生活电器\\\",\\\"销售额\\\":4629.25},{\\\"月份\\\":\\\"2025-12\\\",\\\"品类\\\":\\\"办公家具\\\",\\\"销售额\\\":108599.2},{\\\"月份\\\":\\\"2025-12\\\",\\\"品类\\\":\\\"数码配件\\\",\\\"销售额\\\":1144.8},{\\\"月份\\\":\\\"2025-12\\\",\\\"品类\\\":\\\"智能穿戴\\\",\\\"销售额\\\":4895.73},{\\\"月份\\\":\\\"2025-12\\\",\\\"品类\\\":\\\"生活电器\\\",\\\"销售额\\\":4025.75}],\\\"sales_rep_performance\\\":[{\\\"销售代表\\\":\\\"赵敏\\\",\\\"sales\\\":180568.86,\\\"completed_orders\\\":23,\\\"orders\\\":37},{\\\"销售代表\\\":\\\"王强\\\",\\\"sales\\\":76083.17,\\\"completed_orders\\\":23,\\\"orders\\\":40},{\\\"销售代表\\\":\\\"张伟\\\",\\\"sales\\\":66666.54,\\\"completed_orders\\\":26,\\\"orders\\\":37},{\\\"销售代表\\\":\\\"李娜\\\",\\\"sales\\\":53519.16,\\\"completed_orders\\\":21,\\\"orders\\\":31},{\\\"销售代表\\\":\\\"陈晨\\\",\\\"sales\\\":51106.7,\\\"completed_orders\\\":20,\\\"orders\\\":36}],\\\"top_customers\\\":[{\\\"客户名称\\\":\\\"成都青禾商贸\\\",\\\"地区\\\":\\\"华东\\\",\\\"sales\\\":108777.91,\\\"orders\\\":8},{\\\"客户名称\\\":\\\"福州明德电商\\\",\\\"地区\\\":\\\"华北\\\",\\\"sales\\\":42452.17,\\\"orders\\\":7},{\\\"客户名称\\\":\\\"青岛东方零售\\\",\\\"地区\\\":\\\"西南\\\",\\\"sales\\\":31264.31,\\\"orders\\\":7},{\\\"客户名称\\\":\\\"北京启明咨询\\\",\\\"地区\\\":\\\"华南\\\",\\\"sales\\\":30787.45,\\\"orders\\\":8},{\\\"客户名称\\\":\\\"无锡创想办公\\\",\\\"地区\\\":\\\"西南\\\",\\\"sales\\\":30534.1,\\\"orders\\\":7},{\\\"客户名称\\\":\\\"苏州万象办公\\\",\\\"地区\\\":\\\"华中\\\",\\\"sales\\\":26547.2,\\\"orders\\\":10},{\\\"客户名称\\\":\\\"天津新航道\\\",\\\"地区\\\":\\\"华南\\\",\\\"sales\\\":23187.08,\\\"orders\\\":8},{\\\"客户名称\\\":\\\"长沙乐享生活\\\",\\\"地区\\\":\\\"华东\\\",\\\"sales\\\":20702.05,\\\"orders\\\":5},{\\\"客户名称\\\":\\\"西安云起科技\\\",\\\"地区\\\":\\\"华中\\\",\\\"sales\\\":18260.5,\\\"orders\\\":10},{\\\"客户名称\\\":\\\"宁波和悦贸易\\\",\\\"地区\\\":\\\"华南\\\",\\\"sales\\\":18152.62,\\\"orders\\\":6},{\\\"客户名称\\\":\\\"佛山联创家居\\\",\\\"地区\\\":\\\"华东\\\",\\\"sales\\\":12942.0,\\\"orders\\\":6},{\\\"客户名称\\\":\\\"南京优品生活\\\",\\\"地区\\\":\\\"华南\\\",\\\"sales\\\":12725.35,\\\"orders\\\":5},{\\\"客户名称\\\":\\\"杭州清源电商\\\",\\\"地区\\\":\\\"华东\\\",\\\"sales\\\":12584.59,\\\"orders\\\":5},{\\\"客户名称\\\":\\\"武汉远景零售\\\",\\\"地区\\\":\\\"华中\\\",\\\"sales\\\":7923.41,\\\"orders\\\":4},{\\\"客户名称\\\":\\\"上海星河贸易\\\",\\\"地区\\\":\\\"华东\\\",\\\"sales\\\":7283.0,\\\"orders\\\":3}],\\\"order_status_distribution\\\":[{\\\"status\\\":\\\"已完成\\\",\\\"count\\\":113},{\\\"status\\\":\\\"已取消\\\",\\\"count\\\":37},{\\\"status\\\":\\\"已退款\\\",\\\"count\\\":31}],\\\"months\\\":[\\\"2025-01\\\",\\\"2025-02\\\",\\\"2025-03\\\",\\\"2025-04\\\",\\\"2025-05\\\",\\\"2025-06\\\",\\\"2025-07\\\",\\\"2025-08\\\",\\\"2025-09\\\",\\\"2025-10\\\",\\\"2025-11\\\",\\\"2025-12\\\"],\\\"regions\\\":[\\\"华东\\\",\\\"华南\\\",\\\"华北\\\",\\\"西南\\\",\\\"华中\\\"],\\\"categories\\\":[\\\"办公家具\\\",\\\"数码配件\\\",\\\"智能穿戴\\\",\\\"生活电器\\\"],\\\"channels\\\":[\\\"企业直销\\\",\\\"线上商城\\\",\\\"线下门店\\\",\\\"经销商\\\"],\\\"sales_reps\\\":[\\\"张伟\\\",\\\"李娜\\\",\\\"王强\\\",\\\"赵敏\\\",\\\"陈晨\\\"],\\\"monthly_target_summary\\\":[{\\\"month\\\":\\\"2025-01\\\",\\\"target_total\\\":310825},{\\\"month\\\":\\\"2025-02\\\",\\\"target_total\\\":354871},{\\\"month\\\":\\\"2025-03\\\",\\\"target_total\\\":370552},{\\\"month\\\":\\\"2025-04\\\",\\\"target_total\\\":286521},{\\\"month\\\":\\\"2025-05\\\",\\\"target_total\\\":385438},{\\\"month\\\":\\\"2025-06\\\",\\\"target_total\\\":358041},{\\\"month\\\":\\\"2025-07\\\",\\\"target_total\\\":429567},{\\\"month\\\":\\\"2025-08\\\",\\\"target_total\\\":419824},{\\\"month\\\":\\\"2025-09\\\",\\\"target_total\\\":358825},{\\\"month\\\":\\\"2025-10\\\",\\\"target_total\\\":359384},{\\\"month\\\":\\\"2025-11\\\",\\\"target_total\\\":328350},{\\\"month\\\":\\\"2025-12\\\",\\\"target_total\\\":343328}],\\\"orders_by_region\\\":[{\\\"region\\\":\\\"华东\\\",\\\"total\\\":44,\\\"completed\\\":29,\\\"cancelled_refunded\\\":15},{\\\"region\\\":\\\"华南\\\",\\\"total\\\":41,\\\"completed\\\":27,\\\"cancelled_refunded\\\":14},{\\\"region\\\":\\\"华北\\\",\\\"total\\\":25,\\\"completed\\\":16,\\\"cancelled_refunded\\\":9},{\\\"region\\\":\\\"西南\\\",\\\"total\\\":27,\\\"completed\\\":14,\\\"cancelled_refunded\\\":13},{\\\"region\\\":\\\"华中\\\",\\\"total\\\":43,\\\"completed\\\":27,\\\"cancelled_refunded\\\":16}],\\\"orders_by_month\\\":[{\\\"month\\\":\\\"2025-01\\\",\\\"total\\\":15,\\\"completed\\\":11,\\\"cancelled_refunded\\\":4},{\\\"month\\\":\\\"2025-02\\\",\\\"total\\\":17,\\\"completed\\\":8,\\\"cancelled_refunded\\\":9},{\\\"month\\\":\\\"2025-03\\\",\\\"total\\\":12,\\\"completed\\\":6,\\\"cancelled_refunded\\\":6},{\\\"month\\\":\\\"2025-04\\\",\\\"total\\\":13,\\\"completed\\\":10,\\\"cancelled_refunded\\\":3},{\\\"month\\\":\\\"2025-05\\\",\\\"total\\\":18,\\\"completed\\\":11,\\\"cancelled_refunded\\\":7},{\\\"month\\\":\\\"2025-06\\\",\\\"total\\\":12,\\\"completed\\\":9,\\\"cancelled_refunded\\\":3},{\\\"month\\\":\\\"2025-07\\\",\\\"total\\\":14,\\\"completed\\\":11,\\\"cancelled_refunded\\\":3},{\\\"month\\\":\\\"2025-08\\\",\\\"total\\\":15,\\\"completed\\\":6,\\\"cancelled_refunded\\\":9},{\\\"month\\\":\\\"2025-09\\\",\\\"total\\\":11,\\\"completed\\\":8,\\\"cancelled_refunded\\\":3},{\\\"month\\\":\\\"2025-10\\\",\\\"total\\\":16,\\\"completed\\\":10,\\\"cancelled_refunded\\\":6},{\\\"month\\\":\\\"2025-11\\\",\\\"total\\\":18,\\\"completed\\\":12,\\\"cancelled_refunded\\\":6},{\\\"month\\\":\\\"2025-12\\\",\\\"total\\\":20,\\\"completed\\\":11,\\\"cancelled_refunded\\\":9}],\\\"orders_by_category\\\":[{\\\"category\\\":\\\"办公家具\\\",\\\"total\\\":44,\\\"completed\\\":26,\\\"cancelled_refunded\\\":18},{\\\"category\\\":\\\"数码配件\\\",\\\"total\\\":46,\\\"completed\\\":30,\\\"cancelled_refunded\\\":16},{\\\"category\\\":\\\"智能穿戴\\\",\\\"total\\\":28,\\\"completed\\\":15,\\\"cancelled_refunded\\\":13},{\\\"category\\\":\\\"生活电器\\\",\\\"total\\\":63,\\\"completed\\\":42,\\\"cancelled_refunded\\\":21}],\\\"orders_by_region_month\\\":[{\\\"month\\\":\\\"2025-01\\\",\\\"region\\\":\\\"华东\\\",\\\"total\\\":2,\\\"completed\\\":0,\\\"cancelled_refunded\\\":2},{\\\"month\\\":\\\"2025-01\\\",\\\"region\\\":\\\"华南\\\",\\\"total\\\":3,\\\"completed\\\":3,\\\"cancelled_refunded\\\":0},{\\\"month\\\":\\\"2025-01\\\",\\\"region\\\":\\\"华北\\\",\\\"total\\\":3,\\\"completed\\\":2,\\\"cancelled_refunded\\\":1},{\\\"month\\\":\\\"2025-01\\\",\\\"region\\\":\\\"西南\\\",\\\"total\\\":3,\\\"completed\\\":2,\\\"cancelled_refunded\\\":1},{\\\"month\\\":\\\"2025-01\\\",\\\"region\\\":\\\"华中\\\",\\\"total\\\":4,\\\"completed\\\":4,\\\"cancelled_refunded\\\":0},{\\\"month\\\":\\\"2025-02\\\",\\\"region\\\":\\\"华东\\\",\\\"total\\\":3,\\\"completed\\\":3,\\\"cancelled_refunded\\\":0},{\\\"month\\\":\\\"2025-02\\\",\\\"region\\\":\\\"华南\\\",\\\"total\\\":6,\\\"completed\\\":3,\\\"cancelled_refunded\\\":3},{\\\"month\\\":\\\"2025-02\\\",\\\"region\\\":\\\"华北\\\",\\\"total\\\":1,\\\"completed\\\":0,\\\"cancelled_refunded\\\":1},{\\\"month\\\":\\\"2025-02\\\",\\\"region\\\":\\\"西南\\\",\\\"total\\\":3,\\\"completed\\\":0,\\\"cancelled_refunded\\\":3},{\\\"month\\\":\\\"2025-02\\\",\\\"region\\\":\\\"华中\\\",\\\"total\\\":4,\\\"completed\\\":2,\\\"cancelled_refunded\\\":2},{\\\"month\\\":\\\"2025-03\\\",\\\"region\\\":\\\"华东\\\",\\\"total\\\":3,\\\"completed\\\":2,\\\"cancelled_refunded\\\":1},{\\\"month\\\":\\\"2025-03\\\",\\\"region\\\":\\\"华南\\\",\\\"total\\\":3,\\\"completed\\\":2,\\\"cancelled_refunded\\\":1},{\\\"month\\\":\\\"2025-03\\\",\\\"region\\\":\\\"华北\\\",\\\"total\\\":1,\\\"completed\\\":1,\\\"cancelled_refunded\\\":0},{\\\"month\\\":\\\"2025-03\\\",\\\"region\\\":\\\"西南\\\",\\\"total\\\":3,\\\"completed\\\":1,\\\"cancelled_refunded\\\":2},{\\\"month\\\":\\\"2025-03\\\",\\\"region\\\":\\\"华中\\\",\\\"total\\\":2,\\\"completed\\\":0,\\\"cancelled_refunded\\\":2},{\\\"month\\\":\\\"2025-04\\\",\\\"region\\\":\\\"华东\\\",\\\"total\\\":4,\\\"completed\\\":4,\\\"cancelled_refunded\\\":0},{\\\"month\\\":\\\"2025-04\\\",\\\"region\\\":\\\"华南\\\",\\\"total\\\":4,\\\"completed\\\":4,\\\"cancelled_refunded\\\":0},{\\\"month\\\":\\\"2025-04\\\",\\\"region\\\":\\\"西南\\\",\\\"total\\\":2,\\\"completed\\\":0,\\\"cancelled_refunded\\\":2},{\\\"month\\\":\\\"2025-04\\\",\\\"region\\\":\\\"华中\\\",\\\"total\\\":3,\\\"completed\\\":2,\\\"cancelled_refunded\\\":1},{\\\"month\\\":\\\"2025-05\\\",\\\"region\\\":\\\"华东\\\",\\\"total\\\":4,\\\"completed\\\":2,\\\"cancelled_refunded\\\":2},{\\\"month\\\":\\\"2025-05\\\",\\\"region\\\":\\\"华南\\\",\\\"total\\\":5,\\\"completed\\\":2,\\\"cancelled_refunded\\\":3},{\\\"month\\\":\\\"2025-05\\\",\\\"region\\\":\\\"华北\\\",\\\"total\\\":2,\\\"completed\\\":1,\\\"cancelled_refunded\\\":1},{\\\"month\\\":\\\"2025-05\\\",\\\"region\\\":\\\"西南\\\",\\\"total\\\":2,\\\"completed\\\":2,\\\"cancelled_refunded\\\":0},{\\\"month\\\":\\\"2025-05\\\",\\\"region\\\":\\\"华中\\\",\\\"total\\\":5,\\\"completed\\\":4,\\\"cancelled_refunded\\\":1},{\\\"month\\\":\\\"2025-06\\\",\\\"region\\\":\\\"华东\\\",\\\"total\\\":3,\\\"completed\\\":3,\\\"cancelled_refunded\\\":0},{\\\"month\\\":\\\"2025-06\\\",\\\"region\\\":\\\"华南\\\",\\\"total\\\":2,\\\"completed\\\":2,\\\"cancelled_refunded\\\":0},{\\\"month\\\":\\\"2025-06\\\",\\\"region\\\":\\\"华北\\\",\\\"total\\\":2,\\\"completed\\\":1,\\\"cancelled_refunded\\\":1},{\\\"month\\\":\\\"2025-06\\\",\\\"region\\\":\\\"西南\\\",\\\"total\\\":3,\\\"completed\\\":2,\\\"cancelled_refunded\\\":1},{\\\"month\\\":\\\"2025-06\\\",\\\"region\\\":\\\"华中\\\",\\\"total\\\":2,\\\"completed\\\":1,\\\"cancelled_refunded\\\":1},{\\\"month\\\":\\\"2025-07\\\",\\\"region\\\":\\\"华东\\\",\\\"total\\\":1,\\\"completed\\\":1,\\\"cancelled_refunded\\\":0},{\\\"month\\\":\\\"2025-07\\\",\\\"region\\\":\\\"华南\\\",\\\"total\\\":4,\\\"completed\\\":4,\\\"cancelled_refunded\\\":0},{\\\"month\\\":\\\"2025-07\\\",\\\"region\\\":\\\"华北\\\",\\\"total\\\":3,\\\"completed\\\":2,\\\"cancelled_refunded\\\":1},{\\\"month\\\":\\\"2025-07\\\",\\\"region\\\":\\\"西南\\\",\\\"total\\\":2,\\\"completed\\\":1,\\\"cancelled_refunded\\\":1},{\\\"month\\\":\\\"2025-07\\\",\\\"region\\\":\\\"华中\\\",\\\"total\\\":4,\\\"completed\\\":3,\\\"cancelled_refunded\\\":1},{\\\"month\\\":\\\"2025-08\\\",\\\"region\\\":\\\"华东\\\",\\\"total\\\":4,\\\"completed\\\":1,\\\"cancelled_refunded\\\":3},{\\\"month\\\":\\\"2025-08\\\",\\\"region\\\":\\\"华南\\\",\\\"total\\\":4,\\\"completed\\\":2,\\\"cancelled_refunded\\\":2},{\\\"month\\\":\\\"2025-08\\\",\\\"region\\\":\\\"华北\\\",\\\"total\\\":4,\\\"completed\\\":1,\\\"cancelled_refunded\\\":3},{\\\"month\\\":\\\"2025-08\\\",\\\"region\\\":\\\"西南\\\",\\\"total\\\":1,\\\"completed\\\":1,\\\"cancelled_refunded\\\":0},{\\\"month\\\":\\\"2025-08\\\",\\\"region\\\":\\\"华中\\\",\\\"total\\\":2,\\\"completed\\\":1,\\\"cancelled_refunded\\\":1},{\\\"month\\\":\\\"2025-09\\\",\\\"region\\\":\\\"华东\\\",\\\"total\\\":4,\\\"completed\\\":3,\\\"cancelled_refunded\\\":1},{\\\"month\\\":\\\"2025-09\\\",\\\"region\\\":\\\"华南\\\",\\\"total\\\":3,\\\"completed\\\":1,\\\"cancelled_refunded\\\":2},{\\\"month\\\":\\\"2025-09\\\",\\\"region\\\":\\\"华北\\\",\\\"total\\\":1,\\\"completed\\\":1,\\\"cancelled_refunded\\\":0},{\\\"month\\\":\\\"2025-09\\\",\\\"region\\\":\\\"华中\\\",\\\"total\\\":3,\\\"completed\\\":3,\\\"cancelled_refunded\\\":0},{\\\"month\\\":\\\"2025-10\\\",\\\"region\\\":\\\"华东\\\",\\\"total\\\":5,\\\"completed\\\":2,\\\"cancelled_refunded\\\":3},{\\\"month\\\":\\\"2025-10\\\",\\\"region\\\":\\\"华北\\\",\\\"total\\\":3,\\\"completed\\\":3,\\\"cancelled_refunded\\\":0},{\\\"month\\\":\\\"2025-10\\\",\\\"region\\\":\\\"西南\\\",\\\"total\\\":5,\\\"completed\\\":3,\\\"cancelled_refunded\\\":2},{\\\"month\\\":\\\"2025-10\\\",\\\"region\\\":\\\"华中\\\",\\\"total\\\":3,\\\"completed\\\":2,\\\"cancelled_refunded\\\":1},{\\\"month\\\":\\\"2025-11\\\",\\\"region\\\":\\\"华东\\\",\\\"total\\\":2,\\\"completed\\\":2,\\\"cancelled_refunded\\\":0},{\\\"month\\\":\\\"2025-11\\\",\\\"region\\\":\\\"华南\\\",\\\"total\\\":3,\\\"completed\\\":2,\\\"cancelled_refunded\\\":1},{\\\"month\\\":\\\"2025-11\\\",\\\"region\\\":\\\"华北\\\",\\\"total\\\":4,\\\"completed\\\":4,\\\"cancelled_refunded\\\":0},{\\\"month\\\":\\\"2025-11\\\",\\\"region\\\":\\\"西南\\\",\\\"total\\\":3,\\\"completed\\\":2,\\\"cancelled_refunded\\\":1},{\\\"month\\\":\\\"2025-11\\\",\\\"region\\\":\\\"华中\\\",\\\"total\\\":5,\\\"completed\\\":2,\\\"cancelled_refunded\\\":3},{\\\"month\\\":\\\"2025-12\\\",\\\"region\\\":\\\"华东\\\",\\\"total\\\":9,\\\"completed\\\":6,\\\"cancelled_refunded\\\":3},{\\\"month\\\":\\\"2025-12\\\",\\\"region\\\":\\\"华南\\\",\\\"total\\\":4,\\\"completed\\\":2,\\\"cancelled_refunded\\\":2},{\\\"month\\\":\\\"2025-12\\\",\\\"region\\\":\\\"华北\\\",\\\"total\\\":1,\\\"completed\\\":0,\\\"cancelled_refunded\\\":1},{\\\"month\\\":\\\"2025-12\\\",\\\"region\\\":\\\"华中\\\",\\\"total\\\":6,\\\"completed\\\":3,\\\"cancelled_refunded\\\":3}]};\\n/* DATA_END */\\n\\n(function() {\\n const data = DASHBOARD_DATA;\\n let filters = { month: 'all', region: 'all', category: 'all' };\\n\\n // ---- Populate filters ----\\n const monthSel = document.getElementById('monthFilter');\\n const regionSel = document.getElementById('regionFilter');\\n const categorySel = document.getElementById('categoryFilter');\\n data.months.forEach(m =\u003e {\\n const o = document.createElement('option');\\n o.value = m; o.textContent = m.replace('2025-', '') + '月';\\n monthSel.appendChild(o);\\n });\\n data.regions.forEach(r =\u003e {\\n const o = document.createElement('option');\\n o.value = r; o.textContent = r;\\n regionSel.appendChild(o);\\n });\\n data.categories.forEach(c =\u003e {\\n const o = document.createElement('option');\\n o.value = c; o.textContent = c;\\n categorySel.appendChild(o);\\n });\\n\\n // ---- Filter helpers ----\\n function getFilteredMonthlySales() {\\n let rows = data.monthly_sales_by_region;\\n if (filters.region !== 'all') rows = rows.filter(r =\u003e r.region === filters.region);\\n if (filters.month !== 'all') rows = rows.filter(r =\u003e r.month === filters.month);\\n const map = {};\\n rows.forEach(r =\u003e {\\n if (!map[r.month]) map[r.month] = { month: r.month, sales: 0, target: 0 };\\n map[r.month].sales += r.sales;\\n map[r.month].target += r.target;\\n });\\n return Object.values(map).map(d =\u003e {\\n d.achieve_rate = d.target \u003e 0 ? Math.round(d.sales / d.target * 1000) / 10 : 0;\\n d.sales = Math.round(d.sales * 100) / 100;\\n return d;\\n }).sort((a, b) =\u003e a.month.localeCompare(b.month));\\n }\\n\\n function getFilteredOrders() {\\n // Use orders_by_region_month for region+month filtering\\n // Use orders_by_category for category filtering\\n let rows = data.orders_by_region_month || [];\\n if (filters.region !== 'all') rows = rows.filter(r =\u003e r.region === filters.region);\\n if (filters.month !== 'all') rows = rows.filter(r =\u003e r.month === filters.month);\\n\\n let total = rows.reduce((s, r) =\u003e s + r.total, 0);\\n let completed = rows.reduce((s, r) =\u003e s + r.completed, 0);\\n let cancelled = rows.reduce((s, r) =\u003e s + r.cancelled_refunded, 0);\\n\\n // If only category filter is active, use category data\\n if (filters.category !== 'all' \u0026\u0026 filters.region === 'all' \u0026\u0026 filters.month === 'all') {\\n const catRow = data.orders_by_category.find(c =\u003e c.category === filters.category);\\n if (catRow) {\\n total = catRow.total;\\n completed = catRow.completed;\\n cancelled = catRow.cancelled_refunded;\\n }\\n }\\n // If category + other filters, estimate proportionally\\n else if (filters.category !== 'all') {\\n const catRow = data.orders_by_category.find(c =\u003e c.category === filters.category);\\n if (catRow) {\\n const ratio = catRow.total / data.kpi.total_orders;\\n total = Math.round(total * ratio);\\n completed = Math.round(completed * ratio);\\n cancelled = Math.round(cancelled * ratio);\\n }\\n }\\n\\n return { total, completed, cancelled_refunded: cancelled };\\n }\\n\\n function getFilteredRevenue() {\\n let rows = data.monthly_sales_by_region;\\n if (filters.region !== 'all') rows = rows.filter(r =\u003e r.region === filters.region);\\n if (filters.month !== 'all') rows = rows.filter(r =\u003e r.month === filters.month);\\n // Category filter: use monthly_sales_by_category\\n let rev = rows.reduce((s, r) =\u003e s + r.sales, 0);\\n if (filters.category !== 'all') {\\n const catRows = data.monthly_sales_by_category.filter(c =\u003e c['品类'] === filters.category);\\n let catRev = catRows.reduce((s, r) =\u003e s + r['销售额'], 0);\\n rev = catRev;\\n }\\n return Math.round(rev * 100) / 100;\\n }\\n\\n function getFilteredMonthlyRegionAchieve() {\\n let rows = data.monthly_sales_by_region;\\n if (filters.region !== 'all') rows = rows.filter(r =\u003e r.region === filters.region);\\n if (filters.month !== 'all') rows = rows.filter(r =\u003e r.month === filters.month);\\n return rows;\\n }\\n\\n function getFilteredMonthlyCategory() {\\n let rows = data.monthly_sales_by_category;\\n if (filters.category !== 'all') rows = rows.filter(r =\u003e r['品类'] === filters.category);\\n return rows;\\n }\\n\\n // ---- KPI ----\\n function updateKPI() {\\n const rev = getFilteredRevenue();\\n const ord = getFilteredOrders();\\n document.getElementById('kpiRevenue').textContent = rev.toLocaleString('zh-CN', {minimumFractionDigits:2});\\n document.getElementById('kpiOrders').textContent = ord.total;\\n document.getElementById('kpiCompleted').textContent = ord.completed;\\n document.getElementById('kpiAvgOrder').textContent = ord.completed \u003e 0\\n ? (rev / ord.completed).toLocaleString('zh-CN', {minimumFractionDigits:2}) : '0.00';\\n const completionRate = ord.total \u003e 0 ? Math.round(ord.completed / ord.total * 1000) / 10 : 0;\\n document.getElementById('kpiCompletion').textContent = completionRate;\\n document.getElementById('kpiBadOrders').textContent = ord.cancelled_refunded;\\n }\\n\\n // ---- Charts init ----\\n const charts = {};\\n function initCharts() {\\n ['monthlyTrend','orderStatus','region','category','channel','salesRep','topProducts','monthlyCategory','achieveRate'].forEach(id =\u003e {\\n charts[id] = echarts.init(document.getElementById('chart' + id.charAt(0).toUpperCase() + id.slice(1)));\\n });\\n window.addEventListener('resize', () =\u003e Object.values(charts).forEach(c =\u003e c.resize()));\\n }\\n\\n // ---- Render functions ----\\n function renderMonthlyTrend() {\\n const d = getFilteredMonthlySales();\\n const months = d.map(r =\u003e r.month.replace('2025-', '') + '月');\\n charts.monthlyTrend.setOption({\\n tooltip: { trigger: 'axis', axisPointer: { type: 'cross' }, formatter: p =\u003e {\\n let s = '\u003cb\u003e' + p[0].axisValue + '\u003c/b\u003e\u003cbr/\u003e';\\n p.forEach(x =\u003e { s += x.marker + ' ' + x.seriesName + ': ' + (x.seriesName === '达成率' ? x.value + '%' : '¥' + x.value.toLocaleString()) + '\u003cbr/\u003e'; });\\n return s;\\n }},\\n legend: { data: ['实际销售额','销售目标','达成率'], top: 0, left: 'center', textStyle: { fontSize: 11 } },\\n grid: { top: 36, bottom: 20, left: 50, right: 50 },\\n xAxis: { type: 'category', data: months, axisLabel: { fontSize: 10 } },\\n yAxis: [\\n { type: 'value', name: '¥', nameTextStyle: { fontSize: 10 }, axisLabel: { fontSize: 9, formatter: v =\u003e v \u003e= 10000 ? (v/10000).toFixed(0) + '万' : v } },\\n { type: 'value', name: '%', nameTextStyle: { fontSize: 10 }, min: 0, max: 150, axisLabel: { fontSize: 9 }, splitLine: { show: false } }\\n ],\\n series: [\\n { name: '实际销售额', type: 'bar', data: d.map(r =\u003e r.sales), itemStyle: { color: '#1a56db', borderRadius: [4,4,0,0] }, barMaxWidth: 24, label: { show: true, position: 'top', fontSize: 9, formatter: v =\u003e v.value \u003e= 10000 ? (v.value/10000).toFixed(1) + '万' : v.value } },\\n { name: '销售目标', type: 'bar', data: d.map(r =\u003e r.target), itemStyle: { color: '#bfdbfe', borderRadius: [4,4,0,0] }, barMaxWidth: 24, label: { show: true, position: 'top', fontSize: 9, formatter: v =\u003e v.value \u003e= 10000 ? (v.value/10000).toFixed(1) + '万' : v.value } },\\n { name: '达成率', type: 'line', yAxisIndex: 1, data: d.map(r =\u003e r.achieve_rate), symbol: 'diamond', symbolSize: 8, lineStyle: { color: '#f59e0b', width: 2 }, itemStyle: { color: '#f59e0b' }, label: { show: true, fontSize: 9, formatter: '{c}%' } }\\n ]\\n });\\n }\\n\\n function renderOrderStatus() {\\n const d = data.order_status_distribution;\\n const colors = { '已完成': '#0ea5e9', '已取消': '#f59e0b', '已退款': '#ef4444' };\\n charts.orderStatus.setOption({\\n tooltip: { trigger: 'item', formatter: '{b}: {c}单 ({d}%)' },\\n legend: { orient: 'vertical', right: 10, top: 'center', textStyle: { fontSize: 11 } },\\n series: [{\\n type: 'pie', radius: ['42%', '68%'], center: ['38%', '50%'],\\n avoidLabelOverlap: true,\\n itemStyle: { borderRadius: 6, borderColor: '#fff', borderWidth: 2 },\\n label: { show: true, formatter: '{d}%', fontSize: 10 },\\n emphasis: { label: { show: true, fontSize: 14, fontWeight: 'bold' } },\\n data: d.map(x =\u003e ({ value: x.count, name: x.status, itemStyle: { color: colors[x.status] || '#999' } }))\\n }]\\n });\\n }\\n\\n function renderRegion() {\\n const d = data.sales_by_region;\\n const colors = ['#1a56db','#0ea5e9','#f59e0b','#8b5cf6','#06b6d4'];\\n charts.region.setOption({\\n tooltip: { trigger: 'item', formatter: '{b}\u003cbr/\u003e销售额: ¥{c} ({d}%)' },\\n legend: { orient: 'vertical', right: 10, top: 'center', textStyle: { fontSize: 11 } },\\n series: [{\\n type: 'pie', radius: ['35%', '60%'], center: ['38%', '50%'],\\n avoidLabelOverlap: true,\\n itemStyle: { borderRadius: 4, borderColor: '#fff', borderWidth: 1 },\\n label: { show: true, formatter: '{b}\\\\n{d}%', fontSize: 10 },\\n data: d.map((x, i) =\u003e ({ value: Math.round(x.sales), name: x.region, itemStyle: { color: colors[i] } }))\\n }]\\n });\\n }\\n\\n function renderCategory() {\\n const d = data.sales_by_category;\\n const colors = ['#1a56db','#0ea5e9','#f59e0b','#8b5cf6'];\\n charts.category.setOption({\\n tooltip: { trigger: 'axis', formatter: p =\u003e p[0].name + '\u003cbr/\u003e¥' + p[0].value.toLocaleString() },\\n grid: { top: 40, bottom: 20, left: 10, right: 20, containLabel: true },\\n xAxis: { type: 'category', data: d.map(x =\u003e x['品类']), axisLabel: { rotate: 15, fontSize: 10 } },\\n yAxis: { type: 'value', name: '¥', nameTextStyle: { fontSize: 10 }, axisLabel: { fontSize: 9, formatter: v =\u003e v \u003e= 10000 ? (v/10000).toFixed(0) + '万' : v } },\\n series: [{\\n type: 'bar', data: d.map((x, i) =\u003e ({ value: Math.round(x.sales * 100) / 100, itemStyle: { color: colors[i] } })),\\n barMaxWidth: 40, borderRadius: [4,4,0,0],\\n label: { show: true, position: 'top', fontSize: 9, formatter: v =\u003e v.value \u003e= 10000 ? (v.value/10000).toFixed(1) + '万' : v.value }\\n }]\\n });\\n }\\n\\n function renderChannel() {\\n const d = data.sales_by_channel;\\n const colors = ['#1a56db','#0ea5e9','#f59e0b','#06b6d4'];\\n charts.channel.setOption({\\n tooltip: { trigger: 'axis', formatter: p =\u003e p[0].name + '\u003cbr/\u003e¥' + p[0].value.toLocaleString() },\\n grid: { top: 40, bottom: 20, left: 10, right: 20, containLabel: true },\\n xAxis: { type: 'category', data: d.map(x =\u003e x['销售渠道']), axisLabel: { rotate: 10, fontSize: 10 } },\\n yAxis: { type: 'value', name: '¥', nameTextStyle: { fontSize: 10 }, axisLabel: { fontSize: 9, formatter: v =\u003e v \u003e= 10000 ? (v/10000).toFixed(0) + '万' : v } },\\n series: [{\\n type: 'bar', data: d.map((x, i) =\u003e ({ value: Math.round(x.sales * 100) / 100, itemStyle: { color: colors[i] } })),\\n barMaxWidth: 40, borderRadius: [4,4,0,0],\\n label: { show: true, position: 'top', fontSize: 9, formatter: v =\u003e v.value \u003e= 10000 ? (v.value/10000).toFixed(1) + '万' : v.value }\\n }]\\n });\\n }\\n\\n function renderSalesRep() {\\n const d = [...data.sales_rep_performance].sort((a, b) =\u003e b.sales - a.sales);\\n const names = d.map(x =\u003e x['销售代表']);\\n const vals = d.map(x =\u003e Math.round(x.sales * 100) / 100);\\n const colors = ['#1a56db','#0ea5e9','#f59e0b','#8b5cf6','#06b6d4'];\\n charts.salesRep.setOption({\\n tooltip: { trigger: 'axis', formatter: p =\u003e {\\n const r = d[p[0].dataIndex];\\n return r['销售代表'] + '\u003cbr/\u003e销售额: ¥' + r.sales.toLocaleString() + '\u003cbr/\u003e总订单: ' + r.orders + ' | 已完成: ' + r.completed_orders;\\n }},\\n grid: { top: 15, bottom: 20, left: 65, right: 70, containLabel: true },\\n xAxis: { type: 'value', name: '¥', nameTextStyle: { fontSize: 10 }, axisLabel: { fontSize: 9, formatter: v =\u003e v \u003e= 10000 ? (v/10000).toFixed(0) + '万' : v } },\\n yAxis: { type: 'category', data: names.slice().reverse(), axisLabel: { fontSize: 11 } },\\n series: [{\\n type: 'bar', data: vals.slice().reverse().map((v, i) =\u003e ({ value: v, itemStyle: { color: colors[vals.length - 1 - i] || '#1a56db' } })),\\n barMaxWidth: 28, borderRadius: [0,4,4,0],\\n label: { show: true, position: 'right', fontSize: 9, formatter: v =\u003e v.value \u003e= 10000 ? (v.value/10000).toFixed(1) + '万' : v.value }\\n }]\\n });\\n }\\n\\n function renderTopProducts() {\\n const d = data.sales_by_product.slice(0, 8).sort((a, b) =\u003e b.sales - a.sales);\\n const names = d.map(x =\u003e x['产品名称']);\\n const vals = d.map(x =\u003e Math.round(x.sales * 100) / 100);\\n const colors = ['#1a56db','#0ea5e9','#f59e0b','#ef4444','#8b5cf6','#06b6d4','#f59e0b','#1a56db'];\\n charts.topProducts.setOption({\\n tooltip: { trigger: 'axis', formatter: p =\u003e {\\n const r = d[p[0].dataIndex];\\n return r['产品名称'] + '\u003cbr/\u003e品类: ' + r['品类'] + '\u003cbr/\u003e销售额: ¥' + r.sales.toLocaleString() + '\u003cbr/\u003e销量: ' + r.quantity + '件';\\n }},\\n grid: { top: 15, bottom: 20, left: 70, right: 70, containLabel: true },\\n xAxis: { type: 'value', name: '¥', nameTextStyle: { fontSize: 10 }, axisLabel: { fontSize: 9, formatter: v =\u003e v \u003e= 10000 ? (v/10000).toFixed(0) + '万' : v } },\\n yAxis: { type: 'category', data: names.slice().reverse(), axisLabel: { fontSize: 10 } },\\n series: [{\\n type: 'bar', data: vals.slice().reverse().map((v, i) =\u003e ({ value: v, itemStyle: { color: colors[vals.length - 1 - i] || '#999' } })),\\n barMaxWidth: 24, borderRadius: [0,4,4,0],\\n label: { show: true, position: 'right', fontSize: 9, formatter: v =\u003e v.value \u003e= 10000 ? (v.value/10000).toFixed(1) + '万' : v.value }\\n }]\\n });\\n }\\n\\n function renderMonthlyCategory() {\\n const raw = getFilteredMonthlyCategory();\\n const cats = [...new Set(raw.map(x =\u003e x['品类']))];\\n const months = [...new Set(raw.map(x =\u003e x['月份']))].sort();\\n const monthLabels = months.map(m =\u003e m.replace('2025-', '') + '月');\\n const colorMap = { '生活电器': '#1a56db', '数码配件': '#0ea5e9', '办公家具': '#f59e0b', '智能穿戴': '#8b5cf6' };\\n const series = cats.map(cat =\u003e {\\n const map = {};\\n raw.filter(x =\u003e x['品类'] === cat).forEach(x =\u003e { map[x['月份']] = Math.round(x['销售额'] * 100) / 100; });\\n return { name: cat, type: 'line', smooth: true, data: months.map(m =\u003e map[m] || 0), symbolSize: 6, itemStyle: { color: colorMap[cat] || '#999' }, lineStyle: { color: colorMap[cat] || '#999', width: 2 } };\\n });\\n charts.monthlyCategory.setOption({\\n tooltip: { trigger: 'axis' },\\n legend: { data: cats, top: 0, left: 'center', textStyle: { fontSize: 11 } },\\n grid: { top: 35, bottom: 20, left: 50, right: 20 },\\n xAxis: { type: 'category', data: monthLabels, axisLabel: { fontSize: 10 } },\\n yAxis: { type: 'value', name: '¥', nameTextStyle: { fontSize: 10 }, axisLabel: { fontSize: 9, formatter: v =\u003e v \u003e= 10000 ? (v/10000).toFixed(0) + '万' : v } },\\n series: series\\n });\\n }\\n\\n function renderAchieveRate() {\\n const raw = getFilteredMonthlyRegionAchieve();\\n const regions = data.regions;\\n const months = [...new Set(raw.map(x =\u003e x['month']))].sort();\\n const monthLabels = months.map(m =\u003e m.replace('2025-', '') + '月');\\n const regionColors = { '华东': '#1a56db', '华南': '#0ea5e9', '华北': '#f59e0b', '西南': '#8b5cf6', '华中': '#ef4444' };\\n const series = regions.map(reg =\u003e {\\n const map = {};\\n raw.filter(x =\u003e x.region === reg).forEach(x =\u003e { map[x.month] = Math.round(x.achieve_rate * 10) / 10; });\\n return { name: reg, type: 'line', smooth: true, data: months.map(m =\u003e map[m] || 0), symbol: 'circle', symbolSize: 6, lineStyle: { width: 2, color: regionColors[reg] }, itemStyle: { color: regionColors[reg] } };\\n });\\n charts.achieveRate.setOption({\\n tooltip: { trigger: 'axis', formatter: p =\u003e {\\n let s = '\u003cb\u003e' + p[0].axisValue + '\u003c/b\u003e\u003cbr/\u003e';\\n p.forEach(x =\u003e { s += x.marker + ' ' + x.seriesName + ': ' + x.value + '%\u003cbr/\u003e'; });\\n return s;\\n }},\\n legend: { data: regions, top: 0, left: 'center', textStyle: { fontSize: 11 } },\\n grid: { top: 35, bottom: 20, left: 50, right: 20 },\\n xAxis: { type: 'category', data: monthLabels, axisLabel: { fontSize: 10 } },\\n yAxis: { type: 'value', name: '%', nameTextStyle: { fontSize: 10 }, min: 0, max: 200, axisLabel: { fontSize: 9, formatter: '{value}%' } },\\n series: series\\n });\\n }\\n\\n function renderAll() {\\n updateKPI();\\n renderMonthlyTrend();\\n renderOrderStatus();\\n renderRegion();\\n renderCategory();\\n renderChannel();\\n renderSalesRep();\\n renderTopProducts();\\n renderMonthlyCategory();\\n renderAchieveRate();\\n }\\n\\n // ---- Filter events ----\\n function onFilterChange() {\\n filters.month = monthSel.value;\\n filters.region = regionSel.value;\\n filters.category = categorySel.value;\\n renderAll();\\n }\\n monthSel.addEventListener('change', onFilterChange);\\n regionSel.addEventListener('change', onFilterChange);\\n categorySel.addEventListener('change', onFilterChange);\\n document.getElementById('resetFilterBtn').addEventListener('click', function() {\\n monthSel.value = 'all';\\n regionSel.value = 'all';\\n categorySel.value = 'all';\\n onFilterChange();\\n });\\n\\n initCharts();\\n renderAll();\\n})();\\n\u003c/script\u003e\\n\u003c/body\u003e\\n\u003c/html\u003e\",\"dashboardHtmlPreview\":{\"title\":\"销售管理驾驶舱\",\"metrics\":[\"总销售额\",\"总订单数\",\"平均订单金额\",\"订单完成率\"]},\"html_content_version\":1}","shared":true,"updated_at":1787910103}