# R70 人工业务试运行报告 **文档状态**:历史人工试运行快照,不代表当前公网部署状态。 日期:2026-04-28 **当前用途**:追溯 R70-R81 期间本地、公网、企微、OCR 等验证证据。 **不得误读**:文中的 `force_off`、公网 `.env`、企微启用状态和开放问题均为当时记录;当前状态应以最新 Issue CSV、部署报告和 live smoke 结果为准。 ## R6 小范围试运行记录模板(待执行) 本节用于 `issues/2026-05-11_10-23-41-r6-small-trialrun-prep.csv`。R6 未固定名单、窗口和回滚联系人前,不得把主 R6 标为 `DOING`。 ### R6 基线 | 项目 | 记录 | | --- | --- | | 公网地址 | `https://oa.hyinda.com` | | 当前门禁 | R5 已 `DONE/DONE/DONE`;R6 仍 `TODO` | | 当前代码基线 | 待 R6-3 试运行前检查时记录公网运行版本 | | 试运行窗口 | 待填写 | | 回滚联系人 | 待填写 | | 问题登记负责人 | 待填写 | | 当前候选配置 | 员工 `SMOKE002`;经理/审批人 `SMOKE101`;管理员 `wangshunli`;财务 `wangzhiling` | | 允许范围 | 报销、请假、采购、审批、企业微信入口/通知、财务付款/导出 | | 禁止扩展 | 预算、ERP、AI、完整差旅、复杂 BPM、审批设计器、新组织规则 | ### R6 人员与角色 | 用户 | 角色 | 入口 | 设备 | 负责流程 | 结果 | 备注 | | --- | --- | --- | --- | --- | --- | --- | | `SMOKE002` | 员工 / 提交人 | PC / 企业微信 / 手机浏览器 | iPhone 11 / Redmi K60 | 报销、请假、采购提交 | 待执行 | 用户口径为 `smkoe02/smoke02`,按既有账号统一记录为 `SMOKE002` | | `SMOKE101` | 经理 / 审批人 | PC / 企业微信 / 手机浏览器 | iPhone 11 / Redmi K60 | 审批待办、退回或驳回 | 待执行 | 审批人可以是经理;不使用 admin 解释审批权 | | `wangshunli` | 管理员 / 回滚或试运行拍板候选 | PC | 待填写 | 管理后台、配置核对、试运行决策 | 待执行 | 不作为本轮普通业务审批人;财务由 `wangzhiling` 候选承担 | | `wangzhiling` | 财务 | PC / 手机浏览器 | Redmi K60 | 财务复核、付款标记、导出 | 待执行 | R6-3 前需只读确认账号 active、财务角色和权限 | ### R6 流程执行矩阵 | 流程 | 操作路径 | 期望结果 | 执行人 | 结果 | 证据位置 | | --- | --- | --- | --- | --- | --- | | 报销 | 员工提交报销 -> 上传 PDF 发票或附件 -> 提交审批 -> 审批人处理 -> 财务复核或付款标记 | 状态、审批历史、通知和财务动作一致 | 待填写 | 待执行 | 不提交敏感截图 | | 请假 | 员工提交请假 -> 审批人处理 -> 员工查看状态 | 待办、历史和团队状态一致 | 待填写 | 待执行 | 不提交敏感截图 | | 采购 | 员工提交采购 -> 审批人处理 -> 查看审批历史 | 采购状态和审批中心一致 | 待填写 | 待执行 | 不提交敏感截图 | | 企业微信通知 | 待办产生 -> 审批人收到个人应用消息 -> 点击回 OA | 消息可达且 deeplink 回移动审批或详情 | 待填写 | 待执行 | 记录文字结论即可 | | 财务付款/导出 | 财务处理已通过单据 -> 标记付款或导出 | 权限、状态和审计记录正确 | 待填写 | 待执行 | 不导出敏感数据到仓库 | ### R6 问题登记 | ID | 级别 | 角色 | 入口/设备 | 流程 | 复现步骤 | 当前处理 | 负责人 | 状态 | 关联 Issue | | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | | R6-ISSUE-001 | 阻断 | 审批人 / 员工 | iPhone 11 / 企业微信 WebView | 移动底部导航、审批入口、首页快捷卡 | iPhone 11 使用企业微信打开 OA,底部菜单第二项“审批”点不了,首页快捷卡图标和文字挤在一起;用户反馈单点适配不足,需要像主流移动网页/App 一样自动适配不同分辨率 | `PAUSED`:已从单机型热修升级为移动响应式体系修复并部署;首页快捷入口改为图标宫格,公网 320/360/375/390/393/414/430 视觉矩阵通过;用户暂时暂停真机验证,待 iPhone 11 / Redmi K60 真机确认后关闭或降级 | Codex / 待指派 | open | `issues/2026-05-11_12-17-07-r6-mobile-responsive-system-hotfix.csv` | 级别定义: - 阻断:权限泄漏、付款状态错乱、企业微信入口不可用、审批主流程无法继续、真实 OCR 大面积失败。 - 严重:主流程可绕行但影响试运行可信度,需当天判断修复、降级或暂停。 - 一般:不阻断流程,进入后续修复 Issue。 - 体验建议:文案、布局、效率和易用性建议,进入后续体验优化批次。 ### R6 每日收口 | 日期 | 执行范围 | 新增问题 | 阻断数 | 严重数 | 结论 | 决策人 | | --- | --- | --- | --- | --- | --- | --- | | 待填写 | 待填写 | 待填写 | 0 | 0 | 继续 / 修复后继续 / 暂停 / 回滚 | 待填写 | ## 结论 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`