Files
baiyue-firstleg/scripts/admin-test-env-modules
..
2026-08-08 10:11:04 +08:00
2026-08-28 09:19:18 +08:00
2026-09-15 10:37:34 +08:00
2026-08-13 15:59:05 +08:00
2026-10-08 17:07:57 +08:00
2026-10-08 17:07:57 +08:00
2026-10-08 17:07:57 +08:00
2026-10-08 17:07:57 +08:00
2026-10-08 17:07:57 +08:00
2026-08-08 10:11:04 +08:00
2026-09-15 13:36:58 +08:00
2026-10-19 16:41:20 +08:00
2026-08-26 11:10:42 +08:00
2026-08-26 11:10:42 +08:00
2026-08-19 09:42:07 +08:00
2026-08-19 09:42:07 +08:00
2026-09-16 11:06:33 +08:00
2026-08-19 09:42:07 +08:00
2026-09-15 10:37:34 +08:00
2026-10-08 17:07:57 +08:00
2026-10-08 17:07:57 +08:00
2026-09-30 17:13:11 +08:00
2026-08-27 11:42:05 +08:00
2026-09-15 13:36:58 +08:00
2026-08-26 16:50:22 +08:00
2026-08-26 16:50:22 +08:00
2026-08-26 16:50:22 +08:00
2026-08-26 16:50:22 +08:00
2026-08-26 16:50:22 +08:00
2026-08-26 16:50:22 +08:00
2026-08-26 16:50:22 +08:00
2026-10-08 17:07:57 +08:00
2026-10-08 17:07:57 +08:00
2026-09-16 11:06:33 +08:00
2026-08-15 11:36:53 +08:00
2026-09-15 14:30:47 +08:00
2026-08-14 09:14:52 +08:00
2026-08-14 09:14:52 +08:00
2026-09-15 11:54:14 +08:00
2026-09-15 11:54:14 +08:00
2026-09-15 10:37:34 +08:00
2026-10-08 17:07:57 +08:00
2026-09-30 17:13:11 +08:00
2026-09-16 15:21:08 +08:00
2026-10-08 17:07:57 +08:00
2026-09-20 19:48:49 +08:00
2026-08-26 15:24:48 +08:00
1
2026-08-24 19:58:35 +08:00
2026-08-26 15:24:48 +08:00
2026-09-14 20:20:57 +08:00
2026-09-15 13:36:58 +08:00
2026-08-26 15:24:48 +08:00
2026-10-08 17:07:57 +08:00
2026-10-08 19:09:30 +08:00
2026-10-08 17:07:57 +08:00
2026-10-08 17:07:57 +08:00
2026-09-16 11:06:33 +08:00
2026-10-08 19:09:30 +08:00
2026-09-20 19:48:49 +08:00
2026-09-15 11:54:14 +08:00
2026-08-26 11:10:42 +08:00
2026-09-04 15:19:45 +08:00
2026-09-20 19:45:24 +08:00
2026-09-20 19:45:24 +08:00
2026-10-08 17:07:57 +08:00
2026-08-30 17:02:19 +08:00

Admin 测试环境 HTTP 模块

procurement-sample-fulfillment.mjs 是采购样品完整正常路径的内部验收助手,钱包综合模块也调用同一流程,并将采购请求证据独占保存于 reports/procurement-wallet-checkpoints/<marker>.json;客户会话在 finally 退出。由 ../procurement-sample-test-env.mjs 注入本轮独立已充值客户、客户会话、有效收货仓、受控上传及权威钱包读取。创建新样本,执行正额货款、两次海外收货、两箱装箱、预估冻结、国际交寄、逐箱国内收货、实际核费及寄客户,逐阶段核对钱包现金/冻结和费用来源,关键请求原键重放。每次请求前必须 checkpoint;未知结果停写保留样本,不自动新键重试或清理。已接入显式 TEST 入口;未执行时不计作真实 HTTP 通过,也不覆盖异常、退款或权限全部矩阵。离线合同 procurement-sample-fulfillment-contract.test.mjs 验证前置缺失、余额不足、请求前持久化及未知结果停写。

phase5-root-fulfillment 可由总入口显式 --prepare-domestic-pda-h5 true 仅准备本轮国内H5待拣任务。调用 phase3-order-splitting.loadOneFragment 到正式计划确认、待拣任务及箱唛就绪即返回,不领取、不拣货、不继续海外;结果固定 PREPARED_NOT_VERIFIED,不算全链验收。默认完整链不变,范围及授权见根脚本README。

fleet-capacity-pool-schema-contract.test.mjs 是离线数据库合同:验证发布与持久命令唯一约束、唯一商业履约来源、可空实际数量、服务与统一基线一致、非破坏性结构补齐及独立销售/调度权限;不访问环境、不证明真实履约已通过。

当前新增脚本的执行边界

dispatch-repair-acceptance.mjs 是本批排车修复的内部增量验收助手,不是独立 CLI。verifyDispatchRepair 默认只返回计划,显式执行要求 TEST、Lastleg/Admin 健康及 Schema 就绪、请求前后持久化检查点。context.producerEvidence 指定本轮生产回执 JSON 的路径及 SHA-256;文件须含 environment=TEST、marker、已部署 Lastleg 的 sourceCommit 和 requests。请求条目保留实际 method/path/body/actor、status=RESPONDED、http/code/requestId/traceId/result,不得保存登录凭据或 Token。助手从正式创建响应及父来源回执提取业务号、客户和仓库,形成资源白名单;所有 fixture 关联身份在首个请求前核对,不能仅声明“本轮新建”。缺样本标记 NOT_RUN,不借旧业务样本。

该助手核对取消出库/取消排车/释放重排、实际出库门禁、换标全托、混托两种展示来源、拆合托后重核、原箱回仓及只读权限。两种混托须使用独立排车/托盘/预订,普通与外接来源的箱数由生产实收回执确定,并回查实物仓位组成及报价数量/单价/金额。原箱限本轮单箱出库,按原始 SKU、客户、仓分页精确筛选库存及流水,以排车号匹配 OUTBOUND;先取完成前 S、首次完成后 R,再同键重放取 R′,核对本轮唯一 SKU 的完成前零库存基线及首次总量、可用展示数量、箱数恢复、receiptNo 的 EXCEPTION_RETURN_IN 精确集合、目标托盘库位及重放零增量。HTTP availableQuantity 是受实箱可用量限制的展示值,不冒称裸余额证明。只对已授权的新排车调用 DELETE 取消状态,不运行移托 DELETE 负向分支,不物理删除、SQL 造数或清理。未知结果保存原命令并停写;证据明确标为合成测试资料,不冒充真实外部预约/POD。保留 sourceEventsVerified=false,来源事件、人工页面及 PDA 真机仍单列。相邻 dispatch-repair-acceptance-contract.test.mjs 只做离线验证,未实际执行不得表述为环境通过。

  • 人工状态矩阵的 FEE_CONFIRMING 使用独立新订单,在测量提交成功后暂停审核,经正式 fees/calculate 生成费用;回查同一费用版本、入库客户身份、测量仍待审核及入仓码精确筛选结果。该状态是必验项,不再列入不可造数缺口;不发送费用、不推进该样本、不借历史数据。入口仍为 --modules manual-state-matrix,对应 order-inbound-status-fixtures-contract.test.mjs 和 manual-state-matrix-contract.test.mjs。

  • WAIT_PRICING 另建保留原始 APPROVED 的订单,先形成未发布的 FEE_CONFIRMING,再通过客户实时渠道目录与报价选择同仓、同目的仓、同税制的不同渠道,以正式申报更新触发费用失效;回查 WAIT_PRICING/UNPRICED、新渠道及精确筛选。缺少可计价替换渠道、客户漂移或状态未收敛均失败;不写业务SQL,退出专用目录查询会话。该状态同样为必验项,原先借历史 WAIT_SPLIT 样本的兜底已移除。

  • grouped-dispatch-acceptance.mjs 由默认 phase4-overseas-dispatch 在主链预排前调用。使用本轮独立未拣托盘,通过 /drafts/pre-arrange 验证错组拒绝、原草稿不变、每组独立排车、同命令重放及数量/来源;成功响应明确的本轮未拣明细通过正式 API 移除并释放锁,保留空对照单据。写请求超时或 5xx 保留资源,不自动重试或清理未知结果。对应 grouped-dispatch-acceptance-contract.test.mjs。

  • fleet-trip-finance-acceptance.mjs 由默认 phase5-overseas-fulfillment 结案后调用。只读本轮实际发车车次及已冻结派送来源,核对 AVAILABLE/BILLED/SETTLED 来源、原币应收、明确归属实收与单据,未分配实收保持未知(null 或 NON_NULL 响应省略);前后车次、资源、审核不得变化。失败保留 CHECKING 证据,不创建账单、收款或财务分配。对应 fleet-trip-finance-acceptance-contract.test.mjs 的部分/全额付款和受限权限反例不代替真实样本;默认链没有独立实付样本,不能据此宣称付款生命周期或真实权限边界已经验收。

两者都是内部模块,没有独立 CLI;沿 Admin 原入口的 TEST 配置、统一会话、JSON 报告与权限执行。依赖缺失、版本未部署或前置链失败时明确失败,不借历史样本或生成模拟成功。源码准备与实际执行分开记录;离线合同不能代替真实 HTTP。开始验收后,先跑新增合同及脚本文档门禁,再跑相应依赖链和全量;当前执行结果仅维护在测试环境部署主契约及其原始报告中。

fleet-handover-acceptance.mjs 是车辆专项实际DEPART后的内部交接助手,由../fleet-test-env-acceptance.mjs调用;仅接受本轮已验证车次/派送及自有PDA会话,核对原DEPART/费用不变、真实剩余货物和接替资源、同键重放及旧资源分别释放。调用方必须注入发送前持久化检查点,落盘失败不发送HTTP;仅保存脱敏原命令及附件摘要。签收前导出本轮handover-fixture.json供页面/运营统计检查,成本验证与账号清理由同一入口编排;失败保留证据,不借旧车次或自动续跑。对应fleet-handover-acceptance-contract.test.mjs为离线合同。

fleet-quotes-operations.mjs 的runQuoteSession使用独立TEST登录及本轮客户准备,run只验证报价增改/状态/历史及原子CSV;verifyOperations另需当前轮DEPART的独立托位/货量/原币成本期望,报价通过不代表运营统计通过。后者默认只读,实测更正必须显式传入写入开关和独立幂等命名空间;不推算财务实付。由专项编排器提供持久化检查点和独占报告目录,原请求未知时不自动重造样本,结束退出自身会话。对应fleet-quotes-operations-contract.test.mjs不访问真实环境。

fleet-trip-cost-acceptance.mjs 是同轮实际发车后的车次直接成本内部验收助手,由车辆专项入口显式调用 verifyFleetTripCosts(context, module, tripProof, inputs),不独立造车次、不修改IAM。调用方须提供真实DEPART、独立确认的自有/外接逐票托盘及托位预期、仅列表权限和无车次权限两个独立会话,并负责退出;缺前置在成本写入前停止。写入本车次两条成本并更正,最终CNY100.03、USD13.07分别按整数分和真实托位核验分摊,检查重放、历史、权限拒绝后事实不变;公司维修成本不并入。请求意图和响应通过调用方checkpoint脱敏落盘,失败保留原样本/键,不自动重跑、删除或清理。fleet-trip-cost-acceptance-contract.test.mjs 为离线合同,不证明真实HTTP已通过。

fleet-company-cost-acceptance.mjs 是公司车辆成本内部验收模块,由 ../fleet-company-cost-test-env.mjs 使用独立 marker 和 TEST 会话调用,不依赖或借用 financeFullFixtures。自行创建专用供应商、车辆及维修/救援记录,覆盖 CNY/USD 来源匹配、未付款作废重建、凭证字节、部分/全额付款重放、超付与已付改写拒绝;客户隔离只读检索本 marker 费用未进入客户费用池,不借用其他客户查询明细或账户,避免将其他并行任务的正常变化误判为污染。要求当月已有启用 USD 汇率,缺失则停止,不修改共享汇率。报告和清理边界见脚本根索引;fleet-company-cost-acceptance-contract.test.mjs 为离线替身测试,不调用 TEST。

