文件
hyb-oa/issues/2026-03-28_18-57-20-r42-presence-enhancements.csv
T

6.0 KiB

1IDTitleDescriptionAcceptanceTest_MethodToolsDev_StatusReview1_StatusRegression_StatusFilesDependenciesNotes
2R42-0R42执行合同建档与范围冻结为考勤增强建立独立合同并冻结范围为历史查询 导出 管理员修正 不承接打卡 排班 迟到早退与复杂统计报表CSV 校验通过 且本轮权限口径固定为沿用现有团队状态页访问边界 system.users 仅用于管理员修正与导出python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-03-28_18-57-20-r42-presence-enhancements.csvnoneDONEDONEDONEissues/2026-03-28_18-57-20-r42-presence-enhancements.csv[]默认不启用 reviewer;仅当管理员修正规则触及 leave_sync travel 覆盖优先级或引入新权限码时再升级。
3R42-1考勤历史查询与区间读模型扩展 presence API 与 TeamPresencePage 支持按日期范围查询个人与团队状态历史 并补齐部门 成员 状态筛选团队状态页可查看指定日期范围内的历史记录与汇总且筛选结果稳定 不新增独立考勤页面业务流程: 进入团队状态页 选择日期范围 查看汇总与明细 再切换部门 成员 状态筛选 确认结果与汇总同步变化。验证命令: cd server && node --check src/routes/presence.js && cd ../client && npm run typecheck && npm run buildmanualDONEDONEDONEserver/src/routes/presence.js|client/src/api/presence.ts|client/src/pages/TeamPresencePage.tsx["R42-0"]已新增 /api/presence/me/history 与 /api/presence/team/history,区间默认最近 7 天 上限 31 天,team/history 支持 departmentId employeeId status 组合筛选并显式物化 unspecified。已验证: cd server && node --check src/routes/presence.js 通过;cd server && npm test -- tests/unit/routes/presence.history.test.js 4/4 通过;cd client && npm run typecheck 通过;cd client && npm run build 通过。
4R42-2考勤导出在 exports 路由新增团队状态导出并在 TeamPresencePage 提供导出按钮 复用当前日期范围与筛选条件导出 csv xlsxsystem.users 用户可导出当前筛选后的团队状态全量结果 文件包含员工 部门 日期 状态 时间段 来源 备注 且与页面口径一致业务流程: 在团队状态页选择日期范围与筛选条件 点击导出 csv xlsx 确认导出内容与当前筛选一致。验证命令: cd server && node --check src/routes/exports.js && cd ../client && npm run typecheck && npm run buildmanualDONEDONEDONEserver/src/services/presenceHistory.js|server/src/routes/exports.js|server/tests/unit/routes/exports.presence.test.js|client/src/api/presence.ts|client/src/pages/TeamPresencePage.tsx["R42-0","R42-1"]已新增 /api/exports/presence-history,导出只复用历史模式筛选口径,超过 5000 条返回 VALID_001 + export=too_large,不做截断。导出实现改为直接复用 presenceHistory 共享服务,避免页面与导出口径漂移。已通过 node --check、相关单测、client typecheck 与 build;另修复了 exports.presence.test.js 缺少 setErrorHandler 导致 AppError details 序列化不一致的问题。
5R42-3管理员修正团队状态为 system.users 增加对他人团队状态的手工修正能力 并记录审计与覆盖来源边界管理员可对指定员工指定日期执行修正并在页面看到结果刷新 非管理员无入口且审批同步状态的优先级规则保持明确业务流程: system.users 用户进入团队状态页 选择员工和日期 修正状态后刷新列表确认生效;非 system.users 用户确认没有修正入口;若目标日期受请假或出差覆盖 结果符合既定冲突规则。验证命令: cd server && node --check src/routes/presence.js && cd ../client && npm run typecheck && npm run buildmanualDONEDONEDONEserver/prisma/schema.prisma|server/prisma/migrations/20260328194500_r42_presence_admin_override|server/src/services/presenceHistory.js|server/src/routes/presence.js|server/src/routes/portal.js|server/tests/unit/routes/presence.admin.test.js|client/src/api/presence.ts|client/src/pages/TeamPresencePage.tsx["R42-0","R42-1"]因已确认允许强制覆盖,本轮正式新增 EmployeePresenceSource.admin_override,不再用 manual 冒充覆盖;读模型统一为 manual -> travel/leave_sync -> admin_override,Portal 今日卡片也改走同一共享服务。回滚路径: 先将 employee_presence.source='admin_override' 批量降级为 manual,再回滚代码与 Prisma 枚举。本轮不做“清空回未更新”,因为唯一键下删除/清空会引入额外审计与冲突语义,留待后续独立设计。已通过 prisma validate、node --check、相关单测、client typecheck 与 build。
6R42-4QA回归与R37-3后续观测完成考勤增强单项验证 最小回归与治理复盘 并记录历史查询 导出 管理员修正三类 handoff 是否顺畅R42 状态正确回填 且 Notes 记录 presence.js 是否已需要拆分 exports 复用是否顺畅 reviewer 触发条件是否要细化业务流程: 验证日期范围历史查询 导出 管理员修正 非管理员无导出与修正入口 以及 Portal 团队状态页现有今日更新链路不回归。验证命令: cd server && node --check src/routes/presence.js && node --check src/routes/exports.js && cd ../client && npm run typecheck && npm run buildmanualDONEDONEDONEissues/2026-03-28_18-57-20-r42-presence-enhancements.csv|issues/2026-03-28_12-36-28-r37-agent-modes-governance.csv|server/src/services/presenceHistory.js|server/src/routes/presence.js|server/src/routes/exports.js|server/src/routes/portal.js|client/src/pages/TeamPresencePage.tsx["R42-1","R42-2","R42-3"]本轮把 presence 历史区间解析和读模型抽到共享服务,presence.js 单文件继续扩展已开始逼近拆分阈值,但服务层抽离后仍在可控范围。exports.js 继续复用业务域服务是顺手的,说明导出模式还能沿用;reviewer 触发条件应明确细化为“新增 source 或改覆盖优先级”。QA 已完成历史查询、导出、管理员修正、非管理员无入口、Portal 今日状态不回归的验证;R37-3 复盘已同步更新。