Files
alert-contract-expiring-hr/CHANGELOG.md
taojianmin 6437d6e414
All checks were successful
技能自动化发布 / release (push) Successful in 7s
v1.1.6: 按 skill-template human_verification 设计模式重构 RPA
按 skill-template examples/real_browser_rpa 设计模式重构 platform_collector,
把 v1.1.5 修复的硬编码等待时间统一抽到 constants.py,并补上手工登录 fallback
和结构化错误码。

核心改动:
- constants.py 新增 24 个 RPA 常量(HUMAN_WAIT_TIMEOUT=180 / HUMAN_POLL_INTERVAL=2.0 /
  DEFAULT_PAGE_TIMEOUT_MS=15s / GOTO_TIMEOUT_MS=60s / SPA_LOGIN_* / TABLE_* /
  SIDEBAR_LINK_TIMEOUT_MS 等),与 skill-template human_verification 同名常量对齐
- platform_collector 重构:
  * 新增 RPAError / LoginTimeoutError (ERROR:LOGIN_TIMEOUT) /
    MissingBrowserError (ERROR:MISSING_BROWSER) / TableNotFoundError (ERROR:TABLE_NOT_FOUND)
  * 新增 _is_logged_in / _wait_for_manual_login(轮询 + 180s 兜底,与
    skill-template task_rpa.py::_ensure_logged_in 对齐)
  * _fill_spa_login 自动 fill 失败时 → 自动 fallback _wait_for_manual_login
    (仅 --show-browser 模式;headless 模式抛 LoginTimeoutError 退出码 2)
  * 所有 wait_for_timeout / wait_for_selector timeout 替换为常量
  * collect_all() 加 human_wait_timeout 参数(CLI 透传)
  * page.set_default_timeout(DEFAULT_PAGE_TIMEOUT_MS) 覆盖 Playwright 默认 15s
- app.py cmd_collect_platform:
  * 捕获 RPAError → JSON 输出 {error: e.code, detail: ...} + exit 2
  * 新增 --human-wait-timeout N flag
- requirements.txt:删除违规的 playwright>=1.40.0(playwright 由宿主 jiangchang_skill_core
  runtime 提供,文件顶部注释已声明)
- .env.example:新增 HUMAN_WAIT_TIMEOUT / RPA_PAGE_TIMEOUT_MS / RPA_GOTO_TIMEOUT_MS
  覆盖项
- tests/run_tests.py:新增 7 个 platform_collector 纯函数测试
  (_gen_contract_id × 2 / _normalize_date × 2 / _parse_days × 2 / _parse_alert)
- SKILL.md version 1.1.5 → 1.1.6;CHANGELOG.md 加 1.1.6 条目

测试:28/28 通过(21 原有 + 7 新增)
POLICY-RELEASE-001:SKILL.md=1.1.6 == CHANGELOG=1.1.6 == SKILL_VERSION=1.1.6

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