fleet-driver-qualification.mjs 是司机证照专项可选模块,从 admin-test-env-acceptance.mjs --modules fleet-driver-qualification --output <报告路径> 执行,凭据由调用者显式 node --env-file=<授权TEST环境文件> 提供。经正式API创建两名本轮受控司机、上传非真实证照PNG,验证缺件/审核/打回/重提、30天内提醒、任务结束跨到期日禁止、非必需资质不阻断、关键资料及附件变化重审、旧版本拒绝、附件跨司机归属和历史下载。仅操作本轮司机及文件,不改排车/库存/财务、不执行SQL或部署;成功失败均按最新版本停用本轮司机,保留样本和报告 createdResources.fleetDriverQualification。失败重跑使用新样本,原失败证据不改写;该专项不代替整车实际发车链和浏览器验收。

fleet-vehicle-care.mjs 是可选车辆运维专项,通过正式入口 admin-test-env-acceptance.mjs --modules fleet-vehicle-care --output <报告路径> 执行,不单独运行。仅用于获授权 TEST,凭据由调用者显式 node --env-file=<指定环境文件> 提供;复用总入口 gateway/username/password 参数。经正式 API 创建本轮专用车辆,再复用 vehicle-care.mjs 验证六类记录、版本、更正历史、照片幂等及跨车隔离;不依赖订单、库存、报价或历史样本。写入仅涉及测试车辆、运维记录和图片;成功/失败均保留报告 createdResources.fleetVehicleCare 和样本,finally 读取最新版本停用本轮主车辆,内部助手停用隔离车辆,不删除记录或文件。失败重跑创建新样本,不修改原失败证据;不执行 SQL 或部署。该场景不证明费用已经入账或付款。

fleet-cross-customer-fixture.mjs 导出 createFleetCrossCustomerFixture,由上述专用 TEST 入口显式调用。默认只返回准备契约;执行时重新核对指定实际收货仓和FBA目的仓,通过正式客户资质、普通转运来货、PDA一托一箱测量/绑定/实收及客户确认生成两套独立本轮货物,再以真实来源一次 Create 建立同一原生排车主单、自动唯一 Fleet 资源记录并完成两级审核,停在 LOADING、零扫码、未生成出库和派送单。每条明细保留其真实客户、来货码、物理托盘和库位,主单不挂客户。客户上下文独立且不覆盖外层客户环境,退出本函数创建的客户会话,PDA启停归外层入口;无外接预订循环依赖、业务SQL、部署或自动恢复。fleet-cross-customer-fixture-contract.test.mjs 只证明生成编排及拒绝边界,真实运行另行留证。

fleet-cross-customer-acceptance.mjs 是跨客户同一原生排车主单的内部后半链验收函数,不是独立入口。默认只返回 fixture 契约、零网络;显式 execute:true 需要同批次两个独立客户、同仓各一托一箱已实收、同一主单已通过两级审核且未拣货,以及调用方提供的完整库存只读取证器。按各明细实际客户扫码,验证一个客户未核平时整车装车/发车拒绝及全部快照不变;全部实拣核平后按实际测量显式装车、平台逐客户目的地安排,再以当前主单版本统一发车、原键重放和分别签收。实托测量缺失明确阻断,不以计费/计划常量替代。前置门禁与事务中途回滚分别记录;默认后者为 NOT_TESTED,只有显式注入verifyDepartureRollback且返回精确本轮验证、完整一致性快照恢复相同后才记VERIFIED。专用../fleet-trip-rollback-test-env.mjs负责租约/脏读观察与持久化,普通入口不注入故障;钩子异常、未验证或快照漂移必须停止在正常发车前。失败保留当前样本与原请求,不自动续跑、补造或清理。对应合同 fleet-cross-customer-acceptance-contract.test.mjs 仅证明编排与反例断言,不能代替真实运行。临时账号生命周期、最小来货生成及报告保存由外层显式编排负责。

TERMINAL_READONLY 用于全部业务写入和结案助手均完成、仅专项入口汇总状态断言错误的已复核报告。结案助手成功状态为 CARGO_COMPLETED_AND_RESOURCES_RELEASED。该检查点登录后仅 GET 原车次、每张排车/派送、资源占用测试计划与精确财务来源版本,不重放任何业务写入,不覆盖原失败报告;真实状态、数量、签收或费用不符仍失败。它不补充生产者 ACK 或页面验收证据。

EXTERNAL_RECEIPT_CONFIRMED 仅接受原运营实收确认明确成功、后续只读/重放断言失败且尚未开始排车关联的样本。先核对原来货已可排车、实际容量及单一库存流水,再原键原载荷重放实收确认;不重新入库。重放比较以数据库持久化后的完整预订为基准,避免直接拿命令返回的纳秒 updatedAt 与数据库毫秒精度比较;货量、报价、版本及全部业务字段仍精确核对。实收总箱数字段为正式 receivedPackages。

EXTERNAL_PALLETIZED 仅用于原 PDA 入库命令明确成功、库存只读核对失败且尚未运营确认的原样本。要求保存原请求键、实托和本轮临时 PDA 账号,回查原容量预留、来货状态及账号仓绑定后,只重放原入库命令,不重新创建或收货;再继续运营核量。库存列表是分组汇总,来源归属须读取该组引用的余额详情及实物位置,并与本票不可变流水核对;不能假定汇总行包含来货码。每次显式续跑保存独立报告和原报告哈希,保留首次失败证据。

EXTERNAL_RECEIPT_READY 是另一处显式复核检查点:仅全/部分费用覆盖与占位均已验证、PDA账号创建明确因手机号冲突被拒绝、尚未创建外接来货时允许继续。继续前回查原车次分配、客户排车及未拣/未发事实;新测试PDA使用独立标识,不复用恢复前的联系电话生成序号。已有外接实收/关联或账号写入结果未知时不得使用此检查点。

若全覆盖命令已经返回成功、但后续只读核对失败,可在核对原出库/派送确实已保存且未执行后,显式使用 --resume-stage FULL_COVERAGE_PERSISTED。此模式要求原成功命令、出库号和完整派送集合,先查正式详情,再仅重放原键原载荷;不重新运行创建前的负向写用例,不更换请求键或重造业务单据。目的地以当前 destinationWarehouseCode 优先、fbaWarehouseCode 兜底,与车次及派送服务一致,不能用原始 FBA 快照否定已经变更的实际目的地。

车辆专项修复后可显式选择已复核的只读检查点:--resume-report reports/<原批次>/report.json --resume-stage FULL_COVERAGE,仍须新的 --run-id。只接受全覆盖阶段仅执行过 GET、尚无出库且无任何 POST 的失败记录;复核同一车次资源、排车货物及未拣/未发事实后继续原样本,原失败报告不覆盖,保留其哈希与旧检查记录。其他阶段及写入结果未知均拒绝自动续跑,须先按原命令核对实际结果。出库列表仅使用正式客户范围分页,再逐行匹配排车号;不假定该列表支持 dispatchNo 查询过滤。

车辆专项入口为 ../fleet-test-env-acceptance.mjs,先使用原 phase4-overseas-dispatch 依赖链创建本轮客户、头程费用和海外库存,再执行专用车辆编排;不改变已通过的 F40 默认调用顺序。默认 --plan 无网络,实际运行须显式 --execute --environment TEST --run-id <新批次>。仅串行运行,会创建当前批次资源及执行正式未执行单据取消重排,不执行部署、配置修改或业务 SQL 写入;原收货取证沿用现有只读读取器。失败保留原样本、请求与报告,不自动重造或续跑。

四个内部助手及各自 *-contract.test.mjs:fleet-booking-reservation-acceptance.mjs 验证询价/确认/超卖/取消的逐段占位与重放;fleet-fee-coverage-acceptance.mjs 用独立排车验证全覆盖及多原入仓的部分覆盖,核对原费用版本、目的地、快照及重放不重复收费;fleet-external-receipt-acceptance.mjs 通过正式来货与 PDA 测量、生成托盘、扫码绑定、照片和完成接口入库,按客户/仓/来货码查询余额与流水,验证重放不再入库、运营核量改价和预留替换;fleet-external-dispatch-acceptance.mjs 将该实收货物预排并绑定原车次,重核容量并逐客户审核,验证约定运费来源与重放。后两者会产生新外接货,必须走专用编排,不能直接加入只拣一张排车的 F40 默认流程。专项入口继续逐单 PDA 拣货、整车发车、逐目的地签收及资源释放;报告将 Finance 消费入池与生产者 ACK 分别记录,消费行存在不能冒充生产者已收到 ACK。以上助手不能独立当作全链入口,离线合同通过不代表真实 HTTP 或页面验收通过。

头程提交、平台编辑与取消按首次原始详情版本冻结请求。原键原载荷重放成功;同键异载荷、旧版本及新键重复操作分别核验拒绝后事实不变。Platform 编辑使用平台权限与显式客户范围,客户 Token 不得调用。

fleet-trip-fulfillment.mjs 是内部整车验收助手,不是独立入口。一张原生排车单对应一趟车;五期与F40通过正式API维护本轮车辆、司机及证照,提交并通过调度/理货两级审核,再读取该排车唯一自动生成的Fleet资源记录。PDA拣货核平后,显式确认装车完成,再由平台安排全车客户目的地派送,最后使用当前主单版本发车;不再独立创建、绑定或审核Fleet车次。实载托位、重量、体积及卸货站须有本轮真实来源证据,不能使用计费量或固定值;ID和版本无损保留,Long箱数字符串仅在安全数量边界归一化。资源及文件ID留在报告,失败保留原命令。直接调用者也须同步消费原生DTO及该顺序;合同通过不代表HTTP或PDA硬件验收。

prepareFleetTrip 对零扫码的装车中排车,须先显式退回装车前再维护资源并重走两级审核;已扫码时不能重排。confirmFleetLoading 验证已扫码编辑被拒绝且主单与实际货物零漂移,然后按真实装载预览/实测回执发送装车完成命令;PDA成功后,平台使用同一原键原载荷重放,必须保持原结果和版本。报告createdResources.fleetTrips[].reassignment保留原请求、前后快照及拒绝证据;未知写结果停止,不自动换键重造。装车返回版本不替代发车前重新读取的公共版本。

五期和F40签收后继续调用finishFleetTrip:货物结案、车辆任务结束、司机任务结束分别执行并重放,按真实资源占用所有者核对“结案仍占用车辆、只结束车辆仍占用司机”。两项结束后,通过原生Create创建本轮空排车取得下一趟资源占用,再重放旧结束请求,证明不能清除新占用;不调用退役Fleet空计划创建接口。只有当前空排车无来源/无箱/无扫码且创建结果明确时,才能按最新版本取消探针;结果未知不清理。地点、时间、原请求及业务号留在createdResources.fleetTrips[].closure,不含返程任务,离线模拟不能替代真实环境验收。

phase5-overseas-fulfillment.mjs 的 pickAll、saveReceiptAndComplete 也供显式授权的 ../mixed-container-outbound-test-env.mjs 留存混柜续跑入口复用;仍使用正式 PDA 拣货和签收文件绑定接口,不代替全模块验收。

总入口是 ../admin-test-env-acceptance.mjs。每个业务模块使用独立的同名 .mjs 文件,避免多个对话同时修改总入口。

phase3-loading.mjs 的 PDA 原子证据上传在未取得 HTTP 响应时最多尝试三次,冻结原 URL、作业员身份、幂等键、文件名/内容、证据版本和封签号;不重试 HTTP/业务拒绝或已收到响应后的读取失败。createdResources.loadingEvidenceTransport 保存各次结果及白名单网络错误码,不保存凭据或原始错误对象。phase3-evidence-transport-contract.test.mjs 用持久幂等模型验证响应丢失重放仅一条证据、持续传输失败有界终止及拒绝不重试;离线模型不替代真实 HTTP。

装柜模块每次执行时读取当前客户凭据,依次选本轮 merchantQualificationFixture、显式客户参数、显式加载的环境变量;选中的身份缺用户名或密码时在业务请求前停止,不能借另一客户补齐。不得在模块导入时缓存客户账号;phase3-loading-credentials.test.mjs 覆盖同进程切换客户、显式配置、当前环境读取及缺凭据写前拒绝。

orders.mjs 每次运行优先使用当前 merchantQualificationFixture 的完整账号对,其次为明确配置;不在模块 import 时缓存客户凭据。当前 fixture 不完整时停止,不与上一轮或环境账号拼接。orders-session-contract.test.mjs 在同进程重复调用真实订单登录入口,覆盖连续客户隔离,防止多模式串行时沿用前一轮身份。

