R110/A1,A4 回填部署验证和OCR复核

这个提交包含在:
2026-05-08 02:25:38 +08:00
父节点 ee59ecfc45
当前提交 8238c197e7
共修改 2 个文件,包含 11 行新增和 6 行删除
+6 -6
查看文件
@@ -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];
@@ -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 已验证腾讯识别能进入终态,当前票样因重复发票进入识别失败而非一直上传中。"
1 ID Title Description Acceptance Test_Method Tools Dev_Status Review1_Status Regression_Status Files Dependencies Notes
2 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。
3 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"] 只做路由分流,不重做全部未移动化页面。
4 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"] 没有移动替代页的低频功能先隐藏或提示,不在本轮重建完整移动页面。
5 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 已验证腾讯识别能进入终态,当前票样因重复发票进入识别失败而非一直上传中。