Files
report-admin/output/era2/嘉定区/嘉一实高_报告.html
T
lofyerandfactory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com> 71db82393a Initial commit
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
2026-07-13 15:38:41 +08:00

5050 lines
231 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>嘉一实高 - 课程实施监测数据分析报告</title>
<script src="https://cdn.jsdelivr.net/npm/echarts@5/dist/echarts.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/echarts-gl@2/dist/echarts-gl.min.js"></script>
<style>
:root {
--primary: #1a56db;
--primary-light: #e8effc;
--success: #059669;
--success-light: #d1fae5;
--warning: #d97706;
--warning-light: #fef3c7;
--danger: #dc2626;
--danger-light: #fee2e2;
--gray-50: #f9fafb;
--gray-100: #f3f4f6;
--gray-200: #e5e7eb;
--gray-300: #d1d5db;
--gray-500: #6b7280;
--gray-700: #374151;
--gray-900: #111827;
}
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB",
"Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
color: var(--gray-900);
background: var(--gray-50);
line-height: 1.8;
font-size: 15px;
}
.report-container {
max-width: 1100px;
margin: 0 auto;
background: white;
box-shadow: 0 1px 3px rgba(0,0,0,0.1);
}
/* 封面 */
.cover {
text-align: center;
padding: 80px 60px;
background: linear-gradient(135deg, #1e3a5f 0%, #2563eb 100%);
color: white;
}
.cover h1 { font-size: 32px; margin-bottom: 16px; font-weight: 700; }
.cover .subtitle { font-size: 18px; opacity: 0.9; margin-bottom: 40px; }
.cover .school-name { font-size: 42px; font-weight: 700; margin: 30px 0; letter-spacing: 4px; }
.cover .date { font-size: 16px; opacity: 0.7; margin-top: 40px; }
/* 正文 */
.section { padding: 40px 60px; page-break-before: auto; }
.section h1 {
font-size: 26px; color: var(--primary); margin-bottom: 24px;
padding-bottom: 12px; border-bottom: 3px solid var(--primary);
}
.section h2 { font-size: 22px; color: var(--gray-900); margin: 28px 0 16px; }
.section h3 { font-size: 18px; color: var(--gray-700); margin: 20px 0 12px; }
.section p { margin: 10px 0; text-indent: 2em; text-align: justify; }
/* 得分卡片 */
.score-cards {
display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 16px; margin: 20px 0;
}
.score-card {
background: var(--gray-50); border-radius: 12px; padding: 20px;
text-align: center; border: 1px solid var(--gray-200);
transition: transform 0.2s, box-shadow 0.2s;
}
.score-card:hover { transform: translateY(-2px); box-shadow: 0 4px 12px rgba(0,0,0,0.08); }
.score-card .label { font-size: 13px; color: var(--gray-500); margin-bottom: 8px; }
.score-card .value { font-size: 32px; font-weight: 700; color: var(--primary); }
.score-card .diff { font-size: 13px; margin-top: 4px; }
.score-card .diff.positive { color: var(--success); }
.score-card .diff.negative { color: var(--danger); }
/* 图表容器 */
.chart-box {
width: 100%; margin: 20px 0; background: white;
border: 1px solid var(--gray-200); border-radius: 8px; padding: 16px;
}
.chart-box .chart { width: 100%; height: 400px; }
.chart-box .chart-title {
font-size: 14px; color: var(--gray-500); text-align: center;
margin-top: 8px; font-weight: 500;
}
/* 双图并排 */
.chart-row {
display: grid; grid-template-columns: 1fr 1fr; gap: 20px; margin: 20px 0;
}
.chart-row .chart-box { margin: 0; }
.chart-row .chart-box .chart { height: 350px; }
/* 三图并排 */
.chart-row-3 {
display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 16px; margin: 20px 0;
}
.chart-row-3 .chart-box { margin: 0; }
.chart-row-3 .chart-box .chart { height: 300px; }
/* ====== 金字塔水平指示器 ====== */
.pyramid-container {
display: flex; flex-direction: column; align-items: center;
margin: 16px 0; padding: 20px;
}
.pyramid-row {
position: relative;
display: flex; align-items: center; justify-content: center;
margin: 3px 0;
width: 100%;
}
.pyramid-block {
height: 38px; display: flex; align-items: center; justify-content: center;
font-weight: 700; font-size: 13px; color: white;
border-radius: 4px; transition: all 0.3s;
letter-spacing: 1px;
}
.pyramid-block.lv4 { width: 140px; background: linear-gradient(135deg, #059669, #10b981); }
.pyramid-block.lv3 { width: 200px; background: linear-gradient(135deg, #2563eb, #3b82f6); }
.pyramid-block.lv2 { width: 260px; background: linear-gradient(135deg, #d97706, #f59e0b); }
.pyramid-block.lv1 { width: 320px; background: linear-gradient(135deg, #dc2626, #ef4444); }
.pyramid-block.active {
box-shadow: 0 0 0 3px white, 0 0 0 6px var(--primary);
transform: scale(1.05); z-index: 2;
}
.pyramid-block.dimmed { opacity: 0.35; }
/* 标注用绝对定位,不影响色块居中 */
.pyramid-label {
position: absolute;
left: calc(50% + 175px); /* 最宽块320/2=160,再留15px间距 */
font-size: 13px; font-weight: 700;
color: var(--primary); white-space: nowrap;
animation: arrowPulse 1.5s infinite;
}
.pyramid-label .arrow { margin-right: 4px; }
@keyframes arrowPulse {
0%, 100% { opacity: 1; transform: translateX(0); }
50% { opacity: 0.6; transform: translateX(4px); }
}
/* 水平指示器(行内) */
.level-indicator {
display: inline-flex; align-items: center; gap: 6px;
padding: 4px 14px; border-radius: 20px; font-size: 14px; font-weight: 600;
}
.level-indicator.level-4 { background: #d1fae5; color: #065f46; }
.level-indicator.level-3 { background: #dbeafe; color: #1e40af; }
.level-indicator.level-2 { background: #fef3c7; color: #92400e; }
.level-indicator.level-1 { background: #fee2e2; color: #991b1b; }
/* 水平对比表 */
.level-table { width: 100%; border-collapse: collapse; margin: 16px 0; font-size: 14px; }
.level-table th {
background: var(--primary); color: white; padding: 10px 14px;
text-align: center; font-weight: 600;
}
.level-table td { padding: 10px 14px; text-align: center; border: 1px solid var(--gray-200); font-weight: 600; }
.level-table .lv4 { background: #d1fae5; color: #065f46; }
.level-table .lv3 { background: #dbeafe; color: #1e40af; }
.level-table .lv2 { background: #fef3c7; color: #92400e; }
.level-table .lv1 { background: #fee2e2; color: #991b1b; }
/* 表格 */
.data-table { width: 100%; border-collapse: collapse; margin: 16px 0; font-size: 14px; }
.data-table th {
background: var(--primary); color: white; padding: 10px 14px;
text-align: center; font-weight: 600;
}
.data-table td { padding: 10px 14px; text-align: center; border-bottom: 1px solid var(--gray-200); }
.data-table tr:nth-child(even) { background: var(--gray-50); }
.data-table tr:hover { background: var(--primary-light); }
/* LLM分析区域 */
.llm-analysis {
background: var(--gray-50); border-left: 4px solid var(--primary);
padding: 20px 24px; margin: 16px 0; border-radius: 0 8px 8px 0;
}
.llm-analysis p { text-indent: 2em; margin: 8px 0; }
.llm-analysis p.action-title {
text-indent: 0; margin: 18px 0 4px 0; padding: 6px 0;
border-bottom: 1px solid var(--gray-200);
font-size: 15.5px;
}
.llm-analysis p.action-title:first-child { margin-top: 0; }
.llm-analysis h3 { color: var(--primary); margin: 12px 0 8px; }
.llm-analysis h4 { color: var(--gray-700); margin: 10px 0 6px; }
.llm-analysis ul, .llm-analysis ol { margin: 8px 0 8px 2em; }
.llm-analysis li { margin: 4px 0; }
.llm-analysis strong { color: var(--primary); }
/* 图表解读说明(轻量版,紧贴图表下方) */
.chart-caption {
background: linear-gradient(135deg, #f0f4ff 0%, #f8fafc 100%);
border: 1px solid var(--gray-200);
border-top: none;
padding: 12px 18px;
margin: -4px 0 20px 0;
border-radius: 0 0 8px 8px;
font-size: 13.5px;
color: var(--gray-700);
line-height: 1.7;
}
.chart-caption::before {
content: '▎';
color: var(--primary);
font-weight: 700;
margin-right: 6px;
}
.chart-caption p {
display: inline;
margin: 0;
text-indent: 0;
}
/* 分隔线 */
.section-divider {
border: none; border-top: 2px dashed var(--gray-200);
margin: 30px 0;
}
/* 类型标签 */
.type-badge {
display: inline-flex; align-items: center; gap: 6px;
padding: 6px 16px; border-radius: 20px; font-size: 14px; font-weight: 600;
}
.type-badge.good {
background: linear-gradient(135deg, #d1fae5, #a7f3d0);
color: #065f46; border: 1px solid #6ee7b7;
}
.type-badge.neutral {
background: linear-gradient(135deg, #e0e7ff, #c7d2fe);
color: #3730a3; border: 1px solid #a5b4fc;
}
.type-badge.weak {
background: linear-gradient(135deg, #fef3c7, #fde68a);
color: #92400e; border: 1px solid #fcd34d;
}
/* ====== 右侧目录导航(极简现代风) ====== */
.toc-nav {
position: fixed;
top: 50%; right: 20px;
transform: translateY(-50%);
width: 180px;
max-height: 75vh;
overflow-y: auto;
background: rgba(255,255,255,0.85);
backdrop-filter: blur(12px);
-webkit-backdrop-filter: blur(12px);
border-radius: 12px;
padding: 14px 0;
z-index: 1000;
opacity: 0.45;
transition: opacity 0.3s, box-shadow 0.3s;
}
.toc-nav:hover {
opacity: 1;
box-shadow: 0 8px 32px rgba(0,0,0,0.08);
}
.toc-nav::-webkit-scrollbar { width: 0; }
/* 左侧细线轨道 */
.toc-track {
position: relative;
padding-left: 2px;
}
.toc-track::before {
content: '';
position: absolute; left: 14px; top: 0; bottom: 0;
width: 1.5px;
background: var(--gray-200);
}
.toc-item {
display: block;
position: relative;
padding: 4px 14px 4px 28px;
color: var(--gray-500);
text-decoration: none;
font-size: 12px;
line-height: 1.6;
transition: color 0.2s;
cursor: pointer;
}
/* 轨道上的圆点 */
.toc-item::before {
content: '';
position: absolute; left: 11px; top: 50%;
width: 5px; height: 5px;
border-radius: 50%;
background: var(--gray-300);
transform: translateY(-50%);
transition: all 0.25s;
}
.toc-item:hover { color: var(--gray-900); }
.toc-item:hover::before { background: var(--gray-500); }
.toc-item.active {
color: var(--gray-900);
font-weight: 600;
}
.toc-item.active::before {
background: var(--primary);
width: 7px; height: 7px;
box-shadow: 0 0 0 3px rgba(26,86,219,0.15);
}
.toc-item.level-1 {
font-size: 12px; font-weight: 500;
padding-top: 6px; padding-bottom: 2px;
color: var(--gray-700);
}
.toc-item.level-2 {
font-size: 11px; font-weight: 400;
padding-left: 36px;
color: var(--gray-400);
max-height: 0; overflow: hidden;
padding-top: 0; padding-bottom: 0;
transition: max-height 0.3s ease, padding 0.3s ease, opacity 0.3s;
opacity: 0;
}
.toc-item.level-2.visible {
max-height: 30px;
padding-top: 3px; padding-bottom: 3px;
opacity: 1;
}
.toc-item.level-2::before { left: 19px; width: 4px; height: 4px; }
.toc-item.level-2.active::before { width: 6px; height: 6px; }
/* 折叠按钮(如果有chat-fab则上移避让) */
.toc-toggle {
position: fixed;
bottom: 24px; right: 80px;
width: 40px; height: 40px;
background: rgba(255,255,255,0.9);
backdrop-filter: blur(8px);
color: var(--gray-700);
border: 1px solid var(--gray-200);
border-radius: 10px;
cursor: pointer; z-index: 1001;
font-size: 18px;
display: none;
align-items: center; justify-content: center;
box-shadow: 0 2px 12px rgba(0,0,0,0.06);
transition: background 0.2s, box-shadow 0.2s;
}
.toc-toggle:hover {
background: white;
box-shadow: 0 4px 16px rgba(0,0,0,0.1);
}
/* 打印样式 */
@media print {
body { background: white; }
.report-container { box-shadow: none; max-width: none; }
.section { page-break-inside: avoid; }
.chart-box { page-break-inside: avoid; }
.chart-row { grid-template-columns: 1fr 1fr; }
.toc-nav, .toc-toggle { display: none !important; }
}
@media (max-width: 1400px) {
.toc-nav { width: 160px; right: 12px; }
}
@media (max-width: 1280px) {
.toc-nav { display: none; }
.toc-toggle { display: flex; }
.toc-nav.show {
display: block; right: 12px; bottom: 72px; top: auto;
transform: none; max-height: 65vh;
opacity: 1; box-shadow: 0 8px 32px rgba(0,0,0,0.1);
}
}
@media (max-width: 768px) {
.chart-row { grid-template-columns: 1fr; }
.chart-row-3 { grid-template-columns: 1fr; }
.section { padding: 20px 24px; }
.cover { padding: 40px 24px; }
.cover .school-name { font-size: 28px; }
.toc-nav { display: none; }
.toc-toggle { display: flex; }
.toc-nav.show { display: block; width: 170px; }
}
</style>
</head>
<body>
<nav class="toc-nav" id="toc-nav"><div class="toc-track" id="toc-track"></div></nav>
<button class="toc-toggle" id="toc-toggle" onclick="document.getElementById('toc-nav').classList.toggle('show')"></button>
<div class="report-container">
<div class="cover">
<h1>课程实施监测数据分析报告</h1>
<div class="subtitle">基于学校领导力视角的七维度分析</div>
<div class="school-name">嘉一实高</div>
<div class="subtitle">嘉定区 · 区实验性示范性高中</div>
<div class="date">2026年05月08日</div>
</div>
<div class="section" id="part1">
<h1>第一部分 测评背景与实施</h1>
<h2>一、测评背景</h2>
<p>为深入贯彻《教育部关于做好普通高中新课程新教材实施工作的指导意见》(教基〔2018〕15号)、《关于新时代推进普通高中育人方式改革的指导意见》(国办发〔2019〕29号)及《基础教育课程教学改革深化行动方案》(教材厅函〔2023〕3号)等一系列国家教育政策导向,积极响应《教育部办公厅关于开展课程实施与教材使用监测工作的通知》(教材厅函〔2023〕5号)的具体要求,上海市教委积极行动,发布了针对性的政策文件,进一步强化国家课程方案的实施转化,并提出建立健全课程实施的监测与反馈机制,以循证决策为引领,持续优化与改进课程规划与实施路径。</p>
<p>学校领导力是学校发展的核心驱动力。实施管理的素养导向立意与决策质量直接影响学校课程教学的整体表现与成效。课程实施管理的重点在于学校课程管理规划与施策,以及这些决策在教学活动中的切实落地。鉴于此,我们从学校领导力视角出发,确保课程领导力、教学变革力、学生发展指导力、教师发展支持力、教育质量评估力、教育条件保障力和数字化赋能力七大维度相互协同,共同作用于学校课程实施的全局。</p>
<h2>二、测评框架</h2>
<p>本报告从学校领导力视角出发,对课程实施监测指标数据进行系统性的分析与指标再建构,构建了学校课程实施的七维度指标体系(见表1-1)。</p>
<table class="data-table">
<caption style="text-align:center; font-weight:600; margin-bottom:10px; color:var(--gray-700);">表1-1 指标体系表</caption>
<thead>
<tr><th style="width:140px;">二级维度</th><th style="width:170px;">三级维度</th><th>指标解读</th></tr>
</thead>
<tbody>
<tr>
<td rowspan="3"><strong>课程领导力</strong></td>
<td>国家标准遵循</td>
<td rowspan="3" style="text-align:left;">1.确保开齐开足国家课程;2.考察学校课程设置的合理性与多样性,包括学科类课程、校本课程、综合实践活动与劳动课程各类课程的课程安排与学生实践;3.关注核心素养导向课程的规范化建设情况</td>
</tr>
<tr><td>课程结构建设</td></tr>
<tr><td>课程规范落实</td></tr>
<tr>
<td rowspan="2"><strong>教学变革力</strong></td>
<td>教学方式变革</td>
<td rowspan="2" style="text-align:left;">1.课中教学方式革新,倡导深度学习,重视个性化教育;2.课后作业设计、管理科学高效</td>
</tr>
<tr><td>作业设计与管理变革</td></tr>
<tr>
<td rowspan="2"><strong>学生发展指导力</strong></td>
<td>学科发展的个性化辅导</td>
<td rowspan="2" style="text-align:left;">1.根据学生的特点和需要,教师进行选课指导、个性化辅导等;2.学校提供个性化的生涯指导服务,建立完善的生涯发展支持体系;3.关注学生综合素质发展</td>
</tr>
<tr><td>学生生涯发展指导</td></tr>
<tr>
<td rowspan="3"><strong>教师发展支持力</strong></td>
<td>培训支持</td>
<td rowspan="3" style="text-align:left;">1.给教师提供入职培训、在职培训以及外出学习机会;2.学校定期组织教研活动,建立教学资源库;3.给教师提供参与科研项目和研究活动的支持</td>
</tr>
<tr><td>教研支持</td></tr>
<tr><td>项目支持</td></tr>
<tr>
<td rowspan="4"><strong>教育质量评估力</strong></td>
<td>科学评价观</td>
<td rowspan="4" style="text-align:left;">1.面向学生核心素养与综合素质发展,确立科学评价观;2.关注学业质量,对标课程标准科学评价学生表现;3.关注综合素质多方面评价;4.关注学生实践活动表现</td>
</tr>
<tr><td>学业质量评估</td></tr>
<tr><td>综合素质评估</td></tr>
<tr><td>实践活动评估</td></tr>
<tr>
<td rowspan="3"><strong>教育条件保障力</strong></td>
<td>区域推进</td>
<td rowspan="3" style="text-align:left;">1.了解学校所在区域教育局对高中教育教学工作的推动情况;2.评估学校信息技术环境、教学设备、场馆设施的支持情况;3.关注学校如何统筹师资配置、校内资源、社区资源等</td>
</tr>
<tr><td>环境支持</td></tr>
<tr><td>资源支持</td></tr>
<tr>
<td rowspan="3"><strong>数字化赋能力</strong></td>
<td>教学方式创新</td>
<td rowspan="3" style="text-align:left;">1.关注数智化资源支持与赋能课程、教学、评价的情况;2.了解学校校内外的数智化资源、信息化平台与信息系统建设情况</td>
</tr>
<tr><td>评价精准化与个性化</td></tr>
<tr><td>课程迭代优化</td></tr>
</tbody>
</table>
<h2>三、测评实施</h2>
<h3>(一)测评对象</h3>
<p>本次监测面向嘉定区普通高中学校,共有11所高中学校参与本次监测。每所参与监测的高中学校,均抽取了行政管理部门的学校管理者代表(包括校长、副校长、部门主任等)、各学科教研组组长参加问卷调查。</p>
<h3>(二)测评方法</h3>
<p>基于上海市教师教育学院(上海市教委教研室)开展的中小学课程实施监测的研究框架,采用问卷调查方式采集学校课程实施信息,涵盖学校基础信息、课程实施情况和学科课程实施情况三个维度的数据。</p>
<h3>(三)数据分析</h3>
<p>数据分析流程如下:</p>
<p><strong>第一,指标体系重构。</strong>基于学校领导力视角的七维度重构维度、指标及具体题目的映射关系,形成多级指标体系。</p>
<p><strong>第二,PCA(主成分分析)合成。</strong>对问卷中的各个题目进行标准化处理,利用主成分分析方法,将多个相关变量合成为主成分,提取各三级维度得分。</p>
<p><strong>第三,标准化得分统一量纲。</strong>对PCA合成后的主成分进行标准化处理,将数据统一到均值50、标准差10的正态分布上。68.27%的样本处于[40分, 60分]区间,84.45%处于[30分, 70分],如某所学校得分为60分,意味着其表现超过了约84%的学校。</p>
<p><strong>第四,对三级维度划分水平。</strong>依据维度内涵和学校表现分布,从题目层面确定水平划分的分界点分数,对各学校划分水平1~4(见表1-2)。</p>
<p><strong>第五,聚类分析。</strong>基于标准化得分,对学校进行聚类分析,将具有相似特征的学校归为一类,识别出各维度下不同类型的学校群体。</p>
<h3>(四)三级维度水平划分</h3>
<table class="data-table" style="font-size:13px;">
<caption style="text-align:center; font-weight:600; margin-bottom:10px; color:var(--gray-700);">表1-2 三级维度水平划分表</caption>
<thead>
<tr><th>三级维度</th><th>水平4</th><th>水平3</th><th>水平2</th><th>水平1</th></tr>
</thead>
<tbody>
<tr>
<td style="text-align:left;"><strong>国家标准遵循</strong></td>
<td style="text-align:left; font-size:12px;">所有科目必修课程开齐开足,选必和选修满足要求</td>
<td style="text-align:left; font-size:12px;">考试类科目必修开齐,选必和选修满足要求</td>
<td style="text-align:left; font-size:12px;">必修未能开齐开足,选必和选修有一个满足要求</td>
<td style="text-align:left; font-size:12px;">必修未能开齐开足,选必和选修均不满足要求</td>
</tr>
<tr>
<td style="text-align:left;"><strong>课程结构建设</strong></td>
<td style="text-align:left; font-size:12px;">学科类必修课程离差总和在30%以内,总体三类课程在150%以下,校本课程和综合实践较好</td>
<td style="text-align:left; font-size:12px;">总体三类课程离差总和在250%以下,校本课程和综合实践高于平均水平</td>
<td style="text-align:left; font-size:12px;">总体三类课程离差总和在300%以下,校本课程和综合实践较差</td>
<td style="text-align:left; font-size:12px;">总体三类课程的离差和很高,校本课程和综合实践在末尾25%</td>
</tr>
<tr>
<td style="text-align:left;"><strong>课程规范落实</strong></td>
<td style="text-align:left; font-size:12px;">都有建设规范文本和档案记录</td>
<td style="text-align:left; font-size:12px;">都有建设规范文本,但过程性档案记录已经全部建成,部分有尚未使用</td>
<td style="text-align:left; font-size:12px;">部分有建设规范文本,档案大部分已经建成但未使用</td>
<td style="text-align:left; font-size:12px;">基本没有建设规范文本,档案尚未建成</td>
</tr>
<tr>
<td style="text-align:left;"><strong>教学方式变革</strong></td>
<td style="text-align:left; font-size:12px;">所有老师有共识和研究,并能够系统设计、有效实施,至少有3种常态化落实形式</td>
<td style="text-align:left; font-size:12px;">大部分老师有共识和研究,并能够落实教材中的相关要求,至少有2种常态化落实形式</td>
<td style="text-align:left; font-size:12px;">个别老师有研究,并能够偶尔引导学生开展学习,至少有1种常态化落实形式</td>
<td style="text-align:left; font-size:12px;">基本没有教学方法等相关研究,基本不组织相关学习,没有或仅有1种落实形式</td>
</tr>
<tr>
<td style="text-align:left;"><strong>作业设计与管理变革</strong></td>
<td style="text-align:left; font-size:12px;">在每类创新性作业中至少掌握3种类型,作业时长有统一控制管理,定期批改评价,有多元化属性标注</td>
<td style="text-align:left; font-size:12px;">在每类创新性作业中至少掌握2种类型,偶有时长控制管理,面批为主,有至少两种属性标注</td>
<td style="text-align:left; font-size:12px;">至少掌握1种类型或擅长某1-2种创新作业,学生自己控制时长,很少反馈,有属性标注</td>
<td style="text-align:left; font-size:12px;">擅长某种创新作业,学生自己控制时长,几乎不反馈,无属性标注</td>
</tr>
<tr>
<td style="text-align:left;"><strong>学科发展的个性化辅导</strong></td>
<td style="text-align:left; font-size:12px;">各学科平均辅导时长每周2小时以上,教师根据学情确定内容,采取个别辅导方式</td>
<td style="text-align:left; font-size:12px;">各学科平均辅导时长每周1-2小时,教师根据学情确定内容,主要个别分散辅导</td>
<td style="text-align:left; font-size:12px;">各学科平均辅导时长每周1小时以内,学生提出需求后教师辅导,分组统一或分散辅导</td>
<td style="text-align:left; font-size:12px;">辅导时长每周1小时以内或不辅导,学生提出需求后教师辅导,班级统一辅导</td>
</tr>
<tr>
<td style="text-align:left;"><strong>学生生涯发展指导</strong></td>
<td style="text-align:left; font-size:12px;">专设生涯指导课程,三年覆盖90%+学生,本校+外聘教师队伍,校内外资源足够支持</td>
<td style="text-align:left; font-size:12px;">外请讲座实施,三年覆盖70-90%学生,外聘教师队伍,校内外资源有一些支持</td>
<td style="text-align:left; font-size:12px;">与社会考察/志愿服务结合实施,三年覆盖50-70%学生,外聘教师,几乎无资源支持</td>
<td style="text-align:left; font-size:12px;">与社会考察/志愿服务结合实施,三年覆盖50%以下,未形成稳定队伍,几乎无资源支持</td>
</tr>
<tr>
<td style="text-align:left;"><strong>培训支持</strong></td>
<td style="text-align:left; font-size:12px;">各学科教师平均外出培训人数≥2.5人</td>
<td style="text-align:left; font-size:12px;">各学科教师平均外出培训人数≥1.5人</td>
<td style="text-align:left; font-size:12px;">各学科教师平均外出培训人数≥1人</td>
<td style="text-align:left; font-size:12px;">各学科教师几乎不进行外出培训</td>
</tr>
<tr>
<td style="text-align:left;"><strong>教研支持</strong></td>
<td style="text-align:left; font-size:12px;">教研的数量和质量均较高</td>
<td style="text-align:left; font-size:12px;">有教研活动,质量较好</td>
<td style="text-align:left; font-size:12px;">有教研活动但质量一般</td>
<td style="text-align:left; font-size:12px;">活动数量和质量均较低</td>
</tr>
<tr>
<td style="text-align:left;"><strong>项目支持</strong></td>
<td style="text-align:left; font-size:12px;">各学科均有负责的校级以上项目至少一个</td>
<td style="text-align:left; font-size:12px;">有部分学科负责校级以上项目至少一个</td>
<td style="text-align:left; font-size:12px;">各学科没有负责的校级以上项目,部分学科有校级项目至少一个</td>
<td style="text-align:left; font-size:12px;">各学科校级及校级以上的项目均没有</td>
</tr>
<tr>
<td style="text-align:left;"><strong>科学评价观</strong></td>
<td style="text-align:left; font-size:12px;">在所有方面均能至少关注两项素养发展</td>
<td style="text-align:left; font-size:12px;">至少有三个方面关注两项素养发展</td>
<td style="text-align:left; font-size:12px;">能较多关注学生发展</td>
<td style="text-align:left; font-size:12px;">较少关注学生发展</td>
</tr>
<tr>
<td style="text-align:left;"><strong>学业质量评估</strong></td>
<td style="text-align:left; font-size:12px;">校本化评价工具已研制并使用,学期考试质量分析并标注属性较为全面</td>
<td style="text-align:left; font-size:12px;">校本化评价工具已研制并使用,学期考试质量分析不做硬性要求</td>
<td style="text-align:left; font-size:12px;">至少已研制一项校本化评价工具,学期考试质量分析不做硬性要求</td>
<td style="text-align:left; font-size:12px;">未能重视学业质量评估,校本化评价工具均欠缺</td>
</tr>
<tr>
<td style="text-align:left;"><strong>综合素质评估</strong></td>
<td style="text-align:left; font-size:12px;">校本化综合素质评价体系均有建设和使用,有平台支持且评价结果表达科学</td>
<td style="text-align:left; font-size:12px;">校本化综合素质评价体系均有建设和使用,支持平台和评价结果使用有待提高</td>
<td style="text-align:left; font-size:12px;">校本化综合素质评价方案建成,但具体评价工具有待开发</td>
<td style="text-align:left; font-size:12px;">未能重视校本化综合素质评价,方案、工具和结果使用等均欠缺</td>
</tr>
<tr>
<td style="text-align:left;"><strong>实践活动评估</strong></td>
<td style="text-align:left; font-size:12px;">研究性学习、社会考察和学科实践活动的校本化评价工具已研制并使用</td>
<td style="text-align:left; font-size:12px;">学科实践活动的校本化评价工具已研制并使用,研究性学习/社会考察至少一项已研制但尚未使用</td>
<td style="text-align:left; font-size:12px;">学科实践活动的校本化评价工具已研制</td>
<td style="text-align:left; font-size:12px;">研究性学习、社会考察和学科实践活动的校本化评价工具均尚未研制和使用</td>
</tr>
<tr>
<td style="text-align:left;"><strong>区域推进</strong></td>
<td style="text-align:left; font-size:12px;">召开会议平均一个月2次及以上,区域管理文件数量和措施均为最大值</td>
<td style="text-align:left; font-size:12px;">召开会议平均一个月1次及以上,区域管理文件3个以上,措施达3项</td>
<td style="text-align:left; font-size:12px;">召开会议、文件和措施至少有一项建设较好</td>
<td style="text-align:left; font-size:12px;">召开会议、文件和措施三项均建设较差</td>
</tr>
<tr>
<td style="text-align:left;"><strong>环境支持</strong></td>
<td style="text-align:left; font-size:12px;">信息化支持和硬件支持均处于较高水平</td>
<td style="text-align:left; font-size:12px;">信息化支持和硬件在平均水平附近</td>
<td style="text-align:left; font-size:12px;">信息化支持和硬件支持至少有一项建设较好</td>
<td style="text-align:left; font-size:12px;">信息化支持和硬件支持均建设较差</td>
</tr>
<tr>
<td style="text-align:left;"><strong>资源支持</strong></td>
<td style="text-align:left; font-size:12px;">校内外资源和师资水平均处于较高水平</td>
<td style="text-align:left; font-size:12px;">校内外资源至少有一项供给较好,师资水平较好</td>
<td style="text-align:left; font-size:12px;">校内外资源至少有一项仅略低于平均水平,师资水平略低于平均水平</td>
<td style="text-align:left; font-size:12px;">校内外资源和师资水平三项均建设较差</td>
</tr>
<tr>
<td style="text-align:left;"><strong>教学方式创新</strong></td>
<td style="text-align:left; font-size:12px;">信息技术与教学融合程度高,教师能常态化使用信息技术</td>
<td style="text-align:left; font-size:12px;">信息技术与教学融合程度较高,教师能使用信息技术</td>
<td style="text-align:left; font-size:12px;">信息技术与教学融合程度一般,学校有信息化平台建设</td>
<td style="text-align:left; font-size:12px;">信息技术与教学融合程度较差,教师基本不使用信息技术</td>
</tr>
<tr>
<td style="text-align:left;"><strong>评价精准化与个性化</strong></td>
<td style="text-align:left; font-size:12px;">有自建信息技术平台支持学科诊断与综合素质评价</td>
<td style="text-align:left; font-size:12px;">借助第三方平台支持学科诊断与综合素质评价</td>
<td style="text-align:left; font-size:12px;">有信息技术平台支持学业评价</td>
<td style="text-align:left; font-size:12px;">没有信息技术平台支持评价</td>
</tr>
<tr>
<td style="text-align:left;"><strong>课程迭代优化</strong></td>
<td style="text-align:left; font-size:12px;">学校对促进教学数字化转型有专项研修计划并开展相关活动,业务绝大部分使用信息化系统</td>
<td style="text-align:left; font-size:12px;">学校尚未制定专项研修计划,业务绝大部分使用信息化系统</td>
<td style="text-align:left; font-size:12px;">学校较少开展数字化转型活动,少数业务使用信息化系统</td>
<td style="text-align:left; font-size:12px;">学校几乎不开展数字化转型活动,尚未建成信息化管理系统</td>
</tr>
</tbody>
</table>
</div>
<div class="section" id="part2">
<h1>第二部分 总体表现</h1>
<h2>一、学校课程实施总体状况</h2>
<!-- 得分卡片 -->
<div class="score-cards">
<div class="score-card">
<div class="label">总体得分</div>
<div class="value">51.9</div>
<div class="diff positive">
+0.2 vs 区均值 (51.7)
</div>
</div>
<div class="score-card">
<div class="label">区内排名</div>
<div class="value">6/11</div>
</div>
<div class="score-card">
<div class="label">全市排名</div>
<div class="value">88/266</div>
<div class="diff positive">
位列前 33.1%
</div>
</div>
<div class="score-card">
<div class="label">同类学校均值</div>
<div class="value" style="font-size:24px">49.8</div>
<div class="diff positive">
+2.1 vs 同类
</div>
</div>
<div class="score-card">
<div class="label">课程实施类型</div>
<div class="value" style="font-size:16px">
<span class="type-badge good">
较好
</span>
</div>
</div>
</div>
<!-- A. 学校画像卡 + 优势-短板象限图 -->
<div class="chart-row">
<div class="chart-box">
<div id="profile-card-chart" class="chart" style="height:420px"></div>
<div class="chart-title">图2-0a 学校课程实施画像总览</div>
</div>
<div class="chart-box">
<div id="quadrant-chart" class="chart" style="height:420px"></div>
<div class="chart-title">图2-0b 三级维度优势-短板象限分析</div>
</div>
</div>
<div class="chart-caption">
<p><em>(分析文字生成失败:Error code: 402 - {'error': {'type': 'insufficient_quota', 'code': 'quota_exhausted', 'message': 'Quota for the current billing period is exhausted. Resets at 2026-05-14T07:00:00Z (in ~6 days).', 'recovers_at': '2026-05-14T07:00:00Z', 'retry_after_seconds': 21600}}</em></p>
</div>
<!-- 得分对比横向条形图 + 七维度雷达图 -->
<div class="chart-row">
<div class="chart-box">
<div id="score-compare-chart" class="chart"></div>
<div class="chart-title">图2-1 课程实施七维度得分对比</div>
</div>
<div class="chart-box">
<div id="radar-chart" class="chart"></div>
<div class="chart-title">图2-2 课程实施七维度雷达图</div>
</div>
</div>
<div class="chart-caption">
<p><em>(分析文字生成失败:Error code: 402 - {'error': {'type': 'insufficient_quota', 'code': 'quota_exhausted', 'message': 'Quota for the current billing period is exhausted. Resets at 2026-05-14T07:00:00Z (in ~6 days).', 'recovers_at': '2026-05-14T07:00:00Z', 'retry_after_seconds': 21600}}</em></p>
</div>
<!-- 聚类类型分布 + 两类学校折线对比 -->
<div class="chart-row">
<div class="chart-box">
<div id="cluster-type-dist-chart" class="chart"></div>
<div class="chart-title">图2-3 学校课程实施总体类型分布</div>
</div>
<div class="chart-box">
<div id="cluster-line-chart" class="chart"></div>
<div class="chart-title">图2-4 两类学校课程实施特征对比</div>
</div>
</div>
<div class="chart-caption">
<p><em>(分析文字生成失败:Error code: 402 - {'error': {'type': 'insufficient_quota', 'code': 'quota_exhausted', 'message': 'Quota for the current billing period is exhausted. Resets at 2026-05-14T07:00:00Z (in ~6 days).', 'recovers_at': '2026-05-14T07:00:00Z', 'retry_after_seconds': 21600}}</em></p>
</div>
<!-- 聚类类型对比雷达图 + 区内学校排名条形图 -->
<div class="chart-row">
<div class="chart-box">
<div id="cluster-radar-chart" class="chart"></div>
<div class="chart-title">图2-5 学校课程实施类型特征对比(雷达图)</div>
</div>
<div class="chart-box">
<div id="school-ranking-chart" class="chart"></div>
<div class="chart-title">图2-6 区内各校总体得分排名</div>
</div>
</div>
<div class="chart-caption">
<p><em>(分析文字生成失败:Error code: 402 - {'error': {'type': 'insufficient_quota', 'code': 'quota_exhausted', 'message': 'Quota for the current billing period is exhausted. Resets at 2026-05-14T07:00:00Z (in ~6 days).', 'recovers_at': '2026-05-14T07:00:00Z', 'retry_after_seconds': 21600}}</em></p>
</div>
<!-- 维度间相关性热力图 -->
<div class="chart-box">
<div id="correlation-chart" class="chart" style="height:450px"></div>
<div class="chart-title">图2-7 课程实施维度间相关性分析</div>
</div>
<div class="chart-caption">
<p><em>(分析文字生成失败:Error code: 402 - {'error': {'type': 'insufficient_quota', 'code': 'quota_exhausted', 'message': 'Quota for the current billing period is exhausted. Resets at 2026-05-14T07:00:00Z (in ~6 days).', 'recovers_at': '2026-05-14T07:00:00Z', 'retry_after_seconds': 21600}}</em></p>
</div>
<!-- LLM综合分析 -->
<div class="llm-analysis">
<p><em>(分析文字生成失败:Error code: 402 - {'error': {'type': 'insufficient_quota', 'code': 'quota_exhausted', 'message': 'Quota for the current billing period is exhausted. Resets at 2026-05-14T07:00:00Z (in ~6 days).', 'recovers_at': '2026-05-14T07:00:00Z', 'retry_after_seconds': 21600}}</em></p>
</div>
<div class="alert-box" style="background: linear-gradient(135deg, #fef2f2, #fee2e2); border: 2px solid #ef4444; border-radius: 12px; padding: 20px 24px; margin: 24px 0;">
<h3 style="color: #dc2626; margin: 0 0 12px 0; font-size: 18px;">紧急预警:以下子维度需立即关注</h3>
<div class="llm-analysis" style="color: #7f1d1d;">
<p><em>(分析文字生成失败:Error code: 402 - {'error': {'type': 'insufficient_quota', 'code': 'quota_exhausted', 'message': 'Quota for the current billing period is exhausted. Resets at 2026-05-14T07:00:00Z (in ~6 days).', 'recovers_at': '2026-05-14T07:00:00Z', 'retry_after_seconds': 21600}}</em></p>
</div>
</div>
<div class="positioning-gap-box" style="background: linear-gradient(135deg, #fffbeb, #fef3c7); border: 2px solid #f59e0b; border-radius: 12px; padding: 20px 24px; margin: 24px 0;">
<h3 style="color: #b45309; margin: 0 0 12px 0; font-size: 18px;">学校定位与实际表现差距分析</h3>
<div class="llm-analysis" style="color: #78350f;">
<p><em>(分析文字生成失败:Error code: 402 - {'error': {'type': 'insufficient_quota', 'code': 'quota_exhausted', 'message': 'Quota for the current billing period is exhausted. Resets at 2026-05-14T07:00:00Z (in ~6 days).', 'recovers_at': '2026-05-14T07:00:00Z', 'retry_after_seconds': 21600}}</em></p>
</div>
</div>
<h2>二、分维度状况</h2>
<!-- 维度得分对比表 -->
<table class="data-table">
<thead>
<tr>
<th>维度</th>
<th>嘉一实高</th>
<th>区均值</th>
<th>同类学校均值</th>
<th>差异(vs区)</th>
<th>区内排名</th>
<th>全市排名</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>课程领导力</strong></td>
<td>53.23</td>
<td>52.21</td>
<td>51.21</td>
<td style="color: green">
+1.02
</td>
<td>6/11</td>
<td>72/266</td>
</tr>
<tr>
<td><strong>教学变革力</strong></td>
<td>51.63</td>
<td>50.75</td>
<td>49.35</td>
<td style="color: green">
+0.88
</td>
<td>5/11</td>
<td>77/266</td>
</tr>
<tr>
<td><strong>学生发展指导力</strong></td>
<td>52.36</td>
<td>51.42</td>
<td>49.71</td>
<td style="color: green">
+0.93
</td>
<td>4/11</td>
<td>84/266</td>
</tr>
<tr>
<td><strong>教师发展支持力</strong></td>
<td>46.50</td>
<td>51.62</td>
<td>49.45</td>
<td style="color: red">
-5.12
</td>
<td>10/11</td>
<td>207/266</td>
</tr>
<tr>
<td><strong>教育质量评估力</strong></td>
<td>51.21</td>
<td>54.39</td>
<td>49.59</td>
<td style="color: red">
-3.18
</td>
<td>8/11</td>
<td>120/266</td>
</tr>
<tr>
<td><strong>教育条件保障力</strong></td>
<td>53.72</td>
<td>50.45</td>
<td>49.76</td>
<td style="color: green">
+3.27
</td>
<td>5/11</td>
<td>80/266</td>
</tr>
<tr>
<td><strong>数字化赋能力</strong></td>
<td>54.84</td>
<td>51.35</td>
<td>49.57</td>
<td style="color: green">
+3.49
</td>
<td>2/11</td>
<td>25/266</td>
</tr>
</tbody>
</table>
</div>
<div class="section" id="part3">
<h1>第三部分 课程领导力表现</h1>
<h2>一、整体表现</h2>
<div class="score-cards">
<div class="score-card">
<div class="label">课程领导力得分</div>
<div class="value">53.2</div>
<div class="diff positive">
+1.0 vs 区均值
</div>
</div>
<div class="score-card">
<div class="label">同类学校均值</div>
<div class="value" style="font-size:24px">51.2</div>
</div>
<div class="score-card">
<div class="label">区内排名</div>
<div class="value">6/11</div>
<div class="diff" style="color: var(--gray-500); font-size: 12px;">
全市 72/266
</div>
</div>
<div class="score-card">
<div class="label">表现</div>
<div class="value" style="font-size:14px">
<span class="type-badge neutral">接近区均</span>
</div>
</div>
</div>
<!-- 维度独立得分柱状图 + 子维度雷达/柱状图 -->
<div class="chart-row">
<div class="chart-box">
<div id="dim-score-part3" class="chart"></div>
<div class="chart-title">图3-1 课程领导力得分情况</div>
</div>
<div class="chart-box">
<div id="sub-radar-part3" class="chart"></div>
<div class="chart-title">图3-2 课程领导力各子维度得分情况</div>
</div>
</div>
<div class="chart-caption">
<p><em>(分析文字生成失败:Error code: 402 - {'error': {'type': 'insufficient_quota', 'code': 'quota_exhausted', 'message': 'Quota for the current billing period is exhausted. Resets at 2026-05-14T07:00:00Z (in ~6 days).', 'recovers_at': '2026-05-14T07:00:00Z', 'retry_after_seconds': 21600}}</em></p>
</div>
<!-- 子维度柱状图 + 水平分布堆叠图 -->
<div class="chart-row">
<div class="chart-box">
<div id="chart-part3" class="chart"></div>
<div class="chart-title">图3-3 课程领导力各子维度对比详情</div>
</div>
<div class="chart-box">
<div id="level-part3" class="chart"></div>
<div class="chart-title">图3-4 课程领导力各子维度水平分布</div>
</div>
</div>
<div class="chart-caption">
<p><em>(分析文字生成失败:Error code: 402 - {'error': {'type': 'insufficient_quota', 'code': 'quota_exhausted', 'message': 'Quota for the current billing period is exhausted. Resets at 2026-05-14T07:00:00Z (in ~6 days).', 'recovers_at': '2026-05-14T07:00:00Z', 'retry_after_seconds': 21600}}</em></p>
</div>
<!-- 聚类散点图(2D或3D -->
<div class="chart-box">
<div id="scatter-part3" class="chart" style="height:450px"></div>
<div class="chart-title">图3-5 课程领导力聚类分析散点图</div>
</div>
<div class="chart-caption">
<p><em>(分析文字生成失败:Error code: 402 - {'error': {'type': 'insufficient_quota', 'code': 'quota_exhausted', 'message': 'Quota for the current billing period is exhausted. Resets at 2026-05-14T07:00:00Z (in ~6 days).', 'recovers_at': '2026-05-14T07:00:00Z', 'retry_after_seconds': 21600}}</em></p>
</div>
<!-- 维度整体LLM分析 -->
<div class="llm-analysis">
<p><em>(分析文字生成失败:Error code: 402 - {'error': {'type': 'insufficient_quota', 'code': 'quota_exhausted', 'message': 'Quota for the current billing period is exhausted. Resets at 2026-05-14T07:00:00Z (in ~6 days).', 'recovers_at': '2026-05-14T07:00:00Z', 'retry_after_seconds': 21600}}</em></p>
</div>
<!-- 水平对比表 -->
<h3>课程领导力各子维度水平对比 (表 3-1)</h3>
<table class="level-table">
<thead>
<tr>
<th>子维度</th>
<th>嘉一实高</th>
<th>得分</th>
<th>区均值</th>
<th>区内排名</th>
<th>全市排名</th>
</tr>
</thead>
<tbody>
<tr>
<td>国家标准遵循</td>
<td class="lv1">水平 1</td>
<td>29.7</td>
<td>48.2</td>
<td>11/11</td>
<td>266/266</td>
</tr>
<tr>
<td>课程结构建设</td>
<td class="lv4">水平 4</td>
<td>71.6</td>
<td>53.0</td>
<td>1/11</td>
<td>1/266</td>
</tr>
<tr>
<td>课程规范落实</td>
<td class="lv4">水平 4</td>
<td>58.4</td>
<td>55.4</td>
<td>7/11</td>
<td>69/266</td>
</tr>
</tbody>
</table>
<hr class="section-divider">
<!-- 各三级维度详细分析 -->
<h2 id="sub-part3-1">二、 国家标准遵循</h2>
<div class="score-cards" style="grid-template-columns: repeat(4, 1fr);">
<div class="score-card">
<div class="label">得分</div>
<div class="value" style="font-size:24px">29.7</div>
<div class="diff negative">
-18.5 vs 区均值
</div>
</div>
<div class="score-card">
<div class="label">区均值</div>
<div class="value" style="font-size:24px">48.2</div>
</div>
<div class="score-card">
<div class="label">水平等级</div>
<div class="level-indicator level-1">水平 1</div>
</div>
<div class="score-card">
<div class="label">排名</div>
<div class="value" style="font-size:24px">11/11</div>
<div class="diff" style="color: var(--gray-500); font-size: 12px;">
全市 266/266
</div>
</div>
</div>
<!-- C. 温度计条形图 -->
<div class="chart-box" style="padding:10px 16px;">
<div id="thermo-part3-1" class="chart" style="height:80px"></div>
</div>
<!-- 金字塔水平指示器(含各水平学校数量) -->
<div class="pyramid-container">
<div class="pyramid-row">
<div class="pyramid-block lv4 dimmed">
水平 4 · 1 所
</div>
</div>
<div class="pyramid-row">
<div class="pyramid-block lv3 dimmed">
水平 3 · 4 所
</div>
</div>
<div class="pyramid-row">
<div class="pyramid-block lv2 dimmed">
水平 2 · 4 所
</div>
</div>
<div class="pyramid-row">
<div class="pyramid-block lv1 active">
水平 1 · 2 所
</div>
<span class="pyramid-label"><span class="arrow"></span>嘉一实高</span>
</div>
</div>
<p style="text-indent:0; margin:10px 0; color: var(--gray-500); font-size:14px;">
<strong>水平1含义:</strong>必修未能开齐开足,选必和选修均不满足要求
</p>
<!-- 三级维度LLM分析 -->
<div class="llm-analysis">
<p><em>(分析文字生成失败:Error code: 402 - {'error': {'type': 'insufficient_quota', 'code': 'quota_exhausted', 'message': 'Quota for the current billing period is exhausted. Resets at 2026-05-14T07:00:00Z (in ~6 days).', 'recovers_at': '2026-05-14T07:00:00Z', 'retry_after_seconds': 21600}}</em></p>
</div>
<hr class="section-divider">
<h2 id="sub-part3-2">三、 课程结构建设</h2>
<div class="score-cards" style="grid-template-columns: repeat(4, 1fr);">
<div class="score-card">
<div class="label">得分</div>
<div class="value" style="font-size:24px">71.6</div>
<div class="diff positive">
+18.6 vs 区均值
</div>
</div>
<div class="score-card">
<div class="label">区均值</div>
<div class="value" style="font-size:24px">53.0</div>
</div>
<div class="score-card">
<div class="label">水平等级</div>
<div class="level-indicator level-4">水平 4</div>
</div>
<div class="score-card">
<div class="label">排名</div>
<div class="value" style="font-size:24px">1/11</div>
<div class="diff" style="color: var(--gray-500); font-size: 12px;">
全市 1/266
</div>
</div>
</div>
<!-- C. 温度计条形图 -->
<div class="chart-box" style="padding:10px 16px;">
<div id="thermo-part3-2" class="chart" style="height:80px"></div>
</div>
<!-- 金字塔水平指示器(含各水平学校数量) -->
<div class="pyramid-container">
<div class="pyramid-row">
<div class="pyramid-block lv4 active">
水平 4 · 4 所
</div>
<span class="pyramid-label"><span class="arrow"></span>嘉一实高</span>
</div>
<div class="pyramid-row">
<div class="pyramid-block lv3 dimmed">
水平 3 · 4 所
</div>
</div>
<div class="pyramid-row">
<div class="pyramid-block lv2 dimmed">
水平 2 · 3 所
</div>
</div>
<div class="pyramid-row">
<div class="pyramid-block lv1 dimmed">
水平 1 · 0 所
</div>
</div>
</div>
<p style="text-indent:0; margin:10px 0; color: var(--gray-500); font-size:14px;">
<strong>水平4含义:</strong>学科类必修课程离差总和在30%以内,总体三类课程在150%以下,校本课程和综合实践较好
</p>
<!-- 三级维度LLM分析 -->
<div class="llm-analysis">
<p><em>(分析文字生成失败:Error code: 402 - {'error': {'type': 'insufficient_quota', 'code': 'quota_exhausted', 'message': 'Quota for the current billing period is exhausted. Resets at 2026-05-14T07:00:00Z (in ~6 days).', 'recovers_at': '2026-05-14T07:00:00Z', 'retry_after_seconds': 21600}}</em></p>
</div>
<hr class="section-divider">
<h2 id="sub-part3-3">四、 课程规范落实</h2>
<div class="score-cards" style="grid-template-columns: repeat(4, 1fr);">
<div class="score-card">
<div class="label">得分</div>
<div class="value" style="font-size:24px">58.4</div>
<div class="diff positive">
+2.9 vs 区均值
</div>
</div>
<div class="score-card">
<div class="label">区均值</div>
<div class="value" style="font-size:24px">55.4</div>
</div>
<div class="score-card">
<div class="label">水平等级</div>
<div class="level-indicator level-4">水平 4</div>
</div>
<div class="score-card">
<div class="label">排名</div>
<div class="value" style="font-size:24px">7/11</div>
<div class="diff" style="color: var(--gray-500); font-size: 12px;">
全市 69/266
</div>
</div>
</div>
<!-- C. 温度计条形图 -->
<div class="chart-box" style="padding:10px 16px;">
<div id="thermo-part3-3" class="chart" style="height:80px"></div>
</div>
<!-- 金字塔水平指示器(含各水平学校数量) -->
<div class="pyramid-container">
<div class="pyramid-row">
<div class="pyramid-block lv4 active">
水平 4 · 7 所
</div>
<span class="pyramid-label"><span class="arrow"></span>嘉一实高</span>
</div>
<div class="pyramid-row">
<div class="pyramid-block lv3 dimmed">
水平 3 · 2 所
</div>
</div>
<div class="pyramid-row">
<div class="pyramid-block lv2 dimmed">
水平 2 · 2 所
</div>
</div>
<div class="pyramid-row">
<div class="pyramid-block lv1 dimmed">
水平 1 · 0 所
</div>
</div>
</div>
<p style="text-indent:0; margin:10px 0; color: var(--gray-500); font-size:14px;">
<strong>水平4含义:</strong>都有建设规范文本和档案记录
</p>
<!-- 三级维度LLM分析 -->
<div class="llm-analysis">
<p><em>(分析文字生成失败:Error code: 402 - {'error': {'type': 'insufficient_quota', 'code': 'quota_exhausted', 'message': 'Quota for the current billing period is exhausted. Resets at 2026-05-14T07:00:00Z (in ~6 days).', 'recovers_at': '2026-05-14T07:00:00Z', 'retry_after_seconds': 21600}}</em></p>
</div>
</div>
<div class="section" id="part4">
<h1>第四部分 教学变革力表现</h1>
<h2>一、整体表现</h2>
<div class="score-cards">
<div class="score-card">
<div class="label">教学变革力得分</div>
<div class="value">51.6</div>
<div class="diff positive">
+0.9 vs 区均值
</div>
</div>
<div class="score-card">
<div class="label">同类学校均值</div>
<div class="value" style="font-size:24px">49.4</div>
</div>
<div class="score-card">
<div class="label">区内排名</div>
<div class="value">5/11</div>
<div class="diff" style="color: var(--gray-500); font-size: 12px;">
全市 77/266
</div>
</div>
<div class="score-card">
<div class="label">表现</div>
<div class="value" style="font-size:14px">
<span class="type-badge good">略高于区均</span>
</div>
</div>
</div>
<!-- 维度独立得分柱状图 + 子维度雷达/柱状图 -->
<div class="chart-row">
<div class="chart-box">
<div id="dim-score-part4" class="chart"></div>
<div class="chart-title">图4-1 教学变革力得分情况</div>
</div>
<div class="chart-box">
<div id="sub-radar-part4" class="chart"></div>
<div class="chart-title">图4-2 教学变革力各子维度得分情况</div>
</div>
</div>
<div class="chart-caption">
<p><em>(分析文字生成失败:Error code: 402 - {'error': {'type': 'insufficient_quota', 'code': 'quota_exhausted', 'message': 'Quota for the current billing period is exhausted. Resets at 2026-05-14T07:00:00Z (in ~6 days).', 'recovers_at': '2026-05-14T07:00:00Z', 'retry_after_seconds': 21600}}</em></p>
</div>
<!-- 子维度柱状图 + 水平分布堆叠图 -->
<div class="chart-row">
<div class="chart-box">
<div id="chart-part4" class="chart"></div>
<div class="chart-title">图4-3 教学变革力各子维度对比详情</div>
</div>
<div class="chart-box">
<div id="level-part4" class="chart"></div>
<div class="chart-title">图4-4 教学变革力各子维度水平分布</div>
</div>
</div>
<div class="chart-caption">
<p><em>(分析文字生成失败:Error code: 402 - {'error': {'type': 'insufficient_quota', 'code': 'quota_exhausted', 'message': 'Quota for the current billing period is exhausted. Resets at 2026-05-14T07:00:00Z (in ~6 days).', 'recovers_at': '2026-05-14T07:00:00Z', 'retry_after_seconds': 21600}}</em></p>
</div>
<!-- 聚类散点图(2D或3D -->
<div class="chart-box">
<div id="scatter-part4" class="chart" style="height:450px"></div>
<div class="chart-title">图4-5 教学变革力聚类分析散点图</div>
</div>
<div class="chart-caption">
<p><em>(分析文字生成失败:Error code: 402 - {'error': {'type': 'insufficient_quota', 'code': 'quota_exhausted', 'message': 'Quota for the current billing period is exhausted. Resets at 2026-05-14T07:00:00Z (in ~6 days).', 'recovers_at': '2026-05-14T07:00:00Z', 'retry_after_seconds': 21600}}</em></p>
</div>
<!-- 维度整体LLM分析 -->
<div class="llm-analysis">
<p><em>(分析文字生成失败:Error code: 402 - {'error': {'type': 'insufficient_quota', 'code': 'quota_exhausted', 'message': 'Quota for the current billing period is exhausted. Resets at 2026-05-14T07:00:00Z (in ~6 days).', 'recovers_at': '2026-05-14T07:00:00Z', 'retry_after_seconds': 21600}}</em></p>
</div>
<!-- 水平对比表 -->
<h3>教学变革力各子维度水平对比 (表 4-1)</h3>
<table class="level-table">
<thead>
<tr>
<th>子维度</th>
<th>嘉一实高</th>
<th>得分</th>
<th>区均值</th>
<th>区内排名</th>
<th>全市排名</th>
</tr>
</thead>
<tbody>
<tr>
<td>教学方式变革</td>
<td class="lv3">水平 3</td>
<td>51.8</td>
<td>49.7</td>
<td>2/11</td>
<td>83/266</td>
</tr>
<tr>
<td>作业设计与管理变革</td>
<td class="lv3">水平 3</td>
<td>51.4</td>
<td>51.8</td>
<td>5/11</td>
<td>80/266</td>
</tr>
</tbody>
</table>
<hr class="section-divider">
<!-- 各三级维度详细分析 -->
<h2 id="sub-part4-1">二、 教学方式变革</h2>
<div class="score-cards" style="grid-template-columns: repeat(4, 1fr);">
<div class="score-card">
<div class="label">得分</div>
<div class="value" style="font-size:24px">51.8</div>
<div class="diff positive">
+2.1 vs 区均值
</div>
</div>
<div class="score-card">
<div class="label">区均值</div>
<div class="value" style="font-size:24px">49.7</div>
</div>
<div class="score-card">
<div class="label">水平等级</div>
<div class="level-indicator level-3">水平 3</div>
</div>
<div class="score-card">
<div class="label">排名</div>
<div class="value" style="font-size:24px">2/11</div>
<div class="diff" style="color: var(--gray-500); font-size: 12px;">
全市 83/266
</div>
</div>
</div>
<!-- C. 温度计条形图 -->
<div class="chart-box" style="padding:10px 16px;">
<div id="thermo-part4-1" class="chart" style="height:80px"></div>
</div>
<!-- 金字塔水平指示器(含各水平学校数量) -->
<div class="pyramid-container">
<div class="pyramid-row">
<div class="pyramid-block lv4 dimmed">
水平 4 · 0 所
</div>
</div>
<div class="pyramid-row">
<div class="pyramid-block lv3 active">
水平 3 · 7 所
</div>
<span class="pyramid-label"><span class="arrow"></span>嘉一实高</span>
</div>
<div class="pyramid-row">
<div class="pyramid-block lv2 dimmed">
水平 2 · 4 所
</div>
</div>
<div class="pyramid-row">
<div class="pyramid-block lv1 dimmed">
水平 1 · 0 所
</div>
</div>
</div>
<p style="text-indent:0; margin:10px 0; color: var(--gray-500); font-size:14px;">
<strong>水平3含义:</strong>大部分老师有共识和研究,并能够落实教材中的相关要求,至少有2种常态化落实形式
</p>
<!-- 三级维度LLM分析 -->
<div class="llm-analysis">
<p><em>(分析文字生成失败:Error code: 402 - {'error': {'type': 'insufficient_quota', 'code': 'quota_exhausted', 'message': 'Quota for the current billing period is exhausted. Resets at 2026-05-14T07:00:00Z (in ~6 days).', 'recovers_at': '2026-05-14T07:00:00Z', 'retry_after_seconds': 21600}}</em></p>
</div>
<hr class="section-divider">
<h2 id="sub-part4-2">三、 作业设计与管理变革</h2>
<div class="score-cards" style="grid-template-columns: repeat(4, 1fr);">
<div class="score-card">
<div class="label">得分</div>
<div class="value" style="font-size:24px">51.4</div>
<div class="diff negative">
-0.3 vs 区均值
</div>
</div>
<div class="score-card">
<div class="label">区均值</div>
<div class="value" style="font-size:24px">51.8</div>
</div>
<div class="score-card">
<div class="label">水平等级</div>
<div class="level-indicator level-3">水平 3</div>
</div>
<div class="score-card">
<div class="label">排名</div>
<div class="value" style="font-size:24px">5/11</div>
<div class="diff" style="color: var(--gray-500); font-size: 12px;">
全市 80/266
</div>
</div>
</div>
<!-- C. 温度计条形图 -->
<div class="chart-box" style="padding:10px 16px;">
<div id="thermo-part4-2" class="chart" style="height:80px"></div>
</div>
<!-- 金字塔水平指示器(含各水平学校数量) -->
<div class="pyramid-container">
<div class="pyramid-row">
<div class="pyramid-block lv4 dimmed">
水平 4 · 3 所
</div>
</div>
<div class="pyramid-row">
<div class="pyramid-block lv3 active">
水平 3 · 5 所
</div>
<span class="pyramid-label"><span class="arrow"></span>嘉一实高</span>
</div>
<div class="pyramid-row">
<div class="pyramid-block lv2 dimmed">
水平 2 · 3 所
</div>
</div>
<div class="pyramid-row">
<div class="pyramid-block lv1 dimmed">
水平 1 · 0 所
</div>
</div>
</div>
<p style="text-indent:0; margin:10px 0; color: var(--gray-500); font-size:14px;">
<strong>水平3含义:</strong>在每类创新性作业中至少掌握2种类型,偶有时长控制管理,面批为主,有至少两种属性标注
</p>
<!-- 三级维度LLM分析 -->
<div class="llm-analysis">
<p><em>(分析文字生成失败:Error code: 402 - {'error': {'type': 'insufficient_quota', 'code': 'quota_exhausted', 'message': 'Quota for the current billing period is exhausted. Resets at 2026-05-14T07:00:00Z (in ~6 days).', 'recovers_at': '2026-05-14T07:00:00Z', 'retry_after_seconds': 21600}}</em></p>
</div>
</div>
<div class="section" id="part5">
<h1>第五部分 学生发展指导力表现</h1>
<h2>一、整体表现</h2>
<div class="score-cards">
<div class="score-card">
<div class="label">学生发展指导力得分</div>
<div class="value">52.4</div>
<div class="diff positive">
+0.9 vs 区均值
</div>
</div>
<div class="score-card">
<div class="label">同类学校均值</div>
<div class="value" style="font-size:24px">49.7</div>
</div>
<div class="score-card">
<div class="label">区内排名</div>
<div class="value">4/11</div>
<div class="diff" style="color: var(--gray-500); font-size: 12px;">
全市 84/266
</div>
</div>
<div class="score-card">
<div class="label">表现</div>
<div class="value" style="font-size:14px">
<span class="type-badge good">略高于区均</span>
</div>
</div>
</div>
<!-- 维度独立得分柱状图 + 子维度雷达/柱状图 -->
<div class="chart-row">
<div class="chart-box">
<div id="dim-score-part5" class="chart"></div>
<div class="chart-title">图5-1 学生发展指导力得分情况</div>
</div>
<div class="chart-box">
<div id="sub-radar-part5" class="chart"></div>
<div class="chart-title">图5-2 学生发展指导力各子维度得分情况</div>
</div>
</div>
<div class="chart-caption">
<p><em>(分析文字生成失败:Error code: 402 - {'error': {'type': 'insufficient_quota', 'code': 'quota_exhausted', 'message': 'Quota for the current billing period is exhausted. Resets at 2026-05-14T07:00:00Z (in ~6 days).', 'recovers_at': '2026-05-14T07:00:00Z', 'retry_after_seconds': 21600}}</em></p>
</div>
<!-- 子维度柱状图 + 水平分布堆叠图 -->
<div class="chart-row">
<div class="chart-box">
<div id="chart-part5" class="chart"></div>
<div class="chart-title">图5-3 学生发展指导力各子维度对比详情</div>
</div>
<div class="chart-box">
<div id="level-part5" class="chart"></div>
<div class="chart-title">图5-4 学生发展指导力各子维度水平分布</div>
</div>
</div>
<div class="chart-caption">
<p><em>(分析文字生成失败:Error code: 402 - {'error': {'type': 'insufficient_quota', 'code': 'quota_exhausted', 'message': 'Quota for the current billing period is exhausted. Resets at 2026-05-14T07:00:00Z (in ~6 days).', 'recovers_at': '2026-05-14T07:00:00Z', 'retry_after_seconds': 21600}}</em></p>
</div>
<!-- 聚类散点图(2D或3D -->
<div class="chart-box">
<div id="scatter-part5" class="chart" style="height:450px"></div>
<div class="chart-title">图5-5 学生发展指导力聚类分析散点图</div>
</div>
<div class="chart-caption">
<p><em>(分析文字生成失败:Error code: 402 - {'error': {'type': 'insufficient_quota', 'code': 'quota_exhausted', 'message': 'Quota for the current billing period is exhausted. Resets at 2026-05-14T07:00:00Z (in ~6 days).', 'recovers_at': '2026-05-14T07:00:00Z', 'retry_after_seconds': 21600}}</em></p>
</div>
<!-- 维度整体LLM分析 -->
<div class="llm-analysis">
<p><em>(分析文字生成失败:Error code: 402 - {'error': {'type': 'insufficient_quota', 'code': 'quota_exhausted', 'message': 'Quota for the current billing period is exhausted. Resets at 2026-05-14T07:00:00Z (in ~6 days).', 'recovers_at': '2026-05-14T07:00:00Z', 'retry_after_seconds': 21600}}</em></p>
</div>
<!-- 水平对比表 -->
<h3>学生发展指导力各子维度水平对比 (表 5-1)</h3>
<table class="level-table">
<thead>
<tr>
<th>子维度</th>
<th>嘉一实高</th>
<th>得分</th>
<th>区均值</th>
<th>区内排名</th>
<th>全市排名</th>
</tr>
</thead>
<tbody>
<tr>
<td>学科发展的个性化辅导</td>
<td class="lv3">水平 3</td>
<td>55.6</td>
<td>51.6</td>
<td>2/11</td>
<td>19/266</td>
</tr>
<tr>
<td>学生生涯发展指导</td>
<td class="lv2">水平 2</td>
<td>49.1</td>
<td>51.2</td>
<td>8/11</td>
<td>156/266</td>
</tr>
</tbody>
</table>
<hr class="section-divider">
<!-- 各三级维度详细分析 -->
<h2 id="sub-part5-1">二、 学科发展的个性化辅导</h2>
<div class="score-cards" style="grid-template-columns: repeat(4, 1fr);">
<div class="score-card">
<div class="label">得分</div>
<div class="value" style="font-size:24px">55.6</div>
<div class="diff positive">
+4.0 vs 区均值
</div>
</div>
<div class="score-card">
<div class="label">区均值</div>
<div class="value" style="font-size:24px">51.6</div>
</div>
<div class="score-card">
<div class="label">水平等级</div>
<div class="level-indicator level-3">水平 3</div>
</div>
<div class="score-card">
<div class="label">排名</div>
<div class="value" style="font-size:24px">2/11</div>
<div class="diff" style="color: var(--gray-500); font-size: 12px;">
全市 19/266
</div>
</div>
</div>
<!-- C. 温度计条形图 -->
<div class="chart-box" style="padding:10px 16px;">
<div id="thermo-part5-1" class="chart" style="height:80px"></div>
</div>
<!-- 金字塔水平指示器(含各水平学校数量) -->
<div class="pyramid-container">
<div class="pyramid-row">
<div class="pyramid-block lv4 dimmed">
水平 4 · 0 所
</div>
</div>
<div class="pyramid-row">
<div class="pyramid-block lv3 active">
水平 3 · 9 所
</div>
<span class="pyramid-label"><span class="arrow"></span>嘉一实高</span>
</div>
<div class="pyramid-row">
<div class="pyramid-block lv2 dimmed">
水平 2 · 1 所
</div>
</div>
<div class="pyramid-row">
<div class="pyramid-block lv1 dimmed">
水平 1 · 1 所
</div>
</div>
</div>
<p style="text-indent:0; margin:10px 0; color: var(--gray-500); font-size:14px;">
<strong>水平3含义:</strong>各学科平均辅导时长每周1-2小时,教师根据学情确定内容,主要个别分散辅导
</p>
<!-- 三级维度LLM分析 -->
<div class="llm-analysis">
<p><em>(分析文字生成失败:Error code: 402 - {'error': {'type': 'insufficient_quota', 'code': 'quota_exhausted', 'message': 'Quota for the current billing period is exhausted. Resets at 2026-05-14T07:00:00Z (in ~6 days).', 'recovers_at': '2026-05-14T07:00:00Z', 'retry_after_seconds': 21600}}</em></p>
</div>
<hr class="section-divider">
<h2 id="sub-part5-2">三、 学生生涯发展指导</h2>
<div class="score-cards" style="grid-template-columns: repeat(4, 1fr);">
<div class="score-card">
<div class="label">得分</div>
<div class="value" style="font-size:24px">49.1</div>
<div class="diff negative">
-2.1 vs 区均值
</div>
</div>
<div class="score-card">
<div class="label">区均值</div>
<div class="value" style="font-size:24px">51.2</div>
</div>
<div class="score-card">
<div class="label">水平等级</div>
<div class="level-indicator level-2">水平 2</div>
</div>
<div class="score-card">
<div class="label">排名</div>
<div class="value" style="font-size:24px">8/11</div>
<div class="diff" style="color: var(--gray-500); font-size: 12px;">
全市 156/266
</div>
</div>
</div>
<!-- C. 温度计条形图 -->
<div class="chart-box" style="padding:10px 16px;">
<div id="thermo-part5-2" class="chart" style="height:80px"></div>
</div>
<!-- 金字塔水平指示器(含各水平学校数量) -->
<div class="pyramid-container">
<div class="pyramid-row">
<div class="pyramid-block lv4 dimmed">
水平 4 · 1 所
</div>
</div>
<div class="pyramid-row">
<div class="pyramid-block lv3 dimmed">
水平 3 · 6 所
</div>
</div>
<div class="pyramid-row">
<div class="pyramid-block lv2 active">
水平 2 · 4 所
</div>
<span class="pyramid-label"><span class="arrow"></span>嘉一实高</span>
</div>
<div class="pyramid-row">
<div class="pyramid-block lv1 dimmed">
水平 1 · 0 所
</div>
</div>
</div>
<p style="text-indent:0; margin:10px 0; color: var(--gray-500); font-size:14px;">
<strong>水平2含义:</strong>与社会考察/志愿服务结合实施,三年覆盖50-70%学生,外聘教师,几乎无资源支持
</p>
<!-- 三级维度LLM分析 -->
<div class="llm-analysis">
<p><em>(分析文字生成失败:Error code: 402 - {'error': {'type': 'insufficient_quota', 'code': 'quota_exhausted', 'message': 'Quota for the current billing period is exhausted. Resets at 2026-05-14T07:00:00Z (in ~6 days).', 'recovers_at': '2026-05-14T07:00:00Z', 'retry_after_seconds': 21600}}</em></p>
</div>
</div>
<div class="section" id="part6">
<h1>第六部分 教师发展支持力表现</h1>
<h2>一、整体表现</h2>
<div class="score-cards">
<div class="score-card">
<div class="label">教师发展支持力得分</div>
<div class="value">46.5</div>
<div class="diff negative">
-5.1 vs 区均值
</div>
</div>
<div class="score-card">
<div class="label">同类学校均值</div>
<div class="value" style="font-size:24px">49.5</div>
</div>
<div class="score-card">
<div class="label">区内排名</div>
<div class="value">10/11</div>
<div class="diff" style="color: var(--gray-500); font-size: 12px;">
全市 207/266
</div>
</div>
<div class="score-card">
<div class="label">表现</div>
<div class="value" style="font-size:14px">
<span class="type-badge weak">待提升</span>
</div>
</div>
</div>
<!-- 维度独立得分柱状图 + 子维度雷达/柱状图 -->
<div class="chart-row">
<div class="chart-box">
<div id="dim-score-part6" class="chart"></div>
<div class="chart-title">图6-1 教师发展支持力得分情况</div>
</div>
<div class="chart-box">
<div id="sub-radar-part6" class="chart"></div>
<div class="chart-title">图6-2 教师发展支持力各子维度得分情况</div>
</div>
</div>
<div class="chart-caption">
<p><em>(分析文字生成失败:Error code: 402 - {'error': {'type': 'insufficient_quota', 'code': 'quota_exhausted', 'message': 'Quota for the current billing period is exhausted. Resets at 2026-05-14T07:00:00Z (in ~6 days).', 'recovers_at': '2026-05-14T07:00:00Z', 'retry_after_seconds': 21600}}</em></p>
</div>
<!-- 子维度柱状图 + 水平分布堆叠图 -->
<div class="chart-row">
<div class="chart-box">
<div id="chart-part6" class="chart"></div>
<div class="chart-title">图6-3 教师发展支持力各子维度对比详情</div>
</div>
<div class="chart-box">
<div id="level-part6" class="chart"></div>
<div class="chart-title">图6-4 教师发展支持力各子维度水平分布</div>
</div>
</div>
<div class="chart-caption">
<p><em>(分析文字生成失败:Error code: 402 - {'error': {'type': 'insufficient_quota', 'code': 'quota_exhausted', 'message': 'Quota for the current billing period is exhausted. Resets at 2026-05-14T07:00:00Z (in ~6 days).', 'recovers_at': '2026-05-14T07:00:00Z', 'retry_after_seconds': 21600}}</em></p>
</div>
<!-- 聚类散点图(2D或3D -->
<div class="chart-box">
<div id="scatter-part6" class="chart" style="height:450px"></div>
<div class="chart-title">图6-5 教师发展支持力聚类分析散点图</div>
</div>
<div class="chart-caption">
<p><em>(分析文字生成失败:Error code: 402 - {'error': {'type': 'insufficient_quota', 'code': 'quota_exhausted', 'message': 'Quota for the current billing period is exhausted. Resets at 2026-05-14T07:00:00Z (in ~6 days).', 'recovers_at': '2026-05-14T07:00:00Z', 'retry_after_seconds': 21600}}</em></p>
</div>
<!-- 维度整体LLM分析 -->
<div class="llm-analysis">
<p><em>(分析文字生成失败:Error code: 402 - {'error': {'type': 'insufficient_quota', 'code': 'quota_exhausted', 'message': 'Quota for the current billing period is exhausted. Resets at 2026-05-14T07:00:00Z (in ~6 days).', 'recovers_at': '2026-05-14T07:00:00Z', 'retry_after_seconds': 21600}}</em></p>
</div>
<!-- 水平对比表 -->
<h3>教师发展支持力各子维度水平对比 (表 6-1)</h3>
<table class="level-table">
<thead>
<tr>
<th>子维度</th>
<th>嘉一实高</th>
<th>得分</th>
<th>区均值</th>
<th>区内排名</th>
<th>全市排名</th>
</tr>
</thead>
<tbody>
<tr>
<td>培训支持</td>
<td class="lv1">水平 1</td>
<td>47.4</td>
<td>49.5</td>
<td>11/11</td>
<td>241/266</td>
</tr>
<tr>
<td>教研支持</td>
<td class="lv3">水平 3</td>
<td>50.7</td>
<td>51.3</td>
<td>8/11</td>
<td>118/266</td>
</tr>
<tr>
<td>项目支持</td>
<td class="lv1">水平 1</td>
<td>41.4</td>
<td>54.1</td>
<td>11/11</td>
<td>266/266</td>
</tr>
</tbody>
</table>
<hr class="section-divider">
<!-- 各三级维度详细分析 -->
<h2 id="sub-part6-1">二、 培训支持</h2>
<div class="score-cards" style="grid-template-columns: repeat(4, 1fr);">
<div class="score-card">
<div class="label">得分</div>
<div class="value" style="font-size:24px">47.4</div>
<div class="diff negative">
-2.0 vs 区均值
</div>
</div>
<div class="score-card">
<div class="label">区均值</div>
<div class="value" style="font-size:24px">49.5</div>
</div>
<div class="score-card">
<div class="label">水平等级</div>
<div class="level-indicator level-1">水平 1</div>
</div>
<div class="score-card">
<div class="label">排名</div>
<div class="value" style="font-size:24px">11/11</div>
<div class="diff" style="color: var(--gray-500); font-size: 12px;">
全市 241/266
</div>
</div>
</div>
<!-- C. 温度计条形图 -->
<div class="chart-box" style="padding:10px 16px;">
<div id="thermo-part6-1" class="chart" style="height:80px"></div>
</div>
<!-- 金字塔水平指示器(含各水平学校数量) -->
<div class="pyramid-container">
<div class="pyramid-row">
<div class="pyramid-block lv4 dimmed">
水平 4 · 1 所
</div>
</div>
<div class="pyramid-row">
<div class="pyramid-block lv3 dimmed">
水平 3 · 6 所
</div>
</div>
<div class="pyramid-row">
<div class="pyramid-block lv2 dimmed">
水平 2 · 3 所
</div>
</div>
<div class="pyramid-row">
<div class="pyramid-block lv1 active">
水平 1 · 1 所
</div>
<span class="pyramid-label"><span class="arrow"></span>嘉一实高</span>
</div>
</div>
<p style="text-indent:0; margin:10px 0; color: var(--gray-500); font-size:14px;">
<strong>水平1含义:</strong>各学科教师几乎不进行外出培训
</p>
<!-- 三级维度LLM分析 -->
<div class="llm-analysis">
<p><em>(分析文字生成失败:Error code: 402 - {'error': {'type': 'insufficient_quota', 'code': 'quota_exhausted', 'message': 'Quota for the current billing period is exhausted. Resets at 2026-05-14T07:00:00Z (in ~6 days).', 'recovers_at': '2026-05-14T07:00:00Z', 'retry_after_seconds': 21600}}</em></p>
</div>
<hr class="section-divider">
<h2 id="sub-part6-2">三、 教研支持</h2>
<div class="score-cards" style="grid-template-columns: repeat(4, 1fr);">
<div class="score-card">
<div class="label">得分</div>
<div class="value" style="font-size:24px">50.7</div>
<div class="diff negative">
-0.7 vs 区均值
</div>
</div>
<div class="score-card">
<div class="label">区均值</div>
<div class="value" style="font-size:24px">51.3</div>
</div>
<div class="score-card">
<div class="label">水平等级</div>
<div class="level-indicator level-3">水平 3</div>
</div>
<div class="score-card">
<div class="label">排名</div>
<div class="value" style="font-size:24px">8/11</div>
<div class="diff" style="color: var(--gray-500); font-size: 12px;">
全市 118/266
</div>
</div>
</div>
<!-- C. 温度计条形图 -->
<div class="chart-box" style="padding:10px 16px;">
<div id="thermo-part6-2" class="chart" style="height:80px"></div>
</div>
<!-- 金字塔水平指示器(含各水平学校数量) -->
<div class="pyramid-container">
<div class="pyramid-row">
<div class="pyramid-block lv4 dimmed">
水平 4 · 1 所
</div>
</div>
<div class="pyramid-row">
<div class="pyramid-block lv3 active">
水平 3 · 8 所
</div>
<span class="pyramid-label"><span class="arrow"></span>嘉一实高</span>
</div>
<div class="pyramid-row">
<div class="pyramid-block lv2 dimmed">
水平 2 · 1 所
</div>
</div>
<div class="pyramid-row">
<div class="pyramid-block lv1 dimmed">
水平 1 · 1 所
</div>
</div>
</div>
<p style="text-indent:0; margin:10px 0; color: var(--gray-500); font-size:14px;">
<strong>水平3含义:</strong>有教研活动,质量较好
</p>
<!-- 三级维度LLM分析 -->
<div class="llm-analysis">
<p><em>(分析文字生成失败:Error code: 402 - {'error': {'type': 'insufficient_quota', 'code': 'quota_exhausted', 'message': 'Quota for the current billing period is exhausted. Resets at 2026-05-14T07:00:00Z (in ~6 days).', 'recovers_at': '2026-05-14T07:00:00Z', 'retry_after_seconds': 21600}}</em></p>
</div>
<hr class="section-divider">
<h2 id="sub-part6-3">四、 项目支持</h2>
<div class="score-cards" style="grid-template-columns: repeat(4, 1fr);">
<div class="score-card">
<div class="label">得分</div>
<div class="value" style="font-size:24px">41.4</div>
<div class="diff negative">
-12.6 vs 区均值
</div>
</div>
<div class="score-card">
<div class="label">区均值</div>
<div class="value" style="font-size:24px">54.1</div>
</div>
<div class="score-card">
<div class="label">水平等级</div>
<div class="level-indicator level-1">水平 1</div>
</div>
<div class="score-card">
<div class="label">排名</div>
<div class="value" style="font-size:24px">11/11</div>
<div class="diff" style="color: var(--gray-500); font-size: 12px;">
全市 266/266
</div>
</div>
</div>
<!-- C. 温度计条形图 -->
<div class="chart-box" style="padding:10px 16px;">
<div id="thermo-part6-3" class="chart" style="height:80px"></div>
</div>
<!-- 金字塔水平指示器(含各水平学校数量) -->
<div class="pyramid-container">
<div class="pyramid-row">
<div class="pyramid-block lv4 dimmed">
水平 4 · 3 所
</div>
</div>
<div class="pyramid-row">
<div class="pyramid-block lv3 dimmed">
水平 3 · 2 所
</div>
</div>
<div class="pyramid-row">
<div class="pyramid-block lv2 dimmed">
水平 2 · 3 所
</div>
</div>
<div class="pyramid-row">
<div class="pyramid-block lv1 active">
水平 1 · 3 所
</div>
<span class="pyramid-label"><span class="arrow"></span>嘉一实高</span>
</div>
</div>
<p style="text-indent:0; margin:10px 0; color: var(--gray-500); font-size:14px;">
<strong>水平1含义:</strong>各学科校级及校级以上的项目均没有
</p>
<!-- 三级维度LLM分析 -->
<div class="llm-analysis">
<p><em>(分析文字生成失败:Error code: 402 - {'error': {'type': 'insufficient_quota', 'code': 'quota_exhausted', 'message': 'Quota for the current billing period is exhausted. Resets at 2026-05-14T07:00:00Z (in ~6 days).', 'recovers_at': '2026-05-14T07:00:00Z', 'retry_after_seconds': 21600}}</em></p>
</div>
</div>
<div class="section" id="part7">
<h1>第七部分 教育质量评估力表现</h1>
<h2>一、整体表现</h2>
<div class="score-cards">
<div class="score-card">
<div class="label">教育质量评估力得分</div>
<div class="value">51.2</div>
<div class="diff negative">
-3.2 vs 区均值
</div>
</div>
<div class="score-card">
<div class="label">同类学校均值</div>
<div class="value" style="font-size:24px">49.6</div>
</div>
<div class="score-card">
<div class="label">区内排名</div>
<div class="value">8/11</div>
<div class="diff" style="color: var(--gray-500); font-size: 12px;">
全市 120/266
</div>
</div>
<div class="score-card">
<div class="label">表现</div>
<div class="value" style="font-size:14px">
<span class="type-badge weak">待提升</span>
</div>
</div>
</div>
<!-- 维度独立得分柱状图 + 子维度雷达/柱状图 -->
<div class="chart-row">
<div class="chart-box">
<div id="dim-score-part7" class="chart"></div>
<div class="chart-title">图7-1 教育质量评估力得分情况</div>
</div>
<div class="chart-box">
<div id="sub-radar-part7" class="chart"></div>
<div class="chart-title">图7-2 教育质量评估力各子维度得分情况</div>
</div>
</div>
<div class="chart-caption">
<p><em>(分析文字生成失败:Error code: 402 - {'error': {'type': 'insufficient_quota', 'code': 'quota_exhausted', 'message': 'Quota for the current billing period is exhausted. Resets at 2026-05-14T07:00:00Z (in ~6 days).', 'recovers_at': '2026-05-14T07:00:00Z', 'retry_after_seconds': 21600}}</em></p>
</div>
<!-- 子维度柱状图 + 水平分布堆叠图 -->
<div class="chart-row">
<div class="chart-box">
<div id="chart-part7" class="chart"></div>
<div class="chart-title">图7-3 教育质量评估力各子维度对比详情</div>
</div>
<div class="chart-box">
<div id="level-part7" class="chart"></div>
<div class="chart-title">图7-4 教育质量评估力各子维度水平分布</div>
</div>
</div>
<div class="chart-caption">
<p><em>(分析文字生成失败:Error code: 402 - {'error': {'type': 'insufficient_quota', 'code': 'quota_exhausted', 'message': 'Quota for the current billing period is exhausted. Resets at 2026-05-14T07:00:00Z (in ~6 days).', 'recovers_at': '2026-05-14T07:00:00Z', 'retry_after_seconds': 21600}}</em></p>
</div>
<!-- 聚类散点图(2D或3D -->
<div class="chart-box">
<div id="scatter-part7" class="chart" style="height:450px"></div>
<div class="chart-title">图7-5 教育质量评估力聚类分析散点图</div>
</div>
<div class="chart-caption">
<p><em>(分析文字生成失败:Error code: 402 - {'error': {'type': 'insufficient_quota', 'code': 'quota_exhausted', 'message': 'Quota for the current billing period is exhausted. Resets at 2026-05-14T07:00:00Z (in ~6 days).', 'recovers_at': '2026-05-14T07:00:00Z', 'retry_after_seconds': 21600}}</em></p>
</div>
<!-- 维度整体LLM分析 -->
<div class="llm-analysis">
<p><em>(分析文字生成失败:Error code: 402 - {'error': {'type': 'insufficient_quota', 'code': 'quota_exhausted', 'message': 'Quota for the current billing period is exhausted. Resets at 2026-05-14T07:00:00Z (in ~6 days).', 'recovers_at': '2026-05-14T07:00:00Z', 'retry_after_seconds': 21600}}</em></p>
</div>
<!-- 水平对比表 -->
<h3>教育质量评估力各子维度水平对比 (表 7-1)</h3>
<table class="level-table">
<thead>
<tr>
<th>子维度</th>
<th>嘉一实高</th>
<th>得分</th>
<th>区均值</th>
<th>区内排名</th>
<th>全市排名</th>
</tr>
</thead>
<tbody>
<tr>
<td>科学评价观</td>
<td class="lv4">水平 4</td>
<td>59.4</td>
<td>54.6</td>
<td>3/11</td>
<td>34/266</td>
</tr>
<tr>
<td>学业质量评估</td>
<td class="lv3">水平 3</td>
<td>52.6</td>
<td>53.6</td>
<td>6/11</td>
<td>88/266</td>
</tr>
<tr>
<td>综合素质评估</td>
<td class="lv2">水平 2</td>
<td>47.8</td>
<td>54.6</td>
<td>9/11</td>
<td>149/266</td>
</tr>
<tr>
<td>实践活动评估</td>
<td class="lv2">水平 2</td>
<td>45.1</td>
<td>54.7</td>
<td>9/11</td>
<td>170/266</td>
</tr>
</tbody>
</table>
<hr class="section-divider">
<!-- 各三级维度详细分析 -->
<h2 id="sub-part7-1">二、 科学评价观</h2>
<div class="score-cards" style="grid-template-columns: repeat(4, 1fr);">
<div class="score-card">
<div class="label">得分</div>
<div class="value" style="font-size:24px">59.4</div>
<div class="diff positive">
+4.7 vs 区均值
</div>
</div>
<div class="score-card">
<div class="label">区均值</div>
<div class="value" style="font-size:24px">54.6</div>
</div>
<div class="score-card">
<div class="label">水平等级</div>
<div class="level-indicator level-4">水平 4</div>
</div>
<div class="score-card">
<div class="label">排名</div>
<div class="value" style="font-size:24px">3/11</div>
<div class="diff" style="color: var(--gray-500); font-size: 12px;">
全市 34/266
</div>
</div>
</div>
<!-- C. 温度计条形图 -->
<div class="chart-box" style="padding:10px 16px;">
<div id="thermo-part7-1" class="chart" style="height:80px"></div>
</div>
<!-- 金字塔水平指示器(含各水平学校数量) -->
<div class="pyramid-container">
<div class="pyramid-row">
<div class="pyramid-block lv4 active">
水平 4 · 3 所
</div>
<span class="pyramid-label"><span class="arrow"></span>嘉一实高</span>
</div>
<div class="pyramid-row">
<div class="pyramid-block lv3 dimmed">
水平 3 · 7 所
</div>
</div>
<div class="pyramid-row">
<div class="pyramid-block lv2 dimmed">
水平 2 · 1 所
</div>
</div>
<div class="pyramid-row">
<div class="pyramid-block lv1 dimmed">
水平 1 · 0 所
</div>
</div>
</div>
<p style="text-indent:0; margin:10px 0; color: var(--gray-500); font-size:14px;">
<strong>水平4含义:</strong>在所有方面均能至少关注两项素养发展
</p>
<!-- 三级维度LLM分析 -->
<div class="llm-analysis">
<p><em>(分析文字生成失败:Error code: 402 - {'error': {'type': 'insufficient_quota', 'code': 'quota_exhausted', 'message': 'Quota for the current billing period is exhausted. Resets at 2026-05-14T07:00:00Z (in ~6 days).', 'recovers_at': '2026-05-14T07:00:00Z', 'retry_after_seconds': 21600}}</em></p>
</div>
<hr class="section-divider">
<h2 id="sub-part7-2">三、 学业质量评估</h2>
<div class="score-cards" style="grid-template-columns: repeat(4, 1fr);">
<div class="score-card">
<div class="label">得分</div>
<div class="value" style="font-size:24px">52.6</div>
<div class="diff negative">
-1.0 vs 区均值
</div>
</div>
<div class="score-card">
<div class="label">区均值</div>
<div class="value" style="font-size:24px">53.6</div>
</div>
<div class="score-card">
<div class="label">水平等级</div>
<div class="level-indicator level-3">水平 3</div>
</div>
<div class="score-card">
<div class="label">排名</div>
<div class="value" style="font-size:24px">6/11</div>
<div class="diff" style="color: var(--gray-500); font-size: 12px;">
全市 88/266
</div>
</div>
</div>
<!-- C. 温度计条形图 -->
<div class="chart-box" style="padding:10px 16px;">
<div id="thermo-part7-2" class="chart" style="height:80px"></div>
</div>
<!-- 金字塔水平指示器(含各水平学校数量) -->
<div class="pyramid-container">
<div class="pyramid-row">
<div class="pyramid-block lv4 dimmed">
水平 4 · 5 所
</div>
</div>
<div class="pyramid-row">
<div class="pyramid-block lv3 active">
水平 3 · 3 所
</div>
<span class="pyramid-label"><span class="arrow"></span>嘉一实高</span>
</div>
<div class="pyramid-row">
<div class="pyramid-block lv2 dimmed">
水平 2 · 3 所
</div>
</div>
<div class="pyramid-row">
<div class="pyramid-block lv1 dimmed">
水平 1 · 0 所
</div>
</div>
</div>
<p style="text-indent:0; margin:10px 0; color: var(--gray-500); font-size:14px;">
<strong>水平3含义:</strong>校本化评价工具已研制并使用,学期考试质量分析不做硬性要求
</p>
<!-- 三级维度LLM分析 -->
<div class="llm-analysis">
<p><em>(分析文字生成失败:Error code: 402 - {'error': {'type': 'insufficient_quota', 'code': 'quota_exhausted', 'message': 'Quota for the current billing period is exhausted. Resets at 2026-05-14T07:00:00Z (in ~6 days).', 'recovers_at': '2026-05-14T07:00:00Z', 'retry_after_seconds': 21600}}</em></p>
</div>
<hr class="section-divider">
<h2 id="sub-part7-3">四、 综合素质评估</h2>
<div class="score-cards" style="grid-template-columns: repeat(4, 1fr);">
<div class="score-card">
<div class="label">得分</div>
<div class="value" style="font-size:24px">47.8</div>
<div class="diff negative">
-6.8 vs 区均值
</div>
</div>
<div class="score-card">
<div class="label">区均值</div>
<div class="value" style="font-size:24px">54.6</div>
</div>
<div class="score-card">
<div class="label">水平等级</div>
<div class="level-indicator level-2">水平 2</div>
</div>
<div class="score-card">
<div class="label">排名</div>
<div class="value" style="font-size:24px">9/11</div>
<div class="diff" style="color: var(--gray-500); font-size: 12px;">
全市 149/266
</div>
</div>
</div>
<!-- C. 温度计条形图 -->
<div class="chart-box" style="padding:10px 16px;">
<div id="thermo-part7-3" class="chart" style="height:80px"></div>
</div>
<!-- 金字塔水平指示器(含各水平学校数量) -->
<div class="pyramid-container">
<div class="pyramid-row">
<div class="pyramid-block lv4 dimmed">
水平 4 · 5 所
</div>
</div>
<div class="pyramid-row">
<div class="pyramid-block lv3 dimmed">
水平 3 · 3 所
</div>
</div>
<div class="pyramid-row">
<div class="pyramid-block lv2 active">
水平 2 · 3 所
</div>
<span class="pyramid-label"><span class="arrow"></span>嘉一实高</span>
</div>
<div class="pyramid-row">
<div class="pyramid-block lv1 dimmed">
水平 1 · 0 所
</div>
</div>
</div>
<p style="text-indent:0; margin:10px 0; color: var(--gray-500); font-size:14px;">
<strong>水平2含义:</strong>校本化综合素质评价方案建成,但具体评价工具有待开发
</p>
<!-- 三级维度LLM分析 -->
<div class="llm-analysis">
<p><em>(分析文字生成失败:Error code: 402 - {'error': {'type': 'insufficient_quota', 'code': 'quota_exhausted', 'message': 'Quota for the current billing period is exhausted. Resets at 2026-05-14T07:00:00Z (in ~6 days).', 'recovers_at': '2026-05-14T07:00:00Z', 'retry_after_seconds': 21600}}</em></p>
</div>
<hr class="section-divider">
<h2 id="sub-part7-4">五、 实践活动评估</h2>
<div class="score-cards" style="grid-template-columns: repeat(4, 1fr);">
<div class="score-card">
<div class="label">得分</div>
<div class="value" style="font-size:24px">45.1</div>
<div class="diff negative">
-9.6 vs 区均值
</div>
</div>
<div class="score-card">
<div class="label">区均值</div>
<div class="value" style="font-size:24px">54.7</div>
</div>
<div class="score-card">
<div class="label">水平等级</div>
<div class="level-indicator level-2">水平 2</div>
</div>
<div class="score-card">
<div class="label">排名</div>
<div class="value" style="font-size:24px">9/11</div>
<div class="diff" style="color: var(--gray-500); font-size: 12px;">
全市 170/266
</div>
</div>
</div>
<!-- C. 温度计条形图 -->
<div class="chart-box" style="padding:10px 16px;">
<div id="thermo-part7-4" class="chart" style="height:80px"></div>
</div>
<!-- 金字塔水平指示器(含各水平学校数量) -->
<div class="pyramid-container">
<div class="pyramid-row">
<div class="pyramid-block lv4 dimmed">
水平 4 · 7 所
</div>
</div>
<div class="pyramid-row">
<div class="pyramid-block lv3 dimmed">
水平 3 · 1 所
</div>
</div>
<div class="pyramid-row">
<div class="pyramid-block lv2 active">
水平 2 · 1 所
</div>
<span class="pyramid-label"><span class="arrow"></span>嘉一实高</span>
</div>
<div class="pyramid-row">
<div class="pyramid-block lv1 dimmed">
水平 1 · 2 所
</div>
</div>
</div>
<p style="text-indent:0; margin:10px 0; color: var(--gray-500); font-size:14px;">
<strong>水平2含义:</strong>学科实践活动的校本化评价工具已研制
</p>
<!-- 三级维度LLM分析 -->
<div class="llm-analysis">
<p><em>(分析文字生成失败:Error code: 402 - {'error': {'type': 'insufficient_quota', 'code': 'quota_exhausted', 'message': 'Quota for the current billing period is exhausted. Resets at 2026-05-14T07:00:00Z (in ~6 days).', 'recovers_at': '2026-05-14T07:00:00Z', 'retry_after_seconds': 21600}}</em></p>
</div>
</div>
<div class="section" id="part8">
<h1>第八部分 教育条件保障力表现</h1>
<h2>一、整体表现</h2>
<div class="score-cards">
<div class="score-card">
<div class="label">教育条件保障力得分</div>
<div class="value">53.7</div>
<div class="diff positive">
+3.3 vs 区均值
</div>
</div>
<div class="score-card">
<div class="label">同类学校均值</div>
<div class="value" style="font-size:24px">49.8</div>
</div>
<div class="score-card">
<div class="label">区内排名</div>
<div class="value">5/11</div>
<div class="diff" style="color: var(--gray-500); font-size: 12px;">
全市 80/266
</div>
</div>
<div class="score-card">
<div class="label">表现</div>
<div class="value" style="font-size:14px">
<span class="type-badge good">略高于区均</span>
</div>
</div>
</div>
<!-- 维度独立得分柱状图 + 子维度雷达/柱状图 -->
<div class="chart-row">
<div class="chart-box">
<div id="dim-score-part8" class="chart"></div>
<div class="chart-title">图8-1 教育条件保障力得分情况</div>
</div>
<div class="chart-box">
<div id="sub-radar-part8" class="chart"></div>
<div class="chart-title">图8-2 教育条件保障力各子维度得分情况</div>
</div>
</div>
<div class="chart-caption">
<p><em>(分析文字生成失败:Error code: 402 - {'error': {'type': 'insufficient_quota', 'code': 'quota_exhausted', 'message': 'Quota for the current billing period is exhausted. Resets at 2026-05-14T07:00:00Z (in ~6 days).', 'recovers_at': '2026-05-14T07:00:00Z', 'retry_after_seconds': 21600}}</em></p>
</div>
<!-- 子维度柱状图 + 水平分布堆叠图 -->
<div class="chart-row">
<div class="chart-box">
<div id="chart-part8" class="chart"></div>
<div class="chart-title">图8-3 教育条件保障力各子维度对比详情</div>
</div>
<div class="chart-box">
<div id="level-part8" class="chart"></div>
<div class="chart-title">图8-4 教育条件保障力各子维度水平分布</div>
</div>
</div>
<div class="chart-caption">
<p><em>(分析文字生成失败:Error code: 402 - {'error': {'type': 'insufficient_quota', 'code': 'quota_exhausted', 'message': 'Quota for the current billing period is exhausted. Resets at 2026-05-14T07:00:00Z (in ~6 days).', 'recovers_at': '2026-05-14T07:00:00Z', 'retry_after_seconds': 21600}}</em></p>
</div>
<!-- 聚类散点图(2D或3D -->
<div class="chart-box">
<div id="scatter-part8" class="chart" style="height:450px"></div>
<div class="chart-title">图8-5 教育条件保障力聚类分析散点图</div>
</div>
<div class="chart-caption">
<p><em>(分析文字生成失败:Error code: 402 - {'error': {'type': 'insufficient_quota', 'code': 'quota_exhausted', 'message': 'Quota for the current billing period is exhausted. Resets at 2026-05-14T07:00:00Z (in ~6 days).', 'recovers_at': '2026-05-14T07:00:00Z', 'retry_after_seconds': 21600}}</em></p>
</div>
<!-- 维度整体LLM分析 -->
<div class="llm-analysis">
<p><em>(分析文字生成失败:Error code: 402 - {'error': {'type': 'insufficient_quota', 'code': 'quota_exhausted', 'message': 'Quota for the current billing period is exhausted. Resets at 2026-05-14T07:00:00Z (in ~6 days).', 'recovers_at': '2026-05-14T07:00:00Z', 'retry_after_seconds': 21600}}</em></p>
</div>
<!-- 水平对比表 -->
<h3>教育条件保障力各子维度水平对比 (表 8-1)</h3>
<table class="level-table">
<thead>
<tr>
<th>子维度</th>
<th>嘉一实高</th>
<th>得分</th>
<th>区均值</th>
<th>区内排名</th>
<th>全市排名</th>
</tr>
</thead>
<tbody>
<tr>
<td>区域推进</td>
<td class="lv3">水平 3</td>
<td>55.2</td>
<td>50.8</td>
<td>3/11</td>
<td>90/266</td>
</tr>
<tr>
<td>环境支持</td>
<td class="lv3">水平 3</td>
<td>52.2</td>
<td>48.4</td>
<td>4/11</td>
<td>96/266</td>
</tr>
<tr>
<td>资源支持</td>
<td class="lv3">水平 3</td>
<td>53.8</td>
<td>52.2</td>
<td>5/11</td>
<td>101/266</td>
</tr>
</tbody>
</table>
<hr class="section-divider">
<!-- 各三级维度详细分析 -->
<h2 id="sub-part8-1">二、 区域推进</h2>
<div class="score-cards" style="grid-template-columns: repeat(4, 1fr);">
<div class="score-card">
<div class="label">得分</div>
<div class="value" style="font-size:24px">55.2</div>
<div class="diff positive">
+4.5 vs 区均值
</div>
</div>
<div class="score-card">
<div class="label">区均值</div>
<div class="value" style="font-size:24px">50.8</div>
</div>
<div class="score-card">
<div class="label">水平等级</div>
<div class="level-indicator level-3">水平 3</div>
</div>
<div class="score-card">
<div class="label">排名</div>
<div class="value" style="font-size:24px">3/11</div>
<div class="diff" style="color: var(--gray-500); font-size: 12px;">
全市 90/266
</div>
</div>
</div>
<!-- C. 温度计条形图 -->
<div class="chart-box" style="padding:10px 16px;">
<div id="thermo-part8-1" class="chart" style="height:80px"></div>
</div>
<!-- 金字塔水平指示器(含各水平学校数量) -->
<div class="pyramid-container">
<div class="pyramid-row">
<div class="pyramid-block lv4 dimmed">
水平 4 · 2 所
</div>
</div>
<div class="pyramid-row">
<div class="pyramid-block lv3 active">
水平 3 · 4 所
</div>
<span class="pyramid-label"><span class="arrow"></span>嘉一实高</span>
</div>
<div class="pyramid-row">
<div class="pyramid-block lv2 dimmed">
水平 2 · 2 所
</div>
</div>
<div class="pyramid-row">
<div class="pyramid-block lv1 dimmed">
水平 1 · 3 所
</div>
</div>
</div>
<p style="text-indent:0; margin:10px 0; color: var(--gray-500); font-size:14px;">
<strong>水平3含义:</strong>召开会议平均一个月1次及以上,区域管理文件3个以上,措施达3项
</p>
<!-- 三级维度LLM分析 -->
<div class="llm-analysis">
<p><em>(分析文字生成失败:Error code: 402 - {'error': {'type': 'insufficient_quota', 'code': 'quota_exhausted', 'message': 'Quota for the current billing period is exhausted. Resets at 2026-05-14T07:00:00Z (in ~6 days).', 'recovers_at': '2026-05-14T07:00:00Z', 'retry_after_seconds': 21600}}</em></p>
</div>
<hr class="section-divider">
<h2 id="sub-part8-2">三、 环境支持</h2>
<div class="score-cards" style="grid-template-columns: repeat(4, 1fr);">
<div class="score-card">
<div class="label">得分</div>
<div class="value" style="font-size:24px">52.2</div>
<div class="diff positive">
+3.8 vs 区均值
</div>
</div>
<div class="score-card">
<div class="label">区均值</div>
<div class="value" style="font-size:24px">48.4</div>
</div>
<div class="score-card">
<div class="label">水平等级</div>
<div class="level-indicator level-3">水平 3</div>
</div>
<div class="score-card">
<div class="label">排名</div>
<div class="value" style="font-size:24px">4/11</div>
<div class="diff" style="color: var(--gray-500); font-size: 12px;">
全市 96/266
</div>
</div>
</div>
<!-- C. 温度计条形图 -->
<div class="chart-box" style="padding:10px 16px;">
<div id="thermo-part8-2" class="chart" style="height:80px"></div>
</div>
<!-- 金字塔水平指示器(含各水平学校数量) -->
<div class="pyramid-container">
<div class="pyramid-row">
<div class="pyramid-block lv4 dimmed">
水平 4 · 3 所
</div>
</div>
<div class="pyramid-row">
<div class="pyramid-block lv3 active">
水平 3 · 2 所
</div>
<span class="pyramid-label"><span class="arrow"></span>嘉一实高</span>
</div>
<div class="pyramid-row">
<div class="pyramid-block lv2 dimmed">
水平 2 · 4 所
</div>
</div>
<div class="pyramid-row">
<div class="pyramid-block lv1 dimmed">
水平 1 · 2 所
</div>
</div>
</div>
<p style="text-indent:0; margin:10px 0; color: var(--gray-500); font-size:14px;">
<strong>水平3含义:</strong>信息化支持和硬件在平均水平附近
</p>
<!-- 三级维度LLM分析 -->
<div class="llm-analysis">
<p><em>(分析文字生成失败:Error code: 402 - {'error': {'type': 'insufficient_quota', 'code': 'quota_exhausted', 'message': 'Quota for the current billing period is exhausted. Resets at 2026-05-14T07:00:00Z (in ~6 days).', 'recovers_at': '2026-05-14T07:00:00Z', 'retry_after_seconds': 21600}}</em></p>
</div>
<hr class="section-divider">
<h2 id="sub-part8-3">四、 资源支持</h2>
<div class="score-cards" style="grid-template-columns: repeat(4, 1fr);">
<div class="score-card">
<div class="label">得分</div>
<div class="value" style="font-size:24px">53.8</div>
<div class="diff positive">
+1.6 vs 区均值
</div>
</div>
<div class="score-card">
<div class="label">区均值</div>
<div class="value" style="font-size:24px">52.2</div>
</div>
<div class="score-card">
<div class="label">水平等级</div>
<div class="level-indicator level-3">水平 3</div>
</div>
<div class="score-card">
<div class="label">排名</div>
<div class="value" style="font-size:24px">5/11</div>
<div class="diff" style="color: var(--gray-500); font-size: 12px;">
全市 101/266
</div>
</div>
</div>
<!-- C. 温度计条形图 -->
<div class="chart-box" style="padding:10px 16px;">
<div id="thermo-part8-3" class="chart" style="height:80px"></div>
</div>
<!-- 金字塔水平指示器(含各水平学校数量) -->
<div class="pyramid-container">
<div class="pyramid-row">
<div class="pyramid-block lv4 dimmed">
水平 4 · 2 所
</div>
</div>
<div class="pyramid-row">
<div class="pyramid-block lv3 active">
水平 3 · 6 所
</div>
<span class="pyramid-label"><span class="arrow"></span>嘉一实高</span>
</div>
<div class="pyramid-row">
<div class="pyramid-block lv2 dimmed">
水平 2 · 2 所
</div>
</div>
<div class="pyramid-row">
<div class="pyramid-block lv1 dimmed">
水平 1 · 1 所
</div>
</div>
</div>
<p style="text-indent:0; margin:10px 0; color: var(--gray-500); font-size:14px;">
<strong>水平3含义:</strong>校内外资源至少有一项供给较好,师资水平较好
</p>
<!-- 三级维度LLM分析 -->
<div class="llm-analysis">
<p><em>(分析文字生成失败:Error code: 402 - {'error': {'type': 'insufficient_quota', 'code': 'quota_exhausted', 'message': 'Quota for the current billing period is exhausted. Resets at 2026-05-14T07:00:00Z (in ~6 days).', 'recovers_at': '2026-05-14T07:00:00Z', 'retry_after_seconds': 21600}}</em></p>
</div>
</div>
<div class="section" id="part9">
<h1>第九部分 数字化赋能力表现</h1>
<h2>一、整体表现</h2>
<div class="score-cards">
<div class="score-card">
<div class="label">数字化赋能力得分</div>
<div class="value">54.8</div>
<div class="diff positive">
+3.5 vs 区均值
</div>
</div>
<div class="score-card">
<div class="label">同类学校均值</div>
<div class="value" style="font-size:24px">49.6</div>
</div>
<div class="score-card">
<div class="label">区内排名</div>
<div class="value">2/11</div>
<div class="diff" style="color: var(--gray-500); font-size: 12px;">
全市 25/266
</div>
</div>
<div class="score-card">
<div class="label">表现</div>
<div class="value" style="font-size:14px">
<span class="type-badge good">表现较好</span>
</div>
</div>
</div>
<!-- 维度独立得分柱状图 + 子维度雷达/柱状图 -->
<div class="chart-row">
<div class="chart-box">
<div id="dim-score-part9" class="chart"></div>
<div class="chart-title">图9-1 数字化赋能力得分情况</div>
</div>
<div class="chart-box">
<div id="sub-radar-part9" class="chart"></div>
<div class="chart-title">图9-2 数字化赋能力各子维度得分情况</div>
</div>
</div>
<div class="chart-caption">
<p><em>(分析文字生成失败:Error code: 402 - {'error': {'type': 'insufficient_quota', 'code': 'quota_exhausted', 'message': 'Quota for the current billing period is exhausted. Resets at 2026-05-14T07:00:00Z (in ~6 days).', 'recovers_at': '2026-05-14T07:00:00Z', 'retry_after_seconds': 21600}}</em></p>
</div>
<!-- 子维度柱状图 + 水平分布堆叠图 -->
<div class="chart-row">
<div class="chart-box">
<div id="chart-part9" class="chart"></div>
<div class="chart-title">图9-3 数字化赋能力各子维度对比详情</div>
</div>
<div class="chart-box">
<div id="level-part9" class="chart"></div>
<div class="chart-title">图9-4 数字化赋能力各子维度水平分布</div>
</div>
</div>
<div class="chart-caption">
<p><em>(分析文字生成失败:Error code: 402 - {'error': {'type': 'insufficient_quota', 'code': 'quota_exhausted', 'message': 'Quota for the current billing period is exhausted. Resets at 2026-05-14T07:00:00Z (in ~6 days).', 'recovers_at': '2026-05-14T07:00:00Z', 'retry_after_seconds': 21600}}</em></p>
</div>
<!-- 聚类散点图(2D或3D -->
<div class="chart-box">
<div id="scatter-part9" class="chart" style="height:450px"></div>
<div class="chart-title">图9-5 数字化赋能力聚类分析散点图</div>
</div>
<div class="chart-caption">
<p><em>(分析文字生成失败:Error code: 402 - {'error': {'type': 'insufficient_quota', 'code': 'quota_exhausted', 'message': 'Quota for the current billing period is exhausted. Resets at 2026-05-14T07:00:00Z (in ~6 days).', 'recovers_at': '2026-05-14T07:00:00Z', 'retry_after_seconds': 21600}}</em></p>
</div>
<!-- 维度整体LLM分析 -->
<div class="llm-analysis">
<p><em>(分析文字生成失败:Error code: 402 - {'error': {'type': 'insufficient_quota', 'code': 'quota_exhausted', 'message': 'Quota for the current billing period is exhausted. Resets at 2026-05-14T07:00:00Z (in ~6 days).', 'recovers_at': '2026-05-14T07:00:00Z', 'retry_after_seconds': 21600}}</em></p>
</div>
<!-- 水平对比表 -->
<h3>数字化赋能力各子维度水平对比 (表 9-1)</h3>
<table class="level-table">
<thead>
<tr>
<th>子维度</th>
<th>嘉一实高</th>
<th>得分</th>
<th>区均值</th>
<th>区内排名</th>
<th>全市排名</th>
</tr>
</thead>
<tbody>
<tr>
<td>教学方式创新</td>
<td class="lv3">水平 3</td>
<td>51.5</td>
<td>50.7</td>
<td>5/11</td>
<td>99/266</td>
</tr>
<tr>
<td>评价精准化与个性化</td>
<td class="lv3">水平 3</td>
<td>51.7</td>
<td>50.8</td>
<td>3/11</td>
<td>51/266</td>
</tr>
<tr>
<td>课程迭代优化</td>
<td class="lv4">水平 4</td>
<td>61.3</td>
<td>52.5</td>
<td>4/11</td>
<td>18/266</td>
</tr>
</tbody>
</table>
<hr class="section-divider">
<!-- 各三级维度详细分析 -->
<h2 id="sub-part9-1">二、 教学方式创新</h2>
<div class="score-cards" style="grid-template-columns: repeat(4, 1fr);">
<div class="score-card">
<div class="label">得分</div>
<div class="value" style="font-size:24px">51.5</div>
<div class="diff positive">
+0.8 vs 区均值
</div>
</div>
<div class="score-card">
<div class="label">区均值</div>
<div class="value" style="font-size:24px">50.7</div>
</div>
<div class="score-card">
<div class="label">水平等级</div>
<div class="level-indicator level-3">水平 3</div>
</div>
<div class="score-card">
<div class="label">排名</div>
<div class="value" style="font-size:24px">5/11</div>
<div class="diff" style="color: var(--gray-500); font-size: 12px;">
全市 99/266
</div>
</div>
</div>
<!-- C. 温度计条形图 -->
<div class="chart-box" style="padding:10px 16px;">
<div id="thermo-part9-1" class="chart" style="height:80px"></div>
</div>
<!-- 金字塔水平指示器(含各水平学校数量) -->
<div class="pyramid-container">
<div class="pyramid-row">
<div class="pyramid-block lv4 dimmed">
水平 4 · 1 所
</div>
</div>
<div class="pyramid-row">
<div class="pyramid-block lv3 active">
水平 3 · 9 所
</div>
<span class="pyramid-label"><span class="arrow"></span>嘉一实高</span>
</div>
<div class="pyramid-row">
<div class="pyramid-block lv2 dimmed">
水平 2 · 1 所
</div>
</div>
<div class="pyramid-row">
<div class="pyramid-block lv1 dimmed">
水平 1 · 0 所
</div>
</div>
</div>
<p style="text-indent:0; margin:10px 0; color: var(--gray-500); font-size:14px;">
<strong>水平3含义:</strong>信息技术与教学融合程度较高,教师能使用信息技术
</p>
<!-- 三级维度LLM分析 -->
<div class="llm-analysis">
<p><em>(分析文字生成失败:Error code: 402 - {'error': {'type': 'insufficient_quota', 'code': 'quota_exhausted', 'message': 'Quota for the current billing period is exhausted. Resets at 2026-05-14T07:00:00Z (in ~6 days).', 'recovers_at': '2026-05-14T07:00:00Z', 'retry_after_seconds': 21600}}</em></p>
</div>
<hr class="section-divider">
<h2 id="sub-part9-2">三、 评价精准化与个性化</h2>
<div class="score-cards" style="grid-template-columns: repeat(4, 1fr);">
<div class="score-card">
<div class="label">得分</div>
<div class="value" style="font-size:24px">51.7</div>
<div class="diff positive">
+0.9 vs 区均值
</div>
</div>
<div class="score-card">
<div class="label">区均值</div>
<div class="value" style="font-size:24px">50.8</div>
</div>
<div class="score-card">
<div class="label">水平等级</div>
<div class="level-indicator level-3">水平 3</div>
</div>
<div class="score-card">
<div class="label">排名</div>
<div class="value" style="font-size:24px">3/11</div>
<div class="diff" style="color: var(--gray-500); font-size: 12px;">
全市 51/266
</div>
</div>
</div>
<!-- C. 温度计条形图 -->
<div class="chart-box" style="padding:10px 16px;">
<div id="thermo-part9-2" class="chart" style="height:80px"></div>
</div>
<!-- 金字塔水平指示器(含各水平学校数量) -->
<div class="pyramid-container">
<div class="pyramid-row">
<div class="pyramid-block lv4 dimmed">
水平 4 · 0 所
</div>
</div>
<div class="pyramid-row">
<div class="pyramid-block lv3 active">
水平 3 · 8 所
</div>
<span class="pyramid-label"><span class="arrow"></span>嘉一实高</span>
</div>
<div class="pyramid-row">
<div class="pyramid-block lv2 dimmed">
水平 2 · 3 所
</div>
</div>
<div class="pyramid-row">
<div class="pyramid-block lv1 dimmed">
水平 1 · 0 所
</div>
</div>
</div>
<p style="text-indent:0; margin:10px 0; color: var(--gray-500); font-size:14px;">
<strong>水平3含义:</strong>借助第三方平台支持学科诊断与综合素质评价
</p>
<!-- 三级维度LLM分析 -->
<div class="llm-analysis">
<p><em>(分析文字生成失败:Error code: 402 - {'error': {'type': 'insufficient_quota', 'code': 'quota_exhausted', 'message': 'Quota for the current billing period is exhausted. Resets at 2026-05-14T07:00:00Z (in ~6 days).', 'recovers_at': '2026-05-14T07:00:00Z', 'retry_after_seconds': 21600}}</em></p>
</div>
<hr class="section-divider">
<h2 id="sub-part9-3">四、 课程迭代优化</h2>
<div class="score-cards" style="grid-template-columns: repeat(4, 1fr);">
<div class="score-card">
<div class="label">得分</div>
<div class="value" style="font-size:24px">61.3</div>
<div class="diff positive">
+8.8 vs 区均值
</div>
</div>
<div class="score-card">
<div class="label">区均值</div>
<div class="value" style="font-size:24px">52.5</div>
</div>
<div class="score-card">
<div class="label">水平等级</div>
<div class="level-indicator level-4">水平 4</div>
</div>
<div class="score-card">
<div class="label">排名</div>
<div class="value" style="font-size:24px">4/11</div>
<div class="diff" style="color: var(--gray-500); font-size: 12px;">
全市 18/266
</div>
</div>
</div>
<!-- C. 温度计条形图 -->
<div class="chart-box" style="padding:10px 16px;">
<div id="thermo-part9-3" class="chart" style="height:80px"></div>
</div>
<!-- 金字塔水平指示器(含各水平学校数量) -->
<div class="pyramid-container">
<div class="pyramid-row">
<div class="pyramid-block lv4 active">
水平 4 · 6 所
</div>
<span class="pyramid-label"><span class="arrow"></span>嘉一实高</span>
</div>
<div class="pyramid-row">
<div class="pyramid-block lv3 dimmed">
水平 3 · 1 所
</div>
</div>
<div class="pyramid-row">
<div class="pyramid-block lv2 dimmed">
水平 2 · 1 所
</div>
</div>
<div class="pyramid-row">
<div class="pyramid-block lv1 dimmed">
水平 1 · 3 所
</div>
</div>
</div>
<p style="text-indent:0; margin:10px 0; color: var(--gray-500); font-size:14px;">
<strong>水平4含义:</strong>学校对促进教学数字化转型有专项研修计划并开展相关活动,业务绝大部分使用信息化系统
</p>
<!-- 三级维度LLM分析 -->
<div class="llm-analysis">
<p><em>(分析文字生成失败:Error code: 402 - {'error': {'type': 'insufficient_quota', 'code': 'quota_exhausted', 'message': 'Quota for the current billing period is exhausted. Resets at 2026-05-14T07:00:00Z (in ~6 days).', 'recovers_at': '2026-05-14T07:00:00Z', 'retry_after_seconds': 21600}}</em></p>
</div>
</div>
<div class="section" id="conclusion">
<h1>第十部分 总结与改进建议</h1>
<div class="top3-box" style="background: linear-gradient(135deg, #eff6ff, #dbeafe); border: 2px solid #3b82f6; border-radius: 12px; padding: 24px; margin: 0 0 24px 0;">
<h2 style="color: #1e40af; margin: 0 0 16px 0; font-size: 20px;">最紧迫的三件事</h2>
<p style="color: #1e3a5f; font-size: 14px; margin: 0 0 16px 0; font-style: italic;">以下三项是综合严重程度、杠杆效应和可操作性后,建议学校本学期优先推进的核心事项。</p>
<div class="llm-analysis">
<p><em>(分析文字生成失败:Error code: 402 - {'error': {'type': 'insufficient_quota', 'code': 'quota_exhausted', 'message': 'Quota for the current billing period is exhausted. Resets at 2026-05-14T07:00:00Z (in ~6 days).', 'recovers_at': '2026-05-14T07:00:00Z', 'retry_after_seconds': 21600}}</em></p>
</div>
</div>
<h2>一、跨维度综合分析</h2>
<div class="llm-analysis">
<p><em>(分析文字生成失败:Error code: 402 - {'error': {'type': 'insufficient_quota', 'code': 'quota_exhausted', 'message': 'Quota for the current billing period is exhausted. Resets at 2026-05-14T07:00:00Z (in ~6 days).', 'recovers_at': '2026-05-14T07:00:00Z', 'retry_after_seconds': 21600}}</em></p>
</div>
<!-- D. 进步空间瀑布图 -->
<h2>进步空间分析</h2>
<div class="chart-box">
<div id="waterfall-chart" class="chart" style="height:400px"></div>
<div class="chart-title">图10-1 进步空间分析:提升至水平3的潜在收益</div>
</div>
<div class="chart-caption">
<p><em>(分析文字生成失败:Error code: 402 - {'error': {'type': 'insufficient_quota', 'code': 'quota_exhausted', 'message': 'Quota for the current billing period is exhausted. Resets at 2026-05-14T07:00:00Z (in ~6 days).', 'recovers_at': '2026-05-14T07:00:00Z', 'retry_after_seconds': 21600}}</em></p>
</div>
<h2>综合评述与改进方向</h2>
<div class="llm-analysis">
<p><em>(分析文字生成失败:Error code: 402 - {'error': {'type': 'insufficient_quota', 'code': 'quota_exhausted', 'message': 'Quota for the current billing period is exhausted. Resets at 2026-05-14T07:00:00Z (in ~6 days).', 'recovers_at': '2026-05-14T07:00:00Z', 'retry_after_seconds': 21600}}</em></p>
</div>
</div>
<div class="section" id="action-guide">
<h1>第十一部分 实践落地行动指南</h1>
<p class="section-intro" style="color:#555; font-style:italic; margin-bottom:1.5em; border-left:4px solid #2563eb; padding-left:12px;">
本部分基于前述数据分析结果,按"紧迫程度"排列改进行动。学校管理团队应将有限资源优先投入到最紧迫的事项上,而非平均用力。
</p>
<div class="top3-box" style="background: linear-gradient(135deg, #fef2f2, #fee2e2); border: 2px solid #dc2626; border-radius: 12px; padding: 24px; margin: 0 0 24px 0;">
<h2 style="color: #991b1b; margin: 0 0 12px 0; font-size: 18px;">战略聚焦:本学期必须完成的三件事</h2>
<p style="color: #7f1d1d; font-size: 14px; margin: 0 0 16px 0;">以下三项是综合数据严重程度、改进杠杆效应和可操作性后,建议学校本学期<strong>优先且必须</strong>推进的核心事项。后续各节的详细方案均围绕此展开。</p>
<div class="llm-analysis" style="color: #7f1d1d;">
<p><em>(分析文字生成失败:Error code: 402 - {'error': {'type': 'insufficient_quota', 'code': 'quota_exhausted', 'message': 'Quota for the current billing period is exhausted. Resets at 2026-05-14T07:00:00Z (in ~6 days).', 'recovers_at': '2026-05-14T07:00:00Z', 'retry_after_seconds': 21600}}</em></p>
</div>
</div>
<h2 id="action-critical">一、 急需突破(水平1维度)——立即行动</h2>
<div class="llm-analysis">
<p><em>(分析文字生成失败:Error code: 402 - {'error': {'type': 'insufficient_quota', 'code': 'quota_exhausted', 'message': 'Quota for the current billing period is exhausted. Resets at 2026-05-14T07:00:00Z (in ~6 days).', 'recovers_at': '2026-05-14T07:00:00Z', 'retry_after_seconds': 21600}}</em></p>
</div>
<h2 id="action-attention">二、 重点攻关(水平2维度)——本学期启动</h2>
<div class="llm-analysis">
<p><em>(分析文字生成失败:Error code: 402 - {'error': {'type': 'insufficient_quota', 'code': 'quota_exhausted', 'message': 'Quota for the current billing period is exhausted. Resets at 2026-05-14T07:00:00Z (in ~6 days).', 'recovers_at': '2026-05-14T07:00:00Z', 'retry_after_seconds': 21600}}</em></p>
</div>
<h2 id="action-maintain">三、 稳步巩固(水平3维度)——持续推进</h2>
<div class="llm-analysis">
<p><em>(分析文字生成失败:Error code: 402 - {'error': {'type': 'insufficient_quota', 'code': 'quota_exhausted', 'message': 'Quota for the current billing period is exhausted. Resets at 2026-05-14T07:00:00Z (in ~6 days).', 'recovers_at': '2026-05-14T07:00:00Z', 'retry_after_seconds': 21600}}</em></p>
</div>
<h2 id="action-excel">四、 深化引领(水平4维度)——经验输出</h2>
<div class="llm-analysis">
<p><em>(分析文字生成失败:Error code: 402 - {'error': {'type': 'insufficient_quota', 'code': 'quota_exhausted', 'message': 'Quota for the current billing period is exhausted. Resets at 2026-05-14T07:00:00Z (in ~6 days).', 'recovers_at': '2026-05-14T07:00:00Z', 'retry_after_seconds': 21600}}</em></p>
</div>
<h2 id="action-timeline">五、 学期行动时间表</h2>
<div class="llm-analysis">
<p><em>(分析文字生成失败:Error code: 402 - {'error': {'type': 'insufficient_quota', 'code': 'quota_exhausted', 'message': 'Quota for the current billing period is exhausted. Resets at 2026-05-14T07:00:00Z (in ~6 days).', 'recovers_at': '2026-05-14T07:00:00Z', 'retry_after_seconds': 21600}}</em></p>
</div>
<p class="section-note" style="color:#888; font-size:0.9em; margin-top:2em; border-top:1px solid #eee; padding-top:1em;">
<strong>说明:</strong>以上行动建议由AI基于监测数据自动生成,旨在提供思路框架与参考方向。具体实施方案需结合学校实际情况,由学校管理团队与专业教师共同研讨确定,建议在教育专家指导下进行校本化调整。
</p>
</div>
</div>
<script>
const COLORS = {
primary: '#2563eb',
primaryLight: '#93bbfd',
success: '#059669',
warning: '#d97706',
danger: '#dc2626',
gray: '#d1d5db',
grayDark: '#6b7280',
cluster_good: '#2563eb',
cluster_weak: '#f59e0b',
level1: '#ef4444',
level2: '#f59e0b',
level3: '#3b82f6',
level4: '#10b981',
};
// ECharts i18n bundle (injected from Python via Jinja)
const I18N = {"action_attention": "\u9700\u8981\u5173\u6ce8", "action_critical": "\u6025\u9700\u5173\u6ce8", "action_excel": "\u6301\u7eed\u9886\u5148", "action_maintain": "\u4fdd\u6301\u73b0\u72b6", "action_timeline": "\u5b9e\u65bd\u65f6\u95f4\u8868", "alert_title": "\u7d27\u6025\u9884\u8b66\uff1a\u4ee5\u4e0b\u5b50\u7ef4\u5ea6\u9700\u7acb\u5373\u5173\u6ce8", "chat_apikey_failed": "API Key \u89e3\u7801\u5931\u8d25", "chat_clear": "\u6e05\u7a7a\u5bf9\u8bdd", "chat_close": "\u5173\u95ed", "chat_fab_title": "AI \u62a5\u544a\u52a9\u624b", "chat_input_placeholder": "\u8f93\u5165\u60a8\u7684\u95ee\u9898...", "chat_lang_hint": "\uff08\u8bf7\u7528\u4e2d\u6587\u56de\u7b54\uff09", "chat_request_failed": "\u8bf7\u6c42\u5931\u8d25", "chat_retry": "\u8bf7\u7a0d\u540e\u91cd\u8bd5\u3002", "chat_send_title": "\u53d1\u9001", "chat_sg_advice": "\u6539\u8fdb\u5efa\u8bae", "chat_sg_advice_q": "\u7ed9\u51fa\u4e09\u6761\u6700\u91cd\u8981\u7684\u6539\u8fdb\u5efa\u8bae", "chat_sg_gap": "\u5dee\u8ddd\u5206\u6790", "chat_sg_gap_q": "\u4e0e\u533a\u5747\u503c\u76f8\u6bd4\uff0c\u5404\u7ef4\u5ea6\u5dee\u8ddd\u6700\u5927\u7684\u662f\u54ea\u4e9b\uff1f", "chat_sg_overall": "\u603b\u4f53\u8868\u73b0", "chat_sg_overall_q": "\u603b\u4f53\u8868\u73b0\u5982\u4f55\uff1f\u5728\u533a\u5185\u5904\u4e8e\u4ec0\u4e48\u6c34\u5e73\uff1f", "chat_sg_strengths": "\u4f18\u52bf\u4e0e\u77ed\u677f", "chat_sg_strengths_q": "\u54ea\u4e9b\u7ef4\u5ea6\u662f\u4f18\u52bf\uff1f\u54ea\u4e9b\u9700\u8981\u6539\u8fdb\uff1f", "chat_subtitle_prefix": "\u57fa\u4e8e", "chat_subtitle_suffix": "\u62a5\u544a\u6570\u636e", "chat_title": "AI \u62a5\u544a\u52a9\u624b", "chat_welcome_li1": "\u8be2\u95ee\u5177\u4f53\u7ef4\u5ea6\u7684\u8868\u73b0\u548c\u5bf9\u6bd4", "chat_welcome_li2": "\u4e86\u89e3\u4f18\u52bf\u548c\u6539\u8fdb\u65b9\u5411", "chat_welcome_li3": "\u83b7\u5f97\u56fe\u8868\u6570\u636e\u7684\u89e3\u8bfb", "chat_welcome_li4": "\u8bf7\u6559\u5177\u4f53\u7684\u6539\u8fdb\u5efa\u8bae", "chat_welcome_p1_a": "\u60a8\u597d\uff01\u6211\u662f ", "chat_welcome_p1_b": " \u8bfe\u7a0b\u5b9e\u65bd\u76d1\u6d4b\u62a5\u544a\u7684 AI \u52a9\u624b\u3002", "chat_welcome_p2": "\u6211\u5df2\u4e86\u89e3\u8fd9\u4efd\u62a5\u544a\u7684\u5168\u90e8\u6570\u636e\uff0c\u60a8\u53ef\u4ee5\uff1a", "chat_welcome_p3": "\u8bf7\u95ee\u6709\u4ec0\u4e48\u60f3\u4e86\u89e3\u7684\uff1f", "city": "\u5168\u5e02", "city_avg": "\u5e02\u5747\u503c", "cluster_type": "\u8bfe\u7a0b\u5b9e\u65bd\u7c7b\u578b", "current_total": "\u5f53\u524d\u603b\u5206", "diff": "\u5dee\u503c", "diff_vs_district": "\u5dee\u5f02(vs\u533a)", "dim_fig_levels": "\u56fe{n}-4 {name}\u5404\u5b50\u7ef4\u5ea6\u6c34\u5e73\u5206\u5e03", "dim_fig_scatter": "\u56fe{n}-5 {name}\u805a\u7c7b\u5206\u6790\u6563\u70b9\u56fe", "dim_fig_score": "\u56fe{n}-1 {name}\u5f97\u5206\u60c5\u51b5", "dim_fig_subbar": "\u56fe{n}-3 {name}\u5404\u5b50\u7ef4\u5ea6\u5bf9\u6bd4\u8be6\u60c5", "dim_fig_subradar": "\u56fe{n}-2 {name}\u5404\u5b50\u7ef4\u5ea6\u5f97\u5206\u60c5\u51b5", "dim_score_label": "{name}\u5f97\u5206", "dim_section_overall": "\u4e00\u3001\u6574\u4f53\u8868\u73b0", "dim_section_subdims": "{name}\u5404\u5b50\u7ef4\u5ea6\u6c34\u5e73\u5bf9\u6bd4", "dimension": "\u7ef4\u5ea6", "district": "\u533a", "district_avg": "\u533a\u5747\u503c", "ec_at_level": "{name}\uff1a\u6c34\u5e73{lv}", "ec_avg_level": "\u5e73\u5747\u6c34\u5e73", "ec_baseline_50": "\u5747\u503c\u57fa\u7ebf(50)", "ec_belongs_to": "\u5c5e\u4e8e", "ec_cluster_good": "\u8bfe\u7a0b\u5b9e\u65bd\u8f83\u597d\u7c7b", "ec_cluster_good_full": "\u8bfe\u7a0b\u5b9e\u65bd\u8f83\u597d\u7c7b({n}\u6240)", "ec_cluster_good_short": "\u8f83\u597d\u7c7b", "ec_cluster_weak": "\u8bfe\u7a0b\u5b9e\u65bd\u5f85\u63d0\u5347\u7c7b", "ec_cluster_weak_full": "\u8bfe\u7a0b\u5b9e\u65bd\u5f85\u63d0\u5347\u7c7b({n}\u6240)", "ec_cluster_weak_short": "\u5f85\u63d0\u5347\u7c7b", "ec_correlation": "\u76f8\u5173\u7cfb\u6570", "ec_dim_rank": "\u7ef4\u5ea6\u6392\u540d", "ec_dim_score": "\u7ef4\u5ea6\u5f97\u5206", "ec_district_avg": "\u533a\u5747\u503c", "ec_district_avg_short": "\u533a\u5747\u503c", "ec_district_position": "\u533a\u5747\u503c\u53c2\u7167", "ec_district_rank_n": "\u533a\u5185\u7b2c{rank}\u540d", "ec_good_type_short": "\u8f83\u597d\u7c7b", "ec_level": "\u6c34\u5e73", "ec_level_dist_summary": "\u6c34\u5e73\u5206\u5e03", "ec_lift_to_lv3": "\u63d0\u5347\u81f3\u6c34\u5e733", "ec_lv2_threshold": "\u6c34\u5e732\u7ebf", "ec_lv3_threshold": "\u6c34\u5e733\u7ebf", "ec_lv4_threshold": "\u6c34\u5e734\u7ebf", "ec_lv_short": "Lv", "ec_lvl_four": "\u6c34\u5e73\u56db", "ec_lvl_one": "\u6c34\u5e73\u4e00", "ec_lvl_three": "\u6c34\u5e73\u4e09", "ec_lvl_two": "\u6c34\u5e73\u4e8c", "ec_min_level": "\u6700\u5f31\u6c34\u5e73", "ec_overall_score": "\u603b\u4f53\u5f97\u5206", "ec_pieces": "\u4ef6", "ec_quad_diff": "\u5dee\u5f02", "ec_quad_district_avg_marker": "\u533a\u5747\u503c", "ec_quad_level": "\u6c34\u5e73", "ec_quad_score": "\u5f97\u5206", "ec_quad_x_axis": "\u5f97\u5206", "ec_quad_y_axis": "\u4e0e\u533a\u5747\u503c\u5dee\u5f02", "ec_quadrant_q1": "\u6838\u5fc3\u4f18\u52bf", "ec_quadrant_q2": "\u6f5c\u529b\u9879", "ec_quadrant_q3": "\u6025\u9700\u6539\u8fdb", "ec_quadrant_q4": "\u9690\u6027\u98ce\u9669", "ec_same_type": "\u540c\u7c7b\u5b66\u6821", "ec_same_type_avg": "\u540c\u7c7b\u5b66\u6821\u5747\u503c", "ec_school_self": "\u672c\u6821", "ec_score_label": "\u5f97\u5206", "ec_self": "\u672c\u6821", "ec_thermo_dist_marker": "\u25b2\u533a\u5747", "ec_thermo_same_marker": "\u25b2\u540c\u7c7b", "ec_thermo_self": "\u672c\u6821", "ec_thermo_self_marker": "\u25bc ", "ec_total_now": "\u5f53\u524d\u603b\u5206", "ec_total_potential": "\u6f5c\u5728\u603b\u5206", "ec_unit_schools": "\u6240", "ec_waterfall_contrib": "\u9884\u4f30\u603b\u5206\u8d21\u732e", "ec_waterfall_current": "\u5f53\u524d\u603b\u5206", "ec_waterfall_potential": "\u6f5c\u5728\u603b\u5206", "ec_waterfall_pts_unit": "\u5206", "ec_weak_type_short": "\u5f85\u63d0\u5347\u7c7b", "fig": "\u56fe", "fig2_0a": "\u56fe2-0a \u5b66\u6821\u8bfe\u7a0b\u5b9e\u65bd\u753b\u50cf\u603b\u89c8", "fig2_0b": "\u56fe2-0b \u4e09\u7ea7\u7ef4\u5ea6\u4f18\u52bf-\u77ed\u677f\u8c61\u9650\u5206\u6790", "fig2_1": "\u56fe2-1 \u8bfe\u7a0b\u5b9e\u65bd\u4e03\u7ef4\u5ea6\u5f97\u5206\u5bf9\u6bd4", "fig2_2": "\u56fe2-2 \u8bfe\u7a0b\u5b9e\u65bd\u4e03\u7ef4\u5ea6\u96f7\u8fbe\u56fe", "fig2_3": "\u56fe2-3 \u5b66\u6821\u8bfe\u7a0b\u5b9e\u65bd\u603b\u4f53\u7c7b\u578b\u5206\u5e03", "fig2_4": "\u56fe2-4 \u4e24\u7c7b\u5b66\u6821\u8bfe\u7a0b\u5b9e\u65bd\u7279\u5f81\u5bf9\u6bd4", "fig2_5": "\u56fe2-5 \u5b66\u6821\u8bfe\u7a0b\u5b9e\u65bd\u7c7b\u578b\u7279\u5f81\u5bf9\u6bd4\uff08\u96f7\u8fbe\u56fe\uff09", "fig2_6": "\u56fe2-6 \u533a\u5185\u5404\u6821\u603b\u4f53\u5f97\u5206\u6392\u540d", "fig2_7": "\u56fe2-7 \u8bfe\u7a0b\u5b9e\u65bd\u7ef4\u5ea6\u95f4\u76f8\u5173\u6027\u5206\u6790", "gain_label": "\u63d0\u5347\u81f3\u6c34\u5e733", "generated_on": "\u751f\u6210\u4e8e", "indicator": "\u6307\u6807", "level": "\u6c34\u5e73", "level_1": "\u6c34\u5e731", "level_2": "\u6c34\u5e732", "level_3": "\u6c34\u5e733", "level_4": "\u6c34\u5e734", "level_label": "\u6c34\u5e73", "loading": "\u5206\u6790\u52a0\u8f7d\u4e2d...", "of": "/", "overall_score": "\u603b\u4f53\u5f97\u5206", "p0_analysis_intro": "\u6570\u636e\u5206\u6790\u6d41\u7a0b\u5982\u4e0b\uff1a", "p0_framework_intro": "\u672c\u62a5\u544a\u4ece\u5b66\u6821\u9886\u5bfc\u529b\u89c6\u89d2\u51fa\u53d1\uff0c\u5bf9\u8bfe\u7a0b\u5b9e\u65bd\u76d1\u6d4b\u6307\u6807\u6570\u636e\u8fdb\u884c\u7cfb\u7edf\u6027\u7684\u5206\u6790\u4e0e\u6307\u6807\u518d\u5efa\u6784\uff0c\u6784\u5efa\u4e86\u5b66\u6821\u8bfe\u7a0b\u5b9e\u65bd\u7684\u4e03\u7ef4\u5ea6\u6307\u6807\u4f53\u7cfb\uff08\u89c1\u88681-1\uff09\u3002", "p0_h1_background": "\u4e00\u3001\u6d4b\u8bc4\u80cc\u666f", "p0_h1_framework": "\u4e8c\u3001\u6d4b\u8bc4\u6846\u67b6", "p0_h1_implement": "\u4e09\u3001\u6d4b\u8bc4\u5b9e\u65bd", "p0_h2_analysis": "\uff08\u4e09\uff09\u6570\u636e\u5206\u6790", "p0_h2_levels": "\uff08\u56db\uff09\u4e09\u7ea7\u7ef4\u5ea6\u6c34\u5e73\u5212\u5206", "p0_h2_method": "\uff08\u4e8c\uff09\u6d4b\u8bc4\u65b9\u6cd5", "p0_h2_target": "\uff08\u4e00\uff09\u6d4b\u8bc4\u5bf9\u8c61", "p0_interp_condition": "1.\u4e86\u89e3\u5b66\u6821\u6240\u5728\u533a\u57df\u6559\u80b2\u5c40\u5bf9\u9ad8\u4e2d\u6559\u80b2\u6559\u5b66\u5de5\u4f5c\u7684\u63a8\u52a8\u60c5\u51b5\uff1b2.\u8bc4\u4f30\u5b66\u6821\u4fe1\u606f\u6280\u672f\u73af\u5883\u3001\u6559\u5b66\u8bbe\u5907\u3001\u573a\u9986\u8bbe\u65bd\u7684\u652f\u6301\u60c5\u51b5\uff1b3.\u5173\u6ce8\u5b66\u6821\u5982\u4f55\u7edf\u7b79\u5e08\u8d44\u914d\u7f6e\u3001\u6821\u5185\u8d44\u6e90\u3001\u793e\u533a\u8d44\u6e90\u7b49", "p0_interp_curriculum": "1.\u786e\u4fdd\u5f00\u9f50\u5f00\u8db3\u56fd\u5bb6\u8bfe\u7a0b\uff1b2.\u8003\u5bdf\u5b66\u6821\u8bfe\u7a0b\u8bbe\u7f6e\u7684\u5408\u7406\u6027\u4e0e\u591a\u6837\u6027\uff0c\u5305\u62ec\u5b66\u79d1\u7c7b\u8bfe\u7a0b\u3001\u6821\u672c\u8bfe\u7a0b\u3001\u7efc\u5408\u5b9e\u8df5\u6d3b\u52a8\u4e0e\u52b3\u52a8\u8bfe\u7a0b\u5404\u7c7b\u8bfe\u7a0b\u7684\u8bfe\u7a0b\u5b89\u6392\u4e0e\u5b66\u751f\u5b9e\u8df5\uff1b3.\u5173\u6ce8\u6838\u5fc3\u7d20\u517b\u5bfc\u5411\u8bfe\u7a0b\u7684\u89c4\u8303\u5316\u5efa\u8bbe\u60c5\u51b5", "p0_interp_digital": "1.\u5173\u6ce8\u6570\u667a\u5316\u8d44\u6e90\u652f\u6301\u4e0e\u8d4b\u80fd\u8bfe\u7a0b\u3001\u6559\u5b66\u3001\u8bc4\u4ef7\u7684\u60c5\u51b5\uff1b2.\u4e86\u89e3\u5b66\u6821\u6821\u5185\u5916\u7684\u6570\u667a\u5316\u8d44\u6e90\u3001\u4fe1\u606f\u5316\u5e73\u53f0\u4e0e\u4fe1\u606f\u7cfb\u7edf\u5efa\u8bbe\u60c5\u51b5", "p0_interp_instruction": "1.\u8bfe\u4e2d\u6559\u5b66\u65b9\u5f0f\u9769\u65b0\uff0c\u5021\u5bfc\u6df1\u5ea6\u5b66\u4e60\uff0c\u91cd\u89c6\u4e2a\u6027\u5316\u6559\u80b2\uff1b2.\u8bfe\u540e\u4f5c\u4e1a\u8bbe\u8ba1\u3001\u7ba1\u7406\u79d1\u5b66\u9ad8\u6548", "p0_interp_quality": "1.\u9762\u5411\u5b66\u751f\u6838\u5fc3\u7d20\u517b\u4e0e\u7efc\u5408\u7d20\u8d28\u53d1\u5c55\uff0c\u786e\u7acb\u79d1\u5b66\u8bc4\u4ef7\u89c2\uff1b2.\u5173\u6ce8\u5b66\u4e1a\u8d28\u91cf\uff0c\u5bf9\u6807\u8bfe\u7a0b\u6807\u51c6\u79d1\u5b66\u8bc4\u4ef7\u5b66\u751f\u8868\u73b0\uff1b3.\u5173\u6ce8\u7efc\u5408\u7d20\u8d28\u591a\u65b9\u9762\u8bc4\u4ef7\uff1b4.\u5173\u6ce8\u5b66\u751f\u5b9e\u8df5\u6d3b\u52a8\u8868\u73b0", "p0_interp_student": "1.\u6839\u636e\u5b66\u751f\u7684\u7279\u70b9\u548c\u9700\u8981\uff0c\u6559\u5e08\u8fdb\u884c\u9009\u8bfe\u6307\u5bfc\u3001\u4e2a\u6027\u5316\u8f85\u5bfc\u7b49\uff1b2.\u5b66\u6821\u63d0\u4f9b\u4e2a\u6027\u5316\u7684\u751f\u6daf\u6307\u5bfc\u670d\u52a1\uff0c\u5efa\u7acb\u5b8c\u5584\u7684\u751f\u6daf\u53d1\u5c55\u652f\u6301\u4f53\u7cfb\uff1b3.\u5173\u6ce8\u5b66\u751f\u7efc\u5408\u7d20\u8d28\u53d1\u5c55", "p0_interp_teacher": "1.\u7ed9\u6559\u5e08\u63d0\u4f9b\u5165\u804c\u57f9\u8bad\u3001\u5728\u804c\u57f9\u8bad\u4ee5\u53ca\u5916\u51fa\u5b66\u4e60\u673a\u4f1a\uff1b2.\u5b66\u6821\u5b9a\u671f\u7ec4\u7ec7\u6559\u7814\u6d3b\u52a8\uff0c\u5efa\u7acb\u6559\u5b66\u8d44\u6e90\u5e93\uff1b3.\u7ed9\u6559\u5e08\u63d0\u4f9b\u53c2\u4e0e\u79d1\u7814\u9879\u76ee\u548c\u7814\u7a76\u6d3b\u52a8\u7684\u652f\u6301", "p0_method_text": "\u57fa\u4e8e\u4e0a\u6d77\u5e02\u6559\u5e08\u6559\u80b2\u5b66\u9662\uff08\u4e0a\u6d77\u5e02\u6559\u59d4\u6559\u7814\u5ba4\uff09\u5f00\u5c55\u7684\u4e2d\u5c0f\u5b66\u8bfe\u7a0b\u5b9e\u65bd\u76d1\u6d4b\u7684\u7814\u7a76\u6846\u67b6\uff0c\u91c7\u7528\u95ee\u5377\u8c03\u67e5\u65b9\u5f0f\u91c7\u96c6\u5b66\u6821\u8bfe\u7a0b\u5b9e\u65bd\u4fe1\u606f\uff0c\u6db5\u76d6\u5b66\u6821\u57fa\u7840\u4fe1\u606f\u3001\u8bfe\u7a0b\u5b9e\u65bd\u60c5\u51b5\u548c\u5b66\u79d1\u8bfe\u7a0b\u5b9e\u65bd\u60c5\u51b5\u4e09\u4e2a\u7ef4\u5ea6\u7684\u6570\u636e\u3002", "p0_para1": "\u4e3a\u6df1\u5165\u8d2f\u5f7b\u300a\u6559\u80b2\u90e8\u5173\u4e8e\u505a\u597d\u666e\u901a\u9ad8\u4e2d\u65b0\u8bfe\u7a0b\u65b0\u6559\u6750\u5b9e\u65bd\u5de5\u4f5c\u7684\u6307\u5bfc\u610f\u89c1\u300b\uff08\u6559\u57fa\u30142018\u301515\u53f7\uff09\u3001\u300a\u5173\u4e8e\u65b0\u65f6\u4ee3\u63a8\u8fdb\u666e\u901a\u9ad8\u4e2d\u80b2\u4eba\u65b9\u5f0f\u6539\u9769\u7684\u6307\u5bfc\u610f\u89c1\u300b\uff08\u56fd\u529e\u53d1\u30142019\u301529\u53f7\uff09\u53ca\u300a\u57fa\u7840\u6559\u80b2\u8bfe\u7a0b\u6559\u5b66\u6539\u9769\u6df1\u5316\u884c\u52a8\u65b9\u6848\u300b\uff08\u6559\u6750\u5385\u51fd\u30142023\u30153\u53f7\uff09\u7b49\u4e00\u7cfb\u5217\u56fd\u5bb6\u6559\u80b2\u653f\u7b56\u5bfc\u5411\uff0c\u79ef\u6781\u54cd\u5e94\u300a\u6559\u80b2\u90e8\u529e\u516c\u5385\u5173\u4e8e\u5f00\u5c55\u8bfe\u7a0b\u5b9e\u65bd\u4e0e\u6559\u6750\u4f7f\u7528\u76d1\u6d4b\u5de5\u4f5c\u7684\u901a\u77e5\u300b\uff08\u6559\u6750\u5385\u51fd\u30142023\u30155\u53f7\uff09\u7684\u5177\u4f53\u8981\u6c42\uff0c\u4e0a\u6d77\u5e02\u6559\u59d4\u79ef\u6781\u884c\u52a8\uff0c\u53d1\u5e03\u4e86\u9488\u5bf9\u6027\u7684\u653f\u7b56\u6587\u4ef6\uff0c\u8fdb\u4e00\u6b65\u5f3a\u5316\u56fd\u5bb6\u8bfe\u7a0b\u65b9\u6848\u7684\u5b9e\u65bd\u8f6c\u5316\uff0c\u5e76\u63d0\u51fa\u5efa\u7acb\u5065\u5168\u8bfe\u7a0b\u5b9e\u65bd\u7684\u76d1\u6d4b\u4e0e\u53cd\u9988\u673a\u5236\uff0c\u4ee5\u5faa\u8bc1\u51b3\u7b56\u4e3a\u5f15\u9886\uff0c\u6301\u7eed\u4f18\u5316\u4e0e\u6539\u8fdb\u8bfe\u7a0b\u89c4\u5212\u4e0e\u5b9e\u65bd\u8def\u5f84\u3002", "p0_para2": "\u5b66\u6821\u9886\u5bfc\u529b\u662f\u5b66\u6821\u53d1\u5c55\u7684\u6838\u5fc3\u9a71\u52a8\u529b\u3002\u5b9e\u65bd\u7ba1\u7406\u7684\u7d20\u517b\u5bfc\u5411\u7acb\u610f\u4e0e\u51b3\u7b56\u8d28\u91cf\u76f4\u63a5\u5f71\u54cd\u5b66\u6821\u8bfe\u7a0b\u6559\u5b66\u7684\u6574\u4f53\u8868\u73b0\u4e0e\u6210\u6548\u3002\u8bfe\u7a0b\u5b9e\u65bd\u7ba1\u7406\u7684\u91cd\u70b9\u5728\u4e8e\u5b66\u6821\u8bfe\u7a0b\u7ba1\u7406\u89c4\u5212\u4e0e\u65bd\u7b56\uff0c\u4ee5\u53ca\u8fd9\u4e9b\u51b3\u7b56\u5728\u6559\u5b66\u6d3b\u52a8\u4e2d\u7684\u5207\u5b9e\u843d\u5730\u3002\u9274\u4e8e\u6b64\uff0c\u6211\u4eec\u4ece\u5b66\u6821\u9886\u5bfc\u529b\u89c6\u89d2\u51fa\u53d1\uff0c\u786e\u4fdd\u8bfe\u7a0b\u9886\u5bfc\u529b\u3001\u6559\u5b66\u53d8\u9769\u529b\u3001\u5b66\u751f\u53d1\u5c55\u6307\u5bfc\u529b\u3001\u6559\u5e08\u53d1\u5c55\u652f\u6301\u529b\u3001\u6559\u80b2\u8d28\u91cf\u8bc4\u4f30\u529b\u3001\u6559\u80b2\u6761\u4ef6\u4fdd\u969c\u529b\u548c\u6570\u5b57\u5316\u8d4b\u80fd\u529b\u4e03\u5927\u7ef4\u5ea6\u76f8\u4e92\u534f\u540c\uff0c\u5171\u540c\u4f5c\u7528\u4e8e\u5b66\u6821\u8bfe\u7a0b\u5b9e\u65bd\u7684\u5168\u5c40\u3002", "p0_step1": "\u003cstrong\u003e\u7b2c\u4e00\uff0c\u6307\u6807\u4f53\u7cfb\u91cd\u6784\u3002\u003c/strong\u003e\u57fa\u4e8e\u5b66\u6821\u9886\u5bfc\u529b\u89c6\u89d2\u7684\u4e03\u7ef4\u5ea6\u91cd\u6784\u7ef4\u5ea6\u3001\u6307\u6807\u53ca\u5177\u4f53\u9898\u76ee\u7684\u6620\u5c04\u5173\u7cfb\uff0c\u5f62\u6210\u591a\u7ea7\u6307\u6807\u4f53\u7cfb\u3002", "p0_step2": "\u003cstrong\u003e\u7b2c\u4e8c\uff0cPCA\uff08\u4e3b\u6210\u5206\u5206\u6790\uff09\u5408\u6210\u3002\u003c/strong\u003e\u5bf9\u95ee\u5377\u4e2d\u7684\u5404\u4e2a\u9898\u76ee\u8fdb\u884c\u6807\u51c6\u5316\u5904\u7406\uff0c\u5229\u7528\u4e3b\u6210\u5206\u5206\u6790\u65b9\u6cd5\uff0c\u5c06\u591a\u4e2a\u76f8\u5173\u53d8\u91cf\u5408\u6210\u4e3a\u4e3b\u6210\u5206\uff0c\u63d0\u53d6\u5404\u4e09\u7ea7\u7ef4\u5ea6\u5f97\u5206\u3002", "p0_step3": "\u003cstrong\u003e\u7b2c\u4e09\uff0c\u6807\u51c6\u5316\u5f97\u5206\u7edf\u4e00\u91cf\u7eb2\u3002\u003c/strong\u003e\u5bf9PCA\u5408\u6210\u540e\u7684\u4e3b\u6210\u5206\u8fdb\u884c\u6807\u51c6\u5316\u5904\u7406\uff0c\u5c06\u6570\u636e\u7edf\u4e00\u5230\u5747\u503c50\u3001\u6807\u51c6\u5dee10\u7684\u6b63\u6001\u5206\u5e03\u4e0a\u300268.27%\u7684\u6837\u672c\u5904\u4e8e[40\u5206, 60\u5206]\u533a\u95f4\uff0c84.45%\u5904\u4e8e[30\u5206, 70\u5206]\uff0c\u5982\u67d0\u6240\u5b66\u6821\u5f97\u5206\u4e3a60\u5206\uff0c\u610f\u5473\u7740\u5176\u8868\u73b0\u8d85\u8fc7\u4e86\u7ea684%\u7684\u5b66\u6821\u3002", "p0_step4": "\u003cstrong\u003e\u7b2c\u56db\uff0c\u5bf9\u4e09\u7ea7\u7ef4\u5ea6\u5212\u5206\u6c34\u5e73\u3002\u003c/strong\u003e\u4f9d\u636e\u7ef4\u5ea6\u5185\u6db5\u548c\u5b66\u6821\u8868\u73b0\u5206\u5e03\uff0c\u4ece\u9898\u76ee\u5c42\u9762\u786e\u5b9a\u6c34\u5e73\u5212\u5206\u7684\u5206\u754c\u70b9\u5206\u6570\uff0c\u5bf9\u5404\u5b66\u6821\u5212\u5206\u6c34\u5e731~4\uff08\u89c1\u88681-2\uff09\u3002", "p0_step5": "\u003cstrong\u003e\u7b2c\u4e94\uff0c\u805a\u7c7b\u5206\u6790\u3002\u003c/strong\u003e\u57fa\u4e8e\u6807\u51c6\u5316\u5f97\u5206\uff0c\u5bf9\u5b66\u6821\u8fdb\u884c\u805a\u7c7b\u5206\u6790\uff0c\u5c06\u5177\u6709\u76f8\u4f3c\u7279\u5f81\u7684\u5b66\u6821\u5f52\u4e3a\u4e00\u7c7b\uff0c\u8bc6\u522b\u51fa\u5404\u7ef4\u5ea6\u4e0b\u4e0d\u540c\u7c7b\u578b\u7684\u5b66\u6821\u7fa4\u4f53\u3002", "p0_target_text": "\u672c\u6b21\u76d1\u6d4b\u9762\u5411{district}\u666e\u901a\u9ad8\u4e2d\u5b66\u6821\uff0c\u5171\u6709{total}\u6240\u9ad8\u4e2d\u5b66\u6821\u53c2\u4e0e\u672c\u6b21\u76d1\u6d4b\u3002\u6bcf\u6240\u53c2\u4e0e\u76d1\u6d4b\u7684\u9ad8\u4e2d\u5b66\u6821\uff0c\u5747\u62bd\u53d6\u4e86\u884c\u653f\u7ba1\u7406\u90e8\u95e8\u7684\u5b66\u6821\u7ba1\u7406\u8005\u4ee3\u8868\uff08\u5305\u62ec\u6821\u957f\u3001\u526f\u6821\u957f\u3001\u90e8\u95e8\u4e3b\u4efb\u7b49\uff09\u3001\u5404\u5b66\u79d1\u6559\u7814\u7ec4\u7ec4\u957f\u53c2\u52a0\u95ee\u5377\u8c03\u67e5\u3002", "p10_fig_waterfall": "\u56fe10-1 \u8fdb\u6b65\u7a7a\u95f4\u5206\u6790\uff1a\u63d0\u5347\u81f3\u6c34\u5e733\u7684\u6f5c\u5728\u6536\u76ca", "p10_h1": "\u7b2c\u5341\u90e8\u5206 \u603b\u7ed3\u4e0e\u6539\u8fdb\u5efa\u8bae", "p10_h2_cross": "\u4e00\u3001\u8de8\u7ef4\u5ea6\u7efc\u5408\u5206\u6790", "p10_h2_improve": "\u8fdb\u6b65\u7a7a\u95f4\u5206\u6790", "p10_h2_review": "\u7efc\u5408\u8bc4\u8ff0\u4e0e\u6539\u8fdb\u65b9\u5411", "p10_h2_top3": "\u6700\u7d27\u8feb\u7684\u4e09\u4ef6\u4e8b", "p11_attention": "\u91cd\u70b9\u653b\u5173\uff08\u6c34\u5e732\u7ef4\u5ea6\uff09\u2014\u2014\u672c\u5b66\u671f\u542f\u52a8", "p11_critical": "\u6025\u9700\u7a81\u7834\uff08\u6c34\u5e731\u7ef4\u5ea6\uff09\u2014\u2014\u7acb\u5373\u884c\u52a8", "p11_disclaimer": "\u003cstrong\u003e\u8bf4\u660e\uff1a\u003c/strong\u003e\u4ee5\u4e0a\u884c\u52a8\u5efa\u8bae\u7531AI\u57fa\u4e8e\u76d1\u6d4b\u6570\u636e\u81ea\u52a8\u751f\u6210\uff0c\u65e8\u5728\u63d0\u4f9b\u601d\u8def\u6846\u67b6\u4e0e\u53c2\u8003\u65b9\u5411\u3002\u5177\u4f53\u5b9e\u65bd\u65b9\u6848\u9700\u7ed3\u5408\u5b66\u6821\u5b9e\u9645\u60c5\u51b5\uff0c\u7531\u5b66\u6821\u7ba1\u7406\u56e2\u961f\u4e0e\u4e13\u4e1a\u6559\u5e08\u5171\u540c\u7814\u8ba8\u786e\u5b9a\uff0c\u5efa\u8bae\u5728\u6559\u80b2\u4e13\u5bb6\u6307\u5bfc\u4e0b\u8fdb\u884c\u6821\u672c\u5316\u8c03\u6574\u3002", "p11_excel": "\u6df1\u5316\u5f15\u9886\uff08\u6c34\u5e734\u7ef4\u5ea6\uff09\u2014\u2014\u7ecf\u9a8c\u8f93\u51fa", "p11_focus_intro": "\u4ee5\u4e0b\u4e09\u9879\u662f\u7efc\u5408\u6570\u636e\u4e25\u91cd\u7a0b\u5ea6\u3001\u6539\u8fdb\u6760\u6746\u6548\u5e94\u548c\u53ef\u64cd\u4f5c\u6027\u540e\uff0c\u5efa\u8bae\u5b66\u6821\u672c\u5b66\u671f\u003cstrong\u003e\u4f18\u5148\u4e14\u5fc5\u987b\u003c/strong\u003e\u63a8\u8fdb\u7684\u6838\u5fc3\u4e8b\u9879\u3002\u540e\u7eed\u5404\u8282\u7684\u8be6\u7ec6\u65b9\u6848\u5747\u56f4\u7ed5\u6b64\u5c55\u5f00\u3002", "p11_focus_title": "\u6218\u7565\u805a\u7126\uff1a\u672c\u5b66\u671f\u5fc5\u987b\u5b8c\u6210\u7684\u4e09\u4ef6\u4e8b", "p11_h1": "\u7b2c\u5341\u4e00\u90e8\u5206 \u5b9e\u8df5\u843d\u5730\u884c\u52a8\u6307\u5357", "p11_intro": "\u672c\u90e8\u5206\u57fa\u4e8e\u524d\u8ff0\u6570\u636e\u5206\u6790\u7ed3\u679c\uff0c\u6309\"\u7d27\u8feb\u7a0b\u5ea6\"\u6392\u5217\u6539\u8fdb\u884c\u52a8\u3002\u5b66\u6821\u7ba1\u7406\u56e2\u961f\u5e94\u5c06\u6709\u9650\u8d44\u6e90\u4f18\u5148\u6295\u5165\u5230\u6700\u7d27\u8feb\u7684\u4e8b\u9879\u4e0a\uff0c\u800c\u975e\u5e73\u5747\u7528\u529b\u3002", "p11_maintain": "\u7a33\u6b65\u5de9\u56fa\uff08\u6c34\u5e733\u7ef4\u5ea6\uff09\u2014\u2014\u6301\u7eed\u63a8\u8fdb", "p11_no_weak": "\u8d35\u6821\u5f53\u524d\u65e0\u6c34\u5e731\u6216\u6c34\u5e732\u7684\u8584\u5f31\u7ef4\u5ea6\uff0c\u6574\u4f53\u57fa\u7840\u624e\u5b9e\uff0c\u4ee5\u4e0b\u91cd\u70b9\u5173\u6ce8\u5de9\u56fa\u63d0\u5347\u4e0e\u6df1\u5316\u5f15\u9886\u3002", "p11_timeline": "\u5b66\u671f\u884c\u52a8\u65f6\u95f4\u8868", "p11_timeline_loading": "\u65f6\u95f4\u8868\u751f\u6210\u4e2d...", "p1_h1_dim_status": "\u4e8c\u3001\u5206\u7ef4\u5ea6\u72b6\u51b5", "p1_h1_overall_status": "\u4e00\u3001\u5b66\u6821\u8bfe\u7a0b\u5b9e\u65bd\u603b\u4f53\u72b6\u51b5", "page": "\u9875", "perf_above": "\u7565\u9ad8\u4e8e\u533a\u5747", "perf_below": "\u7565\u4f4e\u4e8e\u533a\u5747", "perf_good": "\u8868\u73b0\u8f83\u597d", "perf_neutral": "\u63a5\u8fd1\u533a\u5747", "perf_weak": "\u5f85\u63d0\u5347", "performance": "\u8868\u73b0", "points": "\u5206", "positioning_gap_title": "\u5b66\u6821\u5b9a\u4f4d\u4e0e\u5b9e\u9645\u8868\u73b0\u5dee\u8ddd\u5206\u6790", "potential_total": "\u6f5c\u5728\u603b\u5206", "radar_legend_district": "\u533a\u5747\u503c", "radar_legend_same_type": "\u540c\u7c7b\u5b66\u6821\u5747\u503c", "radar_legend_self": "\u672c\u6821", "rank": "\u6392\u540d", "rank_format": "\u7b2c{rank}\u540d / \u5171{total}\u6240", "rank_in_city": "\u5168\u5e02\u6392\u540d", "rank_in_city_label": "\u5168\u5e02\u6392\u540d", "rank_in_district": "\u533a\u5185\u6392\u540d", "rank_in_district_label": "\u533a\u5185\u6392\u540d", "rank_in_top_pct": "\u4f4d\u5217\u524d {pct}%", "report_subtitle": "\u57fa\u4e8e\u5b66\u6821\u9886\u5bfc\u529b\u89c6\u89d2\u7684\u4e03\u7ef4\u5ea6\u5206\u6790", "report_title": "\u8bfe\u7a0b\u5b9e\u65bd\u76d1\u6d4b\u6570\u636e\u5206\u6790\u62a5\u544a", "same_type_avg": "\u540c\u7c7b\u5b66\u6821\u5747\u503c", "school_cluster": "\u805a\u7c7b\u7c7b\u578b", "school_name": "\u5b66\u6821", "school_type": "\u5b66\u6821\u7c7b\u578b", "schools_unit": "\u6240", "score": "\u5f97\u5206", "sd_city_rank_prefix": "\u5168\u5e02", "sd_district_avg": "\u533a\u5747\u503c", "sd_level_grade": "\u6c34\u5e73\u7b49\u7ea7", "sd_level_meaning": "\u6c34\u5e73{lv}\u542b\u4e49", "sd_rank": "\u6392\u540d", "sd_score": "\u5f97\u5206", "sec_cross_dim": "\u8de8\u7ef4\u5ea6\u7efc\u5408\u5206\u6790", "sec_improvement_room": "\u8fdb\u6b65\u7a7a\u95f4\u5206\u6790", "sec_level_compare": "\u5404\u5b50\u7ef4\u5ea6\u6c34\u5e73\u5bf9\u6bd4", "sec_overall_perf": "\u6574\u4f53\u8868\u73b0", "sec_review": "\u7efc\u5408\u8bc4\u8ff0\u4e0e\u6539\u8fdb\u65b9\u5411", "sec_subdim_analysis": "\u5b50\u7ef4\u5ea6\u8be6\u7ec6\u5206\u6790", "sec_top3": "\u6700\u7d27\u8feb\u7684\u4e09\u4ef6\u4e8b", "sub_dimension": "\u5b50\u7ef4\u5ea6", "tbl": "\u8868", "tbl_indicator_system": "\u88681-1 \u6307\u6807\u4f53\u7cfb\u8868", "tbl_level_definition": "\u88681-2 \u4e09\u7ea7\u7ef4\u5ea6\u6c34\u5e73\u5212\u5206\u8868", "th_indicator_interp": "\u6307\u6807\u89e3\u8bfb", "th_secondary_dim": "\u4e8c\u7ea7\u7ef4\u5ea6", "th_tertiary_dim": "\u4e09\u7ea7\u7ef4\u5ea6", "top3_intro": "\u4ee5\u4e0b\u4e09\u9879\u662f\u7efc\u5408\u4e25\u91cd\u7a0b\u5ea6\u3001\u6760\u6746\u6548\u5e94\u548c\u53ef\u64cd\u4f5c\u6027\u540e\uff0c\u5efa\u8bae\u5b66\u6821\u672c\u5b66\u671f\u4f18\u5148\u63a8\u8fdb\u7684\u6838\u5fc3\u4e8b\u9879\u3002", "total_score": "\u603b\u4f53\u5f97\u5206", "vs_city_avg": "vs \u5e02\u5747\u503c", "vs_district_avg": "vs \u533a\u5747\u503c", "vs_same_type": "vs \u540c\u7c7b", "your_school": "\u8d35\u6821"};
const LANG = 'zh';
// helper:维度名翻译(中文 key → 当前 lang 显示值)
const DIM_T = {"\u5b66\u751f\u53d1\u5c55\u6307\u5bfc\u529b": "\u5b66\u751f\u53d1\u5c55\u6307\u5bfc\u529b", "\u6559\u5b66\u53d8\u9769\u529b": "\u6559\u5b66\u53d8\u9769\u529b", "\u6559\u5e08\u53d1\u5c55\u652f\u6301\u529b": "\u6559\u5e08\u53d1\u5c55\u652f\u6301\u529b", "\u6559\u80b2\u6761\u4ef6\u4fdd\u969c\u529b": "\u6559\u80b2\u6761\u4ef6\u4fdd\u969c\u529b", "\u6559\u80b2\u8d28\u91cf\u8bc4\u4f30\u529b": "\u6559\u80b2\u8d28\u91cf\u8bc4\u4f30\u529b", "\u6570\u5b57\u5316\u8d4b\u80fd\u529b": "\u6570\u5b57\u5316\u8d4b\u80fd\u529b", "\u8bfe\u7a0b\u9886\u5bfc\u529b": "\u8bfe\u7a0b\u9886\u5bfc\u529b"};
const SUB_T = {"\u4f5c\u4e1a\u8bbe\u8ba1\u4e0e\u7ba1\u7406\u53d8\u9769": "\u4f5c\u4e1a\u8bbe\u8ba1\u4e0e\u7ba1\u7406\u53d8\u9769", "\u533a\u57df\u63a8\u8fdb": "\u533a\u57df\u63a8\u8fdb", "\u56fd\u5bb6\u6807\u51c6\u9075\u5faa": "\u56fd\u5bb6\u6807\u51c6\u9075\u5faa", "\u57f9\u8bad\u652f\u6301": "\u57f9\u8bad\u652f\u6301", "\u5b66\u4e1a\u8d28\u91cf\u8bc4\u4f30": "\u5b66\u4e1a\u8d28\u91cf\u8bc4\u4f30", "\u5b66\u751f\u751f\u6daf\u53d1\u5c55\u6307\u5bfc": "\u5b66\u751f\u751f\u6daf\u53d1\u5c55\u6307\u5bfc", "\u5b66\u79d1\u53d1\u5c55\u7684\u4e2a\u6027\u5316\u8f85\u5bfc": "\u5b66\u79d1\u53d1\u5c55\u7684\u4e2a\u6027\u5316\u8f85\u5bfc", "\u5b9e\u8df5\u6d3b\u52a8\u8bc4\u4f30": "\u5b9e\u8df5\u6d3b\u52a8\u8bc4\u4f30", "\u6559\u5b66\u65b9\u5f0f\u521b\u65b0": "\u6559\u5b66\u65b9\u5f0f\u521b\u65b0", "\u6559\u5b66\u65b9\u5f0f\u53d8\u9769": "\u6559\u5b66\u65b9\u5f0f\u53d8\u9769", "\u6559\u7814\u652f\u6301": "\u6559\u7814\u652f\u6301", "\u73af\u5883\u652f\u6301": "\u73af\u5883\u652f\u6301", "\u79d1\u5b66\u8bc4\u4ef7\u89c2": "\u79d1\u5b66\u8bc4\u4ef7\u89c2", "\u7efc\u5408\u7d20\u8d28\u8bc4\u4f30": "\u7efc\u5408\u7d20\u8d28\u8bc4\u4f30", "\u8bc4\u4ef7\u7cbe\u51c6\u5316\u4e0e\u4e2a\u6027\u5316": "\u8bc4\u4ef7\u7cbe\u51c6\u5316\u4e0e\u4e2a\u6027\u5316", "\u8bfe\u7a0b\u7ed3\u6784\u5efa\u8bbe": "\u8bfe\u7a0b\u7ed3\u6784\u5efa\u8bbe", "\u8bfe\u7a0b\u89c4\u8303\u843d\u5b9e": "\u8bfe\u7a0b\u89c4\u8303\u843d\u5b9e", "\u8bfe\u7a0b\u8fed\u4ee3\u4f18\u5316": "\u8bfe\u7a0b\u8fed\u4ee3\u4f18\u5316", "\u8d44\u6e90\u652f\u6301": "\u8d44\u6e90\u652f\u6301", "\u9879\u76ee\u652f\u6301": "\u9879\u76ee\u652f\u6301"};
function tDim(name) { return DIM_T[name] || name; }
function tSub(name) { return SUB_T[name] || name; }
// 短名(去掉"力"等后缀)—— 中文版才简化,英文不变
function shortDim(name) {
var n = tDim(name);
if (LANG === 'zh') return n.replace('力', '').replace('教育', '');
return n;
}
</script>
<script>
// ===== 1. 得分对比横向条形图 =====
const scoreCompare = {"categories": ["\u8bfe\u7a0b\u9886\u5bfc\u529b", "\u6559\u5b66\u53d8\u9769\u529b", "\u5b66\u751f\u53d1\u5c55\u6307\u5bfc\u529b", "\u6559\u5e08\u53d1\u5c55\u652f\u6301\u529b", "\u6559\u80b2\u8d28\u91cf\u8bc4\u4f30\u529b", "\u6559\u80b2\u6761\u4ef6\u4fdd\u969c\u529b", "\u6570\u5b57\u5316\u8d4b\u80fd\u529b"], "district_avg": [52.21, 50.75, 51.42, 51.62, 54.39, 50.45, 51.35], "same_type_avg": [51.21, 49.35, 49.71, 49.45, 49.59, 49.76, 49.57], "school_name": "\u5609\u4e00\u5b9e\u9ad8", "school_values": [53.23, 51.63, 52.36, 46.5, 51.21, 53.72, 54.84]};
(function() {
const chart = echarts.init(document.getElementById('score-compare-chart'));
const cats = scoreCompare.categories.map(tDim);
const option = {
tooltip: { trigger: 'axis', axisPointer: { type: 'shadow' } },
legend: { data: [scoreCompare.school_name, I18N.ec_district_avg, I18N.ec_same_type_avg], bottom: 5, textStyle: { fontSize: 12 } },
grid: { left: '3%', right: '8%', bottom: '18%', top: '5%', containLabel: true },
xAxis: { type: 'value', min: 30, max: 80 },
yAxis: { type: 'category', data: cats, axisLabel: { fontSize: 12 } },
series: [
{ name: scoreCompare.school_name, type: 'bar', data: scoreCompare.school_values,
itemStyle: { color: COLORS.primary }, barWidth: '22%',
label: { show: true, position: 'right', fontSize: 11 } },
{ name: I18N.ec_district_avg, type: 'bar', data: scoreCompare.district_avg,
itemStyle: { color: COLORS.gray }, barWidth: '22%' },
{ name: I18N.ec_same_type_avg, type: 'bar', data: scoreCompare.same_type_avg,
itemStyle: { color: COLORS.warning }, barWidth: '22%' },
],
};
chart.setOption(option);
window.addEventListener('resize', () => chart.resize());
})();
// ===== 2. 七维度雷达图 =====
const radarData = {"dimensions": ["\u8bfe\u7a0b\u9886\u5bfc\u529b", "\u6559\u5b66\u53d8\u9769\u529b", "\u5b66\u751f\u53d1\u5c55\u6307\u5bfc\u529b", "\u6559\u5e08\u53d1\u5c55\u652f\u6301\u529b", "\u6559\u80b2\u8d28\u91cf\u8bc4\u4f30\u529b", "\u6559\u80b2\u6761\u4ef6\u4fdd\u969c\u529b", "\u6570\u5b57\u5316\u8d4b\u80fd\u529b"], "legend": ["\u5609\u4e00\u5b9e\u9ad8", "\u533a\u5747\u503c"], "series": [{"name": "\u5609\u4e00\u5b9e\u9ad8", "values": [53.23, 51.63, 52.36, 46.5, 51.21, 53.72, 54.84]}, {"name": "\u533a\u5747\u503c", "values": [52.21, 50.75, 51.42, 51.62, 54.39, 50.45, 51.35]}]};
(function() {
const chart = echarts.init(document.getElementById('radar-chart'));
const option = {
tooltip: {},
legend: { data: radarData.legend, bottom: 10 },
radar: {
indicator: radarData.dimensions.map(d => ({ name: tDim(d), max: 80 })),
shape: 'polygon', splitNumber: 4,
axisName: { color: '#333', fontSize: 12 }, radius: '65%',
},
series: [{
type: 'radar',
data: radarData.series.map((s, i) => ({
value: s.values, name: s.name,
areaStyle: { opacity: i === 0 ? 0.3 : 0.1 },
lineStyle: { width: i === 0 ? 3 : 1 },
})),
}],
};
chart.setOption(option);
window.addEventListener('resize', () => chart.resize());
})();
// ===== 3. 聚类类型分布饼图 =====
const clusterDist = {"good_count": 6, "good_schools": ["\u4e0a\u5927\u5609\u9ad8", "\u5609\u4e00\u5b9e\u9ad8", "\u5609\u5b9a\u4e00\u4e2d", "\u5609\u5b9a\u4e8c\u4e2d", "\u5b89\u4ead\u9ad8\u4e2d", "\u5c01\u6d5c\u9ad8\u4e2d"], "school_cluster": "\u8f83\u597d", "school_name": "\u5609\u4e00\u5b9e\u9ad8", "total": 11, "weak_count": 5, "weak_schools": ["\u4e0a\u5e08\u5609\u9ad8", "\u4e2d\u5149\u9ad8\u4e2d", "\u4ea4\u9644\u5609\u5206", "\u534e\u65ed\u53cc\u8bed", "\u8fdc\u4e1c\u5b66\u6821"]};
if (clusterDist.total) {
(function() {
const chart = echarts.init(document.getElementById('cluster-type-dist-chart'));
const labelFormatter = LANG === 'en' ? '{b}\n{c} ({d}%)' : '{b}\n{c}所 ({d}%)';
const belongsTo = (clusterDist.school_cluster === '较好' || clusterDist.school_cluster === 'High-Performing')
? I18N.ec_cluster_good_short
: I18N.ec_cluster_weak_short;
const centerText = clusterDist.school_name + '\n' + I18N.ec_belongs_to + ' ' + belongsTo;
const option = {
tooltip: { trigger: 'item' },
legend: { bottom: 5, textStyle: { fontSize: 11 } },
series: [{
type: 'pie', radius: ['35%', '60%'], center: ['50%', '45%'],
avoidLabelOverlap: true,
itemStyle: { borderRadius: 8, borderColor: '#fff', borderWidth: 2 },
label: { show: true, formatter: labelFormatter, fontSize: 12 },
emphasis: { label: { show: true, fontSize: 14, fontWeight: 'bold' } },
data: [
{ value: clusterDist.good_count, name: I18N.ec_cluster_good, itemStyle: { color: COLORS.primary } },
{ value: clusterDist.weak_count, name: I18N.ec_cluster_weak, itemStyle: { color: COLORS.warning } },
]
}],
graphic: [{
type: 'text', left: 'center', top: '40%',
style: {
text: centerText,
textAlign: 'center', fill: COLORS.primary, fontSize: 12, fontWeight: 'bold',
}
}],
};
chart.setOption(option);
window.addEventListener('resize', () => chart.resize());
})();
}
// ===== 4. 两类学校折线对比图 =====
const clusterLine = {"dimensions": ["\u8bfe\u7a0b\u9886\u5bfc\u529b", "\u6559\u5b66\u53d8\u9769\u529b", "\u5b66\u751f\u53d1\u5c55\u6307\u5bfc\u529b", "\u6559\u5e08\u53d1\u5c55\u652f\u6301\u529b", "\u6559\u80b2\u8d28\u91cf\u8bc4\u4f30\u529b", "\u6559\u80b2\u6761\u4ef6\u4fdd\u969c\u529b", "\u6570\u5b57\u5316\u8d4b\u80fd\u529b"], "good_count": 6, "good_values": [54.02, 51.52, 53.19, 54.67, 56.8, 54.77, 51.79], "weak_count": 5, "weak_values": [50.05, 49.82, 49.31, 47.96, 51.5, 45.25, 50.83]};
if (clusterLine.dimensions) {
(function() {
const chart = echarts.init(document.getElementById('cluster-line-chart'));
const goodLegend = I18N.ec_cluster_good_full.replace('{n}', clusterLine.good_count);
const weakLegend = I18N.ec_cluster_weak_full.replace('{n}', clusterLine.weak_count);
const option = {
tooltip: { trigger: 'axis' },
legend: { data: [goodLegend, weakLegend], bottom: 5, textStyle: { fontSize: 11 } },
grid: { left: '3%', right: '4%', bottom: '18%', top: '8%', containLabel: true },
xAxis: {
type: 'category', data: clusterLine.dimensions.map(shortDim),
axisLabel: { fontSize: 11, rotate: 15 }, boundaryGap: false,
},
yAxis: { type: 'value', min: 40, max: 60 },
series: [
{
name: goodLegend,
type: 'line', data: clusterLine.good_values,
lineStyle: { width: 3, color: COLORS.primary }, itemStyle: { color: COLORS.primary },
symbol: 'circle', symbolSize: 8,
label: { show: true, position: 'top', fontSize: 10, color: COLORS.primary, formatter: p => p.value.toFixed(2) },
},
{
name: weakLegend,
type: 'line', data: clusterLine.weak_values,
lineStyle: { width: 3, color: COLORS.warning }, itemStyle: { color: COLORS.warning },
symbol: 'circle', symbolSize: 8,
label: { show: true, position: 'bottom', fontSize: 10, color: COLORS.warning, formatter: p => p.value.toFixed(2) },
},
],
};
chart.setOption(option);
window.addEventListener('resize', () => chart.resize());
})();
}
// ===== 5. 聚类类型对比雷达图 =====
const clusterRadar = {"dimensions": ["\u8bfe\u7a0b\u9886\u5bfc\u529b", "\u6559\u5b66\u53d8\u9769\u529b", "\u5b66\u751f\u53d1\u5c55\u6307\u5bfc\u529b", "\u6559\u5e08\u53d1\u5c55\u652f\u6301\u529b", "\u6559\u80b2\u8d28\u91cf\u8bc4\u4f30\u529b", "\u6559\u80b2\u6761\u4ef6\u4fdd\u969c\u529b", "\u6570\u5b57\u5316\u8d4b\u80fd\u529b"], "good_count": 6, "legend": ["\u8bfe\u7a0b\u5b9e\u65bd\u8f83\u597d\u7c7b", "\u8bfe\u7a0b\u5b9e\u65bd\u5f85\u63d0\u5347\u7c7b", "\u5609\u4e00\u5b9e\u9ad8"], "series": [{"name": "\u8bfe\u7a0b\u5b9e\u65bd\u8f83\u597d\u7c7b", "values": [54.02, 51.52, 53.19, 54.67, 56.8, 54.77, 51.79]}, {"name": "\u8bfe\u7a0b\u5b9e\u65bd\u5f85\u63d0\u5347\u7c7b", "values": [50.05, 49.82, 49.31, 47.96, 51.5, 45.25, 50.83]}, {"name": "\u5609\u4e00\u5b9e\u9ad8", "values": [53.23, 51.63, 52.36, 46.5, 51.21, 53.72, 54.84]}], "weak_count": 5};
if (clusterRadar.dimensions) {
(function() {
const chart = echarts.init(document.getElementById('cluster-radar-chart'));
const colorMap = [COLORS.cluster_good, COLORS.cluster_weak, COLORS.danger];
const option = {
tooltip: {},
legend: {
data: clusterRadar.legend, bottom: 5, textStyle: { fontSize: 11 },
formatter: function(name) {
if (name === '课程实施较好类' || name === I18N.ec_cluster_good) return I18N.ec_cluster_good_full.replace('{n}', clusterRadar.good_count);
if (name === '课程实施待提升类' || name === I18N.ec_cluster_weak) return I18N.ec_cluster_weak_full.replace('{n}', clusterRadar.weak_count);
return name;
}
},
radar: {
indicator: clusterRadar.dimensions.map(d => ({ name: tDim(d), max: 80 })),
shape: 'polygon', splitNumber: 4,
axisName: { color: '#333', fontSize: 11 }, radius: '60%',
},
series: [{
type: 'radar',
data: clusterRadar.series.map((s, i) => ({
value: s.values, name: s.name,
areaStyle: { opacity: i === 2 ? 0.05 : 0.15 },
lineStyle: { width: i === 2 ? 3 : 2, type: i === 2 ? 'solid' : 'dashed', color: colorMap[i] },
itemStyle: { color: colorMap[i] },
symbol: i === 2 ? 'diamond' : 'circle', symbolSize: i === 2 ? 8 : 4,
})),
}],
};
chart.setOption(option);
window.addEventListener('resize', () => chart.resize());
})();
}
// ===== 6. 区内学校排名条形图 =====
const rankingData = {"current_school": "\u5609\u4e00\u5b9e\u9ad8", "dim_scores": {"\u5b66\u751f\u53d1\u5c55\u6307\u5bfc\u529b": [58.28, 52.15, 51.65, 53.29, 51.41, 52.36, 53.7, 49.91, 50.42, 48.0, 44.5], "\u6559\u5b66\u53d8\u9769\u529b": [55.24, 47.63, 52.01, 54.09, 48.53, 51.63, 50.38, 53.2, 50.86, 47.63, 47.04], "\u6559\u5e08\u53d1\u5c55\u652f\u6301\u529b": [54.44, 66.13, 55.6, 51.05, 54.31, 46.5, 51.28, 46.97, 48.06, 49.59, 43.9], "\u6559\u80b2\u6761\u4ef6\u4fdd\u969c\u529b": [59.66, 57.44, 53.87, 51.68, 52.27, 53.72, 57.04, 41.85, 45.09, 33.51, 48.78], "\u6559\u80b2\u8d28\u91cf\u8bc4\u4f30\u529b": [60.95, 55.58, 56.61, 58.01, 58.44, 51.21, 46.07, 59.75, 57.86, 48.46, 45.38], "\u6570\u5b57\u5316\u8d4b\u80fd\u529b": [52.28, 54.03, 55.03, 46.14, 48.42, 54.84, 54.6, 49.12, 46.08, 52.39, 51.97], "\u8bfe\u7a0b\u9886\u5bfc\u529b": [55.13, 52.57, 55.92, 55.82, 51.44, 53.23, 48.67, 53.85, 55.95, 50.88, 40.87]}, "dimensions": ["\u8bfe\u7a0b\u9886\u5bfc\u529b", "\u6559\u5b66\u53d8\u9769\u529b", "\u5b66\u751f\u53d1\u5c55\u6307\u5bfc\u529b", "\u6559\u5e08\u53d1\u5c55\u652f\u6301\u529b", "\u6559\u80b2\u8d28\u91cf\u8bc4\u4f30\u529b", "\u6559\u80b2\u6761\u4ef6\u4fdd\u969c\u529b", "\u6570\u5b57\u5316\u8d4b\u80fd\u529b"], "schools": ["\u5609\u5b9a\u4e00\u4e2d", "\u5609\u5b9a\u4e8c\u4e2d", "\u5b89\u4ead\u9ad8\u4e2d", "\u4e0a\u5927\u5609\u9ad8", "\u5c01\u6d5c\u9ad8\u4e2d", "\u5609\u4e00\u5b9e\u9ad8", "\u4ea4\u9644\u5609\u5206", "\u8fdc\u4e1c\u5b66\u6821", "\u4e0a\u5e08\u5609\u9ad8", "\u4e2d\u5149\u9ad8\u4e2d", "\u534e\u65ed\u53cc\u8bed"], "total_scores": [56.57, 55.08, 54.38, 52.87, 52.12, 51.93, 51.68, 50.66, 50.62, 47.21, 46.06]};
if (rankingData.schools) {
(function() {
const chart = echarts.init(document.getElementById('school-ranking-chart'));
const barColors = rankingData.schools.map(s => s === rankingData.current_school ? COLORS.primary : COLORS.gray);
const option = {
tooltip: { trigger: 'axis', axisPointer: { type: 'shadow' } },
grid: { left: '3%', right: '12%', bottom: '5%', top: '5%', containLabel: true },
xAxis: { type: 'value', min: 35, max: 65 },
yAxis: { type: 'category', data: rankingData.schools.slice().reverse(),
axisLabel: { fontSize: 12, fontWeight: function(v) { return v === rankingData.current_school ? 'bold' : 'normal'; } } },
series: [{
type: 'bar', barWidth: '50%',
data: rankingData.total_scores.slice().reverse().map((v, i) => ({
value: v, itemStyle: { color: barColors.slice().reverse()[i] },
})),
label: { show: true, position: 'right', fontSize: 12, fontWeight: 'bold', formatter: p => p.value.toFixed(1) },
}],
};
chart.setOption(option);
window.addEventListener('resize', () => chart.resize());
})();
}
// ===== 7. 维度间相关性热力图 =====
const corrData = {"data": [[0, 0, 1.0], [0, 1, 0.672], [0, 2, 0.635], [0, 3, 0.333], [0, 4, 0.786], [0, 5, 0.094], [0, 6, -0.26], [1, 0, 0.672], [1, 1, 1.0], [1, 2, 0.699], [1, 3, -0.099], [1, 4, 0.62], [1, 5, 0.286], [1, 6, -0.213], [2, 0, 0.635], [2, 1, 0.699], [2, 2, 1.0], [2, 3, 0.453], [2, 4, 0.525], [2, 5, 0.663], [2, 6, 0.093], [3, 0, 0.333], [3, 1, -0.099], [3, 2, 0.453], [3, 3, 1.0], [3, 4, 0.344], [3, 5, 0.497], [3, 6, 0.266], [4, 0, 0.786], [4, 1, 0.62], [4, 2, 0.525], [4, 3, 0.344], [4, 4, 1.0], [4, 5, 0.17], [4, 6, -0.492], [5, 0, 0.094], [5, 1, 0.286], [5, 2, 0.663], [5, 3, 0.497], [5, 4, 0.17], [5, 5, 1.0], [5, 6, 0.343], [6, 0, -0.26], [6, 1, -0.213], [6, 2, 0.093], [6, 3, 0.266], [6, 4, -0.492], [6, 5, 0.343], [6, 6, 1.0]], "dimensions": ["\u8bfe\u7a0b\u9886\u5bfc\u529b", "\u6559\u5b66\u53d8\u9769\u529b", "\u5b66\u751f\u53d1\u5c55\u6307\u5bfc\u529b", "\u6559\u5e08\u53d1\u5c55\u652f\u6301\u529b", "\u6559\u80b2\u8d28\u91cf\u8bc4\u4f30\u529b", "\u6559\u80b2\u6761\u4ef6\u4fdd\u969c\u529b", "\u6570\u5b57\u5316\u8d4b\u80fd\u529b"], "short_names": ["\u8bfe\u7a0b\u9886\u5bfc", "\u6559\u5b66\u53d8\u9769", "\u5b66\u751f\u53d1\u5c55\u6307\u5bfc", "\u6559\u5e08\u53d1\u5c55\u652f\u6301", "\u8d28\u91cf\u8bc4\u4f30", "\u6761\u4ef6\u4fdd\u969c", "\u6570\u5b57\u5316\u8d4b\u80fd"]};
if (corrData.dimensions) {
(function() {
const chart = echarts.init(document.getElementById('correlation-chart'));
const localizedDims = corrData.dimensions.map(tDim);
const names = (corrData.short_names && LANG === 'zh') ? corrData.short_names : localizedDims;
const option = {
tooltip: { position: 'top', formatter: p => localizedDims[p.value[0]] + ' × ' + localizedDims[p.value[1]] + '<br/>' + I18N.ec_correlation + ': ' + p.value[2] },
grid: { left: '15%', right: '12%', bottom: '18%', top: '3%' },
xAxis: { type: 'category', data: names, axisLabel: { rotate: 30, fontSize: 11 }, splitArea: { show: true } },
yAxis: { type: 'category', data: names, axisLabel: { fontSize: 11 }, splitArea: { show: true } },
visualMap: { min: -1, max: 1, calculable: true, orient: 'vertical', right: 0, top: 'center',
inRange: { color: ['#fee2e2', '#fef3c7', '#f3f4f6', '#dbeafe', '#2563eb'] }, textStyle: { fontSize: 11 } },
series: [{
type: 'heatmap', data: corrData.data,
label: { show: true, fontSize: 11, formatter: p => p.value[2].toFixed(2) },
itemStyle: { borderWidth: 2, borderColor: '#fff' },
}],
};
chart.setOption(option);
window.addEventListener('resize', () => chart.resize());
})();
}
</script>
<script>
// ===== 8. 各维度独立得分柱状图 =====
const dimScoreBars = {"part3": {"dim_name": "\u8bfe\u7a0b\u9886\u5bfc\u529b", "district_avg": 52.21, "same_type_avg": 51.21, "school_name": "\u5609\u4e00\u5b9e\u9ad8", "school_score": 53.23}, "part4": {"dim_name": "\u6559\u5b66\u53d8\u9769\u529b", "district_avg": 50.75, "same_type_avg": 49.35, "school_name": "\u5609\u4e00\u5b9e\u9ad8", "school_score": 51.63}, "part5": {"dim_name": "\u5b66\u751f\u53d1\u5c55\u6307\u5bfc\u529b", "district_avg": 51.42, "same_type_avg": 49.71, "school_name": "\u5609\u4e00\u5b9e\u9ad8", "school_score": 52.36}, "part6": {"dim_name": "\u6559\u5e08\u53d1\u5c55\u652f\u6301\u529b", "district_avg": 51.62, "same_type_avg": 49.45, "school_name": "\u5609\u4e00\u5b9e\u9ad8", "school_score": 46.5}, "part7": {"dim_name": "\u6559\u80b2\u8d28\u91cf\u8bc4\u4f30\u529b", "district_avg": 54.39, "same_type_avg": 49.59, "school_name": "\u5609\u4e00\u5b9e\u9ad8", "school_score": 51.21}, "part8": {"dim_name": "\u6559\u80b2\u6761\u4ef6\u4fdd\u969c\u529b", "district_avg": 50.45, "same_type_avg": 49.76, "school_name": "\u5609\u4e00\u5b9e\u9ad8", "school_score": 53.72}, "part9": {"dim_name": "\u6570\u5b57\u5316\u8d4b\u80fd\u529b", "district_avg": 51.35, "same_type_avg": 49.57, "school_name": "\u5609\u4e00\u5b9e\u9ad8", "school_score": 54.84}};
Object.keys(dimScoreBars).forEach(partId => {
const el = document.getElementById('dim-score-' + partId);
if (!el) return;
const chart = echarts.init(el);
const d = dimScoreBars[partId];
const option = {
tooltip: { trigger: 'axis', axisPointer: { type: 'shadow' } },
grid: { left: '8%', right: '8%', bottom: '12%', top: '8%', containLabel: true },
xAxis: { type: 'category', data: [d.school_name, I18N.ec_district_avg, I18N.ec_same_type], axisLabel: { fontSize: 12 } },
yAxis: { type: 'value', min: 30, max: 80 },
series: [{
type: 'bar', barWidth: '40%',
data: [
{ value: d.school_score, itemStyle: { color: COLORS.primary } },
{ value: d.district_avg, itemStyle: { color: COLORS.gray } },
{ value: d.same_type_avg, itemStyle: { color: COLORS.warning } },
],
label: { show: true, position: 'top', fontSize: 13, fontWeight: 'bold', formatter: p => p.value.toFixed(2) },
markLine: { silent: true, data: [{ yAxis: 50, label: { formatter: I18N.ec_baseline_50, fontSize: 10 }, lineStyle: { color: '#ef4444', type: 'dashed' } }] },
}],
};
chart.setOption(option);
window.addEventListener('resize', () => chart.resize());
});
// ===== 9. 各维度子维度雷达图 =====
const dimSubRadar = {"part3": {"district_avg": [48.25, 52.96, 55.44], "same_type_avg": [48.25, 52.96, 55.44], "school_name": "\u5609\u4e00\u5b9e\u9ad8", "school_values": [29.74, 71.58, 58.38], "sub_dims": ["\u56fd\u5bb6\u6807\u51c6\u9075\u5faa", "\u8bfe\u7a0b\u7ed3\u6784\u5efa\u8bbe", "\u8bfe\u7a0b\u89c4\u8303\u843d\u5b9e"], "type": "radar"}, "part4": {"district_avg": [49.74, 51.75], "same_type_avg": [49.74, 51.75], "school_name": "\u5609\u4e00\u5b9e\u9ad8", "school_values": [51.84, 51.42], "sub_dims": ["\u6559\u5b66\u65b9\u5f0f\u53d8\u9769", "\u4f5c\u4e1a\u8bbe\u8ba1\u4e0e\u7ba1\u7406\u53d8\u9769"], "type": "bar"}, "part5": {"district_avg": [51.61, 51.23], "same_type_avg": [51.61, 51.23], "school_name": "\u5609\u4e00\u5b9e\u9ad8", "school_values": [55.58, 49.13], "sub_dims": ["\u5b66\u79d1\u53d1\u5c55\u7684\u4e2a\u6027\u5316\u8f85\u5bfc", "\u5b66\u751f\u751f\u6daf\u53d1\u5c55\u6307\u5bfc"], "type": "bar"}, "part6": {"district_avg": [49.45, 51.34, 54.07], "same_type_avg": [49.45, 51.34, 54.07], "school_name": "\u5609\u4e00\u5b9e\u9ad8", "school_values": [47.4, 50.66, 41.44], "sub_dims": ["\u57f9\u8bad\u652f\u6301", "\u6559\u7814\u652f\u6301", "\u9879\u76ee\u652f\u6301"], "type": "radar"}, "part7": {"district_avg": [54.65, 53.6, 54.6, 54.72], "same_type_avg": [54.65, 53.6, 54.6, 54.72], "school_name": "\u5609\u4e00\u5b9e\u9ad8", "school_values": [59.39, 52.57, 47.79, 45.1], "sub_dims": ["\u79d1\u5b66\u8bc4\u4ef7\u89c2", "\u5b66\u4e1a\u8d28\u91cf\u8bc4\u4f30", "\u7efc\u5408\u7d20\u8d28\u8bc4\u4f30", "\u5b9e\u8df5\u6d3b\u52a8\u8bc4\u4f30"], "type": "radar"}, "part8": {"district_avg": [50.78, 48.38, 52.18], "same_type_avg": [50.78, 48.38, 52.18], "school_name": "\u5609\u4e00\u5b9e\u9ad8", "school_values": [55.23, 52.17, 53.75], "sub_dims": ["\u533a\u57df\u63a8\u8fdb", "\u73af\u5883\u652f\u6301", "\u8d44\u6e90\u652f\u6301"], "type": "radar"}, "part9": {"district_avg": [50.71, 50.8, 52.55], "same_type_avg": [50.71, 50.8, 52.55], "school_name": "\u5609\u4e00\u5b9e\u9ad8", "school_values": [51.49, 51.7, 61.33], "sub_dims": ["\u6559\u5b66\u65b9\u5f0f\u521b\u65b0", "\u8bc4\u4ef7\u7cbe\u51c6\u5316\u4e0e\u4e2a\u6027\u5316", "\u8bfe\u7a0b\u8fed\u4ee3\u4f18\u5316"], "type": "radar"}};
Object.keys(dimSubRadar).forEach(partId => {
const el = document.getElementById('sub-radar-' + partId);
if (!el) return;
const chart = echarts.init(el);
const d = dimSubRadar[partId];
if (d.type === 'radar' && d.sub_dims && d.sub_dims.length >= 3) {
const option = {
tooltip: {},
legend: { data: [d.school_name, I18N.ec_district_avg, I18N.ec_same_type], bottom: 5, textStyle: { fontSize: 11 } },
radar: {
indicator: d.sub_dims.map(sd => ({ name: tSub(sd), max: 80 })),
shape: 'polygon', splitNumber: 4, axisName: { color: '#333', fontSize: 10 }, radius: '60%',
},
series: [{
type: 'radar',
data: [
{ value: d.school_values, name: d.school_name,
areaStyle: { opacity: 0.3, color: COLORS.primary },
lineStyle: { width: 3, color: COLORS.primary }, itemStyle: { color: COLORS.primary } },
{ value: d.district_avg, name: I18N.ec_district_avg,
lineStyle: { width: 1, type: 'dashed', color: COLORS.grayDark }, itemStyle: { color: COLORS.grayDark } },
{ value: d.same_type_avg, name: I18N.ec_same_type,
lineStyle: { width: 1, type: 'dotted', color: COLORS.warning }, itemStyle: { color: COLORS.warning } },
],
}],
};
chart.setOption(option);
} else {
const option = {
tooltip: { trigger: 'axis' },
legend: { data: [d.school_name, I18N.ec_district_avg, I18N.ec_same_type], bottom: 5, textStyle: { fontSize: 11 } },
grid: { left: '3%', right: '4%', bottom: '18%', top: '5%', containLabel: true },
xAxis: { type: 'category', data: d.sub_dims.map(tSub), axisLabel: { fontSize: 11 } },
yAxis: { type: 'value', min: 20, max: 80 },
series: [
{ name: d.school_name, type: 'bar', data: d.school_values,
itemStyle: { color: COLORS.primary }, barWidth: '22%',
label: { show: true, position: 'top', fontSize: 10 } },
{ name: I18N.ec_district_avg, type: 'bar', data: d.district_avg, itemStyle: { color: COLORS.gray }, barWidth: '22%' },
{ name: I18N.ec_same_type, type: 'bar', data: d.same_type_avg, itemStyle: { color: COLORS.warning }, barWidth: '22%' },
],
};
chart.setOption(option);
}
window.addEventListener('resize', () => chart.resize());
});
// ===== 10. 各维度子维度柱状图 =====
const subDimCharts = {"part3": {"avg_values": [48.25, 52.96, 55.44], "categories": ["\u56fd\u5bb6\u6807\u51c6\u9075\u5faa", "\u8bfe\u7a0b\u7ed3\u6784\u5efa\u8bbe", "\u8bfe\u7a0b\u89c4\u8303\u843d\u5b9e"], "school_values": [29.74, 71.58, 58.38]}, "part4": {"avg_values": [49.74, 51.75], "categories": ["\u6559\u5b66\u65b9\u5f0f\u53d8\u9769", "\u4f5c\u4e1a\u8bbe\u8ba1\u4e0e\u7ba1\u7406\u53d8\u9769"], "school_values": [51.84, 51.42]}, "part5": {"avg_values": [51.61, 51.23], "categories": ["\u5b66\u79d1\u53d1\u5c55\u7684\u4e2a\u6027\u5316\u8f85\u5bfc", "\u5b66\u751f\u751f\u6daf\u53d1\u5c55\u6307\u5bfc"], "school_values": [55.58, 49.13]}, "part6": {"avg_values": [49.45, 51.34, 54.07], "categories": ["\u57f9\u8bad\u652f\u6301", "\u6559\u7814\u652f\u6301", "\u9879\u76ee\u652f\u6301"], "school_values": [47.4, 50.66, 41.44]}, "part7": {"avg_values": [54.65, 53.6, 54.6, 54.72], "categories": ["\u79d1\u5b66\u8bc4\u4ef7\u89c2", "\u5b66\u4e1a\u8d28\u91cf\u8bc4\u4f30", "\u7efc\u5408\u7d20\u8d28\u8bc4\u4f30", "\u5b9e\u8df5\u6d3b\u52a8\u8bc4\u4f30"], "school_values": [59.39, 52.57, 47.79, 45.1]}, "part8": {"avg_values": [50.78, 48.38, 52.18], "categories": ["\u533a\u57df\u63a8\u8fdb", "\u73af\u5883\u652f\u6301", "\u8d44\u6e90\u652f\u6301"], "school_values": [55.23, 52.17, 53.75]}, "part9": {"avg_values": [50.71, 50.8, 52.55], "categories": ["\u6559\u5b66\u65b9\u5f0f\u521b\u65b0", "\u8bc4\u4ef7\u7cbe\u51c6\u5316\u4e0e\u4e2a\u6027\u5316", "\u8bfe\u7a0b\u8fed\u4ee3\u4f18\u5316"], "school_values": [51.49, 51.7, 61.33]}};
const SCHOOL_DISPLAY = "\u5609\u4e00\u5b9e\u9ad8";
Object.keys(subDimCharts).forEach(chartId => {
const el = document.getElementById('chart-' + chartId);
if (!el) return;
const chart = echarts.init(el);
const d = subDimCharts[chartId];
const option = {
tooltip: { trigger: 'axis' },
legend: { data: [SCHOOL_DISPLAY, I18N.ec_district_avg], bottom: 5 },
grid: { left: '3%', right: '4%', bottom: '18%', containLabel: true },
xAxis: { type: 'category', data: d.categories.map(tSub), axisLabel: { rotate: 15, fontSize: 11 } },
yAxis: { type: 'value', min: 20, max: 80 },
series: [
{ name: SCHOOL_DISPLAY, type: 'bar', data: d.school_values,
itemStyle: { color: COLORS.primary }, barWidth: '28%',
label: { show: true, position: 'top', fontSize: 10 } },
{ name: I18N.ec_district_avg, type: 'bar', data: d.avg_values, itemStyle: { color: COLORS.gray }, barWidth: '28%' },
{ name: I18N.ec_baseline_50, type: 'line', data: d.categories.map(() => 50),
lineStyle: { color: '#ef4444', type: 'dashed', width: 1 }, symbol: 'none' },
],
};
chart.setOption(option);
window.addEventListener('resize', () => chart.resize());
});
// ===== 11. 水平分布堆叠条形图 =====
const levelDistData = {"part3": {"categories": ["\u56fd\u5bb6\u6807\u51c6\u9075\u5faa", "\u8bfe\u7a0b\u7ed3\u6784\u5efa\u8bbe", "\u8bfe\u7a0b\u89c4\u8303\u843d\u5b9e"], "level1": [18.2, 0.0, 0.0], "level2": [36.4, 27.3, 18.2], "level3": [36.4, 36.4, 18.2], "level4": [9.1, 36.4, 63.6], "school_levels": [1, 4, 4]}, "part4": {"categories": ["\u6559\u5b66\u65b9\u5f0f\u53d8\u9769", "\u4f5c\u4e1a\u8bbe\u8ba1\u4e0e\u7ba1\u7406\u53d8\u9769"], "level1": [0.0, 0.0], "level2": [36.4, 27.3], "level3": [63.6, 45.5], "level4": [0.0, 27.3], "school_levels": [3, 3]}, "part5": {"categories": ["\u5b66\u79d1\u53d1\u5c55\u7684\u4e2a\u6027\u5316\u8f85\u5bfc", "\u5b66\u751f\u751f\u6daf\u53d1\u5c55\u6307\u5bfc"], "level1": [9.1, 0.0], "level2": [9.1, 36.4], "level3": [81.8, 54.5], "level4": [0.0, 9.1], "school_levels": [3, 2]}, "part6": {"categories": ["\u57f9\u8bad\u652f\u6301", "\u6559\u7814\u652f\u6301", "\u9879\u76ee\u652f\u6301"], "level1": [9.1, 9.1, 27.3], "level2": [27.3, 9.1, 27.3], "level3": [54.5, 72.7, 18.2], "level4": [9.1, 9.1, 27.3], "school_levels": [1, 3, 1]}, "part7": {"categories": ["\u79d1\u5b66\u8bc4\u4ef7\u89c2", "\u5b66\u4e1a\u8d28\u91cf\u8bc4\u4f30", "\u7efc\u5408\u7d20\u8d28\u8bc4\u4f30", "\u5b9e\u8df5\u6d3b\u52a8\u8bc4\u4f30"], "level1": [0.0, 0.0, 0.0, 18.2], "level2": [9.1, 27.3, 27.3, 9.1], "level3": [63.6, 27.3, 27.3, 9.1], "level4": [27.3, 45.5, 45.5, 63.6], "school_levels": [4, 3, 2, 2]}, "part8": {"categories": ["\u533a\u57df\u63a8\u8fdb", "\u73af\u5883\u652f\u6301", "\u8d44\u6e90\u652f\u6301"], "level1": [27.3, 18.2, 9.1], "level2": [18.2, 36.4, 18.2], "level3": [36.4, 18.2, 54.5], "level4": [18.2, 27.3, 18.2], "school_levels": [3, 3, 3]}, "part9": {"categories": ["\u6559\u5b66\u65b9\u5f0f\u521b\u65b0", "\u8bc4\u4ef7\u7cbe\u51c6\u5316\u4e0e\u4e2a\u6027\u5316", "\u8bfe\u7a0b\u8fed\u4ee3\u4f18\u5316"], "level1": [0.0, 0.0, 27.3], "level2": [9.1, 27.3, 9.1], "level3": [81.8, 72.7, 9.1], "level4": [9.1, 0.0, 54.5], "school_levels": [3, 3, 4]}};
Object.keys(levelDistData).forEach(chartId => {
const el = document.getElementById('level-' + chartId);
if (!el) return;
const chart = echarts.init(el);
const d = levelDistData[chartId];
if (!d.categories || d.categories.length === 0) return;
const localizedCats = d.categories.map(tSub);
const option = {
tooltip: { trigger: 'axis', axisPointer: { type: 'shadow' },
formatter: function(params) {
let s = params[0].axisValue + '<br/>';
params.forEach(p => { s += p.marker + ' ' + p.seriesName + ': ' + p.value + '%<br/>'; });
const idx = localizedCats.indexOf(params[0].axisValue);
if (idx >= 0) s += '<strong>' + I18N.ec_at_level.replace('{name}', SCHOOL_DISPLAY).replace('{lv}', d.school_levels[idx]) + '</strong>';
return s;
}
},
legend: { data: [I18N.ec_lvl_one, I18N.ec_lvl_two, I18N.ec_lvl_three, I18N.ec_lvl_four], bottom: 5, textStyle: { fontSize: 11 } },
grid: { left: '3%', right: '4%', bottom: '18%', top: '5%', containLabel: true },
xAxis: { type: 'category', data: localizedCats, axisLabel: { fontSize: 11, rotate: 15 } },
yAxis: { type: 'value', max: 100, axisLabel: { formatter: '{value}%' } },
series: [
{ name: I18N.ec_lvl_one, type: 'bar', stack: 'total', data: d.level1, itemStyle: { color: COLORS.level1 }, barWidth: '50%' },
{ name: I18N.ec_lvl_two, type: 'bar', stack: 'total', data: d.level2, itemStyle: { color: COLORS.level2 } },
{ name: I18N.ec_lvl_three, type: 'bar', stack: 'total', data: d.level3, itemStyle: { color: COLORS.level3 } },
{ name: I18N.ec_lvl_four, type: 'bar', stack: 'total', data: d.level4, itemStyle: { color: COLORS.level4 } },
],
};
chart.setOption(option);
window.addEventListener('resize', () => chart.resize());
});
// ===== 12. 各维度聚类散点图(2D / 3D =====
const dimScatterData = {"part3": {"axes": ["\u56fd\u5bb6\u6807\u51c6\u9075\u5faa", "\u8bfe\u7a0b\u7ed3\u6784\u5efa\u8bbe", "\u8bfe\u7a0b\u89c4\u8303\u843d\u5b9e"], "dim_name": "\u8bfe\u7a0b\u9886\u5bfc\u529b", "good_data": [[58.63, 50.45, 58.38], [53.8, 55.68, 58.38], [52.4, 55.74, 57.24], [55.81, 53.57, 58.38], [55.14, 48.04, 58.38]], "school_name": "\u5609\u4e00\u5b9e\u9ad8", "school_point": [29.74, 71.58, 58.38], "type": "3d", "weak_data": [[52.82, 49.68, 50.14], [53.72, 45.86, 46.44], [29.74, 45.54, 47.32], [43.68, 55.64, 58.38], [45.23, 50.73, 58.38]]}, "part4": {"axes": ["\u6559\u5b66\u65b9\u5f0f\u53d8\u9769", "\u4f5c\u4e1a\u8bbe\u8ba1\u4e0e\u7ba1\u7406\u53d8\u9769"], "dim_name": "\u6559\u5b66\u53d8\u9769\u529b", "good_data": [[53.13, 55.05], [51.31, 50.4], [49.42, 61.06], [50.85, 53.16], [49.15, 57.24]], "school_name": "\u5609\u4e00\u5b9e\u9ad8", "school_point": [51.84, 51.42], "type": "2d", "weak_data": [[46.77, 48.49], [51.36, 49.4], [47.54, 46.55], [47.93, 47.34], [47.87, 49.18]]}, "part5": {"axes": ["\u5b66\u79d1\u53d1\u5c55\u7684\u4e2a\u6027\u5316\u8f85\u5bfc", "\u5b66\u751f\u751f\u6daf\u53d1\u5c55\u6307\u5bfc"], "dim_name": "\u5b66\u751f\u53d1\u5c55\u6307\u5bfc\u529b", "good_data": [[53.8, 52.79], [51.65, 55.76], [55.99, 60.56], [51.51, 52.79], [50.52, 52.79]], "school_name": "\u5609\u4e00\u5b9e\u9ad8", "school_point": [55.58, 49.13], "type": "2d", "weak_data": [[53.97, 46.87], [53.0, 42.99], [42.64, 46.36], [50.04, 52.79], [49.06, 50.76]]}, "part6": {"axes": ["\u57f9\u8bad\u652f\u6301", "\u6559\u7814\u652f\u6301", "\u9879\u76ee\u652f\u6301"], "dim_name": "\u6559\u5e08\u53d1\u5c55\u652f\u6301\u529b", "good_data": [[49.33, 53.49, 50.32], [50.44, 55.43, 47.96], [54.61, 53.89, 54.82], [49.37, 50.13, 98.88], [49.38, 51.27, 66.14], [50.41, 53.98, 58.55]], "school_name": "\u5609\u4e00\u5b9e\u9ad8", "school_point": [47.4, 50.66, 41.44], "type": "3d", "weak_data": [[49.22, 49.16, 45.81], [47.99, 53.52, 47.27], [48.01, 42.27, 41.44], [47.78, 50.98, 42.17]]}, "part7": {"axes": ["\u79d1\u5b66\u8bc4\u4ef7\u89c2", "\u5b66\u4e1a\u8d28\u91cf\u8bc4\u4f30"], "dim_name": "\u6559\u80b2\u8d28\u91cf\u8bc4\u4f30\u529b", "good_data": [[56.59, 52.35], [56.38, 56.23], [60.17, 64.68], [60.9, 63.99], [53.0, 56.52], [50.84, 64.87]], "school_name": "\u5609\u4e00\u5b9e\u9ad8", "school_point": [59.39, 52.57], "type": "2d", "weak_data": [[50.89, 41.1], [51.01, 48.97], [46.09, 42.81], [55.92, 45.53]]}, "part8": {"axes": ["\u533a\u57df\u63a8\u8fdb", "\u73af\u5883\u652f\u6301", "\u8d44\u6e90\u652f\u6301"], "dim_name": "\u6559\u80b2\u6761\u4ef6\u4fdd\u969c\u529b", "good_data": [[53.13, 64.66, 53.34], [70.01, 45.15, 63.83], [48.38, 64.16, 59.77], [61.57, 46.06, 53.97], [48.9, 51.28, 56.64]], "school_name": "\u5609\u4e00\u5b9e\u9ad8", "school_point": [55.23, 52.17, 53.75], "type": "3d", "weak_data": [[53.13, 48.37, 53.54], [53.13, 36.23, 45.93], [38.36, 22.5, 39.67], [38.36, 57.43, 50.55], [38.36, 44.2, 42.98]]}, "part9": {"axes": ["\u6559\u5b66\u65b9\u5f0f\u521b\u65b0", "\u8bc4\u4ef7\u7cbe\u51c6\u5316\u4e0e\u4e2a\u6027\u5316", "\u8bfe\u7a0b\u8fed\u4ee3\u4f18\u5316"], "dim_name": "\u6570\u5b57\u5316\u8d4b\u80fd\u529b", "good_data": [[49.14, 50.72, 57.31], [51.63, 50.85, 61.33], [52.65, 44.16, 60.01], [50.04, 50.72, 61.33], [51.21, 52.55, 61.33]], "school_name": "\u5609\u4e00\u5b9e\u9ad8", "school_point": [51.49, 51.7, 61.33], "type": "3d", "weak_data": [[54.14, 50.72, 33.54], [52.56, 49.15, 36.54], [44.66, 56.8, 54.44], [50.13, 51.7, 43.42], [50.18, 49.74, 47.44]]}};
Object.keys(dimScatterData).forEach(partId => {
const el = document.getElementById('scatter-' + partId);
if (!el) return;
const d = dimScatterData[partId];
if (!d || !d.axes) return;
const chart = echarts.init(el);
const axisLabels = d.axes.map(tSub);
if (d.type === '3d') {
const option = {
tooltip: {
formatter: function(params) {
const v = params.value || (params.data && params.data.value);
if (!v) return '';
return params.seriesName + '<br/>'
+ axisLabels[0] + ': ' + (typeof v[0] === 'number' ? v[0].toFixed(2) : v[0]) + '<br/>'
+ axisLabels[1] + ': ' + (typeof v[1] === 'number' ? v[1].toFixed(2) : v[1]) + '<br/>'
+ axisLabels[2] + ': ' + (typeof v[2] === 'number' ? v[2].toFixed(2) : v[2]);
}
},
legend: { data: [I18N.ec_good_type_short, I18N.ec_weak_type_short, d.school_name], bottom: 5, textStyle: { fontSize: 11 } },
xAxis3D: { name: axisLabels[0], type: 'value', nameTextStyle: { fontSize: 10 } },
yAxis3D: { name: axisLabels[1], type: 'value', nameTextStyle: { fontSize: 10 } },
zAxis3D: { name: axisLabels[2], type: 'value', nameTextStyle: { fontSize: 10 } },
grid3D: {
viewControl: { autoRotate: true, autoRotateSpeed: 5, distance: 200, alpha: 20, beta: 30 },
boxWidth: 100, boxHeight: 100, boxDepth: 100,
light: { main: { intensity: 1.2, shadow: true }, ambient: { intensity: 0.3 } },
},
series: [
{ name: I18N.ec_good_type_short, type: 'scatter3D', data: d.good_data.map(p => ({ value: p })),
symbolSize: 8, itemStyle: { color: COLORS.success, opacity: 0.7 } },
{ name: I18N.ec_weak_type_short, type: 'scatter3D', data: d.weak_data.map(p => ({ value: p })),
symbolSize: 8, itemStyle: { color: COLORS.danger, opacity: 0.7 } },
{ name: d.school_name, type: 'scatter3D',
data: d.school_point ? [{ value: d.school_point }] : [],
symbolSize: 18, itemStyle: { color: COLORS.primary, borderColor: '#fff', borderWidth: 2 },
label: { show: true, formatter: d.school_name, textStyle: { fontSize: 12, fontWeight: 'bold', color: COLORS.primary } } },
],
};
chart.setOption(option);
} else {
const option = {
tooltip: { formatter: p => (p.data && p.data.name) ? p.data.name : axisLabels[0] + ': ' + p.value[0] + '<br/>' + axisLabels[1] + ': ' + p.value[1] },
legend: { data: [I18N.ec_good_type_short, I18N.ec_weak_type_short, d.school_name], bottom: 5, textStyle: { fontSize: 11 } },
grid: { left: '10%', right: '8%', bottom: '18%', top: '5%' },
xAxis: { name: axisLabels[0], nameLocation: 'center', nameGap: 30, nameTextStyle: { fontSize: 11 }, splitLine: { show: true, lineStyle: { type: 'dashed' } } },
yAxis: { name: axisLabels[1], nameLocation: 'center', nameGap: 40, nameTextStyle: { fontSize: 11 }, splitLine: { show: true, lineStyle: { type: 'dashed' } } },
series: [
{ name: I18N.ec_good_type_short, type: 'scatter', data: d.good_data, symbolSize: 10, itemStyle: { color: COLORS.success, opacity: 0.6 } },
{ name: I18N.ec_weak_type_short, type: 'scatter', data: d.weak_data, symbolSize: 10, itemStyle: { color: COLORS.danger, opacity: 0.6 } },
{ name: d.school_name, type: 'scatter',
data: d.school_point ? [{ value: d.school_point, name: d.school_name, symbolSize: 22 }] : [],
symbolSize: 22, itemStyle: { color: COLORS.primary, borderColor: '#fff', borderWidth: 3 },
label: { show: true, formatter: d.school_name, position: 'top', textStyle: { fontSize: 13, fontWeight: 'bold', color: COLORS.primary } } },
],
};
chart.setOption(option);
}
window.addEventListener('resize', () => chart.resize());
});
</script>
<script>
// ===== A. 学校画像卡(仪表盘 + 红绿灯) =====
const profileData = {"cluster": "\u8f83\u597d", "dim_signals": [{"avg_level": 3.0, "min_level": 1, "name": "\u8bfe\u7a0b\u9886\u5bfc\u529b", "rank": 6, "score": 53.23}, {"avg_level": 3.0, "min_level": 3, "name": "\u6559\u5b66\u53d8\u9769\u529b", "rank": 5, "score": 51.63}, {"avg_level": 2.5, "min_level": 2, "name": "\u5b66\u751f\u53d1\u5c55\u6307\u5bfc\u529b", "rank": 4, "score": 52.36}, {"avg_level": 1.7, "min_level": 1, "name": "\u6559\u5e08\u53d1\u5c55\u652f\u6301\u529b", "rank": 10, "score": 46.5}, {"avg_level": 2.8, "min_level": 2, "name": "\u6559\u80b2\u8d28\u91cf\u8bc4\u4f30\u529b", "rank": 8, "score": 51.21}, {"avg_level": 3.0, "min_level": 3, "name": "\u6559\u80b2\u6761\u4ef6\u4fdd\u969c\u529b", "rank": 5, "score": 53.72}, {"avg_level": 3.3, "min_level": 3, "name": "\u6570\u5b57\u5316\u8d4b\u80fd\u529b", "rank": 2, "score": 54.84}], "district_avg": 51.74, "level_counts": {"1": 3, "2": 3, "3": 10, "4": 4}, "rank": 6, "school_name": "\u5609\u4e00\u5b9e\u9ad8", "school_type": "\u533a\u5b9e\u9a8c\u6027\u793a\u8303\u6027\u9ad8\u4e2d", "total_schools": 11, "total_score": 51.93, "total_sub_dims": 20};
if (profileData && profileData.total_score) {
(function() {
const chart = echarts.init(document.getElementById('profile-card-chart'));
const score = profileData.total_score;
const districtAvg = profileData.district_avg;
const signals = profileData.dim_signals;
const levelCounts = profileData.level_counts;
const signalColor = function(minLevel) {
if (minLevel >= 4) return '#10b981';
if (minLevel >= 3) return '#3b82f6';
if (minLevel >= 2) return '#f59e0b';
return '#ef4444';
};
const subtitle = (profileData.school_type ? (tDim(profileData.school_type) || profileData.school_type) + ' · ' : '')
+ I18N.ec_district_rank_n.replace('{rank}', profileData.rank);
const option = {
title: [
{ text: profileData.school_name, left: 'center', top: 6, textStyle: { fontSize: 16, fontWeight: 'bold', color: '#1e3a5f' } },
{ text: subtitle, left: 'center', top: 28, textStyle: { fontSize: 11, color: '#6b7280' } },
],
series: [
{
type: 'gauge',
center: ['50%', '60%'],
radius: '55%',
startAngle: 210,
endAngle: -30,
min: 30,
max: 70,
splitNumber: 4,
itemStyle: { color: score >= districtAvg ? '#2563eb' : '#f59e0b' },
progress: { show: true, width: 18, roundCap: true },
pointer: { show: false },
axisLine: { lineStyle: { width: 18, color: [[0.25, '#fee2e2'], [0.5, '#fef3c7'], [0.75, '#dbeafe'], [1, '#d1fae5']] } },
axisTick: { show: false },
splitLine: { show: false },
axisLabel: { show: true, distance: 25, fontSize: 10, color: '#6b7280',
formatter: function(v) { return v.toFixed(0); } },
detail: {
valueAnimation: true, offsetCenter: [0, '-5%'],
fontSize: 36, fontWeight: 'bold', color: '#1e3a5f',
formatter: function(v) { return v.toFixed(1); },
},
data: [{ value: score }],
},
{ type: 'pie', center: ['50%', '92%'], radius: ['0%', '0%'], silent: true, data: [] },
],
graphic: (function() {
var items = [];
var startX = 50 - (signals.length - 1) * 6;
signals.forEach(function(sig, i) {
var x = startX + i * 12;
items.push({
type: 'circle', shape: { cx: 0, cy: 0, r: 8 },
left: x + '%', top: '78%',
style: { fill: signalColor(sig.min_level), shadowBlur: 6, shadowColor: signalColor(sig.min_level) },
});
items.push({
type: 'text',
left: x + '%', top: '84%',
style: { text: shortDim(sig.name), textAlign: 'center', fontSize: 9, fill: '#374151' },
});
});
var summaryText = I18N.ec_level_dist_summary + ': ';
summaryText += I18N.ec_lv_short + '4=' + levelCounts[4] + ' '
+ I18N.ec_lv_short + '3=' + levelCounts[3] + ' '
+ I18N.ec_lv_short + '2=' + levelCounts[2] + ' '
+ I18N.ec_lv_short + '1=' + levelCounts[1];
items.push({
type: 'text', left: 'center', top: '93%',
style: { text: summaryText, textAlign: 'center', fontSize: 10, fill: '#6b7280' },
});
return items;
})(),
};
chart.setOption(option);
window.addEventListener('resize', () => chart.resize());
})();
}
// ===== B. 优势-短板象限图 =====
const quadrantData = {"items": [{"diff": -18.51, "level": 1, "name": "\u56fd\u5bb6\u6807\u51c6\u9075\u5faa", "parent": "\u8bfe\u7a0b\u9886\u5bfc\u529b", "score": 29.74}, {"diff": 18.63, "level": 4, "name": "\u8bfe\u7a0b\u7ed3\u6784\u5efa\u8bbe", "parent": "\u8bfe\u7a0b\u9886\u5bfc\u529b", "score": 71.58}, {"diff": 2.94, "level": 4, "name": "\u8bfe\u7a0b\u89c4\u8303\u843d\u5b9e", "parent": "\u8bfe\u7a0b\u9886\u5bfc\u529b", "score": 58.38}, {"diff": 2.09, "level": 3, "name": "\u6559\u5b66\u65b9\u5f0f\u53d8\u9769", "parent": "\u6559\u5b66\u53d8\u9769\u529b", "score": 51.84}, {"diff": -0.33, "level": 3, "name": "\u4f5c\u4e1a\u8bbe\u8ba1\u4e0e\u7ba1\u7406\u53d8\u9769", "parent": "\u6559\u5b66\u53d8\u9769\u529b", "score": 51.42}, {"diff": 3.96, "level": 3, "name": "\u5b66\u79d1\u53d1\u5c55\u7684\u4e2a\u6027\u5316\u8f85\u5bfc", "parent": "\u5b66\u751f\u53d1\u5c55\u6307\u5bfc\u529b", "score": 55.58}, {"diff": -2.1, "level": 2, "name": "\u5b66\u751f\u751f\u6daf\u53d1\u5c55\u6307\u5bfc", "parent": "\u5b66\u751f\u53d1\u5c55\u6307\u5bfc\u529b", "score": 49.13}, {"diff": -2.05, "level": 1, "name": "\u57f9\u8bad\u652f\u6301", "parent": "\u6559\u5e08\u53d1\u5c55\u652f\u6301\u529b", "score": 47.4}, {"diff": -0.69, "level": 3, "name": "\u6559\u7814\u652f\u6301", "parent": "\u6559\u5e08\u53d1\u5c55\u652f\u6301\u529b", "score": 50.66}, {"diff": -12.63, "level": 1, "name": "\u9879\u76ee\u652f\u6301", "parent": "\u6559\u5e08\u53d1\u5c55\u652f\u6301\u529b", "score": 41.44}, {"diff": 4.74, "level": 4, "name": "\u79d1\u5b66\u8bc4\u4ef7\u89c2", "parent": "\u6559\u80b2\u8d28\u91cf\u8bc4\u4f30\u529b", "score": 59.39}, {"diff": -1.03, "level": 3, "name": "\u5b66\u4e1a\u8d28\u91cf\u8bc4\u4f30", "parent": "\u6559\u80b2\u8d28\u91cf\u8bc4\u4f30\u529b", "score": 52.57}, {"diff": -6.8, "level": 2, "name": "\u7efc\u5408\u7d20\u8d28\u8bc4\u4f30", "parent": "\u6559\u80b2\u8d28\u91cf\u8bc4\u4f30\u529b", "score": 47.79}, {"diff": -9.62, "level": 2, "name": "\u5b9e\u8df5\u6d3b\u52a8\u8bc4\u4f30", "parent": "\u6559\u80b2\u8d28\u91cf\u8bc4\u4f30\u529b", "score": 45.1}, {"diff": 4.46, "level": 3, "name": "\u533a\u57df\u63a8\u8fdb", "parent": "\u6559\u80b2\u6761\u4ef6\u4fdd\u969c\u529b", "score": 55.23}, {"diff": 3.79, "level": 3, "name": "\u73af\u5883\u652f\u6301", "parent": "\u6559\u80b2\u6761\u4ef6\u4fdd\u969c\u529b", "score": 52.17}, {"diff": 1.57, "level": 3, "name": "\u8d44\u6e90\u652f\u6301", "parent": "\u6559\u80b2\u6761\u4ef6\u4fdd\u969c\u529b", "score": 53.75}, {"diff": 0.78, "level": 3, "name": "\u6559\u5b66\u65b9\u5f0f\u521b\u65b0", "parent": "\u6570\u5b57\u5316\u8d4b\u80fd\u529b", "score": 51.49}, {"diff": 0.9, "level": 3, "name": "\u8bc4\u4ef7\u7cbe\u51c6\u5316\u4e0e\u4e2a\u6027\u5316", "parent": "\u6570\u5b57\u5316\u8d4b\u80fd\u529b", "score": 51.7}, {"diff": 8.78, "level": 4, "name": "\u8bfe\u7a0b\u8fed\u4ee3\u4f18\u5316", "parent": "\u6570\u5b57\u5316\u8d4b\u80fd\u529b", "score": 61.33}], "school_name": "\u5609\u4e00\u5b9e\u9ad8", "x_center": 50, "y_center": 0};
if (quadrantData && quadrantData.items && quadrantData.items.length > 0) {
(function() {
const chart = echarts.init(document.getElementById('quadrant-chart'));
const items = quadrantData.items;
const dimColors = {
'课程领导力': '#2563eb', '教学变革力': '#7c3aed', '学生发展指导力': '#059669',
'教师发展支持力': '#d97706', '教育质量评估力': '#dc2626',
'教育条件保障力': '#0891b2', '数字化赋能力': '#be185d',
};
const scatterData = items.map(function(item) {
return {
value: [item.score, item.diff],
name: tSub(item.name),
originalName: item.name,
parent: item.parent,
level: item.level,
itemStyle: { color: dimColors[item.parent] || '#6b7280' },
};
});
const option = {
tooltip: {
formatter: function(p) {
var d = p.data;
return '<strong>' + d.name + '</strong> (' + tDim(d.parent) + ')<br/>' +
I18N.ec_quad_score + ': ' + d.value[0] + '<br/>' +
I18N.ec_quad_diff + ': ' + (d.value[1] > 0 ? '+' : '') + d.value[1] + '<br/>' +
I18N.ec_quad_level + ': ' + d.level;
}
},
grid: { left: '12%', right: '5%', bottom: '12%', top: '8%' },
xAxis: {
name: I18N.ec_quad_x_axis, nameLocation: 'center', nameGap: 28,
nameTextStyle: { fontSize: 12 },
min: 20, max: 80,
splitLine: { show: true, lineStyle: { type: 'dashed', color: '#e5e7eb' } },
},
yAxis: {
name: I18N.ec_quad_y_axis, nameLocation: 'center', nameGap: 40,
nameTextStyle: { fontSize: 12 },
splitLine: { show: true, lineStyle: { type: 'dashed', color: '#e5e7eb' } },
},
series: [{
type: 'scatter',
data: scatterData,
symbolSize: function(val, params) { return Math.abs(val[1]) * 1.5 + 10; },
label: {
show: true, position: 'right', fontSize: 9,
formatter: function(p) {
var n = p.data.name;
if (LANG === 'en') {
return n.length > 14 ? n.substring(0, 14) + '…' : n;
}
return n.length > 5 ? n.substring(0, 5) + '…' : n;
},
color: '#374151',
},
}],
graphic: [
{ type: 'text', right: '8%', top: '10%',
style: { text: '■ ' + I18N.ec_quadrant_q1, fill: '#059669', fontSize: 11, fontWeight: 'bold' } },
{ type: 'text', left: '14%', bottom: '14%',
style: { text: '■ ' + I18N.ec_quadrant_q3, fill: '#dc2626', fontSize: 11, fontWeight: 'bold' } },
{ type: 'text', right: '8%', bottom: '14%',
style: { text: '⊙ ' + I18N.ec_quadrant_q4, fill: '#d97706', fontSize: 11, fontWeight: 'bold' } },
{ type: 'text', left: '14%', top: '10%',
style: { text: '↗ ' + I18N.ec_quadrant_q2, fill: '#2563eb', fontSize: 11, fontWeight: 'bold' } },
],
markLine: {},
};
option.series[0].markLine = {
silent: true, symbol: 'none',
lineStyle: { color: '#9ca3af', type: 'dashed', width: 1 },
data: [
{ xAxis: 50, label: { formatter: I18N.ec_quad_district_avg_marker, fontSize: 10, position: 'start' } },
{ yAxis: 0, label: { show: false } },
],
};
chart.setOption(option);
window.addEventListener('resize', () => chart.resize());
})();
}
// ===== C. 温度计条形图 =====
const thermoData = {"data": {"\u4f5c\u4e1a\u8bbe\u8ba1\u4e0e\u7ba1\u7406\u53d8\u9769": {"district_avg": 51.75, "level": 3, "same_type_avg": 51.75, "score": 51.42, "thresholds": {"level2": 45, "level3": 49, "level4": 54}}, "\u533a\u57df\u63a8\u8fdb": {"district_avg": 50.78, "level": 3, "same_type_avg": 50.78, "score": 55.23, "thresholds": {"level2": 40, "level3": 52, "level4": 59}}, "\u56fd\u5bb6\u6807\u51c6\u9075\u5faa": {"district_avg": 48.25, "level": 1, "same_type_avg": 48.25, "score": 29.74, "thresholds": {"level2": 43, "level3": 53.5, "level4": 57}}, "\u57f9\u8bad\u652f\u6301": {"district_avg": 49.45, "level": 1, "same_type_avg": 49.45, "score": 47.4, "thresholds": {"level2": 47.5, "level3": 49, "level4": 51}}, "\u5b66\u4e1a\u8d28\u91cf\u8bc4\u4f30": {"district_avg": 53.6, "level": 3, "same_type_avg": 53.6, "score": 52.57, "thresholds": {"level2": 41, "level3": 46, "level4": 54}}, "\u5b66\u751f\u751f\u6daf\u53d1\u5c55\u6307\u5bfc": {"district_avg": 51.23, "level": 2, "same_type_avg": 51.23, "score": 49.13, "thresholds": {"level2": 42, "level3": 50, "level4": 56}}, "\u5b66\u79d1\u53d1\u5c55\u7684\u4e2a\u6027\u5316\u8f85\u5bfc": {"district_avg": 51.61, "level": 3, "same_type_avg": 51.61, "score": 55.58, "thresholds": {"level2": 46, "level3": 50, "level4": 60}}, "\u5b9e\u8df5\u6d3b\u52a8\u8bc4\u4f30": {"district_avg": 54.72, "level": 2, "same_type_avg": 54.72, "score": 45.1, "thresholds": {"level2": 43, "level3": 46.5, "level4": 50}}, "\u6559\u5b66\u65b9\u5f0f\u521b\u65b0": {"district_avg": 50.71, "level": 3, "same_type_avg": 50.71, "score": 51.49, "thresholds": {"level2": 40, "level3": 45, "level4": 54}}, "\u6559\u5b66\u65b9\u5f0f\u53d8\u9769": {"district_avg": 49.74, "level": 3, "same_type_avg": 49.74, "score": 51.84, "thresholds": {"level2": 45, "level3": 49, "level4": 54}}, "\u6559\u7814\u652f\u6301": {"district_avg": 51.34, "level": 3, "same_type_avg": 51.34, "score": 50.66, "thresholds": {"level2": 47, "level3": 50, "level4": 55}}, "\u73af\u5883\u652f\u6301": {"district_avg": 48.38, "level": 3, "same_type_avg": 48.38, "score": 52.17, "thresholds": {"level2": 41, "level3": 49.5, "level4": 56}}, "\u79d1\u5b66\u8bc4\u4ef7\u89c2": {"district_avg": 54.65, "level": 4, "same_type_avg": 54.65, "score": 59.39, "thresholds": {"level2": 43, "level3": 50, "level4": 57}}, "\u7efc\u5408\u7d20\u8d28\u8bc4\u4f30": {"district_avg": 54.6, "level": 2, "same_type_avg": 54.6, "score": 47.79, "thresholds": {"level2": 39, "level3": 50, "level4": 58.5}}, "\u8bc4\u4ef7\u7cbe\u51c6\u5316\u4e0e\u4e2a\u6027\u5316": {"district_avg": 50.8, "level": 3, "same_type_avg": 50.8, "score": 51.7, "thresholds": {"level2": 40, "level3": 50, "level4": 60}}, "\u8bfe\u7a0b\u7ed3\u6784\u5efa\u8bbe": {"district_avg": 52.96, "level": 4, "same_type_avg": 52.96, "score": 71.58, "thresholds": {"level2": 45, "level3": 49, "level4": 55.5}}, "\u8bfe\u7a0b\u89c4\u8303\u843d\u5b9e": {"district_avg": 55.44, "level": 4, "same_type_avg": 55.44, "score": 58.38, "thresholds": {"level2": 44, "level3": 50, "level4": 58}}, "\u8bfe\u7a0b\u8fed\u4ee3\u4f18\u5316": {"district_avg": 52.55, "level": 4, "same_type_avg": 52.55, "score": 61.33, "thresholds": {"level2": 45, "level3": 50, "level4": 55}}, "\u8d44\u6e90\u652f\u6301": {"district_avg": 52.18, "level": 3, "same_type_avg": 52.18, "score": 53.75, "thresholds": {"level2": 42, "level3": 49, "level4": 57.5}}, "\u9879\u76ee\u652f\u6301": {"district_avg": 54.07, "level": 1, "same_type_avg": 54.07, "score": 41.44, "thresholds": {"level2": 44, "level3": 50, "level4": 56.5}}}, "school_name": "\u5609\u4e00\u5b9e\u9ad8"};
if (thermoData && thermoData.data) {
(function() {
var partSubMap = {};
partSubMap['part3-1'] = '国家标准遵循';
partSubMap['part3-2'] = '课程结构建设';
partSubMap['part3-3'] = '课程规范落实';
partSubMap['part4-1'] = '教学方式变革';
partSubMap['part4-2'] = '作业设计与管理变革';
partSubMap['part5-1'] = '学科发展的个性化辅导';
partSubMap['part5-2'] = '学生生涯发展指导';
partSubMap['part6-1'] = '培训支持';
partSubMap['part6-2'] = '教研支持';
partSubMap['part6-3'] = '项目支持';
partSubMap['part7-1'] = '科学评价观';
partSubMap['part7-2'] = '学业质量评估';
partSubMap['part7-3'] = '综合素质评估';
partSubMap['part7-4'] = '实践活动评估';
partSubMap['part8-1'] = '区域推进';
partSubMap['part8-2'] = '环境支持';
partSubMap['part8-3'] = '资源支持';
partSubMap['part9-1'] = '教学方式创新';
partSubMap['part9-2'] = '评价精准化与个性化';
partSubMap['part9-3'] = '课程迭代优化';
Object.keys(partSubMap).forEach(function(key) {
var sdName = partSubMap[key];
var d = thermoData.data[sdName];
if (!d) return;
var el = document.getElementById('thermo-' + key);
if (!el) return;
var chart = echarts.init(el);
var score = d.score;
var distAvg = d.district_avg;
var sameTypeAvg = d.same_type_avg;
var th = d.thresholds;
var option = {
grid: { left: '3%', right: '3%', top: '25%', bottom: '25%' },
xAxis: { type: 'value', min: 20, max: 80, axisLabel: { show: false }, axisTick: { show: false }, axisLine: { show: false }, splitLine: { show: false } },
yAxis: { type: 'category', data: [''], axisLabel: { show: false }, axisTick: { show: false }, axisLine: { show: false } },
series: [
{ type: 'bar', data: [th.level2 - 20], stack: 'bg', barWidth: '60%', itemStyle: { color: '#fee2e2', borderRadius: [4, 0, 0, 4] }, silent: true },
{ type: 'bar', data: [th.level3 - th.level2], stack: 'bg', barWidth: '60%', itemStyle: { color: '#fef3c7' }, silent: true },
{ type: 'bar', data: [th.level4 - th.level3], stack: 'bg', barWidth: '60%', itemStyle: { color: '#dbeafe' }, silent: true },
{ type: 'bar', data: [80 - th.level4], stack: 'bg', barWidth: '60%', itemStyle: { color: '#d1fae5', borderRadius: [0, 4, 4, 0] }, silent: true },
],
graphic: (function() {
var items = [];
var toPercent = function(val) { return ((val - 20) / 60 * 94 + 3) + '%'; };
items.push({
type: 'text', left: toPercent(score), top: '2%',
style: { text: I18N.ec_thermo_self_marker + score, textAlign: 'center', fontSize: 11, fontWeight: 'bold', fill: '#1e3a5f' },
});
items.push({
type: 'text', left: toPercent(distAvg), bottom: '0%',
style: { text: I18N.ec_thermo_dist_marker, textAlign: 'center', fontSize: 9, fill: '#6b7280' },
});
if (Math.abs(sameTypeAvg - distAvg) > 1) {
items.push({
type: 'text', left: toPercent(sameTypeAvg), bottom: '0%',
style: { text: I18N.ec_thermo_same_marker, textAlign: 'center', fontSize: 9, fill: '#d97706' },
});
}
return items;
})(),
};
chart.setOption(option);
window.addEventListener('resize', () => chart.resize());
});
})();
}
// ===== D. 进步空间瀑布图 =====
const waterfallData = {"current_total": 51.93, "improvements": [{"current_level": 1, "current_score": 29.74, "gap": 23.76, "name": "\u56fd\u5bb6\u6807\u51c6\u9075\u5faa", "parent": "\u8bfe\u7a0b\u9886\u5bfc\u529b", "target_score": 53.5}, {"current_level": 1, "current_score": 41.44, "gap": 8.56, "name": "\u9879\u76ee\u652f\u6301", "parent": "\u6559\u5e08\u53d1\u5c55\u652f\u6301\u529b", "target_score": 50}, {"current_level": 2, "current_score": 47.79, "gap": 2.21, "name": "\u7efc\u5408\u7d20\u8d28\u8bc4\u4f30", "parent": "\u6559\u80b2\u8d28\u91cf\u8bc4\u4f30\u529b", "target_score": 50}, {"current_level": 1, "current_score": 47.4, "gap": 1.6, "name": "\u57f9\u8bad\u652f\u6301", "parent": "\u6559\u5e08\u53d1\u5c55\u652f\u6301\u529b", "target_score": 49}, {"current_level": 2, "current_score": 45.1, "gap": 1.4, "name": "\u5b9e\u8df5\u6d3b\u52a8\u8bc4\u4f30", "parent": "\u6559\u80b2\u8d28\u91cf\u8bc4\u4f30\u529b", "target_score": 46.5}, {"current_level": 2, "current_score": 49.13, "gap": 0.87, "name": "\u5b66\u751f\u751f\u6daf\u53d1\u5c55\u6307\u5bfc", "parent": "\u5b66\u751f\u53d1\u5c55\u6307\u5bfc\u529b", "target_score": 50}], "potential_total": 53.85, "school_name": "\u5609\u4e00\u5b9e\u9ad8", "steps": [{"name": "\u5f53\u524d\u603b\u5206", "type": "current", "value": 51.93}, {"detail": "\u4ece\u6c34\u5e731\u2192\u6c34\u5e733 (+23.76\u5206)", "name": "\u56fd\u5bb6\u6807\u51c6\u9075\u5faa", "type": "gain", "value": 1.19}, {"detail": "\u4ece\u6c34\u5e731\u2192\u6c34\u5e733 (+8.56\u5206)", "name": "\u9879\u76ee\u652f\u6301", "type": "gain", "value": 0.43}, {"detail": "\u4ece\u6c34\u5e732\u2192\u6c34\u5e733 (+2.21\u5206)", "name": "\u7efc\u5408\u7d20\u8d28\u8bc4\u4f30", "type": "gain", "value": 0.11}, {"detail": "\u4ece\u6c34\u5e731\u2192\u6c34\u5e733 (+1.6\u5206)", "name": "\u57f9\u8bad\u652f\u6301", "type": "gain", "value": 0.08}, {"detail": "\u4ece\u6c34\u5e732\u2192\u6c34\u5e733 (+1.4\u5206)", "name": "\u5b9e\u8df5\u6d3b\u52a8\u8bc4\u4f30", "type": "gain", "value": 0.07}, {"detail": "\u4ece\u6c34\u5e732\u2192\u6c34\u5e733 (+0.87\u5206)", "name": "\u5b66\u751f\u751f\u6daf\u53d1\u5c55\u6307\u5bfc", "type": "gain", "value": 0.04}, {"name": "\u6f5c\u5728\u603b\u5206", "type": "potential", "value": 53.85}], "total_gain": 1.92};
if (waterfallData && waterfallData.steps && waterfallData.steps.length > 1) {
(function() {
var el = document.getElementById('waterfall-chart');
if (!el) return;
var chart = echarts.init(el);
var steps = waterfallData.steps;
var categories = [];
var baseData = [];
var gainData = [];
var totalData = [];
var runningBase = 0;
steps.forEach(function(step, i) {
// 名字本地化(gain 项是子维度名,current/potential 是固定文案)
var displayName;
if (step.type === 'current') {
displayName = I18N.ec_waterfall_current;
} else if (step.type === 'potential') {
displayName = I18N.ec_waterfall_potential;
} else {
displayName = tSub(step.name) || step.name;
}
var maxLen = LANG === 'en' ? 14 : 6;
var shortName = displayName.length > maxLen ? displayName.substring(0, maxLen) + '…' : displayName;
categories.push(shortName);
if (step.type === 'current') {
baseData.push(0); gainData.push(0); totalData.push(step.value);
runningBase = step.value;
} else if (step.type === 'gain') {
baseData.push(runningBase); gainData.push(step.value); totalData.push(0);
runningBase += step.value;
} else if (step.type === 'potential') {
baseData.push(0); gainData.push(0); totalData.push(step.value);
}
});
var option = {
tooltip: {
trigger: 'axis', axisPointer: { type: 'shadow' },
formatter: function(params) {
var idx = params[0].dataIndex;
var step = steps[idx];
var detailName = step.type === 'gain' ? (tSub(step.name) || step.name) : step.name;
if (step.type === 'current') return I18N.ec_waterfall_current + ': <strong>' + step.value + '</strong> ' + I18N.ec_waterfall_pts_unit;
if (step.type === 'potential') return I18N.ec_waterfall_potential + ': <strong>' + step.value + '</strong> ' + I18N.ec_waterfall_pts_unit + ' (+' + waterfallData.total_gain + ')';
return '<strong>' + detailName + '</strong><br/>' +
(step.detail || '') + '<br/>' + I18N.ec_waterfall_contrib + ': +' + step.value + ' ' + I18N.ec_waterfall_pts_unit;
},
},
grid: { left: '5%', right: '5%', bottom: '18%', top: '8%', containLabel: true },
xAxis: {
type: 'category', data: categories,
axisLabel: { fontSize: 10, rotate: 20 },
},
yAxis: {
type: 'value',
min: Math.floor(waterfallData.current_total - 2),
max: Math.ceil(waterfallData.potential_total + 2),
axisLabel: { fontSize: 11 },
},
series: [
{ type: 'bar', stack: 'waterfall', data: baseData, itemStyle: { color: 'transparent' }, barWidth: '45%', emphasis: { itemStyle: { color: 'transparent' } } },
{ type: 'bar', stack: 'waterfall', data: gainData,
itemStyle: { color: '#10b981', borderRadius: [4, 4, 0, 0] }, barWidth: '45%',
label: { show: true, position: 'top', fontSize: 10, color: '#059669',
formatter: function(p) { return p.value > 0 ? '+' + p.value.toFixed(2) : ''; } },
},
{ type: 'bar', data: totalData,
itemStyle: { color: function(p) { return p.dataIndex === 0 ? '#2563eb' : '#0891b2'; }, borderRadius: [4, 4, 0, 0] },
barWidth: '45%',
label: { show: true, position: 'top', fontSize: 12, fontWeight: 'bold', color: '#1e3a5f',
formatter: function(p) { return p.value > 0 ? p.value.toFixed(1) : ''; } },
},
],
};
chart.setOption(option);
window.addEventListener('resize', () => chart.resize());
})();
}
</script>
<script>
(function() {
/* ---- 1. 自动扫描 h1/h2 生成 TOC ---- */
var track = document.getElementById('toc-track');
var container = document.querySelector('.report-container');
// 取 .section 内的 h1(部分标题)和 h2[id](子维度标题)
var headings = container.querySelectorAll('.section > h1, h2[id]');
var currentGroup = null;
headings.forEach(function(h) {
// 确保有 id 可跳转;h1 取父 .section 的 idh2 自身有 id
var id = '';
if (h.tagName === 'H1') {
var sec = h.closest('.section');
id = sec ? sec.id : '';
} else {
id = h.id;
}
if (!id) return;
var a = document.createElement('a');
a.href = '#' + id;
a.className = 'toc-item';
// 去掉"第X部分 / Part X." 前缀,只保留核心文字
var text = h.textContent;
// 中文:去掉"第X部分 "
text = text.replace(/^第[一二三四五六七八九十]+部分\s*/, '');
// 英文:去掉"Part X. "
text = text.replace(/^Part\s+[IVXLC]+\.?\s*/, '');
// h2 也去掉"二、""三、"等编号前缀
text = text.replace(/^[一二三四五六七八九十]+、\s*/, '');
// 英文 h2:去掉"I." "II." 等罗马数字前缀
text = text.replace(/^[IVXLC]+\.\s*/, '');
// 英文 h2:去掉 "(i) (ii)" 等小写罗马数字
text = text.replace(/^\([ivxlc]+\)\s*/, '');
a.textContent = text;
if (h.tagName === 'H1') {
a.classList.add('level-1');
a.setAttribute('data-group', id);
currentGroup = id;
} else {
a.classList.add('level-2');
if (currentGroup) a.setAttribute('data-parent', currentGroup);
}
track.appendChild(a);
});
/* ---- 2. 事件绑定 ---- */
var tocItems = track.querySelectorAll('.toc-item');
var level2Items = track.querySelectorAll('.toc-item.level-2');
var sections = [];
tocItems.forEach(function(item) {
var target = document.getElementById(item.getAttribute('href').slice(1));
if (target) sections.push({ el: target, link: item });
// 点击平滑滚动
item.addEventListener('click', function(e) {
e.preventDefault();
target && target.scrollIntoView({ behavior: 'smooth', block: 'start' });
if (window.innerWidth <= 1280) {
document.getElementById('toc-nav').classList.remove('show');
}
});
});
function expandGroup(gid) {
level2Items.forEach(function(item) {
item.classList.toggle('visible', item.getAttribute('data-parent') === gid);
});
}
/* ---- 3. 滚动高亮 ---- */
var ticking = false;
window.addEventListener('scroll', function() {
if (ticking) return;
ticking = true;
window.requestAnimationFrame(function() {
var scrollY = window.scrollY + 150;
var current = null;
for (var i = sections.length - 1; i >= 0; i--) {
if (sections[i].el.offsetTop <= scrollY) { current = sections[i]; break; }
}
tocItems.forEach(function(item) { item.classList.remove('active'); });
if (current) {
current.link.classList.add('active');
expandGroup(current.link.getAttribute('data-group') || current.link.getAttribute('data-parent') || '');
}
ticking = false;
});
});
window.dispatchEvent(new Event('scroll'));
})();
</script>
</body>
</html>