Files
track-fund-progress-default/development/REQUIREMENTS.md
chenfuqiang f90f742c1e
All checks were successful
技能自动化发布 / release (push) Successful in 9s
fix: 对照《财务处Skill002》验收整改并升版 v1.0.2
- 状态标签: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 三处对齐)
2026-09-24 17:19:30 +08:00

134 lines
8.4 KiB
Markdown
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.
# REQUIREMENTS —— 项目经费进度播报助手(track-fund-progress-default)
> 需求来源:《核心建设内容:各部门"Skill"深度需求规格书》§4.1 财务处 Skill 002(项目经费"智能进度播报")。
> 详细设计见工作区《财务处Skill002-项目经费智能进度播报-开发文档.md》;本文是该技能仓内的需求与验收主文档。
> 定位原则:辅助非决策、审慎非激进 —— 数字全部来自本地确定性计算,播报文本由规则模板生成;进度诊断仅作提醒。
## 0. 技能标识
- 拟定 slug:`track-fund-progress-default`
- 中文 name:项目经费进度播报助手
- 中文 description:高校项目经费执行监测与播报:按项目台账自动计算实际支出率与序时进度,识别严重滞后/支出异常偏快,生成三段式播报摘要、暂付款冲销与结题报销提醒,支持月度定时播报并输出《经费执行简报》。
- account-manager platform_key:不适用(无网页 RPA,无账号下发)
- 命名形态:标准型+scope(track ∈ 动词白名单;default ∈ scope 白名单;4 段 27 字符)
- 网页 RPA 登录策略:`not_needed`(无浏览器自动化)
## 0.1 宿主入口定位
| 主能力(Action id / CLI) | 对话 | 数据管理 | 定时 | 教程章节 | 不挂理由 |
|---------------------------|------|----------|------|----------|----------|
| `broadcast-progress`(broadcast,sync) | 挂 | toolbar(bind fund_projects,表单) | 不挂 | 入口一/入口二 | 即时播报由人发起;无人值守走月度播报 |
| `broadcast-monthly`(broadcast-monthly,**async**) | 挂 | 不挂 | **挂 cron** | 入口二/入口三 | 月度批量播报,任务中心可见进度 |
| `import-projects` | 挂 | 不挂 | 不挂 | 入口二 | 批量 JSON 导入走对话更直观 |
| `add-project` | 不挂 | toolbar(fund_projects,表单) | 不挂 | 入口一 | 结构化录入,表单更稳 |
| `list-projects` | 挂 | 仅展示表 | 不挂 | 入口二 | 台账日常在数据管理看 |
| `list-reports` / `stats` | 挂 | 不挂 | 不挂 | 入口二 | 查询类,对话即达 |
| `render-html` | 挂 | toolbar(bind progress_reports)+ skill-detail | 不挂 | 入口一/入口二 | 报告重建 |
| `view-rules` | 挂 | 仅展示表 | 不挂 | 入口二 | 阈值日常只读 |
| `set-rule` | 不挂 | row(alert_rules,预填 rule_key) | 不挂 | 入口一 | 管理员在表上改值更直接 |
| `health` / `version` / `config-path` | 不挂 | 不挂 | 不挂 | N/A | 运维诊断,仅 skill-detail |
定时挂载说明:`broadcast-monthly` 为 async + agent + cron,缺省参数(全部在研项目)可安全无人值守,无不可逆副作用;对应规格书"每月 5 号 9:00 自动执行"场景,具体时刻由宿主定时任务配置。
表外挂载说明:`stats`、`view-rules` 另挂 skill-detail(技能详情页运维查看),对话/数据管理挂载以本表为准;`broadcast` 支持可选 `--all-status`(缺省仅处理"在研")。
## 0.2 AI + RPA 协作与授权边界
- 本技能**无 RPA**:不启动浏览器、不操作桌面/手机、不调用外部 HTTP。
- 台账数据由用户录入/导入;Agent 不得编造金额与日期。
- 目标系统:无外部系统;全部计算在本地 SQLite。
- 财务系统直连、企业微信推送、PDF 导出、大模型润色均为后续扩展。
## 0.3 业务行生命周期
不适用:播报为只读计算 + 本地记录写入,无"处理队列"状态机。
## 1. 文档目标
明确 `track-fund-progress-default` 的研发范围、交付标准与验收要求。
## 2. 业务背景
横向/纵向项目经费"重立项、轻执行",PI 不知道执行率,年底突击花钱或结题沉淀;财务处靠电话催报。需要开发 `track-fund-progress-default`:按台账自动计算执行率与序时进度、诊断偏差、生成三段式播报与简报,月度定时播报,减少人工催报。
## 3. 开发目标
- 台账维护(upsert/批量导入/表格编辑)与预警阈值配置
- 三步计算内核:执行率(C1-C3)、偏差诊断(D1-D3)、提醒与三段式播报(N1-N3)
- 播报结果 JSON + `progress_reports` 落库 + 《经费执行简报》HTML + 月度汇总简报
- 月度播报 async Action(cron 挂载,任务中心进度)
- 失败可诊断(稳定错误码 `ERROR:<CODE> <message>` + 统一日志)
## 4. 功能范围
### 必须实现
- `health` / `version` / `init-db` / `config-path`(模板基座;`run` 为模板演示占位)
- `add-project` / `import-projects` / `list-projects`
- `broadcast`(主命令,sync)/ `broadcast-monthly`(async + cron)
- `list-reports` / `show-report` / `render-html` / `view-rules` / `set-rule` / `stats`
- 业务表 3 张 + `_jiangchang_*` 中文展示元数据 + 预警规则种子(4 条)
- `assets/actions.json` 按 §0.1 定位表声明
### 可后续扩展
- 财务系统直连自动刷新台账、企业微信图文卡片推送、PDF 建议函、大模型润色、科目级分析、多人项目聚合
## 5. 非功能要求
- 目录结构符合 `skill-template` 规范;入口统一 `scripts/main.py`
- 单文件 < 900 行;UTF-8 without BOM;Windows UTF-8 输出兼容
- 机读输出 JSON;错误前缀 `ERROR:`;主命令 `task_start`/`task_failed` 日志齐全,无敏感明文
- 月度播报逐项目 `emit` 进度;金额 round(x,4);不存证件号/银行卡号
- 测试离线可过(无网络、无浏览器)
## 6. 输入输出要求
### 输入
- 台账字段(camelCase/snake_case/中文键兼容):projectNo、projectName、projectType、piName、department、totalApproved、totalReceived、totalSpent、frozenAmount、frozenSince、startDate、endDate、status
- 播报参数:`--project-no`、`--pi`、`--as-of`(缺省今天)
### 输出
- 成功:stdout JSON(`ok/batch_no/as_of/count/status_counts/brief_file/reports_brief`)
- 失败:`ERROR:<CODE> <中文 message>`(`CODE ∈ NO_PROJECTS|PROJECT_INVALID|REPORT_NOT_FOUND|RULE_INVALID|ENTITLEMENT_DENIED|QUERY_FAILED`)
- 落库:`progress_reports`(含 `project_id` 关联与 `items_json` 规则明细);文件:`html/report-{id}.html`、`html/brief-{batch}.html`
## 7. 依赖的兄弟技能或外部系统
- 无兄弟技能依赖;无外部系统
- `requirements.txt`:无特有依赖
## 8. 不在本次范围内的内容
- 不修改财务系统数据、不做报销代操作
- 不直连财务/科研系统、不推送企业微信、不导出 PDF
- 不存证件号、银行卡号等个人敏感信息
- 不兼容旧模板历史结构
## 9. 验收标准
- 目录名 = `SKILL.md` slug = `constants.SKILL_SLUG`;三处版本号一致(1.0.1;三处 = `scripts/util/constants.py` / `SKILL.md` / `CHANGELOG.md`)
- `health` / `version` / `init-db` 正常;`python tests/run_tests.py -v` 全绿
- 金标准测试覆盖 C1-C3/D1-D3/N1-N2 正反例与阈值边界;三种代表场景真实跑通(正常/严重滞后+暂付款超期/异常偏快+临近结题)
- `set-rule` 修改阈值后诊断随之变化;`stats` 与记录一致;月度播报生成汇总简报
- `init_db()` 写入展示元数据,中文 display_name 完整,`test_display_metadata` 通过
- `assets/actions.json` 与定位表、TUTORIAL 三入口一致;`test_tutorial_surfaces` 通过
- `developer_ids` 已配置(79017);发布后 Gitea 工作流成功、市场可见可装
- 宿主多入口验收:对话播报、数据管理按钮/行级、HTML 简报预览、定时任务创建并手动触发月度播报
## 10. 开发注意事项
- `cli` 只做参数解析;核心逻辑在 `service`(fund_service 唯一内核,多入口复用)
- 业务表间禁止 SQLite 外键;时间字段 Unix 秒;金额 round(x,4)
- 保留模板演示 `cmd_run`(POLICY-RPA-003 录屏集成守护);业务命令不使用录屏
- 修改开发规范时同步 `POLICY_MATRIX.md` 与对应守护测试
- 旧库迁移在 `init_db()` 幂等完成(`ALTER TABLE` 补列:`items_json`、`updated_at`)
## 11. 变更记录
| 日期 | 版本 | 变更人 | 变更内容 |
|------|------|--------|----------|
| 2026-09-13 | v1.0 | 开发组 | 初版:三步计算内核 + 台账/阈值维护 + 简报与月度播报 |
| 2026-09-24 | v1.1 | 开发组 | 对照验收修订:错误码格式 `ERROR:<CODE> <message>`、状态标签优先级(C3→待补录)、`project_id`/`items_json` 落库、月度增量 emit、简报 TITLE 转义与 §10 章节对齐 |