fix: 对照《财务处Skill002》验收整改并升版 v1.0.2
All checks were successful
技能自动化发布 / release (push) Successful in 9s
All checks were successful
技能自动化发布 / release (push) Successful in 9s
- 状态标签:C3 触发且 D 未判 → 待补录,优先级对齐需求 §6.2 - broadcast-monthly 逐项目增量 emit,任务中心可见进行中进度 - progress_reports 回填 project_id;新增 items_json/updated_at;旧库重建式安全迁移(含回归测试) - 简报:TITLE 转义防注入、章节对齐 §10(独立「暂付款/结题提醒」)、页脚逐字统一 - 金标准测试 +17:±10%/20% 阈值恰界、C2 钳位、N2 反例、C3 逐字段、HTML 转义、async+cron 定位守护、迁移回归 - 文档 v1.1(开发文档 + REQUIREMENTS):ERROR:<CODE> <message>、reports_brief、--all-status、skill-detail 表外挂载、C1 level=warn - 落盘验收报告 acceptance-reports/20260924-105401-acceptance.md(338 测试全绿) - 版本 1.0.1 → 1.0.2(constants / SKILL.md / CHANGELOG 三处对齐)
This commit is contained in:
@@ -63,8 +63,10 @@ CREATE TABLE IF NOT EXISTS progress_reports (
|
||||
status_tag TEXT NOT NULL,
|
||||
summary TEXT,
|
||||
suggestions_json TEXT,
|
||||
items_json TEXT,
|
||||
report_file TEXT,
|
||||
created_at INTEGER NOT NULL DEFAULT (unixepoch())
|
||||
created_at INTEGER NOT NULL DEFAULT (unixepoch()),
|
||||
updated_at INTEGER NOT NULL DEFAULT (unixepoch())
|
||||
)
|
||||
"""
|
||||
|
||||
@@ -157,8 +159,10 @@ _PROGRESS_REPORTS_COLUMNS: tuple[dict[str, object], ...] = (
|
||||
),
|
||||
_col("summary", "播报摘要", "三段式播报文本(现状/诊断/建议)。", visible=0, display_type="textarea"),
|
||||
_col("suggestions_json", "建议清单", "建议条目(JSON 数组,默认隐藏)。", visible=0, display_type="textarea"),
|
||||
_col("items_json", "规则明细", "C/D/N 规则命中明细(JSON 数组,默认隐藏)。", visible=0, display_type="textarea"),
|
||||
_col("report_file", "简报文件", "《经费执行简报》HTML 文件路径。", visible=0),
|
||||
_col("created_at", "创建时间", "报告创建时间(Unix 秒级时间戳,自动生成)。"),
|
||||
_col("updated_at", "更新时间", "报告更新时间(Unix 秒级时间戳,自动维护)。"),
|
||||
)
|
||||
|
||||
_ALERT_RULES_COLUMNS: tuple[dict[str, object], ...] = (
|
||||
@@ -194,9 +198,41 @@ def _init_fund_projects_metadata(cursor) -> None:
|
||||
)
|
||||
|
||||
|
||||
def _ensure_progress_reports_columns(cursor) -> None:
|
||||
"""旧库迁移:CREATE TABLE IF NOT EXISTS 不会给已有表加新字段。
|
||||
|
||||
SQLite ``ALTER TABLE ... ADD COLUMN`` 不允许非常量默认值(``unixepoch()``),
|
||||
因此缺 ``items_json`` / ``updated_at`` 时按当前标准 DDL 重建表并拷贝历史数据
|
||||
(progress_reports 为只读播报记录,量级小;无外键,重建安全)。
|
||||
"""
|
||||
cursor.execute("PRAGMA table_info(progress_reports)")
|
||||
cols = [str(row[1]) for row in cursor.fetchall()]
|
||||
target = (
|
||||
"id", "batch_no", "project_id", "project_no", "project_name", "pi_name",
|
||||
"as_of", "spend_rate", "time_progress", "deviation", "status_tag",
|
||||
"summary", "suggestions_json", "items_json", "report_file",
|
||||
"created_at", "updated_at",
|
||||
)
|
||||
if all(name in cols for name in target):
|
||||
return
|
||||
shared = [name for name in cols if name in target and name != "updated_at"]
|
||||
cursor.execute("ALTER TABLE progress_reports RENAME TO _progress_reports_legacy")
|
||||
cursor.execute(_PROGRESS_REPORTS_DDL)
|
||||
if shared:
|
||||
col_list = ", ".join(shared)
|
||||
cursor.execute(
|
||||
f"INSERT INTO progress_reports ({col_list}) "
|
||||
f"SELECT {col_list} FROM _progress_reports_legacy"
|
||||
)
|
||||
cursor.execute("DROP TABLE _progress_reports_legacy") # 连同其旧索引一并删除
|
||||
cursor.execute(_PROGRESS_REPORTS_INDEX)
|
||||
|
||||
|
||||
def _init_progress_reports_metadata(cursor) -> None:
|
||||
cursor.execute(_PROGRESS_REPORTS_DDL)
|
||||
cursor.execute(_PROGRESS_REPORTS_INDEX)
|
||||
_ensure_progress_reports_columns(cursor)
|
||||
init_updated_at_trigger(cursor, "progress_reports")
|
||||
upsert_table_metadata(
|
||||
cursor,
|
||||
table_name="progress_reports",
|
||||
|
||||
Reference in New Issue
Block a user