phase4-overseas-pda.mjs 的收货入口对本轮 containerBookingId + containerNo 做有界候选收敛等待(最多 30 次、间隔 1 秒),只有唯一且可操作的原柜才继续;鉴权失败、畸形响应和重复候选立即阻断。它用于等待异步船节点投影,不构成事件重放证据。F40 在成功和失败时均保留 receivingCandidateEvidence 的逐次查询身份、结果和诊断信息,不覆盖已有收货会话,不借其他柜或历史柜继续。

多目的地排车C52:phase4-overseas-dispatch.mjs在本轮实际收货产生的同仓同客户托盘上验证多FBA目的地及重复目的地托盘的增加、移除、原键重放和拒绝后零漂移。路线期望从真实Detail、Items、Route与冻结候选独立推导,记录routeLifecycle;缺少两个目的地及同目的地双托时明确阻断。使用版本化服务器草稿/容器/来源占用、drafts/pre-arrange转换、原生Create、POST /{dispatchNo}/items/{dispatchItemId}/remove和PUT /{dispatchNo}/route,不使用旧独立pre-arrange或DELETE items。正式交接保留原生三个读取对象及实际sourceKeys,停在ACTIVE/BEFORE_LOADING,未装车不得标记完成;实测缺失另行记录。写前原子落盘,未知结果停写,同marker不能重新创建。定向入口仍为--modules phase4-overseas-dispatch;真实运行会写指定TEST,仍须环境授权,失败保留原样本。两份对应合同验证脚本编排,不能证明服务端路线已正确同步或真实HTTP生命周期通过。

船节点异常 C66:phase3-carrier-schedule-queries.mjs 的 captureCarrierExceptionEvidence 与 verifyCarrierExceptionTransition 对本轮原船任务采集只读 checkpoint,核对 CUSTOMS_HOLD/TERMINAL_HOLD/DOCUMENT_HOLD/UNKNOWN_HOLD 的追加、解除、重放及冲突前后正常实际/预计节点守恒。phase3-carrier-exceptions-contract.test.mjs 只验证离线比对逻辑;真实生命周期还需要 Integration 供应商结果经调度器消费的独立投递证据。默认 HTTP 链只采基线并保留该覆盖缺口;空异常数组、重复 GET、报关异常和合成快照均不能计为供应商异常生命周期通过。

对应本地数据库事务测试为 Firstleg CarrierScheduleExceptionPersistenceTest,使用真实 Service/Repository/MyBatis 和 H2,验证四类异常及解除的同事件重放、异摘要冲突、正常实际/预计节点整行不变,以及异常历史写入失败时事务回滚。它属于本地持久化验证,不代替 TEST MySQL 或真实供应商调度链验收。

phase5-root-fulfillment.mjs 是 F40 两箱根/余量专项,通过总入口 --modules phase5-root-fulfillment 准备本轮资质客户;TEST 与显式 --environment gray 的环境参数、授权和排除范围见脚本根 README。模块用正式下单、测量、国内 PDA 拆分装柜、船节点、海外 PDA 收货、拣货发车及文件签收链创建两柜真实来源。海外 PDA 必须按本轮客户、柜次、来源入仓 ID 和入仓码确定实际唯一接柜仓,再核对 Warehouse 主档;不得按仓列表顺序选择另一仓。默认根先签,编程调用 AcceptanceRun.context.f40SignatureOrder='CHILD_FIRST' 切换子先签;分别核对第一片签收不得根完成、最后一片签收才根完成、真实签收时间、状态历史和重放零新增。

默认税制为 BUY_DECLARATION;编程调用显式设置 AcceptanceRun.context.f40TaxMode='TAX_REFUND' 可执行退税链。内部模块 phase5-root-tax-customs.mjs 在每个实装柜走客户上传、平台回执、客户确认、发送执行、人工正式申报与放行、完成文件,再进入尾程;订单最终完成后回查本客户资料并校验原件、回执、完成文件的实际下载字节和 SHA-256。该模块不能独立执行,不用 SQL 修改状态,不借历史资料;依赖相同 TEST 授权、当轮客户与只读取证器,失败及重跑保留各轮原始报告。直接合同为 phase5-root-tax-customs-contract.test.mjs,离线通过不代替实际 HTTP 或页面验收。

AcceptanceRun.context.f40SignatureOrder='ROOT_SIGNED_REMAINDER_CANCELLED' 单独验证合法末票余量取消:本轮新根通过 orderStopAtApproved=true 停在原始 APPROVED,只装运签收首箱;回查真实履约树及未装子单原始 APPROVED、入仓 WAIT_SPLIT 和一箱余量后,调用公开取消接口。PROCESSING 子单不得作为取消样本。根完成事件必须唯一发布,取消子单完成事件显式为零;原键原版本原载荷取消重放成功;同键异载荷及新键重复取消返回 A0409,根子版本、历史、摘要、履约树及完成 Outbox 均不漂移。两种双签模式仍须两片实际签收,不能用取消替代第二签。

会写已授权测试环境,保留新客户、单据、文件及报告,临时海外 PDA 在 finally 停用;失败保留样本,不自动删除或重复执行部分已完成链。签收资料使用新 key 保存同文件时,按正式保存命令递增一次资料版本、新增一条版本历史及 SAVE_DOCUMENTS 审计;签收时间、状态、原完成记录、文件绑定和根子完成事件不得变化。同一新命令再用原 key、原请求重放,必须明确 replayed=true 且完整资料、派送事实、版本和审计历史零漂移。资料保存前后及原 key 重放响应保存在 phase5RootFulfillment.receiptReplayProofs,失败也保留已取得的快照。

配置仅来自显式指定的目标环境文件,报告由总入口 --output 指定。完整验收还须向 AcceptanceRun.context.f40ReadOnlyOutboxEvidence 提供本轮客户/根/实际来源的只读完成 Outbox 计数(取消模式必须返回零事件子行);缺少该证据明确为 HTTP_VERIFIED_OUTBOX_PENDING 和阻断,不能报告全部通过。海外收货同时需要 AcceptanceRun.context.phase4ReceivingEvidenceReader 捕获首次完成和重放前后的完整库存证据,缺失明确阻断;四阶段原始库存快照通过 phase5RootFulfillment.receivingCompletionEvidence 原样保存,部分捕获与失败也保留,不用终态补造历史。离线合同为 phase5-root-fulfillment-contract.test.mjs;不能代替真实环境验收。

单票串行验收可显式传 --modules phase4-overseas-return-followups --return-main-chain-only true:仍由总入口准备本轮客户并完成退货签收、合箱、换标和出库;不执行第二客户、跨仓和并发扩展,报告 excludedScope 记录排除范围,不代表完整退货边界回归。目标由显式网关与账号参数指定;仅在已授权环境执行,保留业务单据及 --output 报告,失败先核对报告再重跑,不自动清理。

普通库存换标回归由 phase4-overseas-pda-operations 验证:正常箱先完成混合换标的箱标与 SKU 阶段,另两箱保留跳过/异常;首次显式异常完工后经平台 /rework 退回并验证幂等,返工重新完成全部箱标/SKU 事实,再生成本轮目标托盘、绑定及核对库存流水,最后正常完工和客户确认。PDA 不自行批准复核,不在客户确认后才首次组托;异常首次完工会创建关联异常记录,属于测试数据副作用,保留为验收证据。

尾程暂扣按真实入库阶段验收:phase4-tail-order-controls 在 PDA 入库前验证暂扣返回冲突并回查订单零漂移,继续人工节点及整柜计划转换;phase4-overseas-pda-operations 接收本轮完成库存后调用同模块的 verifyReceivedOrderHold,重新核对本轮客户、订单和 INBOUND_COMPLETED 状态,再执行暂扣、同键重放/异参冲突、解除。第一轮暂扣和解除分别同时发送两条相同幂等键、相同载荷的命令,全部返回后核对响应相同、版本只增加一次和原始库存桶;第二轮继续验证可重复周期与独立冻结保留。并发限制为两条同命令,不并发创建资源;响应不明时等待两请求结束并保留样本,不盲目释放。该证据不替代暂扣与 PDA 拣货竞争同一库存的测试。正向暂扣未执行或前置不足仍是失败,不以入库前拒绝代替正向通过。

pda-loading-link-regression.mjs 通过总入口 --modules pda-loading-link-regression 运行,复用 dropship-pallet-matrix.mjs 的国内正式订单、测量、封托、订舱、证据和完成生产链,仅执行国内关联回归。覆盖单票加入后全移除换柜完成、多票共托反复换三个旧柜后完成、逐托即时提交及同键重放,以及一单多柜中仍有实际分配的未开始柜导致 OWNER_READY/A0409。每次重新创建带 marker 的业务数据,通过公开 HTTP 回查旧柜有效分配数、PDA 终态和入仓状态;不写业务数据库伪造前置。零分配残留由真实整托移除链观察,报告保存 createdResources.pdaLoadingLinkRegression。负向柜保留为 COMPLETION_FAILED,成功柜保留为 COMPLETED,不自动清理;失败报告保留且不得算通过。使用显式测试环境文件及 --output reports/<本轮名称>.json,须有真实 HTTP 写入授权;不启动海外收货或出库。

退货专项核验退货单、退货主单、签收单、批次和合箱生成箱唛的完整业务编号:RT/RR/RB/RC/RETU- 加 25 位大写 Base36 UUID 编码;托盘签收生成的实物箱唛采用当前 RC 前缀及箱数/序号标签协议,必须从签收响应 cartonMark 读取,不能用 palletCode 替代。不再截取内部 ID 六位尾号。幂等重放仍核对同一已保存编号,手工指定箱唛不受系统生成格式约束。编号生成器另有完整 128 位编码往返、原截断碰撞和本地并行生成单测;本地生成压测不增加 HTTP 并发。

退货专项只运行 --modules phase4-overseas-return-receipt,自动准备本轮客户;覆盖非法/重复预报、退货单号和 SKU 查询、非法/未知 SKU 实收、超收及失败不落账、分批签收完成、部分签收禁止合箱、合箱非法箱规/数量/来源、幂等重放前后库存快照一致、逐箱分页无重复遗漏、客户 SKU 数量守恒及标签。通过显式测试环境文件运行总入口,JSON 路径由 --output 指定;会创建隔离测试数据,finally 停用临时 PDA,不删除业务记录。失败保留报告,先核对记录再决定是否新批次重跑。

退货预报创建后为 PENDING_REVIEW。签收前必须通过客户详情确认归属,再经平台 /return-orders/{returnNo}/review 携带 X-Customer-Id 审核,客户回查 PENDING_RECEIPT 且实收为零;审核失败立即停止签收。return-review-contract.test.mjs 覆盖归属拒绝、审核权限失败和回查未收敛。主签收场景按单 SKU 分甲3件、乙2件两批,使用正式 PDA 退货托盘生成接口返回的 palletCode,不复用国内基础托盘;每批对应一个计费批次。按 PALLET 提交每 SKU 箱数和托盘长宽高、重量,总箱数由服务端汇总;主场景验证不上传可选照片仍能完成。边界场景继续验证合成 PNG 上传及合法多 SKU 同托签收,不把图片称为真实现场照片。边界扩展与换标后续仍需按新协议独立验证,主签收通过不能证明全部退货链通过。

return-boundary-scenarios.mjs 是退货专项自动调用的内部扩展,不单独注册入口:本轮新建第二隔离客户,复用两个有效海外仓,覆盖跨客户单据/箱/标签/列表隔离、跨仓 PDA 隔离、两人争抢最后一件的签收及合箱、同键并发签收与成功后重试、多单同 SKU 全量合箱和实际来源追溯、耗尽箱清零、多单 SKU 候选和输入边界。异常写入逐次前后回查订单、签收批次、箱及 SKU;同键重试只模拟响应丢失后的客户端行为,不代表网络故障注入。每组并发严格为两个请求,不启动批量 worker;缺少第二仓或操作员属于失败,不能跳过后宣称通过。finally 停用新增 PDA,保留测试客户和业务记录;不触发部署、SQL、换标、出库或二次合箱。真实运行须明确授权目标环境及此小规模并发边界。merchant-qualification-fixture.mjs 的内部参数 publishEnvironment: false 只将第二客户凭据留在独立内存上下文,不覆盖主客户环境凭据,默认主 fixture 行为不变。

扩展离线检查:node --test scripts/admin-test-env-modules/return-boundary-scenarios-contract.test.mjs scripts/admin-test-env-modules/phase4-overseas-return-receipt-contract.test.mjs scripts/admin-test-env-modules/merchant-qualification-fixture-contract.test.mjs scripts/script-documentation-contract.test.mjs。这些校验验证脚本编排和断言,不代替真实 HTTP 验收;运行报告中的每个失败均保留阻断。

