R122/A1-A4 清理artifacts版本管理

这个提交包含在:
2026-05-08 10:53:47 +08:00
父节点 79d9655b23
当前提交 135be878f5
共修改 65 个文件,包含 23 行新增和 23781 行删除
+1 -4
查看文件
@@ -20,11 +20,8 @@ client/test-results
client/playwright-report client/playwright-report
.playwright-cli/ .playwright-cli/
output/ output/
artifacts/ad-hoc-visual-audit-*/ artifacts/
# Vitest coverage artifacts # Vitest coverage artifacts
server/coverage server/coverage
server/.vitest server/.vitest
# Local manual trialrun files
artifacts/*.pdf
@@ -1,492 +0,0 @@
{
"baseURL": "https://oa.hyinda.com",
"generatedAt": "2026-05-06T13:35:34.261Z",
"login": {
"user": {
"identifier": "[email protected]",
"name": "employee"
},
"attempts": [
{
"user": "employee",
"url": "https://oa.hyinda.com/portal"
}
]
},
"pages": [
{
"id": "pc-reimbursements-list",
"url": "https://oa.hyinda.com/reimbursements",
"title": "海音达工作台",
"textStart": "海音达工作台\n审批 报销 团队\n今日工作台\n先处理待办和团队状态,再进入具体模块。\n主导航\n优先处理今日工作与高频协同。\nhome_app_logo\nPortal\ngroups\n团队\nevent_available\n请假\nrequest_quote\n报销\ninventory_2\n资产\narticle\n周报\ncheck_circle\n待办\ncampaign\n公告\nworkspaces\n项目\n备用模块\n默认收起,不干扰主路径\n按需展开\n主导航\n\n报销\n\n你好,Employee\nsearch\n搜索\nEmployee\n我的报销\n\n草稿、审批、支付。\n\n新建报销\n导出\n当前列表\n0\n共 0 条\n当前金额\n¥0.00\n当前页\n审批中\n0\n待推进\n已支付\n0\n仅自己\n草稿\n审批中\n已通过\n已支付\n已驳回\n已取消\n单号\t状态\t金额\t报销人\t日期\t操作\n暂无数据\n第 1 / 1 页\n上一页\n下一页",
"bodyTextLength": 395,
"buttons": [
"search搜索",
"search",
"Employee",
"新建报销",
"导出",
"草稿",
"审批中",
"已通过",
"已支付",
"已驳回",
"已取消",
"上一页",
"下一页"
],
"links": [
{
"text": "home_app_logoPortal",
"href": "/portal"
},
{
"text": "groups团队",
"href": "/team"
},
{
"text": "event_available请假",
"href": "/leave-requests"
},
{
"text": "request_quote报销",
"href": "/reimbursements"
},
{
"text": "inventory_2资产",
"href": "/assets"
},
{
"text": "article周报",
"href": "/weekly-reports"
},
{
"text": "check_circle待办",
"href": "/todos"
},
{
"text": "campaign公告",
"href": "/announcements"
},
{
"text": "workspaces项目",
"href": "/projects"
},
{
"text": "shopping_cart采购申请",
"href": "/purchase-requests"
},
{
"text": "flight差旅申请",
"href": "/travel-requests"
},
{
"text": "receipt_long票据中心",
"href": "/invoice-pool"
}
],
"tables": [
{
"headers": [
"单号",
"状态",
"金额",
"报销人",
"日期",
"操作"
],
"firstRow": [
"暂无数据"
],
"rowCount": 1
}
],
"dialogs": [],
"longUuidLike": [],
"hasDeleteText": false,
"hasReimbursementDelete": false,
"hasInvoiceOptionalBinding": false,
"verboseFlags": {
"hasViewEditSubmit": false,
"hasInvoiceWaitOcrCopy": false,
"hasCurrentPageMetrics": true
}
},
{
"id": "pc-invoice-pool",
"url": "https://oa.hyinda.com/invoice-pool",
"title": "海音达工作台",
"textStart": "海音达工作台\n审批 报销 团队\n今日工作台\n先处理待办和团队状态,再进入具体模块。\n主导航\n优先处理今日工作与高频协同。\nhome_app_logo\nPortal\ngroups\n团队\nevent_available\n请假\nrequest_quote\n报销\ninventory_2\n资产\narticle\n周报\ncheck_circle\n待办\ncampaign\n公告\nworkspaces\n项目\n备用模块\n默认收起,不干扰主路径\n按需展开\n工作台\n\n/invoice-pool\n\n你好,Employee\nsearch\n搜索\nEmployee\n票据中心\n\n上传、识别、绑定。\n\n导出\n添加发票\ncloud_upload\n选择文件\n上传\n票据列表\n全部状态\n识别中\n可用\n识别失败\n已绑定\n已归档\n仅看自己\n查看全部\n票据流水号\t状态\t发票号码\t识别状态\t操作\n\nc5f3e528-8622-46d0-87c5-50af3c3b5dfd\n\t可用\t26112000000938423851-26112000000938423851\t已识别\tmore_horiz\n\n3e660edf-d29a-4683-bd99-e8e13b1e614e\n\t可用\t26112000000938423851-26112000000938423851\t已识别\tmore_horiz\n\n3c0ba5ae-e01b-4a58-8a6f-0e137134d0a0\n\t可用\t26112000000938423851-26112000000938423851\t已识别\tmore_horiz\n第 1 / 1 页\n上一页\n下一页\n绑定业务单据\n选择票据\n26112000000938423851-26112000000938423851 (available)\n26112000000938423851-26112000000938423851 (available)\n26112000000938423851-26112000000938423851 (available)\n选择报销单\n绑定票据\n票据详情\n票据 ID:c5f3e528-8622-46d0-87c5-50af3c3b5dfd\n状态:available\n发票号:26112000000938423851-26112000000938423851\n销售方:北京悦海堂餐饮管理有限公司\n购买方:合肥海音达科技有限公司\n总金额:¥1,683.00\n开票日期:2026-03-11\n关联报销:-\n验真状态:未触发\n判重例外:否\n人工修正\n手工归档",
"bodyTextLength": 1080,
"buttons": [
"search搜索",
"search",
"Employee",
"导出",
"上传",
"查看详情",
"预览",
"查看详情",
"预览",
"查看详情",
"预览",
"more_horiz",
"more_horiz",
"more_horiz",
"上一页",
"下一页",
"绑定票据",
"人工修正",
"手工归档"
],
"links": [
{
"text": "home_app_logoPortal",
"href": "/portal"
},
{
"text": "groups团队",
"href": "/team"
},
{
"text": "event_available请假",
"href": "/leave-requests"
},
{
"text": "request_quote报销",
"href": "/reimbursements"
},
{
"text": "inventory_2资产",
"href": "/assets"
},
{
"text": "article周报",
"href": "/weekly-reports"
},
{
"text": "check_circle待办",
"href": "/todos"
},
{
"text": "campaign公告",
"href": "/announcements"
},
{
"text": "workspaces项目",
"href": "/projects"
},
{
"text": "shopping_cart采购申请",
"href": "/purchase-requests"
},
{
"text": "flight差旅申请",
"href": "/travel-requests"
},
{
"text": "receipt_long票据中心",
"href": "/invoice-pool"
}
],
"tables": [
{
"headers": [
"票据流水号",
"状态",
"发票号码",
"识别状态",
"操作"
],
"firstRow": [
"c5f3e528-8622-46d0-87c5-50af3c3b5dfd",
"可用",
"26112000000938423851-26112000000938423851",
"已识别",
"more_horiz"
],
"rowCount": 3
}
],
"dialogs": [],
"longUuidLike": [
"c5f3e528-8622-46d0-87c5-50af3c3b5dfd",
"3e660edf-d29a-4683-bd99-e8e13b1e614e",
"3c0ba5ae-e01b-4a58-8a6f-0e137134d0a0"
],
"hasDeleteText": false,
"hasReimbursementDelete": false,
"hasInvoiceOptionalBinding": false,
"verboseFlags": {
"hasViewEditSubmit": false,
"hasInvoiceWaitOcrCopy": false,
"hasCurrentPageMetrics": false
}
},
{
"id": "pc-leave-requests",
"url": "https://oa.hyinda.com/leave-requests",
"title": "海音达工作台",
"textStart": "海音达工作台\n审批 报销 团队\n今日工作台\n先处理待办和团队状态,再进入具体模块。\n主导航\n优先处理今日工作与高频协同。\nhome_app_logo\nPortal\ngroups\n团队\nevent_available\n请假\nrequest_quote\n报销\ninventory_2\n资产\narticle\n周报\ncheck_circle\n待办\ncampaign\n公告\nworkspaces\n项目\n备用模块\n默认收起,不干扰主路径\n按需展开\n主导航\n\n请假\n\n你好,Employee\nsearch\n搜索\nEmployee\n请假申请\n\n支持假种选择、半天粒度请假、额度冻结与撤回释放。\n\n可用额度\n30.0\n按当前启用假种汇总\n已冻结\n0.0\n审批中申请会占用额度\n已使用\n0.0\n通过后计入已使用\n本次预估\n-\n创建草稿前可先预览天数\n新建请假草稿\n\n先填写时间段与假种,再补充附件和说明。\n\n假期类型\n请选择\n年假\n病假\n事假\n开始日期\n开始时段\n上午\n下午\n结束日期\n结束时段\n上午\n下午\n附件\n\n附件为可选项\n\n请假说明\n预计请假天数:-\n创建草稿\n额度概览\n\n假种可用额度、冻结与已使用情况按自然周期汇总。\n\n年假\n\n2026-01-01 ~ 2026-12-31\n\n启用\n\n可用\n\n15\n\n已冻结\n\n0\n\n已使用\n\n0\n\n授予额度\n\n15\n\n病假\n\n2026-01-01 ~ 2026-12-31\n\n启用\n\n可用\n\n10\n\n已冻结\n\n0\n\n已使用\n\n0\n\n授予额度\n\n10\n\n事假\n\n2026-01-01 ~ 2026-12-31\n\n启用\n\n可用\n\n5\n\n已冻结\n\n0\n\n已使用\n\n0\n\n授予额度\n\n5\n\n请假记录\n\n支持按状态和范围收敛列表,草稿与驳回单可再次提交。\n\n最近一次筛选会保留在当前页面状态中。\n全部状态\n草稿\n审批中\n已通过\n已驳回\n已取消\n刷新\n假种 / 申请人\t时间段\t天数\t状态\t附件\t更新时间\t操作\n暂无请假记录\n第 1 / 1 页\n上一页\n下一页",
"bodyTextLength": 838,
"buttons": [
"search搜索",
"search",
"Employee",
"创建草稿",
"刷新",
"上一页",
"下一页"
],
"links": [
{
"text": "home_app_logoPortal",
"href": "/portal"
},
{
"text": "groups团队",
"href": "/team"
},
{
"text": "event_available请假",
"href": "/leave-requests"
},
{
"text": "request_quote报销",
"href": "/reimbursements"
},
{
"text": "inventory_2资产",
"href": "/assets"
},
{
"text": "article周报",
"href": "/weekly-reports"
},
{
"text": "check_circle待办",
"href": "/todos"
},
{
"text": "campaign公告",
"href": "/announcements"
},
{
"text": "workspaces项目",
"href": "/projects"
},
{
"text": "shopping_cart采购申请",
"href": "/purchase-requests"
},
{
"text": "flight差旅申请",
"href": "/travel-requests"
},
{
"text": "receipt_long票据中心",
"href": "/invoice-pool"
}
],
"tables": [
{
"headers": [
"假种 / 申请人",
"时间段",
"天数",
"状态",
"附件",
"更新时间",
"操作"
],
"firstRow": [
"暂无请假记录"
],
"rowCount": 1
}
],
"dialogs": [],
"longUuidLike": [],
"hasDeleteText": false,
"hasReimbursementDelete": false,
"hasInvoiceOptionalBinding": false,
"verboseFlags": {
"hasViewEditSubmit": false,
"hasInvoiceWaitOcrCopy": false,
"hasCurrentPageMetrics": false
}
},
{
"id": "pc-purchase-requests",
"url": "https://oa.hyinda.com/purchase-requests",
"title": "海音达工作台",
"textStart": "海音达工作台\n审批 报销 团队\n今日工作台\n先处理待办和团队状态,再进入具体模块。\n主导航\n优先处理今日工作与高频协同。\nhome_app_logo\nPortal\ngroups\n团队\nevent_available\n请假\nrequest_quote\n报销\ninventory_2\n资产\narticle\n周报\ncheck_circle\n待办\ncampaign\n公告\nworkspaces\n项目\n备用模块\n默认收起,不干扰主路径\n按需展开\n工作台\n\n/purchase-requests\n\n你好,Employee\nsearch\n搜索\nEmployee\n采购申请\n\n支持草稿、附件、提交、撤回与经理单步审批的轻采购流程。\n\n新建采购\n全部状态\n草稿\n审批中\n已通过\n已驳回\n已取消\n全部供应商\n全部法体\n试运行法体\n全部成本中心\n采购单列表\n共 0 条\n单据\t申请人\t状态\t金额\n暂无采购申请\n第 1 / 1 页\n上一页\n下一页\n请先在左侧选择采购单,或新建一张采购草稿。",
"bodyTextLength": 433,
"buttons": [
"search搜索",
"search",
"Employee",
"新建采购",
"上一页",
"下一页"
],
"links": [
{
"text": "home_app_logoPortal",
"href": "/portal"
},
{
"text": "groups团队",
"href": "/team"
},
{
"text": "event_available请假",
"href": "/leave-requests"
},
{
"text": "request_quote报销",
"href": "/reimbursements"
},
{
"text": "inventory_2资产",
"href": "/assets"
},
{
"text": "article周报",
"href": "/weekly-reports"
},
{
"text": "check_circle待办",
"href": "/todos"
},
{
"text": "campaign公告",
"href": "/announcements"
},
{
"text": "workspaces项目",
"href": "/projects"
},
{
"text": "shopping_cart采购申请",
"href": "/purchase-requests"
},
{
"text": "flight差旅申请",
"href": "/travel-requests"
},
{
"text": "receipt_long票据中心",
"href": "/invoice-pool"
}
],
"tables": [
{
"headers": [
"单据",
"申请人",
"状态",
"金额"
],
"firstRow": [
"暂无采购申请"
],
"rowCount": 1
}
],
"dialogs": [],
"longUuidLike": [],
"hasDeleteText": false,
"hasReimbursementDelete": false,
"hasInvoiceOptionalBinding": false,
"verboseFlags": {
"hasViewEditSubmit": false,
"hasInvoiceWaitOcrCopy": false,
"hasCurrentPageMetrics": false
}
},
{
"id": "pc-travel-requests-tab-requests",
"url": "https://oa.hyinda.com/travel-requests?tab=requests",
"title": "海音达工作台",
"textStart": "海音达工作台\n审批 报销 团队\n今日工作台\n先处理待办和团队状态,再进入具体模块。\n主导航\n优先处理今日工作与高频协同。\nhome_app_logo\nPortal\ngroups\n团队\nevent_available\n请假\nrequest_quote\n报销\ninventory_2\n资产\narticle\n周报\ncheck_circle\n待办\ncampaign\n公告\nworkspaces\n项目\n备用模块\n默认收起,不干扰主路径\n按需展开\n工作台\n\n/travel-requests\n\n你好,Employee\nsearch\n搜索\nEmployee\n差旅管理\n\n差旅申请、对公支付轨道与批次对账在同一路径统一收口。\n\n新建差旅申请\n差旅申请\n状态\n全部状态\n草稿\n审批中\n已通过\n已驳回\n出差类型\n全部类型\n国内\n国际\n法体\n全部法体\n试运行法体\n成本中心\n全部成本中心\n暂无差旅申请\n\n点击右上角创建新的差旅草稿。\n\n第 1 / 1 页\n上一页\n下一页\n新建差旅申请\n\n填写主单与行程段,保存为草稿后可继续编辑并提交审批。\n\n出差目的\n出差类型\n国内\n国际\n预估金额\n开始日期\n结束日期\n法体\n请选择法体\n试运行法体\n成本中心\n请选择成本中心\n预算池\n待提交时自动解析\n行程段\n新增行程段\n\n第 1 段\n\n角色\n去程\n返程\n中转\n交通方式\n航班\n火车\n汽车\n大巴\n其他\n出发地\n目的地\n出发时间\n到达时间\n保存草稿",
"bodyTextLength": 605,
"buttons": [
"search搜索",
"search",
"Employee",
"新建差旅申请",
"差旅申请",
"上一页",
"下一页",
"新增行程段",
"保存草稿"
],
"links": [
{
"text": "home_app_logoPortal",
"href": "/portal"
},
{
"text": "groups团队",
"href": "/team"
},
{
"text": "event_available请假",
"href": "/leave-requests"
},
{
"text": "request_quote报销",
"href": "/reimbursements"
},
{
"text": "inventory_2资产",
"href": "/assets"
},
{
"text": "article周报",
"href": "/weekly-reports"
},
{
"text": "check_circle待办",
"href": "/todos"
},
{
"text": "campaign公告",
"href": "/announcements"
},
{
"text": "workspaces项目",
"href": "/projects"
},
{
"text": "shopping_cart采购申请",
"href": "/purchase-requests"
},
{
"text": "flight差旅申请",
"href": "/travel-requests"
},
{
"text": "receipt_long票据中心",
"href": "/invoice-pool"
}
],
"tables": [],
"dialogs": [],
"longUuidLike": [],
"hasDeleteText": false,
"hasReimbursementDelete": false,
"hasInvoiceOptionalBinding": false,
"verboseFlags": {
"hasViewEditSubmit": false,
"hasInvoiceWaitOcrCopy": false,
"hasCurrentPageMetrics": false
}
}
],
"errors": [
"first detail link not visible"
],
"consoleMessages": []
}
二进制文件未显示。

之前

宽度:  |  高度:  |  大小: 182 KiB

二进制文件未显示。

之前

宽度:  |  高度:  |  大小: 227 KiB

二进制文件未显示。

之前

宽度:  |  高度:  |  大小: 110 KiB

二进制文件未显示。

之前

宽度:  |  高度:  |  大小: 398 KiB

二进制文件未显示。

之前

宽度:  |  高度:  |  大小: 448 KiB

二进制文件未显示。

之前

宽度:  |  高度:  |  大小: 118 KiB

二进制文件未显示。

之前

宽度:  |  高度:  |  大小: 108 KiB

二进制文件未显示。

之前

宽度:  |  高度:  |  大小: 168 KiB

@@ -1,394 +0,0 @@
{
"generatedAt": "2026-05-06T13:39:43.542Z",
"temporaryData": {
"reimbursementId": "aacf9d44-0b31-4ca1-a846-198ea55f6d84",
"formNumber": null,
"itemId": "658be08d-3b30-4b20-b42f-0d277faab017",
"expenseType": "机票"
},
"pages": [
{
"id": "pc-reimbursements-list-with-draft",
"url": "https://oa.hyinda.com/reimbursements?status=draft",
"textStart": "海音达工作台\n审批 报销 团队\n今日工作台\n先处理待办和团队状态,再进入具体模块。\n主导航\n优先处理今日工作与高频协同。\nhome_app_logo\nPortal\ngroups\n团队\nevent_available\n请假\nrequest_quote\n报销\ninventory_2\n资产\narticle\n周报\ncheck_circle\n待办\ncampaign\n公告\nworkspaces\n项目\n备用模块\n默认收起,不干扰主路径\n按需展开\n主导航\n\n报销\n\n你好,Employee\nsearch\n搜索\nEmployee\n我的报销\n\n草稿、审批、支付。\n\n新建报销\n导出\n当前列表\n1\n共 1 条\n当前金额\n¥12.30\n当前页\n审批中\n0\n待推进\n已支付\n0\n仅自己\n草稿\n审批中\n已通过\n已支付\n已驳回\n已取消\n单号\t状态\t金额\t报销人\t日期\t操作\n\naacf9d44-0b31-4ca1-a846-198ea55f6d84\n\t草稿\t¥12.30\t\nE\nEmployee\n\t2026-05-06\t编辑\n第 1 / 1 页\n上一页\n下一页",
"buttons": [
"search搜索",
"search",
"Employee",
"新建报销",
"导出",
"草稿",
"审批中",
"已通过",
"已支付",
"已驳回",
"已取消",
"上一页",
"下一页"
],
"links": [
{
"text": "home_app_logoPortal",
"href": "/portal"
},
{
"text": "groups团队",
"href": "/team"
},
{
"text": "event_available请假",
"href": "/leave-requests"
},
{
"text": "request_quote报销",
"href": "/reimbursements"
},
{
"text": "inventory_2资产",
"href": "/assets"
},
{
"text": "article周报",
"href": "/weekly-reports"
},
{
"text": "check_circle待办",
"href": "/todos"
},
{
"text": "campaign公告",
"href": "/announcements"
},
{
"text": "workspaces项目",
"href": "/projects"
},
{
"text": "shopping_cart采购申请",
"href": "/purchase-requests"
},
{
"text": "flight差旅申请",
"href": "/travel-requests"
},
{
"text": "receipt_long票据中心",
"href": "/invoice-pool"
},
{
"text": "继续编辑",
"href": "/reimbursements/aacf9d44-0b31-4ca1-a846-198ea55f6d84"
},
{
"text": "编辑",
"href": "/reimbursements/aacf9d44-0b31-4ca1-a846-198ea55f6d84"
}
],
"dialogs": [],
"tables": [
{
"headers": [
"单号",
"状态",
"金额",
"报销人",
"日期",
"操作"
],
"firstRow": [
"aacf9d44-0b31-4ca1-a846-198ea55f6d84",
"草稿",
"¥12.30",
"EEmployee",
"2026-05-06",
"编辑"
],
"rowCount": 1
}
],
"longUuidLike": [
"aacf9d44-0b31-4ca1-a846-198ea55f6d84"
],
"flags": {
"hasWholeDelete": false,
"hasDetailDeleteOnly": false,
"hasRawReimbursementId": false,
"hasInvoiceOptionalBinding": false,
"hasVerboseDetailSubtitle": false,
"hasVerboseInvoiceCopy": false
}
},
{
"id": "pc-reimbursement-detail-with-item",
"url": "https://oa.hyinda.com/reimbursements/aacf9d44-0b31-4ca1-a846-198ea55f6d84",
"textStart": "海音达工作台\n审批 报销 团队\n今日工作台\n先处理待办和团队状态,再进入具体模块。\n主导航\n优先处理今日工作与高频协同。\nhome_app_logo\nPortal\ngroups\n团队\nevent_available\n请假\nrequest_quote\n报销\ninventory_2\n资产\narticle\n周报\ncheck_circle\n待办\ncampaign\n公告\nworkspaces\n项目\n备用模块\n默认收起,不干扰主路径\n按需展开\n主导航\n\n报销详情\n\n你好,Employee\nsearch\n搜索\nEmployee\n报销详情 aacf9d44-0b31-4ca1-a846-198ea55f6d84\n\n查看、编辑、提交。\n\n草稿\n报销日期:2026-05-06\n报销人:Employee\n提交人:Employee\n金额:12.3\n打印 / PDF\n返回列表\n概览与关联\n当前状态\n草稿\n关联项目\n未关联\n明细数\n1\n关联票据\n0\n状态:draft\n报销ID:aacf9d44-0b31-4ca1-a846-198ea55f6d84\n报销日期:2026-05-06\n金额:12.3\n提交人:Employee\n报销人:Employee\n说明:R100 PC 报销体验自动化审查临时草稿\n关联项目\n\n报销可选挂到项目,用于项目执行面板汇总。\n\n不关联项目\n明细与票据\n报销明细\n\n明细变更会自动重算总金额。\n\n新增明细\n费用类型\t发生日期\t金额\t说明\t操作\n\n机票\ntravel_airfare\n\t2026-05-06\t\n12.3\n\t\nR100 临时明细\n\t\n编辑\n删除\n关联票据\n\n可在当前页面内直接绑定已有发票,或上传新发票后等待 OCR 完成。\n\n添加发票\n\n暂无关联票据\n\n风险与同步\n报销摘要\n报销编号:aacf9d44-0b31-4ca1-a846-198ea55f6d84\n报销人:Employee\n提交人:Employee\n当前审批:-\n明细数:1\n票据数:0\n关联项目:未关联\n可执行动作\n提交报销\n\n提交前需先绑定至少 1 张发票,可在“关联票据”区域添加。\n\n撤回报销\n\n撤回",
"buttons": [
"search搜索",
"search",
"Employee",
"新增明细",
"编辑",
"删除",
"添加发票",
"提交报销",
"撤回"
],
"links": [
{
"text": "home_app_logoPortal",
"href": "/portal"
},
{
"text": "groups团队",
"href": "/team"
},
{
"text": "event_available请假",
"href": "/leave-requests"
},
{
"text": "request_quote报销",
"href": "/reimbursements"
},
{
"text": "inventory_2资产",
"href": "/assets"
},
{
"text": "article周报",
"href": "/weekly-reports"
},
{
"text": "check_circle待办",
"href": "/todos"
},
{
"text": "campaign公告",
"href": "/announcements"
},
{
"text": "workspaces项目",
"href": "/projects"
},
{
"text": "shopping_cart采购申请",
"href": "/purchase-requests"
},
{
"text": "flight差旅申请",
"href": "/travel-requests"
},
{
"text": "receipt_long票据中心",
"href": "/invoice-pool"
},
{
"text": "打印 / PDF",
"href": "/reimbursements/aacf9d44-0b31-4ca1-a846-198ea55f6d84/print"
},
{
"text": "返回列表",
"href": "/reimbursements"
}
],
"dialogs": [],
"tables": [
{
"headers": [
"费用类型",
"发生日期",
"金额",
"说明",
"操作"
],
"firstRow": [
"机票travel_airfare",
"2026-05-06",
"12.3",
"R100 临时明细",
"编辑删除"
],
"rowCount": 1
}
],
"longUuidLike": [
"aacf9d44-0b31-4ca1-a846-198ea55f6d84"
],
"flags": {
"hasWholeDelete": false,
"hasDetailDeleteOnly": false,
"hasRawReimbursementId": true,
"hasInvoiceOptionalBinding": false,
"hasVerboseDetailSubtitle": true,
"hasVerboseInvoiceCopy": false
}
},
{
"id": "pc-reimbursement-invoice-dialog-with-item",
"url": "https://oa.hyinda.com/reimbursements/aacf9d44-0b31-4ca1-a846-198ea55f6d84",
"textStart": "海音达工作台\n审批 报销 团队\n今日工作台\n先处理待办和团队状态,再进入具体模块。\n主导航\n优先处理今日工作与高频协同。\nhome_app_logo\nPortal\ngroups\n团队\nevent_available\n请假\nrequest_quote\n报销\ninventory_2\n资产\narticle\n周报\ncheck_circle\n待办\ncampaign\n公告\nworkspaces\n项目\n备用模块\n默认收起,不干扰主路径\n按需展开\n主导航\n\n报销详情\n\n你好,Employee\nsearch\n搜索\nEmployee\n报销详情 aacf9d44-0b31-4ca1-a846-198ea55f6d84\n\n查看、编辑、提交。\n\n草稿\n报销日期:2026-05-06\n报销人:Employee\n提交人:Employee\n金额:12.3\n打印 / PDF\n返回列表\n概览与关联\n当前状态\n草稿\n关联项目\n未关联\n明细数\n1\n关联票据\n0\n状态:draft\n报销ID:aacf9d44-0b31-4ca1-a846-198ea55f6d84\n报销日期:2026-05-06\n金额:12.3\n提交人:Employee\n报销人:Employee\n说明:R100 PC 报销体验自动化审查临时草稿\n关联项目\n\n报销可选挂到项目,用于项目执行面板汇总。\n\n不关联项目\n明细与票据\n报销明细\n\n明细变更会自动重算总金额。\n\n新增明细\n费用类型\t发生日期\t金额\t说明\t操作\n\n机票\ntravel_airfare\n\t2026-05-06\t\n12.3\n\t\nR100 临时明细\n\t\n编辑\n删除\n关联票据\n\n可在当前页面内直接绑定已有发票,或上传新发票后等待 OCR 完成。\n\n添加发票\n\n暂无关联票据\n\n风险与同步\n报销摘要\n报销编号:aacf9d44-0b31-4ca1-a846-198ea55f6d84\n报销人:Employee\n提交人:Employee\n当前审批:-\n明细数:1\n票据数:0\n关联项目:未关联\n可执行动作\n提交报销\n\n提交前需先绑定至少 1 张发票,可在“关联票据”区域添加。\n\n撤回报销\n\n撤回\n添加发票\n\n选择当前报销人可绑定的可用发票,或上传新发票等待 OCR 完成后直接绑定。\n\n刷新列表\n发票 26112000000938423851-26112000000938423851\n北京悦海堂餐饮管理有限公司 · 2026-03-11 · 金额 ¥1683\n原始文件:北京悦海堂餐饮管理有限公司_发票金额1683.00元.pdf · 上传时间 2026-05-05 15:58:28\n绑定到明细(可选)\n不绑定具体明细\n机票 · R100 临时明细\n发票 26112000000938423851-26112000000938423851\n北京悦海堂餐饮管理有限公司 · 2026-03-11 · 金额 ¥1683\n原始文件:北京悦海堂餐饮管理有限公司_发票金额1683.00元.pdf · 上传时间 2026-05-05 15:55:32\n绑定到明细(可选)\n不绑定具体明细\n机票 · R100 临时明细\n发票 26112000000938423851-26112000000938423851\n北京悦海堂餐饮管理有限公司 · 2026-03-11 · 金额 ¥1683\n原始文件:北京悦海堂餐饮管理有限公司_发票金额1683.00元.pdf · 上传时间 2026-05-05 14:37:01\n绑定到明细(可选)\n不绑定具体明细\n机票 · R100 临时明细\n已选 0 张发票\n绑定选中发票\n或者上传新发票\n\n上传后会自动使用当前报销人的 owner 信息,并等待 OCR 识别完成。\n\n选择发票文件\n上传并等待 OCR",
"buttons": [
"search搜索",
"search",
"Employee",
"新增明细",
"编辑",
"删除",
"添加发票",
"提交报销",
"撤回",
"刷新列表",
"绑定选中发票",
"上传并等待 OCR"
],
"links": [
{
"text": "home_app_logoPortal",
"href": "/portal"
},
{
"text": "groups团队",
"href": "/team"
},
{
"text": "event_available请假",
"href": "/leave-requests"
},
{
"text": "request_quote报销",
"href": "/reimbursements"
},
{
"text": "inventory_2资产",
"href": "/assets"
},
{
"text": "article周报",
"href": "/weekly-reports"
},
{
"text": "check_circle待办",
"href": "/todos"
},
{
"text": "campaign公告",
"href": "/announcements"
},
{
"text": "workspaces项目",
"href": "/projects"
},
{
"text": "shopping_cart采购申请",
"href": "/purchase-requests"
},
{
"text": "flight差旅申请",
"href": "/travel-requests"
},
{
"text": "receipt_long票据中心",
"href": "/invoice-pool"
},
{
"text": "打印 / PDF",
"href": "/reimbursements/aacf9d44-0b31-4ca1-a846-198ea55f6d84/print"
},
{
"text": "返回列表",
"href": "/reimbursements"
}
],
"dialogs": [
{
"text": "添加发票选择当前报销人可绑定的可用发票,或上传新发票等待 OCR 完成后直接绑定。刷新列表发票 26112000000938423851-26112000000938423851北京悦海堂餐饮管理有限公司 · 2026-03-11 · 金额 ¥1683原始文件:北京悦海堂餐饮管理有限公司_发票金额1683.00元.pdf · 上传时间 2026-05-05 15:58:28绑定到明细(可选)不绑定具体明细机票 · R100 临时明细发票 26112000000938423851-26112000000938423851北京悦海堂餐饮管理有限公司 · 2026-03-11 · 金额 ¥1683原始文件:北京悦海堂餐饮管理有限公司_发票金额1683.00元.pdf · 上传时间 2026-05-05 15:55:32绑定到明细(可选)不绑定具体明细机票 · R100 临时明细发票 26112000000938423851-26112000000938423851北京悦海堂餐饮管理有限公司 · 2026-03-11 · 金额 ¥1683原始文件:北京悦海堂餐饮管理有限公司_发票金额1683.00元.pdf · 上传时间 2026-05-05 14:37:01绑定到明细(可选)不绑定具体明细机票 · R100 临时明细已选 0 张发票绑定选中发票或者上传新发票上传后会自动使用当前报销人的 owner 信息,并等待 OCR 识别完成。选择发票文件上传并等待 OCR",
"buttons": [
"刷新列表",
"绑定选中发票",
"上传并等待 OCR"
],
"selects": [
{
"value": "",
"selectedText": "不绑定具体明细",
"options": [
{
"value": "",
"text": "不绑定具体明细"
},
{
"value": "658be08d-3b30-4b20-b42f-0d277faab017",
"text": "机票 · R100 临时明细"
}
]
},
{
"value": "",
"selectedText": "不绑定具体明细",
"options": [
{
"value": "",
"text": "不绑定具体明细"
},
{
"value": "658be08d-3b30-4b20-b42f-0d277faab017",
"text": "机票 · R100 临时明细"
}
]
},
{
"value": "",
"selectedText": "不绑定具体明细",
"options": [
{
"value": "",
"text": "不绑定具体明细"
},
{
"value": "658be08d-3b30-4b20-b42f-0d277faab017",
"text": "机票 · R100 临时明细"
}
]
}
]
}
],
"tables": [
{
"headers": [
"费用类型",
"发生日期",
"金额",
"说明",
"操作"
],
"firstRow": [
"机票travel_airfare",
"2026-05-06",
"12.3",
"R100 临时明细",
"编辑删除"
],
"rowCount": 1
}
],
"longUuidLike": [
"aacf9d44-0b31-4ca1-a846-198ea55f6d84"
],
"flags": {
"hasWholeDelete": false,
"hasDetailDeleteOnly": false,
"hasRawReimbursementId": true,
"hasInvoiceOptionalBinding": true,
"hasVerboseDetailSubtitle": true,
"hasVerboseInvoiceCopy": true
}
}
],
"cleanup": {
"reimbursementId": "aacf9d44-0b31-4ca1-a846-198ea55f6d84",
"outcome": "deleted",
"unboundInvoiceCount": 0
},
"errors": []
}
@@ -1,198 +0,0 @@
# R104 公网部署与视觉验收报告
日期:2026-05-07
## 结论
R100-R103 最新变更已部署到公网 `https://oa.hyinda.com`,自动化验收通过。
已完成:
- 本地发布前门禁通过。
- 已创建发布 tag:`trialrun-20260507-01`。
- 已执行 `bash deploy/trialrun/deploy.sh` 部署到 `118.89.77.218:/opt/hyb-oa-trialrun`。
- 公网 `/ready` 通过。
- 远端 `smoke-external-deps.js` 通过,当前 OCR provider 为 `tencent`。
- 远端 `smoke-trialrun-runtime.js` 通过。
- 公网 live smoke 通过:管理员、员工只读 smoke 共 3 条通过。
- 公网视觉 Playwright 通过:桌面登录、企微 OAuth 边界、移动工作台、移动报销/请假、PC 报销/票据共 4 条通过。
- 公网真实腾讯 OCR 辅助复核通过:真实 PDF 发票上传后进入可处理状态。
仍需人工确认:
- 用真实手机企业微信从工作台打开 OA 应用,确认已绑定账号直接进入 `/mobile`。自动化已覆盖到 OAuth 跳转边界,但不能替代真实企业微信客户端内的最终点击。
## 本地发布前验证
已执行:
```bash
node deploy/trialrun/validate-env-contract.js
cd server && npm run prisma:validate
node scripts/qa/check-ui-design-rules.mjs
cd client && npm run typecheck
cd client && npm run build
cd client && npx playwright test tests/e2e/r102-reimbursement-main-flow.spec.ts tests/e2e/r103-cross-page-ui-consistency.spec.ts --reporter=list
```
结果:
- 部署环境契约:通过。
- Prisma schema:通过。
- UI 设计规则:`0 findings`。
- 前端 typecheck:通过。
- 前端 build:通过;仍有既有 Vite manual chunk circular warning,本批不处理。
- R102/R103 Playwright:`6 passed`。
## 公网部署
已执行:
```bash
git tag -a trialrun-20260507-01 -m "trialrun release 20260507-01"
bash deploy/trialrun/deploy.sh
```
部署结果:
- 远端目录:`/opt/hyb-oa-trialrun`
- 远端环境文件:`/opt/hyb-oa-trialrun/deploy/trialrun/.env`
- `.env` 未从本地同步,沿用远端事实源。
- 远端 server 容器已重建。
- 部署脚本内 `/ready`、external deps smoke 通过。
- 部署脚本本机缺少完整 `LIVE_SMOKE_*`,因此 live smoke 由后续步骤手动补跑。
## 公网配置核验
已执行:
```bash
curl -fsS https://oa.hyinda.com/ready
curl -fsS https://oa.hyinda.com/api/auth/wecom/config
curl -sSI 'https://oa.hyinda.com/api/auth/wecom/login?returnTo=%2Fmobile'
```
结果:
- `/ready`:通过。
- 企业微信配置:
- `status=ready`
- `entryEnabled=true`
- `oauthEnabled=true`
- `defaultReturnTo=/mobile`
- `loginUrl=/api/auth/wecom/login?returnTo=%2Fmobile`
- 企业微信登录入口:`HTTP 302` 到 `open.weixin.qq.com`,回调地址为 `https://oa.hyinda.com/api/auth/wecom/callback`,state 中 `returnTo=/mobile`。
远端关键配置只读核验:
- `WECOM_ENTRY_ENABLED=true`
- `WECOM_OAUTH_ENABLED=true`
- `OPENAPI_DOCS_ENABLED=false`
- `COOKIE_SECURE=true`
- `PUBLIC_SECURITY_HARDENING_ENABLED=true`
- `OCR_PROVIDER=tencent`
## 远端 smoke
已执行:
```bash
ssh [email protected] 'cd /opt/hyb-oa-trialrun && ... exec -T server node src/scripts/smoke-trialrun-runtime.js'
```
结果:
- Prisma 连接正常。
- 工作区 `profile=small_team_internal`。
- trialrun 必需功能开关均 enabled。
- 导航构建成功:`main=9 admin=7`。
- `trialrun runtime smoke` 通过。
## 公网 live smoke
操作:
- 仅重置独立 smoke 账号 `SMOKE001` / `SMOKE002` 随机密码。
- 密码仅作为临时环境变量传给 Playwright,未写入 git,未写入报告。
已执行:
```bash
LIVE_SMOKE_BASE_URL=https://oa.hyinda.com \
LIVE_EXPECT_WECOM_STATUS=ready \
LIVE_SMOKE_ADMIN_IDENTIFIER=[email protected] \
LIVE_SMOKE_EMPLOYEE_IDENTIFIER=[email protected] \
bash scripts/qa/run-web-gates.sh smoke-live
```
结果:
- 公网基础探活与企微配置状态:通过。
- 管理员只读网页 smoke:通过。
- 员工只读网页 smoke:通过。
- 总计:`3 passed`。
## 公网视觉自动化
新增测试:
```bash
client/tests/e2e/r104-public-visual-acceptance.spec.ts
```
已执行:
```bash
cd client
LIVE_SMOKE_BASE_URL=https://oa.hyinda.com \
LIVE_EXPECT_WECOM_STATUS=ready \
LIVE_SMOKE_ADMIN_IDENTIFIER=[email protected] \
LIVE_SMOKE_EMPLOYEE_IDENTIFIER=[email protected] \
E2E_MODE=live \
npx playwright test tests/e2e/r104-public-visual-acceptance.spec.ts --reporter=list
```
结果:`4 passed`。
覆盖:
- 公网桌面登录页与企业微信配置。
- 公网企业微信入口跳转到 OAuth 边界。
- 公网员工移动工作台、移动报销、移动请假。
- 公网 PC 报销与票据页面。
截图输出:
- `output/playwright/r104/desktop-login.png`
- `output/playwright/r104/mobile-login-before-wecom.png`
- `output/playwright/r104/mobile-home.png`
- `output/playwright/r104/mobile-reimbursements.png`
- `output/playwright/r104/mobile-leave.png`
- `output/playwright/r104/desktop-reimbursements.png`
- `output/playwright/r104/desktop-invoice-pool.png`
## 公网真实腾讯 OCR
远端 OCR provider 当前为 `tencent`,因此执行真实 PDF 发票辅助复核。
已执行:
```bash
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=https://oa.hyinda.com \
npx playwright test tests/e2e/manual/live-invoice-ocr.spec.ts --workers=1 --reporter=list
```
结果:
- `1 passed`
- 链路:真实 PDF 上传 -> 腾讯 OCR -> 进入可处理状态。
## 风险与后续
- 真实企业微信客户端内最终落点仍需人工确认。
- Vite manual chunk circular warning 仍存在,应单独开技术优化 Issue。
- 公网 live OCR 会在 smoke 账号下产生测试票据记录;后续如需要,可开清理或测试数据归档专项。
-171
查看文件
@@ -1,171 +0,0 @@
# R105 真实试运行前自动化收口报告
日期:2026-05-07
## 结论
R105 已完成真实试运行前 P0 自动化收口,并已部署到公网 `https://oa.hyinda.com`。
本轮完成:
- 创建 R105 Issue CSV 合同并校验通过。
- 新增只读 smoke 数据审计脚本。
- 新增 R105 公网视觉自动化,覆盖移动登录、移动首页、移动票据上传、移动审批、我的/更多、PC Portal、报销和票据中心。
- 新增 `scripts/qa/run-pretrial-readiness.sh`,串联 static、live smoke、visual、OCR 四类门禁。
- 加强 UI 文案规则,禁止 `先处理` 和 `清爽` 等口语化或内部评价文案。
- 修正残留文案:侧边栏、导航说明、项目逾期指标。
- 新增真实企业微信手机最终落点检查模板。
- 部署到公网并完成公网验收。
仍需人工确认:
- 用真实手机企业微信从工作台打开 OA 应用,确认已绑定账号直接进入 `/mobile`。操作模板见 `artifacts/r105-pretrial-readiness/wecom-mobile-final-check.md`。
## 提交与发布
- 合同提交:`d99cbf8 R105/A1 建立试运行前自动化收口合同`
- 实现提交:`86975dd R105/A2-A5 补强试运行自动化验收`
- 验收发布 tag:`trialrun-20260507-02`
- 最终同步 tag:`trialrun-20260507-04`
- 远端目录:`118.89.77.218:/opt/hyb-oa-trialrun`
## 本地验证
已执行:
```bash
python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-05-07_12-34-21-r105-pretrial-readiness-automation.csv
node --check server/src/scripts/audit-smoke-data.js
bash -n scripts/qa/run-pretrial-readiness.sh
cd server && npm run prisma:validate
node scripts/qa/check-ui-design-rules.mjs
cd client && npm run typecheck
cd client && npm run build
bash scripts/qa/run-pretrial-readiness.sh --static
```
结果:
- CSV 校验通过。
- Prisma schema 校验通过。
- UI 设计规则:`0 findings`。
- 前端 typecheck 通过。
- 前端 build 通过;仍有既有 Vite circular chunk warning,本批不处理。
- R105 static 门禁通过。
## 公网部署与配置
已执行:
```bash
git tag -a trialrun-20260507-02 -m "trialrun release 20260507-02"
bash deploy/trialrun/deploy.sh
curl -fsS https://oa.hyinda.com/ready
curl -fsS https://oa.hyinda.com/api/auth/wecom/config
```
结果:
- 公网 `/ready` 通过。
- 企业微信配置 `status=ready`。
- 企业微信默认入口仍为 `/api/auth/wecom/login?returnTo=%2Fmobile`。
- `defaultReturnTo=/mobile`。
- 远端 external deps smoke 通过。
- 远端 runtime smoke 通过。
- OCR provider 为 `tencent`。
R105 报告和 OCR 重复票据门禁收口后,又使用 `trialrun-20260507-04` 同步了一次最终仓库状态到远端目录。
## 公网 live smoke
操作:
- 临时重置独立 smoke 账号密码。
- 密码只保存在当前 shell,未打印、未写文件、未提交。
已执行:
```bash
bash scripts/qa/run-pretrial-readiness.sh --live-smoke
```
结果:
- 公网基础探活与企微配置状态:通过。
- 管理员只读网页 smoke:通过。
- 员工只读网页 smoke:通过。
- 总计:`3 passed`。
## R105 视觉自动化
已执行:
```bash
bash scripts/qa/run-pretrial-readiness.sh --visual
```
结果:`4 passed`。
覆盖:
- 公网登录与企业微信入口默认移动工作台。
- 员工移动首页、票据上传和我的页面。
- 管理员移动审批页。
- PC Portal、报销和票据中心。
截图输出:
- `output/playwright/r105/mobile-login-wecom-entry.png`
- `output/playwright/r105/employee-mobile-home.png`
- `output/playwright/r105/employee-mobile-capture.png`
- `output/playwright/r105/employee-mobile-me.png`
- `output/playwright/r105/admin-mobile-approvals.png`
- `output/playwright/r105/desktop-portal.png`
- `output/playwright/r105/desktop-reimbursements.png`
- `output/playwright/r105/desktop-invoice-pool.png`
## 真实 OCR 辅助复核
已执行:
```bash
PLAYWRIGHT_OCR_LIVE_FILE=/home/shunli/Projects/hyb-oa/artifacts/北京悦海堂餐饮管理有限公司_发票金额1683.00元.pdf \
bash scripts/qa/run-pretrial-readiness.sh --ocr
```
结果:`1 passed`。
说明:
- 本轮使用的是已多次用于 smoke 的同一张真实发票。
- 当前终态为清晰的重复票据风险,而不是 OCR 卡死或腾讯调用失败。
- R105 预试运行脚本显式允许 `duplicate` 作为可接受风险终态,避免反复上传同一 smoke 发票造成误报。
## smoke 数据审计
已执行:
```bash
ssh [email protected] 'cd /opt/hyb-oa-trialrun && ... npm run audit:smoke-data -- --format=text'
```
结果:
- smoke 员工账号:2 个,均 active。
- smoke 报销单:1。
- smoke 票据:5。
- OCR 关联结果:1。
- 票据状态:`available=2`,`ocr_failed=3`。
- 当前无 `pending_ocr` 卡住项。
结论:
- smoke 数据不会阻断试运行,但已经有明显测试足迹。
- 后续如要清理,应先备份并单独开 destructive cleanup Issue;本轮只做只读审计。
## 风险与后续
- 真实企业微信客户端最终落点仍需人工确认。
- smoke 账号已有测试票据、审计日志和 auth session 足迹;正式试运行前建议单独做一次 smoke 数据归档或清理。
- `npm ci` 构建阶段提示依赖漏洞,建议单独开安全依赖审计 Issue 评估,不在 R105 中顺手升级。
- Vite circular chunk warning 仍存在,建议在技术债专项中处理。
@@ -1,50 +0,0 @@
# R105 真实企业微信手机最终落点检查
日期:2026-05-07
## 目的
确认真实手机企业微信客户端中,已绑定 OA 账号的员工从工作台打开 OA 应用后,能直接进入移动工作台 `/mobile`。
Playwright 已能覆盖普通浏览器、移动视口、企业微信 OAuth 跳转边界和公网页面视觉,但不能完全替代真实企业微信客户端内的最终授权和 Cookie 行为。
## 操作步骤
1. 打开手机企业微信。
2. 进入当前企业的工作台。
3. 点击 OA 应用。
4. 等待页面完成跳转,不要用普通浏览器复制链接替代。
5. 观察最终页面地址和页面内容。
## 通过标准
- 最终进入 OA 移动工作台,地址应为 `/mobile` 或移动工作台内页。
- 不再要求输入 OA 账号密码。
- 底部显示移动导航:首页、审批、票据、我的。
- 页面没有出现 `AUTH_003`、`missing_user_id`、`当前企业微信尚未绑定`、反复登录等提示。
## 失败时记录
请记录以下信息,再交给开发排查:
- 北京时间:
- 手机系统:
- 企业微信版本:
- 当前页面截图:
- 页面显示的 `requestId`:
- 错误码和错误文案:
- 是否已在个人设置中绑定企业微信:
- 是否从企业微信工作台入口进入:
## 自动化边界
已自动化覆盖:
- `https://oa.hyinda.com/ready`
- `/api/auth/wecom/config`
- `/api/auth/wecom/login?returnTo=%2Fmobile` 跳转到企业微信 OAuth
- 公网移动登录页、移动首页、移动报销、移动请假、移动票据上传、移动审批和 PC 票据/报销页面视觉检查
仍需人工确认:
- 真实企业微信客户端完成 OAuth 后是否直接落到 `/mobile`
-245
查看文件
@@ -1,245 +0,0 @@
{
"generatedAt": "2026-05-07T12:03:41.249Z",
"checks": [
{
"label": "PC Portal",
"route": "/portal",
"mobile": false,
"screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r106/pc-portal.png",
"width": 1440,
"height": 960,
"scrollWidth": 1440,
"tableCount": 0,
"uuidCount": 0
},
{
"label": "PC 报销列表",
"route": "/reimbursements",
"mobile": false,
"screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r106/pc-reimbursements-list.png",
"width": 1440,
"height": 960,
"scrollWidth": 1440,
"tableCount": 1,
"uuidCount": 0
},
{
"label": "PC 报销详情",
"route": "/reimbursements/[uuid]",
"mobile": false,
"screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r106/pc-reimbursement-detail.png",
"width": 1440,
"height": 960,
"scrollWidth": 1440,
"tableCount": 1,
"uuidCount": 0
},
{
"label": "PC 报销详情",
"type": "button-compare",
"status": "same-layout",
"labelA": "明细编辑",
"labelB": "明细删除",
"data": {
"a": {
"text": "编辑",
"rect": {
"width": 64,
"height": 40,
"x": 805,
"y": 1060
},
"style": {
"backgroundColor": "rgba(255, 255, 255, 0.9)",
"color": "rgb(51, 65, 85)",
"border": "1px solid rgb(226, 232, 240)",
"borderRadius": "8px",
"fontSize": "12px",
"fontWeight": "500",
"padding": "0px 12px 0px 12px"
}
},
"b": {
"text": "删除",
"rect": {
"width": 64,
"height": 40,
"x": 877,
"y": 1060
},
"style": {
"backgroundColor": "rgba(255, 255, 255, 0.9)",
"color": "rgb(51, 65, 85)",
"border": "1px solid rgb(226, 232, 240)",
"borderRadius": "8px",
"fontSize": "12px",
"fontWeight": "500",
"padding": "0px 12px 0px 12px"
}
}
}
},
{
"label": "PC 报销详情",
"type": "button-compare",
"status": "same-layout",
"labelA": "返回列表",
"labelB": "删除草稿",
"data": {
"a": {
"text": "返回列表",
"rect": {
"width": 90,
"height": 44,
"x": 1176,
"y": 227
},
"style": {
"backgroundColor": "rgba(255, 255, 255, 0.9)",
"color": "rgb(51, 65, 85)",
"border": "1px solid rgb(226, 232, 240)",
"borderRadius": "12px",
"fontSize": "14px",
"fontWeight": "500",
"padding": "0px 16px 0px 16px"
}
},
"b": {
"text": "删除草稿",
"rect": {
"width": 88,
"height": 44,
"x": 1274,
"y": 227
},
"style": {
"backgroundColor": "rgb(220, 38, 38)",
"color": "rgb(255, 255, 255)",
"border": "0px solid rgb(229, 231, 235)",
"borderRadius": "12px",
"fontSize": "14px",
"fontWeight": "500",
"padding": "0px 16px 0px 16px"
}
}
}
},
{
"label": "PC 票据中心",
"route": "/invoice-pool",
"mobile": false,
"screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r106/pc-invoice-pool.png",
"width": 1440,
"height": 960,
"scrollWidth": 1440,
"tableCount": 1,
"uuidCount": 0
},
{
"label": "PC 请假",
"route": "/leave",
"mobile": false,
"screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r106/pc-leave.png",
"width": 1440,
"height": 960,
"scrollWidth": 1440,
"tableCount": 0,
"uuidCount": 0
},
{
"label": "PC 采购",
"route": "/purchase-requests",
"mobile": false,
"screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r106/pc-purchase.png",
"width": 1440,
"height": 960,
"scrollWidth": 1440,
"tableCount": 1,
"uuidCount": 0
},
{
"label": "PC 差旅",
"route": "/travel-requests",
"mobile": false,
"screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r106/pc-travel.png",
"width": 1440,
"height": 960,
"scrollWidth": 1440,
"tableCount": 0,
"uuidCount": 0
},
{
"label": "企微模拟-首页",
"route": "/mobile",
"mobile": true,
"screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r106/mobile-wecom-home.png",
"width": 390,
"height": 844,
"scrollWidth": 390,
"tableCount": 0,
"uuidCount": 0
},
{
"label": "企微模拟-报销",
"route": "/mobile/reimbursements",
"mobile": true,
"screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r106/mobile-wecom-reimbursements.png",
"width": 390,
"height": 844,
"scrollWidth": 390,
"tableCount": 0,
"uuidCount": 0
},
{
"label": "企微模拟-请假",
"route": "/mobile/leave",
"mobile": true,
"screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r106/mobile-wecom-leave.png",
"width": 390,
"height": 844,
"scrollWidth": 390,
"tableCount": 0,
"uuidCount": 0
},
{
"label": "企微模拟-票据上传",
"route": "/mobile/capture",
"mobile": true,
"screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r106/mobile-wecom-capture.png",
"width": 390,
"height": 844,
"scrollWidth": 390,
"tableCount": 0,
"uuidCount": 0
},
{
"label": "企微模拟-我的",
"route": "/mobile/me",
"mobile": true,
"screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r106/mobile-wecom-me.png",
"width": 390,
"height": 844,
"scrollWidth": 390,
"tableCount": 0,
"uuidCount": 0
},
{
"label": "企微模拟-审批",
"route": "/mobile/approvals",
"mobile": true,
"screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r106/mobile-wecom-approvals-admin.png",
"width": 390,
"height": 844,
"scrollWidth": 390,
"tableCount": 0,
"uuidCount": 0
}
],
"findings": [],
"seedData": {
"reimbursementId": "[redacted-local-id]",
"reimbursementItemId": "[redacted-local-id]",
"invoicePoolId": "[redacted-local-id]",
"invoiceUploadStatus": "pending_ocr"
}
}
-18
查看文件
@@ -1,18 +0,0 @@
# R106 自动视觉巡检报告
生成时间:2026-05-07T12:03:41.249Z
## 结论
- 巡检记录数:15
- 发现问题数:0
- 截图目录:/home/shunli/Projects/hyb-oa/output/playwright/r106
## 发现的问题
- 未发现规则命中的视觉/文案/展示问题。
## 按钮对比
- PC 报销详情:明细编辑 vs 明细删除 => same-layout
- PC 报销详情:返回列表 vs 删除草稿 => same-layout
@@ -1,86 +0,0 @@
{
"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": []
}
@@ -1,24 +0,0 @@
# 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
@@ -1,57 +0,0 @@
# 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`。
- 手机系统文件/相机选择器是否能正常返回文件给网页。
-25
查看文件
@@ -1,25 +0,0 @@
# R69 业务验收报告
日期:2026-04-26
## 结论
R69 自动化业务验收已通过。当前无阻断级自动化缺陷,可进入 10 人以下小团队的人工试运行验收。
本轮修复聚焦两类问题:
- 会话刷新并发:前端 refresh 增加 single-flight 与短窗口成功回放,避免同页并发刷新重复消耗旋转 refresh token。
- E2E 与页面稳态:校准 R68 UI 后的断言,修复移动审批 WebKit 在线态误判,修复资产新建表单被旧详情回写污染的问题,并规避并发 E2E 的日期/详情定位冲突。
## 验证结果
- `cd client && npm run typecheck`:通过。
- `cd client && npm run build`:通过;保留既有 chunk 循环与大 chunk 警告。
- `QA_DB_CLIENT=docker QA_DOCKER_USE_SG=1 bash scripts/qa/run-web-gates.sh full-local`:通过。
- `full-local` 覆盖结果:Prisma migrate/validate 通过,server 单测 98 files / 429 tests 通过,workflow-actions 通过,regression-all 默认范围通过,Playwright full E2E 34 passed / 3 skipped。
## 风险与下一步
- 未修改后端 workflow、权限模型、状态机、审批规则或 Prisma 迁移,因此未触发额外 reviewer 阶段。
- `client build` 仍提示既有 manual chunk 循环和 `page-system` 大 chunk,建议 R70 独立处理构建分包。
- R70 建议进入人工业务试运行:让员工、经理、管理员各按真实日常路径试用 1-2 天,记录非阻断体验问题与流程缺口。
-1
查看文件
@@ -1 +0,0 @@
"ID","Role","Severity","Module","Title","Steps","Expected","Actual","Screenshot","Owner","Disposition","Status","Notes"
1 ID Role Severity Module Title Steps Expected Actual Screenshot Owner Disposition Status Notes
@@ -1,15 +0,0 @@
# R70 深层自动辅助试运行报告
生成时间:2026-04-28T13:59:08.610Z
## 结论
深层自动辅助试运行未发现阻断步骤;仍需人工判断整体体验是否顺手。
## 步骤结果
| Step | Status | Screenshot | Detail |
| --- | --- | --- | --- |
| 周报保存-生成待办-提交-完成闭环 | PASS | deploy/trialrun/screenshots/r70-auto-trialrun-deep/01-周报保存-生成待办-提交-完成闭环.png | weekStart=2027-03-26; token=Playwright 深层联动 1777384727632 |
| 公告-团队状态-Portal 汇总联动 | PASS | deploy/trialrun/screenshots/r70-auto-trialrun-deep/02-公告-团队状态-Portal-汇总联动.png | Playwright 深层公告 1777384727632 |
| 真实全局搜索命中公告并跳转 | PASS | deploy/trialrun/screenshots/r70-auto-trialrun-deep/03-真实全局搜索命中公告并跳转.png | Playwright 深层公告 1777384727632 |
-27
查看文件
@@ -1,27 +0,0 @@
# R70 自动辅助试运行报告
生成时间:2026-04-28T13:29:23.192Z
## 结论
自动辅助试运行未发现阻断步骤。仍需人工判断流程是否顺手、文案是否清晰。
## 步骤结果
| Role | Step | Status | Screenshot | Detail |
| --- | --- | --- | --- | --- |
| employee | Portal 首页 | PASS | deploy/trialrun/screenshots/r70-auto-trialrun/01-employee-Portal-首页.png | ok |
| employee | 请假提交并生成经理待办 | PASS | deploy/trialrun/screenshots/r70-auto-trialrun/02-employee-请假提交并生成经理待办.png | leaveRequestId=e574b9ce-4162-4afd-9f3e-acf15f70f439; taskId=235228bd-59fd-454b-ba5c-c5fd1e69c5d8 |
| employee | 报销入口 | PASS | deploy/trialrun/screenshots/r70-auto-trialrun/03-employee-报销入口.png | ok |
| employee | 周报与待办入口 | PASS | deploy/trialrun/screenshots/r70-auto-trialrun/04-employee-周报与待办入口.png | ok |
| employee | 公告与全局搜索 | PASS | deploy/trialrun/screenshots/r70-auto-trialrun/05-employee-公告与全局搜索.png | ok |
| employee | 移动首页 | PASS | deploy/trialrun/screenshots/r70-auto-trialrun/06-employee-移动首页.png | ok |
| manager | 待我处理与快捷审批入口 | PASS | deploy/trialrun/screenshots/r70-auto-trialrun/07-manager-待我处理与快捷审批入口.png | ok |
| manager | 团队状态与项目工作台 | PASS | deploy/trialrun/screenshots/r70-auto-trialrun/08-manager-团队状态与项目工作台.png | ok |
| admin | 管理入口与人员组织 | PASS | deploy/trialrun/screenshots/r70-auto-trialrun/09-admin-管理入口与人员组织.png | ok |
| admin | 系统设置、功能开关、审计日志 | PASS | deploy/trialrun/screenshots/r70-auto-trialrun/10-admin-系统设置-功能开关-审计日志.png | ok |
## 说明
- 截图输出在 `deploy/trialrun/screenshots/r70-auto-trialrun/`,该目录被 `.gitignore` 忽略。
- 本报告只证明自动路径可执行,不替代真实用户对体验、文案和流程合理性的判断。
-3
查看文件
@@ -1,3 +0,0 @@
"ID","Role","Severity","Module","Title","Steps","Expected","Actual","Screenshot","Owner","Disposition","Status","Notes"
"R70-001","manager","P1","leave / team calendar","经理可见团队日历入口但进入后 PERM_001","1) [email protected] 登录 2) 打开 /leave-requests 3) 点击“团队日历”页签","经理可查看团队成员请假日历,用于审批和排班判断","入口可见,但内容区显示 PERM_001: 当前账号无权限执行该操作。","N/A","backend","fixed in R71","CLOSED","2026-04-28 R71:server manager 角色补齐 leave.view_all,reviewer 确认未扩大为 leave.manage;Playwright 复测显示团队日历正常加载 2026-04-27 ~ 2026-05-03 窗口数据,员工 2026-04-29 年假可见。"
"R70-002","employee","P2","reimbursements","报销提交前未提示必须绑定发票,提交失败只显示 VALID_001","1) [email protected] 登录 2) 打开 /reimbursements 并新建“空白报销” 3) 新增金额 12.34 的报销明细 4) 点击“提交报销”","提交前明确提示需先绑定发票,或失败时显示缺少发票的具体原因","页面仅提示 VALID_001: 参数校验失败;后端实际返回 details.invoices=bound_invoice_required。","N/A","frontend","fixed in R71","CLOSED","2026-04-28 R71:前端已补提交前提示与 bound_invoice_required 中文映射;人工复测使用 /home/shunli/Projects/hyb-oa/artifacts/北京悦海堂餐饮管理有限公司_发票金额1683.00元.pdf 完成上传 -> 绑定 -> 提交,报销单 4931211b-34b4-43b8-9e9f-917569d47c33 已进入 reviewing(BX-20260428-0001)。"
1 ID Role Severity Module Title Steps Expected Actual Screenshot Owner Disposition Status Notes
2 R70-001 manager P1 leave / team calendar 经理可见团队日历入口但进入后 PERM_001 1) [email protected] 登录 2) 打开 /leave-requests 3) 点击“团队日历”页签 经理可查看团队成员请假日历,用于审批和排班判断 入口可见,但内容区显示 PERM_001: 当前账号无权限执行该操作。 N/A backend fixed in R71 CLOSED 2026-04-28 R71:server manager 角色补齐 leave.view_all,reviewer 确认未扩大为 leave.manage;Playwright 复测显示团队日历正常加载 2026-04-27 ~ 2026-05-03 窗口数据,员工 2026-04-29 年假可见。
3 R70-002 employee P2 reimbursements 报销提交前未提示必须绑定发票,提交失败只显示 VALID_001 1) [email protected] 登录 2) 打开 /reimbursements 并新建“空白报销” 3) 新增金额 12.34 的报销明细 4) 点击“提交报销” 提交前明确提示需先绑定发票,或失败时显示缺少发票的具体原因 页面仅提示 VALID_001: 参数校验失败;后端实际返回 details.invoices=bound_invoice_required。 N/A frontend fixed in R71 CLOSED 2026-04-28 R71:前端已补提交前提示与 bound_invoice_required 中文映射;人工复测使用 /home/shunli/Projects/hyb-oa/artifacts/北京悦海堂餐饮管理有限公司_发票金额1683.00元.pdf 完成上传 -> 绑定 -> 提交,报销单 4931211b-34b4-43b8-9e9f-917569d47c33 已进入 reviewing(BX-20260428-0001)。
-20
查看文件
@@ -1,20 +0,0 @@
# R70 批量 live OCR 辅助复核报告
生成时间:2026-04-29T01:53:35.081Z
## 结果
- 总文件数:1
- 成功:1
- 失败:0
## 明细
| 文件 | 状态 | 耗时(ms) | 票据ID | 发票代码 | 发票号码 | 销售方 | 开票日期 | 备注 |
| --- | --- | ---: | --- | --- | --- | --- | --- | --- |
| 北京悦海堂餐饮管理有限公司_发票金额1683.00元.pdf | available | 602 | fb29cdd8-0c10-4254-8feb-d3c3c1be86c3 | 26112000000938423851 | 26112000000938423851 | 北京悦海堂餐饮管理有限公司 | 2026-03-11 | ok |
## 说明
- 本报告用于真实腾讯 OCR 的本地辅助复核,不进入常规本地回归。
- 如某张票失败,会继续处理后续文件,并在本报告统一汇总。
-284
查看文件
@@ -1,284 +0,0 @@
# R70 人工业务试运行清单
日期:2026-04-28
## 目标
用 10 人以下科技公司的真实日常路径验证系统是否可试运行。R70 不追求覆盖所有功能,重点发现阻断真实使用的问题。
## 执行原则
- 每个角色试用 30-60 分钟。
- 发现问题先记录,不现场扩展需求。
- P0/P1 才中断并进入立即修复判断。
- 涉及 workflow、权限、状态机、审批规则、迁移的问题必须单独 review。
- 截图放在本地即可,不提交到仓库;问题记录写入 `artifacts/r70/issue-log.csv`。
## 严重级别
- P0:无法登录、系统不可用、核心数据丢失、权限泄露。
- P1:核心业务无法完成,例如请假/报销/审批/关键管理入口阻断。
- P2:业务可绕过但明显影响效率或理解,例如入口难找、文案误导、状态不清。
- P3:轻微体验问题,例如间距、提示、非关键排序。
## 环境记录
- 环境 URL:`http://192.168.123.7:3000`
- 执行日期:`2026-04-28`
- 浏览器:`Firefox (Playwright CLI)`
- 数据库/分支:`hyb_oa_manual_trialrun_20260428172231 / 2bce9c9`
- 执行人:`Codex Playwright 辅助复核`
## R79 公网部署态辅助复核(2026-05-04)
当前已核实部署基线:
- 公网地址:`https://oa.hyinda.com`
- 服务器:`118.89.77.218`
- 反向代理:`caddy`
- SSH:常规 `deploy`,系统配置 `root`
- 部署目录:`/opt/hyb-oa-trialrun`
- 远端容器命令:`docker-compose`
Codex 可代做:
1. SSH 登录服务器做只读巡检。
2. 执行 `deploy/trialrun/deploy.sh`、`/ready`、`smoke-external-deps.js`、`smoke-trialrun-runtime.js`。
3. 查看 `Caddyfile`、容器状态、日志、feature flag 与工作区配置。
4. 在你提供账号后执行 `smoke-live` 和 Playwright 公网只读复核。
必须人工配合:
1. 企业微信后台配置工作台入口与 OAuth 回调。
2. 提供独立 smoke 账号凭据,不使用真实业务账号。
3. 若需要真实企微绑定、手机扫码、二次验证,必须由你本人完成。
最小人工操作清单:
1. 企微后台配置:
- 工作台入口 URL:`https://oa.hyinda.com/api/auth/wecom/login?returnTo=%2Fmobile`
- OAuth 回调 URL:`https://oa.hyinda.com/api/auth/wecom/callback`
2. 确认至少两组公网只读 smoke 账号可用:
- `smoke-admin`
- `smoke-employee`
3. 若公网运行时 smoke 继续提示公告或搜索缺失,用管理员账号进入“功能开关”页,核对:
- `portal_home_v1`
- `announcements_v1`
- `global_search_v1`
- `wecom_entry_v1`
4. 若你让我继续代跑公网 smoke,只需要把账号标识和密码给我;我会继续完成自动化部分。
## R80 企微公网启用回填(2026-05-04)
- 企业微信域名校验文件已可访问:
- `https://oa.hyinda.com/WW_verify_StBYfdlboMaIoRRE.txt`
- 公网企微入口运行时已启用:
- 远端 `.env`:`WECOM_ENABLED=true`、`WECOM_ENTRY_ENABLED=true`、`WECOM_OAUTH_ENABLED=true`
- 数据库 `feature_flags`:`wecom_entry_v1=inherit`
- 自动化核验已完成:
- `GET https://oa.hyinda.com/api/auth/wecom/config` 返回 `status=ready`
- `GET https://oa.hyinda.com/api/auth/wecom/login?returnTo=%2Fmobile` 返回 `302`,并跳转到 `open.weixin.qq.com`
- Playwright 公网登录页快照已确认出现“使用企业微信进入工作台”按钮
- Playwright 点击后,桌面浏览器落到企微提示页“请在企业微信客户端打开链接”,符合预期
- 截图:`output/playwright/2026-05-04-wecom-login-page.png`
你现在必须人工完成的动作:
1. 用手机企业微信或桌面企业微信打开该应用,不要用普通浏览器代替。
2. 若首次进入后回到 OA 登录页并带 `wecom=unbound`:
- 用已有 OA 账号密码登录
- 进入“个人设置”
- 执行企微绑定
- 绑定成功后,再次从企业微信工作台进入 OA
3. 首次人工闭环时,建议只用 1 个员工测试账号,不要直接用高权限真实业务账号。
4. 若你完成首次绑定后要我继续代跑公网 smoke,再把该 smoke 账号标识告诉我,我继续补 Playwright / curl 只读核验。
## R81 企微回调身份取证(2026-05-04)
- 当前线上已追加最小安全诊断:
- 企微回调若缺少 `UserId`,server 会记录:
- `requestId`
- `mode`
- `hasUserId`
- `hasOpenId`
- `hasDeviceId`
- 不记录 token、secret、完整敏感回包。
- 当前服务器复核结果:
- `https://oa.hyinda.com/ready`:正常
- `https://oa.hyinda.com/api/auth/wecom/config`:`status=ready`
- `https://oa.hyinda.com/api/auth/wecom/login?returnTo=%2Fmobile`:返回 `302` 到企微 OAuth
你现在需要做的人工操作:
1. 在手机企业微信里进入工作台,打开 OA 应用一次。
2. 如果仍然失败,不要反复点,先停在错误页。
3. 记录以下任一信息发给我:
- 页面里的 `requestId`
- 错误截图
- 大致时间点(精确到分钟)
4. 如果页面重新跳回登录页,也把最终 URL 或截图发给我。
我收到后会立刻去服务器抓对应日志,判断腾讯这次回包到底是:
- 有 `OpenId` 但没有 `UserId`
- 还是两个字段都没有
- 还是另外一种接口异常
## R83-R86 用户开通与首次绑定收口(2026-05-04)
- 本轮新增自动化覆盖:
- `client/tests/e2e/user-onboarding.spec.ts`
- 管理员在“系统用户管理”中创建用户时,不再手填工号和初始密码。
- 创建成功后,页面展示系统生成的员工号与一次性口令。
- 新用户首次登录后,被强制跳转到“修改密码”页,改密成功再进入 Portal。
- `client/tests/e2e/wecom-first-bind.spec.ts`
- 企业微信未绑定场景回退到密码登录页后,用户仍可继续进入目标页。
- 当前代码口径:
- 单个新建用户:系统自动生成员工号,管理员只维护基础资料与角色。
- 首次登录:使用一次性口令登录,必须先改密。
- 企微首次绑定:服务端已支持“未绑定回退登录后自动补绑定”的闭环,不再要求用户必须手动去“个人设置”补绑定。
- 仍需人工完成的最小动作:
1. 把本轮代码部署到目标环境。
2. 用真实手机企业微信打开 OA 应用一次,确认真实 OAuth 回调、cookie 与企业身份都正常。
3. 若仍失败,记录 `requestId`、错误截图和时间点给我,我继续抓线上日志定位。
## R89 登录与移动端 UX 自动复核(2026-05-05)
- 本轮目标:把登录页从说明型入口收敛为操作型入口,并修复手机端菜单/导航不可用的问题。
- 本地验证地址:`http://127.0.0.1:5173`
- 自动化覆盖:
- 企业微信移动 UA 打开 `/login` 时,首屏只突出“进入工作台”,并生成 `returnTo=/mobile` 的企微 OAuth URL。
- iPhone 视口密码登录后默认进入 `/mobile`,并完成:首页今日重点 -> 移动审批 -> 票据上传 -> 我的/更多入口。
- Pixel 视口进入非 `/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`
- `cd client && npm run typecheck`
- `cd client && npm run build`
- 当前结论:R89 移动端自动化关键路径已通过;仍需真实手机企业微信在公网应用中复核一次真实 OAuth、cookie 与移动工作台落点。
## 员工路径
账号:员工测试账号。
1. 登录并进入 Portal。
2. 查看今日动作、常用入口、公告和通知。
3. 新建请假草稿,提交或撤回一次。
4. 新建报销草稿,确认空白报销入口可理解。
5. 写一份周报并生成待办,完成待办。
6. 使用全局搜索查找一个业务对象。
7. 打开移动入口,确认移动审批/移动工作台入口可理解。
8. 将问题写入 `artifacts/r70/issue-log.csv`。
验收关注:
- 是否知道下一步该点哪里。
- 表单必填项和错误提示是否清楚。
- 提交后状态是否能理解。
- 移动端是否能完成最小查看/处理。
## 经理路径
账号:经理测试账号。
1. 登录并确认 Portal 是管理视角。
2. 进入待我处理,完成一条快捷审批或详情审批。
3. 查看请假团队日历,判断团队成员可用性。
4. 查看团队状态和通知。
5. 进入项目工作台,确认项目协同信息是否可理解。
6. 将问题写入 `artifacts/r70/issue-log.csv`。
验收关注:
- 审批入口是否明显。
- 快捷审批和详情审批是否有足够上下文。
- 团队日历是否能支持实际排班/请假判断。
- 审批后状态是否及时刷新。
## 管理员路径
账号:管理员测试账号。
1. 登录并确认管理入口可见。
2. 检查人员管理、组织架构入口。
3. 检查系统设置和功能开关文案。
4. 查询审计日志,确认关键操作可追踪。
5. 用普通员工视角对比,确认不应出现的管理入口不可见。
6. 将问题写入 `artifacts/r70/issue-log.csv`。
验收关注:
- 管理入口是否按小团队常用频率排序。
- 配置项是否会误导非技术管理员。
- 权限边界是否符合预期。
- 审计日志是否足以追踪关键操作。
## 结束条件
- 员工、经理、管理员三类路径都完成。
- 所有发现的问题已记录严重级别。
- P0/P1 已明确是否暂停试运行。
- `artifacts/r70/manual-trialrun-report.md` 已回填结论。
## R71 定向复测回填
- 复测时间:`2026-04-28 19:08 - 19:11 CST`
- manager:`/leave-requests` 的“团队日历”页签打开成功,显示 `2026-04-27 ~ 2026-05-03` 窗口内本部门请假数据,通过。
- employee:无发票时,报销详情页在提交按钮附近即时提示“提交前需先绑定至少 1 张发票,可在‘关联票据’区域添加。”,通过。
- employee:上传 `/home/shunli/Projects/hyb-oa/artifacts/北京悦海堂餐饮管理有限公司_发票金额1683.00元.pdf` -> 绑定 -> 再次提交后,报销单 `4931211b-34b4-43b8-9e9f-917569d47c33` 进入 `reviewing`,编号 `BX-20260428-0001`,通过。
- 结论:R70 初始两条问题已闭环,可恢复下一轮本地人工试运行。
## R73 自动化覆盖回填
- 自动化环境:`http://127.0.0.1:3001`
- 自动化数据库:`hyb_oa_manual_trialrun_20260428172231`
- 执行时间:`2026-04-28 20:49 - 21:08 CST`
- 已自动化覆盖:
- `client/tests/e2e/reimbursement-workflow-progress.spec.ts`
- 报销提交后详情页展示当前审批进度。
- `client/tests/e2e/invoice-ocr-flow.spec.ts`
- 报销详情:上传发票 -> OCR 完成 -> 自动进入可绑定候选 -> 绑定 -> 提交报销。
- 票据中心:OCR 缺关键字段 -> 当前页提示原因 -> 补齐字段 -> 标记 available。
- 显式开关的辅助自动化:
- `client/tests/e2e/manual/live-invoice-ocr.spec.ts`
- 用途:接入真实腾讯 OCR + 真实 VAT 发票时做本地辅助复核,不进入常规本地回归。
- 启动示例:`PLAYWRIGHT_MANUAL=1 PLAYWRIGHT_OCR_LIVE=1 PLAYWRIGHT_OCR_LIVE_FILE=/home/shunli/Projects/hyb-oa/artifacts/北京悦海堂餐饮管理有限公司_发票金额1683.00元.pdf npm run test:e2e -- tests/e2e/manual/live-invoice-ocr.spec.ts`
- 仍需人工体验判断:
- Portal 信息架构是否易懂。
- 审批上下文是否足够。
- 移动入口与管理员入口的认知负担。
- 真实腾讯 OCR 在不同票样下的识别质量与耗时体感。
## R73 本地环境基线回填
- 2026-04-28 本地辅助复核中,`client/tests/e2e/manual/r70-trialrun-assist.spec.ts` 首次出现 5 个失败步骤;复盘确认根因是本地运行时 env 未开启试运行所需模块,不是当前业务链路回归。
- 本地试运行前,server 运行时至少应开启:
- `PORTAL_HOME_ENABLED=true`
- `GLOBAL_SEARCH_ENABLED=true`
- `ANNOUNCEMENTS_ENABLED=true`
- `PRESENCE_BOARD_ENABLED=true`
- `ATTENDANCE_ENABLED=true`
- `WEEKLY_REPORT_ENABLED=true`
- `EMPLOYEE_LIFECYCLE_ENABLED=true`
- `TODO_BOARD_ENABLED=true`
- `PROJECT_DOMAIN_ENABLED=true`
- `PROJECT_LINKING_ENABLED=true`
- `PROJECT_COMMUNICATION_LOG_ENABLED=true`
- `PROJECT_CLOSURE_CHECKLIST_ENABLED=true`
- 当前 trialrun 数据库内的 `feature_flags` 与 `workspace_settings` 已具备小团队试运行配置;若页面仍显示模块缺失,优先检查 server 进程的运行时 env,而不是先怀疑数据库种子。
- 本地 HTTP 辅助复核不要强制 `COOKIE_SECURE=true`,否则 `127.0.0.1` / `192.168.123.7` 下登录态会失效;该项只在 HTTPS 试运行部署时开启。
- 真实腾讯 OCR 已用运行时注入方式接入旧项目本地配置完成验证;不要把腾讯密钥写回仓库内 `.env`。
- 本地先跑门禁:
- `cd server && TRIALRUN_RUNTIME_MODE=local node src/scripts/smoke-trialrun-runtime.js`
- 深层真实业务辅助回归:
- `cd client && PLAYWRIGHT_MANUAL=1 R70_TRIALRUN_DEEP_ASSIST=1 E2E_BASE_URL=http://127.0.0.1:3001 npm run test:e2e -- tests/e2e/manual/r70-trialrun-deep-assist.spec.ts`
- 批量真实腾讯 OCR 辅助回归:
- `cd client && PLAYWRIGHT_MANUAL=1 PLAYWRIGHT_OCR_LIVE=1 PLAYWRIGHT_OCR_LIVE_BATCH=1 PLAYWRIGHT_OCR_LIVE_DIR=<目录> E2E_BASE_URL=http://127.0.0.1:3001 npm run test:e2e -- tests/e2e/manual/live-invoice-ocr-batch.spec.ts`
## R77 OCR 收口回填
- 2026-04-29 已在 `http://127.0.0.1:3001` 上用真实 PDF 发票完成单张与 batch Playwright 复测,两个用例均正常通过并退出。
- 推荐本地 live OCR 复测顺序:
- 先跑 `cd server && TRIALRUN_RUNTIME_MODE=local node src/scripts/smoke-trialrun-runtime.js`
- 再跑单张:`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`
- 最后跑 batch:`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`
- 默认策略继续保持 `PDF first`,仅当后续遇到新的真实票样兼容性问题时,再评估是否补 PDF 转图片 fallback。
@@ -1,25 +0,0 @@
{
"generatedAt": "2026-05-05T15:21:58.712Z",
"route": "/portal",
"viewport": "mobile390",
"results": [
{
"check": "topbar mobile menu opens and closes",
"ok": true,
"durationMs": 1301,
"screenshot": "output/playwright/r93-interaction-audit/mobile390-portal-menu-open.png"
},
{
"check": "topbar mobile search opens and closes",
"ok": true,
"durationMs": 782,
"screenshot": "output/playwright/r93-interaction-audit/mobile390-portal-search-open.png"
},
{
"check": "topbar notifications opens and closes",
"ok": true,
"durationMs": 681,
"screenshot": "output/playwright/r93-interaction-audit/mobile390-portal-notifications-open.png"
}
]
}
@@ -1,46 +0,0 @@
{
"generatedAt": "2026-05-05T15:33:14.069Z",
"baseURL": "https://oa.hyinda.com",
"role": "employee",
"loginStatus": 200,
"me": {
"status": 200,
"id": "26de456c-8522-4b6a-86a0-e87c156bbe93",
"name": "Employee",
"roleCodes": [
"employee"
],
"permissionCount": null
},
"invoicePool": {
"status": 200,
"total": 1,
"pageItems": 1,
"byStatus": {
"available": 1
},
"byProvider": {
"tencent": 1
},
"pendingOrFailedSamples": []
},
"draftReimbursements": {
"status": 200,
"total": 0,
"pageItems": 0,
"samples": []
},
"contractsRegistryDependency": {
"endpoint": "/api/employees?page=1&pageSize=100&status=active",
"status": 403,
"error": {
"code": "PERM_001",
"message": "无权限",
"details": {}
}
},
"mobileCaptureHtml": {
"status": 404,
"note": "HTML shell only; real multiple attribute verified by browser audit DOM metrics."
}
}
文件差异内容过多而无法显示 加载差异
-85
查看文件
@@ -1,85 +0,0 @@
# R93 主区域深度视觉审计报告
生成日期:2026-05-05
## 范围
- 环境:`https://oa.hyinda.com`
- 员工视角路由:27 个
- 视口:mobile360、mobile390、desktop1440
- 页面结果:84
- 发现项:19
- 补充数据探针:`artifacts/r93/live-data-probe-2026-05-05.json`
- 修复复测:`artifacts/r93/remediation-report.md`
- 部署后视觉复测:`artifacts/r93/post-deploy-visual-check-2026-05-05.json`
- 原始 JSON:`artifacts/r93/main-region-audit-2026-05-05.json`
- 问题 CSV:`artifacts/r93/main-region-issue-log.csv`
- 截图目录:`output/playwright/r93-main-region-audit/`
## 自动化检查项
- 主区域横向溢出与可见表格
- 首屏可交互控件是否跑出手机视口
- 移动端触控目标尺寸
- 主区域文本裁切
- 票据中心/报销列表移动卡片 test id 是否在公网可见
- 移动票据上传是否支持多文件选择
- 票据池与草稿报销只读 API 状态探针
说明:主区域审计 JSON 内的逐页 `api` 字段由浏览器原生 `fetch` 采集,未复用前端运行态 Bearer token,出现 401 时不作为业务接口失败证据。已用 `live-data-probe-2026-05-05.json` 重新执行带 token 的只读探针。
## 汇总
| 类型 | 数量 |
| --- | ---: |
| MOBILE_VISIBLE_TABLE_MAIN | 8 |
| SMALL_TOUCH_TARGET_CLUSTER | 4 |
| API_403_IN_PAGE | 3 |
| OFFSCREEN_INTERACTIVE_MAIN | 2 |
| SOURCE_LIVE_PARITY_INVOICE_MOBILE | 1 |
| SOURCE_LIVE_PARITY_REIMBURSEMENT_MOBILE | 1 |
补充人工归类:
| 类型 | 数量 |
| --- | ---: |
| SOURCE_LIVE_PARITY_MOBILE_CAPTURE_MULTIPLE | 1 |
## 高优先级样本
- VA-D001 /assets mobile360+mobile390 MOBILE_VISIBLE_TABLE_MAIN:主区域首屏仍可见 1 个表格。
- VA-D002 /contracts-registry mobile360+mobile390+desktop1440 API_403_IN_PAGE:页面可进入但存在 API 403 请求。
- VA-D003 /invoice-pool mobile360+mobile390 MOBILE_VISIBLE_TABLE_MAIN:主区域首屏仍可见 1 个表格。
- VA-D004 /invoice-pool mobile360+mobile390 OFFSCREEN_INTERACTIVE_MAIN:主区域可交互控件跑出视口:more_horiz {"left":779,"top":641,"right":807,"bottom":674,"width":28,"height":33}。
- VA-D006 /notifications mobile360+mobile390 MOBILE_VISIBLE_TABLE_MAIN:主区域首屏仍可见 1 个表格。
- VA-D008 /purchase-requests mobile360+mobile390 MOBILE_VISIBLE_TABLE_MAIN:主区域首屏仍可见 1 个表格。
- VA-D009 /invoice-pool mobile390 SOURCE_LIVE_PARITY_INVOICE_MOBILE:源码已有 invoice-pool-mobile-list,但公网 mobile390 可见数=0,table 可见数=1。
- VA-D010 /reimbursements mobile390 SOURCE_LIVE_PARITY_REIMBURSEMENT_MOBILE:源码已有 reimbursements-mobile-list,但公网 mobile390 可见数=0,table 可见数=1。
- VA-D011 /mobile/capture mobile390 SOURCE_LIVE_PARITY_MOBILE_CAPTURE_MULTIPLE:源码文件选择器已支持 multiple,但公网 DOM 中 multiple=false,解释了“手机端一次只能选一张”的现象。
## 数据探针结论
- 票据池:`/api/invoice-pool?page=1&pageSize=20&ownerScope=own` 返回 200;当前共 1 张票据,状态为 `available`,OCR provider 为 `tencent`,没有 `pending_ocr` 或 `ocr_failed` 样本。
- 草稿报销:`/api/reimbursements?status=draft&page=1&pageSize=20&scope=own` 返回 200;当前员工账号草稿数为 0,因此本轮无法用真实草稿复现“再次编辑”链路。
- 合同台账依赖:`/api/employees?page=1&pageSize=100&status=active` 返回 403,确认不是截图误报,而是员工视角页面内请求了无权限接口。
- 移动上传:本地源码的 `mobile-capture-file` 已有 `multiple`,公网 DOM 缺失 `multiple`,优先按部署/缓存不一致处理;若确认是企业微信内置浏览器限制,则需要改成“连续添加到待上传队列”的交互。
## 关键结论
1. 公网页面的移动端问题在 360px 下更明显,应把 360px 纳入后续视觉回归门槛。
2. 票据中心和报销列表源码中已经存在移动卡片 test id,但公网 mobile390 仍可能显示桌面表格,优先怀疑部署产物或缓存,而不是先重写组件。
3. 移动票据上传源码已支持 `multiple`,但公网 DOM 没有 `multiple`,这是明确的源码/公网差异。
4. 合同台账员工视角仍有 API 403 噪声,应纳入权限一致性专项。
## 修复状态
2026-05-05 已重新构建并重启公网 server 镜像,以下问题已由部署一致性修复:
- `/invoice-pool` mobile390:移动列表可见,桌面表格不可见,无出屏操作按钮。
- `/reimbursements` mobile390:移动列表可见,桌面表格不可见。
- `/mobile/capture` mobile390:文件 input 的 `multiple=true`。
保留后续专项:
- R94:资产、通知、采购等移动端表格清零。
- R95:合同台账员工视角 API 403 与多角色权限一致性。
-12
查看文件
@@ -1,12 +0,0 @@
ID,Severity,Page,Viewport,Category,Symptom,Evidence,Recommendation,Status
VA-D001,HIGH,/assets,mobile360+mobile390,MOBILE_VISIBLE_TABLE_MAIN,主区域首屏仍可见 1 个表格。,/home/shunli/Projects/hyb-oa/output/playwright/r93-main-region-audit/mobile360-assets.png,移动端改为卡片或分组列表,桌面表格仅在 md 以上显示。,TODO
VA-D002,HIGH,/contracts-registry,mobile360+mobile390+desktop1440,API_403_IN_PAGE,页面可进入但存在 API 403 请求。,/home/shunli/Projects/hyb-oa/output/playwright/r93-main-region-audit/mobile360-contracts-registry.png,统一导航权限、路由权限与页面内 API 权限,避免员工看到空白/半错误页面。,TODO
VA-D003,HIGH,/invoice-pool,mobile360+mobile390,MOBILE_VISIBLE_TABLE_MAIN,主区域首屏仍可见 1 个表格。,/home/shunli/Projects/hyb-oa/output/playwright/r93-main-region-audit/mobile360-invoice-pool.png,移动端改为卡片或分组列表,桌面表格仅在 md 以上显示。,DONE
VA-D004,HIGH,/invoice-pool,mobile360+mobile390,OFFSCREEN_INTERACTIVE_MAIN,"主区域可交互控件跑出视口:more_horiz {""left"":779,""top"":641,""right"":807,""bottom"":674,""width"":28,""height"":33}。",/home/shunli/Projects/hyb-oa/output/playwright/r93-main-region-audit/mobile360-invoice-pool.png,移动端操作入口必须在 360/390px 内可见,必要时改为卡片底部按钮或底部操作栏。,DONE
VA-D005,MEDIUM,/invoice-pool,mobile360+mobile390,SMALL_TOUCH_TARGET_CLUSTER,首屏存在 4 个小触控目标。,/home/shunli/Projects/hyb-oa/output/playwright/r93-main-region-audit/mobile360-invoice-pool.png,移动端按钮、图标按钮、复选框外层点击区域统一不低于 40-44px。,TODO
VA-D006,HIGH,/notifications,mobile360+mobile390,MOBILE_VISIBLE_TABLE_MAIN,主区域首屏仍可见 1 个表格。,/home/shunli/Projects/hyb-oa/output/playwright/r93-main-region-audit/mobile360-notifications.png,移动端改为卡片或分组列表,桌面表格仅在 md 以上显示。,TODO
VA-D007,MEDIUM,/notifications,mobile360+mobile390,SMALL_TOUCH_TARGET_CLUSTER,首屏存在 3 个小触控目标。,/home/shunli/Projects/hyb-oa/output/playwright/r93-main-region-audit/mobile360-notifications.png,移动端按钮、图标按钮、复选框外层点击区域统一不低于 40-44px。,TODO
VA-D008,HIGH,/purchase-requests,mobile360+mobile390,MOBILE_VISIBLE_TABLE_MAIN,主区域首屏仍可见 1 个表格。,/home/shunli/Projects/hyb-oa/output/playwright/r93-main-region-audit/mobile360-purchase-requests.png,移动端改为卡片或分组列表,桌面表格仅在 md 以上显示。,TODO
VA-D009,HIGH,/invoice-pool,mobile390,SOURCE_LIVE_PARITY_INVOICE_MOBILE,源码已有 invoice-pool-mobile-list,但公网 mobile390 可见数=0,table 可见数=1。,/home/shunli/Projects/hyb-oa/output/playwright/r93-main-region-audit/mobile390-invoice-pool.png,优先排查公网构建版本、缓存/Caddy 静态文件、Tailwind 产物是否未部署最新。,DONE
VA-D010,HIGH,/reimbursements,mobile390,SOURCE_LIVE_PARITY_REIMBURSEMENT_MOBILE,源码已有 reimbursements-mobile-list,但公网 mobile390 可见数=0,table 可见数=1。,/home/shunli/Projects/hyb-oa/output/playwright/r93-main-region-audit/mobile390-reimbursements.png,排查部署版本或 CSS 断点产物;草稿再次编辑能力应通过移动卡片的“继续编辑”入口暴露。,DONE
VA-D011,HIGH,/mobile/capture,mobile390,SOURCE_LIVE_PARITY_MOBILE_CAPTURE_MULTIPLE,源码已有 mobile-capture-file multiple,但公网 DOM 中 multiple=false,符合用户反馈的一次只能选择一张票据。,/home/shunli/Projects/hyb-oa/output/playwright/r93-main-region-audit/mobile390-mobile-capture.png;artifacts/r93/live-data-probe-2026-05-05.json,优先排查部署版本/Caddy 静态文件缓存;若确认是企业微信内置浏览器限制多选,则改为连续添加到待上传队列并明确提示。,DONE
1 ID Severity Page Viewport Category Symptom Evidence Recommendation Status
2 VA-D001 HIGH /assets mobile360+mobile390 MOBILE_VISIBLE_TABLE_MAIN 主区域首屏仍可见 1 个表格。 /home/shunli/Projects/hyb-oa/output/playwright/r93-main-region-audit/mobile360-assets.png 移动端改为卡片或分组列表,桌面表格仅在 md 以上显示。 TODO
3 VA-D002 HIGH /contracts-registry mobile360+mobile390+desktop1440 API_403_IN_PAGE 页面可进入但存在 API 403 请求。 /home/shunli/Projects/hyb-oa/output/playwright/r93-main-region-audit/mobile360-contracts-registry.png 统一导航权限、路由权限与页面内 API 权限,避免员工看到空白/半错误页面。 TODO
4 VA-D003 HIGH /invoice-pool mobile360+mobile390 MOBILE_VISIBLE_TABLE_MAIN 主区域首屏仍可见 1 个表格。 /home/shunli/Projects/hyb-oa/output/playwright/r93-main-region-audit/mobile360-invoice-pool.png 移动端改为卡片或分组列表,桌面表格仅在 md 以上显示。 DONE
5 VA-D004 HIGH /invoice-pool mobile360+mobile390 OFFSCREEN_INTERACTIVE_MAIN 主区域可交互控件跑出视口:more_horiz {"left":779,"top":641,"right":807,"bottom":674,"width":28,"height":33}。 /home/shunli/Projects/hyb-oa/output/playwright/r93-main-region-audit/mobile360-invoice-pool.png 移动端操作入口必须在 360/390px 内可见,必要时改为卡片底部按钮或底部操作栏。 DONE
6 VA-D005 MEDIUM /invoice-pool mobile360+mobile390 SMALL_TOUCH_TARGET_CLUSTER 首屏存在 4 个小触控目标。 /home/shunli/Projects/hyb-oa/output/playwright/r93-main-region-audit/mobile360-invoice-pool.png 移动端按钮、图标按钮、复选框外层点击区域统一不低于 40-44px。 TODO
7 VA-D006 HIGH /notifications mobile360+mobile390 MOBILE_VISIBLE_TABLE_MAIN 主区域首屏仍可见 1 个表格。 /home/shunli/Projects/hyb-oa/output/playwright/r93-main-region-audit/mobile360-notifications.png 移动端改为卡片或分组列表,桌面表格仅在 md 以上显示。 TODO
8 VA-D007 MEDIUM /notifications mobile360+mobile390 SMALL_TOUCH_TARGET_CLUSTER 首屏存在 3 个小触控目标。 /home/shunli/Projects/hyb-oa/output/playwright/r93-main-region-audit/mobile360-notifications.png 移动端按钮、图标按钮、复选框外层点击区域统一不低于 40-44px。 TODO
9 VA-D008 HIGH /purchase-requests mobile360+mobile390 MOBILE_VISIBLE_TABLE_MAIN 主区域首屏仍可见 1 个表格。 /home/shunli/Projects/hyb-oa/output/playwright/r93-main-region-audit/mobile360-purchase-requests.png 移动端改为卡片或分组列表,桌面表格仅在 md 以上显示。 TODO
10 VA-D009 HIGH /invoice-pool mobile390 SOURCE_LIVE_PARITY_INVOICE_MOBILE 源码已有 invoice-pool-mobile-list,但公网 mobile390 可见数=0,table 可见数=1。 /home/shunli/Projects/hyb-oa/output/playwright/r93-main-region-audit/mobile390-invoice-pool.png 优先排查公网构建版本、缓存/Caddy 静态文件、Tailwind 产物是否未部署最新。 DONE
11 VA-D010 HIGH /reimbursements mobile390 SOURCE_LIVE_PARITY_REIMBURSEMENT_MOBILE 源码已有 reimbursements-mobile-list,但公网 mobile390 可见数=0,table 可见数=1。 /home/shunli/Projects/hyb-oa/output/playwright/r93-main-region-audit/mobile390-reimbursements.png 排查部署版本或 CSS 断点产物;草稿再次编辑能力应通过移动卡片的“继续编辑”入口暴露。 DONE
12 VA-D011 HIGH /mobile/capture mobile390 SOURCE_LIVE_PARITY_MOBILE_CAPTURE_MULTIPLE 源码已有 mobile-capture-file multiple,但公网 DOM 中 multiple=false,符合用户反馈的一次只能选择一张票据。 /home/shunli/Projects/hyb-oa/output/playwright/r93-main-region-audit/mobile390-mobile-capture.png;artifacts/r93/live-data-probe-2026-05-05.json 优先排查部署版本/Caddy 静态文件缓存;若确认是企业微信内置浏览器限制多选,则改为连续添加到待上传队列并明确提示。 DONE
@@ -1,20 +0,0 @@
{
"generatedAt": "2026-05-05T15:52:41.944Z",
"baseURL": "https://oa.hyinda.com",
"invoicePool": {
"status": 200,
"total": 1,
"byStatus": {
"available": 1
},
"byProvider": {
"tencent": 1
},
"pendingOrFailedSamples": []
},
"draftReimbursements": {
"status": 200,
"total": 0,
"samples": []
}
}
@@ -1,71 +0,0 @@
{
"generatedAt": "2026-05-05T15:52:08.207Z",
"baseURL": "https://oa.hyinda.com",
"viewport": "mobile390",
"results": [
{
"route": "/invoice-pool",
"screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r93-post-deploy/mobile390-invoice-pool.png",
"metrics": {
"path": "/invoice-pool",
"width": 390,
"tableVisible": false,
"visibleTableCount": 0,
"invoiceMobileListVisible": true,
"invoiceMobileRows": 1,
"reimbursementMobileListVisible": false,
"reimbursementMobileCards": 0,
"mobileCaptureFileExists": false,
"mobileCaptureMultiple": null,
"offscreenButtons": [],
"bodyOverflowX": 0
}
},
{
"route": "/reimbursements",
"screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r93-post-deploy/mobile390-reimbursements.png",
"metrics": {
"path": "/reimbursements",
"width": 390,
"tableVisible": false,
"visibleTableCount": 0,
"invoiceMobileListVisible": false,
"invoiceMobileRows": 0,
"reimbursementMobileListVisible": true,
"reimbursementMobileCards": 0,
"mobileCaptureFileExists": false,
"mobileCaptureMultiple": null,
"offscreenButtons": [],
"bodyOverflowX": 0
}
},
{
"route": "/mobile/capture",
"screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r93-post-deploy/mobile390-mobile-capture.png",
"metrics": {
"path": "/mobile/capture",
"width": 390,
"tableVisible": false,
"visibleTableCount": 0,
"invoiceMobileListVisible": false,
"invoiceMobileRows": 0,
"reimbursementMobileListVisible": false,
"reimbursementMobileCards": 0,
"mobileCaptureFileExists": true,
"mobileCaptureMultiple": true,
"offscreenButtons": [],
"bodyOverflowX": 0
}
}
],
"invoiceProbe": null,
"consoleErrors": [
"Failed to load resource: the server responded with a status of 401 ()"
],
"httpErrors": [
{
"status": 401,
"url": "https://oa.hyinda.com/api/auth/refresh"
}
]
}
-33
查看文件
@@ -1,33 +0,0 @@
# R93 修复与复测报告
生成日期:2026-05-05
## 已处理
1. 公网前端部署一致性
- 根因:远端源码已更新,但运行中的 Docker 镜像仍使用旧 `/app/client/dist`。
- 处理:在 `118.89.77.218` 重新构建并重启 `hyb-oa-trialrun-server`。
- 远端 smoke:`smoke-external-deps.js` 通过,`smoke-trialrun-runtime.js` 通过。
2. 手机端票据/报销/上传公网表现
- 复测文件:`artifacts/r93/post-deploy-visual-check-2026-05-05.json`
- `/invoice-pool` mobile390:`tableVisible=false`,`invoiceMobileListVisible=true`,`offscreenButtons=[]`
- `/reimbursements` mobile390:`tableVisible=false`,`reimbursementMobileListVisible=true`,`offscreenButtons=[]`
- `/mobile/capture` mobile390:`mobileCaptureMultiple=true`,`offscreenButtons=[]`
3. live OCR 自动化假失败
- 根因:helper 使用 `not.toBe("pending_ocr")`,在详情文本短暂为空或未稳定时可能提前返回。
- 处理:改为显式等待 `available | ocr_failed` 终态;断言使用 helper 返回的终态字段。
- 复测:真实腾讯 OCR 用例通过。
## 当前数据
- 数据探针:`artifacts/r93/post-deploy-data-probe-2026-05-05.json`
- 票据池:公网员工账号当前可读,OCR provider 为 `tencent`,票据状态为 `available`,没有 `pending_ocr` 或 `ocr_failed` 样本。
- 草稿报销:公网员工账号当前草稿数为 0,不能用真实草稿继续复现“再次编辑”链路;移动列表入口已恢复可见。
## 保留问题
- `/assets`、`/notifications`、`/purchase-requests` 等页面仍有移动端表格专项,建议进入 R94。
- `/contracts-registry` 员工视角仍请求 `/api/employees` 并返回 403,建议进入 R95 权限一致性专项。
- `cd client && npx playwright test tests/e2e/r92-mobile-invoice-usability.spec.ts ...` 本轮未作为通过门禁,原因是该用例默认依赖本地 `127.0.0.1:3000`,当前本地未启动服务;公网视觉复测已覆盖本次部署问题。
-16
查看文件
@@ -1,16 +0,0 @@
ID,Severity,Page,Viewport,Category,Symptom,Evidence,Recommendation,Status
VA-001,HIGH,/invoice-pool,mobile390,mobile-table-overflow,"手机票据中心仍显示桌面表格,发票号码列和操作列被裁切,more_horiz 操作按钮跑到 390px 视口外。","output/playwright/r93-visual-audit-session/mobile390-invoice-pool.png;JSON: table=1, offscreen button right=807","优先修复为移动端卡片列表,隐藏桌面 table;详情字段改为分行 label/value,并加入视觉回归断言。",TODO
VA-002,HIGH,/reimbursements,mobile390,mobile-table-layout,"手机报销列表仍显示表格结构,空列表时尚可阅读,但有数据时很容易出现操作列不可达;与此前草稿可编辑诉求相关。","output/playwright/r93-visual-audit-session/mobile390-reimbursements.png;JSON: visibleTableCount=1","确认生产构建是否包含 R92 移动卡片改动;若组件已写卡片但公网仍显示表格,优先检查部署版本或 className 透传;否则补移动卡片。",TODO
VA-003,HIGH,/team,mobile390,mobile-table-layout,"团队列表在手机端以表格展示,部门/状态列被挤压为窄竖排,成员信息扫描效率差。","output/playwright/r93-visual-audit-session/mobile390-team.png;JSON: visibleTableCount=1","改为成员卡片:姓名、部门、今日状态、备注纵向展示;保留筛选按钮。",TODO
VA-004,HIGH,/leave-requests,mobile390,mobile-table-layout,"请假记录区域在手机端仍是表格,列名被拆成竖排;当前无记录时影响较小,有记录后会明显难读。","output/playwright/r93-visual-audit-session/mobile390-leave-requests.png;JSON: visibleTableCount=1","请假记录改为卡片式列表,展示假种、时间、天数、状态、操作。",TODO
VA-005,HIGH,/assets,mobile390,mobile-table-layout,"资产分类和资产列表两个区域在手机端仍有表格,列头拥挤;复选框触控目标也偏小。","output/playwright/r93-visual-audit-session/mobile390-assets.png;JSON: visibleTableCount=2, small checkbox 16x16","资产分类/资产卡片改成移动卡片或折叠列表;复选框外层增加可点区域。",TODO
VA-006,HIGH,/purchase-requests,mobile390,mobile-table-layout,"采购单列表在手机端仍显示表格;当前无数据时可接受,但后续有单据后操作列可能不可达。","output/playwright/r93-visual-audit-session/mobile390-purchase-requests.png;JSON: visibleTableCount=1","采购列表改为移动卡片;菜单按钮保持至少 44px 宽度。",TODO
VA-007,HIGH,/todos,mobile390,mobile-table-layout,"待办页手机端仍可见表格。","output/playwright/r93-visual-audit-session/mobile390-todos.png;JSON: visibleTableCount=1","待办列表改为任务卡片,优先展示标题、优先级、截止日期、状态和完成动作。",TODO
VA-008,HIGH,/notifications,mobile390,mobile-table-layout,"通知页手机端仍显示表格,标题/时间/状态/操作列拥挤。","output/playwright/r93-visual-audit-session/mobile390-notifications.png;JSON: visibleTableCount=1","通知改为消息卡片,按未读/类型筛选;操作放在卡片底部。",TODO
VA-009,HIGH,/attendance,mobile390,mobile-table-layout,"考勤页手机端仍可见表格且存在出屏交互风险。","output/playwright/r93-visual-audit-session/mobile390-attendance.png;JSON: visibleTableCount=1","考勤记录改为日期卡片或月历式摘要;管理员补录入口保持桌面优先。",TODO
VA-010,HIGH,/contracts-registry,mobile390+desktop1440,permission-noise,"合同台账页面可进入,但控制台出现 403 resource 错误;用户看不到明确错误,但自动化记录为 JS_ERROR。","output/playwright/r93-visual-audit-session/mobile390-contracts-registry.png;JSON: console error 403 x2","核对合同台账页面与 API 权限:若员工可进入页面,应避免后台请求未授权接口;若不应进入,应在导航和路由层统一隐藏/403。",TODO
VA-011,MEDIUM,multiple,mobile390,topbar-breadcrumb,"手机顶栏显示原始路径并被截断,例如 /invoice...、/purchase...,占用首屏且对国内用户不友好。","output/playwright/r93-visual-audit-session/mobile390-invoice-pool.png;output/playwright/r93-visual-audit-session/mobile390-purchase-requests.png","手机端顶栏改为中文页面名或隐藏路径,只保留返回/菜单、搜索、通知和用户入口。",TODO
VA-012,MEDIUM,/travel-requests,mobile390,heavy-mobile-form,"差旅页虽然没有表格溢出,但手机端表单很长,字段密集,一次创建差旅申请负担较重。","output/playwright/r93-visual-audit-session/mobile390-travel-requests.png","拆分为步骤式表单:基础信息、行程段、预算/成本中心;底部固定保存按钮。",TODO
VA-013,LOW,multiple,mobile390,touch-target,"若干移动页存在 16-28px 的小触控目标,包含复选框、短文本链接和图标菜单。","artifacts/r93/visual-audit-session-2026-05-05.json;SMALL_TOUCH_TARGET=14","统一移动端 touch target 最小 40-44px;复选框/短链增加外层点击区域。",TODO
VA-014,INFO,multiple,desktop1440,audit-false-positive,"桌面端 CLIPPED_TEXT 大多来自固定左侧导航滚动容器,初步判断为脚本误报,不作为优先缺陷。","artifacts/r93/visual-audit-session-2026-05-05.json;desktop CLIPPED_TEXT 多指向主导航容器","后续视觉脚本排除固定侧栏容器,聚焦 main 区域,减少噪声。",TODO
VA-015,INFO,multiple,role-coverage,coverage-gap,"本轮使用 [email protected],只覆盖员工视角;审批、财务、管理员页面存在权限边界,不能代表全角色视觉质量。","artifacts/r93/visual-audit-session-2026-05-05.json;EXPECTED_FORBIDDEN=12","后续补 manager、finance、admin 三类账号的会话复用视觉巡检,并按角色输出独立问题清单。",TODO
1 ID Severity Page Viewport Category Symptom Evidence Recommendation Status
2 VA-001 HIGH /invoice-pool mobile390 mobile-table-overflow 手机票据中心仍显示桌面表格,发票号码列和操作列被裁切,more_horiz 操作按钮跑到 390px 视口外。 output/playwright/r93-visual-audit-session/mobile390-invoice-pool.png;JSON: table=1, offscreen button right=807 优先修复为移动端卡片列表,隐藏桌面 table;详情字段改为分行 label/value,并加入视觉回归断言。 TODO
3 VA-002 HIGH /reimbursements mobile390 mobile-table-layout 手机报销列表仍显示表格结构,空列表时尚可阅读,但有数据时很容易出现操作列不可达;与此前草稿可编辑诉求相关。 output/playwright/r93-visual-audit-session/mobile390-reimbursements.png;JSON: visibleTableCount=1 确认生产构建是否包含 R92 移动卡片改动;若组件已写卡片但公网仍显示表格,优先检查部署版本或 className 透传;否则补移动卡片。 TODO
4 VA-003 HIGH /team mobile390 mobile-table-layout 团队列表在手机端以表格展示,部门/状态列被挤压为窄竖排,成员信息扫描效率差。 output/playwright/r93-visual-audit-session/mobile390-team.png;JSON: visibleTableCount=1 改为成员卡片:姓名、部门、今日状态、备注纵向展示;保留筛选按钮。 TODO
5 VA-004 HIGH /leave-requests mobile390 mobile-table-layout 请假记录区域在手机端仍是表格,列名被拆成竖排;当前无记录时影响较小,有记录后会明显难读。 output/playwright/r93-visual-audit-session/mobile390-leave-requests.png;JSON: visibleTableCount=1 请假记录改为卡片式列表,展示假种、时间、天数、状态、操作。 TODO
6 VA-005 HIGH /assets mobile390 mobile-table-layout 资产分类和资产列表两个区域在手机端仍有表格,列头拥挤;复选框触控目标也偏小。 output/playwright/r93-visual-audit-session/mobile390-assets.png;JSON: visibleTableCount=2, small checkbox 16x16 资产分类/资产卡片改成移动卡片或折叠列表;复选框外层增加可点区域。 TODO
7 VA-006 HIGH /purchase-requests mobile390 mobile-table-layout 采购单列表在手机端仍显示表格;当前无数据时可接受,但后续有单据后操作列可能不可达。 output/playwright/r93-visual-audit-session/mobile390-purchase-requests.png;JSON: visibleTableCount=1 采购列表改为移动卡片;菜单按钮保持至少 44px 宽度。 TODO
8 VA-007 HIGH /todos mobile390 mobile-table-layout 待办页手机端仍可见表格。 output/playwright/r93-visual-audit-session/mobile390-todos.png;JSON: visibleTableCount=1 待办列表改为任务卡片,优先展示标题、优先级、截止日期、状态和完成动作。 TODO
9 VA-008 HIGH /notifications mobile390 mobile-table-layout 通知页手机端仍显示表格,标题/时间/状态/操作列拥挤。 output/playwright/r93-visual-audit-session/mobile390-notifications.png;JSON: visibleTableCount=1 通知改为消息卡片,按未读/类型筛选;操作放在卡片底部。 TODO
10 VA-009 HIGH /attendance mobile390 mobile-table-layout 考勤页手机端仍可见表格且存在出屏交互风险。 output/playwright/r93-visual-audit-session/mobile390-attendance.png;JSON: visibleTableCount=1 考勤记录改为日期卡片或月历式摘要;管理员补录入口保持桌面优先。 TODO
11 VA-010 HIGH /contracts-registry mobile390+desktop1440 permission-noise 合同台账页面可进入,但控制台出现 403 resource 错误;用户看不到明确错误,但自动化记录为 JS_ERROR。 output/playwright/r93-visual-audit-session/mobile390-contracts-registry.png;JSON: console error 403 x2 核对合同台账页面与 API 权限:若员工可进入页面,应避免后台请求未授权接口;若不应进入,应在导航和路由层统一隐藏/403。 TODO
12 VA-011 MEDIUM multiple mobile390 topbar-breadcrumb 手机顶栏显示原始路径并被截断,例如 /invoice...、/purchase...,占用首屏且对国内用户不友好。 output/playwright/r93-visual-audit-session/mobile390-invoice-pool.png;output/playwright/r93-visual-audit-session/mobile390-purchase-requests.png 手机端顶栏改为中文页面名或隐藏路径,只保留返回/菜单、搜索、通知和用户入口。 TODO
13 VA-012 MEDIUM /travel-requests mobile390 heavy-mobile-form 差旅页虽然没有表格溢出,但手机端表单很长,字段密集,一次创建差旅申请负担较重。 output/playwright/r93-visual-audit-session/mobile390-travel-requests.png 拆分为步骤式表单:基础信息、行程段、预算/成本中心;底部固定保存按钮。 TODO
14 VA-013 LOW multiple mobile390 touch-target 若干移动页存在 16-28px 的小触控目标,包含复选框、短文本链接和图标菜单。 artifacts/r93/visual-audit-session-2026-05-05.json;SMALL_TOUCH_TARGET=14 统一移动端 touch target 最小 40-44px;复选框/短链增加外层点击区域。 TODO
15 VA-014 INFO multiple desktop1440 audit-false-positive 桌面端 CLIPPED_TEXT 大多来自固定左侧导航滚动容器,初步判断为脚本误报,不作为优先缺陷。 artifacts/r93/visual-audit-session-2026-05-05.json;desktop CLIPPED_TEXT 多指向主导航容器 后续视觉脚本排除固定侧栏容器,聚焦 main 区域,减少噪声。 TODO
16 VA-015 INFO multiple role-coverage coverage-gap 本轮使用 [email protected],只覆盖员工视角;审批、财务、管理员页面存在权限边界,不能代表全角色视觉质量。 artifacts/r93/visual-audit-session-2026-05-05.json;EXPECTED_FORBIDDEN=12 后续补 manager、finance、admin 三类账号的会话复用视觉巡检,并按角色输出独立问题清单。 TODO
-104
查看文件
@@ -1,104 +0,0 @@
# R93 公网页面视觉自动化巡检报告
生成日期:2026-05-05
## 范围
- 环境:`https://oa.hyinda.com`
- 账号:`[email protected]`
- 路由:27 个员工视角可达或可探测路由
- 视口:
- `mobile390`: 390 x 844
- `desktop1440`: 1440 x 900
- 原始结果:`artifacts/r93/visual-audit-session-2026-05-05.json`
- 顶栏交互结果:`artifacts/r93/interaction-audit-2026-05-05.json`
- 截图目录:`output/playwright/r93-visual-audit-session/`
- 顶栏交互截图:`output/playwright/r93-interaction-audit/`
- 问题清单:`artifacts/r93/visual-audit-issue-log.csv`
## 方法
本轮使用 Playwright 真实浏览器自动化,采用“每个视口登录一次、复用同一会话逐页巡检”的方式,避免频繁登录造成公网会话噪声。
每个页面记录:
- 页面截图
- 最终 URL
- JS `pageerror` / console error
- HTTP 5xx 与异常请求失败
- 横向溢出
- 手机端可见 `table`
- 跑出视口的可交互控件
- 过小触控目标
- 文本裁切
## 汇总
- 路由数:27
- 视口数:2
- 页面结果数:54
- 自动化发现数:66
自动化分类:
| 类型 | 数量 | 说明 |
| --- | ---: | --- |
| `MOBILE_VISIBLE_TABLE` | 9 | 手机端仍显示表格 |
| `OFFSCREEN_INTERACTIVE` | 1 | 可交互控件跑出视口 |
| `JS_ERROR` | 2 | 控制台资源 403 |
| `REQUEST_FAILED` | 1 | 请求被中断,需结合页面行为复核 |
| `CLIPPED_TEXT` | 27 | 大部分为顶栏路径或桌面侧栏误报 |
| `SMALL_TOUCH_TARGET` | 14 | 小触控目标 |
| `EXPECTED_FORBIDDEN` | 12 | 员工账号无权限,记录为覆盖边界 |
## 高优先级问题
1. 票据中心手机端仍显示桌面表格,操作按钮跑出 390px 视口。
- 证据:`output/playwright/r93-visual-audit-session/mobile390-invoice-pool.png`
- 指标:`visibleTableCount=1`,`offscreen button right=807`
- 建议:优先进入 R93 修复,改为移动卡片并加入视觉断言。
2. 报销、团队、请假、资产、采购、待办、通知、考勤等页面在手机端仍可见表格。
- 证据:对应 `mobile390-*.png`
- 建议:按使用频率分批卡片化。10 人以下公司优先处理报销、票据、请假、团队、待办。
3. 合同台账页面出现 403 资源错误。
- 证据:`output/playwright/r93-visual-audit-session/mobile390-contracts-registry.png`
- 指标:console error 403 x2
- 建议:核对页面权限与 API 权限是否一致。若员工可进入页面,后台请求不应打未授权接口;若不应进入,导航和路由应统一隐藏或 403。
## 中低优先级问题
1. 手机顶栏显示原始路径并被截断。
- 例如 `/invoice...`、`/purchase...`
- 建议:手机端显示中文页面名,或隐藏路径。
2. 差旅申请手机表单过长。
- 当前没有明显溢出,但一次性表单负担较重。
- 建议:后续拆成步骤式表单。
3. 多处小触控目标。
- 主要是复选框、短文本链接、图标菜单。
- 建议:移动端统一 40-44px 最小可点击区域。
## 覆盖限制
本轮只使用员工账号。经理、财务、管理员页面需要后续单独跑角色视角视觉巡检,否则审批、付款、系统设置等页面只能视为未充分覆盖。
## 交互抽查
补充对手机顶栏核心入口做了点击验证:
| 检查项 | 结果 | 证据 |
| --- | --- | --- |
| 打开/关闭侧边菜单 | 通过 | `output/playwright/r93-interaction-audit/mobile390-portal-menu-open.png` |
| 打开/关闭全局搜索 | 通过 | `output/playwright/r93-interaction-audit/mobile390-portal-search-open.png` |
| 打开/关闭通知下拉 | 通过 | `output/playwright/r93-interaction-audit/mobile390-portal-notifications-open.png` |
结论:当前手机端主要问题不是顶栏入口无法点击,而是进入业务页面后,内容区仍有大量桌面表格和字段挤压。
## 后续建议
1. R93 先修 `票据中心 + live OCR 自动化假失败 + runbook`。
2. R94 做“移动端表格清零专项”,优先级:报销、请假、团队、待办、通知、采购、资产、考勤。
3. R95 做多角色视觉巡检与权限一致性检查,至少覆盖 manager、finance、admin。
文件差异内容过多而无法显示 加载差异
@@ -1,14 +0,0 @@
{
"generatedAt": "2026-05-05T16:27:58.735Z",
"baseURL": "https://oa.hyinda.com",
"route": "/contracts-registry",
"viewport": "desktop1440",
"screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r94-post-fix/desktop1440-contracts-registry.png",
"httpErrors": [],
"consoleErrors": [],
"api403": [],
"metrics": {
"finalUrl": "https://oa.hyinda.com/contracts-registry",
"textSample": "备用模块合同台账你好,Employeesearch搜索searchEmployee合同台账维护合同元数据、生命周期、到期预警与导出,不在 OA 存放涉密正文附件。导出 CSV导出 Excel返回项目到期预警0份合同将在 30 天内到期展开到期列表新建合同台账补齐合同类型、金额、签署/生效/到期日期,续约将自动创建新的草稿合同。合同编号合同类型采购合同销售合同服务合同框架协议其他状态activedraftarchived关联项目未关联相对方摘要合同金额币种签署日期生效日期到期日"
}
}
@@ -1,233 +0,0 @@
{
"generatedAt": "2026-05-05T16:27:25.218Z",
"baseURL": "https://oa.hyinda.com",
"loginFailure": null,
"tablePages": [],
"api403": [],
"offscreenPages": [],
"results": [
{
"route": "/assets",
"viewport": "mobile360",
"screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r94-post-fix/mobile360-assets.png",
"httpErrors": [],
"consoleErrors": [],
"metrics": {
"path": "/assets",
"finalUrl": "https://oa.hyinda.com/assets",
"viewportWidth": 360,
"visibleTableCount": 0,
"visibleTables": [],
"offscreenInteractives": [],
"tinyInteractives": [
{
"tag": "button",
"text": "",
"left": 16,
"top": 36,
"right": 43,
"bottom": 80,
"width": 27,
"height": 44
},
{
"tag": "input",
"text": "",
"left": 41,
"top": 660,
"right": 57,
"bottom": 676,
"width": 16,
"height": 16
}
],
"mainTextSample": "主导航资产你好,Employeesearch搜索searchEmployee资产台账维护资产分类与资产卡片,支持法体、成本中心和采购来源引用。移动扫码查找资产分类分类编码分类名称单据分类使用系统默认固定资产卡片 (ASSET_CARD_DEFAULT)启用分类暂无资产分类编码名称状态全部状态库存中使用中维修中已退役已归档全部分类全部法体试运行法体全部成本中心全部归属人暂无资产卡片资产分类状态归属人暂无资产卡片请先从列表选择资产卡片,或点击“新建资产卡片”。"
}
},
{
"route": "/notifications",
"viewport": "mobile360",
"screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r94-post-fix/mobile360-notifications.png",
"httpErrors": [],
"consoleErrors": [],
"metrics": {
"path": "/notifications",
"finalUrl": "https://oa.hyinda.com/notifications",
"viewportWidth": 360,
"visibleTableCount": 0,
"visibleTables": [],
"offscreenInteractives": [],
"tinyInteractives": [
{
"tag": "button",
"text": "",
"left": 16,
"top": 36,
"right": 40,
"bottom": 80,
"width": 24,
"height": 44
}
],
"mainTextSample": "工作台/notifications你好,Employeesearch搜索searchEmployee通知站内通知与待办提醒。全部标为已读返回仪表盘全部未读类型全部审批待办报销请假采购差旅资产盘点未读 0 条暂无通知标题时间状态操作暂无通知第 1 / 1 页上一页下一页"
}
},
{
"route": "/purchase-requests",
"viewport": "mobile360",
"screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r94-post-fix/mobile360-purchase-requests.png",
"httpErrors": [],
"consoleErrors": [],
"metrics": {
"path": "/purchase-requests",
"finalUrl": "https://oa.hyinda.com/purchase-requests",
"viewportWidth": 360,
"visibleTableCount": 0,
"visibleTables": [],
"offscreenInteractives": [],
"tinyInteractives": [
{
"tag": "button",
"text": "",
"left": 16,
"top": 36,
"right": 38,
"bottom": 80,
"width": 22,
"height": 44
}
],
"mainTextSample": "工作台/purchase-requests你好,Employeesearch搜索searchEmployee采购申请支持草稿、附件、提交、撤回与经理单步审批的轻采购流程。新建采购全部状态草稿审批中已通过已驳回已取消全部供应商全部法体试运行法体全部成本中心采购单列表共 0 条暂无采购申请单据申请人状态金额暂无采购申请第 1 / 1 页上一页下一页请先在左侧选择采购单,或新建一张采购草稿。"
}
},
{
"route": "/contracts-registry",
"viewport": "mobile360",
"screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r94-post-fix/mobile360-contracts-registry.png",
"httpErrors": [],
"consoleErrors": [],
"metrics": {
"path": "/contracts-registry",
"finalUrl": "https://oa.hyinda.com/contracts-registry",
"viewportWidth": 360,
"visibleTableCount": 0,
"visibleTables": [],
"offscreenInteractives": [],
"tinyInteractives": [
{
"tag": "button",
"text": "",
"left": 16,
"top": 36,
"right": 43,
"bottom": 80,
"width": 27,
"height": 44
}
],
"mainTextSample": "备用模块合同台账你好,Employeesearch搜索searchEmployee合同台账维护合同元数据、生命周期、到期预警与导出,不在 OA 存放涉密正文附件。导出 CSV导出 Excel返回项目到期预警0份合同将在 30 天内到期展开到期列表新建合同台账补齐合同类型、金额、签署/生效/到期日期,续约将自动创建新的草稿合同。合同编号合同类型采购合同销售合同服务合同框架协议其他状态activedraftarchived关联项目未关联相对方摘要合同金额币种签署日期生效日期到期日"
}
},
{
"route": "/assets",
"viewport": "mobile390",
"screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r94-post-fix/mobile390-assets.png",
"httpErrors": [],
"consoleErrors": [],
"metrics": {
"path": "/assets",
"finalUrl": "https://oa.hyinda.com/assets",
"viewportWidth": 390,
"visibleTableCount": 0,
"visibleTables": [],
"offscreenInteractives": [],
"tinyInteractives": [
{
"tag": "input",
"text": "",
"left": 41,
"top": 660,
"right": 57,
"bottom": 676,
"width": 16,
"height": 16
}
],
"mainTextSample": "主导航资产你好,Employeesearch搜索searchEmployee资产台账维护资产分类与资产卡片,支持法体、成本中心和采购来源引用。移动扫码查找资产分类分类编码分类名称单据分类使用系统默认固定资产卡片 (ASSET_CARD_DEFAULT)启用分类暂无资产分类编码名称状态全部状态库存中使用中维修中已退役已归档全部分类全部法体试运行法体全部成本中心全部归属人暂无资产卡片资产分类状态归属人暂无资产卡片请先从列表选择资产卡片,或点击“新建资产卡片”。"
}
},
{
"route": "/notifications",
"viewport": "mobile390",
"screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r94-post-fix/mobile390-notifications.png",
"httpErrors": [],
"consoleErrors": [],
"metrics": {
"path": "/notifications",
"finalUrl": "https://oa.hyinda.com/notifications",
"viewportWidth": 390,
"visibleTableCount": 0,
"visibleTables": [],
"offscreenInteractives": [],
"tinyInteractives": [
{
"tag": "button",
"text": "",
"left": 16,
"top": 36,
"right": 48,
"bottom": 80,
"width": 32,
"height": 44
}
],
"mainTextSample": "工作台/notifications你好,Employeesearch搜索searchEmployee通知站内通知与待办提醒。全部标为已读返回仪表盘全部未读类型全部审批待办报销请假采购差旅资产盘点未读 0 条暂无通知标题时间状态操作暂无通知第 1 / 1 页上一页下一页"
}
},
{
"route": "/purchase-requests",
"viewport": "mobile390",
"screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r94-post-fix/mobile390-purchase-requests.png",
"httpErrors": [],
"consoleErrors": [],
"metrics": {
"path": "/purchase-requests",
"finalUrl": "https://oa.hyinda.com/purchase-requests",
"viewportWidth": 390,
"visibleTableCount": 0,
"visibleTables": [],
"offscreenInteractives": [],
"tinyInteractives": [
{
"tag": "button",
"text": "",
"left": 16,
"top": 36,
"right": 40,
"bottom": 80,
"width": 24,
"height": 44
}
],
"mainTextSample": "工作台/purchase-requests你好,Employeesearch搜索searchEmployee采购申请支持草稿、附件、提交、撤回与经理单步审批的轻采购流程。新建采购全部状态草稿审批中已通过已驳回已取消全部供应商全部法体试运行法体全部成本中心采购单列表共 0 条暂无采购申请单据申请人状态金额暂无采购申请第 1 / 1 页上一页下一页请先在左侧选择采购单,或新建一张采购草稿。"
}
},
{
"route": "/contracts-registry",
"viewport": "mobile390",
"screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r94-post-fix/mobile390-contracts-registry.png",
"httpErrors": [],
"consoleErrors": [],
"metrics": {
"path": "/contracts-registry",
"finalUrl": "https://oa.hyinda.com/contracts-registry",
"viewportWidth": 390,
"visibleTableCount": 0,
"visibleTables": [],
"offscreenInteractives": [],
"tinyInteractives": [],
"mainTextSample": "备用模块合同台账你好,Employeesearch搜索searchEmployee合同台账维护合同元数据、生命周期、到期预警与导出,不在 OA 存放涉密正文附件。导出 CSV导出 Excel返回项目到期预警0份合同将在 30 天内到期展开到期列表新建合同台账补齐合同类型、金额、签署/生效/到期日期,续约将自动创建新的草稿合同。合同编号合同类型采购合同销售合同服务合同框架协议其他状态activedraftarchived关联项目未关联相对方摘要合同金额币种签署日期生效日期到期日"
}
}
]
}
@@ -1,507 +0,0 @@
{
"summary": {
"generatedAt": "2026-05-05T16:09:19.921Z",
"baseURL": "https://oa.hyinda.com",
"results": 16,
"tablePages": [
"/assets@mobile360",
"/notifications@mobile360",
"/purchase-requests@mobile360",
"/assets@mobile390",
"/notifications@mobile390",
"/purchase-requests@mobile390"
],
"api403": [
"/contracts-registry@mobile360",
"/contracts-registry@mobile390"
]
},
"results": [
{
"route": "/assets",
"viewport": "mobile360",
"screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r94-preflight/mobile360-assets.png",
"metrics": {
"path": "/assets",
"title": "海音达工作台",
"visibleTableCount": 1,
"tables": [
{
"testid": null,
"left": 42,
"right": 318,
"width": 276,
"top": 695,
"bottom": 735
}
],
"offscreen": [],
"smallTargets": [
{
"label": "打开菜单",
"width": 27,
"height": 44
},
{
"label": "INPUT",
"width": 16,
"height": 16
}
],
"bodyOverflowX": 0,
"mobileLikeCards": 2
},
"httpErrors": [],
"consoleErrors": []
},
{
"route": "/notifications",
"viewport": "mobile360",
"screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r94-preflight/mobile360-notifications.png",
"metrics": {
"path": "/notifications",
"title": "海音达工作台",
"visibleTableCount": 1,
"tables": [
{
"testid": "notifications-table",
"left": 42,
"right": 318,
"width": 276,
"top": 475,
"bottom": 561
}
],
"offscreen": [],
"smallTargets": [
{
"label": "打开菜单",
"width": 24,
"height": 44
},
{
"label": "全部",
"width": 52,
"height": 36
},
{
"label": "未读",
"width": 52,
"height": 36
}
],
"bodyOverflowX": 0,
"mobileLikeCards": 2
},
"httpErrors": [],
"consoleErrors": []
},
{
"route": "/purchase-requests",
"viewport": "mobile360",
"screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r94-preflight/mobile360-purchase-requests.png",
"metrics": {
"path": "/purchase-requests",
"title": "海音达工作台",
"visibleTableCount": 1,
"tables": [
{
"testid": "purchase-requests-table",
"left": 42,
"right": 318,
"width": 276,
"top": 681,
"bottom": 773
}
],
"offscreen": [],
"smallTargets": [
{
"label": "打开菜单",
"width": 22,
"height": 44
}
],
"bodyOverflowX": 0,
"mobileLikeCards": 3
},
"httpErrors": [],
"consoleErrors": []
},
{
"route": "/team",
"viewport": "mobile360",
"screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r94-preflight/mobile360-team.png",
"metrics": {
"path": "/team",
"title": "海音达工作台",
"visibleTableCount": 0,
"tables": [],
"offscreen": [],
"smallTargets": [
{
"label": "打开菜单",
"width": 27,
"height": 44
}
],
"bodyOverflowX": 0,
"mobileLikeCards": 3
},
"httpErrors": [],
"consoleErrors": []
},
{
"route": "/leave-requests",
"viewport": "mobile360",
"screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r94-preflight/mobile360-leave-requests.png",
"metrics": {
"path": "/leave-requests",
"title": "海音达工作台",
"visibleTableCount": 0,
"tables": [],
"offscreen": [],
"smallTargets": [
{
"label": "打开菜单",
"width": 27,
"height": 44
}
],
"bodyOverflowX": 0,
"mobileLikeCards": 14
},
"httpErrors": [],
"consoleErrors": []
},
{
"route": "/todos",
"viewport": "mobile360",
"screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r94-preflight/mobile360-todos.png",
"metrics": {
"path": "/todos",
"title": "海音达工作台",
"visibleTableCount": 0,
"tables": [],
"offscreen": [],
"smallTargets": [
{
"label": "打开菜单",
"width": 27,
"height": 44
}
],
"bodyOverflowX": 0,
"mobileLikeCards": 14
},
"httpErrors": [],
"consoleErrors": []
},
{
"route": "/attendance",
"viewport": "mobile360",
"screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r94-preflight/mobile360-attendance.png",
"metrics": {
"path": "/attendance",
"title": "海音达工作台",
"visibleTableCount": 0,
"tables": [],
"offscreen": [],
"smallTargets": [
{
"label": "打开菜单",
"width": 27,
"height": 44
},
{
"label": "我的考勤",
"width": 80,
"height": 36
}
],
"bodyOverflowX": 0,
"mobileLikeCards": 10
},
"httpErrors": [],
"consoleErrors": []
},
{
"route": "/contracts-registry",
"viewport": "mobile360",
"screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r94-preflight/mobile360-contracts-registry.png",
"metrics": {
"path": "/contracts-registry",
"title": "海音达工作台",
"visibleTableCount": 0,
"tables": [],
"offscreen": [],
"smallTargets": [
{
"label": "打开菜单",
"width": 27,
"height": 44
}
],
"bodyOverflowX": 0,
"mobileLikeCards": 3
},
"httpErrors": [
{
"status": 403,
"url": "https://oa.hyinda.com/api/employees?page=1&pageSize=100&status=active"
},
{
"status": 403,
"url": "https://oa.hyinda.com/api/employees?page=1&pageSize=100&status=active"
}
],
"consoleErrors": [
"Failed to load resource: the server responded with a status of 403 ()",
"Failed to load resource: the server responded with a status of 403 ()"
]
},
{
"route": "/assets",
"viewport": "mobile390",
"screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r94-preflight/mobile390-assets.png",
"metrics": {
"path": "/assets",
"title": "海音达工作台",
"visibleTableCount": 1,
"tables": [
{
"testid": null,
"left": 42,
"right": 348,
"width": 306,
"top": 695,
"bottom": 735
}
],
"offscreen": [],
"smallTargets": [
{
"label": "打开菜单",
"width": 35,
"height": 44
},
{
"label": "INPUT",
"width": 16,
"height": 16
}
],
"bodyOverflowX": 0,
"mobileLikeCards": 3
},
"httpErrors": [],
"consoleErrors": []
},
{
"route": "/notifications",
"viewport": "mobile390",
"screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r94-preflight/mobile390-notifications.png",
"metrics": {
"path": "/notifications",
"title": "海音达工作台",
"visibleTableCount": 1,
"tables": [
{
"testid": "notifications-table",
"left": 42,
"right": 348,
"width": 306,
"top": 475,
"bottom": 561
}
],
"offscreen": [],
"smallTargets": [
{
"label": "打开菜单",
"width": 32,
"height": 44
},
{
"label": "全部",
"width": 52,
"height": 36
},
{
"label": "未读",
"width": 52,
"height": 36
}
],
"bodyOverflowX": 0,
"mobileLikeCards": 2
},
"httpErrors": [],
"consoleErrors": []
},
{
"route": "/purchase-requests",
"viewport": "mobile390",
"screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r94-preflight/mobile390-purchase-requests.png",
"metrics": {
"path": "/purchase-requests",
"title": "海音达工作台",
"visibleTableCount": 1,
"tables": [
{
"testid": "purchase-requests-table",
"left": 42,
"right": 348,
"width": 306,
"top": 681,
"bottom": 773
}
],
"offscreen": [],
"smallTargets": [
{
"label": "打开菜单",
"width": 24,
"height": 44
}
],
"bodyOverflowX": 0,
"mobileLikeCards": 3
},
"httpErrors": [],
"consoleErrors": []
},
{
"route": "/team",
"viewport": "mobile390",
"screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r94-preflight/mobile390-team.png",
"metrics": {
"path": "/team",
"title": "海音达工作台",
"visibleTableCount": 0,
"tables": [],
"offscreen": [],
"smallTargets": [
{
"label": "打开菜单",
"width": 35,
"height": 44
}
],
"bodyOverflowX": 0,
"mobileLikeCards": 3
},
"httpErrors": [],
"consoleErrors": []
},
{
"route": "/leave-requests",
"viewport": "mobile390",
"screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r94-preflight/mobile390-leave-requests.png",
"metrics": {
"path": "/leave-requests",
"title": "海音达工作台",
"visibleTableCount": 0,
"tables": [],
"offscreen": [],
"smallTargets": [
{
"label": "打开菜单",
"width": 35,
"height": 44
}
],
"bodyOverflowX": 0,
"mobileLikeCards": 17
},
"httpErrors": [],
"consoleErrors": []
},
{
"route": "/todos",
"viewport": "mobile390",
"screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r94-preflight/mobile390-todos.png",
"metrics": {
"path": "/todos",
"title": "海音达工作台",
"visibleTableCount": 0,
"tables": [],
"offscreen": [],
"smallTargets": [
{
"label": "打开菜单",
"width": 35,
"height": 44
}
],
"bodyOverflowX": 0,
"mobileLikeCards": 17
},
"httpErrors": [],
"consoleErrors": []
},
{
"route": "/attendance",
"viewport": "mobile390",
"screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r94-preflight/mobile390-attendance.png",
"metrics": {
"path": "/attendance",
"title": "海音达工作台",
"visibleTableCount": 0,
"tables": [],
"offscreen": [],
"smallTargets": [
{
"label": "打开菜单",
"width": 35,
"height": 44
},
{
"label": "我的考勤",
"width": 80,
"height": 36
}
],
"bodyOverflowX": 0,
"mobileLikeCards": 12
},
"httpErrors": [],
"consoleErrors": []
},
{
"route": "/contracts-registry",
"viewport": "mobile390",
"screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r94-preflight/mobile390-contracts-registry.png",
"metrics": {
"path": "/contracts-registry",
"title": "海音达工作台",
"visibleTableCount": 0,
"tables": [],
"offscreen": [],
"smallTargets": [
{
"label": "打开菜单",
"width": 35,
"height": 44
}
],
"bodyOverflowX": 0,
"mobileLikeCards": 3
},
"httpErrors": [
{
"status": 403,
"url": "https://oa.hyinda.com/api/employees?page=1&pageSize=100&status=active"
},
{
"status": 403,
"url": "https://oa.hyinda.com/api/employees?page=1&pageSize=100&status=active"
}
],
"consoleErrors": [
"Failed to load resource: the server responded with a status of 403 ()",
"Failed to load resource: the server responded with a status of 403 ()"
]
}
]
}
-42
查看文件
@@ -1,42 +0,0 @@
# R96 UI 精简视觉回归报告
日期:2026-05-06
## 范围
- 登录页极简化
- 桌面应用壳层与 Portal 首页文案降噪
- 移动首页任务化
- 移动审批与票据上传关键路径
- 票据中心、报销详情、审批详情的说明文字收敛
- 管理页术语降噪
## 自动化验证
| 验证项 | 命令 | 结果 |
| --- | --- | --- |
| Issue CSV 校验 | `python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-05-06_16-24-02-r96-ui-simplification.csv` | PASS |
| TypeScript | `cd client && npm run typecheck` | PASS |
| 生产构建 | `cd client && npm run build` | PASS |
| 移动入口与关键路径 | `cd client && E2E_BASE_URL=http://127.0.0.1:5177 npx playwright test tests/e2e/r89-mobile-login-navigation.spec.ts --workers=1 --reporter=list` | PASS,3/3 |
| 手机票据与报销可用性 | `cd client && E2E_BASE_URL=http://127.0.0.1:5177 npx playwright test tests/e2e/r92-mobile-invoice-usability.spec.ts --workers=1 --reporter=list` | PASS,3/3 |
| 视觉壳层基线 | `cd client && E2E_BASE_URL=http://127.0.0.1:5177 npx playwright test tests/e2e/visual-shell.spec.ts --workers=1 --reporter=list` | PASS,3/3 |
| Diff 空白检查 | `git diff --check` | PASS |
## 视觉证据
Playwright 附件已覆盖:
- `r96-wecom-login.png`
- `r96-mobile-today.png`
- `r96-mobile-approvals.png`
- `r96-mobile-capture.png`
- `login-shell.png`
- `app-shell.png`
- `mobile-today.png`
截图附件保存在本地 `client/test-results/`,该目录为测试产物目录,不纳入 git。
## 结论
本轮 UI 精简没有改认证、审批、OCR、报销状态机或后端 API。自动化结果显示登录、移动首页、移动审批、票据上传和手机票据/报销关键路径均可用。
-42
查看文件
@@ -1,42 +0,0 @@
# R97 高频页面视觉回归报告
日期:2026-05-06
## 范围
- 报销列表:手机草稿卡片、继续编辑入口、桌面操作列。
- 票据中心:手机列表、详情面板、批量上传入口、识别文案。
- 移动审批:待办列表、详情处理区、筛选与批量处理收起态。
- 审批待办:手机卡片兜底与桌面表格保留。
## 自动化验证
| 命令 | 结果 |
| --- | --- |
| `python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-05-06_17-37-53-r97-high-frequency-ui-polish.csv` | 通过 |
| `git diff --check` | 通过 |
| `cd client && npm run typecheck` | 通过 |
| `cd client && npm run build` | 通过;Vite 仍有既有 circular chunk 警告 |
| `cd client && E2E_BASE_URL=http://127.0.0.1:5177 npx playwright test tests/e2e/r89-mobile-login-navigation.spec.ts --workers=1 --reporter=list` | 3 passed |
| `cd client && E2E_BASE_URL=http://127.0.0.1:5177 npx playwright test tests/e2e/r92-mobile-invoice-usability.spec.ts --workers=1 --reporter=list` | 3 passed |
| `cd client && E2E_BASE_URL=http://127.0.0.1:5177 npx playwright test tests/e2e/visual-shell.spec.ts --workers=1 --reporter=list` | 4 passed |
## 视觉证据
Playwright 在测试报告中附加了以下截图:
- `r97-wecom-login.png`
- `r97-mobile-today.png`
- `r97-mobile-approvals.png`
- `r97-mobile-capture.png`
- `r97-reimbursements-mobile-draft.png`
- `r97-invoice-pool-mobile.png`
- `r97-mobile-capture-multi-upload.png`
- `r97-workflow-tasks-mobile.png`
- `login-shell.png`
- `app-shell.png`
- `mobile-today.png`
## 结论
本轮高频页面精修已覆盖主要手机与桌面入口。自动化验证未发现横向溢出、核心按钮不可见或手机菜单不可操作问题。后续如继续做视觉优化,建议进入表单详情页和管理后台低频页,而不是继续扩大本轮高频页范围。
@@ -1,108 +0,0 @@
{
"generatedAt": "2026-05-06T12:27:27.400Z",
"baseUrl": "https://oa.hyinda.com",
"viewport": {
"width": 390,
"height": 844,
"deviceScaleFactor": 3
},
"results": [
{
"id": "login",
"path": "/login",
"role": "public",
"screenshot": "artifacts/r98-public/screenshots/r98-login-390x844.png",
"url": "https://oa.hyinda.com/login",
"viewportWidth": 390,
"viewportHeight": 844,
"documentScrollWidth": 390,
"bodyClientWidth": 390,
"hasHorizontalOverflow": false,
"visibleTableCount": 0,
"offscreenControlCount": 0,
"offscreenControls": [],
"overflowSample": []
},
{
"id": "mobile-home",
"path": "/mobile",
"role": "employee",
"screenshot": "artifacts/r98-public/screenshots/r98-mobile-home-390x844.png",
"url": "https://oa.hyinda.com/mobile",
"viewportWidth": 390,
"viewportHeight": 844,
"documentScrollWidth": 390,
"bodyClientWidth": 390,
"hasHorizontalOverflow": false,
"visibleTableCount": 0,
"offscreenControlCount": 0,
"offscreenControls": [],
"overflowSample": []
},
{
"id": "mobile-approvals",
"path": "/mobile/approvals",
"role": "admin",
"screenshot": "artifacts/r98-public/screenshots/r98-mobile-approvals-390x844.png",
"url": "https://oa.hyinda.com/mobile/approvals",
"viewportWidth": 390,
"viewportHeight": 844,
"documentScrollWidth": 390,
"bodyClientWidth": 390,
"hasHorizontalOverflow": false,
"visibleTableCount": 0,
"offscreenControlCount": 0,
"offscreenControls": [],
"overflowSample": []
},
{
"id": "invoice-pool",
"path": "/invoice-pool",
"role": "employee",
"screenshot": "artifacts/r98-public/screenshots/r98-invoice-pool-390x844.png",
"url": "https://oa.hyinda.com/invoice-pool",
"viewportWidth": 390,
"viewportHeight": 844,
"documentScrollWidth": 390,
"bodyClientWidth": 390,
"hasHorizontalOverflow": false,
"visibleTableCount": 0,
"offscreenControlCount": 0,
"offscreenControls": [],
"overflowSample": []
},
{
"id": "reimbursements",
"path": "/reimbursements",
"role": "employee",
"screenshot": "artifacts/r98-public/screenshots/r98-reimbursements-390x844.png",
"url": "https://oa.hyinda.com/reimbursements",
"viewportWidth": 390,
"viewportHeight": 844,
"documentScrollWidth": 390,
"bodyClientWidth": 390,
"hasHorizontalOverflow": false,
"visibleTableCount": 0,
"offscreenControlCount": 0,
"offscreenControls": [],
"overflowSample": []
},
{
"id": "workflow-tasks",
"path": "/workflow/tasks",
"role": "admin",
"screenshot": "artifacts/r98-public/screenshots/r98-workflow-tasks-390x844.png",
"url": "https://oa.hyinda.com/workflow/tasks",
"viewportWidth": 390,
"viewportHeight": 844,
"documentScrollWidth": 390,
"bodyClientWidth": 390,
"hasHorizontalOverflow": false,
"visibleTableCount": 0,
"offscreenControlCount": 0,
"offscreenControls": [],
"overflowSample": []
}
],
"issues": []
}
@@ -1,75 +0,0 @@
# R98 公网试运行收口报告
日期:2026-05-06
## 范围
- 本地发布门禁。
- 公网部署与运行时配置核查。
- 公网 live smoke、移动视觉巡检和真实腾讯 OCR 复核。
- DB + storage 备份恢复演练。
- 企业微信真机复核说明。
## 执行结果
| 项目 | 命令 | 结果 |
| --- | --- | --- |
| Issue CSV 校验 | `python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-05-06_19-54-01-r98-public-trialrun-closeout.csv` | 通过 |
| 本地静态发布门禁 | `bash scripts/qa/run-release-gate.sh static` | 通过 |
| 本地 smoke 门禁 | `bash scripts/qa/run-release-gate.sh smoke-local` | 8 passed |
| 公网部署 | `bash deploy/trialrun/deploy.sh` | 通过,远端重建 `hyb-oa-trialrun-server` |
| 公网 ready | `curl -fsS https://oa.hyinda.com/ready` | `data.ok=true` |
| 远端 runtime smoke | `docker-compose -f deploy/trialrun/docker-compose.yml --env-file deploy/trialrun/.env exec -T server node src/scripts/smoke-trialrun-runtime.js` | 通过 |
| 远端 external deps smoke | 部署脚本自动执行 `smoke-external-deps.js` | 通过,企微入口/OAuth、腾讯 OCR、消息桥接配置齐全 |
| 前端产物指纹 | 容器内 grep `invoice-pool-mobile-list`、`reimbursements-mobile-list`、`mobile-capture-file`、`workflow-tasks-mobile-list`、`mobile-today-focus` | 均存在 |
| 公网 live smoke | 使用 `SMOKE001/SMOKE002` 独立账号临时随机密码执行 `bash scripts/qa/run-web-gates.sh smoke-live` | 3 passed |
| 移动视觉巡检 | Playwright 390x844 手机视口打开 6 个公网页面并截图 | 6 页均无横向溢出、无可操作元素出屏、无可见桌面表格 |
| 真实腾讯 OCR | `PLAYWRIGHT_MANUAL=1 PLAYWRIGHT_OCR_LIVE=1 ... npx playwright test tests/e2e/manual/live-invoice-ocr.spec.ts --workers=1 --reporter=list --timeout=360000` | 1 passed,真实 PDF 上传后识别为 `available` |
| DB 备份恢复 | 远端 `backup-db.sh` 后恢复到临时库 `hyb_oa_restore_check_r98` | 临时库 public schema 表数 96,演练后已删除 |
| Storage 备份恢复 | 远端 `backup-storage.sh` 后恢复到 `/tmp/hyb-oa-storage-restore-check-r98-*` | 可解包,文件数 8,演练后已清理 |
| 企微 OAuth 入口 | `GET /api/auth/wecom/login?returnTo=%2Fmobile` | HTTP 302 到企业微信 OAuth,`redirect_uri=https://oa.hyinda.com/api/auth/wecom/callback` |
## 关键证据
- 移动视觉报告:`artifacts/r98-public/mobile-visual-audit.json`
- 移动截图:
- `artifacts/r98-public/screenshots/r98-login-390x844.png`
- `artifacts/r98-public/screenshots/r98-mobile-home-390x844.png`
- `artifacts/r98-public/screenshots/r98-mobile-approvals-390x844.png`
- `artifacts/r98-public/screenshots/r98-invoice-pool-390x844.png`
- `artifacts/r98-public/screenshots/r98-reimbursements-390x844.png`
- `artifacts/r98-public/screenshots/r98-workflow-tasks-390x844.png`
- 最新 DB 备份:`/opt/hyb-oa-trialrun/deploy/trialrun/backups/hyb-oa-db-20260506_204004.dump`
- 最新 Storage 备份:`/opt/hyb-oa-trialrun/deploy/trialrun/backups/hyb-oa-storage-20260506_204005.tar.gz`
- 最新真实 OCR 记录:
- 上传人:`[email protected]`
- 文件:`北京悦海堂餐饮管理有限公司_发票金额1683.00元.pdf`
- provider:`tencent`
- 状态:`available`
- 金额:`1683`
- 销售方:`北京悦海堂餐饮管理有限公司`
- 购买方:`合肥海音达科技有限公司`
- 开票日期:`2026-03-11`
## 本轮修正
- `login-portal-ux.spec.ts` 已按移动优先策略修正:企业微信 WebView 密码登录后允许进入 `/mobile`。
- `live-invoice-ocr*.spec.ts` 支持使用 `PLAYWRIGHT_OCR_LIVE_IDENTIFIER/PASSWORD` 或 `LIVE_SMOKE_EMPLOYEE_*`,避免使用真实员工账号跑 live OCR。
- live OCR 用例结尾改为清理测试上下文 cookies,不再依赖页面菜单退出,避免 OCR 已成功但退出菜单阻塞导致误失败。
- 远端备份目录原为 `root:root`,导致 `deploy` 用户无法备份;已用 root SSH 修复为 `deploy:deploy` 后完成演练。
## 企微真机复核步骤
自动化已确认企微配置为 `ready`,OAuth 入口会跳到企业微信授权,并携带 `returnTo=/mobile`。真机仍建议你在手机上复核一次:
1. 打开企业微信。
2. 进入工作台,点击“海音达 OA”。
3. 已绑定账号预期:无需输入 OA 密码,直接进入移动工作台 `/mobile`。
4. 若提示未绑定,点击“使用账号绑定/登录”,用 OA 账号登录一次,之后再次从工作台打开应直接进入 `/mobile`。
5. 若仍回到登录页,记录手机页面 URL 和错误文案,我再查对应 `requestId`。
## 备注
- `smoke-local` 首次暴露旧用例仍假设企微 WebView 登录后进入 `/portal`,已按当前策略修正为 `/mobile`。
- 公网 live smoke 首次用默认种子密码登录失败;已改用独立 smoke 账号并在远端重置临时随机密码,密码未写入仓库、未输出。
- 前端构建仍存在既有 Vite circular chunk 和大 chunk 警告,不阻塞本轮试运行收口,但建议后续单独做构建分包治理。
二进制文件未显示。

之前

宽度:  |  高度:  |  大小: 230 KiB

二进制文件未显示。

之前

宽度:  |  高度:  |  大小: 89 KiB

二进制文件未显示。

之前

宽度:  |  高度:  |  大小: 144 KiB

二进制文件未显示。

之前

宽度:  |  高度:  |  大小: 128 KiB

二进制文件未显示。

之前

宽度:  |  高度:  |  大小: 282 KiB

二进制文件未显示。

之前

宽度:  |  高度:  |  大小: 119 KiB

文件差异内容过多而无法显示 加载差异
二进制文件未显示。

之前

宽度:  |  高度:  |  大小: 708 KiB

二进制文件未显示。

之前

宽度:  |  高度:  |  大小: 128 KiB

二进制文件未显示。

之前

宽度:  |  高度:  |  大小: 437 KiB

二进制文件未显示。

之前

宽度:  |  高度:  |  大小: 128 KiB

二进制文件未显示。

之前

宽度:  |  高度:  |  大小: 272 KiB

二进制文件未显示。

之前

宽度:  |  高度:  |  大小: 300 KiB

二进制文件未显示。

之前

宽度:  |  高度:  |  大小: 140 KiB

+2 -2
查看文件
@@ -7,8 +7,8 @@
**相关文档**: **相关文档**:
- [需求规格说明书](./requirements-specification.md) - [需求规格说明书](./requirements-specification.md)
- [实现状态矩阵](./feature-matrix.md) - [实现状态矩阵](./feature-matrix.md)
- [试运行覆盖矩阵](../artifacts/r75/coverage-matrix.csv) - [试运行覆盖矩阵](trialrun/coverage-matrix.csv)
- [人工试运行报告](../artifacts/r70/manual-trialrun-report.md) - [人工试运行报告](trialrun/manual-trialrun-report.md)
**2026-05-04 已核实部署基线**: **2026-05-04 已核实部署基线**:
- 公网入口:`https://oa.hyinda.com` - 公网入口:`https://oa.hyinda.com`
+2 -2
查看文件
@@ -2,7 +2,7 @@
**快照日期**:2026-05-05 **快照日期**:2026-05-05
**范围**:`F1-F42`(含 `F19b/F19c/F19d`) + `R1-S2` + `P9A1-P9D1` + `P10E1-P10G1` + `G0-G6` + `H1` + `M1-M4` + `P13-0-P13-8` + `P14-0-P14-8` + `P15A-0-P15A-5` + `P15B-0-P15B-6` + `P16A-0-P16A-6` + `P16B-0-P16B-6` + `P16C-0-P16C-6` + `R9-0-R9-3` + `G2-0-G2-6` + `P17A-0-P17A-6` + `P17B-0-P17B-6` + `P18A-0-P18A-6` + `P18B-0-P18B-6` + `P19-0-P19-6` + `P19IM1-0-P19IM1-6` + `P19ERP1-0-P19ERP1-6` + `P19ERP2-0-P19ERP2-6` + `P19ERP3-0-P19ERP3-6` + `R10-0-R10-4` + `P19MCP1-0-P19MCP1-4` + `P19AI1-0-P19AI1-5` + `P20TRAVEL1-0-P20TRAVEL1-5` + `P20TRAVEL2-0-P20TRAVEL2-5` + `P20TRAVEL3-0-P20TRAVEL3-5` + `P21PWA1-0-P21PWA1-5` + `P21PWA2-0-P21PWA2-5` + `P22PROD1-0-P22PROD1-5` + `R11-0-R11-5`,共 278 项。 **范围**:`F1-F42`(含 `F19b/F19c/F19d`) + `R1-S2` + `P9A1-P9D1` + `P10E1-P10G1` + `G0-G6` + `H1` + `M1-M4` + `P13-0-P13-8` + `P14-0-P14-8` + `P15A-0-P15A-5` + `P15B-0-P15B-6` + `P16A-0-P16A-6` + `P16B-0-P16B-6` + `P16C-0-P16C-6` + `R9-0-R9-3` + `G2-0-G2-6` + `P17A-0-P17A-6` + `P17B-0-P17B-6` + `P18A-0-P18A-6` + `P18B-0-P18B-6` + `P19-0-P19-6` + `P19IM1-0-P19IM1-6` + `P19ERP1-0-P19ERP1-6` + `P19ERP2-0-P19ERP2-6` + `P19ERP3-0-P19ERP3-6` + `R10-0-R10-4` + `P19MCP1-0-P19MCP1-4` + `P19AI1-0-P19AI1-5` + `P20TRAVEL1-0-P20TRAVEL1-5` + `P20TRAVEL2-0-P20TRAVEL2-5` + `P20TRAVEL3-0-P20TRAVEL3-5` + `P21PWA1-0-P21PWA1-5` + `P21PWA2-0-P21PWA2-5` + `P22PROD1-0-P22PROD1-5` + `R11-0-R11-5`,共 278 项。
**事实源**:`issues/2026-02-09_13-39-02-p5-blueprint-v3.csv` + `issues/2026-02-09_23-30-00-p6-p8-remaining-work-master.csv` + `issues/2026-02-10_09-42-31-p9-maintenance-performance-matrix.csv` + `issues/2026-02-10_10-35-30-p10-production-hardening.csv` + `issues/2026-02-11-p11-p12-governance-mobile.csv` + `issues/2026-02-12_01-09-41-p13-l5-governance.csv` + `issues/2026-02-13_00-11-56-p14-l5-operationalization.csv` + `issues/2026-03-06_14-30-00-p15a-l5-permission-decouple.csv` + `issues/2026-03-06_14-30-00-p15b-l5-leave-v1.csv` + `issues/2026-03-07_13-47-05-p16a-l5-master-data-core.csv` + `issues/2026-03-07_16-22-07-p16b-l5-holiday-calendar.csv` + `issues/2026-03-07_17-14-39-p16c-l5-suppliers.csv` + `issues/2026-03-07_18-15-03-r9-g2-p19-roadmap-refresh.csv` + `issues/2026-03-07_18-16-00-g2-l5-cross-domain-bridge.csv` + `issues/2026-03-07_19-33-09-p17a-l5-procurement-core.csv` + `issues/2026-03-07_21-00-37-p17b-l5-procurement-budget-archive.csv` + `issues/2026-03-07_22-02-09-p18a-l5-asset-registry-core.csv` + `issues/2026-03-07_22-34-03-p18b-l5-asset-movements-inventory.csv` + `issues/2026-03-07_23-22-00-p19-l4-integration-readiness.csv` + `issues/2026-03-08_12-18-10-p19-im-1-l5-collaboration-adapter.csv` + `issues/2026-03-08_14-10-53-p19-erp-1-l5-masterdata-journal-bridge.csv` + `issues/2026-03-08_22-46-51-p19-erp-2-l5-procurement-commitment-archive.csv` + `issues/2026-03-09_00-10-00-p19-erp-3-l5-asset-ledger-summary.csv` + `issues/2026-03-09_10-15-00-r10-post-erp3-roadmap-refresh.csv` + `issues/2026-03-09_10-25-00-p19-mcp-1-l4-readonly-tools-baseline.csv` + `issues/2026-03-10_12-54-30-p19-ai-1-l5-suggestion-workbench-refresh.csv` + `issues/2026-03-10_17-32-21-p20-travel-1-l5-request-intake-refresh.csv` + `issues/2026-03-10_21-05-59-p20-travel-2-l5-corporate-payments-refresh.csv` + `issues/2026-03-11_09-57-28-p20-travel-3-l5-reconciliation-erp-bridge-refresh.csv` + `issues/2026-03-11_17-50-39-p21-pwa-1-l5-asset-scan-refresh.csv` + `issues/2026-03-12_04-32-13-p21-pwa-2-l5-offline-deeplink-refresh.csv` + `issues/2026-03-12_16-58-44-p22-prod-1-l5-production-hardening.csv` + `issues/2026-03-13_10-30-00-r11-contract-reconciliation-and-spec-refresh.csv` + `issues/2026-04-26_r70-manual-trialrun.csv` + `issues/2026-04-29_08-39-22-r76-external-trialrun-closeout.csv` + `issues/2026-04-29_09-19-07-r77-ocr-pdf-first.csv` + `issues/2026-04-29_10-14-27-r78-reimbursement-payment-tail.csv` + `issues/2026-05-04_13-11-16-r79-governance-live-readiness.csv` + `artifacts/r75/coverage-matrix.csv`(执行合同与覆盖证据) **事实源**:`issues/2026-02-09_13-39-02-p5-blueprint-v3.csv` + `issues/2026-02-09_23-30-00-p6-p8-remaining-work-master.csv` + `issues/2026-02-10_09-42-31-p9-maintenance-performance-matrix.csv` + `issues/2026-02-10_10-35-30-p10-production-hardening.csv` + `issues/2026-02-11-p11-p12-governance-mobile.csv` + `issues/2026-02-12_01-09-41-p13-l5-governance.csv` + `issues/2026-02-13_00-11-56-p14-l5-operationalization.csv` + `issues/2026-03-06_14-30-00-p15a-l5-permission-decouple.csv` + `issues/2026-03-06_14-30-00-p15b-l5-leave-v1.csv` + `issues/2026-03-07_13-47-05-p16a-l5-master-data-core.csv` + `issues/2026-03-07_16-22-07-p16b-l5-holiday-calendar.csv` + `issues/2026-03-07_17-14-39-p16c-l5-suppliers.csv` + `issues/2026-03-07_18-15-03-r9-g2-p19-roadmap-refresh.csv` + `issues/2026-03-07_18-16-00-g2-l5-cross-domain-bridge.csv` + `issues/2026-03-07_19-33-09-p17a-l5-procurement-core.csv` + `issues/2026-03-07_21-00-37-p17b-l5-procurement-budget-archive.csv` + `issues/2026-03-07_22-02-09-p18a-l5-asset-registry-core.csv` + `issues/2026-03-07_22-34-03-p18b-l5-asset-movements-inventory.csv` + `issues/2026-03-07_23-22-00-p19-l4-integration-readiness.csv` + `issues/2026-03-08_12-18-10-p19-im-1-l5-collaboration-adapter.csv` + `issues/2026-03-08_14-10-53-p19-erp-1-l5-masterdata-journal-bridge.csv` + `issues/2026-03-08_22-46-51-p19-erp-2-l5-procurement-commitment-archive.csv` + `issues/2026-03-09_00-10-00-p19-erp-3-l5-asset-ledger-summary.csv` + `issues/2026-03-09_10-15-00-r10-post-erp3-roadmap-refresh.csv` + `issues/2026-03-09_10-25-00-p19-mcp-1-l4-readonly-tools-baseline.csv` + `issues/2026-03-10_12-54-30-p19-ai-1-l5-suggestion-workbench-refresh.csv` + `issues/2026-03-10_17-32-21-p20-travel-1-l5-request-intake-refresh.csv` + `issues/2026-03-10_21-05-59-p20-travel-2-l5-corporate-payments-refresh.csv` + `issues/2026-03-11_09-57-28-p20-travel-3-l5-reconciliation-erp-bridge-refresh.csv` + `issues/2026-03-11_17-50-39-p21-pwa-1-l5-asset-scan-refresh.csv` + `issues/2026-03-12_04-32-13-p21-pwa-2-l5-offline-deeplink-refresh.csv` + `issues/2026-03-12_16-58-44-p22-prod-1-l5-production-hardening.csv` + `issues/2026-03-13_10-30-00-r11-contract-reconciliation-and-spec-refresh.csv` + `issues/2026-04-26_r70-manual-trialrun.csv` + `issues/2026-04-29_08-39-22-r76-external-trialrun-closeout.csv` + `issues/2026-04-29_09-19-07-r77-ocr-pdf-first.csv` + `issues/2026-04-29_10-14-27-r78-reimbursement-payment-tail.csv` + `issues/2026-05-04_13-11-16-r79-governance-live-readiness.csv` + `docs/trialrun/coverage-matrix.csv`(执行合同与覆盖证据)
## R70-R90 试运行与外部环境补充(2026-04-28 至 2026-05-05) ## R70-R90 试运行与外部环境补充(2026-04-28 至 2026-05-05)
@@ -11,7 +11,7 @@
- **当前企微状态**:R80 已启用公网 `WECOM_ENABLED / WECOM_ENTRY_ENABLED / WECOM_OAUTH_ENABLED`,`wecom_entry_v1` 已由 `force_off` 调整为 `inherit`;R82-R88 已收口真实企微 UserId 兼容、首次绑定、会话提示与设备指纹,用户手机企业微信已验证可进入系统。 - **当前企微状态**:R80 已启用公网 `WECOM_ENABLED / WECOM_ENTRY_ENABLED / WECOM_OAUTH_ENABLED`,`wecom_entry_v1` 已由 `force_off` 调整为 `inherit`;R82-R88 已收口真实企微 UserId 兼容、首次绑定、会话提示与设备指纹,用户手机企业微信已验证可进入系统。
- **当前移动状态**:R89 已在本地完成登录极简化、移动默认 `/mobile`、底部导航、移动审批、票据上传与小屏菜单抽屉自动化;公网仍需部署最新 R89/R90 后再做一次真实企业微信移动落点复核。 - **当前移动状态**:R89 已在本地完成登录极简化、移动默认 `/mobile`、底部导航、移动审批、票据上传与小屏菜单抽屉自动化;公网仍需部署最新 R89/R90 后再做一次真实企业微信移动落点复核。
- **当前剩余外部事项**:公网 live smoke、独立 smoke 账号核对、备份恢复演练、HTTPS cookie 行为与多用户并发证据仍需按 R90/R91 收口;历史 R79 中 “WECOM=false / wecom_entry_v1=force_off” 只作为过期诊断记录,不再代表当前状态。 - **当前剩余外部事项**:公网 live smoke、独立 smoke 账号核对、备份恢复演练、HTTPS cookie 行为与多用户并发证据仍需按 R90/R91 收口;历史 R79 中 “WECOM=false / wecom_entry_v1=force_off” 只作为过期诊断记录,不再代表当前状态。
- **阅读方式**:本文件的主表仍保留历史主线;与 trialrun、覆盖率、外部环境有关的现状判断,应结合 `artifacts/r75/coverage-matrix.csv` 与 `artifacts/r70/manual-trialrun-report.md` 一起看。 - **阅读方式**:本文件的主表仍保留历史主线;与 trialrun、覆盖率、外部环境有关的现状判断,应结合 `docs/trialrun/coverage-matrix.csv` 与 `docs/trialrun/manual-trialrun-report.md` 一起看。
## R12 增量能力(2026-03-21) ## R12 增量能力(2026-03-21)
+2 -2
查看文件
@@ -12,8 +12,8 @@
3. 发布门禁与部署 runbook 收口 3. 发布门禁与部署 runbook 收口
- 当前执行事实源优先级: - 当前执行事实源优先级:
- 最新执行合同:`issues/*.csv` - 最新执行合同:`issues/*.csv`
- 业务覆盖:`artifacts/r75/coverage-matrix.csv` - 业务覆盖:`docs/trialrun/coverage-matrix.csv`
- 试运行结论:`artifacts/r70/manual-trialrun-report.md` - 试运行结论:`docs/trialrun/manual-trialrun-report.md`
- 全局状态矩阵:`docs/feature-matrix.md` - 全局状态矩阵:`docs/feature-matrix.md`
## 历史说明 ## 历史说明
@@ -1,16 +1,16 @@
"Domain","Tier","Routes","Primary_Roles","Env_Gates","Feature_Flags","Coverage_Status","Evidence","Validated_Flows","Gaps","Next_Action" "Domain","Tier","Routes","Primary_Roles","Env_Gates","Feature_Flags","Coverage_Status","Evidence","Validated_Flows","Gaps","Next_Action"
"认证与 Portal 导航","must_cover","/login|/portal|主/管/备导航","employee|manager|admin","APP_ORIGIN|COOKIE_SECURE|PORTAL_HOME_ENABLED|WECOM_ENTRY_ENABLED","portal_home_v1|wecom_entry_v1","done","artifacts/r69/acceptance-report.md|artifacts/r70/manual-trialrun-report.md|client/tests/e2e/login-portal-ux.spec.ts|client/tests/e2e/wecom-entry.spec.ts|client/tests/e2e/manual/r70-trialrun-assist.spec.ts","登录、Portal 首屏、员工/经理/管理员导航分组、普通浏览器与企微 WebView CTA 提示均有自动化或人工证据。","真实企微 OAuth 绑定与回跳未做端到端;HTTPS 部署态 cookie 行为未在本轮验证。","保持主链路 done;真实企微与 HTTPS 转 A5 外部专项。" "认证与 Portal 导航","must_cover","/login|/portal|主/管/备导航","employee|manager|admin","APP_ORIGIN|COOKIE_SECURE|PORTAL_HOME_ENABLED|WECOM_ENTRY_ENABLED","portal_home_v1|wecom_entry_v1","done","artifacts/r69/acceptance-report.md|docs/trialrun/manual-trialrun-report.md|client/tests/e2e/login-portal-ux.spec.ts|client/tests/e2e/wecom-entry.spec.ts|client/tests/e2e/manual/r70-trialrun-assist.spec.ts","登录、Portal 首屏、员工/经理/管理员导航分组、普通浏览器与企微 WebView CTA 提示均有自动化或人工证据。","真实企微 OAuth 绑定与回跳未做端到端;HTTPS 部署态 cookie 行为未在本轮验证。","保持主链路 done;真实企微与 HTTPS 转 A5 外部专项。"
"请假与审批","must_cover","/leave-requests|/workflow/tasks","employee|manager|admin","none","leave_holiday_calendar","done","artifacts/r69/acceptance-report.md|artifacts/r70/manual-trialrun-report.md|client/tests/e2e/leave-flow.spec.ts|client/tests/e2e/workflow-quick-approve.spec.ts|client/tests/e2e/leave-team-calendar.spec.ts","请假草稿、提交、撤回、经理快捷审批、团队日历权限边界与经理部门视角已自动化并在 R70 人工复测通过。","多审批人链路、代理审批、真实并发多人协同未在 trialrun 轮次验证。","维持 done;多人协同与代理审批并入 A5 或后续专项。" "请假与审批","must_cover","/leave-requests|/workflow/tasks","employee|manager|admin","none","leave_holiday_calendar","done","artifacts/r69/acceptance-report.md|docs/trialrun/manual-trialrun-report.md|client/tests/e2e/leave-flow.spec.ts|client/tests/e2e/workflow-quick-approve.spec.ts|client/tests/e2e/leave-team-calendar.spec.ts","请假草稿、提交、撤回、经理快捷审批、团队日历权限边界与经理部门视角已自动化并在 R70 人工复测通过。","多审批人链路、代理审批、真实并发多人协同未在 trialrun 轮次验证。","维持 done;多人协同与代理审批并入 A5 或后续专项。"
"报销、票据中心与 OCR","must_cover","/reimbursements|/reimbursements/:id|/invoice-pool","employee|manager|finance|admin","OCR_PROVIDER|TENCENT_SECRET_ID|TENCENT_SECRET_KEY|PAYMENT_BATCH_ENABLED|ERP_SYNC_ENABLED","invoice_verification|payment_batch_v1|erp_sync","done","artifacts/r70/manual-trialrun-report.md|artifacts/r70/live-ocr-batch-report.md|issues/2026-04-29_08-39-22-r76-external-trialrun-closeout.csv|issues/2026-04-29_09-19-07-r77-ocr-pdf-first.csv|issues/2026-04-29_10-14-27-r78-reimbursement-payment-tail.csv|client/tests/e2e/reimbursement-workflow-progress.spec.ts|client/tests/e2e/invoice-ocr-flow.spec.ts|client/tests/e2e/reimbursement-payment-batch-flow.spec.ts|client/tests/e2e/manual/live-invoice-ocr.spec.ts|client/tests/e2e/manual/live-invoice-ocr-batch.spec.ts|server/scripts/regression-payment-batches.sh","报销提交后审批进度、票据中心缺字段修正、上传后自动 OCR 进入可绑定、绑定后提交已自动化;R70 人工链路也通过。R77 已在干净本地 trialrun DB 上用真实 PDF 发票跑通 `上传 -> OCR -> available`。R78 已补 employee->manager->finance->finance_mgr->payment batch->execute->reimbursement paid->invoice archived->ERP preview pending outbox focused regression。","真实 ERP 投递回执、高风险两轮复核、大额或混合付款批次仍未进入本轮本地试运行;腾讯 OCR 凭证仍依赖旧项目运行时注入。","维持 done;真实 ERP 与高风险付款转外部/专项回归,PDF 转图片 fallback 仅在新增票样兼容性问题出现时再评估。" "报销、票据中心与 OCR","must_cover","/reimbursements|/reimbursements/:id|/invoice-pool","employee|manager|finance|admin","OCR_PROVIDER|TENCENT_SECRET_ID|TENCENT_SECRET_KEY|PAYMENT_BATCH_ENABLED|ERP_SYNC_ENABLED","invoice_verification|payment_batch_v1|erp_sync","done","docs/trialrun/manual-trialrun-report.md|artifacts/r70/live-ocr-batch-report.md|issues/2026-04-29_08-39-22-r76-external-trialrun-closeout.csv|issues/2026-04-29_09-19-07-r77-ocr-pdf-first.csv|issues/2026-04-29_10-14-27-r78-reimbursement-payment-tail.csv|client/tests/e2e/reimbursement-workflow-progress.spec.ts|client/tests/e2e/invoice-ocr-flow.spec.ts|client/tests/e2e/reimbursement-payment-batch-flow.spec.ts|client/tests/e2e/manual/live-invoice-ocr.spec.ts|client/tests/e2e/manual/live-invoice-ocr-batch.spec.ts|server/scripts/regression-payment-batches.sh","报销提交后审批进度、票据中心缺字段修正、上传后自动 OCR 进入可绑定、绑定后提交已自动化;R70 人工链路也通过。R77 已在干净本地 trialrun DB 上用真实 PDF 发票跑通 `上传 -> OCR -> available`。R78 已补 employee->manager->finance->finance_mgr->payment batch->execute->reimbursement paid->invoice archived->ERP preview pending outbox focused regression。","真实 ERP 投递回执、高风险两轮复核、大额或混合付款批次仍未进入本轮本地试运行;腾讯 OCR 凭证仍依赖旧项目运行时注入。","维持 done;真实 ERP 与高风险付款转外部/专项回归,PDF 转图片 fallback 仅在新增票样兼容性问题出现时再评估。"
"周报与待办","must_cover","/weekly-reports|/todos","employee|manager","WEEKLY_REPORT_ENABLED|TODO_BOARD_ENABLED","weekly_report_v1|todo_board_v1","done","artifacts/r70/auto-trialrun-deep-report.md|artifacts/r70/manual-trialrun-report.md|client/tests/e2e/weekly-todo-flow.spec.ts|client/tests/e2e/manual/r70-trialrun-deep-assist.spec.ts","周报保存、生成待办、提交周报、完成待办闭环已自动化且在真实 trialrun 数据上复核通过。","经理侧未提交周报聚合与催办策略未单独验证。","维持 done;如进入管理场景增强,再补经理视角聚合。" "周报与待办","must_cover","/weekly-reports|/todos","employee|manager","WEEKLY_REPORT_ENABLED|TODO_BOARD_ENABLED","weekly_report_v1|todo_board_v1","done","artifacts/r70/auto-trialrun-deep-report.md|docs/trialrun/manual-trialrun-report.md|client/tests/e2e/weekly-todo-flow.spec.ts|client/tests/e2e/manual/r70-trialrun-deep-assist.spec.ts","周报保存、生成待办、提交周报、完成待办闭环已自动化且在真实 trialrun 数据上复核通过。","经理侧未提交周报聚合与催办策略未单独验证。","维持 done;如进入管理场景增强,再补经理视角聚合。"
"公告、搜索与通知","must_cover","/announcements|/notifications|全局搜索","employee|manager|admin","ANNOUNCEMENTS_ENABLED|GLOBAL_SEARCH_ENABLED","announcements_v1|global_search_v1","done","artifacts/r70/auto-trialrun-deep-report.md|artifacts/r70/manual-trialrun-report.md|client/tests/e2e/announcements-presence.spec.ts|client/tests/e2e/global-search.spec.ts|client/tests/e2e/manual/r70-trialrun-deep-assist.spec.ts|client/tests/e2e/r75-automation-gap-fill.spec.ts","公告发布、员工可见、Portal 汇总、真实搜索命中公告并跳转,以及通知中心未读筛选、单条已读、全部已读与待办跳转均有自动化或人工证据。","无当前试运行阻断缺口;真实外发渠道投递与通知渠道配置验证另见系统治理和外部环境项。","站内通知维持 done;外发渠道留在 A5/治理专项。" "公告、搜索与通知","must_cover","/announcements|/notifications|全局搜索","employee|manager|admin","ANNOUNCEMENTS_ENABLED|GLOBAL_SEARCH_ENABLED","announcements_v1|global_search_v1","done","artifacts/r70/auto-trialrun-deep-report.md|docs/trialrun/manual-trialrun-report.md|client/tests/e2e/announcements-presence.spec.ts|client/tests/e2e/global-search.spec.ts|client/tests/e2e/manual/r70-trialrun-deep-assist.spec.ts|client/tests/e2e/r75-automation-gap-fill.spec.ts","公告发布、员工可见、Portal 汇总、真实搜索命中公告并跳转,以及通知中心未读筛选、单条已读、全部已读与待办跳转均有自动化或人工证据。","无当前试运行阻断缺口;真实外发渠道投递与通知渠道配置验证另见系统治理和外部环境项。","站内通知维持 done;外发渠道留在 A5/治理专项。"
"团队状态与考勤","must_cover","/team|/attendance","employee|manager|admin","PRESENCE_BOARD_ENABLED|ATTENDANCE_ENABLED","presence_board_v1|attendance_v1","done","artifacts/r70/manual-trialrun-report.md|client/tests/e2e/announcements-presence.spec.ts|issues/2026-04-09_r59-attendance-clockin.csv|client/tests/e2e/r75-automation-gap-fill.spec.ts","团队状态更新、Portal 汇总、经理查看团队状态,以及员工今日上班/下班打卡、月视图记录、管理员团队考勤补卡最小链路均已验证。","排班、节假日豁免、跨日班次等复杂考勤规则未做专项回归,但不构成本轮 trialrun 阻断。","维持 done;复杂考勤规则按需要独立专项。" "团队状态与考勤","must_cover","/team|/attendance","employee|manager|admin","PRESENCE_BOARD_ENABLED|ATTENDANCE_ENABLED","presence_board_v1|attendance_v1","done","docs/trialrun/manual-trialrun-report.md|client/tests/e2e/announcements-presence.spec.ts|issues/2026-04-09_r59-attendance-clockin.csv|client/tests/e2e/r75-automation-gap-fill.spec.ts","团队状态更新、Portal 汇总、经理查看团队状态,以及员工今日上班/下班打卡、月视图记录、管理员团队考勤补卡最小链路均已验证。","排班、节假日豁免、跨日班次等复杂考勤规则未做专项回归,但不构成本轮 trialrun 阻断。","维持 done;复杂考勤规则按需要独立专项。"
"人员、组织、生命周期与绩效","must_cover","/people|/organization|/people/:employeeId|/performance","admin|manager|employee","EMPLOYEE_LIFECYCLE_ENABLED","employee_lifecycle_v1","partial_done","artifacts/r70/manual-trialrun-report.md|issues/2026-03-21_12-10-00-r14-people-lifecycle.csv|issues/2026-03-29_r46-performance-review.csv|issues/2026-03-28_17-12-07-r40-profile-edit-and-people-export.csv|client/tests/e2e/r75-automation-gap-fill.spec.ts","管理员已人工打开人员管理与组织架构;当前 trialrun 已新增‘创建临时员工 -> 发起入职 -> 转正’轻量 happy path,生命周期、档案、导出、绩效权限边界仍保留历史 QA 与回归证据。","离职/资产交接完整链路、员工自助档案修改和直属上级绩效评分未在本轮重验。","lifecycle 基线已补齐;离职交接与绩效真实操作留后续 focused regression。" "人员、组织、生命周期与绩效","must_cover","/people|/organization|/people/:employeeId|/performance","admin|manager|employee","EMPLOYEE_LIFECYCLE_ENABLED","employee_lifecycle_v1","partial_done","docs/trialrun/manual-trialrun-report.md|issues/2026-03-21_12-10-00-r14-people-lifecycle.csv|issues/2026-03-29_r46-performance-review.csv|issues/2026-03-28_17-12-07-r40-profile-edit-and-people-export.csv|client/tests/e2e/r75-automation-gap-fill.spec.ts","管理员已人工打开人员管理与组织架构;当前 trialrun 已新增‘创建临时员工 -> 发起入职 -> 转正’轻量 happy path,生命周期、档案、导出、绩效权限边界仍保留历史 QA 与回归证据。","离职/资产交接完整链路、员工自助档案修改和直属上级绩效评分未在本轮重验。","lifecycle 基线已补齐;离职交接与绩效真实操作留后续 focused regression。"
"项目、合同台账与涉密边界","must_cover","/projects|/projects/:projectId|/contracts-registry","manager|admin|project roles","PROJECT_DOMAIN_ENABLED|PROJECT_LINKING_ENABLED|PROJECT_COMMUNICATION_LOG_ENABLED|PROJECT_CLOSURE_CHECKLIST_ENABLED|CONFIDENTIAL_DOC_REFS_ENABLED","project_domain_v1|project_linking_v1|project_communication_log_v1|project_closure_checklist_v1|confidential_doc_refs_v1","partial","artifacts/r70/manual-trialrun-report.md|client/tests/e2e/project-workbench.spec.ts|client/tests/e2e/confidential-boundary.spec.ts|client/tests/e2e/manual/r70-trialrun-assist.spec.ts","项目工作台沟通回填、收口面板、Portal 摘要、涉密搜索边界已自动化;经理人工确认项目入口可理解。","合同台账页面本轮只验证入口,没有当前 trialrun 下的浏览/编辑证据;真实项目创建与成员协同未重跑。","A4 可补项目详情与合同台账只读 smoke;重交互保持后置。" "项目、合同台账与涉密边界","must_cover","/projects|/projects/:projectId|/contracts-registry","manager|admin|project roles","PROJECT_DOMAIN_ENABLED|PROJECT_LINKING_ENABLED|PROJECT_COMMUNICATION_LOG_ENABLED|PROJECT_CLOSURE_CHECKLIST_ENABLED|CONFIDENTIAL_DOC_REFS_ENABLED","project_domain_v1|project_linking_v1|project_communication_log_v1|project_closure_checklist_v1|confidential_doc_refs_v1","partial","docs/trialrun/manual-trialrun-report.md|client/tests/e2e/project-workbench.spec.ts|client/tests/e2e/confidential-boundary.spec.ts|client/tests/e2e/manual/r70-trialrun-assist.spec.ts","项目工作台沟通回填、收口面板、Portal 摘要、涉密搜索边界已自动化;经理人工确认项目入口可理解。","合同台账页面本轮只验证入口,没有当前 trialrun 下的浏览/编辑证据;真实项目创建与成员协同未重跑。","A4 可补项目详情与合同台账只读 smoke;重交互保持后置。"
"采购","enabled_admin","/purchase-requests","employee|manager|finance","none","none","partial_done","artifacts/r69/acceptance-report.md|client/tests/e2e/procurement-flow.spec.ts|issues/2026-03-24_17-00-26-r33-3-transaction-timeout-tail-cleanup.csv","员工提单、经理审批、财务归档链路已自动化通过,且事务超时问题已收口。","未进入 R70 人工试运行,当前 trialrun DB 下没有业务体验反馈。","若采购进入试运行范围,先补一次人工 happy path;否则保留自动化证据即可。" "采购","enabled_admin","/purchase-requests","employee|manager|finance","none","none","partial_done","artifacts/r69/acceptance-report.md|client/tests/e2e/procurement-flow.spec.ts|issues/2026-03-24_17-00-26-r33-3-transaction-timeout-tail-cleanup.csv","员工提单、经理审批、财务归档链路已自动化通过,且事务超时问题已收口。","未进入 R70 人工试运行,当前 trialrun DB 下没有业务体验反馈。","若采购进入试运行范围,先补一次人工 happy path;否则保留自动化证据即可。"
"资产与盘点","enabled_admin","/assets|/inventory-checks|/mobile/assets/scan","employee|asset admin","none","none","partial_done","artifacts/r69/acceptance-report.md|client/tests/e2e/assets-flow.spec.ts|issues/2026-03-24_17-00-26-r33-3-transaction-timeout-tail-cleanup.csv","资产建卡、领用归还、调拨、盘点主链路已自动化通过。","未进入 R70 人工试运行;移动扫描真实设备与摄像头场景未验证。","保持自动化证据;真实移动扫描转 A5 或独立移动专项。" "资产与盘点","enabled_admin","/assets|/inventory-checks|/mobile/assets/scan","employee|asset admin","none","none","partial_done","artifacts/r69/acceptance-report.md|client/tests/e2e/assets-flow.spec.ts|issues/2026-03-24_17-00-26-r33-3-transaction-timeout-tail-cleanup.csv","资产建卡、领用归还、调拨、盘点主链路已自动化通过。","未进入 R70 人工试运行;移动扫描真实设备与摄像头场景未验证。","保持自动化证据;真实移动扫描转 A5 或独立移动专项。"
"差旅与移动审批","enabled_admin","/travel-requests|/mobile/approvals|/mobile/capture","employee|manager|finance","WECOM_ENTRY_ENABLED","wecom_entry_v1","partial_done","artifacts/r69/acceptance-report.md|client/tests/e2e/travel-payment-flow.spec.ts|client/tests/e2e/travel-reconciliation-flow.spec.ts|client/tests/e2e/mobile-approvals-offline.spec.ts|artifacts/r70/manual-trialrun-report.md","差旅申请、审批、支付、绑票、对账批次,以及移动审批 deep link 离线重放都有自动化证据;R70 人工仅确认移动入口可理解。","真实 IM deep link、真实移动设备拍照上传、多人并发审批未验证。","保留自动化为主;真实设备和 IM 深链并入 A5。" "差旅与移动审批","enabled_admin","/travel-requests|/mobile/approvals|/mobile/capture","employee|manager|finance","WECOM_ENTRY_ENABLED","wecom_entry_v1","partial_done","artifacts/r69/acceptance-report.md|client/tests/e2e/travel-payment-flow.spec.ts|client/tests/e2e/travel-reconciliation-flow.spec.ts|client/tests/e2e/mobile-approvals-offline.spec.ts|docs/trialrun/manual-trialrun-report.md","差旅申请、审批、支付、绑票、对账批次,以及移动审批 deep link 离线重放都有自动化证据;R70 人工仅确认移动入口可理解。","真实 IM deep link、真实移动设备拍照上传、多人并发审批未验证。","保留自动化为主;真实设备和 IM 深链并入 A5。"
"预算、支付批次与 AP 运营","optional","/budgets|/payment-batches|/ap-operations","finance|admin","BUDGET_PRECHECK_ENABLED|PAYMENT_BATCH_ENABLED|ERP_SYNC_ENABLED","budget_precheck_v1|payment_batch_v1|erp_sync","partial_done","issues/2026-03-29_08-07-14-p25-lite-budget-ap.csv|issues/2026-04-06_r52-ap-operations.csv|issues/2026-04-29_10-14-27-r78-reimbursement-payment-tail.csv|client/tests/e2e/reimbursement-payment-batch-flow.spec.ts|server/scripts/regression-payment-batches.sh","支付批次 maker-checker、AP 待付款快捷复核、finance 执行报销付款批次,以及 reimbursement paid 后 ERP preview pending outbox 已在本地 focused regression 跑通;历史 budget/AP 视图与 review 证据仍保留。","预算预检页面级联动、高风险两轮复核、大额批次与非报销实体付款未在本轮 focused local 回归中重跑。","若财务域继续扩大试运行,再补 budget precheck 与高风险二次复核专项;当前 payment batch/AP happy path 已具备本地回归证据。" "预算、支付批次与 AP 运营","optional","/budgets|/payment-batches|/ap-operations","finance|admin","BUDGET_PRECHECK_ENABLED|PAYMENT_BATCH_ENABLED|ERP_SYNC_ENABLED","budget_precheck_v1|payment_batch_v1|erp_sync","partial_done","issues/2026-03-29_08-07-14-p25-lite-budget-ap.csv|issues/2026-04-06_r52-ap-operations.csv|issues/2026-04-29_10-14-27-r78-reimbursement-payment-tail.csv|client/tests/e2e/reimbursement-payment-batch-flow.spec.ts|server/scripts/regression-payment-batches.sh","支付批次 maker-checker、AP 待付款快捷复核、finance 执行报销付款批次,以及 reimbursement paid 后 ERP preview pending outbox 已在本地 focused regression 跑通;历史 budget/AP 视图与 review 证据仍保留。","预算预检页面级联动、高风险两轮复核、大额批次与非报销实体付款未在本轮 focused local 回归中重跑。","若财务域继续扩大试运行,再补 budget precheck 与高风险二次复核专项;当前 payment batch/AP happy path 已具备本地回归证据。"
"ERP 集成与切换控制台","external","/system/integrations/erp|/system/cutover","integration admin|system.settings","ERP_SYNC_ENABLED|CUTOVER_CONSOLE_ENABLED","erp_sync|cutover_console_v1","partial_external","issues/2026-03-08_14-10-53-p19-erp-1-l5-masterdata-journal-bridge.csv|issues/2026-03-21_11-10-00-p29-replacement-readiness-refresh.csv|client/tests/e2e/live-smoke.spec.ts","ERP 管理页、mock/http 回归和只读 live smoke 有历史证据。","当前本地 trialrun 没有真实 ERP 出入站或 cutover 操作验证。","仅在外部环境专项下执行,不进入默认 trialrun gate。" "ERP 集成与切换控制台","external","/system/integrations/erp|/system/cutover","integration admin|system.settings","ERP_SYNC_ENABLED|CUTOVER_CONSOLE_ENABLED","erp_sync|cutover_console_v1","partial_external","issues/2026-03-08_14-10-53-p19-erp-1-l5-masterdata-journal-bridge.csv|issues/2026-03-21_11-10-00-p29-replacement-readiness-refresh.csv|client/tests/e2e/live-smoke.spec.ts","ERP 管理页、mock/http 回归和只读 live smoke 有历史证据。","当前本地 trialrun 没有真实 ERP 出入站或 cutover 操作验证。","仅在外部环境专项下执行,不进入默认 trialrun gate。"
"系统治理、功能开关与审计","enabled_admin","/system/workspace|/system/settings|/system/feature-flags|/system/workflow-definitions|/audit-logs|/system/notification-channels","admin","WORKFLOW_DEFINITION_ADMIN_ENABLED","workflow_definition_admin_v1","partial_done","artifacts/r70/manual-trialrun-report.md|client/tests/e2e/settings-governance.spec.ts|client/tests/e2e/live-smoke.spec.ts|server/src/scripts/smoke-trialrun-runtime.js|client/tests/e2e/r75-automation-gap-fill.spec.ts|issues/2026-05-05_20-01-18-r90-r91-trialrun-closeout.csv","工作区设置、系统设置、功能开关、审计日志打开与导航边界有自动化和人工证据;R74 本地门禁已检查 workspace/flag/navigation 基线,R75 已补功能开关备注保存并恢复写路径。R80 已把 `wecom_entry_v1` 从 `force_off` 调整为 `inherit`,R90 已把旧公网诊断从当前事实中剥离。","流程定义、通知渠道、工作区其他写操作和审计留痕写入效果仍未在当前 trialrun 做完整专项;公网 `announcements_v1` / `global_search_v1` 仍需在 live smoke 中重新核对。","保留 partial_done;R90/R91 先收口公网 feature flag 与 live smoke,再补通知渠道与流程定义写路径。" "系统治理、功能开关与审计","enabled_admin","/system/workspace|/system/settings|/system/feature-flags|/system/workflow-definitions|/audit-logs|/system/notification-channels","admin","WORKFLOW_DEFINITION_ADMIN_ENABLED","workflow_definition_admin_v1","partial_done","docs/trialrun/manual-trialrun-report.md|client/tests/e2e/settings-governance.spec.ts|client/tests/e2e/live-smoke.spec.ts|server/src/scripts/smoke-trialrun-runtime.js|client/tests/e2e/r75-automation-gap-fill.spec.ts|issues/2026-05-05_20-01-18-r90-r91-trialrun-closeout.csv","工作区设置、系统设置、功能开关、审计日志打开与导航边界有自动化和人工证据;R74 本地门禁已检查 workspace/flag/navigation 基线,R75 已补功能开关备注保存并恢复写路径。R80 已把 `wecom_entry_v1` 从 `force_off` 调整为 `inherit`,R90 已把旧公网诊断从当前事实中剥离。","流程定义、通知渠道、工作区其他写操作和审计留痕写入效果仍未在当前 trialrun 做完整专项;公网 `announcements_v1` / `global_search_v1` 仍需在 live smoke 中重新核对。","保留 partial_done;R90/R91 先收口公网 feature flag 与 live smoke,再补通知渠道与流程定义写路径。"
"企微、HTTPS、部署态与并发","external","/login(企微入口)|部署运行时|多账号并发","all roles","APP_ORIGIN|COOKIE_SECURE|WECOM_*|PUBLIC_SECURITY_HARDENING_ENABLED","wecom_entry_v1|public_security_hardening_v1","partial_done","deploy/trialrun/runbook.md|client/tests/e2e/wecom-entry.spec.ts|client/tests/e2e/live-smoke.spec.ts|client/tests/e2e/r89-mobile-login-navigation.spec.ts|server/src/scripts/smoke-trialrun-runtime.js|issues/2026-05-04_16-47-46-r80-live-wecom-enablement.csv|issues/2026-05-04_20-53-39-r82-wecom-userid-compatibility.csv|issues/2026-05-04_23-36-10-r83-r86-user-onboarding-simplify.csv|issues/2026-05-05_14-01-13-r87-wecom-session-hint.csv|issues/2026-05-05_14-12-50-r88-wecom-device-fingerprint.csv|issues/2026-05-05_17-35-00-r89-mobile-login-ux.csv|issues/2026-05-05_20-01-18-r90-r91-trialrun-closeout.csv","本地/只读 smoke、env contract、导航/入口提示与 local runtime gate 已就绪;`https://oa.hyinda.com/ready` 已通过只读探活。R80 已启用公网企微 env 与 `wecom_entry_v1=inherit`;R82-R88 已修复真实 UserId 兼容、首次绑定、会话提示与设备指纹;R89 已完成本地移动登录与导航自动化。","公网仍需部署最新 R89/R90 并用真实手机企业微信复核 `/mobile` 落点;HTTPS cookie secure、独立 smoke 账号 live smoke 和多用户并发协同仍缺最终证据。","企微不再按外部阻塞处理;R90/R91 继续推进公网最新版本部署、`returnTo=/mobile`、live smoke、备份恢复和并发专项。" "企微、HTTPS、部署态与并发","external","/login(企微入口)|部署运行时|多账号并发","all roles","APP_ORIGIN|COOKIE_SECURE|WECOM_*|PUBLIC_SECURITY_HARDENING_ENABLED","wecom_entry_v1|public_security_hardening_v1","partial_done","deploy/trialrun/runbook.md|client/tests/e2e/wecom-entry.spec.ts|client/tests/e2e/live-smoke.spec.ts|client/tests/e2e/r89-mobile-login-navigation.spec.ts|server/src/scripts/smoke-trialrun-runtime.js|issues/2026-05-04_16-47-46-r80-live-wecom-enablement.csv|issues/2026-05-04_20-53-39-r82-wecom-userid-compatibility.csv|issues/2026-05-04_23-36-10-r83-r86-user-onboarding-simplify.csv|issues/2026-05-05_14-01-13-r87-wecom-session-hint.csv|issues/2026-05-05_14-12-50-r88-wecom-device-fingerprint.csv|issues/2026-05-05_17-35-00-r89-mobile-login-ux.csv|issues/2026-05-05_20-01-18-r90-r91-trialrun-closeout.csv","本地/只读 smoke、env contract、导航/入口提示与 local runtime gate 已就绪;`https://oa.hyinda.com/ready` 已通过只读探活。R80 已启用公网企微 env 与 `wecom_entry_v1=inherit`;R82-R88 已修复真实 UserId 兼容、首次绑定、会话提示与设备指纹;R89 已完成本地移动登录与导航自动化。","公网仍需部署最新 R89/R90 并用真实手机企业微信复核 `/mobile` 落点;HTTPS cookie secure、独立 smoke 账号 live smoke 和多用户并发协同仍缺最终证据。","企微不再按外部阻塞处理;R90/R91 继续推进公网最新版本部署、`returnTo=/mobile`、live smoke、备份恢复和并发专项。"
1 Domain Tier Routes Primary_Roles Env_Gates Feature_Flags Coverage_Status Evidence Validated_Flows Gaps Next_Action
2 认证与 Portal 导航 must_cover /login|/portal|主/管/备导航 employee|manager|admin APP_ORIGIN|COOKIE_SECURE|PORTAL_HOME_ENABLED|WECOM_ENTRY_ENABLED portal_home_v1|wecom_entry_v1 done artifacts/r69/acceptance-report.md|artifacts/r70/manual-trialrun-report.md|client/tests/e2e/login-portal-ux.spec.ts|client/tests/e2e/wecom-entry.spec.ts|client/tests/e2e/manual/r70-trialrun-assist.spec.ts artifacts/r69/acceptance-report.md|docs/trialrun/manual-trialrun-report.md|client/tests/e2e/login-portal-ux.spec.ts|client/tests/e2e/wecom-entry.spec.ts|client/tests/e2e/manual/r70-trialrun-assist.spec.ts 登录、Portal 首屏、员工/经理/管理员导航分组、普通浏览器与企微 WebView CTA 提示均有自动化或人工证据。 真实企微 OAuth 绑定与回跳未做端到端;HTTPS 部署态 cookie 行为未在本轮验证。 保持主链路 done;真实企微与 HTTPS 转 A5 外部专项。
3 请假与审批 must_cover /leave-requests|/workflow/tasks employee|manager|admin none leave_holiday_calendar done artifacts/r69/acceptance-report.md|artifacts/r70/manual-trialrun-report.md|client/tests/e2e/leave-flow.spec.ts|client/tests/e2e/workflow-quick-approve.spec.ts|client/tests/e2e/leave-team-calendar.spec.ts artifacts/r69/acceptance-report.md|docs/trialrun/manual-trialrun-report.md|client/tests/e2e/leave-flow.spec.ts|client/tests/e2e/workflow-quick-approve.spec.ts|client/tests/e2e/leave-team-calendar.spec.ts 请假草稿、提交、撤回、经理快捷审批、团队日历权限边界与经理部门视角已自动化并在 R70 人工复测通过。 多审批人链路、代理审批、真实并发多人协同未在 trialrun 轮次验证。 维持 done;多人协同与代理审批并入 A5 或后续专项。
4 报销、票据中心与 OCR must_cover /reimbursements|/reimbursements/:id|/invoice-pool employee|manager|finance|admin OCR_PROVIDER|TENCENT_SECRET_ID|TENCENT_SECRET_KEY|PAYMENT_BATCH_ENABLED|ERP_SYNC_ENABLED invoice_verification|payment_batch_v1|erp_sync done artifacts/r70/manual-trialrun-report.md|artifacts/r70/live-ocr-batch-report.md|issues/2026-04-29_08-39-22-r76-external-trialrun-closeout.csv|issues/2026-04-29_09-19-07-r77-ocr-pdf-first.csv|issues/2026-04-29_10-14-27-r78-reimbursement-payment-tail.csv|client/tests/e2e/reimbursement-workflow-progress.spec.ts|client/tests/e2e/invoice-ocr-flow.spec.ts|client/tests/e2e/reimbursement-payment-batch-flow.spec.ts|client/tests/e2e/manual/live-invoice-ocr.spec.ts|client/tests/e2e/manual/live-invoice-ocr-batch.spec.ts|server/scripts/regression-payment-batches.sh docs/trialrun/manual-trialrun-report.md|artifacts/r70/live-ocr-batch-report.md|issues/2026-04-29_08-39-22-r76-external-trialrun-closeout.csv|issues/2026-04-29_09-19-07-r77-ocr-pdf-first.csv|issues/2026-04-29_10-14-27-r78-reimbursement-payment-tail.csv|client/tests/e2e/reimbursement-workflow-progress.spec.ts|client/tests/e2e/invoice-ocr-flow.spec.ts|client/tests/e2e/reimbursement-payment-batch-flow.spec.ts|client/tests/e2e/manual/live-invoice-ocr.spec.ts|client/tests/e2e/manual/live-invoice-ocr-batch.spec.ts|server/scripts/regression-payment-batches.sh 报销提交后审批进度、票据中心缺字段修正、上传后自动 OCR 进入可绑定、绑定后提交已自动化;R70 人工链路也通过。R77 已在干净本地 trialrun DB 上用真实 PDF 发票跑通 `上传 -> OCR -> available`。R78 已补 employee->manager->finance->finance_mgr->payment batch->execute->reimbursement paid->invoice archived->ERP preview pending outbox focused regression。 真实 ERP 投递回执、高风险两轮复核、大额或混合付款批次仍未进入本轮本地试运行;腾讯 OCR 凭证仍依赖旧项目运行时注入。 维持 done;真实 ERP 与高风险付款转外部/专项回归,PDF 转图片 fallback 仅在新增票样兼容性问题出现时再评估。
5 周报与待办 must_cover /weekly-reports|/todos employee|manager WEEKLY_REPORT_ENABLED|TODO_BOARD_ENABLED weekly_report_v1|todo_board_v1 done artifacts/r70/auto-trialrun-deep-report.md|artifacts/r70/manual-trialrun-report.md|client/tests/e2e/weekly-todo-flow.spec.ts|client/tests/e2e/manual/r70-trialrun-deep-assist.spec.ts artifacts/r70/auto-trialrun-deep-report.md|docs/trialrun/manual-trialrun-report.md|client/tests/e2e/weekly-todo-flow.spec.ts|client/tests/e2e/manual/r70-trialrun-deep-assist.spec.ts 周报保存、生成待办、提交周报、完成待办闭环已自动化且在真实 trialrun 数据上复核通过。 经理侧未提交周报聚合与催办策略未单独验证。 维持 done;如进入管理场景增强,再补经理视角聚合。
6 公告、搜索与通知 must_cover /announcements|/notifications|全局搜索 employee|manager|admin ANNOUNCEMENTS_ENABLED|GLOBAL_SEARCH_ENABLED announcements_v1|global_search_v1 done artifacts/r70/auto-trialrun-deep-report.md|artifacts/r70/manual-trialrun-report.md|client/tests/e2e/announcements-presence.spec.ts|client/tests/e2e/global-search.spec.ts|client/tests/e2e/manual/r70-trialrun-deep-assist.spec.ts|client/tests/e2e/r75-automation-gap-fill.spec.ts artifacts/r70/auto-trialrun-deep-report.md|docs/trialrun/manual-trialrun-report.md|client/tests/e2e/announcements-presence.spec.ts|client/tests/e2e/global-search.spec.ts|client/tests/e2e/manual/r70-trialrun-deep-assist.spec.ts|client/tests/e2e/r75-automation-gap-fill.spec.ts 公告发布、员工可见、Portal 汇总、真实搜索命中公告并跳转,以及通知中心未读筛选、单条已读、全部已读与待办跳转均有自动化或人工证据。 无当前试运行阻断缺口;真实外发渠道投递与通知渠道配置验证另见系统治理和外部环境项。 站内通知维持 done;外发渠道留在 A5/治理专项。
7 团队状态与考勤 must_cover /team|/attendance employee|manager|admin PRESENCE_BOARD_ENABLED|ATTENDANCE_ENABLED presence_board_v1|attendance_v1 done artifacts/r70/manual-trialrun-report.md|client/tests/e2e/announcements-presence.spec.ts|issues/2026-04-09_r59-attendance-clockin.csv|client/tests/e2e/r75-automation-gap-fill.spec.ts docs/trialrun/manual-trialrun-report.md|client/tests/e2e/announcements-presence.spec.ts|issues/2026-04-09_r59-attendance-clockin.csv|client/tests/e2e/r75-automation-gap-fill.spec.ts 团队状态更新、Portal 汇总、经理查看团队状态,以及员工今日上班/下班打卡、月视图记录、管理员团队考勤补卡最小链路均已验证。 排班、节假日豁免、跨日班次等复杂考勤规则未做专项回归,但不构成本轮 trialrun 阻断。 维持 done;复杂考勤规则按需要独立专项。
8 人员、组织、生命周期与绩效 must_cover /people|/organization|/people/:employeeId|/performance admin|manager|employee EMPLOYEE_LIFECYCLE_ENABLED employee_lifecycle_v1 partial_done artifacts/r70/manual-trialrun-report.md|issues/2026-03-21_12-10-00-r14-people-lifecycle.csv|issues/2026-03-29_r46-performance-review.csv|issues/2026-03-28_17-12-07-r40-profile-edit-and-people-export.csv|client/tests/e2e/r75-automation-gap-fill.spec.ts docs/trialrun/manual-trialrun-report.md|issues/2026-03-21_12-10-00-r14-people-lifecycle.csv|issues/2026-03-29_r46-performance-review.csv|issues/2026-03-28_17-12-07-r40-profile-edit-and-people-export.csv|client/tests/e2e/r75-automation-gap-fill.spec.ts 管理员已人工打开人员管理与组织架构;当前 trialrun 已新增‘创建临时员工 -> 发起入职 -> 转正’轻量 happy path,生命周期、档案、导出、绩效权限边界仍保留历史 QA 与回归证据。 离职/资产交接完整链路、员工自助档案修改和直属上级绩效评分未在本轮重验。 lifecycle 基线已补齐;离职交接与绩效真实操作留后续 focused regression。
9 项目、合同台账与涉密边界 must_cover /projects|/projects/:projectId|/contracts-registry manager|admin|project roles PROJECT_DOMAIN_ENABLED|PROJECT_LINKING_ENABLED|PROJECT_COMMUNICATION_LOG_ENABLED|PROJECT_CLOSURE_CHECKLIST_ENABLED|CONFIDENTIAL_DOC_REFS_ENABLED project_domain_v1|project_linking_v1|project_communication_log_v1|project_closure_checklist_v1|confidential_doc_refs_v1 partial artifacts/r70/manual-trialrun-report.md|client/tests/e2e/project-workbench.spec.ts|client/tests/e2e/confidential-boundary.spec.ts|client/tests/e2e/manual/r70-trialrun-assist.spec.ts docs/trialrun/manual-trialrun-report.md|client/tests/e2e/project-workbench.spec.ts|client/tests/e2e/confidential-boundary.spec.ts|client/tests/e2e/manual/r70-trialrun-assist.spec.ts 项目工作台沟通回填、收口面板、Portal 摘要、涉密搜索边界已自动化;经理人工确认项目入口可理解。 合同台账页面本轮只验证入口,没有当前 trialrun 下的浏览/编辑证据;真实项目创建与成员协同未重跑。 A4 可补项目详情与合同台账只读 smoke;重交互保持后置。
10 采购 enabled_admin /purchase-requests employee|manager|finance none none partial_done artifacts/r69/acceptance-report.md|client/tests/e2e/procurement-flow.spec.ts|issues/2026-03-24_17-00-26-r33-3-transaction-timeout-tail-cleanup.csv 员工提单、经理审批、财务归档链路已自动化通过,且事务超时问题已收口。 未进入 R70 人工试运行,当前 trialrun DB 下没有业务体验反馈。 若采购进入试运行范围,先补一次人工 happy path;否则保留自动化证据即可。
11 资产与盘点 enabled_admin /assets|/inventory-checks|/mobile/assets/scan employee|asset admin none none partial_done artifacts/r69/acceptance-report.md|client/tests/e2e/assets-flow.spec.ts|issues/2026-03-24_17-00-26-r33-3-transaction-timeout-tail-cleanup.csv 资产建卡、领用归还、调拨、盘点主链路已自动化通过。 未进入 R70 人工试运行;移动扫描真实设备与摄像头场景未验证。 保持自动化证据;真实移动扫描转 A5 或独立移动专项。
12 差旅与移动审批 enabled_admin /travel-requests|/mobile/approvals|/mobile/capture employee|manager|finance WECOM_ENTRY_ENABLED wecom_entry_v1 partial_done artifacts/r69/acceptance-report.md|client/tests/e2e/travel-payment-flow.spec.ts|client/tests/e2e/travel-reconciliation-flow.spec.ts|client/tests/e2e/mobile-approvals-offline.spec.ts|artifacts/r70/manual-trialrun-report.md artifacts/r69/acceptance-report.md|client/tests/e2e/travel-payment-flow.spec.ts|client/tests/e2e/travel-reconciliation-flow.spec.ts|client/tests/e2e/mobile-approvals-offline.spec.ts|docs/trialrun/manual-trialrun-report.md 差旅申请、审批、支付、绑票、对账批次,以及移动审批 deep link 离线重放都有自动化证据;R70 人工仅确认移动入口可理解。 真实 IM deep link、真实移动设备拍照上传、多人并发审批未验证。 保留自动化为主;真实设备和 IM 深链并入 A5。
13 预算、支付批次与 AP 运营 optional /budgets|/payment-batches|/ap-operations finance|admin BUDGET_PRECHECK_ENABLED|PAYMENT_BATCH_ENABLED|ERP_SYNC_ENABLED budget_precheck_v1|payment_batch_v1|erp_sync partial_done issues/2026-03-29_08-07-14-p25-lite-budget-ap.csv|issues/2026-04-06_r52-ap-operations.csv|issues/2026-04-29_10-14-27-r78-reimbursement-payment-tail.csv|client/tests/e2e/reimbursement-payment-batch-flow.spec.ts|server/scripts/regression-payment-batches.sh 支付批次 maker-checker、AP 待付款快捷复核、finance 执行报销付款批次,以及 reimbursement paid 后 ERP preview pending outbox 已在本地 focused regression 跑通;历史 budget/AP 视图与 review 证据仍保留。 预算预检页面级联动、高风险两轮复核、大额批次与非报销实体付款未在本轮 focused local 回归中重跑。 若财务域继续扩大试运行,再补 budget precheck 与高风险二次复核专项;当前 payment batch/AP happy path 已具备本地回归证据。
14 ERP 集成与切换控制台 external /system/integrations/erp|/system/cutover integration admin|system.settings ERP_SYNC_ENABLED|CUTOVER_CONSOLE_ENABLED erp_sync|cutover_console_v1 partial_external issues/2026-03-08_14-10-53-p19-erp-1-l5-masterdata-journal-bridge.csv|issues/2026-03-21_11-10-00-p29-replacement-readiness-refresh.csv|client/tests/e2e/live-smoke.spec.ts ERP 管理页、mock/http 回归和只读 live smoke 有历史证据。 当前本地 trialrun 没有真实 ERP 出入站或 cutover 操作验证。 仅在外部环境专项下执行,不进入默认 trialrun gate。
15 系统治理、功能开关与审计 enabled_admin /system/workspace|/system/settings|/system/feature-flags|/system/workflow-definitions|/audit-logs|/system/notification-channels admin WORKFLOW_DEFINITION_ADMIN_ENABLED workflow_definition_admin_v1 partial_done artifacts/r70/manual-trialrun-report.md|client/tests/e2e/settings-governance.spec.ts|client/tests/e2e/live-smoke.spec.ts|server/src/scripts/smoke-trialrun-runtime.js|client/tests/e2e/r75-automation-gap-fill.spec.ts|issues/2026-05-05_20-01-18-r90-r91-trialrun-closeout.csv docs/trialrun/manual-trialrun-report.md|client/tests/e2e/settings-governance.spec.ts|client/tests/e2e/live-smoke.spec.ts|server/src/scripts/smoke-trialrun-runtime.js|client/tests/e2e/r75-automation-gap-fill.spec.ts|issues/2026-05-05_20-01-18-r90-r91-trialrun-closeout.csv 工作区设置、系统设置、功能开关、审计日志打开与导航边界有自动化和人工证据;R74 本地门禁已检查 workspace/flag/navigation 基线,R75 已补功能开关备注保存并恢复写路径。R80 已把 `wecom_entry_v1` 从 `force_off` 调整为 `inherit`,R90 已把旧公网诊断从当前事实中剥离。 流程定义、通知渠道、工作区其他写操作和审计留痕写入效果仍未在当前 trialrun 做完整专项;公网 `announcements_v1` / `global_search_v1` 仍需在 live smoke 中重新核对。 保留 partial_done;R90/R91 先收口公网 feature flag 与 live smoke,再补通知渠道与流程定义写路径。
16 企微、HTTPS、部署态与并发 external /login(企微入口)|部署运行时|多账号并发 all roles APP_ORIGIN|COOKIE_SECURE|WECOM_*|PUBLIC_SECURITY_HARDENING_ENABLED wecom_entry_v1|public_security_hardening_v1 partial_done deploy/trialrun/runbook.md|client/tests/e2e/wecom-entry.spec.ts|client/tests/e2e/live-smoke.spec.ts|client/tests/e2e/r89-mobile-login-navigation.spec.ts|server/src/scripts/smoke-trialrun-runtime.js|issues/2026-05-04_16-47-46-r80-live-wecom-enablement.csv|issues/2026-05-04_20-53-39-r82-wecom-userid-compatibility.csv|issues/2026-05-04_23-36-10-r83-r86-user-onboarding-simplify.csv|issues/2026-05-05_14-01-13-r87-wecom-session-hint.csv|issues/2026-05-05_14-12-50-r88-wecom-device-fingerprint.csv|issues/2026-05-05_17-35-00-r89-mobile-login-ux.csv|issues/2026-05-05_20-01-18-r90-r91-trialrun-closeout.csv 本地/只读 smoke、env contract、导航/入口提示与 local runtime gate 已就绪;`https://oa.hyinda.com/ready` 已通过只读探活。R80 已启用公网企微 env 与 `wecom_entry_v1=inherit`;R82-R88 已修复真实 UserId 兼容、首次绑定、会话提示与设备指纹;R89 已完成本地移动登录与导航自动化。 公网仍需部署最新 R89/R90 并用真实手机企业微信复核 `/mobile` 落点;HTTPS cookie secure、独立 smoke 账号 live smoke 和多用户并发协同仍缺最终证据。 企微不再按外部阻塞处理;R90/R91 继续推进公网最新版本部署、`returnTo=/mobile`、live smoke、备份恢复和并发专项。
@@ -0,0 +1,5 @@
ID,Title,Description,Acceptance,Test_Method,Tools,Dev_Status,Review1_Status,Regression_Status,Files,Dependencies,Notes
A1,"确认artifacts跟踪范围","扫描当前 artifacts 已跟踪文件、引用位置和本地忽略规则,明确哪些需要迁移为事实源、哪些只保留本地产物。","1) 列出 artifacts 已跟踪数量;2) 找出 docs/issues 中对 artifacts 的引用;3) 不删除本地文件。","命令:git ls-files artifacts;rg -n 'artifacts/' docs issues AGENTS.md .agents;业务流程:确认清理不会丢失试运行事实源。","git|rg",DONE,DONE,DONE,"artifacts|docs|issues|.gitignore","[]","当前 artifacts 有历史报告和截图误入 git;本轮只改变 git 跟踪状态,不删除本地 artifacts。"
A2,"迁移试运行事实源到docs","将仍被项目文档引用的 coverage matrix 和 manual trialrun report 迁移到 docs 下,避免继续依赖 artifacts 作为事实源。","1) docs 下存在覆盖矩阵和试运行报告;2) docs/architecture、implementation_plan、feature-matrix、issues/README 引用更新;3) artifacts 目录不再作为事实源入口。","命令:rg -n 'artifacts/r75/coverage-matrix.csv|artifacts/r70/manual-trialrun-report.md' docs issues AGENTS.md .agents;业务流程:后续阅读项目现状时从 docs 获取结论。","git|rg",DONE,DONE,DONE,"docs|issues/README.md|artifacts/r75/coverage-matrix.csv|artifacts/r70/manual-trialrun-report.md","[""A1""]","已用 git mv 迁移到 docs/trialrun/,并更新当前文档入口引用;历史 Issue CSV 不批量改写。"
A3,"忽略并移除artifacts索引","更新 .gitignore 忽略 artifacts,并从 git 索引移除 artifacts 其余文件,同时保留工作区本地文件。","1) .gitignore 忽略 artifacts/;2) git ls-files artifacts 为空;3) 本地 artifacts 目录仍存在;4) 历史脏 report 文件不再出现在 git status。","命令:git rm --cached -r artifacts;git ls-files artifacts;test -d artifacts;git status --short;业务流程:后续自动化生成报告不会污染提交。","git",DONE,DONE,DONE,".gitignore|artifacts","[""A2""]","已执行 git rm --cached -r artifacts;未执行 rm -rf,工作区 artifacts 目录仍存在且被忽略。"
A4,"清理验证与中文提交","校验 Issue CSV、文档引用、diff whitespace 和仓库状态,并用中文 commit 提交。","1) Issue CSV 校验通过;2) artifacts 引用已迁移;3) git diff --check 通过;4) 中文 commit 引用 R122。","命令:python3 validate_issues_csv.py;rg artifacts 引用;git diff --check;git status --short;业务流程:仓库干净且 artifacts 不再纳入版本管理。","python|git|rg",DONE,DONE,DONE,"issues|docs|.gitignore","[""A2"",""A3""]","已用 validate_issues_csv、validate-feature-matrix、rg 和 git diff --check 验证;仓库无 check-doc-links 脚本。"
1 ID Title Description Acceptance Test_Method Tools Dev_Status Review1_Status Regression_Status Files Dependencies Notes
2 A1 确认artifacts跟踪范围 扫描当前 artifacts 已跟踪文件、引用位置和本地忽略规则,明确哪些需要迁移为事实源、哪些只保留本地产物。 1) 列出 artifacts 已跟踪数量;2) 找出 docs/issues 中对 artifacts 的引用;3) 不删除本地文件。 命令:git ls-files artifacts;rg -n 'artifacts/' docs issues AGENTS.md .agents;业务流程:确认清理不会丢失试运行事实源。 git|rg DONE DONE DONE artifacts|docs|issues|.gitignore [] 当前 artifacts 有历史报告和截图误入 git;本轮只改变 git 跟踪状态,不删除本地 artifacts。
3 A2 迁移试运行事实源到docs 将仍被项目文档引用的 coverage matrix 和 manual trialrun report 迁移到 docs 下,避免继续依赖 artifacts 作为事实源。 1) docs 下存在覆盖矩阵和试运行报告;2) docs/architecture、implementation_plan、feature-matrix、issues/README 引用更新;3) artifacts 目录不再作为事实源入口。 命令:rg -n 'artifacts/r75/coverage-matrix.csv|artifacts/r70/manual-trialrun-report.md' docs issues AGENTS.md .agents;业务流程:后续阅读项目现状时从 docs 获取结论。 git|rg DONE DONE DONE docs|issues/README.md|artifacts/r75/coverage-matrix.csv|artifacts/r70/manual-trialrun-report.md ["A1"] 已用 git mv 迁移到 docs/trialrun/,并更新当前文档入口引用;历史 Issue CSV 不批量改写。
4 A3 忽略并移除artifacts索引 更新 .gitignore 忽略 artifacts,并从 git 索引移除 artifacts 其余文件,同时保留工作区本地文件。 1) .gitignore 忽略 artifacts/;2) git ls-files artifacts 为空;3) 本地 artifacts 目录仍存在;4) 历史脏 report 文件不再出现在 git status。 命令:git rm --cached -r artifacts;git ls-files artifacts;test -d artifacts;git status --short;业务流程:后续自动化生成报告不会污染提交。 git DONE DONE DONE .gitignore|artifacts ["A2"] 已执行 git rm --cached -r artifacts;未执行 rm -rf,工作区 artifacts 目录仍存在且被忽略。
5 A4 清理验证与中文提交 校验 Issue CSV、文档引用、diff whitespace 和仓库状态,并用中文 commit 提交。 1) Issue CSV 校验通过;2) artifacts 引用已迁移;3) git diff --check 通过;4) 中文 commit 引用 R122。 命令:python3 validate_issues_csv.py;rg artifacts 引用;git diff --check;git status --short;业务流程:仓库干净且 artifacts 不再纳入版本管理。 python|git|rg DONE DONE DONE issues|docs|.gitignore ["A2","A3"] 已用 validate_issues_csv、validate-feature-matrix、rg 和 git diff --check 验证;仓库无 check-doc-links 脚本。
+1 -1
查看文件
@@ -48,7 +48,7 @@
- **当前执行合同**:优先查看时间最新且已批准的 `issues/*.csv`;当前治理收口入口为 [2026-05-05_20-01-18-r90-r91-trialrun-closeout.csv](/home/shunli/Projects/hyb-oa/issues/2026-05-05_20-01-18-r90-r91-trialrun-closeout.csv:1)。 - **当前执行合同**:优先查看时间最新且已批准的 `issues/*.csv`;当前治理收口入口为 [2026-05-05_20-01-18-r90-r91-trialrun-closeout.csv](/home/shunli/Projects/hyb-oa/issues/2026-05-05_20-01-18-r90-r91-trialrun-closeout.csv:1)。
- **历史蓝图链**:P5 相关只把 [2026-02-09_13-39-02-p5-blueprint-v3.csv](/home/shunli/Projects/hyb-oa/issues/2026-02-09_13-39-02-p5-blueprint-v3.csv:1) 视为权威完成态;[2026-02-09_11-17-07-p5-blueprint.csv](/home/shunli/Projects/hyb-oa/issues/2026-02-09_11-17-07-p5-blueprint.csv:1) 和 [2026-02-09_12-34-42-p5-blueprint-v2.csv](/home/shunli/Projects/hyb-oa/issues/2026-02-09_12-34-42-p5-blueprint-v2.csv:1) 保留为历史快照,不再单独作为当前待办来源。 - **历史蓝图链**:P5 相关只把 [2026-02-09_13-39-02-p5-blueprint-v3.csv](/home/shunli/Projects/hyb-oa/issues/2026-02-09_13-39-02-p5-blueprint-v3.csv:1) 视为权威完成态;[2026-02-09_11-17-07-p5-blueprint.csv](/home/shunli/Projects/hyb-oa/issues/2026-02-09_11-17-07-p5-blueprint.csv:1) 和 [2026-02-09_12-34-42-p5-blueprint-v2.csv](/home/shunli/Projects/hyb-oa/issues/2026-02-09_12-34-42-p5-blueprint-v2.csv:1) 保留为历史快照,不再单独作为当前待办来源。
- **试运行链**:本地/外部试运行相关优先串读 `R70 -> R71 -> R73 -> R74 -> R75 -> R76 -> R77 -> R78 -> R79 -> R80 -> R82 -> R83-R86 -> R87 -> R88 -> R89 -> R90/R91`,不要只看单一 CSV 判断系统状态。 - **试运行链**:本地/外部试运行相关优先串读 `R70 -> R71 -> R73 -> R74 -> R75 -> R76 -> R77 -> R78 -> R79 -> R80 -> R82 -> R83-R86 -> R87 -> R88 -> R89 -> R90/R91`,不要只看单一 CSV 判断系统状态。
- **跨文档事实源**:业务能力现状优先结合 [feature-matrix.md](/home/shunli/Projects/hyb-oa/docs/feature-matrix.md:1)、[coverage-matrix.csv](/home/shunli/Projects/hyb-oa/artifacts/r75/coverage-matrix.csv:1) 和 [manual-trialrun-report.md](/home/shunli/Projects/hyb-oa/artifacts/r70/manual-trialrun-report.md:1) 阅读。 - **跨文档事实源**:业务能力现状优先结合 [feature-matrix.md](/home/shunli/Projects/hyb-oa/docs/feature-matrix.md:1)、[coverage-matrix.csv](/home/shunli/Projects/hyb-oa/docs/trialrun/coverage-matrix.csv:1) 和 [manual-trialrun-report.md](/home/shunli/Projects/hyb-oa/docs/trialrun/manual-trialrun-report.md:1) 阅读。
## 历史合同处理原则 ## 历史合同处理原则
- 不批量回改旧 CSV 的 `TODO/DOING/DONE` 来伪造一致性。 - 不批量回改旧 CSV 的 `TODO/DOING/DONE` 来伪造一致性。