文件
hyb-oa/issues/2026-03-29_r44-employee-batch-filter-stats.csv

8.1 KiB

1IDTitleDescriptionAcceptanceTest_MethodToolsDev_StatusReview1_StatusRegression_StatusFilesDependenciesNotes
2A1R44 合同建档与范围冻结创建 R44 Issue CSV,冻结范围为高级筛选、批量操作、统计页;锁定批量调部门/设置上级沿用 transfer 生命周期语义,统计页采用独立 /people/stats。issues/2026-03-29_r44-employee-batch-filter-stats.csv 包含完整列、依赖关系和测试方法;不夹带导入、档案编辑、合同附件上传。对照 AGENTS.md 与 issues/README.md 检查 CSV 列完整、Dependencies 为 JSON 数组字符串、Test_Method 含业务流程步骤;确认范围仅覆盖本轮 3 项。manualDONEDONEDONEissues/2026-03-29_r44-employee-batch-filter-stats.csv[]none
3A2员工高级筛选后端与导出对齐扩展 /api/employees 和 /api/exports/employees 的 query,新增 title、managerId、hireDateFrom、hireDateTo、employmentStatus;抽取共享筛选 builder;将 /api/employees 读取权限对齐到 system.users + report.dashboard.view。列表与导出支持全部高级筛选;title 模糊、managerId 精确、hireDate 闭区间、employmentStatus 枚举生效;report.dashboard.view 可只读访问列表;导出仍仅 system.users。命令:export PATH=/home/shunli/.nvm/versions/node/v22.20.0/bin:$PATH && cd server && npx prisma validate && node --check src/routes/users.js && node --check src/routes/exports.js && node --check src/routes/employees.js。业务:分别用 system.users 和 report.dashboard.view 访问 /people,按 q+departmentId+status+title+managerId+hireDateFrom/hireDateTo+employmentStatus 组合筛选,列表结果正确;同样条件导出 CSV/XLSX 与页面一致;hireDateFrom>hireDateTo 返回 VALID_001。manualDONEDONEDONEserver/src/routes/users.js|server/src/routes/exports.js|server/src/routes/employees.js|server/src/services/employeeDirectoryFilters.js["A1"]回滚:删除高级筛选 query 与共享 builder,恢复 /api/employees 原读取权限口径。
4A3PeoplePage 高级筛选前端接入在 PeoplePage 增加职位、直属上级、入职日期范围、雇用状态筛选,并把全部筛选参数透传到 fetchEmployees/exportEmployees;页头增加员工统计入口。PeoplePage 可直接组合高级筛选且列表自动刷新;导出继续复用当前筛选状态;report.dashboard.view 可筛选只读列表但看不到导出按钮。命令:export PATH=/home/shunli/.nvm/versions/node/v22.20.0/bin:$PATH && cd client && npm run typecheck && npm run build。业务:在 PeoplePage 依次修改职位、直属上级、入职日期范围、雇用状态,列表立即刷新;清空筛选后恢复;system.users 可导出当前筛选结果;report.dashboard.view 无导出入口。manualDONEDONEDONEclient/src/pages/PeoplePage.tsx|client/src/api/employees.ts|client/src/api/exports.ts["A2"]直属上级候选项复用 /api/employees/organization 拍平,不新增重型选择组件。
5A4员工批量操作后端新增 /api/users/batch/transfer-department、/enable、/disable、/set-manager;事务内整批执行;复用单条 transfer 和启停账号语义;每批写审计日志。4 个批量端点均仅 system.users 可用;单次上限 50 人;任一员工失败整批回滚;批量调部门/设置上级会为每个员工写 transfer 生命周期事件和 checklist;批量启停复用 token_version 与 authSession 吊销语义。命令:export PATH=/home/shunli/.nvm/versions/node/v22.20.0/bin:$PATH && cd server && npx prisma validate && node --check src/routes/users.js && node --check src/routes/employees.js。业务:选 2-3 名员工批量调部门后,员工部门变化且每人新增 transfer 事件与 handover_note;批量设置上级后 direct_manager_id 更新且新增 transfer 事件;批量禁用后账号归档且会话吊销;批量启用后恢复 active;包含自己执行批量禁用返回 409 且整批不落库;提交 51 人返回校验错误。manualDONEDONEDONEserver/src/routes/users.js|server/src/routes/employees.js|server/src/services/employeeLifecycle.js["A1"]回滚:回撤批量路由和共享 helper;已产生的 lifecycle/audit 记录作为业务痕迹保留,不做数据回写。
6A5PeoplePage 多选与批量操作栏在 PeoplePage 增加 checkbox 多选、批量操作栏和对应弹窗;仅 system.users 可见;与现有筛选/列表共存。system.users 可在当前页多选员工并执行批量调部门、批量启用/禁用、批量设置上级;达到 50 人停止继续勾选;筛选变化、数据刷新、操作成功后清空选择;report.dashboard.view 看不到任何批量入口。命令:export PATH=/home/shunli/.nvm/versions/node/v22.20.0/bin:$PATH && cd client && npm run typecheck && npm run build。业务:在 PeoplePage 勾选多名员工后出现批量操作栏;批量调部门、启用、禁用、设置上级分别成功并刷新列表;筛选变化后已选中项被清空;report.dashboard.view 进入页面仍为只读列表。manualDONEDONEDONEclient/src/pages/PeoplePage.tsx|client/src/api/employees.ts["A3","A4"]本轮不做跨页全选;批量设置上级要求选择一个目标上级,不支持清空直属上级。
7A6员工统计后端聚合接口新增 GET /api/employees/stats,返回雇用状态分布、部门人数分布、近 30 天入职/离职人数、30 天内即将到期合同数;实现仅用 Prisma groupBy/count。/api/employees/stats 可被 system.users 和 report.dashboard.view 访问;返回仅包含聚合数据,无员工明细;统计口径按合同说明固定。命令:export PATH=/home/shunli/.nvm/versions/node/v22.20.0/bin:$PATH && cd server && npx prisma validate && node --check src/routes/employees.js。业务:构造含 onboarding/probation/active/offboarding/inactive、跨部门、近 30 天入职/离职、30 天内到期合同的样本数据后,请求 /api/employees/stats,返回的状态分布、部门人数、入离职人数、合同即将到期数均正确;report.dashboard.view 同样可访问。manualDONEDONEDONEserver/src/routes/employees.js|server/src/services/employeeStats.js["A1"]本轮不返回员工级提醒列表;回滚:删除 stats 路由与聚合 service。
8A7员工统计页面与路由新增 /people/stats 页面和前端 API,展示统计卡片与简单列表;从 PeoplePage 页头进入,不新增全局导航项。/people/stats 可由 system.users 与 report.dashboard.view 访问;页面展示状态分布、部门人数分布、近 30 天入离职、合同即将到期卡片;PeoplePage 入口与返回链路可用。命令:export PATH=/home/shunli/.nvm/versions/node/v22.20.0/bin:$PATH && cd client && npm run typecheck && npm run build。业务:从 PeoplePage 点击员工统计进入 /people/stats,页面加载成功;system.users 与 report.dashboard.view 都可查看;返回 PeoplePage 后现有筛选和列表流程不回归。manualDONEDONEDONEclient/src/pages/PeopleStatsPage.tsx|client/src/router/index.tsx|client/src/router/lazy/index.ts|client/src/router/lazy/PeopleStatsPage.ts|client/src/pages/PeoplePage.tsx|client/src/api/employees.ts["A5","A6"]不引入图表库,使用数字卡片 + 简单列表。
9A8Reviewer 与 QA 收口按 AGENTS 编排触发 reviewer 与 qa,重点检查批量操作权限边界、事务回滚、安全审计和统计/筛选回归,并回填 CSV 状态。A2-A7 的 Review1_Status 与 Regression_Status 全部有证据地回填;reviewer 风险项关闭;R40-R43 相关员工管理能力不回归。Reviewer:审查 /api/employees 读权限调整、批量操作事务安全、transfer 生命周期复用、审计日志是否完整。QA:运行 backend post-check、frontend post-check,并手工回归 3 条主线:高级筛选+导出一致、批量调部门/启停/设置上级、/people/stats 汇总展示;同时确认 R40 档案编辑、R41 批量导入、R43 合同/头像/组织架构不回归。manualDONEDONEDONEissues/2026-03-29_r44-employee-batch-filter-stats.csv["A2","A3","A4","A5","A6","A7"]reviewer 必启用:本轮涉及多人状态变更、权限边界与事务回滚。