边界扩展创建的每张退货单也必须先审核,再由绑定仓 PDA 按 PARCEL 实收、上传可选合成照片;客户身份由本轮登录会话映射。散件签收使用独立包裹 unitCode,库存定位读取响应 cartonMark,所有箱码路径必须编码。合法多 SKU 同包裹生成独立散件库存,并经散件合箱接口核对并发、回滚和流水;主场景的 PALLET 实物箱通过 merge-boxes 和逐箱 sourceDeductions 核对合并、重放及数量守恒。三轮双请求并发范围保持不变。

同一退货扩展还覆盖五组完整性检查:混合明细中前项合法、后项超量/不存在时签收与合箱整笔回滚;同一操作员同键并发合箱及后续重试只生成一个目标箱;不同客户及仓库使用同一 SKU 时的候选、列表和库存隔离;客户/平台/PDA/无登录身份不得进入未授权退货入口;两批签收流水逐行核对客户、仓库、SKU、签收业务号及增量,并在重放和超收失败后回查不变。流水由现有接口从签收明细重建,不代表独立持久审计账本,也不验证后续换标或出库。并发合箱固定三轮、每轮两个请求,其余造数和校验顺序执行。

phase4-overseas-return-followups.mjs 是独立可选后续模块,只在显式 --modules phase4-overseas-return-followups 时依赖并运行退货前置,再关联换标单及执行退货出库;不计入退货专项通过结论。仅复用同次运行、同 marker 的退货资源,凭据只在内存中,finally 停用其独立临时 PDA。合同检查复用 phase4-overseas-return-receipt-contract.test.mjs;HTTP 必须有目标环境写入授权。

退货后续模块对普通退货出库及换标后退货出库统一核对最新 PDA 扫描位置、逐 SKU 总量/可用量/箱数扣减、唯一负 OUTBOUND 流水及历史箱明细保留,并在拣货重放、错误载荷与重复拣货拒绝、完成及完成重放后回查事实不变;库存及流水按本轮客户和仓库完整分页,缺失或截断直接失败。作用域内串行执行,公开 API 流水按行数、类型、出库号、SKU 和增量判唯一;该证据不代替底层数据库并发验证。仅状态推进或离线合同通过不能宣称真实出库记账通过。

退货转换标请求按当前契约传 items[{skuCode, quantity}]、fileScope 和真实 FBA 目的仓 ID/编码,返回 PENDING_REVIEW 与 skuCodes。分页查找启用的 SCK8,缺失则阻断;总箱标文件回查 cartonTotalFileId。独立退货出库候选使用查询参数 warehouseId。同模块的 completeReturnRelabel 在独立出库之后继续审核本轮换标申请、PDA 认领与数量完成、来源托盘解析、正式生成目标托盘、组托及原键重放、上传合成完工图片、提交完工、客户确认及原键重放,最终回查原退货单仍为签收完成且换标关联一致。它不执行其他客户库存操作;目标托盘是本轮换标业务资源,不是国内基础托盘。客户确认后 outboundRelabelledReturn 逐箱核对本轮换标号、客户、仓库、来源单与数量,只为已完成换标的一件库存创建出库,检查创建原键重放、PDA 拣货/完成与平台、客户库存 OUTBOUNDED 终态;另存 relabelOutboundNo,不能用此前未冻结库存的独立出库结果替代。

退货专项复跑命令(在后端根目录执行,每次使用新的报告名;不要与其他环境混用):

node --test scripts/admin-test-env-modules/phase4-overseas-return-receipt-contract.test.mjs scripts/script-documentation-contract.test.mjs
node --env-file="$env:USERPROFILE/.codex/chongchong-global-test-acceptance.env" scripts/admin-test-env-acceptance.mjs --modules phase4-overseas-return-receipt --output reports/return-<本轮批次>.json

PC/PDA 页面交互验收与 HTTP 独立取证,不用接口提交替代点击:PC 固定 1920×1080、缩放100%,验证空预报拦截后新建独立双SKU单(甲3乙2,不执行换标);PDA 固定390×848,验证不存在单号空态、按单号签收甲2、按SKU候选确认2/3与整单2/5、全部填入剩余甲1乙2并确认5/5;再合箱甲2乙1及30×20×10cm/1.2kg。PC 查询三箱3+1+1、两批真实来源、新箱明细、SKU汇总甲3乙2,并检查无结果查询后恢复正常列表。记录本轮业务单号、实际视口、截图与控制台信息;H5点击不代表真机扫码,标签HTTP不代表PDF分页或实体打印。人工重点确认布局、长字段换行、滚动、反馈和操作便利性。

需要为人工联调批量准备同一客户、同一国内仓和同一渠道的 WAIT_SPLIT 数据时,使用《批量待分柜数据生成指南》。该入口通过正式下单、入库、称重和测量接口生成数据,支持 FBA、海外仓、私人地址及一件代发等稳定随机组合;不得直接写库或用于生产环境。

固定“IT测试”客户与“义乌仓”、其余线路随机并尽力生成最多 8,000 票时,独立编排入口是 ../it-test-wait-split-bulk.mjs。它仍复用本目录的 orders.mjs 与 inbound-measurement.mjs,但逐票保存日志且单票失败后继续。测量前置只随机复用既有 TP-001、YW-TP-002,不得调用托盘新增接口;库位由正式仓储接口分配,普通位不足时使用公共位 A0,不得调用库位新增接口。

订单造数中的 GET /api/merchant/v1/partners/candidates?type=SHIPPER 属于 Warehouse 正式客户候选能力。失败时订单脚本仍可使用 sender 快照继续收集后续链路证据,但 HTTP 503/S0503 必须保留为 deployment blocker,不能因订单、测量、分柜或装柜后续通过而降级为 coverage gap。

人工分柜采用两个可选模块,不进入默认全量入口:manual-order-splitting-fixture.mjs 基于本轮至少四票 WAIT_SPLIT 数据生成部分分配、整票拼柜和未分配对照清单;人工在 Admin 完成计划分配后,manual-order-splitting-verify.mjs 读取准备报告和 loadingPlanId,只读核对柜次范围、计划箱数及候选余量。完整命令见同一指南的“人工分柜验收”章节。

人工分柜通过后可继续执行 manual-preload-push-fixture.mjs:它读取分柜核验报告并冻结推送前计划版本、明细及无号模拟柜状态;人工点击“推送预装”后,再由 manual-preload-push-verify.mjs 只读核对 EDITING 预装清单、PENDING bridge、版本递增、明细零漂移和 PDA A0404。两个模块同样不进入默认全量入口。

预装推送通过后,manual-pda-ready-fixture.mjs 冻结无号、未关联订舱、不可确认且无 PDA 的基线;人工依次完成订舱 DRAFT、RELEASED 放舱、原模拟柜关联真实柜号和整份计划确认,再由 manual-pda-ready-verify.mjs 只读核对 RELEASED、allocation、稳定柜次/计划身份、CONFIRMED readiness 和唯一 UNASSIGNED PDA task。两个模块不领取任务,也不进入默认全量入口。

PDA 待领取通过后,manual-pda-batch-fixture.mjs 冻结任务明细、稳定箱码和库存快照基线;目标 PDA 作业员人工领取、逐箱扫码并一次提交原子 batch 后,manual-pda-batch-verify.mjs 只读核对作业员绑定、全量 PICKED、AWAITING_REVIEW、一次 CLAIM、一次 BATCH、pending/detail 一致和入库级数量收敛。HTTP 不记录逐次扫码轨迹,真机扫码仍需人工证据。

PDA 待复核通过后,manual-loading-complete-fixture.mjs 冻结无证据、未完成、RELEASED 订舱和 LOADING 计划基线;人工现场上传五类证据并执行一次最终完成后,manual-loading-complete-verify.mjs 只读核对五类真实图片、唯一 COMPLETE_LOADING、任务/计划 COMPLETED、来源入库单和统一订单 LOADED、实装分片数量守恒及货柜总览终态。

例如 --modules system,inbound-weight-ocr 会依次加载:

  • system.mjs
  • inbound-weight-ocr.mjs

fee-items 需要同一 marker 的客户订单和入库单。执行 --modules fee-items 时,入口自动扩展为 merchant-qualification-fixture,orders,fee-items,无需手工补齐前置模块。

模块只需导出:

export async function run(context) {
  const response = await context.request('GET', '/api/platform/v1/example')
  const data = context.apiSuccess('example', '查询示例', response)
  context.assert('example', '示例结构正确', response, Array.isArray(data), `count=${data?.length ?? 'n/a'}`)
}

可用上下文

混柜收货的每一步均区分同键同载荷重放、同键异载荷冲突和同货物新键再次扫码:普通海外仓重复箱返回冲突,FBA 相同累计数和代发同托新键返回零增量;随后回查完整会话,确保三票事实均不变。

mixed-container-receiving.mjs 通过总入口 --modules mixed-container-receiving 执行,依赖客户资质准备。新建一票双托一件代发、一票普通 FBA、一票普通海外仓订单,固定同一起运仓和渠道,经正式接口混装同柜、完成国内装柜和船节点、按柜生成海外计划。使用本轮 PDA 身份交替执行 FBA 累计收货、代发整托收货、普通海外仓逐箱收货;每步核对全部票进度、同键重放和未齐正常完成拒绝。终点为 MIXED_CONTAINER_INBOUND_COMPLETED,不创建后续出库或派送,不代表仓储转运单混装。报告复用 createdResources.dropshipPalletMatrix;失败保留阻断,成功数据保留,finally 停用本轮 PDA 操作员。真实运行须环境授权,离线合同 mixed-container-receiving-contract.test.mjs 不能代替真实 HTTP。

一件代发矩阵出库前运行 dropship-outbound-edge-cases.mjs 的候选查询探针:先模拟平台首次打开页面只传海外仓,再传客户筛选,要求本轮每票全部托盘、箱数、仓位及 SKU 事实一致,并核对仓库与指定客户隔离。缺托、错误客户/仓库、A0400 或筛选后仓位漂移均阻断;候选达到服务端上限导致本轮数据不可见也不能按空场景通过。该探针不证明跨客户混柜造数已覆盖。

一件代发矩阵在每个剩余实物托盘收货前核对待收箱数,并以 allowDifference=false 尝试正常完成:必须返回 A0409,回查会话事实不变后才继续收货。这不覆盖显式差异完成,不得把正常完成门禁解读成系统禁止一切差异结案。

每托首次收货及重复扫描后,矩阵按本轮已提交的来源托盘、箱唛和入仓码独立计算期望进度,回查柜级及每票的总箱数、实收、待收三项。柜级总数正确但串票、重复行、缺票或逐票待收未刷新仍判失败。离线验证器包含三票交替进度样本,但该样本不等于三类混柜真实 HTTP 验收。

dropship-browser-fixture.mjs 通过总入口 --modules dropship-browser-fixture 执行,自动依赖客户资质准备;复用矩阵生产者创建一票四箱两托,完成国内装柜、船节点和按柜生成海外入库计划,明确停在 READY_FOR_BROWSER_RECEIVING。只准备新测试数据,不调用海外 PDA 收货或出库、不创建海外操作员;后续由浏览器页面验收。报告仍保存于 createdResources.dropshipPalletMatrix,准备通过不代表全流程通过,不自动删除数据。

dropship-mixed-palletization.mjs 通过总入口 --modules dropship-mixed-palletization 执行,自动依赖客户资质准备。经正式 HTTP 创建两客户三票一件代发(2/3/1 个物理箱,每箱两个 SKU),完成下单审核和测量,交替调用跨客户箱码预览、领取、清点、先箱后托批绑、移回/归回、六箱混托封托、解封和重新封托。核对客户/入仓单/SKU/数量守恒、只读识别无写入、同键重放、未知码/跨仓拒绝及逐票待分柜;结果保存在 createdResources.dropshipMixedPalletization。使用显式目标环境文件,开发机获授权时 Gateway 必须显式指向本机。会创建并保留客户、订单、测量与托盘数据,不自动清理;失败必须检查报告,重跑创建新批次。终点为 MIXED_PALLET_SEALED_VERIFIED,不代表装柜、海外履约或 Android 真机验收通过。

