"ID","Title","Description","Acceptance","Test_Method","Tools","Dev_Status","Review1_Status","Regression_Status","Files","Dependencies","Notes" "A1","R83-R86 执行合同建档与范围冻结","为员工编号自动生成、轻量创建用户、首登改密闭环、企微首次绑定闭环建立独立执行合同。本轮仅覆盖单个创建用户主链、相关后端接口、前端入口、Playwright 回归与最小手工真机复核;不处理批量导入 employeeNo 选填、不做 hyb/hyd 全局改名、不引入第二套企微业务录入。","CSV 列完整且通过校验;A2-A5 依赖顺序清晰;Notes 明确本轮不处理 R87 导入改造与 R88 生命周期治理。","命令:`python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-05-04_23-36-10-r83-r86-user-onboarding-simplify.csv`。业务:确认本轮只承接“用户开通与首绑主链优化”,不混入发票、审批或命名重构。","manual","DONE","DONE","DONE","issues/2026-05-04_23-36-10-r83-r86-user-onboarding-simplify.csv","[]","回滚路径:删除本 CSV,不影响运行时。后续 R87 单独承接批量导入 employeeNo 选填与外部编号映射。2026-05-04:合同已写入并通过 validate_issues_csv.py 校验。" "A2","R83 员工编号自动生成基础","在 server 侧把 `employeeNo` 从“单个创建用户必填”改为“缺省时自动生成”,采用数据库统一生成策略;保持 `employee_no` 唯一、业务可见、创建后不可修改;现有查询/展示继续使用该字段。","`POST /api/users` 在未传 `employeeNo` 时可成功创建并返回系统生成的 `employeeNo`;`PATCH/PUT` 路径不可修改既有员工编号;编号生成规则、间隙预期和回滚方式在 Notes/实现中清晰。","命令:`cd server && npm run prisma:validate`;`cd server && node --check src/routes/users.js`;`cd server && npm test -- tests/unit/routes/users*.test.js`。业务:管理员创建用户时不再手填工号,列表与详情页仍能看到新生成工号。","prisma|vitest","DONE","DONE","DONE","server/prisma/schema.prisma|server/prisma/migrations/*|server/src/routes/users.js|server/tests/unit/routes/users*.test.js","[""A1""]","建议采用 PostgreSQL sequence/default 统一发号,允许编号间隙;本轮不改已有历史工号,不改搜索/展示语义。2026-05-04:已补 Prisma default + migration + PATCH 禁改工号;`npm run prisma:validate`、`node --check src/routes/users.js`、`npm test -- tests/unit/routes/users.write.test.js tests/unit/routes/users.import.test.js tests/unit/routes/users.list.test.js` 通过。" "A3","R84 新建用户流程轻量化与一次性口令收口","移除前端“手填工号”和“管理员手填初始密码”交互;单个创建用户时由后端生成一次性口令并仅返回一次,前端在成功态展示“生成工号 + 一次性口令”;保留现有 `must_change_password` 首登改密强制逻辑。","管理员只需填写姓名、手机号、邮箱、部门、直属上级、角色等基础信息即可创建用户;创建成功后能看到一次性口令和生成工号;新用户可用邮箱/手机号 + 一次性口令登录,并被强制跳转修改密码。","命令:`cd server && node --check src/routes/users.js`;`cd client && npm run typecheck`;`cd client && npm run build`;`cd client && npm run test:e2e -- tests/e2e/user-onboarding.spec.ts`。业务:完成“新建用户 -> 拿到一次性口令 -> 新用户首次登录并改密”整链验证。","playwright|vitest","DONE","DONE","DONE","server/src/routes/users.js|client/src/api/users.ts|client/src/pages/user-management/CreateUserDialog.tsx|client/src/pages/UserManagementPage.tsx|client/src/pages/ChangePasswordPage.tsx|client/tests/e2e/user-onboarding.spec.ts","[""A2""]","本轮不接入邮件、短信或企微发码,一次性口令仍由管理员线下转交;重置密码接口保持与创建用户一致的口令语义。2026-05-04:Playwright `user-onboarding.spec.ts` 通过,前端 `npm run build` 通过。" "A4","R85 企微未绑定首次登录闭环","在企微回调识别到未绑定员工时,保留短时待绑定上下文;用户回退到账号密码登录后,系统自动完成绑定或只补一个显式确认动作,然后回到目标页;继续保留个人设置页手动绑定作为兜底。","首次从企微进入且未绑定时,不再要求用户先登录后再手动去个人设置找绑定入口;完成账号密码登录后即可完成首次绑定闭环;第二次从企微进入应可直接进入 OA。","命令:`cd server && node --check src/routes/wecomAuth.js`;`cd server && node --check src/routes/auth.js`;`cd server && npm test -- tests/unit/routes/wecomAuth.test.js`;`cd client && npm run test:e2e -- tests/e2e/wecom-first-bind.spec.ts`。业务:本地用模拟回调覆盖待绑定闭环;线上保留 1 次手机企微真机复核。","playwright|vitest|manual","DONE","DONE","DONE","server/src/routes/wecomAuth.js|server/src/routes/auth.js|client/src/pages/LoginPage.tsx|client/src/lib/wecomEntry.ts|client/src/pages/ProfilePage.tsx|server/tests/unit/routes/wecomAuth.test.js|client/tests/e2e/wecom-first-bind.spec.ts","[""A3""]","保持当前 `/login?wecom=unbound` 回退兜底;若待绑定上下文过期/冲突,仍允许用户从个人设置重新发起绑定;不把审批、报销等业务搬进企微。2026-05-04:已在 callback 未绑定分支写入短时待绑定 cookie,并在密码登录成功后自动 upsert 企微绑定;auth/wecom/users 单测与 Playwright `wecom-first-bind.spec.ts` 通过。" "A5","R86 文案语义与回归自动化收口","统一用户管理、个人资料、登录页中的员工编号语义:强调“系统生成、只读、业务可见”,避免继续暗示管理员手工维护;补齐 Playwright 用例与 trialrun 清单,把剩余必须人工的企微真机步骤单独列出。","相关页面不再出现“新建用户时手填工号/初始密码”的暗示;Playwright 覆盖创建用户、首登改密、密码重置、企微未绑定回退等关键路径;手工清单只剩真实企微手机回调与后台配置核验。","命令:`cd client && npm run typecheck`;`cd client && npm run build`;`cd client && npm run test:e2e -- tests/e2e/user-onboarding.spec.ts tests/e2e/wecom-first-bind.spec.ts`。业务:对照 checklist 确认本轮新增主链除真机企微外均可自动回归。","playwright|manual","DONE","DONE","DONE","client/src/pages/ProfilePage.tsx|client/src/pages/LoginPage.tsx|client/src/pages/UserManagementPage.tsx|artifacts/r70/manual-trialrun-checklist.md|artifacts/r70/manual-trialrun-report.md|client/tests/e2e/user-onboarding.spec.ts|client/tests/e2e/wecom-first-bind.spec.ts","[""A4""]","本轮只收口与用户开通相关的 UI 语义,不顺手调整全站所有 `employeeNo` 展示位;R87 再处理导入模板与外部编号映射。2026-05-04:已补用户管理/登录页/个人页文案与试运行清单更新,新增 Playwright 用例共 3 条并全部通过。"