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

33 KiB
原始文件 Blame 文件历史

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 首轮小范围试运行已完成;R6-ISSUE-003 采购提交阻断已热修、部署并复跑通过;后续进入 PC/移动/审批效率/财务台账优化批次
当前代码基线 a8b7351;公网 https://oa.hyinda.com 已部署 PS6 采购提交热修并完成 live smoke 复检
试运行窗口 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 信息架构、移动二轮体验、审批催办/超时、审批效率摘要和财务台账增强。

结论

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