A1-A8 规划MVP主线开发收口

这个提交包含在:
2026-05-09 20:59:47 +08:00
父节点 d968c0514b
当前提交 09ac7d2edc
@@ -0,0 +1,9 @@
ID,Title,Description,Acceptance,Test_Method,Tools,Dev_Status,Review1_Status,Regression_Status,Files,Dependencies,Notes
A1,MVP主线代码差距盘点,"对照当前 PRD 和 7 份模块规约,盘点 workflow、reimbursements、invoicePool、wecomAuth、leave、purchaseRequests、contractsRegistry、projects 等现有实现、页面、回归脚本和缺口;本 Issue 不改业务代码。","1) 形成可复用实现、待修缺口和不重复造轮子的清单;2) 明确 A2-A8 的实际改动边界;3) 确认首轮默认不新增公共 API、不新增数据库表;4) 若发现必须新增接口、字段或迁移,拆独立后续 Issue。","流程级验证:按 PRD 的审批、报销、企业微信入口、请假、采购、合同、项目七条主线逐项映射到现有 server/client/tests 文件;命令:rg 检索关键路由、页面和测试;命令:python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-05-09_20-57-19-mvp-mainline-dev-kickoff.csv。","ripgrep|manual|python3",TODO,TODO,TODO,"server/src/routes/*|client/src/pages/*|client/src/api/*|client/tests/e2e/*|docs/*.md","[]","A1 只做差距盘点和后续实施边界确认,不改业务代码;如发现需迁移或新增 API,必须另拆 Issue 并写回滚策略。"
A2,统一审批中心入口与状态收口,"收口 PC /workflow/tasks、移动 /mobile/approvals、业务详情页审批历史和通知 deeplink 的一致性,确保正式审批动作回到 OA 完成。","1) 待办、已办、业务详情页状态一致;2) 审批动作通过、驳回、退回、撤回、转审仍写入 OA 工作流历史;3) 企业微信消息只 deeplink 回 OA,不出现企业微信原生审批入口;4) 并发或已处理任务有明确提示。","流程级验证:提交一条报销或请假审批 -> PC 待办处理 -> 移动待办同步消失或进入已办 -> 业务详情审批历史一致;命令:cd server && ./scripts/regression-workflow-actions.sh;命令:cd client && npm run test:e2e -- workflow-quick-approve.spec.ts mobile-approvals-offline.spec.ts。","bash|npm|playwright|manual",TODO,TODO,TODO,"server/src/routes/workflow.js|server/src/utils/workflow.js|client/src/pages/WorkflowTasksPage.tsx|client/src/pages/MobileApprovalsPage.tsx|client/src/pages/WorkflowTaskDetailPage.tsx","[""A1""]","涉及 workflow 状态机和权限;实现方案必须说明回滚路径,默认以 revert commit 回滚,不做破坏性迁移。"
A3,报销发票OCR主链路收口,"收口上传、OCR 状态、查重、绑定明细、提交审批、付款标记和导出中的体验或状态缺口,优先复用现有 reimbursement 与 invoicePool 实现。","1) 员工能完成报销主流程:上传发票/附件 -> OCR/查重 -> 绑定明细 -> 提交审批;2) 财务能处理重复、付款标记和导出;3) 普通用户页面不出现内部状态码、发票池、绑定整单等不应见文案;4) OCR 失败、重复、附件缺失有业务提示。","流程级验证:创建报销草稿 -> 上传票据 -> OCR 进入终态 -> 绑定明细 -> 提交审批 -> 审批通过 -> 财务付款/导出;命令:cd server && ./scripts/regression-dedup.sh && ./scripts/regression-ocr.sh;命令:cd client && npm run test:e2e -- r102-reimbursement-main-flow.spec.ts invoice-ocr-flow.spec.ts。","bash|npm|playwright|manual",TODO,TODO,TODO,"server/src/routes/reimbursements.js|server/src/routes/invoicePool.js|server/src/routes/invoicePool/*|client/src/pages/ReimbursementDetailPage.tsx|client/src/pages/InvoicePoolPage.tsx|client/src/pages/reimbursement-detail/*|client/src/pages/invoice-pool/*","[""A1"",""A2""]","涉及报销和发票状态;默认不改 OCR provider 和数据库结构,若需 schema/API 变更另拆 Issue。"
A4,企业微信入口绑定通知回OA,"收口企业微信 config、登录/绑定、移动落点、通知 deeplink 和脱敏消息,企业微信只作为入口、身份、通知和打卡原始采集边界。","1) 企业微信手机入口默认进入 /mobile;2) 已绑定用户直达,未绑定可回退账号密码;3) 停用员工不得从企业微信进入业务系统;4) 通知内容脱敏且 deeplink 回 OA;5) 通知失败不阻断主业务。","流程级验证:模拟企业微信 UA 访问入口 -> 已绑定进入移动工作台 -> 未绑定回退账号密码 -> 通知 deeplink 打开 OA 审批页;命令:cd client && npm run test:e2e -- wecom-entry.spec.ts wecom-first-bind.spec.ts r124-mobile-entry-matrix.spec.ts;后端补 node --check src/routes/wecomAuth.js。","npm|playwright|node|manual",TODO,TODO,TODO,"server/src/routes/wecomAuth.js|server/src/services/notifications/*|client/src/lib/wecomEntry.ts|client/src/lib/runtimeContext.ts|client/src/lib/notificationLinks.ts","[""A1"",""A2""]","不接企业微信原生审批、不接飞书;涉及真实企业微信凭据时 live smoke 缺配置必须标 SKIP。"
A5,请假补卡外出加班审批与考勤口径,"优先收口现有请假审批、团队状态、日历展示和考勤解释边界;首轮不做企业微信打卡 API 同步,不重造定位、人脸、Wi-Fi 或排班。","1) 请假审批状态正确;2) 已批准请假影响团队状态或日历展示;3) 补卡、外出、加班若现有实现不足,先记录缺口或做最小入口收口;4) 文案不引导员工去企业微信原生审批。","流程级验证:员工提交请假 -> 主管/HR 在 OA 审批 -> 团队状态或日历体现结果 -> 驳回/撤回后状态正确;命令:cd client && npm run test:e2e -- leave-flow.spec.ts leave-team-calendar.spec.ts;命令:cd server && node --check src/routes/leave.js。","npm|playwright|node|manual",TODO,TODO,TODO,"server/src/routes/leave.js|server/src/services/leave.js|client/src/pages/LeaveRequestPage.tsx|client/src/pages/MobileLeavePage.tsx|client/src/pages/TeamPresencePage.tsx","[""A1"",""A2""]","首轮不接企业微信打卡同步;若补卡/外出/加班缺运行时能力,A1 后先拆最小 Issue,不扩大到完整考勤系统。"
A6,P1采购合同项目最小可用收口,"只做现有 P1 能力的最小可用检查和缺口修复,不扩展预算、支付、ERP、AI、复杂招采或重型项目管理。","1) 采购/费用可申请并进入 OA 审批;2) 合同台账可登记、查询、记录编号、负责人和归档位置;3) 项目能关联关键事项并展示摘要;4) P2 能力不作为普通员工主路径。","流程级验证:创建采购申请 -> OA 审批 -> 项目页查看关联;登记合同台账 -> 查询合同摘要;项目页查看任务/里程碑/风险/业务关联;命令:cd server && ./scripts/regression-procurement.sh;命令:cd client && npm run test:e2e -- procurement-flow.spec.ts project-workbench.spec.ts;合同台账执行人工或补 E2E。","bash|npm|playwright|manual",TODO,TODO,TODO,"server/src/routes/purchaseRequests.js|server/src/routes/contractsRegistry.js|server/src/routes/projects.js|client/src/pages/PurchaseRequestsPage.tsx|client/src/pages/ContractsRegistryPage.tsx|client/src/pages/ProjectsPage.tsx|client/src/pages/ProjectDetailPage.tsx","[""A1"",""A2""]","P1 只收口最小可用;预算/ERP/AI/完整差旅/重型项目管理不进入首轮开发。"
A7,权限导航与备用模块护栏,"按当前 MVP 路线整理普通员工、财务、主管、管理员的导航和权限可见性,避免备用模块干扰主线。","1) 普通员工不见预算、AP、ERP、AI、完整差旅等首批不开放主路径;2) 审批、报销、请假、企业微信移动入口清晰可达;3) 财务、主管、管理员入口与权限边界符合 PRD;4) 服务端权限仍是最终授权依据。","流程级验证:分别用员工、主管、财务、管理员账号登录 -> 检查导航、入口和关键页面可访问性 -> 普通员工不可访问备用模块主路径;命令:cd client && npm run typecheck && npm run build;命令:cd client && npm run test:e2e -- settings-governance.spec.ts login-portal-ux.spec.ts。","npm|playwright|manual",TODO,TODO,TODO,"client/src/layouts/AppShellLayout.tsx|client/src/features/mobile/navigation.ts|client/src/auth/permissions.ts|server/src/routes/systemWorkspace.js|server/src/scripts/seed-config.js","[""A1"",""A2""]","涉及权限和导航;不得只靠前端隐藏授权,服务端权限缺口需另拆或同步修复,回滚以 revert commit 为主。"
A8,回归门禁与试运行证据收口,"汇总 A2-A7 的自动化、手工和 SKIP 条件,形成首轮开发完成门禁和是否进入部署试运行的判断依据。","1) server/client 本地检查通过;2) 关键业务流回归结果可追溯;3) 公网、企业微信真机、真实 OCR 缺配置时明确 SKIP;4) 可判断是否进入部署和公网试运行;5) Issue CSV 状态按验证结果回填。","流程级验证:执行统一审批、报销/OCR、企业微信入口、请假、采购/合同/项目和权限导航的组合回归;命令:cd server && ./scripts/regression-all.sh;命令:cd client && npm run build;命令:bash scripts/qa/run-web-gates.sh smoke-local;命令:node scripts/qa/check-live-smoke-env.mjs。","bash|npm|node|manual",TODO,TODO,TODO,"server/scripts/*|scripts/qa/*|client/tests/e2e/*|docs/trialrun-runbook.md|issues/2026-05-09_20-57-19-mvp-mainline-dev-kickoff.csv","[""A2"",""A3"",""A4"",""A5"",""A6"",""A7""]","A8 是首轮开发完成门禁;未部署不得告知可公网或企业微信真机测试。"
1 ID Title Description Acceptance Test_Method Tools Dev_Status Review1_Status Regression_Status Files Dependencies Notes
2 A1 MVP主线代码差距盘点 对照当前 PRD 和 7 份模块规约,盘点 workflow、reimbursements、invoicePool、wecomAuth、leave、purchaseRequests、contractsRegistry、projects 等现有实现、页面、回归脚本和缺口;本 Issue 不改业务代码。 1) 形成可复用实现、待修缺口和不重复造轮子的清单;2) 明确 A2-A8 的实际改动边界;3) 确认首轮默认不新增公共 API、不新增数据库表;4) 若发现必须新增接口、字段或迁移,拆独立后续 Issue。 流程级验证:按 PRD 的审批、报销、企业微信入口、请假、采购、合同、项目七条主线逐项映射到现有 server/client/tests 文件;命令:rg 检索关键路由、页面和测试;命令:python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-05-09_20-57-19-mvp-mainline-dev-kickoff.csv。 ripgrep|manual|python3 TODO TODO TODO server/src/routes/*|client/src/pages/*|client/src/api/*|client/tests/e2e/*|docs/*.md [] A1 只做差距盘点和后续实施边界确认,不改业务代码;如发现需迁移或新增 API,必须另拆 Issue 并写回滚策略。
3 A2 统一审批中心入口与状态收口 收口 PC /workflow/tasks、移动 /mobile/approvals、业务详情页审批历史和通知 deeplink 的一致性,确保正式审批动作回到 OA 完成。 1) 待办、已办、业务详情页状态一致;2) 审批动作通过、驳回、退回、撤回、转审仍写入 OA 工作流历史;3) 企业微信消息只 deeplink 回 OA,不出现企业微信原生审批入口;4) 并发或已处理任务有明确提示。 流程级验证:提交一条报销或请假审批 -> PC 待办处理 -> 移动待办同步消失或进入已办 -> 业务详情审批历史一致;命令:cd server && ./scripts/regression-workflow-actions.sh;命令:cd client && npm run test:e2e -- workflow-quick-approve.spec.ts mobile-approvals-offline.spec.ts。 bash|npm|playwright|manual TODO TODO TODO server/src/routes/workflow.js|server/src/utils/workflow.js|client/src/pages/WorkflowTasksPage.tsx|client/src/pages/MobileApprovalsPage.tsx|client/src/pages/WorkflowTaskDetailPage.tsx ["A1"] 涉及 workflow 状态机和权限;实现方案必须说明回滚路径,默认以 revert commit 回滚,不做破坏性迁移。
4 A3 报销发票OCR主链路收口 收口上传、OCR 状态、查重、绑定明细、提交审批、付款标记和导出中的体验或状态缺口,优先复用现有 reimbursement 与 invoicePool 实现。 1) 员工能完成报销主流程:上传发票/附件 -> OCR/查重 -> 绑定明细 -> 提交审批;2) 财务能处理重复、付款标记和导出;3) 普通用户页面不出现内部状态码、发票池、绑定整单等不应见文案;4) OCR 失败、重复、附件缺失有业务提示。 流程级验证:创建报销草稿 -> 上传票据 -> OCR 进入终态 -> 绑定明细 -> 提交审批 -> 审批通过 -> 财务付款/导出;命令:cd server && ./scripts/regression-dedup.sh && ./scripts/regression-ocr.sh;命令:cd client && npm run test:e2e -- r102-reimbursement-main-flow.spec.ts invoice-ocr-flow.spec.ts。 bash|npm|playwright|manual TODO TODO TODO server/src/routes/reimbursements.js|server/src/routes/invoicePool.js|server/src/routes/invoicePool/*|client/src/pages/ReimbursementDetailPage.tsx|client/src/pages/InvoicePoolPage.tsx|client/src/pages/reimbursement-detail/*|client/src/pages/invoice-pool/* ["A1","A2"] 涉及报销和发票状态;默认不改 OCR provider 和数据库结构,若需 schema/API 变更另拆 Issue。
5 A4 企业微信入口绑定通知回OA 收口企业微信 config、登录/绑定、移动落点、通知 deeplink 和脱敏消息,企业微信只作为入口、身份、通知和打卡原始采集边界。 1) 企业微信手机入口默认进入 /mobile;2) 已绑定用户直达,未绑定可回退账号密码;3) 停用员工不得从企业微信进入业务系统;4) 通知内容脱敏且 deeplink 回 OA;5) 通知失败不阻断主业务。 流程级验证:模拟企业微信 UA 访问入口 -> 已绑定进入移动工作台 -> 未绑定回退账号密码 -> 通知 deeplink 打开 OA 审批页;命令:cd client && npm run test:e2e -- wecom-entry.spec.ts wecom-first-bind.spec.ts r124-mobile-entry-matrix.spec.ts;后端补 node --check src/routes/wecomAuth.js。 npm|playwright|node|manual TODO TODO TODO server/src/routes/wecomAuth.js|server/src/services/notifications/*|client/src/lib/wecomEntry.ts|client/src/lib/runtimeContext.ts|client/src/lib/notificationLinks.ts ["A1","A2"] 不接企业微信原生审批、不接飞书;涉及真实企业微信凭据时 live smoke 缺配置必须标 SKIP。
6 A5 请假补卡外出加班审批与考勤口径 优先收口现有请假审批、团队状态、日历展示和考勤解释边界;首轮不做企业微信打卡 API 同步,不重造定位、人脸、Wi-Fi 或排班。 1) 请假审批状态正确;2) 已批准请假影响团队状态或日历展示;3) 补卡、外出、加班若现有实现不足,先记录缺口或做最小入口收口;4) 文案不引导员工去企业微信原生审批。 流程级验证:员工提交请假 -> 主管/HR 在 OA 审批 -> 团队状态或日历体现结果 -> 驳回/撤回后状态正确;命令:cd client && npm run test:e2e -- leave-flow.spec.ts leave-team-calendar.spec.ts;命令:cd server && node --check src/routes/leave.js。 npm|playwright|node|manual TODO TODO TODO server/src/routes/leave.js|server/src/services/leave.js|client/src/pages/LeaveRequestPage.tsx|client/src/pages/MobileLeavePage.tsx|client/src/pages/TeamPresencePage.tsx ["A1","A2"] 首轮不接企业微信打卡同步;若补卡/外出/加班缺运行时能力,A1 后先拆最小 Issue,不扩大到完整考勤系统。
7 A6 P1采购合同项目最小可用收口 只做现有 P1 能力的最小可用检查和缺口修复,不扩展预算、支付、ERP、AI、复杂招采或重型项目管理。 1) 采购/费用可申请并进入 OA 审批;2) 合同台账可登记、查询、记录编号、负责人和归档位置;3) 项目能关联关键事项并展示摘要;4) P2 能力不作为普通员工主路径。 流程级验证:创建采购申请 -> OA 审批 -> 项目页查看关联;登记合同台账 -> 查询合同摘要;项目页查看任务/里程碑/风险/业务关联;命令:cd server && ./scripts/regression-procurement.sh;命令:cd client && npm run test:e2e -- procurement-flow.spec.ts project-workbench.spec.ts;合同台账执行人工或补 E2E。 bash|npm|playwright|manual TODO TODO TODO server/src/routes/purchaseRequests.js|server/src/routes/contractsRegistry.js|server/src/routes/projects.js|client/src/pages/PurchaseRequestsPage.tsx|client/src/pages/ContractsRegistryPage.tsx|client/src/pages/ProjectsPage.tsx|client/src/pages/ProjectDetailPage.tsx ["A1","A2"] P1 只收口最小可用;预算/ERP/AI/完整差旅/重型项目管理不进入首轮开发。
8 A7 权限导航与备用模块护栏 按当前 MVP 路线整理普通员工、财务、主管、管理员的导航和权限可见性,避免备用模块干扰主线。 1) 普通员工不见预算、AP、ERP、AI、完整差旅等首批不开放主路径;2) 审批、报销、请假、企业微信移动入口清晰可达;3) 财务、主管、管理员入口与权限边界符合 PRD;4) 服务端权限仍是最终授权依据。 流程级验证:分别用员工、主管、财务、管理员账号登录 -> 检查导航、入口和关键页面可访问性 -> 普通员工不可访问备用模块主路径;命令:cd client && npm run typecheck && npm run build;命令:cd client && npm run test:e2e -- settings-governance.spec.ts login-portal-ux.spec.ts。 npm|playwright|manual TODO TODO TODO client/src/layouts/AppShellLayout.tsx|client/src/features/mobile/navigation.ts|client/src/auth/permissions.ts|server/src/routes/systemWorkspace.js|server/src/scripts/seed-config.js ["A1","A2"] 涉及权限和导航;不得只靠前端隐藏授权,服务端权限缺口需另拆或同步修复,回滚以 revert commit 为主。
9 A8 回归门禁与试运行证据收口 汇总 A2-A7 的自动化、手工和 SKIP 条件,形成首轮开发完成门禁和是否进入部署试运行的判断依据。 1) server/client 本地检查通过;2) 关键业务流回归结果可追溯;3) 公网、企业微信真机、真实 OCR 缺配置时明确 SKIP;4) 可判断是否进入部署和公网试运行;5) Issue CSV 状态按验证结果回填。 流程级验证:执行统一审批、报销/OCR、企业微信入口、请假、采购/合同/项目和权限导航的组合回归;命令:cd server && ./scripts/regression-all.sh;命令:cd client && npm run build;命令:bash scripts/qa/run-web-gates.sh smoke-local;命令:node scripts/qa/check-live-smoke-env.mjs。 bash|npm|node|manual TODO TODO TODO server/scripts/*|scripts/qa/*|client/tests/e2e/*|docs/trialrun-runbook.md|issues/2026-05-09_20-57-19-mvp-mainline-dev-kickoff.csv ["A2","A3","A4","A5","A6","A7"] A8 是首轮开发完成门禁;未部署不得告知可公网或企业微信真机测试。