dropship-pallet-matrix.mjs 验证下述四场景整托手工加入、整托移除、智能推荐、独立订舱与文件放舱、真实柜号关联、预装确认、PDA 整托拣货和五类证据上传;异步装柜完成必须等到任务 COMPLETED 并逐票回查 LOADED。智能装柜的托盘汇总与装柜详情逐票组成分别核对,不能把共托汇总行的首票编号当作全托归属。随后经正式报关、国内离仓及人工船节点接口推进至 PICKUP_READY,再按柜生成逐票海外入库计划,检查来源托盘完整绑定、共享托盘身份一致和同键重放。海外收货使用本轮创建并绑定接柜仓的 PDA 操作员,上传三类照片、签收、逐实物托盘收货、逐票箱数核平和完成入库,同键重放及同托新键扫码均不得重复入账。随后从本轮逐票库存候选创建一件代发专用出库,携带原始箱唛由 PDA 拣货、完成,核对终态、幂等和可用库存扣减;finally 停用本轮操作员。出库重放按业务身份和数据库毫秒时间精度核对。离线合同为 dropship-pallet-matrix-contract.test.mjs;脚本覆盖不等于真实 HTTP 已通过,须检查当轮报告和库存审计。

dropship-physical-carton-chain.mjs 复用同一条正式链路,专门覆盖多 SKU 共用物理箱:20 箱×2 SKU/2 托、5 箱×3 SKU/1 托、7 箱×2 SKU/预计 2 托后合为 1 托。每个场景从新订单、测量、箱唛冻结和 PDA 清点开始,按去重箱唛核对预装、装柜、尾程计划、海外整托收货、库存候选和一件代发出库;每箱必须保留全部 SKU 明细,但任何汇总不得按 SKU 行重复累计箱数。使用 --modules dropship-physical-carton-chain,会保留本轮业务数据和 JSON 报告,不自动清理。

  • dropship-pallet-matrix 通过总入口 --modules dropship-pallet-matrix 执行,自动依赖客户资质准备。通过正式 HTTP 创建五票订单,覆盖单票多托、单票单托、单票移箱合托、多票共享开放托盘;会创建并保留测试数据,不自动清理。报告 createdResources.dropshipPalletMatrix 保存逐票箱唛、托盘及各阶段证据,失败即停止并保留阻断;重跑创建新批次,不借用历史资源。fullFlowVerified=false,不能代替海外收货及一件代发专用出库的完整验收。

  • 一件代发任务 Task.pallets 只列实际参与绑箱的托盘;未使用的预生成托盘通过 /api/platform/v1/first-leg/pda-dropship/inbound-orders/{inboundId}/pallets?accountId=... 读取,客户范围取本轮任务。脚本同时核对 generatedPalletCount/palletSetupReady,不因空的任务托盘列表新增资源。

  • orders.mjs 创建草稿前读取正式 inbound-code-policy:自动模式不传入仓码,手工模式按本轮 marker 生成短且稳定的测试入仓码,确保箱唛二维码长度有效;策略读取失败或矛盾立即停止,不修改系统全局配置、不重用历史订单。

  • dropship-outbound-edge-cases.mjs 是 dropship-pallet-matrix 内部探针,不单独运行:使用本轮库存验证超量、错误 SKU、不存在/重复箱唛、箱数不符、同键异载荷、未拣齐完成、并发同键创建、未拣取消和重放。单票单托额外先拣一箱再拣剩余箱;部分拣货被拒时仍保留失败及部署阻断,只有回查冻结事实无变化才继续整条明细拣货以采集后续证据,不能将此计为分批通过。多票共托使用同一 SKU,来源区分必须依赖入仓码。成功数据保留,未拣并发探针出库单正常取消。本扩展不代表跨客户、跨仓、多 SKU 混箱、逐箱不等件数、跨区故障注入均已覆盖,结论以当轮真实报告为准。

  • phase3-container-documents 从本轮货柜详情读取渠道:海铁验证 DO 上传被明确拒绝且聚合中没有 DO,其他渠道继续验证 DO 上传、重放及零漂移;缺渠道不猜测适用性。

  • phase4-overseas-pda-operations 用三个独立逐箱任务分别验证正常换标、跳过和异常,异常不得重复使用前两箱。前一步失败时保留失败并停止该链,不继续使用空响应版本。

  • 海外 PDA 生产矩阵为实际作业准备 FBA-STANDARD、FBA-SECOND 两个通过真实出仓和船节点达到 PICKUP_READY 的标准 FBA 柜,同时保留 SECONDARY 未放行柜用于负向门禁;不得将负向柜当作第二个收货柜。

  • 海外 PDA 按真实柜号去重执行签收,缺少一件代发生产者不得用 FBA 生产者替代;原生产矩阵失败仍保留。P4 解绑样本保留为 UNBOUND,P5 只从本轮已完成同柜、同目的仓的入仓码中选择三箱实物托盘库存,排除 UNBOUND 和重复仓位,不借用历史订单。

  • 排车详情按 DispatchResponse.Item 核对托盘与箱数,不读取 DTO 未提供的箱唛字段;phase5-overseas-fulfillment 将同一换标排车转为待出库单,通过 OutboundDetail.pallets.cartonMarks 验证全部新箱唛、排除原箱唛和重复箱。该测试生成的待出库单及派送单保留为本轮证据,不推进人工退货样本。

  • 出库前同操作员、同草稿允许重复预排并更新原排车;脚本核对排车身份与业务数量不漂移,不要求重新生成的明细行 ID 不变。其他草稿抢锁仍必须冲突,生成出库单后仍验证托盘编辑被拒绝。

货柜查询使用 /api/platform/v1/containers/domestic 列表和 /domestic/{id} 详情,响应为 WorkbenchItem(container、workbenchStage、statusSummary、allowedActions),不接受旧扁平实体。默认 phase3-container-loading 同时验证页面的 ACTIVE、状态、关键字组合查询及详情结构;container-detail-route-contract.test.mjs 离线核对 Admin、Controller 和人工分段/同柜脚本读路径,并反证旧 DTO。定向真实 HTTP 使用总入口 --modules phase3-container-loading,仍自动展开本轮前置并创建测试资源;不借历史柜。

一件代发的 inbound-measurement 前置在测量草稿录入预计托数;审核通过时系统一次性预生成全部 DP 托盘码,允许空托先打印。PDA 既支持先清点箱再扫预生成托盘码批量归托,也支持先扫托盘后逐箱直接归托;预计托数不得超过实测箱数。验收逐托封托并确认全部箱数已绑定、全部预生成托盘已封托后任务才完成,默认一件代发后续链复用该前置。人工验收造数可传 --prepare-dropship-manual-count true,脚本会停在任务未领取、箱未清点、托盘未绑定的状态。

该前置保存成功解析且清点的原始 boxCode,随装柜完成生产 fixture 传入默认 phase4-overseas-pda。默认矩阵同时创建 FBA 和 OVERSEAS 两种一件代发,其中主生产者固定为 4 箱 2 个已封 DP 托盘:先逐托人工分配并确认首托加入后次托仍可选,再反证单条删除受阻、整托移除成功,随后执行真实智能推荐并核对两托完整加入,最终恢复精确两托继续装柜。海外侧必须先将全部原箱码经 current/cartons/resolve 精确解析到同一入仓码及冻结目的类型,再进入逐来源托盘实收及库存验证;OVERSEAS 逐箱实收,A0404、错误箱码/归属或数量缺失均阻断,不扩展推算箱号或排除失败候选。现行 V2 托盘 SKU 分组必须携带 sourceInboundDetailId,离线合同同时锁定两个生产分支来源明细和上述真实 HTTP 调用链。

  • request(method, path, body?, token?, extraHeaders?):JSON HTTP 请求,自动使用平台 Token;幂等写操作通过 extraHeaders 传 Idempotency-Key。
  • requestBinary(method, path):文件下载,不把二进制写入报告。
  • apiSuccess(module, name, response, evidence?, options?):断言 HTTP 200 + body code 200,成功时返回 data。
  • assert(module, name, response, condition, evidence, options?):业务断言。
  • expectConflict(module, name, response, scenario):断言并发冲突。
  • addStep(...):写入统一步骤报告。
  • marker:本轮唯一测试标记。
  • createdResources:登记测试资源 ID。
  • context:模块间共享少量 ID;模块应尽量独立。

约束

unified-pda-session-revocation.mjs 是海外库内作业模块的内部安全检查;在本轮操作员完成库存作业后修改其作业仓,分别验证旧 Access/Refresh 失效、新登录只绑定新仓、角色及仓绑定清空后旧会话失效且不能继续 PDA 作业。只更新本轮临时账号并由原 finally 停用,凭据保持在私有上下文;不改仓库主档或业务库存。合同为 unified-pda-session-revocation-contract.test.mjs。

direct-delivery-replay-proof.mjs 是事件模块的内部证据校验器,不是独立执行入口。要求本轮原装柜事件的 ID/hash、12 次失败至 DEAD、人工恢复审计、持久 Inbox 及 DUPLICATE、恢复前后业务订单身份集合零新增和环境恢复同时成立;单纯重复 GET 或历史故障报告不能满足条件。离线合同为 direct-delivery-replay-proof-contract.test.mjs。

  • 不记录密码、Token、图片二进制或 OCR 原文全文。
  • 测试数据必须带 context.marker;可删除的清理,不能删除的最终停用。
  • 缺少已确认契约时记录失败或 deploymentBlocker,不得模拟成功。
  • 一个模块只修改自己的 .mjs,不要修改其他模块文件。

近期业务模块与静态合同快速索引

合并后的海外增量覆盖

本节核对 d4fec829 首父至 fb66d920 的海外后端差异及当前 Admin 调用端。 复用已注册默认模块,不新增独立造数入口;定向执行仍由总入口展开本轮客户、国内履约和海外 PDA 前置。 离线合同 merged-overseas-coverage-contract.test.mjs 锁定默认注册、定向依赖、陈旧 fixture 拒绝及新增断言。 离线通过只证明脚本合同,不证明部署环境已通过。

新增功能 全量模块 本轮 fixture / 依赖 正常与失败断言
仓储转运审核 phase4-overseas-client-services 调用内部 warehouse-transfer-review.mjs 本轮资质客户 Token、PDA 完成柜来源订单;另通过客户 API 创建独立新到仓转运对照票 平台显式 customerId;客户 Token 无审核权限;缺作用域/非法决定拒绝且状态不漂移;已有库存 APPROVED/PENDING_ASSIGNMENT;新到仓 APPROVE→WAIT_PDA_RECEIVING/WAIT_DELIVERY,REJECT→REJECTED/CANCELLED;同决定重放、反向审核冲突、客户详情回查;空驳回原因应 A0400 并保持待审核
智能预排真实草稿柜 phase4-overseas-dispatch phase4-overseas-pda-operations 后本轮实际收货托盘 草稿柜创建、明确 draftContainerId 绑定、结构回查、unlock 恢复候选、删除柜释放锁、重建柜预排;保留同草稿重锁、其他草稿冲突、旧载荷预排冲突与 release 合同
排车托盘移除 phase4-overseas-dispatch 同一本轮托盘先创建独立移除对照排车,移除后才进入主链预排 DELETE 明细后箱数/托数/明细归零;重复删除 A0404;正式锁释放后候选恢复。空对照排车保留,不借历史排车
排车编辑、BOL、后台转派送 phase5-overseas-fulfillment phase4-overseas-dispatch 生成的主链排车 复用车辆编辑和客户转派送;新增 BOL content-type 与 %PDF- 签名检查;后台同载荷转派送复用同一出库/派送业务号;生成出库后移除托盘 A0409 且数量和身份不漂移;原 PDA 拣货/发车、派送、异常和回访继续执行
退货签收与合箱 phase4-overseas-return-receipt 本轮退货预报及临时 PDA,不使用历史100单 已有分批签收、超收、幂等、数量守恒、库存与计费批次、合箱;不重复编排
PDA 收货、换标托盘及采购资金 phase4-overseas-pda、phase4-overseas-pda-operations、phase4-overseas-wallet-and-pallet-cost 原本轮收货与钱包前置 复用已有收货、换标拆托、出库衔接和采购冻结/结算/释放,不新增旁路写库 fixture