107 lines
9.2 KiB
Markdown
Raw Permalink 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.
# Changelog
本文件对应技能市场 **「更新日志」** Tab。
## 1.1.6
- **RPA 重构(按 skill-template `examples/real_browser_rpa` 设计模式)**
- **超时参数统一抽到 `constants.py`**:新增 `HUMAN_WAIT_TIMEOUT=180` / `HUMAN_POLL_INTERVAL=2.0` / `DEFAULT_PAGE_TIMEOUT_MS=15s` / `GOTO_TIMEOUT_MS=60s` / `SPA_LOGIN_*` / `TABLE_*` / `SIDEBAR_LINK_TIMEOUT_MS` 等 24 个常量(与 skill-template human_verification 同名常量对齐)
- **新增手工登录 fallback**:自动 fill demo/123456 失败时自动切到 `_wait_for_manual_login`(轮询 `_is_logged_in` 每 2s 一次,最多 `HUMAN_WAIT_TIMEOUT` 秒,超时抛 `LoginTimeoutError`),给用户手工登录机会(与 skill-template `task_rpa.py::_ensure_logged_in` 设计对齐)
- **结构化错误码**:`RPAError` 基类 + `LoginTimeoutError`(`ERROR:LOGIN_TIMEOUT`)/ `MissingBrowserError`(`ERROR:MISSING_BROWSER`)/ `TableNotFoundError`(`ERROR:TABLE_NOT_FOUND`),供 CLI/宿主解析
- **CLI 新增 `--human-wait-timeout N` flag**
- **`_goto` 默认 timeout 改用 `GOTO_TIMEOUT_MS=60s`**;新增 `page.set_default_timeout(DEFAULT_PAGE_TIMEOUT_MS)`
- **依赖清单修复**:删除 `requirements.txt` 中违规的 `playwright>=1.40.0`(playwright 由宿主 `jiangchang_skill_core` runtime 提供,文件顶部注释已声明)
- **环境变量**:`.env.example` 新增 `HUMAN_WAIT_TIMEOUT` / `RPA_PAGE_TIMEOUT_MS` / `RPA_GOTO_TIMEOUT_MS` 覆盖项
- **保留 v1.1.5 自动 fill 优势**:sandbox demo/123456 已知凭据自动登录(生产环境切换无 demo 凭据时自动 fallback 手工)
## 1.1.5
- **platform_collector RPA 采集修复(登录等待时间太短 → 拿不到数据)**
- `_fill_spa_login`:settle_ms 默认 0 → **4000ms**,等 username input timeout 10s → **20s**,wait_for_url(URL 真的跳离 login)20s → **30s**;URL 判断增加 `/auth/` 路径(覆盖 SPA 中间态)
- `_goto(SPA_LOGIN_URL)` 后:wait 1500ms → **3000ms**(SPA hydration)
- 登录按钮 click 后:新增 `wait_for_timeout(2000)`,等 SPA token 写入 cookie + 路由稳定再 goto home(之前直接打断 pending 跳转)
- 步骤 4 改为 retry 循环(最多 2 次),检查 `/app/` in url 且不含 `/login` 才退出
- **采集流程健壮性修复**
- 步骤 5 侧边栏 link 等待:15s → **30s**(sandbox mock 慢启动不 fallback 到 pushState)
- 步骤 5.5 `page.reload()` timeout:20s → **30s**
- **新增 5.6**:刷新后检查 URL,若被踢回 `/login` 则重新登录一次(之前刷新丢 session 后还继续往后走,导致 40s 找不到表格)
- 「续聘材料包」按钮 click 后:wait 1500ms → **3000ms**(卡片动画慢导致文本抓不全)
- 抽出 `_dump_page(page, path, label)` helper,**自动 `mkdir(parents=True)`**,修复 5 处 dump 路径父目录可能不存在的静默失败
## 1.1.4
- **多平台发布声明**:SKILL.md `metadata.openclaw.brands` 新增 `jiangchang` + `huashang`,发布后同步挂匠厂主站与华商 OEM 市场。CI 会幂等补写 `skill_market_relations` 两行(**只补不删**)。
## 1.1.3
- **版本对齐修复**:v1.1.2 tag(commit `4af2b4f`)发布时 `SKILL.md version` / `scripts/util/constants.py SKILL_VERSION` 未同步升级(仍为 1.1.1),本次发布将 manifest 升至 1.1.3 并与代码现状对齐
- **内容同 v1.1.2**:sandbox 卡片采集功能(详见 1.1.2 条目)
> **说明**:v1.1.2 与 v1.1.3 实质内容相同(均含 sandbox 卡片采集)。v1.1.2 tag 视为已发布但 manifest 错位的历史遗留;v1.1.3 为首次 manifest 版本号与代码对齐的 release tag。
## 1.1.2
- **sandbox 卡片采集**:表格 10 列(工号/姓名/单位/岗位/合同类型/起止日期/剩余天数/预警/建议/材料包按钮),进入 hr/contracts 页面后 `page.reload()` 刷新触发 mock 数据加载
- **「续聘材料包」按钮行为**:不触发浏览器 download event,而是展开页面下方「续聘准备任务书」+「单位清单」卡片(含 checklist + 近三年考核表)。RPA 改为抓卡片 inner_text 存 `materials_content`(parse_method='sandbox_card')
- **卡片文本解析进 performance_records**:新增 `repository.parse_sandbox_card_performance`(双模式正则:行格式 `2024\t称职` + 叙述式 `2024年:等次「称职」`)+ `repository.upsert_performance_record`(等次→分数:优秀=90 称职=75 基本称职=60 不称职=30)
- **contract_id 改用工号**(稳定,不随姓名变化):`_gen_contract_id(emp_id, end_date)`
- **实测**(sandbox 3 合同):
| contract_id | 教师 | 解析 perf 条数 | AI 决策 |
|---|---|---|---|
| RPA-T20190033-20260415 | 钱实验 | 4 | observe |
| RPA-T20200055-20260630 | 孙助理 | 6 | observe |
| RPA-T20180021-20260831 | 王明远 | 6 | observe |
## 1.1.1
- **AI 续聘建议升级**:本地规则版 → LLM 优先 + 规则降级
- 新增 `scripts/service/llm_decision.py`:调宿主 `jiangchang_skill_core.llm_manager.call_llm_json`(prompt 含教师信息 + 业绩 + 材料文本摘要),输出 `decision_source ∈ {llm, rules, rules_no_materials}`
- `scripts/service/task_generator.py`:AI 决策统一改为调 `llm_decision.decide_suggestion`;降级版 reason 文案加「已结合材料包(含 X 个文件,Y 字内容)」前缀
- **SmartCampus HR 平台 RPA 采集(新增)**
- 新增 `scripts/service/platform_collector.py`:Playwright 持久化 browser profile 复用登录态 → 抓合同表(姓名/单位/到期日/剩余天数/预警/建议) → 点"续聘材料包"按钮下载 PDF/Word → 落库
- 平台:`https://sandbox.jc2009.com/industries/campus/smartcampus/app/hr/contracts`
- 新增 CLI `collect-from-platform [--limit N] [--show-browser]`
- **当前 sandbox mock 未部署「续聘材料包」按钮**,RPA 仅采集 6 列台账;材料下载代码已就绪,sandbox 补按钮后自动生效
- 实测:headless 模式 + profile cookie 复用,抓 3 行合同(钱实验/孙助理/王明远)→ 落 `contracts` 表
- **材料包 PDF/Word 文本提取(新增)**
- 新增 `scripts/service/material_parser.py`:pypdf → pdf2image + pytesseract OCR(扫描件兜底);python-docx 抽 docx;antiword 兜底 .doc
- 新增 CLI `parse-materials [--contract-id C001]`
- **数据模型扩展**
- 新增表 `materials_content`(contract_id / file_name / file_path / extracted_text / parse_method / parsed_at)
- `renewal_tasks` 加列:`decision_source` / `materials_summary`
- 新增 `scripts/db/migrations.py`:idempotent ALTER/CREATE,`init-db` 自动应用
- **HTML 任务书升级**
- `scripts/templates/task.html.j2` footer 加 "AI 建议来源:{{DECISION_SOURCE}} · 已审阅材料 {{MATERIALS_COUNT}} 份"
- `scripts/service/html_renderer.py` 模板 ctx 加 `DECISION_SOURCE` / `MATERIALS_COUNT`
- **CLI 列表**:v1.1.0 的 9 个 + 2 个新增 = **11 个**
- 新增:`collect-from-platform` / `parse-materials`
- **依赖新增**(`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
- **SKILL.md**:version 1.1.0 → 1.1.1;用户意图路由表加 2 行;加「数据来源」段说明三层来源 + AI 决策来源透明化
## 1.1.0
- 实现核心业务逻辑(9 个 CLI 命令全部可运行)
- 新增 `scripts/cli/app.py`:argparse 子命令分发
- 新增 `scripts/util/{constants,date_util,runtime_paths,logging_setup}.py`
- 新增 `scripts/db/{connection,seed_data,repository}.py`:SQLite + 5 张表 + 50 份样例合同 + 150 条业绩记录
- 新增 `scripts/service/scanner.py`:扫描核心(90/60/30 三级预警 + 写 alerts + 生成任务)
- 新增 `scripts/service/task_generator.py`:规则版 AI 续聘建议(师德/考核/趋势三规则)
- 新增 `scripts/service/dispatcher.py`:按单位/月份派发 payload(dry-run 模式)
- 新增 `scripts/service/html_renderer.py`:Jinja2 任务书 HTML 渲染(无 jinja2 时降级到 str.replace)
- 新增 `scripts/templates/task.html.j2`:任务书模板(基于 assets/html/example-report.html)
- 新增 `examples/{contracts_sample,performance_sample}.csv`:本地样例数据
- `scripts/main.py`:重写为降级模式(jiangchang_skill_core 可选)
- `.env.example`:新增 `DB_PATH` / `HTML_OUTPUT_DIR` / `JIANGCHANG_DATA_DIR`
- 验收:本地 `python scripts/main.py <cmd>` 9 个命令全部 exit code = 0
## 1.0.1
- 初版:基于匠厂 skill-template 主仓 v1.0.108 派生
- 实现核心业务:合同到期智能预警与续聘辅助(每日定时扫描 + 三级预警 + 个人版任务书 + 单位版清单 + 自动抄送)
- 输出形态:合同台账表状态更新 + 预警记录表 + 个人版 HTML 任务书 + 单位版 PDF 清单 + 派发日志
- 预期提效:因合同逾期未续签导致的劳动纠纷降为 0;人事处年终集中突击签合同的工作量减少 60%
- 业务行生命周期:可预警 → 预警中 → 已续签 / 已驳回 / 已过期
- 占位说明:本版仅完成骨架与文档,业务实现细节(`scripts/` 下 Python 模块、人事系统 API 对接、定时调度)由开发者后续按 `development/REQUIREMENTS.md` 补全