From ee4aebd237fba648fec73591b528d6574c101d66 Mon Sep 17 00:00:00 2001 From: shunli Date: Thu, 7 May 2026 21:23:03 +0800 Subject: [PATCH] =?UTF-8?q?R108/A1-A7=20=E5=9B=BA=E5=8C=96=E4=BC=81?= =?UTF-8?q?=E4=B8=9A=E5=BE=AE=E4=BF=A1=E7=A7=BB=E5=8A=A8=E7=AB=AF=E8=A7=86?= =?UTF-8?q?=E8=A7=89=E9=97=A8=E7=A6=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../r108-mobile-wecom-visual/report.json | 86 ++++ artifacts/r108-mobile-wecom-visual/report.md | 24 + .../wecom-mobile-final-check.md | 57 +++ client/package.json | 1 + .../src/components/mobile/MobileBottomNav.tsx | 2 +- client/src/layouts/AppShellLayout.tsx | 4 +- client/src/pages/MobileApprovalsPage.tsx | 42 +- client/src/pages/MobileCapturePage.tsx | 11 +- .../e2e/r108-mobile-wecom-visual.spec.ts | 484 ++++++++++++++++++ ...-42-r108-mobile-wecom-visual-hardening.csv | 8 + scripts/qa/run-web-gates.sh | 27 +- 11 files changed, 722 insertions(+), 24 deletions(-) create mode 100644 artifacts/r108-mobile-wecom-visual/report.json create mode 100644 artifacts/r108-mobile-wecom-visual/report.md create mode 100644 artifacts/r108-mobile-wecom-visual/wecom-mobile-final-check.md create mode 100644 client/tests/e2e/r108-mobile-wecom-visual.spec.ts create mode 100644 issues/2026-05-07_20-20-42-r108-mobile-wecom-visual-hardening.csv diff --git a/artifacts/r108-mobile-wecom-visual/report.json b/artifacts/r108-mobile-wecom-visual/report.json new file mode 100644 index 00000000..bf918699 --- /dev/null +++ b/artifacts/r108-mobile-wecom-visual/report.json @@ -0,0 +1,86 @@ +{ + "generatedAt": "2026-05-07T13:13:00.518Z", + "checks": [ + { + "label": "企微 390-首页", + "route": "/mobile", + "screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r108/mobile-390-home.png", + "width": 390, + "height": 844, + "scrollWidth": 390, + "visibleTableCount": 0, + "uuidCount": 0 + }, + { + "label": "企微 390-报销", + "route": "/mobile/reimbursements", + "screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r108/mobile-390-reimbursements.png", + "width": 390, + "height": 844, + "scrollWidth": 390, + "visibleTableCount": 0, + "uuidCount": 0 + }, + { + "label": "企微 390-请假", + "route": "/mobile/leave", + "screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r108/mobile-390-leave.png", + "width": 390, + "height": 844, + "scrollWidth": 390, + "visibleTableCount": 0, + "uuidCount": 0 + }, + { + "label": "企微 390-我的", + "route": "/mobile/me", + "screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r108/mobile-390-me.png", + "width": 390, + "height": 844, + "scrollWidth": 390, + "visibleTableCount": 0, + "uuidCount": 0 + }, + { + "label": "企微 390-票据上传队列", + "route": "/mobile/capture", + "screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r108/mobile-390-capture-queue.png", + "width": 390, + "height": 844, + "scrollWidth": 390, + "visibleTableCount": 0, + "uuidCount": 0 + }, + { + "label": "企微 414-首页", + "route": "/mobile", + "screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r108/mobile-414-home.png", + "width": 414, + "height": 896, + "scrollWidth": 414, + "visibleTableCount": 0, + "uuidCount": 0 + }, + { + "label": "企微 414-票据上传", + "route": "/mobile/capture", + "screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r108/mobile-414-capture.png", + "width": 414, + "height": 896, + "scrollWidth": 414, + "visibleTableCount": 0, + "uuidCount": 0 + }, + { + "label": "企微 390-审批详情", + "route": "/mobile/approvals?taskId=[uuid]", + "screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r108/mobile-390-approvals-detail.png", + "width": 390, + "height": 844, + "scrollWidth": 390, + "visibleTableCount": 0, + "uuidCount": 0 + } + ], + "findings": [] +} \ No newline at end of file diff --git a/artifacts/r108-mobile-wecom-visual/report.md b/artifacts/r108-mobile-wecom-visual/report.md new file mode 100644 index 00000000..bc9604d9 --- /dev/null +++ b/artifacts/r108-mobile-wecom-visual/report.md @@ -0,0 +1,24 @@ +# R108 企业微信移动端视觉巡检报告 + +生成时间:2026-05-07T13:13:00.518Z + +## 结论 + +- 巡检记录数:8 +- 发现问题数:0 +- 截图目录:/home/shunli/Projects/hyb-oa/output/playwright/r108 + +## 发现的问题 + +- 未发现规则命中的移动端视觉/交互/展示问题。 + +## 巡检页面 + +- 企微 390-首页:/mobile,viewport=390x844,scrollWidth=390 +- 企微 390-报销:/mobile/reimbursements,viewport=390x844,scrollWidth=390 +- 企微 390-请假:/mobile/leave,viewport=390x844,scrollWidth=390 +- 企微 390-我的:/mobile/me,viewport=390x844,scrollWidth=390 +- 企微 390-票据上传队列:/mobile/capture,viewport=390x844,scrollWidth=390 +- 企微 414-首页:/mobile,viewport=414x896,scrollWidth=414 +- 企微 414-票据上传:/mobile/capture,viewport=414x896,scrollWidth=414 +- 企微 390-审批详情:/mobile/approvals?taskId=[uuid],viewport=390x844,scrollWidth=390 \ No newline at end of file diff --git a/artifacts/r108-mobile-wecom-visual/wecom-mobile-final-check.md b/artifacts/r108-mobile-wecom-visual/wecom-mobile-final-check.md new file mode 100644 index 00000000..9553b506 --- /dev/null +++ b/artifacts/r108-mobile-wecom-visual/wecom-mobile-final-check.md @@ -0,0 +1,57 @@ +# R108 真实企业微信手机最终复核 + +日期:2026-05-07 + +## 目的 + +确认真实手机企业微信客户端中,已绑定 OA 账号的用户从工作台打开 OA 应用后,能直接进入移动工作台,并完成移动端高频动作的基本浏览。 + +Playwright 已覆盖普通浏览器、移动视口、企业微信 UA、登录页、移动首页、报销、请假、票据上传、审批、我的页面和本地临时库自动巡检;真实企业微信 App 内 OAuth、Cookie 与文件选择器仍需要手机最终确认。 + +## 操作步骤 + +1. 打开手机企业微信。 +2. 进入当前企业的工作台。 +3. 点击 OA 应用。 +4. 等待页面完成跳转,不要复制链接到普通浏览器替代。 +5. 确认最终页面为 OA 移动工作台 `/mobile` 或移动内页。 +6. 点击底部“票据”,进入票据上传页,确认能看到“拍照或选择文件”和“立即上传”。 +7. 点击底部“审批”,确认能看到待处理/已处理切换;如有待办,打开一条待办并确认操作区可见。 +8. 点击底部“我的”,确认头像/姓名区域和常用入口显示正常。 + +## 通过标准 + +- 不要求输入 OA 账号密码即可进入移动端。 +- 底部导航显示:首页、审批、票据、我的。 +- 页面没有横向滚动、黑色大块底栏、桌面表格、按钮遮挡或明显文字裁切。 +- 页面没有出现 `AUTH_003`、`missing_user_id`、`当前企业微信尚未绑定`、反复登录等提示。 +- 票据上传页不显示英文 `Choose File`。 +- 审批页操作按钮没有被底部导航遮挡。 + +## 失败时记录 + +- 北京时间: +- 手机系统: +- 企业微信版本: +- 最终页面地址: +- 当前页面截图: +- 页面显示的 `requestId`: +- 错误码和错误文案: +- 是否已在个人设置中绑定企业微信: +- 是否从企业微信工作台入口进入: +- 失败发生在:首页 / 票据上传 / 审批 / 我的 / 其他: + +## 自动化边界 + +已自动化覆盖: + +- `/api/auth/wecom/config` 默认移动入口配置。 +- 企业微信 UA 下的登录页与移动工作台。 +- 本地临时库中的移动首页、报销、请假、票据上传、审批、我的页面视觉巡检。 +- 移动票据多文件队列、离线入队、删除队列项、恢复在线同步。 +- 移动审批 deep link、详情页、意见输入和审批操作区。 + +仍需人工确认: + +- 真实企业微信客户端 OAuth 完成后是否直接落到 `/mobile`。 +- 手机系统文件/相机选择器是否能正常返回文件给网页。 diff --git a/client/package.json b/client/package.json index 75deee72..56aa2a89 100644 --- a/client/package.json +++ b/client/package.json @@ -11,6 +11,7 @@ "test:e2e:smoke": "playwright test tests/e2e/login-portal-ux.spec.ts tests/e2e/wecom-entry.spec.ts", "test:e2e:full": "playwright test", "test:e2e:r106-visual-audit": "playwright test tests/e2e/r106-visual-audit.spec.ts --workers=1 --reporter=list", + "test:e2e:r108-mobile-visual": "playwright test tests/e2e/r108-mobile-wecom-visual.spec.ts --workers=1 --reporter=list", "test:e2e:r75-gap-fill": "playwright test tests/e2e/r75-automation-gap-fill.spec.ts --workers=1 --reporter=list", "test:e2e:r70-assist": "R70_TRIALRUN_ASSIST=1 playwright test tests/e2e/manual/r70-trialrun-assist.spec.ts --workers=1 --reporter=list", "test:e2e:r70-deep-assist": "PLAYWRIGHT_MANUAL=1 R70_TRIALRUN_DEEP_ASSIST=1 playwright test tests/e2e/manual/r70-trialrun-deep-assist.spec.ts --workers=1 --reporter=list", diff --git a/client/src/components/mobile/MobileBottomNav.tsx b/client/src/components/mobile/MobileBottomNav.tsx index 12c49e38..4dd805fc 100644 --- a/client/src/components/mobile/MobileBottomNav.tsx +++ b/client/src/components/mobile/MobileBottomNav.tsx @@ -33,7 +33,7 @@ export function MobileBottomNav() { const pendingCount = pendingCountQuery.data ?? 0; return ( -