明确缺口及待验收(不能计作已覆盖通过):

  • 转运 Review.remark 仅有长度限制,WarehouseTransferService.review 未校验空驳回原因,也未将审核原因保存到详情或历史。新增空原因负向 HTTP 断言会在当前实现失败,须业务实现专项修复;原 Detail.remark 是申请备注,不能冒充审核原因。
  • 已核对专用 WAREHOUSE_TRANSFER_APPROVE Controller 注解;本轮 HTTP 增量覆盖客户 Token 拒绝,但“平台仅列表/仅管理无审核权限”的独立角色矩阵仍缺 fixture。不能用管理员成功替代最小权限验证。
  • 新到仓转运本轮只验证审核落到 PDA 前置状态;PdaWarehouseTransferController 托盘化、客户确认、可选换标与后续预排完整新链尚未编排。不得声称 WAIT_PDA_RECEIVING 就是 PDA 已收货。
  • 合并新增退货单换标候选及创建换标接口、换标申请编辑能力,尚需各自独立回归。退货出库需另补当前退货箱 fixture 到 RETURN_OUTBOUND 的完整链,不由普通派送退回覆盖。退货模块本轮已将旧 sourceBatchNo=MERGED 断言改为实际扣减来源批次去重、真实来源退货单,并补客户箱号分页与标签 SVG 条码;条码实际扫码可读性仍由人工验收。
  • 智能预排跨客户/跨仓候选混选、不同平台操作员锁隔离与容量边界尚缺独立反向 fixture;本次同操作员不同草稿锁冲突不能替代它们。
  • UI 专项由人工验收:审核弹窗驳回原因必填、按钮权限、列表状态刷新;排车编辑和移除交互、智能预排拖放/草稿恢复、BOL 排版与打印、请求数量。PDF 签名验证不证明打印样式正确。

所有真实 HTTP 场景待当前轮另行授权后运行;不读取真实客户 Excel、不造历史样本、不执行 SQL 或部署。

业务链路 HTTP 模块/共享前置 离线静态合同
商户资质与下单身份 merchant-qualification-fixture.mjs merchant-qualification-fixture-contract.test.mjs
公共主数据与往来单位 master-data.mjs master-data-partner-contract.test.mjs
平台基础、客户、海外仓储费与下载 system.mjs、customers.mjs、overseas-storage-fees.mjs、downloads.mjs 由 Admin 总入口默认编排;分别覆盖系统能力、客户管理、海外仓阶梯费和下载中心基础能力
订单创建、可计价主数据、幂等零漂移与审核异步收敛 orders.mjs orders-pricing-fixture-contract.test.mjs、orders-lifecycle-idempotency-contract.test.mjs、orders-approval-convergence-contract.test.mjs
入库单手工扣货与解除 inbound-hold.mjs(客户隔离、乐观锁、幂等重放/冲突、不可变历史、统一订单投影、智能装柜候选拦截与恢复) inbound-hold-contract.test.mjs;默认全量已启用,定向入口自动展开已审核订单与入库单造数
费用项目、价格配置与基础 Finance fee-items.mjs、pricing.mjs、finance.mjs fee-items-contract.test.mjs、pricing-contract.test.mjs、finance-contract.test.mjs
入库测量、首次打印冻结箱码与墨家扫码 inbound-measurement.mjs inbound-measurement-box-code-contract.test.mjs
入仓自动头程费用、派生详情、人工发布与 MANUAL 其他费用版本 inbound-fees.mjs(前置:merchant-qualification-fixture,orders,inbound-measurement) inbound-fees-contract.test.mjs
国内货柜履约模拟柜关联、柜次概览、渠道隔离、装柜模型桥接、PDA、动态增量、国内报关证据、出仓及离仓后目的港资料 phase3-container-loading.mjs、ocean-booking-fixture.mjs、phase3-container-overview.mjs、phase3-loading.mjs、phase3-loading-model-bridge.mjs、phase3-pda-convergence.mjs、phase3-evidence-gate.mjs、phase3-loading-finalize.mjs、phase3-customs.mjs、phase3-outbound-dispatch.mjs、phase3-container-documents.mjs container-simulation-association-contract.test.mjs、container-specification-fixture-contract.test.mjs、ocean-booking-channel-contract.test.mjs、phase3-container-regression-contract.test.mjs、phase3-loading-model-bridge-contract.test.mjs、phase3-loading-dynamic-final-contract.test.mjs、phase3-container-documents-contract.test.mjs、phase3-phase4-departure-pickup-chain-contract.test.mjs、phase3-producer-chain-contract.test.mjs、manual-state-loading-pda-contract.test.mjs
头程整柜报关 phase3-container-customs-fixture.mjs、phase3-container-customs.mjs;定向入口通过正式客户资格、订单、测量、同柜装载和最终完成 API 生成平台公共订舱下的买单与两客户退税混合柜。第二客户独立登录,凭据只在内存;验证确认/打回隔离、正式申报各类人工异常及剩余 OPEN 门禁、每客户完成文件、自动出仓和唯一船期任务。客户资料只覆盖退税票,买单行由下载中心 XLSX 验证;不复用历史柜、不执行 SQL container-customs-acceptance-contract.test.mjs、container-customs-acceptance-matrix.mjs
国内装柜验收作业员选择 domestic-pda-operator.mjs;按本次 PDA 登录 Token 的字符串 subject 匹配目标仓库候选 userId,缺少匹配即停止,不使用首位候选或成员编号 domestic-pda-operator-contract.test.mjs
分柜与父子入库单数量守恒 phase3-order-splitting.mjs phase3-order-splitting-contract.test.mjs
同柜且不可拆组 coload-groups.mjs(可选;前置正式生成至少7票同线路 WAIT_SPLIT,另造不同线路反向票;覆盖创建/取消幂等、原子分配/移除、目标组隔离超容拒绝与零漂移、推送防绕过、PDA短拣完成拒绝且无余量子单、足量整组消费、普通单拆分不回归及已有父子单建组拒绝) coload-groups-contract.test.mjs
人工计划分柜准备与只读核验 manual-order-splitting-fixture.mjs、manual-order-splitting-verify.mjs(可选,不进入默认全量) manual-order-splitting-contract.test.mjs
人工推送预装前置与推送后只读核验 manual-preload-push-fixture.mjs、manual-preload-push-verify.mjs(可选,不进入默认全量) manual-preload-push-contract.test.mjs
人工订舱关联、预装确认与 PDA 待领取核验 manual-pda-ready-fixture.mjs、manual-pda-ready-verify.mjs(可选,不进入默认全量) manual-pda-ready-contract.test.mjs
PDA 人工领取、逐箱扫码、原子批量提交与待复核核验 manual-pda-batch-fixture.mjs、manual-pda-batch-verify.mjs(可选,不进入默认全量) manual-pda-batch-contract.test.mjs
五类装柜证据、PDA 最终完成与 LOADED 终态核验 manual-loading-complete-fixture.mjs、manual-loading-complete-verify.mjs(可选,不进入默认全量) manual-loading-complete-contract.test.mjs
订舱共享主数据前置与订舱验收 ocean-booking-fixture.mjs、ocean-bookings.mjs、phase3-port-schedules.mjs、phase3-carrier-schedule-queries.mjs(DRAFT 可编辑;RELEASED 冻结;船司查询只创建并写当前 marker 登记任务) ocean-booking-prototype-contract.test.mjs、ocean-booking-fixture-contract.test.mjs、phase3-carrier-schedule-queries.test.mjs
订舱级拖车预约完整生命周期 truck-appointments.mjs(自包含创建并放舱,不创建或关联柜次;已有有效或已完成拖车单的订舱不可重复创建;覆盖候选、附件、人民币费用、幂等及 SUBMIT → DISPATCH → PICKUP → ARRIVE → LOAD,拒绝手工离仓/完成;自动完成与应付由真实国内离仓链路验证) truck-appointments-contract.test.mjs
订舱与拖车服务中心跨链路 service-center-flow.mjs(依赖 ocean-bookings,truck-appointments;复用本轮 RELEASED 订舱创建订舱级拖车,验证派车单、离仓前状态链、历史、审计和关联零漂移) 由入口依赖合同和拖车直接合同共同覆盖;真实 HTTP 缺本轮订舱或承运商时 fail-closed
Admin 补充能力与保护边界 supplemental.mjs、supplemental-boundaries.mjs supplemental-boundaries-contract.test.mjs;只按本轮资源验证补充能力、负向和保护边界
装柜清单三备注 orders.mjs、phase3-loading.mjs(客户备注、最新内部备注、仓库备注;仓库备注 PATCH/清空/精确重放/旧版本零写) loading-list-remarks-contract.test.mjs
首页实时指标 dashboard.mjs dashboard-contract.test.mjs;默认只读核对实时柜量/清关指标、今日新运单及启用客户的服务端分页总数
消息中心管理 notifications.mjs notifications-contract.test.mjs
Finance 真实前置、对账、结算与下载中心 finance-full-fixtures.mjs、finance-reconciliation-full.mjs、finance-settlement-full.mjs、finance-downloads.mjs finance-full-fixtures-contract.test.mjs、finance-reconciliation-full-contract.test.mjs、finance-settlement-full-contract.test.mjs、finance-downloads-contract.test.mjs
Finance 扩展隔离与跨区费用 firstleg-container-fee-allocation.mjs(柜次跨客户分摊)、finance-direct-paid-isolation.mjs(海外仓服务直接已付)、phase4-overseas-finance-cross-region.mjs(五类海外费用跨区进入 Finance) 对应同名 *-contract.test.mjs;跨区事件持久化链在本轮获授权时另以只读数据库证据核对
客户钱包与拆柜打托费自动闭环 phase4-overseas-wallet-and-pallet-cost.mjs(授信初始化、平台充值、采购两箱完整履约、货款实扣/预估冻结/实际核费、换标冻结结算/释放、Client 余额账本、国内/海外托盘汇总、按体积分摊及跨区金额守恒) phase4-overseas-wallet-and-pallet-cost-contract.test.mjs;默认全量已启用,定向入口自动展开已审核客户与海外 PDA 实收链
海外仓 HTTP 生命周期 phase4-overseas-warehouse.mjs phase4-overseas-warehouse-contract.test.mjs
海外 PDA 柜号收货与库内操作 HTTP 生命周期 phase4-overseas-pda.mjs(按柜完成签收和实收,成功后仅以内存上下文交接操作员会话和已完成库存事实)、phase4-overseas-pda-operations.mjs(紧随收货执行盘点、公共位核对、托盘拆装换绑和换标复核;只复用本轮入仓计划已有空托盘及公共位,不新增托盘或库位;finally 停用双操作员并清空临时 Token;任何真实 fixture 缺失均 fail-closed) phase4-overseas-pda-contract.test.mjs、phase4-overseas-pda-operations-contract.test.mjs、pda-picker-fixture-contract.test.mjs(长场景名保留完整运行标识,避免造数账号跨轮重复)
海外 PDA 退货入库、计费批次与退货合箱 phase4-overseas-return-receipt.mjs(自包含创建本轮客户退货预报和绑定仓临时 PDA 操作员;覆盖退货单号/SKU 查询、正常空结果、分批签收、核平、超收、幂等、退货箱/SKU 库存、每次成功签收唯一仓储计费批次及合箱;finally 停用操作员) phase4-overseas-return-receipt-contract.test.mjs;ReturnReceiptServiceTest 精确核对计费批次客户、仓库、签收单、起算时间和 PENDING_PRICING 初态
尾程单公网控制与人工计划 phase4-tail-order-controls.mjs(PDA 收货前对本轮柜执行整柜接柜仓变更/恢复与幂等冲突、单/批 FBA 目的仓变更、单/批合托标记并取消、CSV 导出、订单费用回查、单票暂扣/解除、八个人工节点和逐票人工计划) phase4-tail-order-controls-contract.test.mjs;只复用现有公共接柜仓/FBA 主档,不新增仓库、托盘或库位;为目标柜全部入仓码创建 MANUAL 计划后交给 PDA 继续消费,不借历史订单
海外入仓扩展、客户服务与排车 phase4-overseas-inbound-operations.mjs、phase4-overseas-client-services.mjs、phase4-overseas-dispatch.mjs 对应同名 *-contract.test.mjs;只消费本轮前置资源,缺失时 fail-closed。入仓扩展模块选择本轮未完成 PDA 收货的第二个 FBA 柜,按真实来源版本独立核实箱数,验证核实变化不覆盖原订单;通过 DELETE 取消及原版本重放核对唯一取消历史和释放数量,再建立有效批次并执行拆分、合并、数量守恒、陈旧版本拒绝、同键重放与异载荷拒绝,保留稳定批次及替代链。该模块同时对已收货首柜执行库存冻结、释放与正反盘点,不能视为只读或仅预约写入。最小运行由 Admin 总入口选择 --modules phase4-overseas-inbound-operations --wait-split-count 1 --wait-split-package-count 4,使用明确 TEST 环境文件、既有 Admin/PDA 配置及依赖展开;还需预约列表/编辑/取消、入仓预约和尾程订单读取权限。任何请求失败或来源、数量证明失败即停止后续步骤,保留本轮有效、取消和替代批次,不自动删除或重跑;结果写入总入口报告的 phase4OverseasInboundAdmin,取消行为须有对应本轮授权
海外仓业务跨区事件与安全门禁 phase4-cross-region-events.mjs(统一平台会话、匿名拒绝、canonical 权限 403、国内装柜完成到 Lastleg 建单、海外柜完成到 Firstleg 回写、轮询与诊断证据;重复 GET 仅验证读取稳定,缺真实投递重放证据仍阻断;缺本轮 marker 前置时阻断) phase4-cross-region-events-contract.test.mjs
国内离仓至海外 PDA 可见人工验收节点 phase3-customs.mjs(国内报关资料与整柜照片)、phase3-outbound-dispatch.mjs(柜级离仓)、phase3-container-documents.mjs(离仓后目的港清关、DO;PU 使用柜级数字码)、phase3-carrier-schedule-queries.mjs、phase4-carrier-pickup-ready.mjs、phase4-overseas-pda.mjs(同柜候选) phase3-phase4-departure-pickup-chain-contract.test.mjs
国内出仓聚合、门禁、待装柜与仓库权限 phase3-outbound-aggregate.mjs、phase3-dispatch-gate.mjs、phase3-waiting-for-loading.mjs、phase3-warehouse-rbac.mjs 由容器回归、生产者链和出仓相关合同覆盖;只消费本轮主链资源
人工状态矩阵 manual-state-matrix.mjs manual-state-matrix-contract.test.mjs;依赖本轮海外签收,保留有有效余量根订单的 DELIVERED;完成订单样本经 phase5-root-fulfillment.mjs 两票真实签收和只读完成 Outbox 核验产生,不调用已移除的人工 /complete,并继续验证装柜完成、报关和订舱状态组合
海外业务 HTTP:采购创建/备注/审核边界,卡车与散板状态及取消 phase4-overseas-business.mjs phase4-overseas-business-contract.test.mjs
海外主数据 HTTP 生命周期 phase4-overseas-master-data.mjs;车辆新建、详情、修改及列表均核对实际托位/载重/容积,修改使用不同容量值,CSV 同时核对修改后的值与业务车牌号;缺失或猜测容量形成阻断,finally 停用本轮资源。内部助手 vehicle-care.mjs 验证保养/加油创建重放、版本冲突、历史、单位、照片重放和字节下载,并逐类验证维修/故障/救援/异常项目地点回显、处理人、完成处理及费用/付款独立;另建本轮车辆验证跨车读取/修改/照片拒绝,结束停用隔离车辆并保留记录。报告在 phase4OverseasMasterData.vehicle.care,错误地以处理完成推定付款必须阻断;无SQL或旧数据修复,不作独立入口 phase4-overseas-master-data-contract.test.mjs
目的港码头拖车与船节点终态 phase5-terminal-drayage.mjs(PDA 卸柜前复用 ACTIVE + TRUCKING + truckingScope=OVERSEAS 主数据完成选车队、预约和实际提柜,卸柜后完成实际还柜,并覆盖四命令幂等/历史)、phase4-carrier-nodes.mjs(PDA 前补录至 PICKUP_READY;拖车完成后只读核验 PICKED_UP/EMPTY_RETURNED 和停止语义) phase5-terminal-drayage-contract.test.mjs、phase4-carrier-nodes-contract.test.mjs;不再由船节点脚本直接伪造提柜和还柜
海外排车、出库、派送、异常与回访 HTTP 生命周期 phase5-overseas-fulfillment.mjs(复用本轮海外仓已收货托盘和预排单,正式创建临时 PDA 操作员并在 finally 停用;覆盖排车编辑、按 FBA 目的仓转出库/拆分派送单、PDA 全量拣货/发车、逐单签收资料保存自动完成、头程入仓与订单跨区回推、客户回访、人工异常及派送退回) phase5-overseas-fulfillment-contract.test.mjs
初始化基线(仅离线) — initialization-baseline-contract.test.mjs

