This commit is contained in:
2026-08-05 15:52:51 +08:00
parent a70377c007
commit ee6e633d9f
11 changed files with 80 additions and 46 deletions
+7 -1
View File
@@ -2,6 +2,12 @@
二期以头程物流“02 到仓”为作业主线,完成预约取货、送货上门、入库测量、差异记录和指定库位闭环,并增加头程费用项目、计费规则、费用试算和费用明细。产品已确认二期不建设应收应付、对账、收付款、核销、发票和利润模块。
## 当前主体模型
- 二期继续按“平台—客户”两级开发。`tenant_id > 0` / `tenantId` 当前表示客户 ID,用于客户隔离;`tenant_id=0` 是平台技术作用域。
- 不新增真实租户、租户选择器或租户级 RBAC,也不把兼容字段重定义为上级租户。历史路径、字段与配置名继续保留。
- 平台公共仓库、快递公司、托盘、库位等公共资源统一归属平台技术作用域 `tenant_id=0`,不绑定客户;客户往来单位、订单、文件和费用继续按所属客户 `tenant_id>0` 严格隔离。`10001` 是客户 ID,不得用于公共资源归属。
## 文档
- [二期 V2 需求确认清单(当前会议填写)](二期V2需求确认清单.md)
@@ -30,7 +36,7 @@
- 测量批次:`2084556854154715137`
- 费用单:`FBAF-2084549769916538881-1`
- 计费结果:实重 `20kg`,体积 `0.24m³`,计费量 `40.08kg`,费用 `440.68 CNY`
- 自动化测试:Firstleg 77 项、Warehouse 68 项、共享资源租户专项 3 项全部通过
- 自动化测试:Firstleg 77 项、Warehouse 68 项、公共仓储技术归属专项(历史测试名含“资源租户”)3 项全部通过
- 在线验证:7 个隔离服务健康状态均为 `UP`
本地 OCR 未配置真实供应商凭证,因此本轮验证的是“图片上传成功、OCR 返回失败、人工修正并确认、继续完成计费入库”的可用降级链路。真实 OCR 识别准确率仍需在测试环境使用现场秤图验证。
+4 -2
View File
@@ -7,6 +7,8 @@
> 技术状态(2026-08-04):任务 `019fc6f9-8dcf-74e1-bc68-d42f15d7802a` 已完成核心正常主链路开发和真实 API 回归。以下“产品确认状态”仍由产品/业务负责人填写,技术完成不自动等同于产品确认。
> 主体模型:二期只实现“平台—客户”两级;业务数据的 `tenant_id>0` 是客户隔离兼容字段,平台公共仓储资源归属 `tenant_id=0`。下表历史“资源租户”均指公共主数据技术归属,不代表真实租户。
## 一、使用说明
- 本清单是二期 V2 的唯一会议确认入口。
@@ -129,9 +131,9 @@ C1 至 C8 确认后,原 P2-Q14 至 P2-Q16 不再单独维护,避免形成两
| C5 KG/CBM 规则 | 已实现并验证样本 | 实重 `20kg`、体积重 `40.08kg`,取 `40.08kg` 计费 |
| C6 费用项目白名单 | 技术能力已具备,业务内容待确认 | 本轮使用测试价格 `11 CNY/kg`,不能代替正式费用白名单 |
| C7 费用发送与入库节点 | 已实现 | 审核通过后自动生成费用 `440.68 CNY`,最终 `SENT + INBOUNDED` |
| C8 托盘与库位 | 已实现 | 托盘、库位、预占、确认占用及资源租户快照已验证 |
| C8 托盘与库位 | 已实现 | 托盘、库位、预占、确认占用及公共主数据技术归属快照已验证 |
| T1 第三方测量参数 | 接口能力已实现,供应商参数待定 | 正式签名密钥、设备编码和供应商联调环境仍需确认 |
| T2 OCR 参数 | 降级链路已验证,真实供应商待接入 | 本地 OCR 未配置,已验证失败后人工修正继续入库 |
| T3 托盘库位基础资料 | 已实现并通过 API 创建 | 公共仓资源租户为 `10001`,分配状态 `CONFIRMED` |
| T3 托盘库位基础资料 | 已实现并通过 API 创建 | 当前公共主数据技术归属规则为 `tenant_id=0`,分配状态 `CONFIRMED`;`10001` 不再作为公共资源归属 |
完整接口与回归证据见 [二期前端联调报告(2026-08-04)](二期前端联调报告-2026-08-04.md)。
@@ -5,6 +5,8 @@
> 代码基线:`test-01` 分支,提交 `25d2a13`
> 使用对象:平台后台前端、商户端前端、第三方测量系统联调人员
> 术语与现行规则校正:当前产品只有“平台—客户”两级。客户业务中的 `tenantId` / `tenant_id` 表示客户 ID 兼容字段;“资源租户”历史术语表示公共主数据技术归属。平台公共仓库、快递公司、托盘和库位现归属 `tenant_id=0`,客户往来单位、订单、文件和费用归属客户 `tenant_id>0`;报告中的 `10001` 是已失效的历史联调样本,不得继续作为公共资源归属。
## 一、联调结论
二期后端主流程、平台测量、OCR 重量、客服审核、FBA 计费、费用发布、入库完成、库位和托盘维护、客户只读查询、第三方测量回传接口均已形成代码闭环。
@@ -84,7 +86,7 @@ Authorization: Bearer <accessToken>
Content-Type: application/json
```
平台代目标企业操作的接口还必须传 `tenantId` 查询参数。后端同时校验登录应用类型、操作者数据范围、目标租户、仓库和资源归属;不能只依靠前端隐藏按钮实现隔离。
平台代目标企业操作的接口还必须传代表目标客户的 `tenantId` 查询参数。后端同时校验登录应用类型、操作者数据范围、目标客户、仓库和资源归属;不能只依靠前端隐藏按钮实现隔离。
所有有副作用且要求幂等的接口必须传:
@@ -493,7 +495,7 @@ image:该条箱规唯一对应的 JPG/PNG/BMP 图片,最大 5 MB
8. 提交测量,验证状态变为 `MEASURE_PENDING`,托盘和库位结果已生成。
9. 先走一次驳回 → 修改 → 重新提交,验证旧页面版本提交被拒绝。
10. 客服审核通过,随后重新查询详情和 `/fees/latest`,验证自动变为 `INBOUNDED / SENT`。
11. 商户账号查询 `inbound-billing`,验证只读数据、跨租户 403/404 和未发布费用不可见。
11. 商户账号查询 `inbound-billing`,验证只读数据、跨客户 403/404 和未发布费用不可见。
12. 调整一次已发布费用,验证新版本可见、旧版本被替代且入库状态不回退。
13. 验证重复点击使用同一幂等键不会重复计费、重复托盘或重复占位。
14. 验证无权限按钮、直接构造越权请求、空态、加载态、异常提示和移动端展示。
@@ -543,7 +545,7 @@ D:\apache-maven-3.8.8\bin\mvn.cmd clean test -pl order,firstleg,warehouse,file,i
- 测量提交时托盘拆分、库位预占/确认、失败回滚、幂等重试。
- 客服驳回、通过后自动计费/发布/入库、中断续跑。
- FBA 计费规则选择、已发布费用调整和状态不回退。
- 客户只见本租户已发布费用,平台/商户身份及跨租户隔离。
- 客户只见本客户已发布费用,平台/商户身份及跨客户隔离。
- 第三方签名、防重放、事件幂等、仓库范围及不越权推进状态。
- 第三方一条箱规对应一条订单货物明细和一张图片、重复绑定拦截、图片补偿清理。
- 库位/托盘主数据约束、A0 共享溢出及活动占用唯一性契约。
@@ -560,7 +562,7 @@ D:\apache-maven-3.8.8\bin\mvn.cmd clean test -pl order,firstleg,warehouse,file,i
2. Gateway、Nacos、Redis、MySQL、服务间令牌和各微服务的真实 HTTP 联通。
3. OCR 引擎对现场秤图的识别准确率、超时和失败重试。
4. 并发提交、并发抢托盘/库位、A0 多托盘共享在真实数据库事务下的压力验证。
5. 浏览器端完整登录、刷新 Token、权限按钮、403、跨租户、空态、加载态和重复提交体验。
5. 浏览器端完整登录、刷新 Token、权限按钮、403、跨客户拒绝、空态、加载态和重复提交体验。
6. 当前托盘管理没有独立启停和状态筛选接口;本期页面只做查询、新增、编辑、删除。
上述内容是本报告初版时的阶段结论。2026-08-04 已继续完成真实数据库迁移和隔离端口在线 HTTP 回归,最终结论以第十七章为准。
@@ -598,20 +600,20 @@ D:\apache-maven-3.8.8\bin\mvn.cmd clean test -pl order,firstleg,warehouse,file,i
- 7 个隔离服务健康检查均为 `UP`。
- Firstleg 自动化测试 77 项通过。
- Warehouse 自动化测试 68 项通过。
- 共享资源租户专项测试 3 项通过。
- 公共仓储技术归属专项(历史测试名含“资源租户”)3 项通过。
### 17.3 前端需要采用的最终契约
- 入库详情已经返回 `version`,测量审核、驳回等乐观锁请求必须使用服务端最新版本。
- Long 类型 ID 继续按字符串处理。
- 客服审核通过后由后端自动完成计费、费用发送和入库,前端成功后刷新详情与最新费用,不串行调用补偿接口。
- 平台操作公共收货仓时,业务租户与仓储资源租户由后端分别校验,前端不自行改写资源租户。
- 平台操作公共收货仓时,订单客户归属与公共主数据技术归属由后端分别校验,前端不自行改写技术归属字段。
- OCR 未配置时会返回明确失败状态,页面必须允许人工修正识别重量并确认,不能把 OCR 失败等同于整条业务失败。
### 17.4 本轮修复
1. 补齐 `fl_inbound_weight_result.created_by`、`updated_by`,修复称重结果登记 SQL 失败。
2. 增加 `firstleg.inbound.warehouse-resource-tenant-id`,支持商户订单使用公共资源租户下的仓库、托盘和库位;本轮测试值为 `10001`。
2. 增加历史兼容配置 `firstleg.inbound.warehouse-resource-tenant-id`,支持商户订单使用公共主数据技术归属下的仓库、托盘和库位;2026-08-04 本轮曾使用 `10001` 验证,但该样本已失效,现行公共资源归属必须为平台技术作用域 `0`。
3. 仓储确认结果回传并保留 `reservationNo`,避免分配快照写入空预占单号。
4. 入库详情 `InboundOrderSummary` 增加 `version`。
5. `fl_inbound_pallet_allocation` 增加 `warehouse_resource_tenant_id`,保留历史资源归属快照。
@@ -5,6 +5,8 @@
> 后端范围:只读核对 `baiyue-firstleg/`,本任务不修改后端
> 当前基线:以后端现有 Controller、DTO、权限和状态机为可联调事实;V2 待确认项不擅自补成前端规则
> 主体模型:前端只呈现“平台—客户”两级;接口 `tenantId` 当前表示客户 ID。任务中的“租户切换”统一理解为客户切换,不新增租户选择器或租户级权限。
本轮不存在“等待后端提供接口文档”的前置任务。每个前端对话直接只读当前工作区 `baiyue-firstleg/` 中的 Controller、DTO、Service、Repository、OpenAPI 和权限 SQL;发现契约问题只登记,不修改后端。
## 一、结论
@@ -116,7 +118,7 @@ Client 只修改现有 `FirstLegOrdersView.vue` 的订单详情抽屉,新增
- 浏览器代码使用现有 `/api` 基地址,不硬编码 Gateway 地址。
- 普通业务 HTTP 200 后仍需判断响应体 `code === "200"`。
- Java Long 在 JSON 中按字符串处理,前端不得转为 `Number`。
- Admin 当前接口显式需要目标 `tenantId`;切换企业必须清空仓库、详情、编辑、上传和幂等上下文。
- Admin 当前接口显式需要代表目标客户的 `tenantId`;切换企业必须清空仓库、详情、编辑、上传和幂等上下文。
- 409 表示版本或并发冲突,页面应刷新最新详情,不静默覆盖。
- 审核通过、驳回、异常放行和费用写操作按 Controller 要求携带 `Idempotency-Key`。
@@ -149,11 +151,11 @@ Client 只修改现有 `FirstLegOrdersView.vue` 的订单详情抽屉,新增
| `P2-ADM-07` | 船司 FBA 价格 | 独占 `modules/fba-pricing/carrier-rates/**` 及测试 | 查询、详情、新版本、停用、起运仓/渠道/船司/FBA 仓/价格和有效期 | 只读 `PlatformFbaMasterDataController` 价格契约 | W1 |
| `P2-ADM-08` | 库位管理 | 独占 `modules/warehouse-resources/locations/**` 及测试 | 企业/仓库级联、筛选分页、CRUD、启停、乐观锁、状态限制、响应式 | 现有企业选择器和仓库 API | W1 |
| `P2-ADM-09` | 托盘管理 | 独占 `modules/warehouse-resources/pallets/**` 及测试 | 企业/仓库级联、筛选分页、CRUD;不虚构状态或启停 | 现有企业选择器和仓库 API | W1 |
| `P2-ADM-10` | 入库详情工作台组装 | 独占 `modules/inbounds/pages/InboundOrderDetailView.vue`、`components/InboundWorkflowWorkspace.vue` 及测试 | 将 ADM-01 至 ADM-05 组件组装为详情页;统一刷新、租户切换清理、操作成功回读和托盘库位只读结果 | ADM-01 至 ADM-05 | W2 |
| `P2-ADM-10` | 入库详情工作台组装 | 独占 `modules/inbounds/pages/InboundOrderDetailView.vue`、`components/InboundWorkflowWorkspace.vue` 及测试 | 将 ADM-01 至 ADM-05 组件组装为详情页;统一刷新、客户切换清理、操作成功回读和托盘库位只读结果 | ADM-01 至 ADM-05 | W2 |
| `P2-ADM-11` | Admin 全局装配 | 独占各模块 `routes.ts`、`app/router/index.ts`、`core/navigation/adminNavigation.ts` 及对应测试 | 接入全部 Admin 页面、菜单和权限;首个可访问路由正确;不恢复接收审核/费用项目原型菜单 | ADM-06 至 ADM-10 | W3 |
| `P2-ADM-12` | 海外仓阶梯费用 | 建议独占 `modules/overseas-storage-fees/**` 及测试;路由和菜单在集成时统一修改 | 分页、详情、新增、编辑、删除;客户唯一性、连续阶梯校验、乐观锁冲突、权限态和未保存保护 | `PlatformOverseasStorageFeeController` | W1 |
| `P2-CLI-01` | 商户订单入库费用只读展示 | `apps/client-web/src/modules/first-leg/api/inboundBilling.ts`、`types/inboundBilling.ts`、`components/InboundBillingPanel.vue`、`views/FirstLegOrdersView.vue` 及测试 | 成功/待发布/失败/重试、快速切单、320/720/桌面;无写动作,不消费内部字段 | 只读 `MerchantInboundBillingController` 及 DTO/Service | W1 |
| `P2-QA-01` | Admin 跨模块回归 | 以新增集成测试和联调记录为主,不重构业务实现 | 租户切换、401/403、业务码、409、幂等、重复提交、图片异常、空/加载/失败、权限按钮、窄屏;运行 test/typecheck/build | `P2-ADM-11` | W4 |
| `P2-QA-01` | Admin 跨模块回归 | 以新增集成测试和联调记录为主,不重构业务实现 | 客户切换、401/403、业务码、409、幂等、重复提交、图片异常、空/加载/失败、权限按钮、窄屏;运行 test/typecheck/build | `P2-ADM-11` | W4 |
| `P2-QA-02` | Client 安全与展示验收 | 只读审查和补测试,避免与 CLI-01 同时改订单页 | 不展示内部备注/历史;A0404 中性态;响应隔离;test/typecheck/build | `P2-CLI-01` | W2 |
### 6.2 推荐并行波次
+5 -3
View File
@@ -7,6 +7,8 @@
> 产品确认:[2026-07-31 产品确认合并记录](产品回传/2026-07-31-产品确认合并记录.md)
> 前置阶段:[一期文档](../一期/README.md)
> 主体模型:二期只实现“平台—客户”两级。`tenant_id > 0` / `tenantId` 是客户 ID 兼容字段,`tenant_id=0` 是平台技术作用域;不得新增真实租户、租户选择器、租户级 RBAC 或重定义现有隔离字段。
## 一、二期目标
二期承接一期“客户下单并选择平台收货仓”的结果,完成货物从待到仓、实际收货、测量、差异记录到指定库位的作业闭环,并在实测数据之上完成头程费用计算。
@@ -37,7 +39,7 @@
- 申报数据与实测数据对比、差异记录、客户通知和审计。
- 最小库位档案、上架任务、指定库位和位置历史。
- 头程费用项目、计费规则版本、费用试算、人工费用、调整、确认和费用明细。
- 服务端权限、租户隔离、状态、幂等、并发、文件鉴权、审计和历史快照。
- 服务端权限、基于兼容字段 `tenant_id` 的客户隔离、状态、幂等、并发、文件鉴权、审计和历史快照。
### 明确不纳入二期
@@ -205,7 +207,7 @@
### 国内头程后端 `baiyue-firstleg/`
- 最终保证身份、租户、仓库数据范围、状态转换、幂等、并发和审计。
- 最终保证身份、客户归属、仓库数据范围、状态转换、幂等、并发和审计。
- 管理到仓单、收货批次、处理单元、标签、测量、差异通知、库位、上架、位置和冲正事务边界。
- 管理计费规则版本、费用生成幂等、三位向上取整、费用调整和历史复算。
- 文件访问使用不可预测标识和授权下载,不信任客户端文件名与 MIME 类型。
@@ -287,5 +289,5 @@
5. 实现库位、上架任务和位置历史,不建设隔离和容量校验。
6. 确认 P2-Q14 至 Q16,建立头程费用项目和计费规则版本。
7. 接入实测和业务事件,完成费用试算、人工补录、调整和费用明细。
8. 完成租户隔离、幂等、计费复算、文件安全、审计和回归测试。
8. 完成跨客户隔离、幂等、计费复算、文件安全、审计和回归测试。
9. 使用脱敏初始化数据联调、验收和发布。
@@ -5,6 +5,8 @@
> 依据:二期原型、现有二期需求优化稿及 2026-08-01 新增流程说明
> 本文只定义二期范围和业务契约,不代表功能已经开发完成。
> 主体模型:本文业务数据中的“租户”历史术语与 `tenantId` / `tenant_id` 字段,当前均按客户归属兼容语义理解;产品只有“平台—客户”两级。`tenant_id=0` 是平台身份、RBAC 和平台公共仓储资源技术作用域,客户往来单位、订单、文件和费用使用所属客户 `tenant_id>0`。二期不引入真实租户层。
> 技术实现状态更新(2026-08-04):任务 `019fc6f9-8dcf-74e1-bc68-d42f15d7802a` 已完成核心正常主链路开发,并通过本地测试 MySQL 和隔离端口真实 API 回归。产品/业务待确认项仍以第九章和《二期 V2 需求确认清单》为准。
## 一、结论
@@ -34,7 +36,7 @@
- 托盘基础资料、库位及库位占用放在仓库服务。
- 测量图、称重图继续使用文件服务。
- 客户通知通过现有事件桥接服务发送,不在入库事务中同步调用外部消息渠道。
- 权限继续复用 IAM,所有后台按钮做到租户、企业、仓库数据范围校验。
- 权限继续复用 IAM,所有后台按钮做到客户归属、企业、仓库数据范围校验。
## 二、核心业务规则
@@ -123,7 +125,7 @@ Idempotency-Key: 第三方事件号
接口校验:
- 入仓码必须存在,且属于请求中的仓库和租户绑定关系。
- 入仓码必须存在,且属于请求中的仓库和客户归属关系。
- 入库单必须处于待测量或测量被驳回状态;已入库、已作废、费用已发送的数据不得覆盖。
- 长宽高必须大于 0,单位统一为厘米;数量必须为正整数。
- 同一个 `appKey + eventNo` 重复请求返回第一次结果,不重复新增明细。
@@ -172,7 +174,7 @@ POST /api/platform/inbounds/{inboundId}/weight-results/confirm
计费匹配顺序:
1. 根据租户、客户和生效时间选择客户计费规则版本。
1. 根据客户归属、业务客户和生效时间选择客户计费规则版本;两类客户含义必须按字段契约区分。
2. 根据起运仓、渠道/计费类型、船司、FBA 目的仓和生效时间匹配船司价格。
3. 计算实测体积、实重和折算量。
4. 按客户规则确定 KG 或 CBM 计费口径,并取实际量与折算量中的较大值。
@@ -280,7 +282,7 @@ POST /api/platform/inbounds/{inboundId}/weight-results/confirm
| 仓库服务 | 托盘资料、库位资料、可用库位查询、预占/确认/释放 | 托盘、库位、库位占用、预占记录 |
| 文件服务 | 称重图片、测量图片和附件 | 文件元数据和对象存储引用 |
| 事件桥接服务 | 客户通知的可靠投递 | Outbox 消费记录、通知结果 |
| IAM | 租户、企业、仓库范围和按钮权限 | 新增二期权限资源,不新增业务数据 |
| IAM | 客户归属、企业、仓库范围和按钮权限 | 新增二期权限资源,不新增业务数据 |
头程与仓库分库,不能依赖跨库事务。采用“仓库库位预占 → 头程确认入库 → 仓库确认占用”的幂等 Saga;补偿只释放仍处于预占状态的库位,已经完成实物入库的记录不得被通知失败反向释放。
@@ -313,7 +315,7 @@ POST /internal/location-reservations/{reservationNo}/confirm
POST /internal/location-reservations/{reservationNo}/release
```
所有写接口必须支持幂等键;所有查询由后端基于登录上下文注入租户和企业范围,禁止相信前端传入的 `tenantId`。
所有写接口必须支持幂等键;所有查询由后端基于登录上下文注入客户归属和企业范围,禁止单独相信前端传入的 `tenantId`;该参数当前表示目标客户 ID。
## 六、页面范围
@@ -338,7 +340,7 @@ POST /internal/location-reservations/{reservationNo}/release
| ID | 模块 | 交付内容 | 优先级 |
|---|---|---|---|
| P2-01 | 契约、状态与权限 | 状态机、错误码、按钮权限、租户/企业/仓库数据范围 | P0 |
| P2-01 | 契约、状态与权限 | 状态机、错误码、按钮权限、客户/企业/仓库数据范围 | P0 |
| P2-02 | 入库单 | 列表、详情、入仓码和操作历史 | P0 |
| P2-03 | 第三方测量 | 签名、幂等、长宽高回传、原始报文留档和查询 | P0 |
| P2-04 | OCR 称重 | 图片关联、OCR、人工校正、单位换算、确认和重量汇总 | P0 |
@@ -373,7 +375,7 @@ POST /internal/location-reservations/{reservationNo}/release
- 库位数量不足、被并发抢占或已停用时,入库失败且不能留下半完成费用/占用。
- 重复点击发送费用只产生一份费用快照、一组托盘和一次入库结果。
- 客户通知失败时入库状态不回滚,系统自动重试并可查失败原因。
- 跨租户、跨企业、跨仓库查询和操作全部返回 403,并记录安全审计。
- 跨客户、跨企业、跨仓库查询和操作全部拒绝,并记录安全审计;具体使用 HTTP 状态还是业务码以接口统一响应契约为准。
## 九、仍需业务最终确认的事项
@@ -407,7 +409,7 @@ POST /internal/location-reservations/{reservationNo}/release
- 客服测量审核通过后自动计费、发送费用并完成入库。
- FBA 目的仓计费按实重和体积重取大,本轮 `20kg` 与 `40.08kg` 取 `40.08kg`。
- 入库详情、费用快照、托盘和库位分配结果查询。
- 公共收货仓资源租户与商户业务租户分离。
- 公共收货仓的公共主数据技术归属与商户订单的客户归属分别校验;这只是当前兼容实现,不形成真实租户层。
### 11.2 最终验证数据
@@ -423,7 +425,7 @@ POST /internal/location-reservations/{reservationNo}/release
### 11.3 已落地配置与数据快照
公共仓资源租户配置:
公共仓主数据技术归属配置(配置名保留历史 `tenant` 命名):
```yaml
firstleg:
@@ -431,10 +433,10 @@ firstleg:
warehouse-resource-tenant-id: ${WAREHOUSE_RESOURCE_TENANT_ID:0}
```
默认值 `0` 保持租户独立仓逻辑;本地联调使用 `10001`。托盘分配快照已保存 `warehouse_resource_tenant_id` 和 `reservation_no`,避免配置变化后无法追溯历史资源归属。
公共仓库、快递公司、托盘和库位当前统一使用平台技术作用域 `tenant_id=0`,不得绑定客户 `10001` 或其他客户 ID。客户往来单位、订单、文件和费用仍使用所属客户 `tenant_id>0`。托盘分配快照继续保存历史字段 `warehouse_resource_tenant_id` 和 `reservation_no`,其中公共资源归属值应为 `0`,避免配置变化后无法追溯历史资源归属。
### 11.4 尚未关闭的环境验收项
- 接入真实 OCR 供应商凭证后,以现场秤图验证识别准确率、超时和重试。
- 前端浏览器完成登录、权限按钮、403、跨租户、重复提交、空态和移动端体验验收。
- 前端浏览器完成登录、权限按钮、403、跨客户拒绝、重复提交、空态和移动端体验验收。
- C1-C8 产品结论仍需产品/业务负责人正式填写,技术实现通过不等于代替产品确认。