From 88170f9c466afd1516893ad9be9f16924f046aec Mon Sep 17 00:00:00 2001 From: shunli Date: Thu, 28 May 2026 16:24:03 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A5=E9=BD=90=20OALAUNCH1=20=E5=B9=B6?= =?UTF-8?q?=E8=A1=8C=E6=94=B6=E5=8F=A3=E8=AF=81=E6=8D=AE=EF=BC=8805-28-oal?= =?UTF-8?q?aunch1-parallel-closeout=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../check.jsonl | 6 + .../implement.jsonl | 7 + .../implement.md | 34 ++++ .../05-28-oalaunch1-parallel-closeout/prd.md | 114 ++++++++++++++ .../summary.json | 12 ++ .../summary.txt | 2 + .../business-flow-approval-rerun/summary.json | 12 ++ .../business-flow-approval-rerun/summary.txt | 2 + .../summary.json | 12 ++ .../summary.txt | 2 + .../business-flow-p0-final/summary.json | 12 ++ .../business-flow-p0-final/summary.txt | 6 + .../business-flow-p0-pass/summary.json | 12 ++ .../business-flow-p0-pass/summary.txt | 10 ++ .../business-flow-p0-rerun/summary.json | 12 ++ .../business-flow-p0-rerun/summary.txt | 4 + .../business-flow-p0-tail/summary.json | 12 ++ .../business-flow-p0-tail/summary.txt | 4 + .../research/business-flow-p0/summary.json | 12 ++ .../research/business-flow-p0/summary.txt | 2 + .../summary.json | 12 ++ .../summary.txt | 2 + .../summary.json | 12 ++ .../summary.txt | 2 + .../business-flow-r89-fix/summary.json | 12 ++ .../business-flow-r89-fix/summary.txt | 2 + .../summary.json | 12 ++ .../summary.txt | 2 + .../research/business-test-gap-inventory.md | 145 ++++++++++++++++++ .../research/company-policy-oa-mapping.md | 51 ++++++ .../day7-go-no-go-evidence-framework.md | 95 ++++++++++++ .../research/flow-coverage-audit.md | 95 ++++++++++++ ...voice-verification-wecom-login-research.md | 105 +++++++++++++ .../pc-consistency-frontend-design-review.md | 55 +++++++ .../task.json | 35 +++++ 35 files changed, 926 insertions(+) create mode 100644 .trellis/tasks/05-28-oalaunch1-parallel-closeout/check.jsonl create mode 100644 .trellis/tasks/05-28-oalaunch1-parallel-closeout/implement.jsonl create mode 100644 .trellis/tasks/05-28-oalaunch1-parallel-closeout/implement.md create mode 100644 .trellis/tasks/05-28-oalaunch1-parallel-closeout/prd.md create mode 100644 .trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-approval-rerun-2/summary.json create mode 100644 .trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-approval-rerun-2/summary.txt create mode 100644 .trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-approval-rerun/summary.json create mode 100644 .trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-approval-rerun/summary.txt create mode 100644 .trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-governance-rerun/summary.json create mode 100644 .trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-governance-rerun/summary.txt create mode 100644 .trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-p0-final/summary.json create mode 100644 .trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-p0-final/summary.txt create mode 100644 .trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-p0-pass/summary.json create mode 100644 .trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-p0-pass/summary.txt create mode 100644 .trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-p0-rerun/summary.json create mode 100644 .trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-p0-rerun/summary.txt create mode 100644 .trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-p0-tail/summary.json create mode 100644 .trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-p0-tail/summary.txt create mode 100644 .trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-p0/summary.json create mode 100644 .trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-p0/summary.txt create mode 100644 .trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-payment-batch-fix/summary.json create mode 100644 .trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-payment-batch-fix/summary.txt create mode 100644 .trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-payment-batch-fix2/summary.json create mode 100644 .trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-payment-batch-fix2/summary.txt create mode 100644 .trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-r89-fix/summary.json create mode 100644 .trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-r89-fix/summary.txt create mode 100644 .trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-reimbursement-fix/summary.json create mode 100644 .trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-reimbursement-fix/summary.txt create mode 100644 .trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-test-gap-inventory.md create mode 100644 .trellis/tasks/05-28-oalaunch1-parallel-closeout/research/company-policy-oa-mapping.md create mode 100644 .trellis/tasks/05-28-oalaunch1-parallel-closeout/research/day7-go-no-go-evidence-framework.md create mode 100644 .trellis/tasks/05-28-oalaunch1-parallel-closeout/research/flow-coverage-audit.md create mode 100644 .trellis/tasks/05-28-oalaunch1-parallel-closeout/research/invoice-verification-wecom-login-research.md create mode 100644 .trellis/tasks/05-28-oalaunch1-parallel-closeout/research/pc-consistency-frontend-design-review.md create mode 100644 .trellis/tasks/05-28-oalaunch1-parallel-closeout/task.json diff --git a/.trellis/tasks/05-28-oalaunch1-parallel-closeout/check.jsonl b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/check.jsonl new file mode 100644 index 00000000..bc030945 --- /dev/null +++ b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/check.jsonl @@ -0,0 +1,6 @@ +{"file":".trellis/spec/hyb-oa/project-governance.md","reason":"检查当前任务是否满足 Trellis 治理、审批和范围要求。"} +{"file":".trellis/spec/hyb-oa/frontend-react-vite-design.md","reason":"检查前端测试与页面相关改动是否符合项目设计和验证规则。"} +{"file":".trellis/spec/hyb-oa/docs-and-evidence.md","reason":"检查报告证据是否使用脱敏、相对路径和可追溯结论。"} +{"file":".trellis/spec/hyb-oa/security-privacy.md","reason":"检查测试、文档和聊天总结是否避免敏感信息泄露。"} +{"file":".trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-test-gap-inventory.md","reason":"检查自动化业务流补测结果是否覆盖 P0 Go/No-Go 缺口。"} +{"file": ".trellis/tasks/05-28-oalaunch1-parallel-closeout/research/invoice-verification-wecom-login-research.md", "reason": "检查发票验真 API、企业微信扫码登录和更深镜像调研决策是否纳入收口证据。"} diff --git a/.trellis/tasks/05-28-oalaunch1-parallel-closeout/implement.jsonl b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/implement.jsonl new file mode 100644 index 00000000..f31fe8b6 --- /dev/null +++ b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/implement.jsonl @@ -0,0 +1,7 @@ +{"file":".trellis/spec/hyb-oa/project-governance.md","reason":"当前任务的 Trellis 执行、审批、提交和范围治理规则。"} +{"file":".trellis/spec/hyb-oa/frontend-react-vite-design.md","reason":"前端测试和页面细修必须遵守的 React/Vite/design 规则。"} +{"file":".trellis/spec/hyb-oa/docs-and-evidence.md","reason":"业务流报告和收口证据必须脱敏、可追溯且使用相对路径。"} +{"file":".trellis/spec/hyb-oa/security-privacy.md","reason":"测试与报告不得泄露密码、完整账号、票据和原始 payload。"} +{"file":".trellis/spec/hyb-oa/reimbursement-invoice-ocr.md","reason":"报销、发票、付款批次主路径补测涉及的业务边界。"} +{"file":".trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-test-gap-inventory.md","reason":"本任务自动化业务测试缺口与补测优先级。"} +{"file": ".trellis/tasks/05-28-oalaunch1-parallel-closeout/research/invoice-verification-wecom-login-research.md", "reason": "后续实现或收口时参考发票验真 API 与企业微信扫码登录/镜像调研边界。"} diff --git a/.trellis/tasks/05-28-oalaunch1-parallel-closeout/implement.md b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/implement.md new file mode 100644 index 00000000..7128253f --- /dev/null +++ b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/implement.md @@ -0,0 +1,34 @@ +# Implementation Notes + +## Scope + +本轮先收口自动化业务测试缺口,不展开真实部署、生产配置、企业微信写接口、付费发票验真 API 或真实数据写入。 + +## Decisions + +- P0 业务流按 `auth,reimbursement,approval,procurement,governance` 组合复跑,并保留最终 PASS 证据。 +- 移动审批离线测试改用已启用的请假流程造待办;差旅在当前正式角色权限中仍处于冻结状态,不能作为非 admin 主路径测试数据来源。 +- 权限直连治理测试同步差旅冻结契约:员工直连差旅列表应返回 403,而不是返回本人范围列表。 +- 报销付款批次测试改用稳定 `data-testid`,避免页面布局细修后 selector 漂移。 + +## Verification Evidence + +- 2026-05-28 收口校验: + - `cd client && npm run typecheck`:通过。 + - `cd client && npm run build`:通过。 + - `cd server && npm run prisma:validate`:通过。 + - `node scripts/qa/check-trellis-governance.mjs`:通过。 + - `python3 ./.trellis/scripts/task.py validate 05-28-oalaunch1-parallel-closeout`:通过。 + - `git diff --check`:通过。 +- `research/business-flow-p0-pass/summary.txt`:P0 业务流组合最终通过。 +- `research/business-flow-approval-rerun-2/summary.txt`:WebKit 安装和移动审批测试修正后通过。 +- `research/business-flow-governance-rerun/summary.txt`:权限直连治理测试修正后通过。 +- `research/business-flow-payment-batch-fix2/summary.txt`:报销付款批次主路径修正后通过。 +- `research/business-flow-r89-fix/summary.txt`:登录/移动入口相关修正后通过。 +- `research/company-policy-oa-mapping.md`:公司制度与 OA 功能的脱敏映射清单。 +- `research/pc-consistency-frontend-design-review.md`:按 `frontend-design` 完成 PC 一致性复查。 +- `research/invoice-verification-wecom-login-research.md`:发票验真 API、企业微信 PC 扫码登录和更深镜像的调研决策。 + +## Remaining Parallel Streams + +- 等待最终质量校验、部署/公网检查决策和试运行主线 Day 7 Go/No-Go。 diff --git a/.trellis/tasks/05-28-oalaunch1-parallel-closeout/prd.md b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/prd.md new file mode 100644 index 00000000..c47e1cc1 --- /dev/null +++ b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/prd.md @@ -0,0 +1,114 @@ +# OALAUNCH1 最终启用前并行收口包 + +## Goal + +在 7 天真实试运行继续进行的同时,把 OALAUNCH1 最终启用前容易遗漏的收口工作组织成一个 Trellis 执行合同:先建立 Day 7 Go/No-Go 证据框架,再补自动化业务测试缺口、公司制度与 OA 功能映射、PC 页面一致性细修,最后完成发票验真 API 与企业微信扫码登录/更深镜像的调研决策。目标是减少遗漏、避免重复讨论,并让最终是否正式启用有可追溯证据。 + +## Scope + +本任务覆盖 OALAUNCH1 正式启用前的并行收口准备:Go/No-Go 证据、自动化业务流补测、制度/OA 映射、PC 一致性复查和外部能力调研。真实试运行每日运营仍归 `.trellis/tasks/05-26-oa-seven-day-trial-live-ops/`,本任务只引用其脱敏结论,不重复制造试运行证据。 + +## What I Already Know + +- 当前仍有连续任务 `.trellis/tasks/05-26-oa-seven-day-trial-live-ops/`,负责 2026-05-26 至 2026-06-01 的 7 天真实试运行、每日只读巡检和真实业务反馈收口。 +- 本任务不替代试运行主线;试运行真实使用继续按 OAOPS1 节奏执行。 +- 用户已明确希望真实试运行同步执行,其他准备任务可以并行推进。 +- 前端视觉和交互裁决以 `frontend-design` skill 为准;项目内重复、过时的视觉规则已治理为噪音,不再作为新页面设计裁决。 +- 现有事实源要求:Trellis task 是新开发执行合同,`docs/` 是业务事实源,历史 Issue CSV 只作为追溯材料。 +- 已完成过多轮前端 Wave 改进,但仍需把 PC 页面一致性和业务页面适配作为收口复查,不应把“做过一轮”误认为“全部页面最终验收完成”。 +- 公司制度资料位于用户整理的公司文档目录,后续只能提炼与 OA 功能相关的制度参数和流程映射,不能泄露合同正文、银行资料、完整账号、Secret 或敏感原文。 + +## Execution Order + +1. **试运行主线继续** + - 继续执行 `05-26-oa-seven-day-trial-live-ops`。 + - 每日只读巡检、人工真实业务反馈、阻断问题分级收口仍在该任务下留证。 + +2. **Day 7 Go/No-Go 证据框架** + - 先整理最终启用判断需要哪些证据、谁负责、缺口如何标记。 + - 证据框架反向指导后续自动化补测、制度映射和页面细修。 + +3. **自动化业务测试缺口补齐** + - 盘点报销、审批、财务付款、AP、票据池、通知、权限、移动/企业微信入口等业务流程的自动化覆盖。 + - 优先补“真实启用前会影响 Go/No-Go 的主路径”,不追求把所有低频页面一次性自动化。 + +4. **公司制度与 OA 功能映射** + - 从已整理制度中提取 OA 应落地的参数、流程、角色、证据和告警点。 + - 输出“制度条款/管理要求 -> OA 功能/流程/缺口/后续动作”的映射,不复制敏感原文。 + +5. **PC 页面一致性细修** + - 使用 `frontend-design` 做设计判断。 + - 优先 A/B 类真实高频页面:登录、工作台、报销、审批、通知、财务/付款/AP/票据池。 + - C 类管理页只做阻碍使用或明显割裂的收口,不做大规模重设计。 + +6. **调研决策项** + - 发票验真付费 API:比较适配国内小公司 OA 的成本、合规、接入难度和稳定性。 + - 企业微信扫码登录/更深镜像:判断是否值得纳入近期,避免把非必需能力挤进最终启用前主线。 + +## Requirements + +- 本任务必须保持 Trellis-only:需求、执行、验证和复盘均写入当前 Trellis task 或既有事实源,不再创建新的历史 Issue CSV 作为默认合同。 +- 不得把本任务做成单纯聊天结论;必须留下可追溯的 PRD、研究/审查结果、测试证据或实现提交。 +- 真实试运行每日巡检仍归 `05-26-oa-seven-day-trial-live-ops`;本任务只引用其结论,不重复制造试运行证据。 +- 自动化补测应优先覆盖后端和前端业务主路径,必要时包含 Playwright/视觉交互验证。 +- 前端页面调整前必须读取 `frontend-design`,并保持 OA 工具型系统应有的安静、紧凑、可扫描、低干扰风格。 +- 公司制度映射只保存脱敏摘要、规则编号、流程要求和 OA 对应关系,不保存敏感原文。 +- 任何公网部署、生产配置、真实数据写入、企业微信写入、数据库重置/恢复、真实付款或付费 API 开通,必须另行获得用户明确批准。 + +## Acceptance Criteria + +- [x] Day 7 Go/No-Go 证据框架已建立,能列出最终启用所需证据、现状、缺口和负责人/来源。 +- [x] 自动化业务测试缺口已盘点,并至少补齐本轮确定的高优先级主路径缺口。 +- [x] 公司制度与 OA 功能映射已形成脱敏清单,标明已支持、需配置、需开发、暂缓四类状态。 +- [x] PC 页面一致性已按 `frontend-design` 复查并完成本轮高优先级细修。 +- [x] 发票验真 API 与企业微信扫码登录/更深镜像已有调研结论和是否进入近期开发的建议。 +- [x] 所有代码改动通过相关后端/前端/业务/视觉验证;如有未跑项,必须说明原因和风险。 +- [ ] 面向用户可测试的改动完成部署与公网检查后,才告知用户可以测试。 + +## Definition of Done + +- 当前任务下的研究、实现、验证和遗留风险可追溯。 +- 不再依赖聊天记忆判断哪些任务完成、哪些未完成。 +- 试运行主线和本地开发线边界清晰,没有把只读巡检、自动化测试、人工真实业务反馈混为一谈。 +- 所有新增或更新的事实源不泄露密码、token、Secret、完整账号、完整本地路径、真实票据、合同正文、银行资料或 raw payload。 + +## Out of Scope + +- 不在本任务中直接宣布 OALAUNCH1 最终正式启用完成。 +- 不执行真实付款、不开通银行接口、不写 ERP、不导入银行流水。 +- 不在没有单独批准的情况下调用企业微信写接口、批量同步真实员工或启用更深镜像。 +- 不在没有单独批准的情况下采购或开通发票验真付费 API。 +- 不恢复差旅、不开启图片 OCR、不扩展复杂 BPM、不建设预算硬控或 RuleOps。 +- 不把公司制度、合同、账号、银行、客户或供应商敏感原文搬进 OA 或 Trellis 证据。 + +## Test Plan + +- Trellis/task 合规: + ```bash + python3 ./.trellis/scripts/task.py validate 05-28-oalaunch1-parallel-closeout + node scripts/qa/check-trellis-governance.mjs + git diff --check + ``` +- 后端相关改动: + ```bash + cd server && npm run prisma:validate + ``` +- 前端相关改动: + ```bash + cd client && npm run typecheck && npm run build + ``` +- 业务流程自动化: + - 优先复用现有 `scripts/qa/` 和 Playwright 流程。 + - 新增补测必须保存脱敏报告或摘要到当前 task 的 `research/` 或既有 artifacts 索引。 +- 公网/试运行: + - 只读巡检继续在 `05-26-oa-seven-day-trial-live-ops` 下执行。 + - 本任务如产出面向用户可测试的改动,部署和公网检查需另行批准后执行。 + +## Technical Notes + +- Workflow: `.trellis/workflow.md` +- Active live-ops task: `.trellis/tasks/05-26-oa-seven-day-trial-live-ops/` +- Product facts: `docs/文档事实源状态矩阵.md`、`docs/产品设计规则.md` +- Trial runbook: `docs/试运行与自动化验证手册.md` +- Admin runbook: `docs/管理员手册.md` +- Frontend decision authority: `frontend-design` diff --git a/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-approval-rerun-2/summary.json b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-approval-rerun-2/summary.json new file mode 100644 index 00000000..07f475ee --- /dev/null +++ b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-approval-rerun-2/summary.json @@ -0,0 +1,12 @@ +{ + "issueId": null, + "baseURL": "http://127.0.0.1:3001", + "commit": "c8b41a4", + "checkedAt": "2026-05-28T07:36:37.322Z", + "status": "PASS", + "mode": "business-flow-attached", + "reportDir": ".trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-approval-rerun-2", + "reportRef": ".trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-approval-rerun-2", + "groups": "approval", + "notes": "业务流门禁按 BUSINESS_FLOW_GROUPS 选择领域执行;summary.txt 保留逐组通过/失败明细。" +} \ No newline at end of file diff --git a/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-approval-rerun-2/summary.txt b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-approval-rerun-2/summary.txt new file mode 100644 index 00000000..f7b27ce9 --- /dev/null +++ b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-approval-rerun-2/summary.txt @@ -0,0 +1,2 @@ +>>> [business-flow] approval +[business-flow][PASS] approval diff --git a/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-approval-rerun/summary.json b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-approval-rerun/summary.json new file mode 100644 index 00000000..128d2cd7 --- /dev/null +++ b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-approval-rerun/summary.json @@ -0,0 +1,12 @@ +{ + "issueId": null, + "baseURL": "http://127.0.0.1:3001", + "commit": "c8b41a4", + "checkedAt": "2026-05-28T07:32:16.380Z", + "status": "FAIL", + "mode": "business-flow-attached", + "reportDir": ".trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-approval-rerun", + "reportRef": ".trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-approval-rerun", + "groups": "approval", + "notes": "业务流门禁按 BUSINESS_FLOW_GROUPS 选择领域执行;summary.txt 保留逐组通过/失败明细。" +} \ No newline at end of file diff --git a/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-approval-rerun/summary.txt b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-approval-rerun/summary.txt new file mode 100644 index 00000000..6fe273f8 --- /dev/null +++ b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-approval-rerun/summary.txt @@ -0,0 +1,2 @@ +>>> [business-flow] approval +[business-flow][FAIL] approval diff --git a/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-governance-rerun/summary.json b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-governance-rerun/summary.json new file mode 100644 index 00000000..917af3aa --- /dev/null +++ b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-governance-rerun/summary.json @@ -0,0 +1,12 @@ +{ + "issueId": null, + "baseURL": "http://127.0.0.1:3001", + "commit": "c8b41a4", + "checkedAt": "2026-05-28T07:42:47.640Z", + "status": "PASS", + "mode": "business-flow-attached", + "reportDir": ".trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-governance-rerun", + "reportRef": ".trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-governance-rerun", + "groups": "governance", + "notes": "业务流门禁按 BUSINESS_FLOW_GROUPS 选择领域执行;summary.txt 保留逐组通过/失败明细。" +} \ No newline at end of file diff --git a/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-governance-rerun/summary.txt b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-governance-rerun/summary.txt new file mode 100644 index 00000000..00df318b --- /dev/null +++ b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-governance-rerun/summary.txt @@ -0,0 +1,2 @@ +>>> [business-flow] governance +[business-flow][PASS] governance diff --git a/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-p0-final/summary.json b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-p0-final/summary.json new file mode 100644 index 00000000..89beb1a4 --- /dev/null +++ b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-p0-final/summary.json @@ -0,0 +1,12 @@ +{ + "issueId": null, + "baseURL": "http://127.0.0.1:3001", + "commit": "c8b41a4", + "checkedAt": "2026-05-28T07:28:01.883Z", + "status": "FAIL", + "mode": "business-flow-attached", + "reportDir": ".trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-p0-final", + "reportRef": ".trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-p0-final", + "groups": "auth,reimbursement,approval,procurement,governance", + "notes": "业务流门禁按 BUSINESS_FLOW_GROUPS 选择领域执行;summary.txt 保留逐组通过/失败明细。" +} \ No newline at end of file diff --git a/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-p0-final/summary.txt b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-p0-final/summary.txt new file mode 100644 index 00000000..5051e41a --- /dev/null +++ b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-p0-final/summary.txt @@ -0,0 +1,6 @@ +>>> [business-flow] auth +[business-flow][PASS] auth +>>> [business-flow] reimbursement +[business-flow][PASS] reimbursement +>>> [business-flow] approval +[business-flow][FAIL] approval diff --git a/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-p0-pass/summary.json b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-p0-pass/summary.json new file mode 100644 index 00000000..479b2c6a --- /dev/null +++ b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-p0-pass/summary.json @@ -0,0 +1,12 @@ +{ + "issueId": null, + "baseURL": "http://127.0.0.1:3001", + "commit": "c8b41a4", + "checkedAt": "2026-05-28T07:54:26.343Z", + "status": "PASS", + "mode": "business-flow-attached", + "reportDir": ".trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-p0-pass", + "reportRef": ".trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-p0-pass", + "groups": "auth,reimbursement,approval,procurement,governance", + "notes": "业务流门禁按 BUSINESS_FLOW_GROUPS 选择领域执行;summary.txt 保留逐组通过/失败明细。" +} \ No newline at end of file diff --git a/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-p0-pass/summary.txt b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-p0-pass/summary.txt new file mode 100644 index 00000000..65a0be3c --- /dev/null +++ b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-p0-pass/summary.txt @@ -0,0 +1,10 @@ +>>> [business-flow] auth +[business-flow][PASS] auth +>>> [business-flow] reimbursement +[business-flow][PASS] reimbursement +>>> [business-flow] approval +[business-flow][PASS] approval +>>> [business-flow] procurement +[business-flow][PASS] procurement +>>> [business-flow] governance +[business-flow][PASS] governance diff --git a/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-p0-rerun/summary.json b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-p0-rerun/summary.json new file mode 100644 index 00000000..bb160743 --- /dev/null +++ b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-p0-rerun/summary.json @@ -0,0 +1,12 @@ +{ + "issueId": null, + "baseURL": "http://127.0.0.1:3001", + "commit": "c8b41a4", + "checkedAt": "2026-05-28T07:10:03.376Z", + "status": "FAIL", + "mode": "business-flow-attached", + "reportDir": ".trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-p0-rerun", + "reportRef": ".trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-p0-rerun", + "groups": "auth,reimbursement,approval,procurement,governance", + "notes": "业务流门禁按 BUSINESS_FLOW_GROUPS 选择领域执行;summary.txt 保留逐组通过/失败明细。" +} \ No newline at end of file diff --git a/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-p0-rerun/summary.txt b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-p0-rerun/summary.txt new file mode 100644 index 00000000..a0ab6e8c --- /dev/null +++ b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-p0-rerun/summary.txt @@ -0,0 +1,4 @@ +>>> [business-flow] auth +[business-flow][PASS] auth +>>> [business-flow] reimbursement +[business-flow][FAIL] reimbursement diff --git a/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-p0-tail/summary.json b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-p0-tail/summary.json new file mode 100644 index 00000000..acfa38ea --- /dev/null +++ b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-p0-tail/summary.json @@ -0,0 +1,12 @@ +{ + "issueId": null, + "baseURL": "http://127.0.0.1:3001", + "commit": "c8b41a4", + "checkedAt": "2026-05-28T07:39:53.008Z", + "status": "FAIL", + "mode": "business-flow-attached", + "reportDir": ".trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-p0-tail", + "reportRef": ".trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-p0-tail", + "groups": "procurement,governance", + "notes": "业务流门禁按 BUSINESS_FLOW_GROUPS 选择领域执行;summary.txt 保留逐组通过/失败明细。" +} \ No newline at end of file diff --git a/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-p0-tail/summary.txt b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-p0-tail/summary.txt new file mode 100644 index 00000000..f9603474 --- /dev/null +++ b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-p0-tail/summary.txt @@ -0,0 +1,4 @@ +>>> [business-flow] procurement +[business-flow][PASS] procurement +>>> [business-flow] governance +[business-flow][FAIL] governance diff --git a/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-p0/summary.json b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-p0/summary.json new file mode 100644 index 00000000..a83e11bc --- /dev/null +++ b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-p0/summary.json @@ -0,0 +1,12 @@ +{ + "issueId": null, + "baseURL": "http://127.0.0.1:3001", + "commit": "c8b41a4", + "checkedAt": "2026-05-28T06:56:14.106Z", + "status": "FAIL", + "mode": "business-flow-attached", + "reportDir": ".trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-p0", + "reportRef": ".trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-p0", + "groups": "auth,reimbursement,approval,procurement,governance", + "notes": "业务流门禁按 BUSINESS_FLOW_GROUPS 选择领域执行;summary.txt 保留逐组通过/失败明细。" +} \ No newline at end of file diff --git a/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-p0/summary.txt b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-p0/summary.txt new file mode 100644 index 00000000..25e9da1f --- /dev/null +++ b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-p0/summary.txt @@ -0,0 +1,2 @@ +>>> [business-flow] auth +[business-flow][FAIL] auth diff --git a/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-payment-batch-fix/summary.json b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-payment-batch-fix/summary.json new file mode 100644 index 00000000..10812e2d --- /dev/null +++ b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-payment-batch-fix/summary.json @@ -0,0 +1,12 @@ +{ + "issueId": null, + "baseURL": "http://127.0.0.1:3001", + "commit": "c8b41a4", + "checkedAt": "2026-05-28T07:19:30.812Z", + "status": "FAIL", + "mode": "business-flow-attached", + "reportDir": ".trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-payment-batch-fix", + "reportRef": ".trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-payment-batch-fix", + "groups": "reimbursement", + "notes": "业务流门禁按 BUSINESS_FLOW_GROUPS 选择领域执行;summary.txt 保留逐组通过/失败明细。" +} \ No newline at end of file diff --git a/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-payment-batch-fix/summary.txt b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-payment-batch-fix/summary.txt new file mode 100644 index 00000000..c1af9590 --- /dev/null +++ b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-payment-batch-fix/summary.txt @@ -0,0 +1,2 @@ +>>> [business-flow] reimbursement +[business-flow][FAIL] reimbursement diff --git a/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-payment-batch-fix2/summary.json b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-payment-batch-fix2/summary.json new file mode 100644 index 00000000..091bba01 --- /dev/null +++ b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-payment-batch-fix2/summary.json @@ -0,0 +1,12 @@ +{ + "issueId": null, + "baseURL": "http://127.0.0.1:3001", + "commit": "c8b41a4", + "checkedAt": "2026-05-28T07:22:39.683Z", + "status": "PASS", + "mode": "business-flow-attached", + "reportDir": ".trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-payment-batch-fix2", + "reportRef": ".trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-payment-batch-fix2", + "groups": "reimbursement", + "notes": "业务流门禁按 BUSINESS_FLOW_GROUPS 选择领域执行;summary.txt 保留逐组通过/失败明细。" +} \ No newline at end of file diff --git a/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-payment-batch-fix2/summary.txt b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-payment-batch-fix2/summary.txt new file mode 100644 index 00000000..73ec6fdb --- /dev/null +++ b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-payment-batch-fix2/summary.txt @@ -0,0 +1,2 @@ +>>> [business-flow] reimbursement +[business-flow][PASS] reimbursement diff --git a/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-r89-fix/summary.json b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-r89-fix/summary.json new file mode 100644 index 00000000..b36796a8 --- /dev/null +++ b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-r89-fix/summary.json @@ -0,0 +1,12 @@ +{ + "issueId": null, + "baseURL": "http://127.0.0.1:3001", + "commit": "c8b41a4", + "checkedAt": "2026-05-28T07:01:03.526Z", + "status": "PASS", + "mode": "business-flow-attached", + "reportDir": ".trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-r89-fix", + "reportRef": ".trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-r89-fix", + "groups": "auth", + "notes": "业务流门禁按 BUSINESS_FLOW_GROUPS 选择领域执行;summary.txt 保留逐组通过/失败明细。" +} \ No newline at end of file diff --git a/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-r89-fix/summary.txt b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-r89-fix/summary.txt new file mode 100644 index 00000000..c6da8236 --- /dev/null +++ b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-r89-fix/summary.txt @@ -0,0 +1,2 @@ +>>> [business-flow] auth +[business-flow][PASS] auth diff --git a/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-reimbursement-fix/summary.json b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-reimbursement-fix/summary.json new file mode 100644 index 00000000..8e06686d --- /dev/null +++ b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-reimbursement-fix/summary.json @@ -0,0 +1,12 @@ +{ + "issueId": null, + "baseURL": "http://127.0.0.1:3001", + "commit": "c8b41a4", + "checkedAt": "2026-05-28T07:16:20.204Z", + "status": "FAIL", + "mode": "business-flow-attached", + "reportDir": ".trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-reimbursement-fix", + "reportRef": ".trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-reimbursement-fix", + "groups": "reimbursement", + "notes": "业务流门禁按 BUSINESS_FLOW_GROUPS 选择领域执行;summary.txt 保留逐组通过/失败明细。" +} \ No newline at end of file diff --git a/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-reimbursement-fix/summary.txt b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-reimbursement-fix/summary.txt new file mode 100644 index 00000000..c1af9590 --- /dev/null +++ b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-reimbursement-fix/summary.txt @@ -0,0 +1,2 @@ +>>> [business-flow] reimbursement +[business-flow][FAIL] reimbursement diff --git a/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-test-gap-inventory.md b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-test-gap-inventory.md new file mode 100644 index 00000000..2844419f --- /dev/null +++ b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-test-gap-inventory.md @@ -0,0 +1,145 @@ +# 自动化业务测试缺口盘点 + +## Scope + +本盘点服务 OALAUNCH1 最终启用前的自动化测试收口。目标不是一次性扩大所有自动化,而是找出影响 Day 7 Go/No-Go 的主路径缺口,并给出先后顺序。 + +## Existing Coverage + +### 项目级流程覆盖扫描 + +已运行: + +```bash +node scripts/qa/check-flow-coverage.mjs --markdown .trellis/tasks/05-28-oalaunch1-parallel-closeout/research/flow-coverage-audit.md --json +``` + +结果摘要: + +| 指标 | 结果 | +| --- | ---: | +| 前端路由数 | 69 | +| 业务域数 | 5 | +| 后端 route 文件数 | 68 | +| P0 含缺口路由数 | 0 | +| highRiskGapCount | 0 | + +已生成详细报告:`research/flow-coverage-audit.md`。 + +注意:该扫描是“路由/关键词/用例存在性”级别的覆盖盘点,可以证明没有明显 P0 空白,但不能替代业务闭环实际执行结果。 + +### 业务流门禁分组 + +`scripts/qa/run-business-flow-gates.sh list` 当前覆盖: + +| 业务域 | 代表用例 | +| --- | --- | +| auth | 登录页、企业微信入口、绑定、移动登录导航 | +| reimbursement | 报销进度、发票 OCR、付款批次、报销主流程、发票护栏、删除后重传 | +| approval | 快速审批、移动审批离线态 | +| leave | 请假流程、团队日历 | +| collaboration | 周报/待办、公告在场、全局搜索 | +| hr | 用户入职、自动化缺口填补 | +| project | 项目工作台、敏感边界 | +| procurement | 采购流程 | +| asset | 资产流程 | +| travel | 差旅付款、差旅对账 | +| governance | 权限直连、系统治理 | + +### 后端回归/单测覆盖 + +已有后端脚本和单测覆盖: + +- `server/scripts/regression-all.sh` +- `server/scripts/regression-workflow-actions.sh` +- `server/scripts/regression-payment-batches.sh` +- `server/scripts/regression-procurement.sh` +- `server/scripts/regression-dedup.sh` +- `server/scripts/regression-ocr.sh` +- `server/tests/unit/routes/reimbursements.*.test.js` +- `server/tests/unit/routes/workflow.*.test.js` +- `server/tests/unit/routes/paymentBatches.reimbursement.test.js` +- `server/tests/unit/routes/invoicePool.*.test.js` +- `server/tests/unit/routes/notifications.test.js` +- `server/tests/unit/routes/announcements.test.js` +- `server/tests/unit/services/email.test.js` +- `server/tests/unit/services/verification.test.js` + +## Go/No-Go Relevant Gaps + +| 优先级 | 缺口 | 现状 | 建议动作 | +| --- | --- | --- | --- | +| P0 | 当前分支业务流门禁是否全绿 | 有脚本和用例清单,但本任务尚未复跑完整 `business-flow-local` | 先跑本地最小高优先级分组:auth、reimbursement、approval、procurement、governance | +| P0 | 报销 -> 审批 -> 付款批次 -> AP 的自动化闭环是否覆盖最新页面 | 已有 `reimbursement-payment-batch-flow.spec.ts` 和后端付款批次测试 | 复跑并根据失败补修;若通过则作为 Go/No-Go 自动化证据 | +| P0 | 登录页找回密码/验证码/Tab 顺序/输入不丢失回归 | 已有 `login-portal-ux.spec.ts`,前序功能已修过 | 复跑 auth 分组;若缺验证码/找回密码断言则补充 | +| P0 | 审批详情/通知直达实际业务对象 | 有审批和通知用例,但通知直达是否完整覆盖最新关键业务需复核 | 检查 `workflow-action-confirm-ui`、`workflow-quick-approve`、`notifications` 后端单测;必要时补 E2E | +| P1 | 财务/AP/票据池 PC 页面视觉/操作一致性 | Wave4 已有视觉用例和公网只读巡检 | 在前端一致性复查中处理;不阻塞自动化主路径 | +| P1 | 制度签收与制度/OA 映射自动化 | 已有 `announcements-policy-ack.spec.ts` 和后端 announcements 单测 | 制度映射完成后再判断是否需要新增配置/展示测试 | +| P2 | 发票验真付费 API | 现有 verification 相关单测,真实付费 API 未决策 | 先调研,不进入本轮代码实现 | +| P2 | 企业微信扫码登录 | 企业微信入口/绑定已有测试;扫码登录未实现 | 先调研和产品决策,不作为 Day 7 硬门禁 | + +## Recommended First Test Batch + +为了在不扩大风险的情况下快速提升 Go/No-Go 可信度,第一批只跑本地/隔离自动化: + +```bash +BUSINESS_FLOW_GROUPS=auth,reimbursement,approval,procurement,governance \ +BUSINESS_FLOW_REPORT_DIR=.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-p0 \ +bash scripts/qa/run-business-flow-gates.sh local +``` + +配套后端: + +```bash +cd server && npm run prisma:validate +cd server && ./scripts/regression-workflow-actions.sh +cd server && ./scripts/regression-payment-batches.sh +cd server && ./scripts/regression-procurement.sh +``` + +如果第一批通过,再进入第二批: + +```bash +BUSINESS_FLOW_GROUPS=leave,collaboration,hr,project,asset \ +BUSINESS_FLOW_REPORT_DIR=.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-p1 \ +bash scripts/qa/run-business-flow-gates.sh local +``` + +## Execution Results + +### P0 final pass + +最终 P0 组合已复跑通过: + +```bash +QA_SKIP_CLIENT_BUILD=1 BUSINESS_FLOW_GROUPS=auth,reimbursement,approval,procurement,governance \ +BUSINESS_FLOW_REPORT_DIR=.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/business-flow-p0-pass \ +bash scripts/qa/run-business-flow-gates.sh local +``` + +结果: + +| 业务域 | 结果 | +| --- | --- | +| auth | PASS,16 passed | +| reimbursement | PASS,10 passed,1 skipped | +| approval | PASS,3 passed | +| procurement | PASS,1 passed | +| governance | PASS,9 passed | + +证据目录:`research/business-flow-p0-pass/`。 + +### Fixes made during rerun + +- `auth` 初次失败点来自旧移动登录测试未 mock `/api/auth/capabilities`,已补 mock,`business-flow-r89-fix` 通过。 +- `reimbursement` 失败点来自付款批次页面 selector 与页面结构演进不一致,已补稳定 `data-testid` 并修正断言,`business-flow-payment-batch-fix2` 通过。 +- `approval` 初次阻塞来自本地 Playwright WebKit 缺失;安装 WebKit 后发现移动审批测试仍用冻结的差旅流程造数据,已改为请假流程,`business-flow-approval-rerun-2` 通过。 +- `governance` 失败点来自测试仍期望员工可直连差旅列表并被收敛为本人范围;当前契约是非 admin 差旅权限冻结,已改为 403 期望,`business-flow-governance-rerun` 通过。 + +## Decision + +当前判断: + +- P0 自动化业务流已具备 Go/No-Go 证据价值。 +- 本轮缺口主要是测试契约与当前产品冻结策略/页面结构不同步,不是缺少主路径自动化骨架。 +- 下一步可并行推进制度/OA 映射、PC 一致性细修和发票验真/企微扫码调研;P1/P2 业务流可按风险继续补跑,但不应阻塞当前 P0 结论。 diff --git a/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/company-policy-oa-mapping.md b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/company-policy-oa-mapping.md new file mode 100644 index 00000000..3e048ca0 --- /dev/null +++ b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/company-policy-oa-mapping.md @@ -0,0 +1,51 @@ +# 公司制度与 OA 功能映射清单 + +## Scope + +本清单基于公司制度体系建设包中的制度草案、联调矩阵、待确认参数、RACI 和签收材料,提炼 OA 需要承接的流程、角色、参数和证据。本文只保存脱敏摘要,不保存合同正文、银行资料、完整账号、完整本地路径、敏感报价、身份证件、密钥或原始凭证。 + +## Status Legend + +| 状态 | 含义 | +| --- | --- | +| 已支持 | 当前 OA 已有主流程或可通过现有功能承接 | +| 需配置 | 不需要新开发,但上线前需确认制度参数、角色、开关或基础数据 | +| 需开发 | 现有 OA 尚不能完整承接,需要后续功能任务 | +| 暂缓 | 制度要求重要,但不建议压入 OALAUNCH1 正式启用前 | + +## Mapping + +| 制度/管理要求 | OA 对应功能 | 当前状态 | 建议动作 | +| --- | --- | --- | --- | +| 授权审批:申请人提交、负责人审核、财务复核、管理层按风险/金额最终批准;禁止自审 | workflow 任务、审批人权限、admin-only 自审拒绝、审计日志 | 已支持 | 保持“逐单审批 + 角色留痕”作为 V1 口径;金额阈值不得写死 | +| 金额分级、小额/一般/重大阈值、预算外审批 | 审批规则、费用标准、预算/风险提示 | 需配置 | 管理层确认阈值后录入配置;V1 先用说明字段和风险提示,不做预算硬阻断 | +| 报销资料、PDF 发票、重复报销、付款批次、银行回单、AP/代账导出 | 报销、PDF OCR、发票护栏、付款批次、回单附件、AP 台账/导出 | 已支持 | 已通过 P0 自动化;真实试运行仍需至少 1 条真实业务闭环留证 | +| 付款前置条件:审批、合同/采购依据、验收、付款节点、收款账户一致、凭证齐全 | 付款批次、附件、AP 台账、审批记录 | 已支持 | V1 不导入银行流水原件;只记录付款批次、回单附件和导出证据 | +| 采购申请、必要性审核、财务预算审核、验收付款、采购台账 | 采购申请、审批、供应商/项目/成本中心基础数据、付款/AP 关联 | 已支持 | 保持小团队 V1:申请、审核、付款前置资料和验收留痕,不建设复杂招投标 | +| 供应商准入、黑名单、评价、多方询价、单一来源 | 供应商主数据、采购附件/说明 | 需开发 | 先用供应商摘要和附件承接;供应商评价/黑名单/多方询价结构化后续开发 | +| 固定资产购置、资产编号、领用、盘点、维修、报废 | 资产台账、资产流程、盘点用例 | 已支持 | 资产 V1 可用;软件/云资源/备份介质只登记元数据,不登记密钥 | +| 电子资产:文档索引、系统资产、代码仓库元数据、备份介质 | 资产台账扩展、资料索引 | 需配置 | 采用 `FA`/`EA-*` 分类口径;账号资产卡暂缓,不保存密码/Secret | +| 员工制度民主程序、发布、宣贯、签收、未签收提醒和导出证据 | 公告/制度签收、员工回执、后台汇总 | 已支持 | 适合作为制度发布 V1;不等同电子签章或合同签署 | +| 入职:合同、保密/IP、制度签收、设备领用、权限开通 | 员工、人事资料、公告签收、资产、权限 | 需开发 | 当前可分散留痕;完整入职清单/权限申请闭环建议后续开发 | +| 离职:工作交接、资产归还、权限回收、财务核对、保密义务 | 员工状态、资产、审计、权限 | 需开发 | 建议建立离职交接任务清单和权限回收记录;OALAUNCH1 不强塞 | +| 请假、考勤、加班、异常考勤说明 | 请假、移动审批、考勤/企微边界 | 需配置 | 企微仍是考勤主系统边界;OA 保留请假/审批和必要摘要 | +| 信息安全:最小权限、岗位授权、临时权限、定期复核、离职回收 | RBAC、权限直连审计、系统设置、审计日志 | 部分已支持 | 当前支持系统内权限与审计;跨系统权限申请/复核/回收需开发 | +| 凭据边界:密码、token、Secret、私钥、完整连接串不得进入 OA | 安全边界、配置规范、敏感扫描 | 已支持 | 继续禁止 OA/文档/聊天/仓库保存凭据;只登记负责人和回收要求 | +| 资料分级、外发审批、借阅复制、资料保管期限、销毁记录 | 档案/资料索引、审计、附件脱敏边界 | 需开发 | 当前只适合登记摘要、编号、负责人、状态、hash 或受控外部编号 | +| 合同会审、用印、合同台账、履约节点、归档 | 合同台账、附件摘要、项目/付款联动 | 需开发 | 已有合同台账基础,但合同会审/用印/履约节点闭环需单独任务 | +| 项目验收、开票、回款、应收预警、归档 | 项目、合同/财务/AP/档案联动 | 需开发 | 项目资料有基础入口;回款和应收预警不进入本次启用硬门禁 | +| 差旅标准、招待费标准、借款核销期限 | 费用标准、报销规则、差旅模块 | 暂缓 | 标准需管理层确认;差旅权限当前冻结,真实启用前不作为主路径 | +| 银行流水原件导入、真实付款、银行接口、ERP 写入 | 付款批次/AP 导出/集成边界 | 暂缓 | 不在 OALAUNCH1 中启用;保持线下付款和只读/导出边界 | + +## Go/No-Go Implications + +- OALAUNCH1 可以先启用“报销/审批/付款批次/AP 导出/制度签收/权限审计/基础采购和资产台账”的轻量 OA 闭环。 +- 上线前必须配置或确认:审批角色、费用标准、法人主体、成本中心、报销类型、制度签收范围、管理员权限、通知策略。 +- 不应在正式启用前强行加入:合同会审用印闭环、供应商生命周期、入离职全流程、跨系统权限工单、银行流水导入、真实付款接口、预算硬控、差旅完整启用。 + +## Suggested Follow-up Tasks + +1. 制度参数配置任务:把“待确认参数清单”转成 OA 配置项和默认试运行口径。 +2. 入离职/权限回收任务:设计员工入职、离职交接、资产归还、权限回收的轻量流程。 +3. 合同/用印/档案任务:基于合同台账扩展会审、用印、履约节点和归档证据。 +4. 供应商评价任务:扩展供应商准入、评价、黑名单和单一来源留痕。 diff --git a/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/day7-go-no-go-evidence-framework.md b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/day7-go-no-go-evidence-framework.md new file mode 100644 index 00000000..5227b18c --- /dev/null +++ b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/day7-go-no-go-evidence-framework.md @@ -0,0 +1,95 @@ +# Day 7 Go/No-Go 证据框架 + +## Purpose + +用于 OALAUNCH1 Day 7 最终启用判断。本文不宣布正式启用完成,只定义 Day 7 前必须看哪些证据、如何判定 Go / Conditional Go / No-Go,以及当前截至 2026-05-28 的缺口。 + +## Decision Options + +| 结论 | 口径 | 后续动作 | +| --- | --- | --- | +| `GO` | 必需证据齐全,P0/P1 阻断为 0,冻结项未误开,真实业务主路径可解释通过 | 进入小团队正式启用,保留首周运营巡检 | +| `CONDITIONAL_GO` | 核心主路径可用,但存在可接受 finding 或低频页面体验问题 | 指定 owner、处理日期和接受理由,进入正式启用但保留问题池 | +| `NO_GO` | 登录、提交、审批、付款、权限、附件、OCR、审计、移动/企微入口任一核心阻断不可解释 | 暂停正式启用,拆最小修复任务后复检 | + +## Evidence Matrix + +| 证据域 | 必需证据 | 当前状态 | 证据来源 | Day 7 缺口/动作 | +| --- | --- | --- | --- | --- | +| 7 天每日只读巡检 | Day 1-Day 7 每日 `PASS_OA_REAL_USE_DAILY_READY` 或可解释 finding | Day 1-Day 3 已 PASS,findingCount=0 | `.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/summary.json`、`day2-oa-real-use-daily/summary.json`、`day3-oa-real-use-daily/summary.json` | Day 4-Day 7 按 OAOPS1 继续跑;finding 必须当天归类 | +| 公网健康与登录 | `/ready`、live smoke 环境、角色只读 smoke、认证只读探针通过 | Day 1-Day 3 已覆盖;Wave4 部署后公网巡检 PASS | OAOPS1 日报、`postdeploy-20260527-wave4-public/summary.json` | Day 7 复跑最终 readiness;登录页体验问题不得复发 | +| 功能开关与冻结项 | `payment_batch_v1=force_on`,`erp_sync=force_off`,图片 OCR/真实支付/ERP/预算硬控/复杂 BPM 等未误开 | Day 1-Day 3 已 PASS;Wave4 后 PASS | OAOPS1 `live-feature-flags.step.json` | Day 7 再确认;任何冻结项误开即 No-Go | +| 报销/PDF OCR/发票 | 至少 1 条真实报销 PDF OCR -> 审批 -> 付款批次 -> 银行回单 -> 已付款 -> AP 导出 | 自动化 readiness 已通过;真实业务人工闭环需要现场证据 | OAOPS1 manual gates、现场人工问题登记 | 需现场给出脱敏业务编号/状态,不保存票据原件、金额、完整账号 | +| 审批中心 | 审批人能从待办进入详情,审批/退回动作符合权限和状态机 | 自动化与页面整改已有历史证据;真实试运行中需继续观察 | 既有回归、OAOPS1 人工反馈 | Day 7 汇总审批阻断数、退回/补材料是否可解释 | +| 财务/付款/AP/票据池 | 财务复核、付款批次、回单附件、已付款标记、AP 导出、票据抽查可用 | Wave4 财务页部署后只读巡检 PASS | `postdeploy-20260527-wave4-public/summary.md` | 仍需真实业务人工闭环证据;真实付款只能线下人工执行 | +| 采购/费用/项目/合同 | 至少 1 条采购/费用审批并关联项目或合同;合同台账含归档位置和权限检查 | 自动化/历史证据存在,真实试运行仍需人工样本 | docs/runbook、OAOPS1 manual gates | Day 7 收集脱敏样本状态和权限检查结论 | +| 通知与企业微信入口 | 站内通知、移动入口、企业微信入口/渲染矩阵通过;消息/deeplink 无阻断 | Day 1-Day 3 入口矩阵 PASS;Wave4 后 PASS | OAOPS1 `mobile-entry-matrix`、`wecom-rendering-matrix`、`wecom-entry` | 真机人工反馈若有阻断必须登记;扫码登录仍属调研项,不进 Day 7 硬门禁 | +| PC 页面一致性 | A/B 类高频页无明显割裂、冗余、操作复杂或布局阻碍 | Wave2-Wave4 已做过多轮;仍需最终一致性复查 | 当前任务后续 PC 复查结果 | 只修高优先级问题;不做大规模重设计 | +| 制度与 OA 对应 | 关键公司制度要求能映射到 OA 功能、配置、流程或后续缺口 | 已完成制度签收轻量回执;完整映射待做 | 当前任务后续制度/OA 映射 | 输出脱敏映射清单,不搬运制度敏感原文 | +| 安全与隐私 | 报告无 secret、token、完整账号、真实票据/合同/银行资料、完整本地路径或 raw payload | Day 1-Day 3 报告隐私扫描 PASS;Wave4 后 PASS | OAOPS1 `report-privacy-smoke.step.json` | Day 7 最终报告继续跑隐私扫描 | +| 自动化业务补测 | Go/No-Go 相关后端/前端主路径有可跑脚本或明确 SKIP 原因 | 待当前任务盘点和补齐 | 当前任务后续 `business-test-gap-inventory` | 优先补报销、审批、财务/AP、通知/权限主路径 | + +## Current Snapshot + +- Day 1:2026-05-26,只读巡检 `PASS_OA_REAL_USE_DAILY_READY`,findingCount=0。 +- Day 2:2026-05-27,只读巡检 `PASS_OA_REAL_USE_DAILY_READY`,findingCount=0;首次企业微信渲染测试 mock 缺口已修复并复跑通过。 +- Day 3:2026-05-28,只读巡检 `PASS_OA_REAL_USE_DAILY_READY`,findingCount=0。 +- Wave4 财务/管理页部署后公网只读巡检:`PASS_OA_REAL_USE_DAILY_READY`,findingCount=0。 +- 仍不能提前宣布最终启用完成,因为 Day 4-Day 7、真实业务人工闭环、制度/OA 映射、自动化补测和最终 Go/No-Go 汇总尚未完成。 + +## Blocker Rules + +出现以下情况,Day 7 结论直接进入 `NO_GO` 或至少 `CONDITIONAL_GO`,不得写成无条件 `GO`: + +- 无法登录、登录页自动刷新导致输入丢失、验证码/找回密码主路径不可用。 +- 普通员工无法提交核心单据,审批人无法处理待办,财务无法完成付款/AP 主路径。 +- 权限越权、未授权用户能看到敏感数据,或审计留痕缺失。 +- 真实 PDF OCR 大面积失败且不可解释;图片 OCR 被误当成已开放能力。 +- `payment_batch_v1` 意外关闭、`erp_sync` 意外开启,或冻结项被误开启。 +- 企业微信/移动入口无法进入 OA 目标页,且没有可接受的人工绕行。 +- 证据报告泄露密码、token、Secret、完整账号、票据原件、合同正文、银行资料、完整本地路径或 raw payload。 + +## Day 7 Report Skeleton + +```markdown +# OALAUNCH1 Day 7 Go/No-Go 汇总 + +## Decision + +- 结论:GO / CONDITIONAL_GO / NO_GO +- 日期:2026-06-01 +- 决策人: +- 接受的 finding: +- 必须整改项: + +## Evidence Summary + +| 证据域 | 结论 | 证据引用 | 备注 | +| --- | --- | --- | --- | +| 7 天每日只读巡检 | | | | +| 真实报销/付款/AP 闭环 | | | | +| 审批/通知/移动/企微入口 | | | | +| 采购/合同/项目 | | | | +| PC 页面一致性 | | | | +| 制度/OA 映射 | | | | +| 自动化补测 | | | | +| 安全隐私 | | | | + +## Open Findings + +| 等级 | 问题 | 影响 | owner | 处理日期 | 接受理由 | +| --- | --- | --- | --- | --- | --- | + +## Final Boundaries + +- 真实支付接口、ERP 写入、银行流水导入、图片 OCR、复杂 BPM、预算硬控、RuleOps 继续冻结。 +- 企业微信扫码登录和更深镜像若未另行批准,不作为本次正式启用硬门禁。 +``` + +## Next Actions + +1. 继续 OAOPS1 Day 4-Day 7 每日只读巡检。 +2. 盘点并补齐自动化业务测试缺口。 +3. 形成制度/OA 脱敏映射清单。 +4. 使用 `frontend-design` 做 PC 页面最终一致性复查并修高优先级问题。 +5. 输出发票验真 API、企业微信扫码登录/更深镜像调研建议。 diff --git a/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/flow-coverage-audit.md b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/flow-coverage-audit.md new file mode 100644 index 00000000..a3bd14b6 --- /dev/null +++ b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/flow-coverage-audit.md @@ -0,0 +1,95 @@ +# 项目级流程覆盖扫描 + +- 生成时间:2026-05-28T06:41:16.738Z +- 前端路由数:69 +- 业务域数:5 +- 后端 route 文件数:68 +- P0 含缺口路由数:0 + +## 缺口汇总 + +- none: 0 + +## 业务域 + +| Domain | Tier | Routes | Gaps | Next Action | +| --- | --- | ---: | ---: | --- | +| 认证与企业微信入口 | P0 | 18 | 0 | R7E 前跑公网匿名、带凭据 live readiness 和角色只读核验。 | +| 报销与票据 | P0 | 5 | 0 | R7E 前复跑核心业务流和公网移动矩阵。 | +| 请假与采购 | P0 | 4 | 0 | R7E 前复跑请假/采购列表、详情和返回语义。 | +| 通知与审批效率 | P0 | 1 | 0 | R7E 前复跑通知直达和审批/进度矩阵。 | +| 系统治理和财务 | P1 | 1 | 0 | R7 前确认人员、窗口和回滚联系人。 | + +## 路由覆盖 + +| Route | Domain | Tier | PC | Mobile | WeCom | Visual | Flow | Gaps | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| / | 未映射 | unmapped | Y | Y | Y | Y | Y | - | +| /announcements | 未映射 | unmapped | Y | Y | Y | Y | Y | - | +| /ap-operations | 报销与票据 | P0 | Y | Y | Y | Y | Y | - | +| /assets | 未映射 | unmapped | Y | Y | Y | Y | Y | - | +| /attendance | 未映射 | unmapped | Y | Y | Y | Y | Y | - | +| /audit-logs | 系统治理和财务 | P1 | Y | Y | Y | Y | Y | - | +| /budgets | 未映射 | unmapped | N | Y | Y | Y | Y | - | +| /change-password | 未映射 | unmapped | Y | N | Y | N | Y | - | +| /contracts-registry | 未映射 | unmapped | Y | Y | Y | Y | Y | - | +| /dashboard | 未映射 | unmapped | Y | Y | Y | Y | Y | - | +| /delegations | 未映射 | unmapped | Y | N | Y | Y | Y | - | +| /forgot-password | 未映射 | unmapped | N | Y | Y | N | Y | - | +| /inventory-checks | 未映射 | unmapped | N | Y | Y | Y | Y | - | +| /invoice-pool | 未映射 | unmapped | Y | Y | Y | Y | Y | - | +| /leave-requests | 请假与采购 | P0 | Y | Y | Y | Y | Y | - | +| /login | 认证与企业微信入口 | P0 | Y | Y | Y | Y | Y | - | +| /mobile | 认证与企业微信入口 | P0 | N | Y | Y | Y | Y | - | +| /mobile/approvals | 认证与企业微信入口 | P0 | N | Y | Y | Y | Y | - | +| /mobile/approvals/:taskId | 认证与企业微信入口 | P0 | N | Y | Y | Y | Y | - | +| /mobile/assets/scan | 认证与企业微信入口 | P0 | N | Y | Y | Y | Y | - | +| /mobile/capture | 认证与企业微信入口 | P0 | N | Y | Y | Y | Y | - | +| /mobile/leave | 认证与企业微信入口 | P0 | N | Y | Y | Y | Y | - | +| /mobile/leave/:leaveRequestId | 认证与企业微信入口 | P0 | N | Y | Y | Y | Y | - | +| /mobile/me | 认证与企业微信入口 | P0 | N | Y | Y | Y | Y | - | +| /mobile/notifications | 认证与企业微信入口 | P0 | N | Y | Y | Y | Y | - | +| /mobile/profile | 认证与企业微信入口 | P0 | N | Y | Y | Y | Y | - | +| /mobile/purchase-requests | 认证与企业微信入口 | P0 | N | Y | Y | Y | Y | - | +| /mobile/purchase-requests/:purchaseRequestId | 认证与企业微信入口 | P0 | N | Y | Y | Y | Y | - | +| /mobile/reimbursements | 认证与企业微信入口 | P0 | N | Y | Y | Y | Y | - | +| /mobile/reimbursements/:reimbursementId | 认证与企业微信入口 | P0 | N | Y | Y | Y | Y | - | +| /mobile/wecom-approval-archive | 认证与企业微信入口 | P0 | N | Y | Y | Y | Y | - | +| /notifications | 通知与审批效率 | P0 | Y | Y | Y | Y | Y | - | +| /organization | 未映射 | unmapped | N | Y | Y | Y | Y | - | +| /payment-batches | 未映射 | unmapped | Y | Y | Y | Y | Y | - | +| /payroll | 未映射 | unmapped | N | Y | Y | Y | Y | - | +| /people | 未映射 | unmapped | Y | Y | Y | Y | Y | - | +| /people/:employeeId | 未映射 | unmapped | Y | Y | Y | Y | Y | - | +| /people/stats | 未映射 | unmapped | Y | Y | Y | Y | Y | - | +| /performance | 未映射 | unmapped | N | Y | Y | Y | Y | - | +| /portal | 认证与企业微信入口 | P0 | Y | Y | Y | Y | Y | - | +| /projects | 未映射 | unmapped | Y | Y | Y | Y | Y | - | +| /projects/:projectId | 未映射 | unmapped | Y | Y | Y | Y | Y | - | +| /purchase-requests | 请假与采购 | P0 | Y | Y | Y | Y | Y | - | +| /reimbursements | 报销与票据 | P0 | Y | Y | Y | Y | Y | - | +| /reimbursements/:reimbursementId | 报销与票据 | P0 | Y | Y | Y | Y | Y | - | +| /reimbursements/:reimbursementId/print | 报销与票据 | P0 | Y | Y | Y | Y | Y | - | +| /reimbursements/dashboard | 报销与票据 | P0 | Y | Y | Y | Y | Y | - | +| /settings/profile | 认证与企业微信入口 | P0 | Y | Y | Y | Y | Y | - | +| /system/announcements | 未映射 | unmapped | Y | Y | Y | Y | Y | - | +| /system/approval-rules | 未映射 | unmapped | Y | Y | Y | Y | Y | - | +| /system/cutover | 未映射 | unmapped | Y | Y | Y | Y | Y | - | +| /system/departments | 未映射 | unmapped | Y | Y | Y | Y | Y | - | +| /system/expense-standards | 未映射 | unmapped | Y | Y | Y | Y | Y | - | +| /system/feature-flags | 未映射 | unmapped | Y | Y | Y | Y | Y | - | +| /system/integrations/erp | 未映射 | unmapped | Y | Y | Y | Y | Y | - | +| /system/master-data | 未映射 | unmapped | Y | Y | Y | Y | Y | - | +| /system/notification-channels | 未映射 | unmapped | Y | Y | Y | Y | Y | - | +| /system/reimbursement-templates | 未映射 | unmapped | Y | Y | Y | Y | Y | - | +| /system/settings | 未映射 | unmapped | Y | Y | Y | Y | Y | - | +| /system/users | 未映射 | unmapped | Y | Y | Y | Y | Y | - | +| /system/workflow-definitions | 未映射 | unmapped | Y | Y | Y | Y | Y | - | +| /system/workspace | 未映射 | unmapped | Y | Y | Y | Y | Y | - | +| /team | 未映射 | unmapped | Y | Y | Y | Y | Y | - | +| /todos | 未映射 | unmapped | Y | Y | Y | Y | Y | - | +| /travel-requests | 未映射 | unmapped | Y | Y | Y | Y | Y | - | +| /wecom-approval-archive | 未映射 | unmapped | N | Y | Y | Y | Y | - | +| /weekly-reports | 未映射 | unmapped | Y | Y | Y | Y | Y | - | +| /workflow/tasks | 请假与采购 | P0 | Y | Y | Y | Y | Y | - | +| /workflow/tasks/:taskId | 请假与采购 | P0 | Y | Y | Y | Y | Y | - | diff --git a/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/invoice-verification-wecom-login-research.md b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/invoice-verification-wecom-login-research.md new file mode 100644 index 00000000..3f99db48 --- /dev/null +++ b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/invoice-verification-wecom-login-research.md @@ -0,0 +1,105 @@ +# 发票验真 API 与企业微信扫码登录调研结论 + +调研日期:2026-05-28 + +## Executive Decision + +- **发票验真 API:Pilot First,暂不作为 OALAUNCH1 正式启用前置条件。** +- **企业微信 PC 扫码登录:Pause for OALAUNCH1,后续单独做 `wecom_pc_qr_login_v1`。** +- **企业微信更深镜像:Pause,继续沿用“企微主办 HR/考勤,OA 主办报销/财务/采购/合同/项目”的边界。** + +理由: + +1. 当前系统已经有发票验真的服务边界、feature flag、mock provider 和 `tax` 占位 provider;业务上仍以 PDF OCR、查重和财务人工复核为正式启用前的稳态控制。 +2. 付费验真 API 的关键不只是价格,还包括数电票覆盖、发票字段最小化、供应商数据处理责任、失败/限流兜底和小票量成本。没有供应商正式报价前,不应直接给采购级结论。 +3. 当前登录已经具备账号密码、邮箱验证码、企业微信 WebView/OAuth 入口和绑定链路。PC 扫码登录能改善桌面免密体验,但不是 Day 7 Go/No-Go 阻断项。 +4. 更深企业微信镜像会碰到真实员工、可信 IP、回调、审批/打卡历史和 API 写入边界,风险明显高于本轮最终启用前准备。 + +## Current OA Fit + +现有代码状态: + +- `server/src/services/verification/index.js` 已按 provider 分派,支持 `mock` 和 `tax` 名称。 +- `server/src/services/verification/tax.js` 当前只返回 `tax_provider_not_configured`,说明真实税务/供应商接入尚未启用。 +- `server/src/routes/invoicePool/verification.js` 已有触发、查询、重试和权限入口。 +- `docs/报销发票附件规则.md` 明确“首批发票合规以 OCR、查重和财务人工复核为主,自动验真作为后续评估项”。 +- `server/src/routes/wecomAuth.js` 已有企业微信 OAuth WebView 登录/绑定、state、回调、绑定冲突处理和 session 创建。 + +结论:本轮不需要重做架构;后续只要新增一个真实 provider adapter,并沿用现有 feature flag、审计和 retry 机制。 + +## 发票验真 API 方案比较 + +| 方案 | 适配度 | 成本判断 | 风险 | 建议 | +| --- | --- | --- | --- | --- | +| 官方全国增值税发票查验平台人工查验 | 适合低频人工复核 | 现金成本低 | 不应做爬虫自动化;验证码、频控、合规和稳定性风险高 | 保留为财务人工兜底 | +| API 市场类供应商 | 最适合小团队先试点 | 通常可小额度/按量试用,需控制台或报价确认 | 供应商质量不一;要确认数电票、专票/普票、失败码、发票字段最小化 | 作为第一试点方向 | +| 云厂商 OCR/票据服务 | 工程集成和 SLA 相对稳 | 可能有免费额度/按量,但“识别”和“验真”能力需逐项确认 | 有的产品偏 OCR,不一定等同税务验真 | 作为备选,优先确认是否支持验真 | +| 百望/航信等发票服务商 | 发票业务专业度较高 | 可能偏企业套件或合同报价,小团队成本未必最优 | 接入和商务周期较长 | 后续规模化或强合规时再评估 | + +近期采购判断: + +- **不要在 OALAUNCH1 前采购正式套餐。** +- 若要开始试点,先拿 **100-1000 次小额度测试包/试用额度**,只用授权脱敏样票或低风险真实票据做验证。 +- 试点成功标准: + - 支持当前 PDF OCR 已识别字段可直接入参; + - 覆盖数电票、增值税专票/普票等公司常见票种; + - 返回结果能稳定归一为 `passed / failed / error`; + - 失败码能区分字段不全、查无、限流、供应商错误; + - 日志和报告不保存完整票面、完整税号、完整原始响应或敏感附件; + - 单次成本在当前票量下可接受,并允许随时停用 provider 回到人工复核。 + +建议的落地顺序: + +1. 先保持当前 `mock` provider 和人工复核为生产口径。 +2. 新建独立 Trellis 任务:`invoice_verification_provider_pilot_v1`。 +3. 在私有环境配置供应商 base URL/key,不写入仓库、Trellis 或日志。 +4. 新增 provider adapter,例如 `vendor_http`,只传必要字段:发票代码/号码、开票日期、金额、校验码后几位等供应商要求的最小集合。 +5. 将供应商原始响应脱敏后映射到 OA 统一结果,不把 raw payload 直接落库或展示。 +6. 用授权样票跑后端单测、job retry、权限、前端状态展示和公网只读回归。 + +## 企业微信 PC 扫码登录 + +现状: + +- 现在已有企业微信 WebView OAuth 入口,适合员工在手机企业微信工作台内进入 OA。 +- 普通桌面浏览器点击“企业微信登录”如果仍走 WebView OAuth,用户会困惑,因为该体验天然依赖微信/企业微信环境。 +- 企业微信官方另有“构造扫码登录链接”能力,适合 PC 浏览器展示二维码后由员工企业微信扫码确认。 + +近期判断: + +- **不纳入 OALAUNCH1 前置开发。** +- 当前更急的是确保真实试运行、业务流、权限、备份恢复、财务闭环和页面一致性。 +- PC 扫码登录是体验增强,不是正式启用阻断项;邮箱验证码登录已经能覆盖忘记密码/免密码场景。 + +后续独立任务范围: + +1. 新增 PC QR 登录入口,普通浏览器下展示“企业微信扫码登录”;企业微信 WebView 内仍使用“一键进入”。 +2. 后端新增 QR login mode,复用现有 `state`、回调校验、绑定冲突、session 创建和 `returnTo` 白名单。 +3. 企业微信后台配置可信域名/回调域名/应用可见范围,并用真机扫码验证。 +4. 未绑定用户扫码后不自动创建真实员工,只引导先账号登录并绑定。 +5. E2E 覆盖按钮显示、回调错误态、未绑定提示;真实扫码只作为人工/公网验收证据。 + +## 企业微信更深镜像 + +保持后置。 + +当前边界仍应是: + +- 企业微信主办:通讯录、人事助手、打卡、请假、补卡、外出、加班等 HR/考勤日常动作。 +- OA 主办:报销、付款批次、AP、票据池、采购/费用、合同、项目、敏感附件和审计。 +- 企业微信到 OA:只做脱敏消息、移动入口、OAuth/绑定和必要历史留存。 + +不建议在 OALAUNCH1 前推进更深镜像,因为它会引入真实员工同步、审批/打卡补偿、可信 IP、回调、历史一致性和应急接管等多项门禁。 + +## Source Notes + +- 国家税务总局全国增值税发票查验平台:`https://inv-veri.chinatax.gov.cn/` +- 企业微信“构造扫码登录链接”:`https://developer.work.weixin.qq.com/document/path/91019` +- 企业微信“构造网页授权链接”:`https://developer.work.weixin.qq.com/document/path/91022` +- 企业微信“获取访问用户身份”:`https://developer.work.weixin.qq.com/document/path/91023` +- 腾讯云文字识别 OCR 产品页:`https://cloud.tencent.com/product/ocr` +- 百度智能云票据文字识别产品页:`https://cloud.baidu.com/product/ocr_receipts` +- 阿里云云市场发票验真检索入口:`https://market.aliyun.com/search?keywords=%E5%8F%91%E7%A5%A8%E9%AA%8C%E7%9C%9F` +- 百望股份官网:`https://www.baiwang.com/` + +以上公开网页用于确认能力方向和集成边界;价格、票种覆盖和 SLA 仍必须以供应商控制台、合同报价或试用开通结果为准。 diff --git a/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/pc-consistency-frontend-design-review.md b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/pc-consistency-frontend-design-review.md new file mode 100644 index 00000000..e688aa17 --- /dev/null +++ b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/research/pc-consistency-frontend-design-review.md @@ -0,0 +1,55 @@ +# PC 页面一致性复查 + +## Method + +设计判断使用 `frontend-design`,但按 OA 工具型系统约束落地为安静、紧凑、可扫描、低干扰的运营界面,不采用营销式 hero、装饰性大图或强视觉噪声。 + +本轮复查范围覆盖: + +- Wave2:登录页、工作台、报销列表、审批中心。 +- Wave3:报销详情、审批详情、通知中心。 +- Wave4:付款批次、AP、票据池、用户、主数据、通知渠道、系统设置、功能开关、流程定义、审计日志。 + +## Verification + +已运行: + +```bash +npx playwright test tests/e2e/pc-core-workflow-visual-wave2.spec.ts --workers=1 --reporter=list +npx playwright test tests/e2e/pc-detail-mobile-visual-wave3.spec.ts --workers=1 --reporter=list +npx playwright test tests/e2e/pc-finance-admin-visual-wave4.spec.ts --workers=1 --reporter=list +``` + +结果: + +| 验证项 | 结果 | +| --- | --- | +| PC 核心工作流 Wave2 | PASS,1 passed | +| PC 详情/通知 Wave3 | PASS,2 passed | +| PC 财务/管理 Wave4 | PASS,3 passed | + +截图证据位于本地 Playwright 输出目录,未写入敏感业务数据。 + +## Findings + +### No P0/P1 blocker + +- 页面整体已统一为左侧导航 + 顶部栏 + 内容工作区。 +- 高频页面有明确状态摘要、筛选/命令区、列表/详情区。 +- 财务/管理页已复用 `finance-*` 和 `admin-*` 工作区样式,视觉断层明显减少。 +- 报销、审批、付款批次、AP、票据池已能支撑重复操作,不像 landing page 或宣传页。 + +### Remaining P2 improvements + +| 类型 | 观察 | 建议 | +| --- | --- | --- | +| 信息密度 | 部分页面顶部同时出现面包屑、标题、问候语和说明,内容重复 | 后续统一为“模块名 + 一句任务型说明”,避免每页都显示重复问候 | +| 表单/列表比例 | 付款批次这类页面左侧创建表单较高,右侧工作区信息更关键 | 后续可把创建表单做成折叠/抽屉或“新建模式”,默认突出待处理批次 | +| 票据池空白 | 票据详情和绑定区在数据少时竖向占用偏大 | 后续把辅助核验、详情、绑定操作合并为更紧凑的右侧详情面板 | +| 管理页层级 | C 类管理页仍偏“表格 + 卡片”,但已可用 | 不在 OALAUNCH1 前大改;保留为后续管理台重构任务 | + +## Decision + +- 本轮 PC 一致性没有发现阻断真实试运行或 Go/No-Go 的视觉/交互问题。 +- OALAUNCH1 前不建议继续扩大 PC 重设计范围;保留 P2 改进给试运行反馈后排期。 +- 若下一轮继续前端优化,优先级应是:付款批次默认工作区 -> 票据池详情面板 -> C 类管理页密度统一。 diff --git a/.trellis/tasks/05-28-oalaunch1-parallel-closeout/task.json b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/task.json new file mode 100644 index 00000000..3fed0179 --- /dev/null +++ b/.trellis/tasks/05-28-oalaunch1-parallel-closeout/task.json @@ -0,0 +1,35 @@ +{ + "id": "oalaunch1-parallel-closeout", + "name": "oalaunch1-parallel-closeout", + "title": "OALAUNCH1 最终启用前并行收口包", + "description": "并行收口 OALAUNCH1 最终启用前的 Go/No-Go 证据、P0 自动化业务流补测、制度/OA 映射、PC 一致性和调研决策项。", + "status": "in_progress", + "dev_type": null, + "scope": "oalaunch1-readiness-parallel-closeout", + "package": null, + "priority": "P2", + "creator": "shunli", + "assignee": "shunli", + "createdAt": "2026-05-28", + "completedAt": null, + "branch": null, + "base_branch": "main", + "worktree_path": null, + "commit": null, + "pr_url": null, + "subtasks": [], + "children": [], + "parent": null, + "relatedFiles": [ + "client/tests/e2e/mobile-approvals-offline.spec.ts", + "client/tests/e2e/permission-direct-access.spec.ts", + "client/tests/e2e/r89-mobile-login-navigation.spec.ts", + "client/tests/e2e/r102-reimbursement-main-flow.spec.ts", + "client/tests/e2e/reimbursement-payment-batch-flow.spec.ts", + "client/src/pages/LoginPage.tsx", + "client/src/pages/ForgotPasswordPage.tsx", + "client/src/pages/PaymentBatchesPage.tsx" + ], + "notes": "", + "meta": {} +}