diff --git a/offline-backend-20260512/backend/app/gateway/routers/_page_report_designer_seed.py b/offline-backend-20260512/backend/app/gateway/routers/_page_report_designer_seed.py
new file mode 100644
index 00000000..707c1938
--- /dev/null
+++ b/offline-backend-20260512/backend/app/gateway/routers/_page_report_designer_seed.py
@@ -0,0 +1,83 @@
+"""Seed the experimental ``页面研报设计师`` agent and reusable public skills.
+
+The runtime state directory (``.deer-flow``) and its ``skills/`` directory are
+not source controlled. The verified agent/skill assets therefore live next to
+this module and are copied only when a target is missing. Existing operations
+or admin changes are always preserved.
+"""
+
+from __future__ import annotations
+
+import logging
+import shutil
+from pathlib import Path
+
+from deerflow.config.paths import get_paths
+
+logger = logging.getLogger(__name__)
+
+PAGE_REPORT_DESIGNER_AGENT_ID = "page-report-designer"
+PAGE_REPORT_SKILL_NAMES: tuple[str, ...] = (
+ "page-report-generation",
+ "page-template-library",
+ "page-quality-review",
+)
+
+_ASSETS_DIR = Path(__file__).parent / "_page_report_designer_seed_assets"
+_AGENT_FILES: tuple[str, ...] = ("config.yaml", "SOUL.md")
+
+
+def _ensure_skills() -> None:
+ """Seed every public page-report skill that is absent from this deployment."""
+ try:
+ from deerflow.skills.storage import get_or_new_skill_storage
+
+ public_dir = Path(get_or_new_skill_storage().get_skills_root_path()) / "public"
+ public_dir.mkdir(parents=True, exist_ok=True)
+ for skill_name in PAGE_REPORT_SKILL_NAMES:
+ source = _ASSETS_DIR / "skills" / skill_name
+ target = public_dir / skill_name
+ if target.exists():
+ continue
+ if not (source / "SKILL.md").is_file():
+ logger.error("Missing seed asset for page-report skill '%s': %s", skill_name, source)
+ continue
+ shutil.copytree(source, target)
+ logger.info("Seeded public page-report skill '%s'", skill_name)
+ except Exception:
+ logger.exception("Failed to seed page-report public skills")
+
+
+def _ensure_agent() -> bool:
+ """Create the built-in agent directory once, without overwriting edits."""
+ try:
+ target = get_paths().agent_dir(PAGE_REPORT_DESIGNER_AGENT_ID)
+ if target.exists():
+ return False
+ source = _ASSETS_DIR / PAGE_REPORT_DESIGNER_AGENT_ID
+ if not source.is_dir():
+ logger.error("Missing seed assets for page-report agent: %s", source)
+ return False
+ target.mkdir(parents=True, exist_ok=True)
+ for filename in _AGENT_FILES:
+ asset = source / filename
+ if asset.is_file():
+ (target / filename).write_bytes(asset.read_bytes())
+ logger.info("Seeded built-in agent '%s'", PAGE_REPORT_DESIGNER_AGENT_ID)
+ return True
+ except Exception:
+ logger.exception("Failed to seed built-in page-report agent")
+ return False
+
+
+def ensure_page_report_designer_agent() -> bool:
+ """Seed the experimental agent and all of its public reusable skills."""
+ _ensure_skills()
+ return _ensure_agent()
+
+
+__all__ = [
+ "PAGE_REPORT_DESIGNER_AGENT_ID",
+ "PAGE_REPORT_SKILL_NAMES",
+ "ensure_page_report_designer_agent",
+]
diff --git a/offline-backend-20260512/backend/app/gateway/routers/_page_report_designer_seed_assets/page-report-designer/SOUL.md b/offline-backend-20260512/backend/app/gateway/routers/_page_report_designer_seed_assets/page-report-designer/SOUL.md
new file mode 100644
index 00000000..36c8d557
--- /dev/null
+++ b/offline-backend-20260512/backend/app/gateway/routers/_page_report_designer_seed_assets/page-report-designer/SOUL.md
@@ -0,0 +1,37 @@
+# 页面研报设计师
+
+你是「页面研报设计师」:把用户提供的数据、附件、当前会话产物和已生成的 Markdown 报告,组织成可交付的 HTML 汇报页面。你擅长深蓝和浅色大屏、文字型研判面板、表格、卡片、图表、甘特图与克制的动效。
+
+你只编辑当前会话的工作副本和 `outputs/` 产物,绝不修改模板源文件。
+
+## 先判断要不要画页面
+
+1. 用户只是提问、解释、讨论、审阅时,正常用文字回答,不生成页面。
+2. 用户明确要求 Markdown / 报告 / 方案文档,且没有要求页面或 HTML 时,正常产出 Markdown;不要强制画页面。
+3. 用户明确说“页面、HTML、大屏、看板、可视化、图表展示、把材料做成页面”时,生成页面。
+4. 对于有明确“创作/产出”意图但未指定格式的请求,默认生成页面;若语气更像普通问答,仍按问答处理。
+
+## 材料与检索边界
+
+- 先读取本轮用户材料、上传文件、会话中的 Markdown / JSON 产物;已有信息足够时直接制作,**不得自动检索**。
+- 信息不足以支撑结论、用户没有提供数据且未授权检索时,先简洁说明缺口,并询问:“是否允许我检索公开资料补充?”不要先调用 `web_search`。
+- 用户明确强调“即使没有数据也要图表”时,仍应正常绘制图表:使用用户已给的定性信息或合理示意数据,但必须在图例、口径或脚注标注“示意数据 / 待补充数据”。不得把示意数值说成真实事实。
+- 用户确认可以检索后,才使用 `web_search`;把来源、日期和不确定性写进相应文字面板或页脚。
+
+## 页面生成流程
+
+1. 将材料归为:事实数据、可推导结论、待补充项、图表数据、长文本、表格行、行动/风险项。优先保留用户原文的关键判断和数据口径。
+2. 读取 `page-template-library` 技能;调用 `page_report_template(action="prepare")`,传入当前界面提供的 `presentation_theme`(`dark` 或 `light`)。无该上下文时,按用户明示主题,否则默认浅色。
+3. 页面文字通常要多于图表:至少包含结论摘要、关键发现、事项/风险说明、数据口径或来源、行动建议中的多个展示样式。材料丰富时优先生成约 3 页;材料较少时删减模板页和无数据卡片,不留空面板。
+4. 复制后的工作副本是骨架。保留已有图表渲染、动效和导航逻辑;用真实数据替换 `reportData` 和相关文本。若模板存在 5 页,可保留其中最贴合的 3 页而不是机械展示全部。
+5. 所有可见正文、表头、标签、说明文字最小字号均为 16px;长文本面板要增高、提高行高,不能把段落挤成一团。
+6. 最终 HTML 写入 `/mnt/user-data/outputs/`。调用 `page_report_template(action="validate")`;若返回错误,先修复再交付。通过后调用 `present_files` 展示 HTML 和必要的质量报告。
+
+## 设计要求
+
+- 跟随 `presentation_theme`:`dark` 选深蓝骨架,`light` 选浅色骨架;不要把产品现有聊天页面风格照搬进汇报页面。
+- 深色使用深蓝科技感,选中状态可有细腻的扫描光、描边或流光;浅色使用清晰留白与高对比文字。
+- 动效服务于阅读:数字滚动、图表入场、进度条、轻量背景粒子即可;支持 `prefers-reduced-motion`,不使用刺眼或持续大幅运动。
+- 图表必须与材料一致。数据不够时宁可删掉图表或明确标为示意,不伪造事实;避免为了“丰富”而堆满图。
+- 文字展示不能只是一种卡片。灵活组合:摘要带、洞察卡、左右对照、时间线、风险清单、引用/口径块、行动闭环、说明段、表格、问答式要点、负责人/截止日清单。
+- 每页都要有明确标题、数据时间/口径、可读的结论。HTML 必须自包含,不依赖第三方 CDN。
diff --git a/offline-backend-20260512/backend/app/gateway/routers/_page_report_designer_seed_assets/page-report-designer/config.yaml b/offline-backend-20260512/backend/app/gateway/routers/_page_report_designer_seed_assets/page-report-designer/config.yaml
new file mode 100644
index 00000000..120ef28d
--- /dev/null
+++ b/offline-backend-20260512/backend/app/gateway/routers/_page_report_designer_seed_assets/page-report-designer/config.yaml
@@ -0,0 +1,18 @@
+id: page-report-designer
+name: 页面研报设计师
+description: 实验性页面研报智能体:根据用户材料、上下文产物和主题色,选择可复用 HTML 骨架,生成文字与图表详略得当的高质量汇报页面
+tool_groups:
+ - web
+ - file:read
+ - file:write
+ - bash
+ - page:report
+skills:
+ - page-report-generation
+ - page-template-library
+ - page-quality-review
+common_questions:
+ - title: 根据材料生成汇报页面
+ prompt: 请根据我提供的材料,生成一套文字为主、图表详略得当的 HTML 汇报页面;沿用当前界面主题色。
+ - title: 将报告转为多页面大屏
+ prompt: 请读取当前会话中的 Markdown 报告和附件,生成 3 页左右的 HTML 大屏汇报,并保留关键结论、表格和图表。
diff --git a/offline-backend-20260512/backend/packages/harness/deerflow/page_reports/__init__.py b/offline-backend-20260512/backend/packages/harness/deerflow/page_reports/__init__.py
new file mode 100644
index 00000000..cfa44713
--- /dev/null
+++ b/offline-backend-20260512/backend/packages/harness/deerflow/page_reports/__init__.py
@@ -0,0 +1,19 @@
+"""Reusable report-page template selection and quality helpers.
+
+The package deliberately lives in the harness layer: it knows only about
+template files and the current thread sandbox, never Gateway/application code.
+"""
+
+from .templates import (
+ PageTemplateProfile,
+ choose_template,
+ list_template_profiles,
+ resolve_template_file,
+)
+
+__all__ = [
+ "PageTemplateProfile",
+ "choose_template",
+ "list_template_profiles",
+ "resolve_template_file",
+]
diff --git a/offline-backend-20260512/backend/packages/harness/deerflow/page_reports/assets/report-screen-dark-charts-portal-template.html b/offline-backend-20260512/backend/packages/harness/deerflow/page_reports/assets/report-screen-dark-charts-portal-template.html
new file mode 100644
index 00000000..c4623054
--- /dev/null
+++ b/offline-backend-20260512/backend/packages/harness/deerflow/page_reports/assets/report-screen-dark-charts-portal-template.html
@@ -0,0 +1,1475 @@
+
+
+
+
+
+ 深蓝科技风 · 图表增强导航式汇报模版
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
任务处置趋势
+
处置完成量新增任务量
+
近 12 个月 · 单位:件
+
+
+
+
+
区域活跃度排行
TOP 6 · 单位:件
+
+
+
+
+
+
+
+
态势简报
本期综述
+
整体运行保持「增长有支撑、风险可前置、协同待加强」的特征,核心任务全部按时闭环,为四季度收口打下坚实基础。
+
任务总量保持稳定扩张,华东与华北区域形成明显拉动效应,新增业务主要来自高价值场景。随着重点项目进入成果验收期,跨部门协同请求较上一阶段有所增加,但绝大多数事项仍在既定时效内完成闭环,未出现重大延期或质量回退。
+
当前需要特别关注资源分配的均衡性:部分区域在高峰时段的待办积压接近预警线。建议以「责任到人、日清日结」的方式完成临期事项处置,并在周例会上对异常波动进行复盘。
+
增长有支撑风险可前置协同待加强口径已核验
+
+
+
实时动态
自动滚动 · 悬停暂停
+
+
列表自动向上无限滚动,鼠标悬停可暂停阅读
+
+
+
+
+
+
+
+
+
+
+
+
投入产出分布
+
常规事项重点项目创新事项
+
气泡大小:影响度
+
+
+ 价值贡献 ↑投入强度 →
+
+
+
+
+
+
+
✓成效与亮点STRENGTHS
+
核心任务全部按时闭环本阶段无重大延期事项,交付质量稳中有升。
+
跨区域协同效率提升平均响应时长缩短,协同请求大多在时效内完成。
+
风险预警机制见效预警前置后临期事项明显减少,处置节奏更从容。
+
数据治理口径统一期末核验完成,跨阶段对比与追溯具备数据基础。
+
+
+
!问题与挑战CHALLENGES
+
资源分配仍不均衡部分区域高峰时段待办积压接近预警线。
+
跨部门等待时长偏高少数事项在流转环节停留过久,责任边界待明确。
+
两项专项资源临界四季度交付与验收并行,关键岗位依赖度上升。
+
经验沉淀不够系统领先做法尚未形成标准流程,复制速度受限。
+
+
+
+
+
01结构性增长明显核心区域增速领先,新增贡献集中于高价值场景,增长来源清晰可持续。
+
+
+
02协同机制成效显现平均响应时长明显缩短,领先打法已具备向其他区域复制的条件。
+
+
+
03风险处置持续前置预警前置后大部分临期事项提前进入处置流程,风险总体可控。
+
+
+
+
+
+
+
+
+
+
重点任务推进计划
2026 年 04 — 09 月 · 点击行看详情
+
+
+
+
+
+
+
周度任务节奏
+
周闭环量周新增量
+
近 12 周 · 单位:件
+
+
+
+
+
+
+
推进说明
本期口径
+
六项重点任务中,两项已提前完成并转入常态运行;三项按计划推进,节点偏差均在 5% 以内;一项因试点适配差异需要额外磨合期,已列入重点关注。
+
甘特条上的流光表示任务处于活跃推进状态;竖线为当前时间指示,便于直观判断各任务的剩余窗口。
+
+
+
+
下阶段重点
Q4 安排
+
+
一锁定临界资源本周内完成两项临界专项的补充排期与责任人确认。
+
二复制领先经验华东协同打法向华南、西南推广,季度内完成首轮验证。
+
三固化复盘机制以周为周期刷新里程碑,偏差超 5% 启动专项复盘。
+
+
+
+
+
+
关键里程碑
08 — 09 月节点 · 进度线自动填充
+
+
+
08.15资源调度机制启动动态支援名单上线,高峰积压初步缓解。
+
08.21预警规则优化上线窗口 24h 前置至 48h,临期事项明显减少。
+
08.28重点项目验收准备阶段交付完成,成果校验与归档推进中。
+
09.01月度数据完成更新完整度 97.8%,统一口径已锁定。
+
09.15四季度资源预置资源锁定与经验复制双线并行推进。
+
+
+
+
+
+
+
+
+
月度处置对比
单位:件 · 绿色为峰值
+
+
+
+
+
+
+
+
重点事项清单
点击行查看详情
+
+ | 事项 | 归属 | 优先级 | 状态 | 更新 |
+
+ | 区域协同专项(二轮)机制标准化推广 | 运营管理组 | 高 | 需关注 | |
+ | 重点事项闭环治理清单化 · 日清日结 | 综合协调组 | 高 | 进行中 | |
+ | 数据质量提升行动口径统一 · 期末核验 | 数据管理组 | 中 | 进行中 | |
+ | 阶段成果验收准备材料预审 · 资源协调 | 项目统筹组 | 高 | 进行中 | |
+ | 临期预警规则优化24h → 48h 前置 | 运营管理组 | 中 | 已完成 | |
+ | 专项资源调度机制动态支援名单 | 综合协调组 | 高 | 已完成 | |
+
+
+
+
+
明细口径说明
阅读指引
+
月度柱状图统计近 12 个月的处置完成量,峰值月以绿色高亮;处置记录按时间倒序自动滚动,覆盖五类事项闭环情况。所有明细均可追溯至运行台账,口径与总览页一致。
+
点击清单任意行可查看事项详情与阶段完成度;若需按状态或区域过滤,可在台账系统按相同口径导出。
+
+
+
+
+
+
+
+
CONCLUSION · 管理层研判
+
以「机制固化 + 资源前置」保障年度目标如期收口
+
本报告基于统一核验口径的数据与事实,归纳本阶段运行特征,并给出四季度的工作重心与责任安排。汇报结构为:核心结论、行动建议与跟踪安排三部分。
+
+
核心业务贡献保持稳定,重点板块实际达成进度整体领先于计划。华东、华北区域形成双轮驱动,区域协同机制逐步沉淀为可复用的标准方法。新增贡献主要来自高价值场景,增长来源清晰、可持续性较强。
+
随着年度重点项目进入验收与交付并行阶段,资源调配复杂度上升。建议提前锁定关键岗位与外部协作资源,对偏差超过阈值的事项建立周度复盘机制,确保四季度各项收口动作按计划推进。
+
+
“汇报不只是展示数据,更要明确数据说明了什么、下一步由谁在什么时间完成什么动作。”
+
+
+
+
核心结论
三条判断
+
一运行态势稳中向好核心指标处于健康区间,增长有支撑、结构在优化,具备四季度收口的坚实基础。
+
二机制价值已经验证预警前置、协同调度等机制经受检验,应固化为标准流程并扩大适用范围。
+
三风险收敛但需跟踪风险总量下降趋势明确,临界资源与跨部门流转仍是需要持续关注的重点。
+
+
+
+
↗增长机会 · 区域经验复制
+
将华东区域的协同打法沉淀为标准化流程,优先覆盖高频业务场景,向华南、西南推广并季度内完成首轮验证。
+
建议责任:运营管理组完成期限:09.15
+
+
+
!重点关注 · 临界资源调度
+
两项专项工作进入资源临界区,应在本周内完成负责人确认和备选排期;对延期风险超过阈值的事项启动日级跟踪。
+
建议责任:项目统筹组完成期限:本周内
+
+
+
+
+
判断 — 依据 — 行动矩阵
结构化对照
+
+
核心判断
事实依据
建议行动
+
增长质量向好
累计完成量、重点项目交付与区域活跃度均保持增长,新增业务主要来自高价值场景。
沉淀领先区域协同流程,在华南、西南先行试点复制。
+
收口压力上升
验收准备、资源协调与成果归档进入并行阶段,少数事项临近时间窗口。
建立专项清单,明确日级负责人与周例会偏差复盘规则。
+
风险总体可控
高优先级事项连续两期下降,预警前置后大部分临期事项已在时限内闭环。
维持 48 小时临期预警,跨区域事项保留人工兜底通道。
+
+
+
+
+
+
+
+
+
使用说明
模板指引
+
+
这是图表增强的导航式多页面汇报模板:六个页面含折线、饼图、雷达、散点、甘特、柱状六种图表,图表占比控制在一半以下,其余为文字版式。
+
+ - 改文案:页面文字直接在 HTML 中修改。
+ - 改图表:只改页面底部脚本里的 reportData 对象(含中文注释)。
+ - 性能:持续动画仅用 transform/opacity,切页自动停;弱设备可放心使用。
+
+
+
+
+
+
+
+
+
+
+ 操作成功(演示)
+
+
+
+
diff --git a/offline-backend-20260512/backend/packages/harness/deerflow/page_reports/assets/report-screen-dark-neon-portal-template.html b/offline-backend-20260512/backend/packages/harness/deerflow/page_reports/assets/report-screen-dark-neon-portal-template.html
new file mode 100644
index 00000000..2676662a
--- /dev/null
+++ b/offline-backend-20260512/backend/packages/harness/deerflow/page_reports/assets/report-screen-dark-neon-portal-template.html
@@ -0,0 +1,1053 @@
+
+
+
+
+
+ 深蓝科技风 · 导航式多页面汇报模版
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
态势简报
本期综述
+
整体运行保持「增长有支撑、风险可前置、协同待加强」的特征,核心任务全部按时闭环,为四季度收口打下坚实基础。
+
任务总量保持稳定扩张,华东与华北区域形成明显拉动效应,新增业务主要来自高价值场景。随着重点项目进入成果验收期,跨部门协同请求较上一阶段有所增加,但绝大多数事项仍在既定时效内完成闭环,未出现重大延期或质量回退。
+
当前需要特别关注资源分配的均衡性:部分区域在高峰时段的待办积压接近预警线。建议以「责任到人、日清日结」的方式完成临期事项处置,并在周例会上对异常波动进行复盘。
+
+
+
预警动态
点击查看详情
+
+
跨区域协同事项临近时限华北 · 协同处置
›
+
+
+
重点任务处理量短时波动华东 · 数据研判
›
+
+
+
待分派事项超过预设阈值西南 · 任务分派
›
+
+
+
两项指标进入观察区间综合 · 运行质量
›
+
+
+
夜间巡检任务已按时闭环华南 · 巡查监测
›
+
+
+
+
+
+
+
区域协同专项
+
跨区域协同机制进入第二轮验证,平均响应时长已缩短,正在沉淀标准流程。
+
阶段完成度78%
+
+
+
+
+
重点事项闭环治理
+
对临期、高频、跨部门三类事项建立清单化治理,实行日清日结跟踪。
+
阶段完成度65%
+
+
+
+
+
数据质量提升行动
+
统一统计口径与期末核验机制,保障跨阶段数据可对比、可追溯。
+
阶段完成度52%
+
+
+
+
+
+
+
+
+
+
本阶段研判基于统一核验口径的事实数据,从增长、协同、风险、数据治理四个维度归纳关键发现,并给出对应的行动建议。
+
+
+
+
01
+
结构性增长更加明显核心区域业务量增长高于整体平均水平,新增贡献集中在高价值场景,增长来源清晰、可持续。
›
+
+
+
02
+
协同机制成效显现跨区域协同请求平均响应时长明显缩短,领先打法已具备复制条件。
›
+
+
+
03
+
风险处置持续前置预警窗口前置至 48 小时后,大部分临期事项提前进入处置流程,风险总体可控。
›
+
+
+
04
+
数据口径保持统一全部统计完成期末核验,与上期口径一致,支持跨阶段对比与追溯。
›
+
+
+
+
+
✓成效与亮点STRENGTHS
+
核心任务全部按时闭环本阶段无重大延期事项,交付质量稳中有升。
+
跨区域协同效率提升平均响应时长缩短,协同请求大多在时效内完成。
+
风险预警机制见效预警前置后临期事项明显减少,处置节奏更从容。
+
+
+
!问题与挑战CHALLENGES
+
资源分配仍不均衡部分区域高峰时段待办积压接近预警线。
+
跨部门等待时长偏高少数事项在流转环节停留过久,责任边界待明确。
+
经验沉淀不够系统领先做法尚未形成标准流程,复制速度受限。
+
+
+
+
析
+
综合研判:成效源于机制而非偶然,挑战集中在资源与流程两端。建议以「机制固化 + 资源前置」为主线安排四季度工作,把已验证的做法沉淀为标准流程,同时对临界资源提前排期。
+
+
+
+
+
+
+
+
+
+
+ 共 8 条
+
+
+
+ | 任务事项 | 归属 | 优先级 | 状态 | 更新时间 | 操作 |
+
+ | 区域协同专项(第二轮验证)协同机制标准化推广 | 运营管理组 | 高 | 需关注 | | |
+ | 重点事项闭环治理清单化 · 日清日结 | 综合协调组 | 高 | 进行中 | | |
+ | 数据质量提升行动口径统一 · 期末核验 | 数据管理组 | 中 | 进行中 | | |
+ | 阶段成果验收准备材料预审 · 资源协调 | 项目统筹组 | 高 | 需关注 | | |
+ | 四季度资源预置岗位锁定 · 协作预置 | 人力协调组 | 中 | 进行中 | | |
+ | 临期预警规则优化24h → 48h 前置 | 运营管理组 | 中 | 已完成 | | |
+ | 专项资源调度机制动态支援名单 | 综合协调组 | 高 | 已完成 | | |
+ | 风险事项专项排查全量排查 · 台账建立 | 风控管理组 | 中 | 已完成 | | |
+
+
+
+
+
+
+
+
+
+
+
关键里程碑
点击节点查看详情
+
+
+
08.15已完成
专项资源调度机制启动建立动态支援名单,高峰积压问题初步缓解。
+
+
+
08.21已完成
临期预警规则优化上线预警窗口 24h 前置至 48h,临期事项明显减少。
+
+
+
08.28已完成
重点项目进入验收准备阶段交付完成,成果校验与归档推进中。
+
+
+
09.01进行中
月度态势数据完成更新完整度 97.8%,统一口径已锁定。
+
+
+
09.15计划中
四季度资源预置与经验复制资源锁定 + 经验复制双线并行推进。
+
+
+
+
+
+
阶段完成度
截至 09.01
+
协同专项78%
+
闭环治理65%
+
数据质量行动52%
+
验收准备38%
+
+
+
下阶段重点
Q4 安排
+
+
一锁定临界资源本周内完成两项临界专项的补充排期与责任人确认。
+
二复制领先经验华东协同打法向华南、西南推广,季度内完成首轮验证。
+
三固化复盘机制以周为周期刷新里程碑,偏差超 5% 启动专项复盘。
+
+
+
+
+
+
+
+
+
+
CONCLUSION · 管理层研判
+
以「机制固化 + 资源前置」保障年度目标如期收口
+
本报告基于统一核验口径的数据与事实,归纳本阶段运行特征,并给出四季度的工作重心与责任安排。汇报结构为:核心结论、行动建议与跟踪安排三部分。
+
+
核心业务贡献保持稳定,重点板块实际达成进度整体领先于计划。华东、华南区域形成双轮驱动,区域协同机制逐步沉淀为可复用的标准方法。新增贡献主要来自高价值场景,增长来源清晰、可持续性较强。
+
随着年度重点项目进入验收与交付并行阶段,资源调配复杂度上升。建议提前锁定关键岗位与外部协作资源,对偏差超过阈值的事项建立周度复盘机制,确保四季度各项收口动作按计划推进,避免风险在期末集中暴露。
+
+
“汇报不只是展示数据,更要明确数据说明了什么、下一步由谁在什么时间完成什么动作。”
+
+
+
+
核心结论
三条判断
+
一运行态势稳中向好核心指标处于健康区间,增长有支撑、结构在优化,具备四季度收口的坚实基础。
+
二机制价值已经验证预警前置、协同调度等机制经受检验,应固化为标准流程并扩大适用范围。
+
三风险收敛但需跟踪风险总量下降趋势明确,临界资源与跨部门流转仍是需要持续关注的重点。
+
+
+
+
↗增长机会 · 区域经验复制
+
将华东区域的协同打法沉淀为标准化流程,优先覆盖高频业务场景,向华南、西南推广并季度内完成首轮验证,预计可贡献新增规模 0.32 亿元。
+
建议责任:运营管理组完成期限:09.15
+
+
+
+
!重点关注 · 临界资源调度
+
两项专项工作进入资源临界区,应在本周内完成负责人确认和备选排期;对延期风险超过阈值的事项启动日级跟踪。
+
建议责任:项目统筹组完成期限:本周内
+
+
+
+
+
+
+
+
+
+
+
使用说明
模板指引
+
+
这是一个带导航栏的多页面汇报模板:顶部导航切换五个页面,底部状态栏滚动播报动态,页面内容支持滚动浏览。
+
+ - 改文案:导航名称与页面文字直接在 HTML 中修改。
+ - 改弹窗:表格 / 预警 / 时间线的详情写在所在元素的 data-desc 属性里;固定弹窗直接改对应 modal 区块。
+ - 加页面:复制一个 section.view 区块,并在导航里加一个按钮(data-view 名称对应)。
+ - 不要改CSS 类名与结构,切换、弹窗、动画会自动生效。
+
+
+
+
+
+
+
+
+
+
本期任务总量 · 口径说明
统计口径
+
+
+
统计范围内所有进入正式流转的任务事项,含研判、协同、巡查、督办、复核五类;不含测试数据与已作废记录。本期共 12,860 件,较上期增长 14.8%,主要增量来自华东区域的高价值场景。
+
+
+
+
+
+
+
按时处置率 · 口径说明
统计口径
+
+
+
本期按时处置率 96.4%,连续三期高于目标值。未按时闭环的 462 件中,约六成为跨部门会签类事项,已在「重点事项闭环治理」专项中跟进。
+
+
+
+
+
+
+
高优先级事项 · 口径说明
统计口径
+
+
+
本期期末存量 328 件,较上期下降 8.6%,低于预警阈值。预警窗口由 24 小时前置至 48 小时后,临期高优先级事项的占比也同步下降,说明风险处置节奏更加从容。
+
+
+
+
+
+
+
综合运行指数 · 口径说明
统计口径
+
+
+
综合运行指数由四个子维度加权计算,本期 87.6 分,处于健康区间。子项中数据完整度得分最高(97.8),协同效率(88.5)仍有提升空间,是四季度机制固化的重点方向。
+
+
+
+
+
+
+
+
+
发现 01 · 结构性增长更加明显
研判详情
+
+
本阶段增长并非来自投入的简单放大,而是结构改善带来的自然结果:核心区域业务量增速高于整体平均水平 6 个百分点以上,新增贡献集中在高价值场景,单位处理成本同步下降。
+
支撑事实:
+
- 华东、华北两区域贡献了 56% 的新增处置量。
- 高价值场景的任务占比由 31% 提升至 38%。
- 平均流转时长缩短 11%,跨区域请求响应更快。
+
建议:将增长来源拆解为可复制要素,在华南、西南先行试点,验证结构改善的可迁移性。
+
+
+
+
+
+
+
发现 02 · 协同机制成效显现
研判详情
+
+
跨区域协同请求的平均响应时长由 26 小时缩短至 17 小时,协同类事项的按时完成率提升至 93%。机制层面的「支援名单 + 动态调度」组合已被验证有效。
+
支撑事实:
+
- 高峰时段的积压问题在支援名单启用后 48 小时内缓解。
- 协同请求二次退回率由 12% 降至 7%。
- 领先区域已输出标准流程初稿,具备复制条件。
+
建议:尽快完成流程手册定稿,并将协同机制纳入新区域的开局配置。
+
+
+
+
+
+
+
发现 03 · 风险处置持续前置
研判详情
+
+
预警窗口由 24 小时前置至 48 小时后,大部分临期事项在触发预警前即进入处置流程,高优先级事项存量连续两期下降,被动救火类加班明显减少。
+
支撑事实:
+
- 临期事项中「预警后处置」占比由 63% 降至 34%。
- 高优先级事项存量由 359 件降至 328 件。
- 未发生一起因时限遗漏导致的责任事件。
+
建议:维持 48 小时预警规则,同时对跨区域事项保留人工兜底通道,避免规则化带来的边界遗漏。
+
+
+
+
+
+
+
发现 04 · 数据口径保持统一
研判详情
+
+
本阶段所有统计均完成期末核验,与上期口径完全一致,跨阶段对比与追溯具备可靠的数据基础,管理结论不因口径漂移而失真。
+
支撑事实:
+
- 数据完整度 97.8%,关键字段零缺失。
- 期末核验发现的两处口径疑点已当场修正。
- 追溯机制覆盖近四个统计周期,支持回溯复核。
+
建议:将期末核验固化为制度动作,并在四季度完成历史数据回填,实现全周期可比。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
生成汇报材料
材料导出
+
+
将按当前口径汇总本页结论、行动建议与任务明细,生成一份可直接用于会议的汇报材料。生成过程约需数秒,完成后可在通知中心查看。
+
+ - 包含:核心结论三条、行动建议两项、任务明细八条。
+ - 口径:期末核验版数据(09.01 更新)。
+ - 格式:页面版(可打印为 PDF)。
+
+
+
+
+
+
+
+
+
+ 操作成功(演示)
+
+
+
+
+
diff --git a/offline-backend-20260512/backend/packages/harness/deerflow/page_reports/assets/report-screen-dark-neon-template.html b/offline-backend-20260512/backend/packages/harness/deerflow/page_reports/assets/report-screen-dark-neon-template.html
new file mode 100644
index 00000000..4df2da78
--- /dev/null
+++ b/offline-backend-20260512/backend/packages/harness/deerflow/page_reports/assets/report-screen-dark-neon-template.html
@@ -0,0 +1,824 @@
+
+
+
+
+
+ 深蓝科技风 · 大屏汇报模版(炫光精简版)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 核心运行指标
实时
+
+
+
+ 区域活跃度排行
TOP 5
+
+
+
+ 运行健康度
实时评估
+
+
+
+
0健康指数
+
+
+
+
+
+
+
+
+
+ 任务处置趋势
近 12 个月 · 单位:件
+
+
+
+
+ 实时态势雷达
信号自动跟踪
+
+
+
+
+
+
0路活动信号
+
+
+
+
+
+ 任务类型构成
本期占比
+
+
+
+
+
+
+
+
+ 实时预警滚动
最近更新
+
+
+
+ 月度处置对比
单位:件
+
+
+
+ 重点任务进度
本期跟踪
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/offline-backend-20260512/backend/packages/harness/deerflow/page_reports/assets/report-screen-dark-template.html b/offline-backend-20260512/backend/packages/harness/deerflow/page_reports/assets/report-screen-dark-template.html
new file mode 100644
index 00000000..01ea03d8
--- /dev/null
+++ b/offline-backend-20260512/backend/packages/harness/deerflow/page_reports/assets/report-screen-dark-template.html
@@ -0,0 +1,1337 @@
+
+
+
+
+
+ 深蓝科技风 · 数据驾驶舱大屏
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 本月处理总量
+ 0
+
+ ↑ 14.8%
+ 较上月
+
+
+
+
+
+
+ 按时处置率
+ 0%
+
+ ↑ 2.1%
+ 较上月
+
+
+
+
+
+
+ 高优先级事项
+ 0
+
+ ↓ 8.6%
+ 较上月
+
+
+
+
+
+
+ 综合健康指数
+ 0
+
+ 良好
+ 健康区间
+
+
+
+
+
+
+
+
+
+
+
任务处置趋势
+ 近12月
+
+
+
+
+
+ 完成量
+ 新增量
+
+
+
+
+
+
+
业务类型分布
+ 结构分析
+
+
+
+
+
研判分析45%
+
协同处置30%
+
巡查监管20%
+
其他事项5%
+
+
+
+
+
+
+
+
+
+
+
能力雷达评估
+ 五维分析
+
+
+
+
+
+
+
+
+
+
+
区域活跃度排行
+ TOP 5
+
+
+
+
+
+
+
+
实时预警信息
+ 3 条
+
+
+
+
+
+
跨区域协同事项临近时限
+
华北区域 · 协同处置
+
+
10:18
+
+
+
+
+
+
+
重点任务处理量波动
+
华东区域 · 数据研判
+
+
10:05
+
+
+
+
+
+
+
待分派事项超过阈值
+
西南区域 · 任务分派
+
+
09:42
+
+
+
+
+
+
+
+
+
+
+
关键进展时间线
+ 最新动态
+
+
+
+
09.01 · 09:30
+
月度态势数据完成更新
+
数据完整度达 97.8%,报告已同步
+
+
+
08.28 · 16:40
+
重点项目进入验收准备
+
区域协同专项完成阶段交付
+
+
+
08.21 · 11:20
+
临期预警规则优化
+
预警触发窗口由24h提前至48h
+
+
+
08.15 · 14:00
+
专项资源调度启动
+
建立动态支援名单监测流转效率
+
+
+
+
+
+
+
+
运行健康度
+ 实时
+
+
+
+
+
+
+
+
投入产出分布
+ 价值分析
+
+
+
+
+
+
+
+
+ 低价值
+ 高价值
+ 高投入
+
+
+
+
+
+
+
+
+
+
+
diff --git a/offline-backend-20260512/backend/packages/harness/deerflow/page_reports/assets/report-screen-light-airy-portal-template.html b/offline-backend-20260512/backend/packages/harness/deerflow/page_reports/assets/report-screen-light-airy-portal-template.html
new file mode 100644
index 00000000..ac98e458
--- /dev/null
+++ b/offline-backend-20260512/backend/packages/harness/deerflow/page_reports/assets/report-screen-light-airy-portal-template.html
@@ -0,0 +1,1029 @@
+
+
+
+
+
+ 浅色轻盈风 · 导航式多页面汇报模版
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
累计业务规模口径说明 ↗
+
¥ 0亿
+
+
+
+
+
+
+
+
+
经营简报
本期综述
+
经营呈现「规模稳步增长、结构持续优化、风险总体可控」的积极态势,年度目标达成进度符合预期,为四季度收口留出充分空间。
+
核心业务贡献保持稳定,重点板块实际达成进度整体领先于计划。华东、华南区域形成双轮驱动,区域协同机制逐步沉淀为可复用的标准方法。新增贡献主要来自高价值场景,增长来源清晰、可持续性较强。
+
随着年度重点项目进入验收与交付并行阶段,资源调配复杂度上升。建议提前锁定关键岗位与外部协作资源,对偏差超过阈值的事项建立周度复盘机制,确保四季度收口动作按计划推进。
+
+
+
风险与提示
点击查看详情
+
+
两项专项进入资源临界区项目统筹 · 资源协调
›
+
+
+
区域间运营差距扩大区域经营 · 梯队建设
›
+
+
+
经验沉淀进度滞后运营管理 · 流程建设
›
+
+
+
两项指标进入观察区间综合 · 经营质量
›
+
+
+
月度经营数据完成校验综合 · 数据管理
›
+
+
+
+
+
+
+
区域经验复制专项
+
将华东协同打法沉淀为标准流程,向华南、西南推广并完成首轮验证。
+
阶段完成度72%
+
+
+
+
+
重点项目收口
+
统筹交付、验收与归档三线并行,锁定关键岗位与外部协作资源。
+
阶段完成度58%
+
+
+
+
+
经营复盘机制建设
+
建立以周为周期的里程碑刷新与偏差复盘,固化跟踪动作。
+
阶段完成度44%
+
+
+
+
+
+
+
+
+
+
本阶段研判基于财务与业务双重校验的事实数据,从增长、结构、项目、风险四个维度归纳关键发现,并给出对应的行动建议。
+
+
+
+
01
+
业务结构进一步优化高价值场景占比持续提升,收入质量改善为后续增长提供更稳固基础。
›
+
+
+
02
+
区域增长梯队分化领先区域已形成可复制经验,但各区域运营差距仍需标准化方法缩小。
›
+
+
+
03
+
项目收口进入关键窗口交付、验收与资源协调并行推进,里程碑偏差整体可控。
›
+
+
+
04
+
风险治理成效显现风险事项数量较年初明显下降,预警机制帮助多数临期事项提前处置。
›
+
+
+
+
+
✓成效与亮点STRENGTHS
+
达成进度符合预期年度累计达成率 86.8%,较去年同期提高 6.2 个百分点。
+
重点项目交付领先阶段完成率 94.1%,多数项目快于计划节奏推进。
+
区域协同机制成型领先区域打法开始沉淀,具备复制推广条件。
+
+
+
!问题与挑战CHALLENGES
+
区域间差距待缩小梯队分化明显,后发区域能力建设需要体系化投入。
+
两项项目资源临界关键岗位依赖度高,四季度并行压力上升。
+
复盘机制尚未闭环偏差复盘以事后为主,缺少周期化、制度化安排。
+
+
+
+
析
+
综合研判:本期成效更多来自机制与结构性改善,而非短期投入。建议围绕「复制增长经验、前置收口资源、固化复盘机制」三条主线安排四季度工作,把已验证的做法转化为可持续的经营能力。
+
+
+
+
+
+
+
+
+
+
+ 共 8 条
+
+
+
+ | 任务事项 | 归属 | 优先级 | 状态 | 更新时间 | 操作 |
+
+ | 区域经验复制专项流程沉淀 · 试点推广 | 区域经营组 | 高 | 进行中 | | |
+ | 重点项目收口交付 · 验收 · 归档并行 | 项目统筹组 | 高 | 需关注 | | |
+ | 经营复盘机制建设周度刷新 · 偏差复盘 | 经营管理组 | 中 | 进行中 | | |
+ | 四季度资源预置岗位锁定 · 协作预置 | 人力协调组 | 中 | 进行中 | | |
+ | 经验手册定稿标准流程输出 | 区域经营组 | 中 | 需关注 | | |
+ | 重点客户项目阶段验收成果达标 · 材料归档 | 项目统筹组 | 高 | 已完成 | | |
+ | 区域经营复盘启动经验提炼 · 素材归集 | 经营管理组 | 中 | 已完成 | | |
+ | 风险事项专项排查全量排查 · 台账建立 | 风控管理组 | 中 | 已完成 | | |
+
+
+
+
+
+
+
+
+
+
+
关键里程碑
点击节点查看详情
+
+
+
08.08已完成
风险事项专项排查完成识别两项临界风险,台账转入周更。
+
+
+
08.18已完成
区域经营复盘机制启动经验提炼完成,复盘升级为周度。
+
+
+
08.27已完成
重点客户项目完成阶段验收成果达标,进入交付准备。
+
+
+
09.01进行中
经营数据完成期末更新双重校验完成,统一口径锁定。
+
+
+
09.15计划中
四季度资源预置与经验复制资源锁定 + 经验复制双线并行。
+
+
+
+
+
+
阶段完成度
截至 09.01
+
经验复制专项72%
+
重点项目收口58%
+
复盘机制建设44%
+
四季度资源预置35%
+
+
+
下阶段重点
Q4 安排
+
+
一复制增长经验华东协同打法向华南、西南推广,季度内完成首轮验证。
+
二前置收口资源本周完成临界项目的补充排期与责任人确认。
+
三固化复盘机制周度里程碑刷新,偏差超 5% 启动专项复盘。
+
+
+
+
+
+
+
+
+
+
CONCLUSION · 管理层研判
+
以「复制增长经验 + 前置收口资源」保障年度目标达成
+
本报告基于财务与业务双重校验的数据与事实,归纳本阶段经营特征,并给出四季度的工作重心与责任安排。汇报结构为:核心结论、行动建议与跟踪安排三部分。
+
+
核心业务贡献保持稳定,重点板块实际达成进度整体领先于计划。华东、华南区域形成双轮驱动,区域协同机制逐步沉淀为可复用的标准方法。新增贡献主要来自高价值场景,增长来源清晰、可持续性较强。
+
随着年度重点项目进入验收与交付并行阶段,资源调配复杂度上升。建议提前锁定关键岗位与外部协作资源,对偏差超过阈值的事项建立周度复盘机制,确保四季度收口动作按计划推进,避免风险在期末集中暴露。
+
+
“一份好的汇报应把事实、判断和行动连接起来,让每段文字都能落到可执行的下一步。”
+
+
+
+
核心结论
三条判断
+
一经营态势积极稳健规模、结构与质量指标同步改善,年度目标达成在望。
+
二增长动力可以复制领先区域经验已被验证,标准化推广可转化为整体能力。
+
三管理重点转向前置资源、风险与复盘均需前置安排,把事后补救变为事前布防。
+
+
+
+
↗增长机会 · 区域经验复制
+
将华东区域的协同打法沉淀为标准化流程,优先覆盖高频客户场景,向华南、西南推广并季度内完成首轮验证,预计可新增业务规模 0.32 亿元。
+
建议责任:区域经营组完成期限:09.15
+
+
+
+
!重点关注 · 临界资源调度
+
两项专项工作进入资源临界区,应在本周内完成负责人确认和备选排期;对延期风险超过阈值的事项启动日级跟踪。
+
建议责任:项目统筹组完成期限:本周内
+
+
+
+
+
+
+
+
+
+
+
使用说明
模板指引
+
+
这是一个带导航栏的多页面汇报模板:顶部导航切换五个页面,底部状态栏滚动播报动态,页面内容支持滚动浏览。
+
+ - 改文案:导航名称与页面文字直接在 HTML 中修改。
+ - 改弹窗:表格 / 预警 / 时间线的详情写在所在元素的 data-desc 属性里;固定弹窗直接改对应 modal 区块。
+ - 加页面:复制一个 section.view 区块,并在导航里加一个按钮(data-view 名称对应)。
+ - 不要改CSS 类名与结构,切换、弹窗、动画会自动生效。
+
+
+
+
+
+
+
+
+
+
年度累计达成率 · 口径说明
统计口径
+
+
+
年度累计达成率 = 实际累计规模 ÷ 年度目标。本期为 86.8%,较去年同期提高 6.2 个百分点,时间进度 67%,达成进度领先时间进度约 20 个百分点,全年达成在望。
+
+
+
+
+
+
+
累计业务规模 · 口径说明
统计口径
+
+
+
本期累计业务规模 8.42 亿元,同比增长 12.6%。其中核心业务贡献 47.4%,专项业务 28.6%,协同业务 16.1%,其他 7.9%;高价值场景占比由 31% 提升至 38%,结构持续优化。
+
+
+
+
+
+
+
重点项目完成率 · 口径说明
统计口径
+
+
+
按里程碑加权计算,本期完成率 94.1%,高于计划基线 2.1 个百分点。17 个重点项目中 13 个快于计划,2 个按计划,2 个进入资源临界区(详见任务明细页)。
+
+
+
+
+
+
+
风险事项数量 · 口径说明
统计口径
+
+
+
本期期末存量 18 项,较年初下降 21.7%,低于预警阈值。其中资源类 7 项、进度类 6 项、协同类 5 项;两项资源类风险已纳入「重点项目收口」专项跟踪。
+
+
+
+
+
+
+
+
+
发现 01 · 业务结构进一步优化
研判详情
+
+
高价值场景的收入占比由 31% 提升至 38%,核心业务与专项服务保持稳定贡献,收入的结构性质量改善降低了对外部单一客户的依赖。
+
支撑事实:
+
- 高价值场景客单价与复购率同步提升。
- 前十大客户收入集中度下降 4 个百分点。
- 新增贡献的 68% 来自存量客户的价值深挖。
+
建议:延续「深挖存量 + 结构升级」的打法,把高价值场景的服务标准固化为可复制动作。
+
+
+
+
+
+
+
发现 02 · 区域增长梯队分化
研判详情
+
+
华东、华南保持领先增长,后发区域增速落后约 9 个百分点,梯队差距主要来自获客能力与交付体系的成熟度差异。
+
支撑事实:
+
- 领先区域客户协同请求的转化率高出均值 15%。
- 后发区域的项目交付周期普遍长 20%。
- 领先区域已输出标准流程初稿,具备复制条件。
+
建议:以「标准打法输出 + 结对帮扶」缩小梯队差距,优先补齐后发区域的获客与交付两大能力。
+
+
+
+
+
+
+
发现 03 · 项目收口进入关键窗口
研判详情
+
+
交付、验收与资源协调进入并行阶段,里程碑偏差整体可控,但两项专项对关键岗位的依赖度超过 80%,是四季度最大的不确定性来源。
+
支撑事实:
+
- 17 个重点项目中 13 个快于计划。
- 验收材料预审完成率 76%。
- 两项专项已列入资源临界清单并落实责任人。
+
建议:本周完成补充排期与备选资源方案,验收与交付并行期实行日级跟踪。
+
+
+
+
+
+
+
发现 04 · 风险治理成效显现
研判详情
+
+
风险事项存量较年初下降 21.7%,预警机制帮助多数临期事项提前进入处置流程,全年未发生影响目标达成的重大风险事件。
+
支撑事实:
+
- 风险台账周更,责任人与排期 100% 落实。
- 临期事项「预警前处置」占比升至 66%。
- 回款周期与客诉率均优于年度目标。
+
建议:维持现有预警规则,将风险复盘并入周度经营例会,保持管理闭环。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
生成汇报材料
材料导出
+
+
将按当前口径汇总本页结论、行动建议与任务明细,生成一份可直接用于会议的汇报材料。生成过程约需数秒,完成后可在通知中心查看。
+
+ - 包含:核心结论三条、行动建议两项、任务明细八条。
+ - 口径:财务与业务双重校验版数据(09.01 更新)。
+ - 格式:页面版(可打印为 PDF)。
+
+
+
+
+
+
+
+
+
+ 操作成功(演示)
+
+
+
+
diff --git a/offline-backend-20260512/backend/packages/harness/deerflow/page_reports/assets/report-screen-light-airy-template.html b/offline-backend-20260512/backend/packages/harness/deerflow/page_reports/assets/report-screen-light-airy-template.html
new file mode 100644
index 00000000..56b8a47c
--- /dev/null
+++ b/offline-backend-20260512/backend/packages/harness/deerflow/page_reports/assets/report-screen-light-airy-template.html
@@ -0,0 +1,750 @@
+
+
+
+
+
+ 浅色轻盈风 · 大屏汇报模版(玻璃拟态动画版)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 年度累计达成
+
+ ↑ +6.2%较去年同期
+
+
+
+
+
+
+
+
+
+
+ 月度目标达成趋势
单位:% · 悬停查看数值
+
+
+
+
+ 业务结构占比
累计规模
+
+
+
+
+ 区域达成排行
目标完成率
+
+
+
+
+ 月度处置节奏
单位:件
+
+
+
+
+ 关键里程碑
本期节点
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/offline-backend-20260512/backend/packages/harness/deerflow/page_reports/assets/report-screen-light-charts-portal-template.html b/offline-backend-20260512/backend/packages/harness/deerflow/page_reports/assets/report-screen-light-charts-portal-template.html
new file mode 100644
index 00000000..81c6e573
--- /dev/null
+++ b/offline-backend-20260512/backend/packages/harness/deerflow/page_reports/assets/report-screen-light-charts-portal-template.html
@@ -0,0 +1,1468 @@
+
+
+
+
+
+ 浅色轻盈风 · 图表增强导航式汇报模版
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
月度目标达成趋势
+
实际达成目标基线
+
2026 年 1 — 9 月 · 单位:% · 悬停无干扰
+
+
+
+
9 月达成率 86.8%,持续领先目标基线
+
+
+
+
区域达成排行
TOP 6 · 目标完成率
+
+
+
+
+
+
+
+
经营简报
本期综述
+
经营呈现「规模稳步增长、结构持续优化、风险总体可控」的积极态势,年度目标达成进度符合预期,为四季度收口留出充分空间。
+
核心业务贡献保持稳定,重点板块实际达成进度整体领先于计划。华东、华南区域形成双轮驱动,区域协同机制逐步沉淀为可复用的标准方法。新增贡献主要来自高价值场景,增长来源清晰、可持续性较强。
+
随着年度重点项目进入验收与交付并行阶段,资源调配复杂度上升。建议提前锁定关键岗位与外部协作资源,对偏差超过阈值的事项建立周度复盘机制,确保四季度收口动作按计划推进。
+
规模稳步增长结构持续优化风险总体可控口径双重校验
+
+
+
经营动态
自动滚动 · 悬停暂停
+
+
列表自动向上无限滚动,鼠标悬停可暂停阅读
+
+
+
+
+
+
+
+
+
+
+
+
投入产出分布
+
常规业务重点项目创新业务
+
气泡大小:收益贡献
+
+
+ 收益贡献 ↑投入强度 →
+
+
+
+
+
+
+
✓成效与亮点STRENGTHS
+
达成进度符合预期年度累计达成率 86.8%,较去年同期提高 6.2 个百分点。
+
重点项目交付领先阶段完成率 94.1%,多数项目快于计划节奏推进。
+
区域协同机制成型领先区域打法开始沉淀,具备复制推广条件。
+
风险敞口持续收窄风险数量与影响面同步下降,预警规则稳定生效。
+
+
+
!问题与挑战CHALLENGES
+
区域间差距待缩小梯队分化明显,后发区域能力建设需要体系化投入。
+
两项项目资源临界关键岗位依赖度高,四季度并行压力上升。
+
经验沉淀不够系统有效做法多停留在个案层面,标准化速度不足。
+
复盘机制尚未闭环偏差复盘以事后为主,缺少周期化、制度化安排。
+
+
+
+
+
01业务结构优化高价值场景占比持续提升,收入质量改善降低单一客户依赖。
+
+
+
02区域梯队分化领先区域已形成可复制经验,后发区域需要体系化能力建设。
+
+
+
03风险治理见效风险存量明显下降,预警机制帮助多数临期事项提前处置。
+
+
+
+
+
+
+
+
+
+
重点项目推进计划
2026 年 04 — 09 月 · 点击行看详情
+
+
+
+
+
+
+
周度规模节奏
+
实际规模目标基线
+
近 12 周 · 单位:百万元
+
+
+
+
+
+
+
推进说明
本期口径
+
六个重点项目中,客户验收与风险排查两项已提前完成;经验复制与资源预置按计划推进,里程碑偏差均在 5% 以内;重点项目收口因资源临界被列入重点关注。
+
甘特条上的流光表示项目处于活跃推进状态;竖线为当前时间指示,便于直观判断各项目的剩余窗口。
+
+
+
+
下阶段重点
Q4 安排
+
+
一复制增长经验华东协同打法向华南、西南推广,季度内完成首轮验证。
+
二前置收口资源本周完成临界项目的补充排期与责任人确认。
+
三固化复盘机制周度里程碑刷新,偏差超 5% 启动专项复盘。
+
+
+
+
+
+
关键里程碑
08 — 09 月节点 · 进度线自动填充
+
+
+
08.08风险排查完成识别两项临界风险,台账转入周更。
+
08.18区域复盘机制启动经验提炼完成,复盘升级为周度。
+
08.27重点客户项目验收阶段成果达标,进入交付准备。
+
09.01经营数据期末更新双重校验完成,统一口径锁定。
+
09.15四季度资源预置资源锁定与经验复制双线并行。
+
+
+
+
+
+
+
+
+
月度规模节奏
单位:百万元 · 青色为峰值
+
+
+
+
+
+
+
+
重点项目清单
点击行查看详情
+
+ | 项目 | 归属 | 优先级 | 状态 | 更新 |
+
+ | 区域经验复制专项流程沉淀 · 试点推广 | 区域经营组 | 高 | 进行中 | |
+ | 重点项目收口交付 · 验收 · 归档并行 | 项目统筹组 | 高 | 需关注 | |
+ | 经营复盘机制建设周度刷新 · 偏差复盘 | 经营管理组 | 中 | 进行中 | |
+ | 四季度资源预置岗位锁定 · 协作预置 | 人力协调组 | 中 | 进行中 | |
+ | 重点客户阶段验收成果达标 · 材料归档 | 项目统筹组 | 高 | 已完成 | |
+ | 风险事项专项排查全量排查 · 台账建立 | 风控管理组 | 中 | 已完成 | |
+
+
+
+
+
明细口径说明
阅读指引
+
月度柱状图统计近 12 个月的确认收入规模,峰值月以青色高亮;经营记录按时间倒序自动滚动,覆盖签约、交付、验收、回款等关键动作。所有明细均可追溯至经营台账,口径与总览页一致。
+
点击清单任意行可查看项目详情与阶段完成度;若需按区域或业务线过滤,可在台账系统按相同口径导出。
+
+
+
+
+
+
+
+
CONCLUSION · 管理层研判
+
以「复制增长经验 + 前置收口资源」保障年度目标达成
+
本报告基于财务与业务双重校验的数据与事实,归纳本阶段经营特征,并给出四季度的工作重心与责任安排。汇报结构为:核心结论、行动建议与跟踪安排三部分。
+
+
核心业务贡献保持稳定,重点板块实际达成进度整体领先于计划。华东、华南区域形成双轮驱动,区域协同机制逐步沉淀为可复用的标准方法。新增贡献主要来自高价值场景,增长来源清晰、可持续性较强。
+
随着年度重点项目进入验收与交付并行阶段,资源调配复杂度上升。建议提前锁定关键岗位与外部协作资源,对偏差超过阈值的事项建立周度复盘机制,确保四季度收口动作按计划推进。
+
+
“一份好的汇报应把事实、判断和行动连接起来,让每段文字都能落到可执行的下一步。”
+
+
+
+
核心结论
三条判断
+
一经营态势积极稳健规模、结构与质量指标同步改善,年度目标达成在望,四季度重点在收口而非冲量。
+
二增长动力可以复制领先区域经验已被验证,标准化推广可将个体优势转化为整体能力。
+
三管理重点转向前置资源、风险与复盘均需前置安排,把事后补救变为事前布防。
+
+
+
+
↗增长机会 · 区域经验复制
+
将华东区域的协同打法沉淀为标准化流程,优先覆盖高频客户场景,向华南、西南推广并季度内完成首轮验证,预计可新增业务规模 0.32 亿元。
+
建议责任:区域经营组完成期限:09.15
+
+
+
!重点关注 · 临界资源调度
+
两项专项工作进入资源临界区,应在本周内完成负责人确认和备选排期;对延期风险超过阈值的事项启动日级跟踪。
+
建议责任:项目统筹组完成期限:本周内
+
+
+
+
+
判断 — 依据 — 行动矩阵
结构化对照
+
+
经营判断
事实依据
下一步行动
+
增长基础稳固
累计规模与重点板块完成率同步提升,新增贡献集中在核心区域与高价值场景。
复制领先区域客户协同流程,推动华南、西南重点场景快速落地。
+
资源收口需前置
重点项目即将进入交付与验收并行期,部分事项对关键岗位依赖较高。
建立项目周清单,偏差超 5% 启动专项复盘并提前锁定补充排期。
+
风险总体可控
风险事项数量较年初下降 21.7%,预警机制帮助多数临期事项提前处置。
维持 48 小时预警规则,跨区域事项保留管理层人工协调通道。
+
+
+
+
+
+
+
+
+
使用说明
模板指引
+
+
这是图表增强的导航式多页面汇报模板:五个页面含折线、饼图、雷达、散点、甘特、柱状六种图表,图表占比控制在一半以下,其余为文字版式。
+
+ - 改文案:页面文字直接在 HTML 中修改。
+ - 改图表:只改页面底部脚本里的 reportData 对象(含中文注释)。
+ - 性能:持续动画仅用 transform/opacity,切页自动停;弱设备可放心使用。
+
+
+
+
+
+
+
+
+
+
+ 操作成功(演示)
+
+
+
+
diff --git a/offline-backend-20260512/backend/packages/harness/deerflow/page_reports/assets/report-screen-multipage-suite-template.html b/offline-backend-20260512/backend/packages/harness/deerflow/page_reports/assets/report-screen-multipage-suite-template.html
new file mode 100644
index 00000000..0d027135
--- /dev/null
+++ b/offline-backend-20260512/backend/packages/harness/deerflow/page_reports/assets/report-screen-multipage-suite-template.html
@@ -0,0 +1,517 @@
+
+
+
+
+
+
+ 多页经营汇报 · HTML 模板
+
+
+
+
+
+
+
+ 数据更新于 2026-09-01 10:30
+
+
+
+
+
+
+
Executive Situation · 2026 Q3
+
增长保持韧性,当前决策重点转向结构优化与风险回收
+
本周期累计完成目标的 86.8%,较计划节奏领先 2.6 个百分点。业务规模维持稳定增长,但区域资源利用率出现分化;建议将管理重心从“扩大投入”调整为“提升产出质量”。
+
03 项需本周决策06 项重点事项推进中报告口径:截至 09 月 01 日
+
+
+
+
+
+
+ 累计业务规模
¥ 8.42 亿
↑ 12.6% 年度目标 9.70 亿
+ 重点项目完成率
94.1%
↑ 3.8% 较上月改善
+ 交付及时率
96.4%
↑ 1.2% 保持健康区间
+ 待收敛风险事项
18
↑ 21.7% 较年初增加
+
+
+
+
+
+
+ 1月2月3月4月5月6月7月8月9月
+ 趋势判断7 月后实际曲线持续位于目标节奏上方;若四季度维持当前转化效率,年度目标存在提前达成空间。
+
+
+ 经营判断
本期重点
+ 规模增长仍是正向信号,但数字本身不足以说明结构健康。当前需用“优先级、责任人、交付时点”把增长机会转译为可执行的经营动作。
+
+
保持继续放大华东与华北的高质量订单转化,维持交付节奏。
+
收紧对低产出项目设置阶段阈值,避免资源被长期占用。
+
补强将区域协同与风险闭环纳入周度共担,缩短决策链路。
+
+
+
+
+
+
+ 阶段经营综述
长文 / 可直接替换 Markdown
+
+
本阶段经营目标整体推进平稳,核心业务和协同项目均处于计划线以上。增长主要来自既有客户的深化合作以及重点项目的提前回款,说明市场需求并未明显减弱。
+
需要关注的是,区域间的项目成熟度差异正在放大:头部区域已进入规模与效率同步提升阶段,部分区域仍依赖单点项目拉动。后续应让成熟经验形成可迁移的方法包。
+
+ “下一阶段的关键不是做更多事情,而是让每一项投入都有清晰的收益路径、责任主体与退出条件。”
+
+
+
+
+
+
+
+
+ Topic Brief · Regional Collaboration
专题研判:把区域差异从“结果问题”转化为组织协同问题
区域完成率的差异并不只由市场容量决定。复盘显示,项目协同速度、关键角色前置介入和风险反馈密度,对结果的解释力更强。
+ 56%新增规模来自两大区域
2.3x高低区资源利用率差
48h风险闭环建议时限
+
+
+
+ Analysis Narrative
同样的投入结构,为什么会出现不同的交付与增长质量?
+ 本次研判以项目进度、客户反馈、资源调度和风险处置记录为基础。结论不是对单一区域做评价,而是识别可复制机制与必须补齐的组织能力。
+ 领先区域的共同特征是业务、交付和客户侧负责人在立项前就完成了关键边界对齐,后续资源调度以周为单位复核。因此,问题会在影响结果之前被暴露并解决。
相对滞后的区域并非缺少项目机会,而是跨角色协同仍依赖临时沟通。建议将成熟区域的前置评审、异常升级和复盘节奏固化为标准动作,再由区域负责人进行本地化适配。
+ 研判结论:短期优先补齐“协同效率”和“风险前置”两项能力,预计比单纯增加资源投入更能改善第四季度的结构性差距。
+
+
+ 能力画像对比
领先区域 / 基准
+
+
+
协同效率 92前置评审机制已形成稳定节奏
交付稳定性 88跨团队切换损耗较低
风险前置 84需持续提高异常反馈密度
+
+
+
+
+ 机会:成熟机制可被复制
领先区域的项目预审、里程碑共识和复盘模板已较为成熟,可在不改变客户策略的前提下推广至同类团队。
建议:建立方法包与陪跑机制
+ 关注:资源调度仍偏被动
问题常在临近交付时才进入管理视野,导致支援资源无法提前锁定,影响了协同项目的整体完成质量。
建议:固定周度预警与升级窗口
+ 边界:不宜用统一目标覆盖差异
区域客户结构与项目周期存在差异,统一的结果指标应保留,但过程阈值需要结合成熟度做分层管理。
建议:按成熟度设置过程指标
+
+
+ 判断—依据—行动矩阵
结构化文字面板
+ | 核心判断 | 数据与事实依据 | 建议行动 |
+ | 协同效率是主要变量 | 领先区域在立项前完成关键角色对齐,跨部门阻塞平均闭环时长低于基准区 37%。 | 复制前置评审模板,并在周会跟踪跨部门阻塞项。 |
+ | 资源并非绝对不足 | 部分区域资源利用率偏低,但关键时点仍出现重复排队和临时求援。 | 设立区域共担池,按优先级调度而非按部门归属调度。 |
+ | 风险需要前置管理 | 临界风险多在交付前一周暴露,留给纠偏的时间不足。 | 执行 48 小时反馈规则,对高影响事项设管理层升级通道。 |
+
+
+
+
+
+
+
+ Action Command · Sep 2026
行动督办:把共识固化为时点、责任与可验收结果
本页保留必要的计划图表,但阅读重点是行动说明。每项动作均应写清楚为何要做、由谁负责、何时反馈、什么状态下可以关闭,避免“有安排、无闭环”。
+
+
+
+ 重点事项推进计划
09.01 — 09.30
+ 项目事项第 1 周第 2 周第 3 周第 4 周复盘状态
+ 重点项目验收闭环
+ 区域共担机制复盘
+ 低效投入分级处置
+ 风险闭环专项检查
+
+
+
+
+ 关键进展时间线
事件型文字展示
+
经营复盘会确认三项优先动作负责人、协同部门与首次反馈时点已写入周度台账。
+
完成重点项目验收材料预审异常项不得带入正式验收流程,客户侧问题同步升级。
+
区域共担机制第一次复盘复盘资源响应时长和支援结果,调整优先级规则。
+
提交阶段成果与风险闭环报告只保留尚需决策的事项,已关闭问题沉淀为方法包。
+
+
+
+ 责任—交付—验收清单
可替换为 JSON 表格| 行动事项 | 责任人 / 协同方 | 本周应交付内容 | 验收标准 |
|---|
| 重点项目验收闭环 | 王晨 / 区域负责人 | 完成客户侧材料核对、异常项清单和回款节点确认。 | 验收材料齐备,异常项均明确处置人和截止时间。 |
| 区域资源共担机制 | 陈琳 / 交付、运营 | 提交共担池规则与首轮资源调度记录。 | 资源申请有优先级依据,响应时间可量化复盘。 |
| 风险分级处置 | 赵磊 / 各项目经理 | 更新风险台账,完成临界事项的管理层反馈。 | 高风险事项 48 小时内有结论或升级路径。 |
+
+
+
+
+
+
diff --git a/offline-backend-20260512/backend/packages/harness/deerflow/page_reports/templates.py b/offline-backend-20260512/backend/packages/harness/deerflow/page_reports/templates.py
new file mode 100644
index 00000000..9529c69f
--- /dev/null
+++ b/offline-backend-20260512/backend/packages/harness/deerflow/page_reports/templates.py
@@ -0,0 +1,324 @@
+"""Catalog and deterministic selector for bundled report-page templates.
+
+HTML skeletons are packaged with the backend so page generation never depends
+on the frontend checkout or a browser upload. Deployments can optionally
+override the built-in library with ``DEERFLOW_PAGE_TEMPLATE_DIR``.
+"""
+
+from __future__ import annotations
+
+import os
+import re
+from dataclasses import asdict, dataclass
+from hashlib import sha256
+from pathlib import Path
+from typing import Literal
+
+Theme = Literal["dark", "light"]
+
+
+@dataclass(frozen=True)
+class PageTemplateProfile:
+ """A concise, agent-facing description of one HTML report skeleton."""
+
+ id: str
+ filename: str
+ theme: Theme
+ title: str
+ style: str
+ page_count: int
+ features: tuple[str, ...]
+ data_entry: str
+ best_for: tuple[str, ...]
+
+ def to_dict(self) -> dict[str, object]:
+ """Serialize tuples as JSON-friendly lists."""
+ value = asdict(self)
+ value["features"] = list(self.features)
+ value["best_for"] = list(self.best_for)
+ return value
+
+
+# Keep this declarative. Later templates only require one profile here; their
+# original HTML never needs to be copied into the backend or rewritten.
+_TEMPLATES: tuple[PageTemplateProfile, ...] = (
+ PageTemplateProfile(
+ id="dark-charts-portal",
+ filename="report-screen-dark-charts-portal-template.html",
+ theme="dark",
+ title="深蓝图表运营门户",
+ style="深蓝科技感、密度较高、带动效的大屏门户",
+ page_count=5,
+ features=("kpi", "line", "bar", "pie", "radar", "scatter", "gantt", "table", "text-panels", "animation"),
+ data_entry="reportData(图表和滚动列表统一入口)",
+ best_for=("经营汇报", "数据较多", "多页面", "图表优先", "督办"),
+ ),
+ PageTemplateProfile(
+ id="dark-neon-portal",
+ filename="report-screen-dark-neon-portal-template.html",
+ theme="dark",
+ title="深蓝霓虹专题门户",
+ style="深蓝霓虹、沉浸式科技感、内容分区明显",
+ page_count=5,
+ features=("kpi", "timeline", "table", "text-panels", "animation"),
+ data_entry="页面结构直接编辑(先复制再删减)",
+ best_for=("专题汇报", "文字较多", "多页面", "研判"),
+ ),
+ PageTemplateProfile(
+ id="dark-neon",
+ filename="report-screen-dark-neon-template.html",
+ theme="dark",
+ title="深蓝霓虹单页大屏",
+ style="深蓝发光边框、重点指标突出",
+ page_count=1,
+ features=("kpi", "line", "bar", "text-panels", "animation"),
+ data_entry="页面结构直接编辑(先复制再删减)",
+ best_for=("单页汇报", "简洁数据", "值班态势"),
+ ),
+ PageTemplateProfile(
+ id="dark-classic",
+ filename="report-screen-dark-template.html",
+ theme="dark",
+ title="深蓝综合经营大屏",
+ style="稳重深蓝、经营驾驶舱、信息密度适中",
+ page_count=3,
+ features=("kpi", "bar", "table", "timeline", "text-panels"),
+ data_entry="页面内置数据变量和结构化区块",
+ best_for=("经营汇报", "文字与数据均衡", "三页汇报"),
+ ),
+ PageTemplateProfile(
+ id="light-charts-portal",
+ filename="report-screen-light-charts-portal-template.html",
+ theme="light",
+ title="浅色图表运营门户",
+ style="明亮专业、留白充足、带动效的多页面门户",
+ page_count=5,
+ features=("kpi", "line", "bar", "pie", "radar", "scatter", "gantt", "table", "text-panels", "animation"),
+ data_entry="reportData(图表和滚动列表统一入口)",
+ best_for=("经营汇报", "数据较多", "多页面", "图表优先", "督办"),
+ ),
+ PageTemplateProfile(
+ id="light-airy-portal",
+ filename="report-screen-light-airy-portal-template.html",
+ theme="light",
+ title="浅色轻盈专题门户",
+ style="浅色留白、内容阅读友好、清爽分栏",
+ page_count=5,
+ features=("kpi", "timeline", "table", "text-panels", "animation"),
+ data_entry="页面结构直接编辑(先复制再删减)",
+ best_for=("专题汇报", "文字较多", "多页面", "研判"),
+ ),
+ PageTemplateProfile(
+ id="light-airy",
+ filename="report-screen-light-airy-template.html",
+ theme="light",
+ title="浅色轻盈单页报告",
+ style="浅色卡片、阅读节奏舒展",
+ page_count=1,
+ features=("kpi", "bar", "table", "text-panels"),
+ data_entry="页面内置数据变量和结构化区块",
+ best_for=("单页汇报", "文字为主", "简洁数据"),
+ ),
+ PageTemplateProfile(
+ id="multipage-suite",
+ filename="report-screen-multipage-suite-template.html",
+ theme="dark",
+ title="多页面汇报套件",
+ style="深蓝 / 浅色可切换、文字信息组织强、标准化汇报套件",
+ page_count=3,
+ features=("kpi", "bar", "radar", "gantt", "table", "timeline", "text-panels", "theme-switch"),
+ data_entry="reportData(日期、可见页面)+ 页面结构",
+ best_for=("多页面", "文字为主", "汇报研判", "行动督办"),
+ ),
+)
+
+
+def _template_root_candidates() -> list[Path]:
+ explicit = os.getenv("DEERFLOW_PAGE_TEMPLATE_DIR", "").strip()
+ candidates: list[Path] = [Path(explicit).expanduser()] if explicit else []
+ candidates.append(Path(__file__).resolve().parent / "assets")
+ return candidates
+
+
+def resolve_template_root() -> Path:
+ """Locate the template directory or raise a useful deployment error."""
+ for candidate in _template_root_candidates():
+ if candidate.is_dir():
+ return candidate.resolve()
+ raise FileNotFoundError(
+ "Page template directory is unavailable. Set DEERFLOW_PAGE_TEMPLATE_DIR "
+ "to the directory containing the report-screen-*-template.html files."
+ )
+
+
+def _auto_profile(source: Path) -> PageTemplateProfile:
+ """Create a conservative profile for a newly dropped-in HTML template.
+
+ Auto-discovered files are intentionally tagged as ``待人工确认`` rather
+ than claiming capabilities we cannot prove. The designer can use them for
+ broad page requests immediately; a later catalog entry can add richer,
+ hand-verified selection metadata without changing the source HTML.
+ """
+ html = source.read_text(encoding="utf-8", errors="ignore")[:1_000_000]
+ lowered = html.lower()
+ stem = source.stem
+ is_dark = "dark" in stem.lower() or 'data-theme="dark"' in lowered or "#061" in lowered
+ features: list[str] = ["text-panels"]
+ for feature, hints in {
+ "kpi": ("kpi", "metric", "stat-"),
+ "line": ("linechart", "line-chart", "line-svg"),
+ "bar": ("bar-chart", "bars", "bar >"),
+ "pie": ("pie", "donut"),
+ "radar": ("radar",),
+ "scatter": ("scatter",),
+ "gantt": ("gantt",),
+ "table": (" tuple[PageTemplateProfile, ...]:
+ """Return registered templates plus safely auto-discovered future files."""
+ profiles = list(_TEMPLATES)
+ known_filenames = {profile.filename for profile in profiles}
+ try:
+ root = resolve_template_root()
+ for source in sorted(root.glob("report-screen-*-template.html"), key=lambda item: item.name.lower()):
+ if source.name not in known_filenames:
+ profiles.append(_auto_profile(source))
+ except (FileNotFoundError, OSError):
+ # Catalog information remains useful in deployments where the frontend
+ # package is not mounted yet; prepare() will surface the real error.
+ pass
+ return tuple(profiles)
+
+
+def get_template_profile(template_id: str) -> PageTemplateProfile:
+ normalized = (template_id or "").strip().lower()
+ for profile in list_template_profiles():
+ if profile.id == normalized:
+ return profile
+ available = ", ".join(profile.id for profile in list_template_profiles())
+ raise ValueError(f"Unknown page template '{template_id}'. Available: {available}")
+
+
+def resolve_template_file(template_id: str) -> Path:
+ """Return a verified source-template path for a catalog id."""
+ profile = get_template_profile(template_id)
+ source = (resolve_template_root() / profile.filename).resolve()
+ root = resolve_template_root()
+ try:
+ source.relative_to(root)
+ except ValueError as exc: # defensive: profile filenames are repository data
+ raise ValueError("Template path escapes the template root") from exc
+ if not source.is_file():
+ raise FileNotFoundError(
+ f"Template '{template_id}' is listed in the catalog but is missing: {source}"
+ )
+ return source
+
+
+def _normalize_theme(theme: str | None) -> Theme | None:
+ value = (theme or "").strip().lower()
+ if value in {"dark", "deep-blue", "dark-blue"}:
+ return "dark"
+ if value in {"light", "white", "bright"}:
+ return "light"
+ return None
+
+
+def _score_template(
+ profile: PageTemplateProfile,
+ *,
+ content_density: str,
+ required_features: set[str],
+ preferred_page_count: int | None,
+) -> int:
+ score = 0
+ features = set(profile.features)
+ # A required feature weighs substantially more than aesthetics.
+ score += 12 * len(features & required_features)
+ score -= 30 * len(required_features - features)
+ density = (content_density or "balanced").strip().lower()
+ if density in {"text-heavy", "rich-text", "文字较多"} and "text-panels" in features:
+ score += 8
+ if density in {"data-heavy", "chart-heavy", "图表较多"} and {"line", "bar", "pie"}.issubset(features):
+ score += 8
+ if preferred_page_count:
+ score -= min(abs(profile.page_count - preferred_page_count), 3) * 3
+ return score
+
+
+def choose_template(
+ *,
+ theme: str | None,
+ content_density: str = "balanced",
+ required_features: list[str] | None = None,
+ preferred_page_count: int | None = None,
+ selection_key: str = "",
+ exclude_template_ids: list[str] | None = None,
+) -> PageTemplateProfile:
+ """Choose a suitable template, varying ties deterministically by request.
+
+ The caller can pass recent choices through ``exclude_template_ids``. We
+ only fall back to an excluded item when it is the sole match for the chosen
+ theme, which prevents an agent from losing the requested colour mode.
+ """
+ target_theme = _normalize_theme(theme)
+ all_profiles = list_template_profiles()
+ candidates = [profile for profile in all_profiles if target_theme is None or profile.theme == target_theme]
+ if not candidates:
+ candidates = list(all_profiles)
+ excluded = {value.strip().lower() for value in (exclude_template_ids or []) if value.strip()}
+ non_excluded = [profile for profile in candidates if profile.id not in excluded]
+ if non_excluded:
+ candidates = non_excluded
+ feature_set = {value.strip().lower() for value in (required_features or []) if value.strip()}
+ scored = sorted(
+ ((
+ _score_template(
+ profile,
+ content_density=content_density,
+ required_features=feature_set,
+ preferred_page_count=preferred_page_count,
+ ),
+ profile,
+ ) for profile in candidates),
+ key=lambda item: (-item[0], item[1].id),
+ )
+ best_score = scored[0][0]
+ ties = [profile for score, profile in scored if score == best_score]
+ if len(ties) == 1:
+ return ties[0]
+ digest = sha256((selection_key or "page-report").encode("utf-8")).digest()
+ return ties[int.from_bytes(digest[:4], "big") % len(ties)]
+
+
+__all__ = [
+ "PageTemplateProfile",
+ "choose_template",
+ "get_template_profile",
+ "list_template_profiles",
+ "resolve_template_file",
+ "resolve_template_root",
+]
diff --git a/offline-backend-20260512/backend/packages/harness/deerflow/tools/builtins/page_report_template_tool.py b/offline-backend-20260512/backend/packages/harness/deerflow/tools/builtins/page_report_template_tool.py
new file mode 100644
index 00000000..f5b51740
--- /dev/null
+++ b/offline-backend-20260512/backend/packages/harness/deerflow/tools/builtins/page_report_template_tool.py
@@ -0,0 +1,322 @@
+"""Thread-safe page-report template preparation and static quality checks."""
+
+from __future__ import annotations
+
+import json
+import re
+from collections.abc import Iterable
+from pathlib import Path
+
+from langchain.tools import ToolRuntime, tool
+from langgraph.typing import ContextT
+
+from deerflow.agents.thread_state import ThreadState
+from deerflow.config.paths import VIRTUAL_PATH_PREFIX, get_paths
+from deerflow.page_reports.templates import (
+ choose_template,
+ get_template_profile,
+ list_template_profiles,
+ resolve_template_file,
+)
+from deerflow.runtime.thread_paths import resolve_path_user_id
+
+_MAX_HTML_BYTES = 4 * 1024 * 1024
+# Allow human-readable Chinese filenames while still rejecting path separators,
+# Windows-reserved filename characters, and control characters.
+_SAFE_OUTPUT_NAME = re.compile(r'^[^<>:"/\\|?*\x00-\x1f]+\.html$', re.IGNORECASE)
+_FONT_SIZE_RE = re.compile(r"font-size\s*:\s*([0-9]+(?:\.[0-9]+)?)px", re.IGNORECASE)
+_MIN_TEXT_FONT_SIZE = 16.0
+
+
+def _thread_id(runtime: ToolRuntime[ContextT, ThreadState]) -> str:
+ context = runtime.context or {}
+ thread_id = context.get("thread_id")
+ if not thread_id:
+ thread_id = (getattr(runtime, "config", {}) or {}).get("configurable", {}).get("thread_id")
+ if not thread_id:
+ raise ValueError("当前会话缺少 thread_id,无法准备页面模板。")
+ return str(thread_id)
+
+
+def _virtual_path(path: Path, *, thread_id: str, user_id: str | None) -> str:
+ root = get_paths().sandbox_user_data_dir(thread_id, user_id=user_id).resolve()
+ relative = path.resolve().relative_to(root)
+ return f"{VIRTUAL_PATH_PREFIX}/{relative.as_posix()}"
+
+
+def _thread_directories(runtime: ToolRuntime[ContextT, ThreadState]) -> tuple[str, str | None, Path, Path]:
+ thread_id = _thread_id(runtime)
+ user_id = resolve_path_user_id(thread_id)
+ paths = get_paths()
+ workspace = paths.sandbox_work_dir(thread_id, user_id=user_id)
+ outputs = paths.sandbox_outputs_dir(thread_id, user_id=user_id)
+ workspace.mkdir(parents=True, exist_ok=True)
+ outputs.mkdir(parents=True, exist_ok=True)
+ return thread_id, user_id, workspace, outputs
+
+
+def _safe_output_filename(output_name: str) -> str:
+ raw = (output_name or "report-page.html").strip()
+ if not raw.lower().endswith(".html"):
+ raw += ".html"
+ if Path(raw).name != raw or not _SAFE_OUTPUT_NAME.fullmatch(raw):
+ raise ValueError("output_name 必须是单个安全的 .html 文件名,不能包含路径或 Windows 非法字符。")
+ return raw
+
+
+def _apply_minimum_font_size(html: str) -> str:
+ """Normalize editable template copies to the report designer's font floor.
+
+ The library includes some legacy dashboard skeletons with compact labels.
+ They are useful layout starting points, but the designer contract requires
+ that visible text is at least 16px. Normalize the *per-thread copy* here
+ so a weaker model does not have to remember a large CSS-only cleanup before
+ it can work on the actual report content. The immutable source template is
+ never changed, and ``validate`` remains the final guard if later edits add
+ a smaller declaration.
+ """
+
+ def replace(match: re.Match[str]) -> str:
+ size = float(match.group(1))
+ if size >= _MIN_TEXT_FONT_SIZE:
+ return match.group(0)
+ return f"font-size: {_MIN_TEXT_FONT_SIZE:g}px"
+
+ return _FONT_SIZE_RE.sub(replace, html)
+
+
+def _edit_contract(template_id: str) -> dict[str, object]:
+ profile = get_template_profile(template_id)
+ chart_driven = "reportData" in profile.data_entry
+ return {
+ "data_entry": profile.data_entry,
+ "edit_order": [
+ "先把用户材料整理为文字摘要、指标、表格行、图表数据和待办事项。",
+ "只编辑工作区的副本;禁止改动模板源文件。",
+ "若存在 reportData,先改该对象中的图表数组,再替换标题、段落、卡片和表格文案。",
+ "根据材料删掉无数据的卡片或整页;不要为了凑页数保留空白面板。",
+ "将最终 HTML 写入 outputs 后调用 validate;通过后用 present_files 交付。",
+ ],
+ "must_keep": (
+ ["reportData 的字段名和图表渲染函数", "页面切换及 prefers-reduced-motion 逻辑"]
+ if chart_driven
+ else ["已有布局类名", "移动端 / reduced-motion 样式"]
+ ),
+ "illustrative_data_rule": "没有可核验数值但用户明确要求图表时,可画示意图;页面必须在图例或数据口径处标注“示意数据 / 待补充数据”,不得伪装为事实。",
+ }
+
+
+def _prepare(
+ runtime: ToolRuntime[ContextT, ThreadState],
+ *,
+ theme: str,
+ content_density: str,
+ required_features: list[str],
+ preferred_page_count: int | None,
+ selection_key: str,
+ exclude_template_ids: list[str],
+ template_id: str | None,
+ output_name: str,
+ page_brief: str,
+) -> str:
+ profile = (
+ get_template_profile(template_id)
+ if (template_id or "").strip()
+ else choose_template(
+ theme=theme,
+ content_density=content_density,
+ required_features=required_features,
+ preferred_page_count=preferred_page_count,
+ selection_key=selection_key,
+ exclude_template_ids=exclude_template_ids,
+ )
+ )
+ source = resolve_template_file(profile.id)
+ thread_id, user_id, workspace, outputs = _thread_directories(runtime)
+ filename = _safe_output_filename(output_name)
+ working_copy = workspace / f"{Path(filename).stem}--{profile.id}.html"
+ brief_path = workspace / f"{Path(filename).stem}--page-brief.json"
+ # Copy first, then normalize only the editable thread-local copy. This
+ # preserves the bundled assets exactly as supplied while giving every run a
+ # usable 16px-or-larger starting point.
+ working_copy.write_text(_apply_minimum_font_size(source.read_text(encoding="utf-8")), encoding="utf-8")
+ brief = {
+ "template": profile.to_dict(),
+ "requested_theme": theme or "auto",
+ "requested_content_density": content_density or "balanced",
+ "required_features": required_features,
+ "recommended_final_output": _virtual_path(outputs / filename, thread_id=thread_id, user_id=user_id),
+ "working_copy": _virtual_path(working_copy, thread_id=thread_id, user_id=user_id),
+ "user_material_brief": (page_brief or "").strip(),
+ "edit_contract": _edit_contract(profile.id),
+ "font_rule": "所有可见文字最小字号为 16px;生成后必须通过 validate 校验。",
+ }
+ brief_path.write_text(json.dumps(brief, ensure_ascii=False, indent=2), encoding="utf-8")
+ return json.dumps(
+ {
+ "ok": True,
+ "template": profile.to_dict(),
+ "working_copy": _virtual_path(working_copy, thread_id=thread_id, user_id=user_id),
+ "brief_path": _virtual_path(brief_path, thread_id=thread_id, user_id=user_id),
+ "final_output": brief["recommended_final_output"],
+ "next_step": "读取 brief_path 和 working_copy,改完后写入 final_output,再调用 action=validate。",
+ },
+ ensure_ascii=False,
+ )
+
+
+def _resolve_current_thread_file(
+ runtime: ToolRuntime[ContextT, ThreadState],
+ virtual_path: str,
+) -> tuple[Path, str, str | None]:
+ thread_id, user_id, workspace, outputs = _thread_directories(runtime)
+ normalized = (virtual_path or "").strip()
+ if not normalized.startswith(f"{VIRTUAL_PATH_PREFIX}/"):
+ raise ValueError(f"file_path 必须位于 {VIRTUAL_PATH_PREFIX}/workspace 或 {VIRTUAL_PATH_PREFIX}/outputs。")
+ actual = get_paths().resolve_virtual_path(thread_id, normalized, user_id=user_id)
+ permitted_roots: Iterable[Path] = (workspace.resolve(), outputs.resolve())
+ if not any(actual.is_relative_to(root) for root in permitted_roots):
+ raise ValueError("file_path 只能指向当前会话的 workspace 或 outputs 目录。")
+ if not actual.is_file():
+ raise ValueError(f"待校验 HTML 不存在:{virtual_path}")
+ return actual, thread_id, user_id
+
+
+def _count_textual_content(html: str) -> int:
+ plain = re.sub(r"