From 8238c197e70a3991d413414e7c00f1d9e580a2ec Mon Sep 17 00:00:00 2001 From: shunli Date: Fri, 8 May 2026 02:25:38 +0800 Subject: [PATCH] =?UTF-8?q?R110/A1,A4=20=E5=9B=9E=E5=A1=AB=E9=83=A8?= =?UTF-8?q?=E7=BD=B2=E9=AA=8C=E8=AF=81=E5=92=8COCR=E5=A4=8D=E6=A0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/tests/e2e/helpers/liveInvoiceOcr.ts | 12 ++++++------ ...-25-03-r110-mobile-pc-routing-and-live-deploy.csv | 5 +++++ 2 files changed, 11 insertions(+), 6 deletions(-) create mode 100644 issues/2026-05-08_01-25-03-r110-mobile-pc-routing-and-live-deploy.csv diff --git a/client/tests/e2e/helpers/liveInvoiceOcr.ts b/client/tests/e2e/helpers/liveInvoiceOcr.ts index 7785e9f0..615f1593 100644 --- a/client/tests/e2e/helpers/liveInvoiceOcr.ts +++ b/client/tests/e2e/helpers/liveInvoiceOcr.ts @@ -65,10 +65,10 @@ export async function uploadLiveInvoiceAndWait(page: Page, invoiceFilePath: stri try { await expect .poll(async () => { - const text = await detailPanel.innerText().catch(() => ""); - if (text.includes("状态:available")) return "available"; - if (text.includes("状态:ocr_failed")) return "ocr_failed"; - return "pending_ocr"; + const text = await detailPanel.innerText().catch(() => ""); + if (text.includes("状态:available") || text.includes("状态:可用")) return "available"; + if (text.includes("状态:ocr_failed") || text.includes("状态:识别失败")) return "ocr_failed"; + return "pending_ocr"; }, { timeout }) .toMatch(/^(available|ocr_failed)$/); } catch (error) { @@ -89,8 +89,8 @@ export async function uploadLiveInvoiceAndWait(page: Page, invoiceFilePath: stri const detailText = await detailPanel.innerText(); const bannerText = await page.getByTestId("invoice-ocr-status-banner").innerText().catch(() => ""); - const status = detailText.includes("状态:ocr_failed") ? "ocr_failed" : "available"; - const invoiceNo = extractField(detailText, "发票号:"); + const status = detailText.includes("状态:ocr_failed") || detailText.includes("状态:识别失败") ? "ocr_failed" : "available"; + const invoiceNo = extractField(detailText, "发票号:") ?? extractField(detailText, "发票号码:"); const [invoiceCode, invoiceNumber] = invoiceNo && invoiceNo.includes("-") ? invoiceNo.split("-", 2).map((item) => item.trim() || null) : [invoiceNo, null]; diff --git a/issues/2026-05-08_01-25-03-r110-mobile-pc-routing-and-live-deploy.csv b/issues/2026-05-08_01-25-03-r110-mobile-pc-routing-and-live-deploy.csv new file mode 100644 index 00000000..208cc701 --- /dev/null +++ b/issues/2026-05-08_01-25-03-r110-mobile-pc-routing-and-live-deploy.csv @@ -0,0 +1,5 @@ +ID,Title,Description,Acceptance,Test_Method,Tools,Dev_Status,Review1_Status,Regression_Status,Files,Dependencies,Notes +A1,R109 最新版本公网部署与包核验,"把已提交的 R109 移动报销、发票上传和视觉专项修复部署到公网试运行环境,确认线上不再运行旧前端包。","1) `https://oa.hyinda.com` 首页加载的静态包包含 `MobileReimbursementDetailPage`、`/mobile/reimbursements/` 和 `上传超时`;2) 公网 ready 通过;3) 部署脚本 smoke 通过;4) 不同步或打印敏感 env。","命令:`bash deploy/trialrun/deploy.sh && curl -fsS https://oa.hyinda.com/ready && curl -fsS https://oa.hyinda.com/ | sed -n '1,40p'`;业务流程:公网企业微信入口加载最新移动报销修复。","ssh|rsync|docker|curl",DONE,DONE,DONE,"deploy/trialrun/deploy.sh|remote:/opt/hyb-oa-trialrun|client/dist","[]","回滚路径:使用 deploy/trialrun 既有备份和上一 trialrun tag;不提交或输出远端 .env。" +A2,手机优先路由分流,"补齐手机/企业微信访问 PC 业务路由时的自动分流,避免手机点入口后进入 PC 页面。","1) 手机或企业微信访问 `/reimbursements` 自动到 `/mobile/reimbursements`;2) 手机或企业微信访问 `/reimbursements/:id` 自动到 `/mobile/reimbursements/:id`;3) 手机或企业微信访问 `/leave-requests` 自动到 `/mobile/leave`;4) 手机或企业微信访问 `/workflow/tasks` 自动到 `/mobile/approvals`;5) PC 浏览器仍保留 PC 页面。","命令:`cd client && npm run typecheck && npm run build && npx playwright test tests/e2e/r110-mobile-pc-routing.spec.ts --workers=1 --reporter=list`;业务流程:手机企业微信从各种入口打开报销、请假、审批均落到移动页;桌面浏览器打开原 PC 页。","typescript|playwright",DONE,DONE,DONE,"client/src/router/index.tsx|client/src/lib/runtimeContext.ts|client/tests/e2e/r110-mobile-pc-routing.spec.ts","[""A1""]","只做路由分流,不重做全部未移动化页面。" +A3,移动入口收敛与低频 PC 页面防误触,"检查移动首页、我的页和移动功能页中的入口,避免手机端直接暴露明显不适配的 PC 页面;确需保留的低频入口应降级为提示或移动可读页面。","1) `/mobile/me` 不再把资产、项目、人员、组织、系统设置作为高频直接入口暴露;2) `/mobile` 高频入口只包含已移动适配页面;3) `/mobile/assets/scan` 返回后不把用户带到 PC 资产台账;4) 公网移动视觉检查无 PC 顶栏/侧栏误入。","命令:`bash scripts/qa/run-web-gates.sh r108-mobile-local && bash scripts/qa/run-web-gates.sh r109-mobile-local && cd client && npx playwright test tests/e2e/r110-mobile-pc-routing.spec.ts --workers=1 --reporter=list`;业务流程:手机进入我的、资产扫码、通知/设置等入口,不误入 PC 壳页面。","typescript|playwright",DONE,DONE,DONE,"client/src/pages/MobileMePage.tsx|client/src/pages/MobilePortalPage.tsx|client/src/pages/MobileAssetScanPage.tsx|client/tests/e2e/r110-mobile-pc-routing.spec.ts","[""A2""]","没有移动替代页的低频功能先隐藏或提示,不在本轮重建完整移动页面。" +A4,R110 验证回填与中文提交,"执行本地和公网自动化验证,回填 CSV,并按中文分批提交。","1) Issue CSV 校验通过;2) client typecheck/build 通过;3) R108/R109/R110 移动专项通过;4) 公网包核验和移动 UA 复查通过;5) 中文提交引用 R110/Ax。","命令:`python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-05-08_01-25-03-r110-mobile-pc-routing-and-live-deploy.csv && cd client && npm run typecheck && npm run build && cd .. && bash scripts/qa/run-web-gates.sh r109-mobile-local`;业务流程:移动报销、发票上传、请假、审批、我的入口和公网部署完成回归。","python|npm|playwright|git",DONE,DONE,DONE,"issues/2026-05-08_01-25-03-r110-mobile-pc-routing-and-live-deploy.csv|client|scripts/qa|client/tests/e2e/helpers/liveInvoiceOcr.ts","[""A1"",""A2"",""A3""]","不提交历史自动化报告脏文件;公网 live OCR 已验证腾讯识别能进入终态,当前票样因重复发票进入识别失败而非一直上传中。"