phase4-overseas-inbound-operations.mjs 的内部 prepareAppointmentFixture 可由已核对的本轮最小正式 API 流程复用:必须传入真实转换所得的入仓计划和同仓明细,至少两箱才执行拆分合并;两箱验证 2 → 1 + 1 → 2,不补造货量。完整 Admin 模块仍按上表四箱参数及统一依赖运行,不能为缩减造数而伪造生产者矩阵或跳过前置事实。

表中的 *-fixture.mjs 是被业务模块复用的测试数据前置,不是新增的独立全量入口。执行 HTTP 时仍从 ../admin-test-env-acceptance.mjs 进入;*contract.test.mjs 只做离线脚本结构和数据归属回归。

海外仓业务 HTTP 验收使用 Auth 统一会话,仅通过 --gateway 访问 TEST Gateway;拒绝旧 --overseas-gateway、ADMIN_OVERSEAS_GATEWAY 和非 test 环境参数。平台、客户与 PDA 各用自己的账号访问令牌,权限、客户隔离及仓绑定仍须验证。海外仓、海外业务和海外主数据模块只对带本轮 marker 的资源执行已确认的新增、编辑、状态与导出,并在结束前按契约停用;PDA 收货模块使用本轮临时 OVERSEAS_WAREHOUSE_PDA_OPERATOR 访问令牌,只调用 /api/pda/v1/last-leg/receiving-containers/** 柜号收货入口,不接受 customerId、planNo 或分配 ID。收货成功后由相邻的 phase4-overseas-pda-operations 消费仅存在于进程内存、不会进入 JSON 报告的 Token 与库存事实,执行盘点、公共位核对、托盘操作和换标;库内操作只复用收货计划产生的已有空托盘及当前仓 VIRTUAL + ACTIVE 公共位,不调用托盘或库位新增接口。新模块无论成功失败都在 finally 停用两个 picker 并清空临时凭据。两模块均不调用出库、退货出库、派送或内部接口;任何真实柜、箱唛、托盘、库存或换标前置缺失都必须形成 deployment blocker,不能按空场景通过;船节点禁止手工创建任务。

节点全链定向入口为 --modules phase4-overseas-pda。依赖展开固定先为本轮 LOADED 柜次完成国内 CUSTOMS_DECLARATION 与 PDA 装柜证据,再确认国内出仓;离仓后才维护 DESTINATION_CLEARANCE、DELIVERY_ORDER 两类目的港文件,PU 使用柜级数字码而不是文件,随后核对自动创建的 OUTBOUND_CONFIRM 船节点任务、人工补录至实际 PICKUP_READY,最后验证海外 PDA 候选可见。资料模块只写本轮 marker 柜次,覆盖上传/完成重放、同键异载荷 A0409、冲突后零漂移和聚合回读;任一 fixture 或 Trace 缺失均为 deployment blocker。

尾程单公网控制与目的港码头拖车定向入口为 --modules phase4-carrier-nodes。依赖会在海外 PDA 前插入 phase4-tail-order-controls,先对本轮柜验证接柜仓变更/恢复、目的仓变更、合托标记、下载中心 XLSX 导出、订单费用、暂扣阻断、解除和八个人工节点,再通过柜级预览与确认自动生成逐票计划和实体托盘;PDA 必须消费这些计划托盘,不得临时另建脱离计划的托盘。货柜到达 PICKUP_READY 后先复用公共 ACTIVE + TRUCKING + truckingScope=OVERSEAS 供应商完成选车队、预约和实际提柜;PDA 卸柜完成后,有界等待跨区卸柜事件回写国内聚合为 UNLOADED,再确认实际还柜。最后的船节点模块仅回读两次业务动作同步生成的 PICKED_UP/EMPTY_RETURNED,不得直接补录这两个节点。

node --env-file="$env:USERPROFILE\.codex\chongchong-global-test-acceptance.env" scripts/admin-test-env-acceptance.mjs --modules phase4-carrier-nodes

海外 PDA 收货统一扫描冻结箱码:FBA 与 OVERSEAS 都必须由 POST /api/pda/v1/last-leg/receiving-containers/current/cartons/resolve 返回 HTTP 200、业务码 200 和当前柜唯一 inboundCode,不展示、扫描或提交 SKU。仅实收阶段分流:FBA 使用不含 skuCode 的 /current/receipts/bulk,逐箱接口必须精确返回 A0409 FBA destination must use bulk count;OVERSEAS 使用 /current/receipts/carton,bulk 必须精确返回 A0409 OVERSEAS destination must use carton-by-carton scanning; bulk count is forbidden。实机旧行为反证为 requestId 5e925a3d-8184-41e1-b0d2-f4e1aae86639、traceId 62fdf603b65fd7f43ec452bb8a6ca185。跨区广播消费只保留观察证据,不再单独形成 deployment blocker;实际 PICKUP_READY 候选门禁仍必须通过。

FBA 无 ll_inbound_plan_carton manifest 时,服务端只取完整扫描值的第一个 # 前缀,并在当前锁定柜中精确匹配唯一 inboundCode;不校验 SKU、# 后缀或箱序号,也不能要求前端拆分或自行决定归属。无 #、空前缀、未命中、跨柜或同柜多匹配必须拒绝。OVERSEAS 仍按完整箱码精确匹配真实 manifest 行。HTTP 合同使用任意 FBA 后缀验证前缀解析,覆盖上述负向与 OVERSEAS 缺 manifest,并在正负向 resolve 后回查 current 的状态、版本与收货数量零漂移。2026-08-26 最新已部署实机尚返回 A0404 Carton mark was not found,requestId a716e2c2-dc10-4d07-8014-7438afb63090、traceId 6ab8fcfcd812056ad6570d3b1652157b;该证据保留为后端 FBA 入仓码前缀解析落盘及重新部署后的回归反证,不据此放宽成功合同。

node scripts/admin-test-env-acceptance.mjs --gateway <test-gateway> --modules phase4-overseas-warehouse,phase4-overseas-pda,phase4-overseas-pda-operations,phase4-cross-region-events,phase4-overseas-business,phase4-overseas-master-data,phase4-carrier-nodes,phase4-overseas-wallet-and-pallet-cost

只有已登记在 ../admin-test-env-acceptance.mjs 的 CONFIGURED_MODULES 中的名称才能用于 --modules;目录中存在同名 .mjs 不代表总入口已注册。新增或改名 HTTP 模块时必须同步总入口、依赖展开、离线入口合同和本表;尚未注册的实验脚本不得写成可执行验收入口。

海外仓出库与派送履约链定向入口为 --modules phase5-overseas-fulfillment。依赖展开固定从本轮国内货柜履约装柜完成、海外仓业务跨区接柜和海外 PDA 实收入库生成真实库存,再由海外仓业务智能预排创建 marker 专属 PENDING_DEPARTURE 排车。海外仓出库与派送模块只消费该本轮排车,先补齐车辆与司机,原子转为一张 WAIT_OUTBOUND 出库单和按 FBA 目的仓拆分的 WAIT_DELIVERY 派送单,随后使用绑定同一海外仓的临时 PDA 身份执行全量拣货和发车,使出库单进入 OUTBOUNDED;最后逐张派送单保存签收文件自动完成,轮询核对头程入仓单与统一订单跨区回推,并覆盖回访、人工异常与退回海外仓。所有幂等重放都核对业务单号或数量不漂移,真实前置不足必须形成 deployment blocker,临时 PDA 身份无论成功失败都由正式 IAM 状态接口停用。

该模块同时核对拣货、发车和重放期间库存及 SHIP 流水只扣一次;同一派送退回异常经接收、证据上传、处理完成后必须生成真实恢复库存及 RETURN_STOCK_IN 流水,原键重放不重复入账。PROCESSING 续跑必须保留原异常、原目标托盘、原证据和幂等键,缺失即阻断,不另建异常替代。客户签收文件验证下载真实字节,并通过本轮独立 SIGNED-B 客户验证隔离,凭据不入报告。分片完成门禁只接受同一订单的多个有效入仓分片;不同订单、多目的仓或已经完成的分片不能代替此条件,缺少生产者时仍报告覆盖阻断。

node --env-file="$env:USERPROFILE\.codex\chongchong-global-dev-acceptance.env" scripts/admin-test-env-acceptance.mjs --modules phase5-overseas-fulfillment

WAIT_SPLIT 到 LOADED 冻结链

默认 Admin 全量入口已注册并按同一 context.marker 串行执行货柜主链。冻结时序为:

WAIT_SPLIT -> SIMULATION/ACTIVE 内部模拟柜 -> 智能排货 -> 无集装箱号 push-preload -> exact replay/冲突零漂移 -> 订舱 DRAFT 完整登记 containerRequirements -> RELEASED -> 港口取得真实 containerNo -> 按 oceanBookingId + requirementId + containerNo + expectedVersion 原地关联并创建 allocation -> 计划级原子确认 -> 唯一 PDA task -> claim 后 LOADING -> 原子批量拣货 -> AWAITING_REVIEW -> 五类证据 -> LOADING 阶段增量入库单/旧 inventory token A0409/刷新后续拣 -> PDA task complete 先完成 task/plan/inbound -> LOADED -> 提交后独立尝试同步唯一同柜有效拖车。

其中,无号 push 只冻结装柜计划、建立 bridge 并使预装可见,不得创建 PDA task;订舱放舱也不创建真实货柜或 allocation。港口取得真实柜号后,四字段 link 直接补全原模拟柜并创建 allocation,原 containerBookingId/cabinetNo/loadingPlan/items 不变;未关联、订舱未 RELEASED 或整份计划未确认时,PDA 查询必须返回业务码 A0404。唯一确认入口为 POST /api/platform/v1/first-leg/loading-plans/{loadingPlanId}/confirm,请求体只含当前计划 expectedVersion 并携带 Idempotency-Key;成功必须返回 confirmationStatus=CONFIRMED、readiness.readyForPda=true 和唯一 readiness.pdaTaskId。验收脚本禁止调用旧入库单级 /preload/confirming、/preload/confirm。

计划在 EDITING/LOADING 可通过正式 assignments/PATCH/DELETE 端点增量;计划、任务和明细版本必须递增,PDA 四元身份不变,旧 inventorySnapshotToken 必须返回 A0409 库存已变化,请刷新后重试。完整国内货柜履约装柜 fixture 与批量待分柜入口都只随机复用初始化的 TP-001/YW-TP-002,任一缺失即报告部署阻断,不调用托盘新增接口;当普通位不足时由 Warehouse 自然分配到 A0,随后仅使用公开 A0 换绑接口制造库存版本变化,不直连数据库、创建库位或调用内部 Warehouse 接口。模拟柜的 channelGroupCode 统一由 smart-loading-channel-group.mjs 根据订单渠道映射。主国内货柜履约链强制完成该专项,海外仓业务生产矩阵的附加柜只负责跨区生产,不重复要求 A0;附加柜若自然落入 A0 仍执行同一验证。已拣项不可删或减量,未拣项可删;增量会把全拣的 AWAITING_REVIEW 撤回为 IN_PROGRESS,刷新 task detail 与 inventory 后续拣才可再次等待最终确认。最终唯一完成入口仍为 POST /api/platform/v1/first-leg/pda-loading/tasks/{taskId}/complete:保留同柜 RELEASED 订舱、bridge 与五类 ACTIVE 证据门禁;拖车状态和数量不是前置门禁。主事务提交后,零条有效拖车直接跳过,恰有一条时在独立事务尝试推进 COMPLETED,多条或并发冲突只记录拖车同步失败,不回滚已完成的 task/plan/inbound。PDA 结算可能先递增来源入库单版本或创建实装分片,完成动作必须在结算后重新锁定实际完成行并使用当前版本;HTTP finalizer 会回查 full/partial 履约分片,失败时保存 requestId/traceId 并断言 task/plan/inbound/operation 零漂移。后续模块必须复用 phase3Loading 发布的本轮 taskId + inboundId + loadingPlanId + containerBookingId,不得回退历史资源。

动态增量还会读取计划明细中的服务端 totalPackageCount/remainingPackageCount,断言 remaining = total - assigned;随后尝试把箱数调整为权威总数加一,必须得到 A0400,并回查 plan/item 版本、分配箱数及总数投影全部零漂移。脚本不从当前已分配数量反推订单总箱数。

phase3-loading 复用本轮双托一件代发 fixture,逐托核对 task items 与 inventory units 的 unitType=SEALED_PALLET/palletId/palletNo/indivisible,两托统一通过同一次 /batch 提交各自的 PICK_PALLET + palletNo。合法整托行混入非法普通行必须整批零写;普通 PICK/PARTIAL/SKIP 不得绕过整托限制。同参同键重放不得增加版本或审计,同键更换托盘码必须冲突。以上接入现有全量链,不建立独立 HTTP 入口。

phase3-pda-convergence 同时回查 /tasks/pending 与稳定 task detail:两者的 workflowStatus、itemCount、pendingItemCount 必须来自同一任务明细事实。全拣任务必须在两处均为 AWAITING_REVIEW,可执行证据 GET,但派生 actions=[],不得重复发送 batch;操作历史必须恰有一次有效 BATCH。若 pending 仍按 assignment 返回 IN_PROGRESS,该轮以真实 HTTP 失败阻断,不由脚本或前端改写状态。

部署后需要定向验证该完整链时,模块顺序固定为:

node scripts/admin-test-env-acceptance.mjs --modules merchant-qualification-fixture,orders,inbound-measurement,phase3-container-loading,phase3-loading,phase3-container-overview,phase3-pda-convergence,phase3-evidence-gate,phase3-customs,phase3-loading-finalize

整票库位块专项可在只跑 orders,inbound-measurement 时追加 --verify-pallet-location-guide true。它在测量仍可编辑、正式提交前核对 palletLocationGuide 计数、每槽 blockId/slotNo/reservationId/locationCode/slotStatus、 称重结果按 weightResultId 显式绑定槽位;每确认一张称重图片都会回查一次,后续扩容只能追加槽位, 既有 blockId/slotNo/reservationId/locationId/sharedOverflow 不得漂移。脚本还会真实验证删除图片后原 reservation/location 保留且转为 RESERVED_EMPTY,再上传替代图片并确认复用原槽后继续提交与审核。脚本只观测自然出现的共享 A0; 不会为制造普通位不足批量停用库位。

只验证真实集装箱号晚补门禁时,使用正式可选参数 LATE_CONTAINER_GATE_ONLY=1 并仍从总入口执行 phase3-loading。该模式使用本轮 marker 独立造数,固定验证无号 push、订舱关联、整份预装确认、PDA claim/batch、无号 complete A0409、LOADING 阶段首次补号和补号后 complete 受理;随后允许后台命令停在 CABINET_EVIDENCE/A0409,以证明柜号门禁已经消失且下一门禁来自未上传的五类柜级证据。该模式不继续完整报关或 LOADED 链,也不得与完整链同时解释为同一终态验收。

$env:LATE_CONTAINER_GATE_ONLY='1'
node --env-file="$env:USERPROFILE\.codex\chongchong-global-test-acceptance.env" scripts/admin-test-env-acceptance.mjs --modules phase3-loading
Remove-Item Env:LATE_CONTAINER_GATE_ONLY

该命令会写测试环境,必须另行获得当前对话授权。离线入口合同为 ../full-regression-entry-contract.test.mjs,生产者与状态合同为 phase3-producer-chain-contract.test.mjs。

消息中心模块

notifications.mjs 覆盖平台消息模板的查询、新增、编辑、版本冲突、激活与最终停用,以及未来定时消息任务的创建、幂等重放、列表查询、取消和非法重试。模块只创建未来定时任务并在结束前取消,不实际投递验收消息。定向 HTTP 验收需要当前对话明确授权:

node scripts/admin-test-env-acceptance.mjs --modules notifications

离线静态合同可安全执行:

node --test scripts/admin-test-env-modules/notifications-contract.test.mjs

供应商模块

suppliers.mjs 覆盖平台公共供应商的列表、统计、新增、详情、编辑、启停及主要错误边界。执行:

node scripts/admin-test-env-acceptance.mjs --modules suppliers

该命令会调用测试环境写 API,只有当前对话明确授权后才允许执行。验收供应商最终停用但不删除;静态合同可安全离线运行:

node --test scripts/admin-test-env-modules/suppliers-contract.test.mjs

Finance 全链前置

finance-full-fixtures 会通过正式供应商 API 创建本轮隔离的 ACTIVE 供应商,并按费用项目类别校验后再生成 PAYABLE;不会使用历史供应商 ID。只请求 finance-full-fixtures,finance-reconciliation-full,finance-settlement-full,finance-downloads 时,总入口会自动补齐 merchant-qualification-fixture -> orders -> inbound-measurement -> phase3-container-loading,确保 Finance 能消费本轮真实已完成柜次,并在结算链完成后验证八类 XLSX 下载任务。若这些前置仍未产出同 marker 的完成柜次,Finance 会 fail-closed,不能把 finance-only 前置不足计为 Finance 业务成功。单独请求 finance-downloads 只执行最小部署能力探测,不借历史 Finance 数据。

国内整柜与客户运营统计

  • domestic-container.mjs:整柜入库、出库、库存列表和详情,并覆盖字段边界、组合筛选与分页汇总、柜号标准化、同柜追加入库、货名冲突、完成出库强制库存版本、并发版本竞争和幂等重放;静态契约为 domestic-container-contract.test.mjs。
  • customer-operating-statistics.mjs:客户详情在途柜量/TEU 运营指标,复用 platform:firstleg:container:list 权限。
  • 两者由总入口 admin-test-env-acceptance.mjs 的默认模块列表编排;接口验收会写入测试数据,静态合同可离线执行。
node --test scripts/admin-test-env-modules/domestic-container-contract.test.mjs

货柜履约列表字段合同

fulfillment-list-field-contract.mjs 统一校验货柜、预装/装柜清单、订舱、船期、拖车、报关协同和国内出仓正式响应中的稳定 ID、非空展示字段、非负数量/重量/体积及 ISO 时间格式。各生产模块在已取得的本轮 marker 响应上执行断言,不额外借用历史数据;未冻结的原型字段只登记在 docs/国内货柜履约/货柜履约原型字段验收矩阵-2026-08-17.md 的 UNKNOWN,不得由 fixture 伪造。

离线合同:

node --test scripts/admin-test-env-modules/fulfillment-prototype-field-matrix-contract.test.mjs

清库后的商户下单前置

merchant-qualification-fixture.mjs 是默认全量验收的首个模块。它通过平台正式接口创建本轮隔离客户,经 File 上传真实营业执照和法人身份证文件,再走 IAM 提交审核和平台审核通过;审核完成后把本轮动态加载模块使用的商户账号切换到该客户。

依赖商户下单资格的模块不要单独运行。定向排查时至少保留前置模块,例如:

node scripts/admin-test-env-acceptance.mjs --modules merchant-qualification-fixture,orders

该前置不会向初始化 SQL 写入伪造资质,也不会绕过订单服务的企业资格校验。静态契约可离线执行:

node --test scripts/admin-test-env-modules/merchant-qualification-fixture-contract.test.mjs

国内拖车自动完成与应付回归由 phase3-outbound-dispatch.mjs 在真实离仓后只读核验:订舱全部柜数、逐柜离仓、唯一 AUTO_COMPLETE、按拖车编号追溯柜次应付、金额守恒及 Finance 来源入池(有界等待 Outbox)。该模块的原有确认/撤销边界操作仍会写目标环境,执行须获得对应环境授权。manual-state-ocean-trucking.mjs 只构造可人工操作的状态,不伪造已完成拖车;自动终态由上述离仓链路覆盖。

event-bridge-pending-recovery.mjs 为纯离线证据校验器,文件名保留为索引入口;无事件桥调用或历史事件常量。合同覆盖 Compose DNS、三服务内部凭据版本一致、有限重试/DEAD、原事件摘要、ACK 丢失后 DUPLICATE 与单次业务效果。合成合同通过不代表环境故障演练通过;phase4-cross-region-events 保留真实重放证据阻断项。环境验收需本轮 marker 事件逐次投递记录、Inbox 与业务计数;仅使用受保护 event-outbox-operations.mjs 对 DEAD 原事件执行另行授权重试,不重放 SENT,不改表或伪造新事件。

下载中心导出共用内部助手:download-center.mjs 的 verifyDownloadCenterExport 由尾程订单、海外库存及主数据模块调用,创建 File XLSX 任务、等待终态、下载并核对字段及本轮业务数据;环境和写入授权沿所属模块。离线 download-center-fixture.mjs 仅生成合同测试使用的 XLSX 字节;download-center-contract.test.mjs 校验失败不继续下载及文件内容验证,不访问环境。

采购费用不再使用通用费用草稿、审核和发布链。phase4-overseas-finance-cross-region.mjs 对采购改为验证通用创建被拒绝,其他四类费用继续验证既有投递链;采购成功来源由完整样品流程核对实扣与来源关联。