5.5 KiB
5.5 KiB
| 1 | ID | Title | Description | Acceptance | Test_Method | Tools | Dev_Status | Review1_Status | Regression_Status | Files | Dependencies | Notes |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2 | R36-0 | 新执行合同建档与范围锁定 | 基于产品口径文档建立 R36 合同并锁定本轮承接范围 | 新 CSV 校验通过 且 Notes 明确本轮不承接金额分层审批规则与并行会签 | python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-03-25_12-09-13-r36-permission-model-and-workflow-hardening.csv | none | DONE | DONE | DONE | issues/2026-03-25_12-09-13-r36-permission-model-and-workflow-hardening.csv | [] | 本轮覆盖:Bug-1 permissions 冗余清理(已完成)、L-1 日历分层可见、L-2 请假草稿/驳回编辑、P-1 经理视图判断修正、W-2 转审通用化、W-3 转审超限行为收口、R-1 view_all/manage 语义文档化。不承接:W-4 并行会签、R-2 金额分层审批(工作流配置层)、W-1 无经理升级(需 workflow definition 改造)。 |
| 3 | R36-1 | 请假草稿与驳回状态支持原单编辑 | 为 draft 和 rejected 状态的请假单补编辑后再提交能力,不要求撤回再新建 | draft 和 rejected 状态下请假表单字段可编辑并可 submit;submit 后走与首次提交相同的校验与审批流;原单 id 保持不变;employee 视角与 manager 视角均测试覆盖 | cd client && npm run typecheck && cd server && npm test -- tests/unit/routes/leave.edit.test.js && cd client && npm run test:e2e -- tests/e2e/leave-flow.spec.ts | manual | DONE | DONE | DONE | server/src/routes/leave.js|client/src/pages/LeaveRequestPage.tsx|server/tests/unit/routes/leave.edit.test.js | ["R36-0"] | 需在 leave.js submit 路由允许 draft/rejected 两种状态进入;前端 draft 和 rejected 状态下需显示可编辑表单而非只读摘要。如果当前前端只有只读详情视图,需新增编辑入口或切换到草稿编辑模式。 |
| 4 | R36-2 | 团队日历按角色分层可见 | HR 看全员日历经理看本部门日历普通员工不可见 Tab | HR 账号可见全员日历;具备 leave.view_all 的经理账号可见 Tab 但只返回本部门数据;普通 employee 账号不可见 Tab;截断提示逻辑保持不变 | cd client && npm run typecheck && npm run test:e2e -- tests/e2e/leave-team-calendar.spec.ts | manual | DONE | DONE | DONE | server/src/routes/leave.js|client/src/pages/LeaveRequestPage.tsx|client/tests/e2e/leave-team-calendar.spec.ts | ["R36-0"] | 后端需在 scope=all + departmentId 参数组合下做经理视图过滤;前端 canViewAll 判断需区分 HR 全员视图与经理部门视图;日历 Tab 可见性条件改为 hasLeaveViewAll 即可,过滤在查询层做。需先确认 manager seed 是否有 leave.view_all 权限——如无,需先给 manager 角色补此权限。 |
| 5 | R36-3 | Portal 经理视图判断修正 | 用审批权限或域管理权限判断经理视图替代现有 system.users 判断 | 有任一 *.approve 或 *.manage(排除 view_all)权限的用户进入经理视图;纯 employee 不进入经理视图;admin/system.users 用户仍进入经理视图 | cd client && npm run typecheck && npm run test:e2e -- tests/e2e/main-flow.spec.ts | manual | DONE | DONE | DONE | client/src/pages/PortalHomePage.tsx|client/src/lib/permissions.ts | ["R36-0"] | 建议提取 isManagerRole(permissions: string[]) 工具函数,逻辑:permissions.some(p => p.endsWith('.approve') || (p.endsWith('.manage') && !p.endsWith('.view_all')))。注意 *.view_all 不触发经理视图。 |
| 6 | R36-4 | 转审通用化并收口超限行为 | 移除转审只限报销的硬限制并明确超限后拒绝提示 | 报销/请假/采购/差旅均可发起转审;转审目标需具备对应单据审批权限(缺权限时返回明确错误);超过 3 次后返回'已达转审上限'错误而非通用 500;超限后不自动转给固定角色 | cd server && npm test -- tests/unit/routes/workflow.transfer.test.js | manual | DONE | DONE | DONE | server/src/routes/workflow.js|server/tests/unit/routes/workflow.transfer.test.js | ["R36-0"] | 主要改动:1) 删除 if (workflowInstance.entity_type !== 'reimbursement') 限制;2) 补被转人权限校验逻辑(按 entity_type 映射所需审批权限);3) 超限时错误码改为 WORKFLOW_003 或类似业务码;需补单元测试覆盖非报销转审与超限两个路径。 |
| 7 | R36-6 | 本地回归与收口 | R36 全部项完成后执行本地门禁并更新合同状态 | build + typecheck 通过;full-local 绿灯(passed ≥ 之前基线,0 failed);CSV 各项状态回填 DONE | cd client && npm run build && npm run typecheck && bash scripts/qa/run-web-gates.sh full-local | manual | DONE | DONE | DONE | issues/2026-03-25_12-09-13-r36-permission-model-and-workflow-hardening.csv|scripts/qa/* | ["R36-1","R36-2","R36-3","R36-4","R36-5"] | 本轮不做 push 与 smoke-live;门禁通过后合同即可关闭。 |