文件
hyb-oa/docs/trialrun/manual-trialrun-report.md
T

413 行
45 KiB
Markdown
原始文件 Blame 文件历史

此文件含有模棱两可的 Unicode 字符
此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。
# R70 人工业务试运行报告
**文档状态**:历史人工试运行快照,不代表当前公网部署状态。
日期:2026-04-28
**当前用途**:追溯 R70-R81 期间本地、公网、企微、OCR 等验证证据,并保留 R6 之后批次的追加收口记录。
**不得误读**:文中的 `force_off`、公网 `.env`、企微启用状态和开放问题均为当时记录;当前状态应以最新 Issue CSV、部署报告、live smoke 结果、[`docs/文档索引.md`](../文档索引.md) 和 [`docs/文档事实源状态矩阵.md`](../文档事实源状态矩阵.md) 为准。
## DOCG7 文档事实源治理(2026-05-12)
DOCG7 用于治理文档口径,不改业务代码、不部署公网、不关闭 `ME6-3`。本轮明确:R6 已通过;PC6、PA6、FL6、AP6、RI6、LP6、ME6 自动化、QG6、DG7/MRF7 和 MIA7 已完成相应收口;MIF7 是下一批移动整改合同但仍为 TODO;R7/OPS7/DOC7 是准备材料,不代表真实 R7 已启动或已上线。后续读取历史矩阵、旧 runbook 或旧 trialrun 记录时,应优先按 `docs/文档索引.md` 和 `docs/文档事实源状态矩阵.md` 判断是否仍能指导当前开发。
## R6 小范围试运行记录(历史模板 + 已执行记录)
本节源自 `issues/2026-05-11_10-23-41-r6-small-trialrun-prep.csv` 的执行模板,后续已追加 R6、PS6 和 R6 后批次的真实收口记录。阅读时以表内最新“当前门禁/当前代码基线”和后续收口段落为准,不要把早期模板措辞当作当前未启动状态。
### R6 基线
| 项目 | 记录 |
| --- | --- |
| 公网地址 | `https://oa.hyinda.com` |
| 当前门禁 | R5 已 `DONE/DONE/DONE`;R6 首轮小范围试运行已完成;R6-ISSUE-003 采购提交阻断已热修、部署并复跑通过;PC6/PA6/FL6/AP6/RI6/LP6 后续优化已完成;ME6 自动化、部署和公网视觉复检已完成,`ME6-3` 代表性企业微信真机抽查因设备不便暂缓;QG6 非业务 QA 治理已完成但不替代真机 |
| 当前代码基线 | DG7/MRF7 移动信息架构与展示去重治理已部署到 `https://oa.hyinda.com`,并完成 `/ready`、public bundle、live smoke readiness、公网移动视觉矩阵复检;`ME6-3` 代表性企业微信真机抽查仍待用户确认 |
| 试运行窗口 | `2026-05-12 14:00-17:00 Asia/Shanghai`;若现场无法执行,顺延到 `2026-05-13 14:00-17:00 Asia/Shanghai` |
| 回滚联系人 | `wangshunli` |
| 问题登记负责人 | `wangshunli` |
| 当前候选配置 | 员工 `SMOKE002`;经理/审批人 `SMOKE101`;管理员/拍板人 `wangshunli`;财务 `wangzhiling` |
| 允许范围 | 报销、请假、采购、审批、企业微信入口/通知、财务付款/导出 |
| 禁止扩展 | 预算、ERP、AI、完整差旅、复杂 BPM、审批设计器、新组织规则 |
### R6 非真机自动验证(BV6,真机暂停期间)
本节对应 `issues/2026-05-11_13-58-30-r6-non-device-business-verification.csv`。设备暂不在身边时,只记录 PC、公网、自动化和模拟视口证据;不启动 R6,不关闭 `RS6-7/UI6-6/R6-ISSUE-001`。
| 项目 | 结果 | 证据位置 / 备注 |
| --- | --- | --- |
| 基线 | 通过 | 本地基线 `cee04d5`;R6 未启动;`RS6-7` 与 `UI6-6` 继续保持 `DONE/DONE/TODO`;`R6-ISSUE-001` 继续 `open/PAUSED` |
| 公网健康与 live smoke | 通过 | `check-live-smoke-env --strict` 通过;`run-live-smoke-readiness.sh` 通过;报告 `artifacts/qa-flow/live-smoke-readiness-20260511-135958`;公网 bundle `findings=0`;live OCR 返回重复票据的可解释终态 |
| 企业微信个人应用消息 | 通过 | 只读查询确认 `R5-WECOM-APP-PERSONAL` 为 `enabled=true`、`mode=wecom_app_message`;旧 `R50-MOCK-007334` 为 `enabled=false`;mock 不作为 R6 通知验收依据 |
| 业务自动化 | 通过 | `approval/leave/procurement` 本地隔离业务流通过,报告 `artifacts/qa-flow/business-flow-20260511-140942`;公网 live smoke 通过;`reimbursement` 组已在 `R6-ISSUE-002` 对齐测试口径后通过,报告 `artifacts/qa-flow/business-flow-20260511-161344` |
| 财务链路 | 通过 / 真实候选账号已创建 | `server/scripts/regression-payment-batches.sh` 通过,`paymentBatches` 单测 3 passed;只读查询确认 `SMOKE301/SMOKE302` 为 active 测试财务账号;WZ6 已创建 `wangzhiling`,状态 `active`,角色 `employee,finance` |
| PC 与移动模拟视觉 | 通过 | R105 公网视觉 4 passed;移动响应式矩阵 9 passed;截图汇总到 `output/playwright/r6-non-device-business-verification/` |
| 真机门禁 | 暂停 | iPhone 12 / iOS 14.1 / 企业微信 与 Redmi K60 企业微信真实触控、入口和布局体验仍需人工确认;自动视觉不替代真机验收 |
### R6 人员与角色
| 用户 | 角色 | 入口 | 设备 | 负责流程 | 结果 | 备注 |
| --- | --- | --- | --- | --- | --- | --- |
| `SMOKE002` | 员工 / 提交人 | PC / 企业微信 / 手机浏览器 | iPhone 12 / iOS 14.1 / Redmi K60 | 报销、请假、采购提交 | 通过 | 已自动辅助提交报销、请假和采购;报销、请假通过;PS6 热修后采购复跑通过。用户口径为 `smkoe02/smoke02`,按既有账号统一记录为 `SMOKE002` |
| `SMOKE101` | 经理 / 审批人 | PC / 企业微信 / 手机浏览器 | iPhone 12 / iOS 14.1 / Redmi K60 | 审批待办、退回或驳回 | 通过 | 已处理报销、请假和采购待办并通过;审批人可以是经理;不使用 admin 解释审批权 |
| `wangshunli` | 管理员 / 回滚联系人 / 试运行拍板人 / 问题登记负责人 | PC | 管理员 PC | 管理后台、配置核对、试运行决策、问题分级和回滚拍板 | 已辅助执行 | 已用于试运行前账号、基础资料和问题登记辅助;不作为本轮普通业务审批人;财务由 `wangzhiling` 承担 |
| `wangzhiling` | 财务 | PC / 手机浏览器 | Redmi K60 | 财务复核、付款标记、导出 | 通过 | 首次登录已完成改密,账号只读核验为 `active`、角色 `employee,finance`、未锁定;已完成报销财务复核和付款标记。采购首轮只验证提交、审批和历史查看,未扩财务后处理。姓名和手机号后续可由管理员按真实信息更新,不写入仓库 |
### R6 流程执行矩阵
| 流程 | 操作路径 | 期望结果 | 执行人 | 结果 | 证据位置 |
| --- | --- | --- | --- | --- | --- |
| 报销 | 员工提交报销 -> 上传 PDF 发票或附件 -> 提交审批 -> 审批人处理 -> 财务复核或付款标记 | 状态、审批历史、通知和财务动作一致 | `SMOKE002` / `SMOKE101` / `wangzhiling` | 通过 | 2026-05-12 自动辅助执行:`BX-20260512-0011`,id `fd89f7db-9b33-4364-b329-53f406ab38ee`,金额 `188.88`,终态 `paid`;经理任务 `41ef7694-6a0d-4229-ab4e-c85392fe3708`,财务任务 `dbc20c92-51ac-494f-9fe1-b9271bc91ac2`;不提交敏感截图 |
| 请假 | 员工提交请假 -> 审批人处理 -> 员工查看状态 | 待办、历史和团队状态一致 | `SMOKE002` / `SMOKE101` | 通过 | 2026-05-12 自动辅助执行:id `639acec8-bbfc-462c-bc3b-eaaa70e72153`,开始日期 `2026-07-28`,终态 `approved`;经理任务 `d9230348-2059-4dca-97f7-107621b0d40b` |
| 采购 | 员工提交采购 -> 审批人处理 -> 查看审批历史 | 采购状态和审批中心一致 | `SMOKE002` / `SMOKE101` | 通过 | 初次执行采购 id `ab69db11-87e3-48b0-8a8a-43324d1c70e5` 曾因 `budgetPrecheckGate is not defined` 阻断;PS6 热修部署后复跑通过:`CG-20260512-0001`,id `538c3c92-edce-4c28-bcdd-9bb8065c1d0e`,经理任务 `6d3cf41c-2a44-4bc3-9245-db6383fabdf0`,终态 `approved`,缺预算池按 legacy warn 返回 `missing_budget_pool`,无 500 |
| 企业微信通知 | 待办产生 -> 审批人收到个人应用消息 -> 点击回 OA | 消息可达且 deeplink 回移动审批或详情 | `SMOKE101` / `oa_smoke_02` | 通过 | 报销经理待办、报销通过、报销付款、请假通过等绑定用户通知记录为 `wecom_app_sent`;PS6 采购经理待办任务 `6d3cf41c-2a44-4bc3-9245-db6383fabdf0` delivery=`wecom_app_sent`、errcode=`0`;分配给财务角色时因 `wangzhiling` 尚未绑定企业微信,记录 `wecom_app_no_bound_recipients`,财务本轮以 PC 为主,不作为阻断 |
| 财务付款/导出 | 财务处理已通过单据 -> 标记付款或导出 | 权限、状态和审计记录正确 | `wangzhiling` | 通过 | `wangzhiling` 已完成登录改密和报销付款标记;采购未进入财务节点;不导出敏感数据到仓库 |
### R6 问题登记
| ID | 级别 | 角色 | 入口/设备 | 流程 | 复现步骤 | 当前处理 | 负责人 | 状态 | 关联 Issue |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| R6-ISSUE-001 | 阻断 | 审批人 / 员工 | iPhone 12 / iOS 14.1 / 企业微信 WebView | 移动底部导航、审批入口、首页快捷卡 | 旧记录误写为 iPhone 11;用户更正为 iPhone 12 / iOS 14.1。真机截图显示首页快捷卡和底部 Tab 的字体图标漂移、重影、挤压,底部“审批”体验不稳定;自动化 Chromium UA 截图与真实 iOS 企业微信 WebView 存在差异 | 已关闭:WCM6/MME6 已部署公网并完成自动复检,移动核心图标改 SVG,补企业微信 WebView viewport/字号/safe-area,底部角标独立定位,`/mobile/me` 图文槽位和卡片顶边完成自适应收口;用户确认“看过了,可以没问题”。后续若出现移动回归,另建新 Issue 处理。 | Codex | closed | `issues/2026-05-11_20-38-33-r6-wecom-mobile-rendering-hardening.csv`; `issues/2026-05-11_22-42-11-r6-mobile-me-adaptive-visual-polish.csv`; `issues/2026-05-11_23-26-00-r6-mobile-unified-design-rollout.csv` |
| R6-ISSUE-002 | 一般 | 自动化 / 员工与财务测试账号 | 本地隔离 E2E / PC | 报销审批进度、报销支付批次 | `BUSINESS_FLOW_GROUPS=reimbursement bash scripts/qa/run-business-flow-gates.sh local` 中 2 条用例曾失败,失败点为 Playwright 查找旧导航入口 `票据中心`;当前正式员工路径应从报销详情添加 PDF 发票 | 已关闭:测试已改为报销详情页“添加发票”路径,不恢复普通员工“票据中心”入口;支付批次用例同步按业务编号定位待办,并按金额选择财务或财务主管二级审批;报销业务流 gate 10 passed、1 skipped | Codex | closed | `issues/2026-05-11_15-50-00-r6-reimbursement-e2e-nav-alignment.csv` |
| R6-ISSUE-003 | 阻断 | 员工 / 审批人 | 公网 PC / 自动化 API | 采购提交 | R6-4 中员工创建采购草稿后提交,`POST /api/purchase-requests/:id/submit` 返回 500;服务端日志定位到 `server/src/routes/purchaseRequests.js:1617`:`ReferenceError: budgetPrecheckGate is not defined`;该问题导致采购无法进入审批,采购主链路无法完成 R6 | 已关闭:PS6 已修复采购提交事务中 `budgetPrecheckGate` 未定义问题,本地采购业务流通过,公网已部署 `a8b7351`;复跑 `CG-20260512-0001` 成功提交并由 `SMOKE101` 审批通过,企业微信个人应用消息 delivery=`wecom_app_sent`、errcode=`0` | Codex | closed | `issues/2026-05-12_01-12-20-r6-purchase-submit-budget-precheck-hotfix.csv` |
MME6 补充(2026-05-11):针对用户补充的 iPhone 12 / iOS 14.1 图文贴近与 iPhone 14 / iOS 16.2 卡片顶边观感,已把 `/mobile/me` 改为固定头像/图标槽 + `minmax(0, 1fr)` 文字槽,移动卡片顶边装饰线仅在 `/mobile` 作用域禁用,并将该规则写入产品设计规约。本地 `client typecheck`、`client build`、WCM6 视觉专项 8 passed、R5/R6/R124 移动相关回归 10 passed;部署后 `/ready` 正常、public bundle `findings=0`、live smoke readiness PASS、真实 OCR 样票返回重复发票可解释终态且测试通过,公网 WCM6 视觉专项 8 passed,报告 `artifacts/qa-flow/live-smoke-readiness-20260511-230918`。用户已确认当前设计可接受,`R6-ISSUE-001` 关闭;MUD6 继续把该设计推广到所有专用 `/mobile` 页面。
MUD6 收口(2026-05-11):已将 MME6 槽位自适应方案推广到专用 `/mobile` 路由:移动首页、审批、报销列表、报销详情、我的、个人设置、通知、票据上传、请假和资产扫码。通用移动样式固定图标/头像槽、`minmax(0, 1fr)` 文本槽、`clamp()` 间距、`mobile-card`、移动列表卡片、空状态和深层页吸底操作;业务角色差异继续按权限裁剪入口和动作,不拆多套 UI。本地 `client typecheck`、`client build`、MUD6 全移动页视觉专项 7 passed、WCM6/RS6/R124 回归 16 passed;已部署到 `https://oa.hyinda.com`,`/ready` 正常、public bundle `findings=0`、live smoke readiness PASS、真实 OCR 样票为重复发票可解释终态且通过,公网 MUD6 视觉专项 7 passed,报告 `artifacts/qa-flow/live-smoke-readiness-20260511-235918`。R6-3 可恢复执行试运行前检查,建议仍抽查 iPhone 12 / iOS 14、iPhone 14 / iOS 16.2、Redmi K60 的企业微信首页、审批、报销详情、我的和通知。
R6-3 试运行前自动检查(2026-05-12):公网 `/ready` 正常;public bundle 扫描 `scanned=54 focused=4 findings=0`;`check-live-smoke-env --strict` 通过,`liveSmokeReady=true`、`liveOcrReady=true`;`LIVE_SMOKE_BASE_URL=https://oa.hyinda.com bash scripts/qa/run-live-smoke-readiness.sh` 通过,公网 live smoke `3 passed`,真实 OCR 样票返回“该发票已用于报销,不能重复添加”的可解释终态,报告 `artifacts/qa-flow/live-smoke-readiness-20260512-001722`。只读查询确认通知渠道 `R5-WECOM-APP-PERSONAL` 为 `enabled=true`、`mode=wecom_app_message`,旧 `R50-MOCK-007334` 为 `enabled=false`;远端容器 `hyb-oa-trialrun-db` healthy、`hyb-oa-trialrun-server` running,Prisma migration status 为 up to date;最近可追溯备份为 `hyb-oa-db-20260510_134340.dump` 与 `hyb-oa-storage-20260510_134341.tar.gz`。WZ6 已通过现有管理员 API 创建真实财务候选账号 `wangzhiling`,只读核验为 `active` 且角色 `employee,finance`,创建动作有 `SYSTEM_USER_CREATED` 审计;一次性密码仅写入仓库外 `~/.hyb-oa/wangzhiling-onetime.env`。因此 R6-3 已完成,R6-4 可在试运行窗口内按清单执行;主 R6 仍保持 `TODO`,直到真实流程执行、问题登记和每日收口完成。
级别定义:
- 阻断:权限泄漏、付款状态错乱、企业微信入口不可用、审批主流程无法继续、真实 OCR 大面积失败。
- 严重:主流程可绕行但影响试运行可信度,需当天判断修复、降级或暂停。
- 一般:不阻断流程,进入后续修复 Issue。
- 体验建议:文案、布局、效率和易用性建议,进入后续体验优化批次。
### R6 每日收口
| 日期 | 执行范围 | 新增问题 | 阻断数 | 严重数 | 结论 | 决策人 |
| --- | --- | --- | --- | --- | --- | --- |
| 2026-05-12 | R6-4 自动辅助小范围流程:报销、请假、采购、财务付款、企业微信通知审计 | `R6-ISSUE-003` 采购提交后端 500 | 1 | 0 | 暂停采购流程,先修复后继续;报销、请假、财务付款证据保留 | `wangshunli` |
| 2026-05-12 | PS6 热修部署后恢复 R6-4:采购提交、审批、历史查看、企业微信通知审计 | 无新增问题;`R6-ISSUE-003` 已关闭 | 0 | 0 | R6 首轮小范围试运行通过;进入后续 PC/移动/审批效率/财务台账优化 Issue | `wangshunli` |
### R6 结论(2026-05-12)
R6 首轮小范围试运行通过。已验证报销、请假、采购、审批、企业微信个人应用消息、移动入口既有门禁和财务付款主链路;采购提交阻断已通过 PS6 热修关闭。R6 通过不等于全面正式上线,下一批按独立 Issue 推进 PC 信息架构、移动二轮体验、审批催办/超时、审批效率摘要和财务台账增强。
AP6 收口(2026-05-12):审批效率 v1 已完成并部署。代码提交 `72e38db` 增加审批催办、超时提醒 job 和待办效率摘要,状态回填提交 `2d87c36` 记录部署验收;公网 `/ready` 正常,public bundle `findings=0`,live smoke readiness 通过,报告 `artifacts/qa-flow/live-smoke-readiness-20260512-104535`。AP6 v1 固定为:申请人/提交人可通过 `POST /api/workflow/tasks/:taskId/remind` 催办本人 pending 审批,24 小时同一任务最多 1 次;`GET /api/workflow/tasks/summary` 返回待办和超时聚合;`job:workflow-overdue-reminders` 只提醒 pending 待办,不改变审批状态。AP6 后已按计划进入 RI6。
RI6 收口(2026-05-12):报销票据体验完善已完成并部署。PC/移动报销详情统一复用发票状态文案和下一步提示,普通员工继续从报销详情添加 PDF 发票,不恢复“票据中心/发票池”主入口;移动可添加发票显示明确“可添加”状态,识别失败、重复、已归档或已报销进入可解释终态。本地 `client typecheck/build`、`check-ui-design-rules --strict`、R111/R125 专项 4 passed、R109 移动专项 1 passed、`BUSINESS_FLOW_GROUPS=reimbursement` 10 passed / 1 skipped;已部署到 `https://oa.hyinda.com`,公网 `/ready` 正常,public bundle `findings=0`,live smoke readiness 通过,报告 `artifacts/qa-flow/live-smoke-readiness-20260512-120138`。RI6 后已按计划进入 LP6 并完成收口;R7 尚未启动,需在 LP6/ME6 至少完成一轮后另建合同。
LP6 收口(2026-05-12):请假采购体验完善已完成并部署。请假 PC/移动记录增加状态下一步提示、当前审批节点、最近审批动作和退回/驳回意见;请假附件上传改为中文自定义控件。采购列表和详情优先展示业务编号或标题,不再把 UUID 作为主展示;缺预算池 warning 改为“未匹配预算池,已按当前试运行规则继续进入审批/请管理员补充预算配置”的用户可理解提示;采购详情补审批记录分区和附件用途/下载留痕说明。后端未新增 API、未改 Prisma schema,仅在既有请假/采购响应中补充 `pendingWorkflow` 与 `approvalHistory`。
LP6 本地验证:`leave-flow.spec.ts`、`leave-team-calendar.spec.ts`、`procurement-flow.spec.ts`、`workflow-quick-approve.spec.ts` 共 8 passed;`permission-direct-access.spec.ts -g "PA6 请假和采购自审"` 1 passed,确认请假/采购自审和 admin-only 业务审批仍由服务端拒绝;`BUSINESS_FLOW_GROUPS=leave,procurement bash scripts/qa/run-business-flow-gates.sh local` 在临时库通过,报告 `artifacts/qa-flow/business-flow-20260512-124643`;`server prisma:validate`、`node --check src/routes/leave.js`、`node --check src/routes/purchaseRequests.js`、`client typecheck/build`、`check-ui-design-rules --strict`、`git diff --check` 均通过。视觉证据输出到 `output/playwright/lp6-leave-procurement-polish/`,覆盖 PC 1440x960 请假/采购/审批与移动 390x844 请假/审批,均无横向溢出、无可见原生文件控件、无 `Choose File` 文案、无 console error。已部署到 `https://oa.hyinda.com`,公网 `/ready` 正常,public bundle `findings=0`,live smoke readiness 通过,报告 `artifacts/qa-flow/live-smoke-readiness-20260512-125740`;本地未提供完整 live smoke 凭据和真实 OCR 样票,脚本按规则跳过网页 live smoke 与真实 OCR,不影响 LP6 请假采购体验验收。下一批默认进入 ME6 移动二轮体验;R7 仍需在 LP6/ME6 至少完成一轮后另建合同。
ME6 自动化与部署收口(2026-05-12):移动二轮体验小修已完成。修复点限定在专用 `/mobile` 路由体验稳定性:移动首页对 AP6 审批效率摘要响应增加缺省容错,请假记录对旧数据缺少 `approvalHistory` 时不再渲染崩溃;历史移动视觉专项补齐 `/api/workflow/tasks/summary` mock,并将统一移动矩阵截图目录支持切换到 `output/playwright/r6-mobile-experience-second-pass/`。本地 `client typecheck`、`client build`、`check-ui-design-rules --strict` 通过;ME6 移动矩阵 7 passed,覆盖 320/360/375/390/393/414/430px、企业微信 iOS UA、企业微信 Android UA 和普通移动 UA;R5 真机反馈移动专项 2 passed,RS6 移动响应式专项 7 passed,WCM6 企业微信多手机专项 8 passed,R124 移动入口矩阵 1 passed。已部署到 `https://oa.hyinda.com`,公网 `/ready` 正常,public bundle `findings=0`,live smoke readiness PASS,报告 `artifacts/qa-flow/live-smoke-readiness-20260512-135035`;缺少完整 live smoke 凭据和真实 OCR 样票时,脚本按规则跳过网页 live smoke 与真实 OCR。公网 ME6 移动视觉矩阵 7 passed,截图输出到 `output/playwright/r6-mobile-experience-second-pass-live/`。ME6-3 真机抽查仍待用户确认:iPhone 12 iOS14 企业微信、iPhone 14 iOS16.2 企业微信、Redmi K60 企业微信的首页、审批、报销详情、我的、通知和请假;敏感截图不提交仓库。ND9 之后允许先做 QG6 非业务治理和 R7 草案材料,但不能把这些工作当成真机替代,也不能直接启动真实 R7。
ND9 非真机延续(2026-05-12):用户反馈当前不方便做代表性企业微信真机抽查,因此 `ME6-3` 继续保持 `TODO`,不得伪造完成或用自动化替代。后续可先执行 QG6 QA 治理、R7 草案、运维交接和培训材料等不依赖真机的工作;这些工作不得改变业务规则、审批链、PDF-only、企业微信通知通道或财务规则。R7 真实扩大试运行仍需用户确认最终人员、窗口,并补足 ME6 真机门禁或明确接受该风险。
QG6 QA 治理收口(2026-05-12):非真机阶段 QA 治理升级已完成并部署。`check-ui-design-rules.mjs` 已增强 UUID 主展示、内部术语、英文上传、移动桌面表格和 PC 壳扫描,新增 `--self-test` 和白名单说明;PC 审批详情不再展示任务 UUID 或 workflow instance UUID。新增 `scripts/qa/run-visual-matrix.sh` 固定视觉矩阵,项目级视觉报告支持 issue-id、baseURL、commit 和状态字段;`run-business-flow-gates.sh` 与 `run-live-smoke-readiness.sh` 输出统一 `summary.json`。本地 `client typecheck/build`、`server prisma:validate`、`check-ui-design-rules --self-test/--strict` 通过;QG6 本地视觉矩阵 8 passed,报告 `artifacts/qa-flow/qg6-qa-governance-upgrade-visual-matrix-20260512-172418`,业务流 `reimbursement,leave,procurement` 全部通过,报告 `artifacts/qa-flow/business-flow-20260512-172944`。已部署到 `https://oa.hyinda.com`,公网 `/ready` 正常,public bundle `findings=0`,live smoke readiness PASS,报告 `artifacts/qa-flow/live-smoke-readiness-20260512-174055`;公网移动视觉矩阵 7 passed,报告 `artifacts/qa-flow/qg6-qa-governance-upgrade-visual-matrix-20260512-174055`。`ME6-3` 代表性企业微信真机抽查仍为 TODO,QG6 不替代真机验收;下一步只允许 R7 草案、OPS7/DOC7 材料等非真机准备,真实 R7 仍需用户确认人员、窗口和风险接受。
R7/OPS7/DOC7 非真机准备(2026-05-12):已创建 `issues/2026-05-12_17-49-03-r7-expanded-trialrun-prep-ops-doc-materials.csv`。R7 草案见 `docs/trialrun/r7-expanded-trialrun-prep.md`,只固定范围、角色占位、门禁、问题分级、每日收口和退出标准;`R7E-1..R7E-3` 继续保持 `TODO`,真实 R7 未启动。OPS7 运维交接 Runbook 见 `docs/trialrun/ops7-runbook.md`,只记录部署、回滚、备份恢复、账号交接、live readiness 和企业微信通知检查清单,不执行生产配置变更或数据库恢复。DOC7 用户手册与 FAQ 见 `docs/trialrun/r7-user-guide-and-faq.md`,只描述当前已实现的报销、请假、采购、审批、企业微信入口和财务台账能力,不承诺预算、ERP、AI、完整差旅、复杂 BPM 或审批设计器。`ME6-3` 真机门禁仍未关闭;R7 真实启动仍需用户确认最终人员、窗口,并补足真机门禁或明确接受风险。
DG7/MRF7 移动信息架构与展示去重治理收口(2026-05-12):已根据 iPhone 12、iPhone 14 和 Redmi K60 企业微信真机反馈建立首页/审批/通知/业务卡片去重规约,并完成移动端实现与部署。员工底部“审批”入口改为“进度”视角,展示我发起的报销、请假、采购进度且不显示审批动作;审批人仍使用“审批”视角。首页只保留一处待处理摘要,首页通知不再重复完整待办;底部审批角标移到图标右上外侧,不覆盖图标或文字。审批详情改为 `/mobile/approvals/:taskId` Push 页并隐藏底部 Tab;通知中心卡片整体可点,先标记已读再直达报销、请假、采购或审批移动详情;采购和请假通知不再回首页或新建表单。PC/移动卡片展示引入共享业务主标识工具,同一卡片不重复业务编号或状态;`check-ui-design-rules.mjs` 已增加重复业务编号扫描规则。验证结果:`client typecheck/build`、`check-ui-design-rules --self-test/--strict`、DG7 专项 3 passed、WCM6 11 passed、R124/R6 响应式/MUD6 15 passed。已执行 `bash deploy/trialrun/deploy.sh`,公网 `/ready` 正常,public bundle `findings=0`,live smoke readiness PASS,报告 `artifacts/qa-flow/live-smoke-readiness-20260512-205559`;公网移动视觉矩阵 7 passed,报告 `artifacts/qa-flow/dg7-mobile-information-dedupe-governance-visual-matrix-20260512-205634`。因当前无法做完整三机复测,`ME6-3` 继续保持 TODO,不用本轮自动化替代真机门禁。
MIA7 移动信息架构、视觉与流程审查(2026-05-12):用户完成一轮 iPhone12/iPhone14/Redmi 企业微信真机抽查后,确认上一轮硬问题基本关闭,但发现首页、常用入口、待处理摘要、进度、通知、详情返回和角色首页仍存在信息架构层面的重复与不一致。已基于 `9da0ca9`、现有移动截图、页面源码和公开同类产品原则创建 `issues/2026-05-12_21-48-39-mobile-ia-visual-flow-review.csv`,并输出审查报告 `docs/trialrun/mobile-ia-visual-flow-review.md`。本轮只做标准和问题登记:已把 MIA7 移动工作台、进度、通知、详情壳和返回语义写入 `docs/product-design-rules.md`,并新建后续整改合同 `issues/2026-05-12_21-48-40-mobile-ia-flow-remediation.csv`。MIA7 结论不代表问题已修复;MIF7 仍为 TODO,`ME6-3` 真机门禁仍保持待确认。
## 结论
R70 初次试运行暂停项已在 2026-04-28 的 R71 定向修复后关闭。基于本地环境复测,经理团队日历与员工报销缺票提示/发票上传绑定提交链路均已通过,可恢复下一轮本地人工试运行。
## 执行环境
- 环境 URL:`http://192.168.123.7:3000`
- 分支/提交:`2bce9c9 + local R71 working tree`
- 浏览器:`Firefox (Playwright CLI)`
- 执行人:`Codex Playwright 辅助复核`
- 执行时间:`2026-04-28 17:22 - 19:11 CST`
- 数据库:`hyb_oa_manual_trialrun_20260428172231`
## 角色结果
员工路径:
- 执行人:`Codex Playwright 辅助复核`
- 结论:Portal、请假、周报、待办、搜索、公告、移动入口主路径可达;R71 后报销缺票提示清晰,上传/绑定发票后可提交进入审批中。
- 阻断问题:无。
- 备注:员工请假提交成功,经理已审批通过;周报转待办并完成闭环通过;报销复测使用单据 `4931211b-34b4-43b8-9e9f-917569d47c33` 和发票 `北京悦海堂餐饮管理有限公司_发票金额1683.00元.pdf`,提交后单号为 `BX-20260428-0001`。
经理路径:
- 执行人:`Codex Playwright 辅助复核`
- 结论:Portal 管理视角、待我处理快捷审批、团队状态、项目入口与请假团队日历均可用。
- 阻断问题:无。
- 备注:经理已对员工请假单完成一次“通过”审批,审批后待办列表刷新正常;R71 复测中团队日历成功显示 `2026-04-27 ~ 2026-05-03` 窗口及员工 `2026-04-29` 年假记录。
管理员路径:
- 执行人:`Codex Playwright 辅助复核`
- 结论:主要管理入口可见且页面可达,未发现阻断问题。
- 阻断问题:无。
- 备注:人员管理、组织架构、系统设置、功能开关、审计日志均可打开并加载;审计日志可看到最近登录留痕。
## 问题汇总
- 当前开放问题:P0/P1/P2/P3 均为 0。
- 已闭环问题:`R70-001`、`R70-002` 已通过 R71 定向修复与人工复测关闭。
详细问题见 `artifacts/r70/issue-log.csv`。
## R71 处理结果
- P1 修复:server manager 角色已补齐 `leave.view_all`,reviewer 复核确认未扩成 `leave.manage`,经理团队日历路径复测通过。
- P2 修复:前端已在提交前提示“需先绑定至少 1 张发票”,并为 `bound_invoice_required` 增加可理解中文文案。
- 联动修复:人工复核中补修 `/api/invoice-pool/upload` 的 multipart 文件流挂起问题,上传 -> 绑定 -> 提交报销链路已通过。
- 技术遗留:client build 仍有 chunk 循环与大 chunk 警告,建议独立进入 R72 技术优化项,不阻断本地人工试运行。
## 风险
- 人工试运行依赖参与者真实操作,自动化通过不等于业务体验通过。
- 当前结论基于本地临时库、HTTP 本地地址和 Firefox 浏览器复核,不代表企业微信接入、HTTPS 和多用户并发场景都已验证。
- 若发现 workflow、权限、状态机、审批规则、迁移相关问题,必须单独 review 后再修复。
## R73 本地辅助复核补充
- 真实腾讯 OCR:已通过 `client/tests/e2e/manual/live-invoice-ocr.spec.ts` 本地辅助复核,测试票据为 `/home/shunli/Projects/hyb-oa/artifacts/北京悦海堂餐饮管理有限公司_发票金额1683.00元.pdf`。
- 运行方式:server 进程在本地 `3001` 端口以运行时注入方式加载旧项目本地腾讯配置;密钥未写入本仓库 `server/.env`。
- 自动巡检:`client/tests/e2e/manual/r70-trialrun-assist.spec.ts` 在补齐本地运行时开关后,员工 / 经理 / 管理员 10 个辅助步骤全部通过。
- 环境结论:本地试运行如果出现 Portal、周报、公告、团队、人员管理等入口缺失,先检查 server 运行时 `*_ENABLED` 开关是否齐全;本次已确认数据库开关与工作区配置本身无异常。
## R74 自动化压榨补充
- 本地门禁:`server/src/scripts/smoke-trialrun-runtime.js` 已支持 `TRIALRUN_RUNTIME_MODE=local`,并在本地 HTTP 口径下校验 env、feature flag、workspace setting 与导航基线,通过。
- 深层真实业务辅助回归:`client/tests/e2e/manual/r70-trialrun-deep-assist.spec.ts` 已通过,覆盖:
- 周报保存 -> 生成待办 -> 提交 -> 完成待办
- 公告发布 -> 员工可见 -> 团队状态更新 -> Portal 汇总可见
- 真实全局搜索命中公告并跳转
- 批量真实腾讯 OCR 辅助回归:`client/tests/e2e/manual/live-invoice-ocr-batch.spec.ts` 已落地并在干净本地 trialrun DB `hyb_oa_manual_trialrun_20260429093000` 上完成真实 PDF 发票成功识别,结果已回填到 `artifacts/r70/live-ocr-batch-report.md`。
- 当前 OCR 环境结论:旧项目 `/home/shunli/shenzhou-business-suite/.env` 中一组腾讯凭证已在当前应用链路验证可用;R77 已补齐 PDF 模式下的 `IsPdf=true` / `PdfPageNumber=1` 调用与返回字段归一化,OCR 识别主链路已闭环,不再存在先前的鉴权/解码失败阻塞。
## R77 OCR 收口补充
- 复测时间:`2026-04-29 09:51 - 09:54 CST`
- 自动化环境:`http://127.0.0.1:3001`
- 自动化数据库:`hyb_oa_manual_trialrun_20260429093000`
- 腾讯配置来源:旧项目 `/home/shunli/shenzhou-business-suite/.env`,仅运行时注入,未写回本仓库。
- 复测命令:
- `cd client && PLAYWRIGHT_MANUAL=1 PLAYWRIGHT_OCR_LIVE=1 PLAYWRIGHT_OCR_LIVE_FILE=/home/shunli/Projects/hyb-oa/artifacts/北京悦海堂餐饮管理有限公司_发票金额1683.00元.pdf E2E_BASE_URL=http://127.0.0.1:3001 npx playwright test tests/e2e/manual/live-invoice-ocr.spec.ts --workers=1 --reporter=list`
- `cd client && PLAYWRIGHT_MANUAL=1 PLAYWRIGHT_OCR_LIVE=1 PLAYWRIGHT_OCR_LIVE_BATCH=1 PLAYWRIGHT_OCR_LIVE_FILE=/home/shunli/Projects/hyb-oa/artifacts/北京悦海堂餐饮管理有限公司_发票金额1683.00元.pdf E2E_BASE_URL=http://127.0.0.1:3001 npx playwright test tests/e2e/manual/live-invoice-ocr-batch.spec.ts --workers=1 --reporter=list`
- 结果:
- 单张 live OCR:`1 passed (26.2s)`。
- batch live OCR:`1 passed (14.1s)`,runner 正常退出。
- 最新 batch 票据结果:`fb29cdd8-0c10-4254-8feb-d3c3c1be86c3`,销售方 `北京悦海堂餐饮管理有限公司`,总金额 `1683.00`,状态 `available`。
- 试运行结论:
- 员工侧报销 / 票据中心 / OCR 主链路 `上传 -> OCR -> available -> 绑定 -> 提交报销` 已具备本地试运行条件。
- 本轮仍未覆盖真实企微 OAuth、HTTPS cookie secure、多角色并发协同、真实 ERP 外发回执,以及高风险二次复核;这些项继续保留在外部或后续 focused regression。
## R78 财务支付尾链 focused regression
- 回归时间:`2026-04-29 10:37 - 10:52 CST`
- 自动化环境:`http://127.0.0.1:3002`
- 自动化数据库:`hyb_oa_manual_trialrun_20260429093000`
- 本地 focused 开关:
- 运行时 env:`PAYMENT_BATCH_ENABLED=true`、`ERP_SYNC_ENABLED=true`
- DB feature flag:通过 `TRIALRUN_EXTRA_FORCE_ON_FLAGS='payment_batch_v1 erp_sync'` 重复执行 `seed:trialrun` 显式打开,仅用于本地 focused 财务回归,不改变默认 trialrun 上线建议。
- 回归命令:
- `cd server && ./scripts/regression-payment-batches.sh`
- `cd client && E2E_BASE_URL=http://127.0.0.1:3002 npx playwright test tests/e2e/reimbursement-payment-batch-flow.spec.ts --workers=1 --reporter=list`
- 结果:
- server focused regression:`3 passed`
- Playwright focused E2E:`1 passed (58.0s)`
- 已验证链路:
- employee:创建空白报销 -> 上传 mock 票据 -> 绑定 -> 提交
- manager / finance:完成两级审批
- finance:创建 reimbursement payment batch,并在复核后执行
- finance_mgr:在 AP 工作台完成快捷复核
- execute 后:`payment batch = executed`、`reimbursement = paid`、`invoice = archived`
- ERP preview:可见最新 `pending` outbox
- reviewer 结论:
- `paymentBatches` 复核路由仍拦截 maker 自审;低风险批次维持 `finance_mgr` 复核、`finance` 执行的边界。
- 失败路径单测确认不会错误归档已绑定发票,也不会误入 ERP / 通知 follow-up。
- `PaymentBatchesPage` 与 `ApOperationsPage` 没有新增越权入口,按钮仍按 `payment.batch.manage` 与 `risk.review.manage` 分离。
## R79 公网部署只读巡检
- 巡检时间:`2026-05-04 13:04 - 13:16 CST`
- 公网地址:`https://oa.hyinda.com`
- 服务器:`118.89.77.218`
- SSH 结论:`deploy` / `root` 可免密登录;`shunli` 当前不可免密登录。
- 反向代理:`caddy` active,`/etc/caddy/Caddyfile` 已包含 `oa.hyinda.com -> reverse_proxy 127.0.0.1:3000`。
- 部署目录:`/opt/hyb-oa-trialrun`
- 部署形态:远端目录不是 git 工作树;当前推荐从本地执行 `deploy/trialrun/deploy.sh`,通过 `rsync` 同步。
- 容器编排:服务器当前使用 `docker-compose 1.29.2`,不是 `docker compose`。
- 公网探活:
- `https://oa.hyinda.com/ready`:`HTTP/2 200`
- `https://oa.hyinda.com`:`HTTP/2 200`
- 当前公网 `.env`:
- `APP_ORIGIN=https://oa.hyinda.com`
- `COOKIE_SECURE=true`
- `PUBLIC_SECURITY_HARDENING_ENABLED=true`
- `WECOM_ENABLED=false`
- `WECOM_ENTRY_ENABLED=false`
- `WECOM_OAUTH_ENABLED=false`
- `OCR_PROVIDER=mock`
- 当前公网数据库只读核查:
- `workspace_settings.profile = small_team_internal`
- `portal_home_v1 = force_on`
- `announcements_v1 = force_off`
- `global_search_v1 = force_off`
- `wecom_entry_v1 = force_off`
- 远端 smoke 结果:
- `smoke-external-deps.js`:通过,但其通过前提是“企微入口未启用 + OCR 使用 mock provider”。
- `smoke-trialrun-runtime.js`:失败,当前阻塞点为 `announcements_v1 => enabled=false reason=flag_force_off envEnabled=true`。
- 结论:
- 公网 HTTPS 与容器服务本身已通。
- 当前还不能把公网部署态视为“外部试运行闭环完成”。
- 下一步最小阻塞清单是:独立 smoke 账号、企微后台配置、以及公网 feature flag 基线修正后重跑 live smoke。
## R80 企微公网启用与只读验收
- 执行时间:`2026-05-04 16:47 - 17:03 CST`
- 服务器动作:
- 已把企微校验文件挂到 `https://oa.hyinda.com/WW_verify_StBYfdlboMaIoRRE.txt`
- 已在远端 `/opt/hyb-oa-trialrun/deploy/trialrun/.env` 启用:
- `WECOM_ENABLED=true`
- `WECOM_ENTRY_ENABLED=true`
- `WECOM_OAUTH_ENABLED=true`
- `WECOM_CORP_ID` / `WECOM_AGENT_ID` / `WECOM_AGENT_SECRET`
- `WECOM_REDIRECT_URI=https://oa.hyinda.com/api/auth/wecom/callback`
- `WECOM_ALLOWED_RETURN_HOSTS=oa.hyinda.com`
- 已把数据库 `wecom_entry_v1` 从 `force_off` 调整为 `inherit`
- 已使用 `docker-compose -f deploy/trialrun/docker-compose.yml --env-file deploy/trialrun/.env up -d --no-deps --force-recreate server` 重建公网 server 容器
- curl 验证结果:
- `GET /api/auth/wecom/config`:`status=ready`、`entryEnabled=true`、`oauthEnabled=true`
- `GET /api/auth/wecom/login?returnTo=%2Fportal`:`HTTP 302`
- `Location` 已包含:
- `appid=ww6b98ab55e5e8d341`
- `agentid=1000002`
- `redirect_uri=https://oa.hyinda.com/api/auth/wecom/callback`
- Playwright 只读验证:
- 登录页已展示“使用企业微信进入工作台”
- 浏览器实际请求 `/api/auth/wecom/config` 返回 `200`
- 点击按钮后,页面跳转到 `open.weixin.qq.com/...#wechat_redirect`
- 桌面浏览器页面提示“请在企业微信客户端打开链接”,符合企微 OAuth 预期
- 截图产物:`output/playwright/2026-05-04-wecom-login-page.png`
- 当前剩余人工动作:
- 必须由你本人使用真实企业微信客户端完成首次进入
- 若首次回到 `/login?wecom=unbound`,需先用 OA 账号密码登录并在“个人设置”完成绑定
- 绑定成功后,再次从企业微信工作台进入 OA,才算真实企微登录闭环完成
- 当前结论:
- 服务器侧企微入口、OAuth 跳转、域名校验文件、HTTPS 回调地址均已就绪
- 自动化已压到浏览器跳转层;剩余未完成项只剩“真实企微客户端首次绑定闭环”
## R81 企微回调身份诊断部署
- 时间:`2026-05-04 17:50 - 17:56 CST`
- 背景:
- 真实手机企业微信进入 OA 时,服务端收到 `/api/auth/wecom/callback` 回调
- 当前失败表现为:`AUTH_003 / missing_user_id`
- 你已确认当前企微账号是企业内部成员
- 本轮动作:
- 为 `missing_user_id` 分支补充最小安全诊断日志
- 补 1 条单测覆盖“仅有 OpenId、没有 UserId”场景
- 本地校验通过后,已重建公网 `server` 容器
- 本地验证结果:
- `cd server && node --check src/routes/wecomAuth.js`:通过
- `cd server && npm test -- tests/unit/routes/wecomAuth.test.js`:`7 passed`
- `cd server && npm run prisma:validate`:通过
- 远端验证结果:
- `https://oa.hyinda.com/ready`:正常
- `https://oa.hyinda.com/api/auth/wecom/config`:`status=ready`
- `https://oa.hyinda.com/api/auth/wecom/login?returnTo=%2Fportal`:`302` 到企业微信 OAuth
- 当前状态:
- 服务器已具备取证能力
- 待你用手机企业微信再复现 1 次,我再根据日志判断下一步应是“错误提示优化”还是“绑定模型调整”
## R83-R86 用户开通与首次绑定收口
- 时间:`2026-05-04 23:36 - 23:58 CST`
- 本轮本地实现:
- 单个新建用户改为系统自动生成员工号,不再要求管理员手工输入工号。
- 单个新建用户改为后端生成一次性口令,并在成功态只展示一次。
- 新用户首次登录后继续沿用强制改密闭环。
- 企业微信未绑定回退登录时,服务端已保留短时待绑定上下文,并在账号密码登录成功后自动补绑定。
- 本轮新增自动化结果:
- `cd server && npm test -- tests/unit/routes/auth.login.test.js tests/unit/routes/wecomAuth.test.js tests/unit/routes/users.write.test.js`
- `11 passed`
- `cd client && E2E_BASE_URL=http://127.0.0.1:3100 npx playwright test tests/e2e/user-onboarding.spec.ts tests/e2e/wecom-first-bind.spec.ts --workers=1 --reporter=list`
- `3 passed`
- 自动化已验证链路:
- 管理员创建用户 -> 系统返回员工号与一次性口令
- 新用户首次登录 -> 强制修改密码 -> 进入 Portal
- 企业微信未绑定 -> 回退密码登录 -> 继续进入目标页
- 仍需真实人工复核:
- 将本轮代码部署到目标环境后,用真实手机企业微信完成 1 次首次进入,确认真实 OAuth 回调、cookie 与企业身份环境下也能自动完成首次绑定闭环。
## R89 登录与移动端 UX 收口
- 时间:`2026-05-05`
- 本地自动化环境:`http://127.0.0.1:5173`
- 本轮实现结果:
- `/mobile` 路由在手机端隐藏桌面 Topbar,使用底部四入口:`首页 / 审批 / 票据 / 我的`。
- 普通小屏非 `/mobile` 页面保留顶部菜单抽屉作为兜底,并修复抽屉定位导致的点不开问题。
- 移动首页调整为“今天”优先,首屏展示审批待办、未读通知和高频动作。
- “我的”页承接低频入口、个人设置、完整员工档案、管理入口和退出登录。
- 移动审批和票据上传的主按钮改为更适合手机的触控目标。
- 自动化结果:
- `cd client && E2E_BASE_URL=http://127.0.0.1:5173 npx playwright test tests/e2e/r89-mobile-login-navigation.spec.ts --workers=1 --reporter=list`
- `3 passed`
- `cd client && npm run typecheck`
- 通过
- `cd client && npm run build`
- 通过;仍保留既有 Vite circular chunk 警告。
- 当前结论:
- 本地自动化已覆盖登录极简、企微移动入口、移动底部导航、移动审批、票据上传、“我的/更多”和小屏菜单抽屉。
- 真实公网手机企微仍需人工打开一次,确认企业微信真实容器内的 OAuth、cookie 与默认 `/mobile` 落点。
## R90/R91 事实源与公网入口收口启动
- 时间:`2026-05-05 20:01 CST`
- 本轮执行合同:
- `issues/2026-05-05_20-01-18-r90-r91-trialrun-closeout.csv`
- 已确认的公网只读状态:
- `GET https://oa.hyinda.com/ready`:通过
- `GET https://oa.hyinda.com/api/auth/wecom/config`:`status=ready`、`entryEnabled=true`、`oauthEnabled=true`
- `GET https://oa.hyinda.com/api/auth/wecom/login?returnTo=%2Fmobile`:`HTTP 302` 到企业微信 OAuth,state 中 `returnTo=/mobile`
- 远端 `root` 与 `deploy` 均可 SSH 到 `/opt/hyb-oa-trialrun`;`hyb-oa-trialrun-server` 与 `hyb-oa-trialrun-db` 正常运行
- 本轮调整方向:
- 文档与检查清单统一改为企业微信手机入口默认 `/mobile`
- 服务端企微默认 `defaultReturnTo` 也改为 `/mobile`,避免后台配置或直链未带 `returnTo` 时回到桌面 Portal
- 桌面浏览器和账号密码登录仍由前端运行时显式进入 `/portal`
- 当前仍需收口:
- 部署 R89/R90 最新代码到公网后,再用真实手机企业微信打开一次应用,确认已绑定账号直接进入 `/mobile`
- 用既有测试账号或 smoke 账号跑公网 live smoke,不使用真实业务账号
## R91 公网部署、live smoke 与备份恢复
- 时间:`2026-05-05 20:13 - 20:24 CST`
- 本轮部署:
- 已执行 `bash deploy/trialrun/deploy.sh`
- 远端已重建 `hyb-oa-trialrun-server`
- 前端 build 通过;仍保留既有 Vite circular chunk 警告
- `smoke-external-deps.js`:通过,当前 OCR 仍为 `mock provider`
- 企微移动入口复核:
- `GET https://oa.hyinda.com/api/auth/wecom/config`:`loginUrl=/api/auth/wecom/login?returnTo=%2Fmobile`、`defaultReturnTo=/mobile`
- `GET https://oa.hyinda.com/api/auth/wecom/login`:`HTTP 302` 到企业微信 OAuth,state 中 `returnTo=/mobile`
- Playwright 使用 iPhone + 企业微信 UA 打开公网 `/login`:主 CTA 可见,点击后请求 `/api/auth/wecom/login?returnTo=%2Fmobile` 并跳转 `open.weixin.qq.com`
- 截图:`output/playwright/r91-public-mobile-wecom-login.png`
- Runtime smoke:
- 首次手动补跑发现 `global_search_v1` 仍为 `force_off`
- 已备份远端 feature flag 状态:`/opt/hyb-oa-trialrun/deploy/trialrun/backups/feature-flags-r91-before-20260505-2018.csv`
- 已将 trialrun 必需的 11 个 `force_off` flag 改为 `inherit`
- 再次执行 `docker-compose ... exec -T server node src/scripts/smoke-trialrun-runtime.js`:通过
- Live smoke:
- 已确认远端存在 `SMOKE001` / `SMOKE002` 独立账号
- 已在本次会话内重置 smoke 账号随机密码用于自动化;密码未写入 git、不打印
- `LIVE_EXPECT_WECOM_STATUS=ready bash scripts/qa/run-web-gates.sh smoke-live`:`3 passed`
- 备份与恢复演练:
- DB 备份:`/opt/hyb-oa-trialrun/deploy/trialrun/backups/hyb-oa-db-20260505_202239.dump`
- Storage 备份:`/opt/hyb-oa-trialrun/deploy/trialrun/backups/hyb-oa-storage-20260505_202241.tar.gz`
- DB 恢复演练:已恢复到临时库 `hyb_oa_restore_check`,确认 `public` schema 下 96 张表,随后删除临时库
- Storage 恢复演练:已恢复到 `/tmp/hyb-oa-storage-restore-check-20260505_202241`,确认可解包,随后清理临时目录
- 演练后 `GET https://oa.hyinda.com/ready`:通过
- 当前仍需人工完成:
- 用真实手机企业微信从工作台打开 OA 应用一次,确认已绑定账号直接进入 `/mobile`