Files
taojianmin e2b45d690e v1.0.1: 合同到期智能预警与续聘辅助 - 初版骨架
基于匠厂 skill-template 主仓 v1.0.108 派生的业务技能。

核心业务:
- 每日凌晨定时扫描全校教职工合同电子台账
- 距到期日 90 / 60 / 30 天分级预警(黄 / 橙 / 红)
- 自动生成个人版《续聘准备任务书》与单位版《本月到期人员清单》
- 30 天红色预警自动抄送分管校领导

输出形态:
- 个人版 HTML 任务书 + 单位版 PDF 清单 + 三级预警通知

预期提效:因合同逾期未续签导致的劳动纠纷降为 0;人事处年终集中突击签合同的工作量减少 60%。

业务行生命周期:可续聘 → 预警中(黄 / 橙 / 红)→ 已续签 / 已驳回 / 已过期

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

221 lines
11 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.
# 合同到期智能预警与续聘辅助 — 技能需求文档
> 派生自匠厂 skill-template 主仓 `development/REQUIREMENTS.md`,对应规格书第 4.2 节「🟡 人事处 Skill 002 —— 合同到期"智能预警与续聘辅助"」。
---
## 0. 技能标识
- **拟定 slug(英文)**:`alert-contract-expiring-hr`
- **中文 name**:合同到期智能预警与续聘辅助
- **中文 description(一句话)**:每日凌晨扫描全校教职工合同电子台账,对距离到期日 90/60/30 天的合同分级预警,并自动生成《续聘准备任务书》和《本月合同到期人员清单》
- **account-manager platform_key(如有)**:N/A
- **命名形态**:标准型(动词-名词-部门缩写)
- **目标 OEM 市场 `brands`(可选)**:未写则发布后仅挂匠厂(`jiangchang`)
- **网页 RPA(如有)— 登录策略**:**不适用**(本技能不涉及网页 RPA)
## 0.1 宿主入口定位(必填)
| 主能力(Action id / CLI) | 对话 | 数据管理 | 定时 | 教程章节 | 不挂理由 |
|---------------------------|------|----------|------|----------|----------|
| `health` / `version` / `config-path` | 挂 | 不挂 | 不挂 | 入口二 | 默认必备 |
| `scan-expiring-contracts` | 挂 | toolbar(合同台账) | 挂(每日凌晨 02:00) | 入口一/入口二/入口三 | 真用 cron |
| `generate-renewal-task` | 挂 | row(合同台账) | 不挂 | 入口一/入口二 | sync |
| `dispatch-task-notice` | 挂 | batch(合同台账/预警记录) | 不挂 | 入口一/入口二 | sync |
| `mark-contract-renewed` | 不挂 | row(合同台账) | 不挂 | 入口一 | 写状态,不需 Agent |
| `render-html` | 挂 | skill-detail | 不挂 | 入口二 | HTML 报告预览 |
### 0.1.1 用户市场文档(与入口表一致)
- `README.md`(说明 Tab):能力 / 场景 / 边界
- `TUTORIAL.md`(教程 Tab):覆盖三入口(数据管理 / 对话 / 定时)
- 入口三已写「已启用定时扫描」,与本表一致
## 0.2 AI + RPA 协作与授权边界
### Agent 设计
- 用户会怎样描述本任务:「张老师的合同什么时候到期?」「本月一共要办多少份续聘?」「帮我扫描一下全校合同到期」
- 支持的用户意图 → Action 映射:
- 触发扫描 → `scan-expiring-contracts`
- 给某教师生成任务书 → `generate-renewal-task`
- 下发单位清单 → `dispatch-task-notice`
- 标记已续签 → `mark-contract-renewed`
- 预览任务书 → `render-html`
- 每种意图必须提取的参数:`contract_id` / `unit_id` / `month` / `material_id`
- 缺少参数时必须追问:「请告诉我教师姓名 / 工号 / 合同 ID」
- 哪些动作必须先展示对象、数量和影响,再取得明确确认:
- `mark-contract-renewed` 状态变更(确认行 + 续签材料)
- `dispatch-task-notice` 提示将推送至 N 位人事秘书
- Agent 最终如何解释成功、部分成功、失败、等待人工和停止:
- 成功:「已扫描全校 X 份合同,发现 Y 份 90 天内到期,其中 Z 份 30 天红色预警」
- 部分成功:「已完成扫描,但 N 位教师的考核数据缺失,已标记为数据待补」
- 失败:「人事系统 API 调用失败(错误码 XXX),已停止扫描并保留上一次的预警记录」
### 授权与平台边界
- 目标浏览器 / 桌面软件 / 手机 App:**N/A**(本技能不涉及 RPA)
- 账号、设备、数据和业务权限由谁授权:人事处统一授权;考核 / 师德数据由党委教师工作部统一开通
- 是否有获得授权的官方 API:人事系统 API(合同台账)、党委教师工作部 API(考核 + 师德)、企业微信推送 API(教师与人事秘书通讯)
- 目标平台规则、合同或客户约定中的自动化边界:不得越权读取非本校教职工数据;不得向教师个人透露 AI 续聘建议(仅单位版清单展示)
- 明确禁止的实现路线:**所有破解 / 反编译 / 逆向 / 私有协议 / 抓包拼隐藏接口 / Hook 或注入 / 验证码破解 / 设备指纹伪造 / 自动换号 均禁止**
- 正常界面无法闭环时的上报与停止条件:人事系统 API 不可用超过 60 分钟 → 停止扫描并向人事处合同管理员上报
### RPA 风控设计
- 执行端:**N/A**
## 0.3 业务行生命周期
本技能对「合同台账」表中的每一份合同,遵守 `references/WORK_ITEM_STATUS.md` 角色约束:
| 角色 | 本技能状态值 | 说明 |
|------|--------------|------|
| 可操作(operable) | 可续聘 | 默认唯一可被 `scan-expiring-contracts` 捞起 |
| 进行中(in_progress) | 预警中(黄/橙/红) | 抢占后、结束前 |
| 成功类终态 | 已续签 | 人事处确认续签材料齐全 |
| 失败类终态 | 已驳回 / 已过期 | 默认不可再处理;失败原因字段:驳回理由 / 过期说明 |
| 跳过类终态 | 已撤回 | 教师或单位主动撤回续聘申请 |
> 重做靠人工将"已续签 / 已驳回 / 已过期"改回"可续聘",不靠 AI 自动覆盖。
---
## 1. 文档目标
本文档用于明确 `alert-contract-expiring-hr` 的研发范围、交付标准、依赖关系和验收要求。
## 2. 业务背景
当前用户在「全校教职工合同管理」场景中:
- **现状**:人事处合同管理员每月需人工翻查 1000+ 份合同,年度考核结果出后才仓促通知续签
- **痛点**:
- **效率低**:1 份合同的预警与材料准备需人工 2~3 小时
- **容易遗漏**:试用期合同、跨年度合同尤其容易漏检
- **劳动纠纷风险**:合同逾期未续签导致劳动争议
- **年终突击**:每年 12 月人事处集中突击签合同,工作量暴增
- **目标**:自动完成「合同到期扫描 + 三级预警 + 任务书预填 + 单位清单派发」,输出「个人版任务书 + 单位版清单 + 预警通知」
## 3. 开发目标
- 解析合同电子台账(含合同类型、起止日期、聘任岗位、试用期)
- 拉取教师近 3 年年度考核结果 + 师德师风考评记录
- 按距到期日 90/60/30 天分级,触发三级预警
- 自动生成个人版《续聘准备任务书》(含业绩摘要 + AI 续聘建议 + 材料清单)
- 自动生成单位版《本月合同到期人员清单及续聘建议》
- 30 天红色预警自动抄送分管校领导
- 写入业务表(合同台账 / 预警记录 / 续聘任务 / 派发日志)
- 支持失败可诊断(稳定错误码 + 中文 message)
- 完成 CLI 入口与 `health` / `version` / `init-db` 最小可运行验证
- 完成正式环境发布与安装验证
## 4. 功能范围
### 必须实现
- 支持 `python scripts/main.py health` / `version` / `config-path` / `init-db`
- 支持 `python scripts/main.py scan-expiring-contracts --thresholds 90,60,30`(async)
- 支持 `python scripts/main.py generate-renewal-task --contract-id <id>`
- 支持 `python scripts/main.py dispatch-task-notice --unit-id <id> --month <YYYY-MM>`
- 支持 `python scripts/main.py mark-contract-renewed --contract-id <id> --material-id <id>`
- 支持 `python scripts/main.py render-html --task-id <id>`
- 完成 §0.1 入口定位表,并按表落实已挂入口
- 定时任务接入宿主 `cron` 调度系统
### 可后续扩展
- 试用期合同不通过的特殊处理流程
- 续聘材料 OCR 自动归档
- 多语言合同(中英双语)支持
## 5. 非功能要求
- 目录结构必须符合当前 `skill-template` 规范
- 入口必须统一为 `scripts/main.py`
- 用户市场四 Tab 写在根 `README.md` / `TUTORIAL.md` / `DEMO.md` / `CHANGELOG.md`
- 输出格式应尽量机读友好;错误前缀统一为 `ERROR:`
- Windows 环境下需保证 UTF-8 输出兼容
- 必须具备基本日志能力;敏感字段脱敏(教师身份证号、银行卡号等不写入日志)
- 全校 1000+ 份合同扫描耗时 ≤ 2 分钟
## 6. 输入输出要求
### 输入
- `contract_id`:合同主键(必填,字符串)
- `unit_id`:二级单位主键(仅 `dispatch-task-notice` 必填)
- `month`:月份(仅 `dispatch-task-notice` 必填,格式 YYYY-MM)
- `material_id`:续签材料 ID(仅 `mark-contract-renewed` 必填)
- `thresholds`:扫描阈值(默认 `90,60,30`,可配置)
- 依赖系统:
- 人事系统 API:合同电子台账
- 党委教师工作部 API:考核 + 师德数据
- 企业微信推送 API:教师与人事秘书通讯
- 环境变量(`.env`):
- `HR_API_BASE_URL`:人事系统 API 入口
- `HR_API_TOKEN`:调用凭证
- `TEACHER_AFFAIRS_API_BASE_URL`:党委教师工作部 API 入口
- `TEACHER_AFFAIRS_API_TOKEN`:调用凭证
- `WECOM_API_BASE_URL`:企业微信 API 入口
- `WECOM_API_TOKEN`:调用凭证
### 输出
- 成功结果:`scan-expiring-contracts` 返回结构化 JSON `{scanned_count, alert_yellow_count, alert_orange_count, alert_red_count, generated_task_count}`
- 错误输出:`ERROR:` 稳定码 + 中文 message(如 `ERROR: HR_API_TIMEOUT 合同台账读取超时`)
- 数据库记录:写入 `合同台账` / `预警记录` / `续聘任务` / `派发日志`
- HTML 报告:个人版《续聘准备任务书》落到 `html/`
## 7. 依赖的兄弟技能或外部系统
### 兄弟技能依赖
- 无强制依赖
### 外部系统依赖
- **人事系统 API**(合同电子台账):必须
- **党委教师工作部 API**(考核 + 师德):必须
- **企业微信推送 API**:必须
### Python 包依赖(requirements.txt)
- HTTP 请求:`requests>=2.31.0,<3`
- 日期处理:`python-dateutil>=2.8.0,<3`
- HTML 渲染:`jinja2>=3.1.0,<4`
- `jiangchang-platform-kit`、`playwright` 等公共能力由宿主共享 runtime 提供
## 8. 不在本次范围内的内容
- 本次不实现试用期合同不通过的自动化处分流程
- 本次不集成续聘材料 OCR 识别
- 本次不做合同电子签署(仍走线下 OA 流程)
- 本次不兼容旧模板历史结构
## 9. 验收标准
- 代码结构符合模板规范;`SKILL.md` slug 与 `constants.SKILL_SLUG` 一致
- `health` / `version` / `config-path` / `init-db` 命令执行正常
- `scan-expiring-contracts` 在含 1000+ 份合同的样例库中完成一次完整扫描,耗时 ≤ 2 分钟
- 业务表写入和查询符合 `references/SCHEMA.md`
- 30 天红色预警自动抄送分管校领导功能验证通过
- `SKILL.md` 的 `developer_ids` 已配置为开发者本人匠厂用户 ID
- 已人工核验授权与技术路线:无破解、逆向、私有协议、验证码绕过、Hook / 注入、自动换号
- 安装后按 §0.1 入口定位表完成宿主多入口验收
- cron 每日定时扫描稳定运行 7 天无故障
## 10. 开发注意事项
- 只修改当前 skill 仓库,不要改动无关兄弟项目
- 人事系统 API 不可用时停止并上报;不得擅自改走破解或绕过鉴权的路线
- 教师身份证号、银行卡号等敏感字段严禁写入日志
- 不得向教师个人透露 AI 续聘建议(仅单位版清单展示)
- `cli` 只做参数解析;核心逻辑在 `service`;兄弟 skill 调用集中封装
## 11. 变更记录
| 日期 | 版本 | 变更人 | 变更内容 |
|------|------|--------|----------|
| 2026-09-14 | v1.0.1 | 匠厂 | 初版需求文档,骨架就位 |