fix: 预览按 draft-{id} 命名且重建全量同构 + C1 空台账改判数据待补 + 立项经费结余结论 + CLI 拆分 import-*/list-* + docx 占位黄底
This commit is contained in:
@@ -1,12 +1,11 @@
|
||||
"""初稿 HTML 预览组装。
|
||||
|
||||
与 Word 初稿同构内容写入 `{skill_data}/html/draft-{id}.html`,宿主侧栏可预览;
|
||||
重建走固定 Action id `render-html`。
|
||||
重建走固定 Action id `render-html`(按台账全量重建,与生成时同一内核)。
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import json
|
||||
from typing import Any
|
||||
|
||||
from service.html_page_service import load_html_template, render_html_placeholders, write_html_page
|
||||
@@ -15,6 +14,13 @@ from util.logging_config import get_skill_logger
|
||||
_TEMPLATE_REL = "assets/html/draft-preview.html"
|
||||
|
||||
|
||||
def _log():
|
||||
try:
|
||||
return get_skill_logger()
|
||||
except RuntimeError:
|
||||
return None
|
||||
|
||||
|
||||
def _esc(value: Any) -> str:
|
||||
import html
|
||||
|
||||
@@ -52,20 +58,25 @@ def build_preview_html(draft: dict[str, Any]) -> str:
|
||||
)
|
||||
|
||||
|
||||
def write_preview_for_kernel(*, draft: dict[str, Any]) -> str:
|
||||
def write_preview_for_kernel(*, draft: dict[str, Any], draft_id: int) -> str:
|
||||
"""生成期写预览:按初稿记录编号命名,多次生成互不覆盖。"""
|
||||
html_text = build_preview_html(draft)
|
||||
log = get_skill_logger()
|
||||
path = write_html_page("draft-preview.html", html_text)
|
||||
log.info("draft_preview_written project_no=%s path=%s stage=report", draft.get("project_no"), path)
|
||||
log = _log()
|
||||
path = write_html_page(f"draft-{draft_id}.html", html_text)
|
||||
if log:
|
||||
log.info("draft_preview_written draft_id=%s project_no=%s path=%s stage=report", draft_id, draft.get("project_no"), path)
|
||||
return path
|
||||
|
||||
|
||||
def build_preview_for_draft_id(draft_id: int) -> str:
|
||||
"""按初稿记录 id 重建 HTML 预览(重建入口用)。"""
|
||||
"""按初稿记录 id 从台账全量重建 HTML 预览(与 Word 初稿同构,含决算/成果/占位章节)。"""
|
||||
from db.connection import get_conn
|
||||
from service.draft_service import build_draft_sections, query_pending_projects
|
||||
from service.ledger_service import list_achievements, list_expenses
|
||||
|
||||
log = get_skill_logger()
|
||||
log.info("preview_render_start draft_id=%s stage=render", draft_id)
|
||||
log = _log()
|
||||
if log:
|
||||
log.info("preview_render_start draft_id=%s stage=render", draft_id)
|
||||
conn = get_conn()
|
||||
try:
|
||||
cur = conn.cursor()
|
||||
@@ -78,27 +89,25 @@ def build_preview_for_draft_id(draft_id: int) -> str:
|
||||
finally:
|
||||
conn.close()
|
||||
|
||||
try:
|
||||
completion = json.loads(record.get("completion_json") or "[]")
|
||||
except (TypeError, ValueError):
|
||||
completion = []
|
||||
try:
|
||||
narrative_points = json.loads(record.get("narrative_points_json") or "[]")
|
||||
except (TypeError, ValueError):
|
||||
narrative_points = []
|
||||
|
||||
sections: dict[str, list[str]] = {
|
||||
"完成情况(自动生成)": [f"{row.get('type')}:{row.get('detail')}" for row in completion] or ["指标未配置(W1)。"],
|
||||
"叙事素材要点": [f"· {p.get('point')}(来源:{p.get('source')})" for p in narrative_points] or ["无素材,请补录成果/年度报告摘句。"],
|
||||
"Word 初稿": [f"文件:{record.get('draft_file') or '—'}(output 目录可取)"],
|
||||
project_no = str(record.get("project_no") or "")
|
||||
projects = query_pending_projects(project_no=project_no)
|
||||
project = projects[0] if projects else {
|
||||
"project_no": project_no,
|
||||
"project_name": str(record.get("project_name") or ""),
|
||||
}
|
||||
sections_data = build_draft_sections(
|
||||
project,
|
||||
list_achievements(project_no),
|
||||
list_expenses(project_no),
|
||||
)
|
||||
draft = {
|
||||
"project_no": record.get("project_no"),
|
||||
"project_name": record.get("project_name"),
|
||||
"batch_no": record.get("batch_no"),
|
||||
"sections": sections,
|
||||
"project_no": project_no,
|
||||
"project_name": str(project.get("project_name") or record.get("project_name") or ""),
|
||||
"batch_no": str(record.get("batch_no") or ""),
|
||||
"sections": sections_data["sections"],
|
||||
}
|
||||
html_text = build_preview_html(draft)
|
||||
path = write_html_page(f"draft-{draft_id}.html", html_text)
|
||||
log.info("preview_render_done draft_id=%s path=%s stage=render", draft_id, path)
|
||||
if log:
|
||||
log.info("preview_render_done draft_id=%s path=%s stage=render", draft_id, path)
|
||||
return path
|
||||
|
||||
Reference in New Issue
Block a user