9 行
8.0 KiB
CSV
9 行
8.0 KiB
CSV
ID,Title,Description,Acceptance,Test_Method,Tools,Dev_Status,Review1_Status,Regression_Status,Files,Dependencies,Notes
|
|
A1,R45 合同建档与范围冻结,"创建 R45 Issue CSV,冻结范围为合同附件上传/下载、删除头像/合同、培训与证书记录、证书统计扩展;不夹带证书附件上传、培训/证书删除或权限模型重构。","issues/2026-03-29_r45-employee-attachments-training.csv 列完整、依赖清晰、测试方法可复现;范围仅覆盖本轮 3 项。","对照 AGENTS.md 与 issues/README.md 检查列完整、Dependencies 为 JSON 数组字符串、Test_Method 包含命令和业务流程步骤;确认范围不包含证书附件上传与培训/证书删除。",manual,DONE,DONE,DONE,issues/2026-03-29_r45-employee-attachments-training.csv,"[]",none
|
|
A2,合同附件后端与头像/合同删除,"在员工路由新增合同附件上传/下载、头像删除、合同删除;合同附件仅 system.users 可上传/下载,头像删除允许本人或管理员,文件删除使用 fs.unlink 且 ENOENT 忽略。","管理员可为既有合同上传和替换 PDF/JPG/PNG 附件,合同返回 attachmentUrl;管理员或本人可删除头像;管理员仅能删除 expired/terminated 合同,删除时会清理关联附件并记录审计日志。","命令:export PATH=/home/shunli/.nvm/versions/node/v22.20.0/bin:$PATH && cd server && npx prisma validate && node --check src/routes/employees.js && npm test -- tests/unit/routes/employees.attachments.test.js。业务:1) system.users 为已有合同上传 PDF/JPG/PNG 附件成功,下载链接可访问,替换附件后仅最新文件可用;2) 非 system.users 访问合同附件上传/下载/删除返回 403;3) 本人和管理员删除头像成功,普通员工删除他人头像返回 403;4) active 合同删除被拒绝,expired/terminated 合同删除成功且附件文件不存在时也能幂等完成。",manual,DONE,DONE,DONE,server/src/routes/employees.js|server/tests/unit/routes/employees.attachments.test.js|server/tests/unit/routes/employees.profile.test.js,"[""A1""]","回滚:撤销合同附件与删除接口代码;必要时将残留 contract attachment_path/avatar_path 清空并删除 generated/storage/contracts、generated/storage/avatars 下本轮测试文件。删除逻辑按本地 storage driver 实现,非本地 driver 不在本轮兼容范围。"
|
|
A3,培训与证书后端模型与接口,"为 Employee 新增培训与证书模型、Prisma migration 以及管理员 CRUD 接口;证书附件本轮只维护路径字符串,不做上传。","EmployeeTraining 与 EmployeeCertificate 模型可迁移;GET/POST/PATCH /trainings 与 /certificates 均仅 system.users 可用;证书返回 valid/expired 推导状态;本轮不提供 DELETE。","命令:export PATH=/home/shunli/.nvm/versions/node/v22.20.0/bin:$PATH && cd server && npx prisma validate && node --check src/routes/employees.js && npm test -- tests/unit/routes/employees.training.test.js && npm test -- tests/unit/routes/employees.certificates.test.js。业务:1) system.users 可新增、编辑、查询培训记录;2) system.users 可新增、编辑、查询证书记录,expiryDate 为空或未来日期时返回 valid,历史日期返回 expired;3) 非 system.users 访问 trainings/certificates 返回 403;4) 证书 attachmentPath 仅按字符串保存,不触发文件上传。",manual,DONE,DONE,DONE,server/prisma/schema.prisma|server/prisma/migrations|server/src/routes/employees.js|server/tests/unit/routes/employees.training.test.js|server/tests/unit/routes/employees.certificates.test.js,"[""A2""]","回滚:先清理 employee_training / employee_certificate 数据,再回滚 Prisma migration 与代码;R45 Notes 需写明新增模型理由、回滚步骤,以及本轮不做培训/证书删除。"
|
|
A4,档案页前端接入合同附件、删除能力与培训证书页签,"更新前端 API 与 EmployeeProfilePage:支持删除头像、合同附件上传/下载/替换、删除合同,以及新增管理员专属的培训与证书页签。","档案页本人或管理员可删除头像;管理员可在合同列表下载附件、在编辑既有合同时上传/替换附件、删除 expired/terminated 合同;管理员可在培训与证书页签新增和编辑记录;普通员工看不到合同与培训证书管理入口。","命令:export PATH=/home/shunli/.nvm/versions/node/v22.20.0/bin:$PATH && cd client && npm run typecheck && npm run build。业务:1) 本人或管理员在档案页删除头像后恢复占位样式;2) 管理员先新增合同,再在编辑状态上传附件并可下载;3) active 合同删除按钮禁用或提示需先终止,expired/terminated 合同删除成功后列表刷新;4) 管理员可在“培训与证书”页签新增和编辑培训、证书;5) 普通员工或仅自助用户看不到合同与培训证书页签。",manual,DONE,DONE,DONE,client/src/pages/EmployeeProfilePage.tsx|client/src/api/employees.ts|client/src/components/common/StatusBadge.tsx,"[""A2"",""A3""]","约定:新合同必须先保存后上传附件;合同表单移除 attachmentPath 手工输入,证书表单保留 attachmentPath 字符串输入。"
|
|
A5,员工统计后端扩展证书指标,"扩展员工统计聚合,在现有 employmentStatusSummary、departmentHeadcount、recentMovements、expiringContracts 基础上新增 certificateSummary。","/api/employees/stats 返回 validHolderCount、expiringSoonCount、dateFrom/dateTo;统计仅基于 active 员工,且使用 Prisma count/groupBy 实现,不在应用层遍历全量记录。","命令:export PATH=/home/shunli/.nvm/versions/node/v22.20.0/bin:$PATH && cd server && npx prisma validate && node --check src/services/employeeStats.js && node --check src/routes/employees.js && npm test -- tests/unit/routes/employees.stats.test.js。业务:构造含有效证书、已过期证书、30 天内到期证书和 archived 员工证书的样本后,请求 /api/employees/stats,validHolderCount 只统计 active 员工且去重到员工维度,expiringSoonCount 统计未来 30 天到期的证书数。",manual,DONE,DONE,DONE,server/src/services/employeeStats.js|server/src/routes/employees.js|server/tests/unit/routes/employees.stats.test.js,"[""A3""]","回滚:删除 certificateSummary 聚合与返回字段,恢复统计接口原结构。"
|
|
A6,统计页前端补充证书卡片,"扩展 PeopleStatsPage 与前端员工 API 类型,展示有效证书人数与 30 天内到期证书数。","/people/stats 保持聚合视图不变,并新增 2 张证书统计卡片;原有 4 张卡片和列表展示不回归。","命令:export PATH=/home/shunli/.nvm/versions/node/v22.20.0/bin:$PATH && cd client && npm run typecheck && npm run build。业务:进入 /people/stats 后可看到有效证书人数和 30 天内到期证书数;统计口径日期显示正确;原有在职人数、近 30 天入离职、合同到期、状态分布、部门人数分布继续正常。",manual,DONE,DONE,DONE,client/src/pages/PeopleStatsPage.tsx|client/src/api/employees.ts,"[""A4"",""A5""]","不引入图表库,继续使用数字卡片 + 简单列表。"
|
|
A7,Reviewer 与 QA 收口,"按 AGENTS 编排执行 reviewer 与 qa,重点检查 Prisma 迁移、文件删除安全、附件访问权限、统计口径与档案页回归,并回填 CSV 状态。","A2-A6 的 Review1_Status 与 Regression_Status 均有证据地回填;reviewer 风险项关闭;R43 员工头像/合同与 R44 员工统计能力不回归。","Reviewer:审查 migration 回滚路径、fs.unlink 删除边界、合同附件下载权限、active 合同删除防线、证书统计口径是否只影响聚合。QA:运行 backend post-check、frontend post-check,并手工回归 4 条主线:头像删除、合同附件上传/替换/下载/删除、培训与证书 CRUD、统计页证书卡片;同时确认 R43 头像上传/合同 CRUD 与 R44 统计原有四项不回归。",manual,DONE,DONE,DONE,issues/2026-03-29_r45-employee-attachments-training.csv,"[""A2"",""A3"",""A4"",""A5"",""A6""]","reviewer 必启用:本轮涉及 2 个 Prisma 新模型、文件删除操作、受限下载链路和删除安全性。"
|