From 77a75a6de734a4dd84f59ba1db5a3d3e920d73d3 Mon Sep 17 00:00:00 2001 From: shunli Date: Wed, 11 Mar 2026 20:52:11 +0800 Subject: [PATCH] =?UTF-8?q?docs(P21PWA1-5):=20PWA-1=E7=9F=A9=E9=98=B5?= =?UTF-8?q?=E8=BE=B9=E7=95=8C=E4=B8=8E=E5=9B=9E=E5=BD=92=E6=B8=85=E5=8D=95?= =?UTF-8?q?=E6=94=B6=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/feature-matrix.md | 13 +++++++++--- docs/integration-boundaries.md | 27 ++++++++++++++++++------- docs/mobile/pwa-regression-checklist.md | 22 +++++++++++++++++++- scripts/validate-feature-matrix.py | 1 + 4 files changed, 52 insertions(+), 11 deletions(-) diff --git a/docs/feature-matrix.md b/docs/feature-matrix.md index 19663f8e..0e453902 100644 --- a/docs/feature-matrix.md +++ b/docs/feature-matrix.md @@ -1,8 +1,8 @@ -# hyb-oa 实现状态矩阵(P5-P19+IM-1+ERP-3+R10+MCP-1+AI-1+TRAVEL-1+TRAVEL-2+TRAVEL-3) +# hyb-oa 实现状态矩阵(P5-P19+IM-1+ERP-3+R10+MCP-1+AI-1+TRAVEL-1+TRAVEL-2+TRAVEL-3+PWA-1) **快照日期**:2026-03-11 -**范围**:`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`,共 254 项。 -**事实源**:`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`(执行合同) +**范围**:`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`,共 260 项。 +**事实源**:`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/*.csv` 的执行合同职责。 @@ -295,3 +295,10 @@ | P20TRAVEL3-3 | ERP travel export与批次轨道 | N/A | 2026-03-09_11-05-00-p20-travel-3-l5-reconciliation-erp-bridge.csv | 2026-03-11_09-57-28-p20-travel-3-l5-reconciliation-erp-bridge-refresh.csv | 2026-03-11 | DONE | server:test | 新增 `erp.travel.export`、`travel_payable_summary` / `travel_settlement_batch` binding 与 batch-level track / requeue,不影响既有 `travel_order_payment` journal | | P20TRAVEL3-4 | 差旅页对账Tab与前端联动 | N/A | 2026-03-09_11-05-00-p20-travel-3-l5-reconciliation-erp-bridge.csv | 2026-03-11_09-57-28-p20-travel-3-l5-reconciliation-erp-bridge-refresh.csv | 2026-03-11 | DONE | client:typecheck/build | `/travel-requests?tab=reconciliation&batchId=` 已支持批次列表、KPI、异常确认、Finalize 与 ERP 轨道重试联动 | | P20TRAVEL3-5 | P20TRAVEL3文档矩阵同步与回归收口 | N/A | 2026-03-09_11-05-00-p20-travel-3-l5-reconciliation-erp-bridge.csv | 2026-03-11_09-57-28-p20-travel-3-l5-reconciliation-erp-bridge-refresh.csv | 2026-03-11 | DONE | server:test + client:typecheck/build + validate-feature-matrix | 边界文档、领域事件、Feature Matrix、CSV 校验与全量回归同步收口,主线里程碑推进到 254 | + +| P21PWA1-0 | P21PWA1执行合同刷新与P20基线冻结 | N/A | 2026-03-09_11-15-00-p21-pwa-1-l5-asset-scan.csv | 2026-03-11_17-50-39-p21-pwa-1-l5-asset-scan-refresh.csv | 2026-03-11 | DONE | CSV 校验 | 以 superseding CSV 刷新 PWA-1 执行合同,并正式冻结 P20 收口 gate、clean-main 起步与浏览器 PWA 资产扫码边界 | +| P21PWA1-1 | 移动资产扫码页与扫描适配器 | N/A | 2026-03-09_11-15-00-p21-pwa-1-l5-asset-scan.csv | 2026-03-11_17-50-39-p21-pwa-1-l5-asset-scan-refresh.csv | 2026-03-11 | DONE | client:typecheck/build | 新增 `/mobile/assets/scan`、扫码导航与 `BarcodeDetector -> ZXing` 回退扫描面板,保留手工输入兜底 | +| P21PWA1-2 | 资产扫码查找最小后端扩展 | N/A | 2026-03-09_11-15-00-p21-pwa-1-l5-asset-scan.csv | 2026-03-11_17-50-39-p21-pwa-1-l5-asset-scan-refresh.csv | 2026-03-11 | DONE | server:test | `GET /api/assets` 支持 `q` 条件,按 `assetNo/serialNo` 精确匹配与 `name contains` 兜底,不新增 lookup 路由 | +| P21PWA1-3 | 盘点录入模式与离线队列联动 | N/A | 2026-03-09_11-15-00-p21-pwa-1-l5-asset-scan.csv | 2026-03-11_17-50-39-p21-pwa-1-l5-asset-scan-refresh.csv | 2026-03-11 | DONE | server:test + client:typecheck/build | `inventoryCheckId` 模式支持 draft 启动、counting 录入、completed 只读,以及 IndexedDB 离线队列 last-write-wins 重放 | +| P21PWA1-4 | PWA一期文档边界与矩阵同步 | N/A | 2026-03-09_11-15-00-p21-pwa-1-l5-asset-scan.csv | 2026-03-11_17-50-39-p21-pwa-1-l5-asset-scan-refresh.csv | 2026-03-11 | DONE | validate-feature-matrix | 集成边界、PWA 回归清单、Feature Matrix 与事实源校验器同步到 `...+PWA-1`,并明确不做原生壳 / 深链 / 完整离线同步 | +| P21PWA1-5 | P21PWA1回归与验收收口 | N/A | 2026-03-09_11-15-00-p21-pwa-1-l5-asset-scan.csv | 2026-03-11_17-50-39-p21-pwa-1-l5-asset-scan-refresh.csv | 2026-03-11 | DONE | server:test + regression-all + client:typecheck/build + validate-feature-matrix | 移动扫码、盘点录入、离线重放与权限边界回归通过,矩阵推进到 260 并为 `P21+PWA-2` 留出干净合同起点 | diff --git a/docs/integration-boundaries.md b/docs/integration-boundaries.md index f181cd76..acebf139 100644 --- a/docs/integration-boundaries.md +++ b/docs/integration-boundaries.md @@ -1,8 +1,8 @@ -# 集成边界冻结(P19 / P19+IM-1 / P19+ERP-3 / R10 / P19+MCP-1 / P19+AI-1 / P20+TRAVEL-1 / P20+TRAVEL-2 / P20+TRAVEL-3) +# 集成边界冻结(P19 / P19+IM-1 / P19+ERP-3 / R10 / P19+MCP-1 / P19+AI-1 / P20+TRAVEL-1 / P20+TRAVEL-2 / P20+TRAVEL-3 / P21+PWA-1) -**快照日期**:2026-03-10 -**当前基线**:`P19+IM-1`、`P19+ERP-1`、`P19+ERP-2`、`P19+ERP-3`、`P19+MCP-1`、`P19+AI-1` 与 `P20+TRAVEL-1`、`P20+TRAVEL-2`、`P20+TRAVEL-3` 已完成;当前运行时已落地企微群机器人 + 深链 + Outbox 异步派发的一期协同适配,以及 ERP 主数据 Pull、报销付款凭证切片、采购双阶段 journal / 归档摘要出站、资产台账摘要出站、Postgres MCP 只读工具基线、报销 / 采购 / 资产详情页 AI 只读建议挂件,以及差旅申请主单 / 行程段 / 审批预算锁定 / `travel_orders` 关联入站、混合双轨对公支付闭环与批次级对账摘要桥的三期差旅基线。 -**目标**:在保持核心域稳定的前提下,冻结 ERP / IM / AI / MCP / TRAVEL 的长期边界,并记录 IM 一期、ERP 三期、AI 一期与差旅一期的已实现范围、禁入规则以及 R10 之后的固定主线顺序。 +**快照日期**:2026-03-11 +**当前基线**:`P19+IM-1`、`P19+ERP-1`、`P19+ERP-2`、`P19+ERP-3`、`P19+MCP-1`、`P19+AI-1`、`P20+TRAVEL-1`、`P20+TRAVEL-2`、`P20+TRAVEL-3` 与 `P21+PWA-1` 已完成;当前运行时已落地企微群机器人 + 深链 + Outbox 异步派发的一期协同适配,以及 ERP 主数据 Pull、报销付款凭证切片、采购双阶段 journal / 归档摘要出站、资产台账摘要出站、Postgres MCP 只读工具基线、报销 / 采购 / 资产详情页 AI 只读建议挂件、差旅申请主单 / 行程段 / 审批预算锁定 / `travel_orders` 关联入站、混合双轨对公支付闭环与批次级对账摘要桥的三期差旅基线,以及浏览器 PWA 下的移动资产扫码、盘点快捷录入与离线队列重放。 +**目标**:在保持核心域稳定的前提下,冻结 ERP / IM / AI / MCP / TRAVEL / PWA 的长期边界,并记录 IM 一期、ERP 三期、AI 一期、差旅三期与 PWA 一期的已实现范围、禁入规则以及 R10 之后的固定主线顺序。 ## 1. 总体原则 @@ -183,6 +183,19 @@ - 不做真实商旅供应商清结算、拒付、退款回调、税分摊、复杂票规,也不新增 workflow 审批实例。 - 若源数据变化,只允许新建下一批 reconciliation batch,不回刷已 finalized 的历史批次快照。 +### 5.7 P21+PWA-1 已实现范围 +- 已新增 `/mobile/assets/scan`、导航入口与 `MobileAssetScanPage`,固定采用“相机扫码 + 手工输入兜底”的移动资产查找体验,不新增独立原生壳或平台私有 SDK。 +- 已固定扫码引擎优先使用浏览器 `BarcodeDetector`,不支持时回退到 `@zxing/browser`;相机不可用时仍允许通过 `assetNo / serialNo / name` 手工检索。 +- 已对现有 `GET /api/assets` 做最小扩展,新增 `q` 查询参数;匹配规则固定为 `asset_no` 精确匹配、`serial_no` 精确匹配、`name contains` 兜底模糊匹配,继续沿用现有资产读权限与 `mine` 语义。 +- 已把盘点录入固定在 `inventoryCheckId` 上下文内复用现有 `fetchInventoryChecks / startInventoryCheck / recordInventoryItems`,实现 `draft -> start`、`counting -> record`、`completed -> readonly` 三态,不新增移动专用后端协议。 +- 已新增 `IndexedDB` 离线队列,仅缓存“已解析出 `assetId` 的盘点结果”;联网后自动或手动重放,且以 `inventoryCheckId + assetId` 做 last-write-wins 去重。 + +### 5.8 PWA 一期明确不做 +- 不做原生 App、小程序、双栈移动壳,也不接企微 / 钉钉 / 浏览器私有扫码 SDK。 +- 不做 NFC、蓝牙、RFID、资产主数据全量离线镜像或完整离线盘点引擎。 +- 不做企微 / 钉钉深链直达、后台持续同步、复杂冲突合并;这些能力继续留给 `P21+PWA-2`。 +- 不改写现有资产台账详情路由,不新增 `/api/assets/lookup` 或其他移动专用后端路由。 + ## 6. 事件与通知交付规范 ### 6.1 事件最小结构 @@ -241,7 +254,7 @@ ## 9. R10 后续路线冻结 ### 9.1 固定主线顺序 -- `P20+TRAVEL-3` 已完成后,当前固定后续主线顺序为:`P21+PWA-1 -> P21+PWA-2`。 +- `P21+PWA-1` 已完成后,当前固定后续主线顺序为:`P21+PWA-2`。 - 历史主线顺序仍保持:`P19+MCP-1 -> P19+AI-1 -> P20+TRAVEL-1 -> P20+TRAVEL-2 -> P20+TRAVEL-3 -> P21+PWA-1 -> P21+PWA-2`。 - 后续阶段继续遵循“先治理,再工具,再建议,再业务,再移动”的总顺序,不并行开启两个重业务 phase。 - 每个 phase 固定遵循:`执行合同 CSV -> 方案批准 -> 开发 -> 测试 -> 文档矩阵收口 -> 合并 main`。 @@ -258,8 +271,8 @@ - `P20+TRAVEL-3` 固定负责核销闭环与 ERP / AP 摘要桥接;个人垫资报销继续与对公统付并存,不互相替代。 ### 9.4 PWA 兑现顺序 -- `P21+PWA-1` 固定先做移动资产扫码与盘点增强,优先兑现一线资产作业的生产价值。 -- `P21+PWA-2` 固定后做离线动作队列与企微深链增强,继续复用现有 `APP_ORIGIN + targetPath` 深链规范。 +- `P21+PWA-1` 已完成移动资产扫码与盘点增强,优先兑现一线资产作业的生产价值,并固定采用浏览器 PWA + 离线队列重放路线。 +- `P21+PWA-2` 固定后做离线动作队列增强与企微深链增强,继续复用现有 `APP_ORIGIN + targetPath` 深链规范。 - PWA 路线继续限定在浏览器 / PWA 栈内,不引入原生 App、小程序或双栈移动壳。 ### 9.5 后置 backlog diff --git a/docs/mobile/pwa-regression-checklist.md b/docs/mobile/pwa-regression-checklist.md index 169ee0c4..51afa04a 100644 --- a/docs/mobile/pwa-regression-checklist.md +++ b/docs/mobile/pwa-regression-checklist.md @@ -1,4 +1,4 @@ -# PWA 回归清单(P12) +# PWA 回归清单(P12 + P21PWA1) ## 前置条件 - `client` 已完成构建:`cd client && npm run build` @@ -36,3 +36,23 @@ ## 备注 - iOS 场景仅保证前台恢复后的重放,不承诺后台持续同步。 + + +## 场景 E:移动资产扫码 +1. 使用具备资产读取权限的账号访问 `资产扫码` 页面。 +2. 在支持 `BarcodeDetector` 的浏览器中点击“开始扫码”,扫描资产条码或二维码。 +3. 若浏览器不支持 `BarcodeDetector`,确认页面自动回退到 ZXing 并可继续扫码。 +4. 若相机不可用,改为手工输入资产编号 / 序列号 / 名称。 +5. 确认唯一命中时展示轻量资产详情卡;多命中时展示候选列表。 + +期望:扫码与手工输入都能完成资产查找,且不要求新增原生壳。 + +## 场景 F:移动盘点录入与离线重放 +1. 使用具备 `asset.inventory` 权限的账号,从 `资产盘点` 页面进入 `移动扫码盘点`。 +2. 选择或打开一个 `draft` 盘点任务,点击“开始并扫码”,确认任务进入 `counting`。 +3. 扫码定位资产后提交盘点结果,确认桌面盘点页同步看到新增 item。 +4. 在任务为 `counting` 且已解析资产的前提下断网,再次提交盘点结果,确认提示“已加入离线队列”。 +5. 恢复网络后等待自动重放或手动点击“同步队列”,确认队列项被移除且盘点结果已写回服务端。 +6. 用无 `asset.inventory` 权限账号访问同一路径,确认只能查看资产结果,不能录入盘点。 + +期望:离线只缓存已解析盘点结果,联网可重放成功,权限边界不回退。 \ No newline at end of file diff --git a/scripts/validate-feature-matrix.py b/scripts/validate-feature-matrix.py index ead967a7..b7f8f693 100755 --- a/scripts/validate-feature-matrix.py +++ b/scripts/validate-feature-matrix.py @@ -48,6 +48,7 @@ CSV_FACT_SOURCES = [ ROOT / "issues" / "2026-03-10_17-32-21-p20-travel-1-l5-request-intake-refresh.csv", ROOT / "issues" / "2026-03-10_21-05-59-p20-travel-2-l5-corporate-payments-refresh.csv", ROOT / "issues" / "2026-03-11_09-57-28-p20-travel-3-l5-reconciliation-erp-bridge-refresh.csv", + ROOT / "issues" / "2026-03-11_17-50-39-p21-pwa-1-l5-asset-scan-refresh.csv", ] ID_PATTERN = re.compile(r"^[A-Z][0-9][0-9A-Za-z-]*$")