feat(reporting.py): 将 Plotly 图表转换为内嵌 HTML 并嵌入报告

mass_balance_report() 函数:
1. 图表→HTML 转换:
   - 原代码: 所有 plot_htmls 值为空字符串(图表禁用)
   - 修复: 新增 _fig_to_html() 辅助函数,通过 fig.to_html(full_html=False,
     include_plotlyjs=True) 将 5 个 Plotly Figure 对象分别转换为
     HTML div+script 片段,内嵌完整 Plotly.js 库(~3MB)
     对应映射: threed_fig→"3D", krig_fig→"krig",
              windrose_fig→"windrose", wind_fig→"wind",
              background_fig→"background"

2. CDN→内嵌: include_plotlyjs='cdn' 改为 include_plotlyjs=True,
   解决了离线打开 HTML 报告时 'Plotly is not defined' 的 JavaScript 错误,
   以及 file:// 协议下无法加载外部 CDN 资源的安全限制

影响范围:HTML 报告大小从 ~170KB 增至 ~15MB,支持完全离线查看,5 张交互式图表均可正常渲染
This commit is contained in:
DXC
2026-07-10 14:49:30 +08:00
parent 4ec46208dd
commit 616783fb52

View File

@ -27,13 +27,22 @@ def mass_balance_report(
"""Generate a mass balance report (plots disabled).""" """Generate a mass balance report (plots disabled)."""
template_path = Path(__file__).parent / "templates" / "mass_balance_template.html" template_path = Path(__file__).parent / "templates" / "mass_balance_template.html"
# Plots disabled -> use empty strings # Convert figures to HTML strings
def _fig_to_html(fig) -> str:
"""Safely convert a plotly figure to HTML string."""
if fig is None:
return ""
try:
return fig.to_html(full_html=False, include_plotlyjs=True)
except Exception:
return ""
plot_htmls = { plot_htmls = {
"3D": "", "3D": _fig_to_html(threed_fig),
"krig": "", "krig": _fig_to_html(krig_fig),
"windrose": "", "windrose": _fig_to_html(windrose_fig),
"wind": "", "wind": _fig_to_html(wind_fig),
"background": "", "background": _fig_to_html(background_fig),
} }
summary_data = { summary_data = {