9.2 KiB
9.2 KiB
| 1 | ID | Title | Description | Acceptance | Test_Method | Tools | Dev_Status | Review1_Status | Regression_Status | Files | Dependencies | Notes |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2 | A1 | R49 执行合同建档与范围冻结 | 创建并校验 R49 合同台账增强执行合同 CSV,冻结范围仅包含合同台账字段扩展、读时 expired 推导、续约事务、到期预警、合同导出与前端筛选/预警/导出交互;明确本轮不包含 R50 通知投递、权限码调整、导航改造或定时任务。 | issues/2026-04-04_r49-contracts-registry.csv 列完整、Dependencies 为 JSON 数组字符串、Test_Method 可复现;范围仅覆盖 R49 合同台账增强,不混入 R50 或其他项目域改造。 | 命令:python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-04-04_r49-contracts-registry.csv。检查:1) 对照 AGENTS.md 与 issues/README.md 确认 12 列完整;2) A2-A7 依赖链与 backend→frontend→reviewer→qa 收口一致;3) 方案明确 expired 为读时状态,数据库不新增 expired 持久化值。 | manual | DONE | DONE | DONE | issues/2026-04-04_r49-contracts-registry.csv | [] | 2026-04-04:Issue CSV 已创建并通过 validate_issues_csv.py 校验,范围与依赖已冻结。续约语义固定为复制原合同字段并创建新草稿合同。 |
| 3 | A2 | 合同台账 Schema 与列表筛选增强 | 为 ContractRegistry 增加 contract_type、amount、currency、signed_date、effective_date、expiry_date 字段;新增共享筛选服务,扩展列表接口支持 status、contractType、counterpartyName、expiryDateFrom、expiryDateTo 过滤,并在读时推导 expired 状态。 | Prisma schema 与迁移可通过校验;旧数据回填 contract_type=other、currency=CNY;GET /api/contracts-registry 支持新筛选参数,status=expired 返回数据库 active 且 expiry_date 早于今天的合同,status=active 不包含已过期合同;写接口禁止写入 expired。 | 命令:export PATH=/home/shunli/.nvm/versions/node/v22.20.0/bin:$PATH && cd server && npx prisma validate && node --check src/routes/contractsRegistry.js && npm test -- server/tests/unit/routes/contractsRegistry.test.js。业务:1) 创建含金额/币种/日期的新合同成功返回;2) 列表按状态、类型、相对方、到期日期区间过滤正确;3) expiryDateTo 早于 expiryDateFrom 返回 VALID_001。 | manual | DONE | DONE | DONE | server/prisma/schema.prisma|server/prisma/migrations|server/src/routes/contractsRegistry.js|server/src/services/contractRegistryFilters.js|server/tests/unit/routes/contractsRegistry.test.js | ["A1"] | 2026-04-04:Schema、迁移、共享筛选服务与列表接口已实现;npx prisma validate、node --check、contractsRegistry.test.js 通过。2026-04-05:公网 smoke 回归通过,金额/分类/筛选能力验收完成。 |
| 4 | A3 | 合同生命周期与续约事务 | 新增 POST /api/contracts-registry/:id/renew,并补齐生命周期审计;续约时在事务内创建带 -R 序号的新草稿合同、归档旧合同、继承同一项目与业务字段。 | 仅对有效状态 active/expired 的合同允许续约;首次续约生成 -R1,后续递增;原合同自动归档并写审计;对 draft/archived 合同续约返回明确错误。 | 命令:export PATH=/home/shunli/.nvm/versions/node/v22.20.0/bin:$PATH && cd server && node --check src/routes/contractsRegistry.js && npm test -- server/tests/unit/routes/contractsRegistry.test.js。业务:1) active 合同续约后原合同归档、新合同为 draft;2) expired 合同续约同样可生成新草稿;3) draft/archived 合同续约被拒绝;4) CONTRACT_REGISTRY_RENEWED 与状态变更审计已记录。 | manual | DONE | DONE | DONE | server/src/routes/contractsRegistry.js|server/src/services/contractRegistryFilters.js|server/tests/unit/routes/contractsRegistry.test.js | ["A2"] | 2026-04-04:续约事务、-R 序号计算与审计已实现;单测覆盖 active 续约和 draft 拒绝路径通过。2026-04-05:公网 smoke 回归通过,续约链路与生命周期状态验证通过。 |
| 5 | A4 | 到期预警与合同导出 | 新增 GET /api/contracts-registry/expiring 与 POST /api/exports/contracts-registry;复用共享筛选条件实现所见即所导,并沿用 exports.js 的文件头与审计模式。 | /expiring?days=30 返回当前可见且在 N 天内到期的 active 合同;POST /api/exports/contracts-registry 支持 csv/xlsx,导出列与需求一致,且与当前筛选参数完全同步;导出写入 EXPORT_CONTRACTS_REGISTRY 审计。 | 命令:export PATH=/home/shunli/.nvm/versions/node/v22.20.0/bin:$PATH && cd server && node --check src/routes/contractsRegistry.js && node --check src/routes/exports.js && npm test -- server/tests/unit/routes/exports.contractsRegistry.test.js。业务:1) days 默认 30,越界返回 VALID_001;2) expiring 仅包含 active 且未过今天边界的即将到期合同;3) csv/xlsx 导出包含合同编号、类型、相对方、金额、币种、状态、签署日期、生效日期、到期日期、项目、责任人、密级。 | manual | DONE | DONE | DONE | server/src/routes/contractsRegistry.js|server/src/routes/exports.js|server/src/services/contractRegistryFilters.js|server/tests/unit/routes/exports.contractsRegistry.test.js | ["A2"] | 2026-04-04:expiring 接口与 POST 导出已实现,csv/xlsx 单测通过,导出审计已写入。2026-04-05:公网 smoke 回归通过,预警卡片与导出链路验收完成。 |
| 6 | A5 | 前端 API 类型与编辑器扩展 | 扩展 contractsRegistry API 与类型定义,重构合同台账页编辑器,使其支持新字段的新建与编辑,并在列表卡片展示合同类型、金额、到期日期与有效状态。 | client 端可创建和编辑带 contractType、amount、currency、signedDate、effectiveDate、expiryDate 的合同;列表卡片展示新字段且状态标签能识别 expired;金额按字符串提交与显示。 | 命令:export PATH=/home/shunli/.nvm/versions/node/v22.20.0/bin:$PATH && cd client && npm run typecheck && npm run build。业务:1) 打开 /contracts-registry 可见扩展后的表单;2) 填写金额与日期字段后可创建合同;3) 选择现有合同进入编辑态并保存成功;4) 卡片展示类型、金额+币种、到期日期和状态。 | manual | DONE | DONE | DONE | client/src/api/contractsRegistry.ts|client/src/pages/ContractsRegistryPage.tsx|client/src/components/common/StatusBadge.tsx | ["A2"] | 2026-04-04:API 类型、编辑器与卡片展示已完成;client typecheck/build 通过。2026-04-05:公网 smoke 回归通过,新建/编辑主链路验收完成。 |
| 7 | A6 | 前端筛选 预警 续约 导出交互收口 | 在合同台账页补齐状态/类型/相对方/到期日范围筛选、到期预警卡片、续约按钮与导出按钮,并保持项目详情页对合同台账列表的兼容。 | /contracts-registry 支持多条件筛选并刷新列表;顶部显示“N 份合同将在 30 天内到期”卡片并可展开;合同可直接续约;CSV/XLSX 导出成功下载;ProjectDetailPage 继续按 projectId 获取合同列表且不回归。 | 命令:export PATH=/home/shunli/.nvm/versions/node/v22.20.0/bin:$PATH && cd client && npm run typecheck && npm run build。业务:1) 设置筛选条件后列表与预警卡片同步刷新;2) 点击续约后列表出现新的 draft 合同且原合同归档;3) 点击导出可下载 csv/xlsx;4) 从项目详情页进入合同台账时 projectId 过滤仍生效。 | manual | DONE | DONE | DONE | client/src/api/contractsRegistry.ts|client/src/pages/ContractsRegistryPage.tsx|client/src/pages/ProjectDetailPage.tsx|client/src/lib/download.ts | ["A3","A4","A5"] | 2026-04-04:筛选、预警卡片、续约和导出交互已接入,导出 POST 请求头已补齐;client build 通过。2026-04-05:公网 smoke 回归通过,筛选/预警/续约/导出交互验收完成。 |
| 8 | A7 | R49 reviewer QA 与提交收口 | 对 Prisma 迁移、expired 推导、续约事务和导出一致性进行 reviewer 风格复核,并完成 backend/frontend post-check 与业务回归,回填 Issue CSV 状态。 | review 重点结论、自动化结果和业务回归证据完整;A2-A6 的 Review1_Status 与 Regression_Status 回填;所有 post-check 通过后方可提交。 | 命令:export PATH=/home/shunli/.nvm/versions/node/v22.20.0/bin:$PATH && cd server && npx prisma validate && node --check src/routes/contractsRegistry.js && node --check src/routes/exports.js && npm test -- server/tests/unit/routes/contractsRegistry.test.js server/tests/unit/routes/exports.contractsRegistry.test.js && cd ../client && npm run typecheck && npm run build。业务:1) 新建/编辑/筛选/预警/续约/导出主链路通过;2) status=expired、days 边界、date range 非法输入返回正确错误;3) 项目详情页合同列表无回归。 | manual | DONE | DONE | DONE | issues/2026-04-04_r49-contracts-registry.csv|server/src/routes/contractsRegistry.js|server/src/routes/exports.js|client/src/pages/ContractsRegistryPage.tsx|client/src/pages/ProjectDetailPage.tsx | ["A3","A4","A6"] | 2026-04-04:已完成 reviewer 风格代码复核、git diff --check、Prisma validate、后端单测、client typecheck/build。2026-04-05:公网 smoke 测试通过(OpenClaw 验收 2026-04-05),R49 合同台账增强主链路回归完成。 |