文件
hyb-oa/issues/2026-03-25_12-09-13-r36-permission-model-and-workflow-hardening.csv
wangsli 1351099730
ci-e2e / e2e (push) Has been cancelled
ci-minimal / check-minimal (push) Has been cancelled
R36-6 回填合同验收状态
2026-03-25 15:34:05 +08:00

5.5 KiB

1IDTitleDescriptionAcceptanceTest_MethodToolsDev_StatusReview1_StatusRegression_StatusFilesDependenciesNotes
2R36-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.csvnoneDONEDONEDONEissues/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 改造)。
3R36-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.tsmanualDONEDONEDONEserver/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 状态下需显示可编辑表单而非只读摘要。如果当前前端只有只读详情视图,需新增编辑入口或切换到草稿编辑模式。
4R36-2团队日历按角色分层可见HR 看全员日历经理看本部门日历普通员工不可见 TabHR 账号可见全员日历;具备 leave.view_all 的经理账号可见 Tab 但只返回本部门数据;普通 employee 账号不可见 Tab;截断提示逻辑保持不变cd client && npm run typecheck && npm run test:e2e -- tests/e2e/leave-team-calendar.spec.tsmanualDONEDONEDONEserver/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 角色补此权限。
5R36-3Portal 经理视图判断修正用审批权限或域管理权限判断经理视图替代现有 system.users 判断有任一 *.approve 或 *.manage(排除 view_all)权限的用户进入经理视图;纯 employee 不进入经理视图;admin/system.users 用户仍进入经理视图cd client && npm run typecheck && npm run test:e2e -- tests/e2e/main-flow.spec.tsmanualDONEDONEDONEclient/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 不触发经理视图。
6R36-4转审通用化并收口超限行为移除转审只限报销的硬限制并明确超限后拒绝提示报销/请假/采购/差旅均可发起转审;转审目标需具备对应单据审批权限(缺权限时返回明确错误);超过 3 次后返回'已达转审上限'错误而非通用 500;超限后不自动转给固定角色cd server && npm test -- tests/unit/routes/workflow.transfer.test.jsmanualDONEDONEDONEserver/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 或类似业务码;需补单元测试覆盖非报销转审与超限两个路径。
7R36-6本地回归与收口R36 全部项完成后执行本地门禁并更新合同状态build + typecheck 通过;full-local 绿灯(passed ≥ 之前基线,0 failed);CSV 各项状态回填 DONEcd client && npm run build && npm run typecheck && bash scripts/qa/run-web-gates.sh full-localmanualDONEDONEDONEissues/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;门禁通过后合同即可关闭。