Files
alert-contract-expiring-hr/scripts/db/migrations.py
taojianmin a3b4092a30 v1.1.1: 升级 AI 续聘建议为 LLM + Playwright RPA 采集 SmartCampus 平台材料
新增:

- scripts/service/platform_collector.py:Playwright RPA(持久化 browser profile 复用登录态),抓合同表(姓名/单位/到期日/剩余天数/预警/建议),逐行点"续聘材料包"按钮下载 PDF/Word 到 data/materials/

- scripts/service/material_parser.py:PDF/Word 文本提取(pypdf → pdf2image + pytesseract OCR 扫描件兜底;python-docx 抽 docx;antiword 兜底 .doc)

- scripts/service/llm_decision.py:AI 决策统一入口(优先调宿主 jiangchang_skill_core.llm_manager.call_llm_json;本地降级到规则版;输出 decision_source ∈ {llm, rules, rules_no_materials})

- scripts/db/migrations.py:idempotent ALTER/CREATE,建 materials_content 表 + renewal_tasks 加 decision_source / materials_summary 列

修改:

- scripts/db/connection.py:init_db() 自动调 apply_all() 应用 v1.1.1 迁移

- scripts/db/repository.py:加 insert_material / list_materials_for_contract / list_pending_materials / summarize_materials / get_task_full

- scripts/service/task_generator.py:AI 决策统一改为调 llm_decision.decide_suggestion(materials_summary=...);reason 文案加「已结合材料包(X 份文件,Y 字 / 待解析)综合判断:...」

- scripts/service/html_renderer.py:ctx 加 DECISION_SOURCE(LLM 推理 / 本地规则 / 本地规则(无材料))+ MATERIALS_COUNT

- scripts/templates/task.html.j2:footer 加 "AI 建议来源:{{DECISION_SOURCE}} · 已审阅材料 {{MATERIALS_COUNT}} 份"

- scripts/cli/app.py:新增 2 个 CLI(collect-from-platform / parse-materials);现有 9 个不动

- requirements.txt:playwright / pypdf / python-docx / pdf2image / pytesseract / Pillow

- .env.example:SMARTCAMPUS_BASE_URL / SMARTCAMPUS_PROFILE_DIR / MATERIALS_DOWNLOAD_DIR / OCR_LANG / LLM_MODEL_NAME / LLM_API_BASE_URL / LLM_API_TOKEN

- SKILL.md:version 1.1.0 → 1.1.1;用户意图路由表加 2 行;新增「数据来源」段(三层来源 + AI 决策透明化)

- README.md:使用前要准备 → 加 playwright install chromium 步骤

- CHANGELOG.md:v1.1.1 条目

- scripts/util/constants.py:SKILL_VERSION 1.1.0 → 1.1.1

本地验证:11 个 CLI 全部 exit 0;decision_source=rules;reason 含「已结合材料包(6 份文件,待解析)」;HTML footer 含决策来源。

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-14 15:01:24 +08:00

56 lines
2.0 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""增量迁移:在 init_db 之外支持 idempotent ALTER/CREATE。
v1.1.1 新增:
- materials_content 表(材料包 PDF/Word 解析缓存)
- renewal_tasks.decision_source 列(AI 建议来源透明化)
- renewal_tasks.materials_summary 列(材料摘要缓存,便于离线渲染)
"""
from __future__ import annotations
import sqlite3
def _column_exists(conn: sqlite3.Connection, table: str, column: str) -> bool:
rows = conn.execute(f"PRAGMA table_info({table})").fetchall()
return any(r["name"] == column for r in rows)
def ensure_materials_content_schema(conn: sqlite3.Connection) -> None:
"""创建 materials_content 表(如不存在)。幂等。"""
conn.execute(
"""
CREATE TABLE IF NOT EXISTS materials_content (
contract_id TEXT NOT NULL,
file_name TEXT NOT NULL,
file_path TEXT NOT NULL,
extracted_text TEXT,
parse_method TEXT,
parsed_at TEXT NOT NULL,
PRIMARY KEY (contract_id, file_name),
FOREIGN KEY (contract_id) REFERENCES contracts(contract_id)
);
"""
)
conn.execute(
"CREATE INDEX IF NOT EXISTS idx_materials_contract "
"ON materials_content(contract_id);"
)
def ensure_renewal_tasks_columns(conn: sqlite3.Connection) -> None:
"""为 renewal_tasks 加 decision_source / materials_summary 列(如不存在)。"""
if not _column_exists(conn, "renewal_tasks", "decision_source"):
conn.execute(
"ALTER TABLE renewal_tasks ADD COLUMN decision_source TEXT DEFAULT 'rules';"
)
if not _column_exists(conn, "renewal_tasks", "materials_summary"):
conn.execute(
"ALTER TABLE renewal_tasks ADD COLUMN materials_summary TEXT DEFAULT '';"
)
def apply_all(conn: sqlite3.Connection) -> None:
"""应用全部 v1.1.1 迁移。"""
ensure_materials_content_schema(conn)
ensure_renewal_tasks_columns(conn)