Files
baiyue-firstleg/scripts/admin-test-env-modules/批量待分柜数据生成指南.md
T
2026-08-30 17:02:19 +08:00

450 lines
21 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 批量待分柜数据生成指南
本文说明如何复用 `scripts/admin-test-env-acceptance.mjs`,通过正式 HTTP 业务接口批量生成停在“测量完成待分柜”的头程订单。生成链路包含客户登录、下单、平台审核、入库、称重、测量、测量审核,不直接写业务数据库,也不模拟成功。
固定“IT测试”客户和“义乌仓”、其余业务字段随机、每票独立随机 `1–300` 箱并尽力生成 8,000 票的专项入口,见 `IT测试客户八千票待分柜数据生成方案.md` 和 `../it-test-wait-split-bulk.mjs`。
## 适用范围
- 用于开发、联调或经明确授权的验收环境准备人工操作数据。
- 生成结果固定为入库单 `processStatus=WAIT_SPLIT`、测量审核 `APPROVED`。
- 单次支持 `1-100` 条;更大批量分多次执行并分别保存报告。
- 基础批量模式不自动执行后续分柜、装柜、订舱、国内出仓、海外入仓或 PDA 收货;需要人工分柜验收时使用本文后半部分的准备与只读核验入口。
- 禁止用于生产环境。对任何共享环境执行前,必须在当前对话明确获得该环境的写数据授权。
## 固定项与随机项
批量模式可固定以下三个线路字段:
1. 国内起运仓名称:`--origin-warehouse-name`
2. 渠道名称:`--channel-name`
3. 渠道编码:`--channel-code`
客户通过复用已审核商户账号固定;服务端从登录身份解析客户,脚本不会手填客户 ID。
使用 `--order-profile-mode randomized` 后,脚本在服务端允许的真实组合中轮换:
- 目的类型:`FBA`、`OVERSEAS`、`PRIVATE`
- 履约类型:`STANDARD`、`ONE_CLICK_DROPSHIP`
- 提货方式:`PICKUP`、`SELF_EXPRESS`、`SELF_TRUCK`
- 买单/退税:`BUY_DECLARATION`、`TAX_REFUND`
- 报价税制:`TAX_INCLUDED`、`TAX_EXCLUDED`,以固定渠道实际支持项为准
- 装载方式:`LCL`、`FULL_CONTAINER`
- 是否查验
- SKU 数、每 SKU 箱数、托数、重量和测量箱型
- FBA/海外仓目的仓:只从固定渠道当前价格簿真实可计价仓库中选择
随机档案是可重复的稳定轮换,不是不可复现的纯随机数。每六条覆盖一次“3 种目的类型 × 2 种履约类型”的核心组合,便于复核覆盖率。
特殊规则:
- `PRIVATE` 不引用公共目的仓 ID,必须携带收件人地址;当前契约不对私人地址做自动报价。
- `FBA` 必须使用真实可计价 FBA 目的仓,并冻结 Amazon 仓码、Shipment ID 和 Reference ID。
- `OVERSEAS` 必须使用真实可计价海外仓;固定渠道只有一个可用海外仓时允许重复使用,不伪造第二个仓。
- 默认 `--order-profile-mode fixed` 仍生成 FBA + STANDARD,不启用上述随机组合。
## 执行前置
执行前确认:
- 目标 Gateway 和服务已部署当前接口。
- 平台管理员账号可用。
- 复用客户已审核通过,商户账号可登录。
- 客户固定箱型初始化完成。
- 固定国内仓为 `ACTIVE` 且具备收货能力。
- 固定渠道存在当前 `ACTIVE` 价格簿和进仓码前缀。
- FBA/OVERSEAS 至少存在一个与固定渠道价格明细匹配的目的仓。
- File、Order、Firstleg、Warehouse、IAM、Auth 等链路可用。
- 测量托盘只复用仓库已有 `TP-001`、`YW-TP-002`;脚本不创建托盘主档。库位由正式仓储接口分配,普通位不足时使用公共位 `A0`,脚本不创建库位主档。
账号、密码、环境域名和 Token 不得写入本文、源码、提交记录或报告。建议由本地未提交环境文件或当前终端环境变量提供。
## PowerShell 命令模板
先在当前终端提供敏感执行参数:
```powershell
$env:ADMIN_TEST_GATEWAY = '<目标环境国内 Gateway>'
$env:ADMIN_TEST_USERNAME = '<平台管理员账号>'
$env:ADMIN_TEST_PASSWORD = '<平台管理员密码>'
$env:MERCHANT_TEST_USERNAME = '<已审核商户账号>'
$env:MERCHANT_TEST_PASSWORD = '<已审核商户密码>'
```
从 `baiyue-firstleg/` 执行:
```powershell
node scripts/admin-test-env-acceptance.mjs `
--modules inbound-measurement `
--merchant-username $env:MERCHANT_TEST_USERNAME `
--merchant-password $env:MERCHANT_TEST_PASSWORD `
--origin-warehouse-name '<固定国内仓名称>' `
--channel-name '<固定渠道名称>' `
--channel-code '<固定渠道编码>' `
--order-profile-mode randomized `
--wait-split-count 100 `
--output '<本地报告绝对路径>.json'
```
`inbound-measurement` 会自动展开 `orders` 前置。提供完整商户账号和密码后,总入口会复用该客户并移除自动创建客户的 `merchant-qualification-fixture`;两个商户参数必须同时提供。
如果需要自动新建并审核一个隔离客户,不传复用商户账号,改用:
```powershell
node scripts/admin-test-env-acceptance.mjs `
--modules merchant-qualification-fixture,orders,inbound-measurement `
--customer-name '<本轮客户名称>' `
--origin-warehouse-name '<固定国内仓名称>' `
--channel-name '<固定渠道名称>' `
--channel-code '<固定渠道编码>' `
--order-profile-mode randomized `
--wait-split-count 100 `
--output '<本地报告绝对路径>.json'
```
## 报告核验
成功报告中的 `createdResources.waitSplitFixtures` 每条至少应核对:
- `tenantId`、`orderId`、`inboundId`、`inboundCode`
- `processStatus=WAIT_SPLIT`
- `reviewStatus=APPROVED`
- `receivingWarehouseName`、`channelCode`、`channelName`
- `destinationType`、目的仓字段、`fulfillmentType`
- `pickupMethod`、`taxMode`、`pricingTaxMode`、`containerMode`、`customsInspection`
- SKU 数、总箱数、托数、毛重、净重和测量档案
建议同时检查:
- fixture 数量等于本轮 `--wait-split-count`
- `inboundCode` 去重数等于 fixture 数量
- 固定客户、国内仓和渠道只有一个唯一值
- `failed=0` 且报告顶层 `success=true`
- 随机批次包含预期目的类型和履约类型
报告生成前会扫描密码、Token、文件二进制、base64 和 OCR 原文等敏感内容。报告仍属于本地验收证据,不应提交到源码仓库。
## 人工分柜验收
### 1. 生成分柜准备清单
人工分柜模块默认生成 6 票同客户、同起运仓、同渠道的 `WAIT_SPLIT` 数据,并在报告的 `createdResources.manualOrderSplittingFixture` 中给出:
- 一票 `PARTIAL`:只分配部分箱数,固定保留 1 箱;
- 两票 `FULL_1/FULL_2`:整票加入同一个柜,验证多订单拼柜;
- 一票 `UNASSIGNED_CONTROL`:不得加入计划,用于核对未分配对照和候选余量;
- 全部订单、入库单、入仓码、箱数、客户、仓库和渠道信息。
复用既有客户时执行:
```powershell
node scripts/admin-test-env-acceptance.mjs `
--modules manual-order-splitting-fixture `
--merchant-username $env:MERCHANT_TEST_USERNAME `
--merchant-password $env:MERCHANT_TEST_PASSWORD `
--origin-warehouse-name '<固定国内仓名称>' `
--channel-name '<固定渠道名称>' `
--channel-code '<固定渠道编码>' `
--order-profile-mode fixed `
--wait-split-count 6 `
--output '<人工分柜准备报告绝对路径>.json'
```
`manual-order-splitting-fixture` 会自动展开 `orders → inbound-measurement`。本入口通过正式 HTTP 接口写入测试数据,仍需当前对话明确授权目标环境。
### 2. Admin 人工操作
根据准备报告执行:
1. 打开智能装柜页面,创建与清单一致的起运仓、渠道模拟柜。
2. 创建智能装柜计划。
3. 严格按 `assignments[].expectedAllocatedPackageCount` 分配三票入仓码。
4. 不要选择 `unassignedControl`。
5. 保存计划但暂不推送预装,记录页面或接口返回的 `loadingPlanId`。
此阶段只是“计划分柜”。父子订单和最终实装数量要到 PDA 实装结算后形成,不能在本节点提前宣称已经完成订单拆分。
### 3. 人工操作后只读核验
```powershell
node scripts/admin-test-env-acceptance.mjs `
--modules manual-order-splitting-verify `
--manual-split-fixture-report '<人工分柜准备报告绝对路径>.json' `
--manual-split-plan-id '<页面记录的 loadingPlanId>' `
--output '<人工分柜核验报告绝对路径>.json'
```
核验模块只发送 GET 请求,检查:
- 计划与柜次 ID 有效,计划仍处于可继续验收的 `EDITING/LOADING`;
- 柜次仓库、渠道与准备清单一致;
- `PARTIAL/FULL_1/FULL_2` 的计划箱数精确匹配;
- 未混入清单外入库单,`UNASSIGNED_CONTROL` 未被误选;
- 候选回查不出现异渠道或异仓入库单;
- 每票分配后的候选剩余箱数满足数量守恒。
核验报告会写入 `createdResources.manualOrderSplittingVerification`,记录来源 marker、计划、柜次和已核验分配,不保存凭据。
## 人工推送预装验收
完成上一节人工分柜核验后,继续验证“点击推送预装,但尚无真实柜号、未关联订舱”的节点。
### 1. 生成推送前操作清单
使用上一节生成的“人工分柜核验报告”:
```powershell
node scripts/admin-test-env-acceptance.mjs `
--modules manual-preload-push-fixture `
--manual-preload-source-report '<人工分柜核验报告绝对路径>.json' `
--output '<推送预装前准备报告绝对路径>.json'
```
该模块只发送 GET 请求,并确认:
- 智能装柜计划仍为 `EDITING`;
- 人工分柜明细存在且版本有效;
- 尚未建立预装 bridge;
- 柜次仍为无真实 `containerNo`、无 `oceanBookingId` 的内部模拟柜。
成功后,报告中的 `createdResources.manualPreloadPushFixture` 会保存推送前计划版本、明细快照和操作说明。
### 2. Admin 人工推送
在同一智能装柜计划上点击“推送预装”。本节点只做这一项操作:
- 不录入真实集装箱号;
- 不创建或关联订舱;
- 不确认预装计划;
- 不领取或创建 PDA 任务。
推送成功后立即执行下一步只读核验。
### 3. 推送后只读核验
```powershell
node scripts/admin-test-env-acceptance.mjs `
--modules manual-preload-push-verify `
--manual-preload-source-report '<推送预装前准备报告绝对路径>.json' `
--output '<推送预装核验报告绝对路径>.json'
```
核验内容包括:
- 计划仍为 `EDITING`,版本相对推送前递增,分柜明细没有漂移;
- 每票入库单生成 `PENDING` 预装 bridge,箱数与人工分柜一致;
- 正式预装清单详情可见;
- 无真实柜号阶段 `canConfirm=false`、`readyForPda=false`;
- PDA 任务查询返回 `A0404`;
- 推送没有伪造真实柜号、订舱关联或改变稳定柜次身份。
通过后报告写入 `createdResources.manualPreloadPushVerification`,下一节点再处理订舱放舱、真实柜号关联和整份预装计划确认。
## 人工订舱关联、预装确认与 PDA 待领取验收
### 1. 冻结操作前基线
以上一节“推送预装核验报告”为来源:
```powershell
node scripts/admin-test-env-acceptance.mjs `
--modules manual-pda-ready-fixture `
--manual-pda-source-report '<推送预装核验报告绝对路径>.json' `
--output '<PDA就绪前准备报告绝对路径>.json'
```
准备模块只发送 GET 请求,确认:
- 已推送计划仍为 `EDITING`,版本和分柜明细没有变化;
- 原柜次仍无真实柜号、无订舱关联;
- 当前 `canConfirm=false`、`readyForPda=false`;
- PDA 查询仍返回 `A0404`。
报告的 `createdResources.manualPdaReadyFixture` 保存柜次、计划、版本和明细基线。
### 2. Admin 人工操作
严格按以下顺序操作:
1. 创建与准备清单客户、起运仓、渠道、柜型一致的海运订舱 DRAFT,并补齐承运船司代码 `carrierCode`、提单号、船名、航次、ETD、ETA、参与方和柜型需求。
2. 点击放舱,使订舱进入 `RELEASED`。此时不应自动生成真实柜次或 PDA 任务。
3. 在原内部柜次上选择该订舱未占用的柜型需求,录入唯一真实 `containerNo` 完成关联;不得新建替代柜次。
4. 回到预装详情,确认门禁变为 `canConfirm=true`,再执行整份预装计划确认。
5. 确认成功后不要领取 PDA 任务,记录订舱号和真实柜号并立即执行核验。
### 3. 只读核验 PDA 待领取状态
```powershell
node scripts/admin-test-env-acceptance.mjs `
--modules manual-pda-ready-verify `
--manual-pda-source-report '<PDA就绪前准备报告绝对路径>.json' `
--output '<PDA待领取核验报告绝对路径>.json'
```
核验内容包括:
- 订舱为 `RELEASED`,且 allocation 唯一指向原 `containerBookingId`;
- 真实柜号在原柜次上补全,`cabinetNo/loadingPlanId/items` 不漂移;
- 整份预装为 `CONFIRMED`、`readyForPda=true`,并返回唯一 `pdaTaskId`;
- PDA task 四元身份正确,`taskStatus=LOADING`、`workflowStatus=UNASSIGNED`;
- PDA 计划箱数与人工分柜总箱数一致;
- 尚未领取任务时各来源入库单仍保持 `WAIT_SPLIT`。
通过后报告写入 `createdResources.manualPdaReadyVerification`。下一节点进入 PDA 人工领取、扫码、批量提交和待复核验收。
## PDA 人工领取、扫码和批量提交验收
### 1. 冻结 PDA 作业前基线
以上一节“PDA 待领取核验报告”为来源:
```powershell
node scripts/admin-test-env-acceptance.mjs `
--modules manual-pda-batch-fixture `
--manual-pda-batch-source-report '<PDA待领取核验报告绝对路径>.json' `
--output '<PDA作业前准备报告绝对路径>.json'
```
准备模块只发送 GET 请求,确认并记录:
- 任务为 `UNASSIGNED`,尚未绑定作业员;
- PDA 待办中只有同一稳定 `taskId`;
- 每条任务明细包含稳定 `boxCodes`,数量足以覆盖计划箱数;
- 库存快照的任务版本和四元身份一致;
- 操作历史尚无 `CLAIM/BATCH/REVIEW/COMPLETE_LOADING`。
报告的 `createdResources.manualPdaBatchFixture.taskItems[].scanBoxCodes` 提供本轮应扫描箱码,`boxCodes` 保留服务端完整下发集合;库存 `snapshotToken` 不写入报告,PDA 提交前必须实时重新获取。
### 2. PDA 真机人工操作
1. 使用目标仓库作业员进入 PDA 待办并领取任务,确认页面进入作业中。
2. 按准备报告对应任务明细,在真机逐箱扫描稳定箱码;同一箱码不能重复扫描。
3. 所有明细均按计划箱数完成,本节点不使用 `PARTIAL` 或 `SKIP`。
4. 点击提交时由 PDA 重新获取库存快照,并只发送一次原子 batch。
5. 成功后停在 `AWAITING_REVIEW`,不要上传五类证据,不要复核或执行最终完成。
服务端 batch 只接收明细与数量,不保存逐次扫码轨迹。因此自动报告只能证明稳定箱码已下发和服务端数量已收敛,真机逐箱扫码过程必须保留人工证据。
### 3. 批量提交后只读核验
```powershell
node scripts/admin-test-env-acceptance.mjs `
--modules manual-pda-batch-verify `
--manual-pda-batch-source-report '<PDA作业前准备报告绝对路径>.json' `
--output '<PDA待复核核验报告绝对路径>.json'
```
核验内容包括:
- 任务已绑定真实作业员,版本递增;
- 所有明细均为 `PICKED`,已拣箱数等于计划箱数;
- 任务保持 `taskStatus=LOADING`,工作流进入 `AWAITING_REVIEW`;
- pending 与 detail 均显示零条未处理明细;
- 操作历史恰有一次 `CLAIM`、一次 `BATCH`,没有 `REVIEW/COMPLETE_LOADING`;
- 各入库单服务端汇总 `expectedCount=pickedCount`;
- 待复核取证 GET 已开放。
通过后报告写入 `createdResources.manualPdaBatchVerification`,并明确标记逐次扫码仍需真机证据。下一节点处理五类装柜证据和 PDA 最终完成。
## 五类装柜证据、PDA 最终完成与 LOADED 验收
### 1. 冻结最终完成前基线
以上一节“PDA 待复核核验报告”为来源:
```powershell
node scripts/admin-test-env-acceptance.mjs `
--modules manual-loading-complete-fixture `
--manual-loading-complete-source-report '<PDA待复核核验报告绝对路径>.json' `
--output '<装柜最终完成前准备报告绝对路径>.json'
```
准备模块只发送 GET 请求,确认:
- PDA 任务为 `AWAITING_REVIEW`,所有明细已拣齐;
- 装柜计划仍为 `LOADING/IN_PROGRESS`;
- 任务审计只有一次 `CLAIM` 和一次 `BATCH`;
- 当前证据归属入库单没有 ACTIVE 装柜证据;
- 真实柜号和 `RELEASED` 订舱门禁仍有效。
报告的 `createdResources.manualLoadingCompleteFixture` 会固定证据归属、五类证据要求和最终完成前版本。
### 2. PDA 真机人工操作
在同一 PDA 任务内现场完成:
1. 拍摄空仓照 `PHOTO_STEP_1`。
2. 拍摄半仓照 `PHOTO_STEP_2`。
3. 拍摄满仓照 `PHOTO_STEP_3`。
4. 拍摄锁仓照 `PHOTO_STEP_4`。
5. 拍摄带锁码照 `SEAL`,并填写非空锁码。
6. 确认五类均为 ACTIVE 后,只点击一次最终完成。
不要调用旧入库单级兼容完成入口;当前唯一正式动作是 PDA task 的最终完成。成功后不要继续修改柜号、计划或证据。
### 3. LOADED 终态只读核验
```powershell
node scripts/admin-test-env-acceptance.mjs `
--modules manual-loading-complete-verify `
--manual-loading-complete-source-report '<装柜最终完成前准备报告绝对路径>.json' `
--output '<LOADED终态核验报告绝对路径>.json'
```
核验内容包括:
- 五类 ACTIVE 证据各一份,SEAL 锁码非空且每张图片可鉴权下载;
- 任务 `taskStatus/workflowStatus` 均为 `COMPLETED`;
- 操作历史恰有一次 `COMPLETE_LOADING`,并保留原 CLAIM/BATCH;
- 原装柜计划进入 `COMPLETED`;
- 所有来源入库单进入 `LOADED`,状态历史包含 `LOADING → LOADED`;
- 对应统一订单详情投影为 `LOADED`;
- 柜次实装分片唯一,实装箱数等于 PDA 已拣总箱数;
- 货柜总览聚合 COMPLETED PDA 和五类 ACTIVE 证据。
通过后报告写入 `createdResources.manualLoadingCompleteVerification`。至此,本指南覆盖的国内人工验收链已经从订单造数连续到装柜 `LOADED`;后续报关、国内出仓和海外接柜另按对应节点扩展。
## 失败、重跑与批量拆分
- `admin-test-env-acceptance.mjs --wait-split-count` 的普通批次遇到第一条失败即停止;`it-test-wait-split-bulk.mjs` 会记录该票失败并继续尝试后续票。两种入口都不会自动删除或回滚已经成功创建的订单。
- 先查看日志和 JSON 报告中最后一个成功 fixture、失败接口的 `code/requestId/traceId`,修复前置后再运行剩余数量。
- 重跑会生成新业务单号和入仓码,不覆盖旧订单;不要假设跨多次运行的入仓码一定连续。
- 每次运行的随机序列从 1 重新开始;分批执行时组合可能重复,但仍保持固定三项和真实契约。
- 大于 100 条时建议按 50-100 条拆批,并为每批使用独立报告文件名。
- 若固定渠道只有少量目的仓,目的仓重复是合法结果;脚本只保证从真实可计价集合选择,不保证每批目的仓均匀分布。
## 常见阻断
| 现象 | 核对项 |
|---|---|
| 未找到固定起运仓 | 仓库名称是否精确一致、状态是否 ACTIVE、类型是否 DOMESTIC |
| 未找到固定物流渠道 | 渠道编码/名称是否精确一致、价格簿是否 ACTIVE、起运仓是否匹配 |
| 没有可计价目的仓 | 价格簿目的类型、目的仓映射、报价税制和仓库状态 |
| 私人地址创建失败 | `destinationWarehouseId` 必须为空,收件人字段必须完整 |
| 测量审核未到 WAIT_SPLIT | 称重图片、托数、净重、总箱数和测量箱数是否精确核平 |
| 报告数量不足 | 查看首个失败模块;已成功数据不会因后续失败回滚 |
## 离线验证
修改生成器或本文关联参数后,至少运行:
```powershell
node --check scripts/admin-test-env-acceptance.mjs
node --check scripts/it-test-wait-split-bulk.mjs
node --check scripts/admin-test-env-modules/orders.mjs
node --check scripts/admin-test-env-modules/manual-order-splitting-fixture.mjs
node --check scripts/admin-test-env-modules/manual-order-splitting-verify.mjs
node --check scripts/admin-test-env-modules/manual-preload-push-fixture.mjs
node --check scripts/admin-test-env-modules/manual-preload-push-verify.mjs
node --check scripts/admin-test-env-modules/manual-pda-ready-fixture.mjs
node --check scripts/admin-test-env-modules/manual-pda-ready-verify.mjs
node --check scripts/admin-test-env-modules/manual-pda-batch-fixture.mjs
node --check scripts/admin-test-env-modules/manual-pda-batch-verify.mjs
node --check scripts/admin-test-env-modules/manual-loading-complete-fixture.mjs
node --check scripts/admin-test-env-modules/manual-loading-complete-verify.mjs
node --test scripts/script-documentation-contract.test.mjs scripts/admin-test-env-modules/it-test-wait-split-bulk-contract.test.mjs scripts/admin-test-env-modules/merchant-qualification-fixture-contract.test.mjs scripts/admin-test-env-modules/inbound-measurement-box-code-contract.test.mjs scripts/admin-test-env-modules/manual-order-splitting-contract.test.mjs scripts/admin-test-env-modules/manual-preload-push-contract.test.mjs scripts/admin-test-env-modules/manual-pda-ready-contract.test.mjs scripts/admin-test-env-modules/manual-pda-batch-contract.test.mjs scripts/admin-test-env-modules/manual-loading-complete-contract.test.mjs
git diff --check
```
离线检查不访问环境,也不代表 HTTP 批量生成已经通过。真实生成必须另行获得目标环境写数据授权。