Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
145 lines
6.2 KiB
HTML
145 lines
6.2 KiB
HTML
{# 单个维度详细分析(在 for 循环内 include) #}
|
||
{# 需要外部传入: dim_name, dim_data, part_id #}
|
||
{% set dim_display = t.dim(dim_name) %}
|
||
{% set part_num = part_id | replace('part', '') %}
|
||
|
||
<div class="section" id="{{ part_id }}">
|
||
<h1>{{ t.part(part_id) }}</h1>
|
||
|
||
<h2>{{ t.dim_section_overall }}</h2>
|
||
|
||
<div class="score-cards">
|
||
<div class="score-card">
|
||
<div class="label">{{ t.dim_score_label.format(name=dim_display) }}</div>
|
||
<div class="value">{{ "%.1f"|format(dim_data.score) }}</div>
|
||
<div class="diff {{ 'positive' if dim_data.diff_district > 0 else 'negative' }}">
|
||
{{ "%+.1f"|format(dim_data.diff_district) }} {{ t.vs_district_avg }}
|
||
</div>
|
||
</div>
|
||
<div class="score-card">
|
||
<div class="label">{{ t.same_type_avg }}</div>
|
||
<div class="value" style="font-size:24px">{{ "%.1f"|format(dim_data.same_type_avg) }}</div>
|
||
</div>
|
||
<div class="score-card">
|
||
<div class="label">{{ t.rank_in_district }}</div>
|
||
<div class="value">{{ dim_data.rank_in_district }}/{{ overall.total_schools }}</div>
|
||
{% if overall.total_schools_in_city and dim_data.rank_in_city is defined %}
|
||
<div class="diff" style="color: var(--gray-500); font-size: 12px;">
|
||
{{ t.sd_city_rank_prefix }} {{ dim_data.rank_in_city }}/{{ overall.total_schools_in_city }}
|
||
</div>
|
||
{% endif %}
|
||
</div>
|
||
<div class="score-card">
|
||
<div class="label">{{ t.performance }}</div>
|
||
<div class="value" style="font-size:14px">
|
||
{# 基于实际数据判断表现标签,而非聚类标签 #}
|
||
{% set diff = dim_data.diff_district %}
|
||
{% set rank = dim_data.rank_in_district %}
|
||
{% set total = overall.total_schools %}
|
||
{% set rank_pct = rank / total if total else 1 %}
|
||
{% if diff > 3 and rank_pct <= 0.33 %}
|
||
<span class="type-badge good">{{ t.perf_good }}</span>
|
||
{% elif diff > 0 and rank_pct <= 0.5 %}
|
||
<span class="type-badge good">{{ t.perf_above }}</span>
|
||
{% elif diff >= -2 and rank_pct <= 0.67 %}
|
||
<span class="type-badge neutral">{{ t.perf_neutral }}</span>
|
||
{% elif diff < -3 or rank_pct > 0.8 %}
|
||
<span class="type-badge weak">{{ t.perf_weak }}</span>
|
||
{% else %}
|
||
<span class="type-badge neutral">{{ t.perf_below }}</span>
|
||
{% endif %}
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- 维度独立得分柱状图 + 子维度雷达/柱状图 -->
|
||
<div class="chart-row">
|
||
<div class="chart-box">
|
||
<div id="dim-score-{{ part_id }}" class="chart"></div>
|
||
<div class="chart-title">{{ t.dim_fig_score.format(n=part_num, name=dim_display) }}</div>
|
||
</div>
|
||
<div class="chart-box">
|
||
<div id="sub-radar-{{ part_id }}" class="chart"></div>
|
||
<div class="chart-title">{{ t.dim_fig_subradar.format(n=part_num, name=dim_display) }}</div>
|
||
</div>
|
||
</div>
|
||
<div class="chart-caption">
|
||
{{ llm_sections.get(part_id + '_caption_dim_score', '') | safe }}
|
||
</div>
|
||
|
||
<!-- 子维度柱状图 + 水平分布堆叠图 -->
|
||
<div class="chart-row">
|
||
<div class="chart-box">
|
||
<div id="chart-{{ part_id }}" class="chart"></div>
|
||
<div class="chart-title">{{ t.dim_fig_subbar.format(n=part_num, name=dim_display) }}</div>
|
||
</div>
|
||
<div class="chart-box">
|
||
<div id="level-{{ part_id }}" class="chart"></div>
|
||
<div class="chart-title">{{ t.dim_fig_levels.format(n=part_num, name=dim_display) }}</div>
|
||
</div>
|
||
</div>
|
||
<div class="chart-caption">
|
||
{{ llm_sections.get(part_id + '_caption_sub_detail', '') | safe }}
|
||
</div>
|
||
|
||
<!-- 聚类散点图(2D或3D) -->
|
||
<div class="chart-box">
|
||
<div id="scatter-{{ part_id }}" class="chart" style="height:450px"></div>
|
||
<div class="chart-title">{{ t.dim_fig_scatter.format(n=part_num, name=dim_display) }}</div>
|
||
</div>
|
||
<div class="chart-caption">
|
||
{{ llm_sections.get(part_id + '_caption_scatter', '') | safe }}
|
||
</div>
|
||
|
||
<!-- 维度整体LLM分析 -->
|
||
<div class="llm-analysis">
|
||
{{ llm_sections.get(part_id + '_overall', '<p>' + t.loading + '</p>') | safe }}
|
||
</div>
|
||
|
||
<!-- 水平对比表 -->
|
||
<h3>{{ t.dim_section_subdims.format(name=dim_display) }} ({{ t.tbl }} {{ part_num }}-1)</h3>
|
||
<table class="level-table">
|
||
<thead>
|
||
<tr>
|
||
<th>{{ t.sub_dimension }}</th>
|
||
<th>{{ school_display }}</th>
|
||
<th>{{ t.score }}</th>
|
||
<th>{{ t.district_avg }}</th>
|
||
<th>{{ t.rank_in_district }}</th>
|
||
{% if overall.total_schools_in_city %}<th>{{ t.rank_in_city }}</th>{% endif %}
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
{% for sub_dim in framework[dim_name].sub_dimensions %}
|
||
{% set sd = sub_dimensions.get(sub_dim, {}) %}
|
||
{% if sd %}
|
||
<tr>
|
||
<td>{{ t.sub(sub_dim) }}</td>
|
||
<td class="lv{{ sd.level }}">{{ t.level_label }} {{ sd.level }}</td>
|
||
<td>{{ "%.1f"|format(sd.score) }}</td>
|
||
<td>{{ "%.1f"|format(sd.district_avg) }}</td>
|
||
<td>{{ sd.rank_in_district }}/{{ overall.total_schools }}</td>
|
||
{% if overall.total_schools_in_city %}
|
||
<td>{{ sd.rank_in_city if sd.rank_in_city is defined else '-' }}/{{ overall.total_schools_in_city }}</td>
|
||
{% endif %}
|
||
</tr>
|
||
{% endif %}
|
||
{% endfor %}
|
||
</tbody>
|
||
</table>
|
||
|
||
<hr class="section-divider">
|
||
|
||
<!-- 各三级维度详细分析 -->
|
||
{% for sub_dim in framework[dim_name].sub_dimensions %}
|
||
{% set sd = sub_dimensions.get(sub_dim, {}) %}
|
||
{% if sd %}
|
||
{% set sub_index = loop.index %}
|
||
{% include 'sections/sub_dimension.html' %}
|
||
{% if not loop.last %}
|
||
<hr class="section-divider">
|
||
{% endif %}
|
||
{% endif %}
|
||
{% endfor %}
|
||
</div>
|