diff --git a/AGENTS.md b/AGENTS.md index a3ba731fa..c6700a7e1 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -85,6 +85,16 @@ - 上表中的 `模块/.../` 从对应模块的 `src/main/java/com/baiyue//` 起算;二期链路跨 `order`、`firstleg`、`warehouse`、`file`、`integration-service`,修改 DTO、内部令牌、状态或表结构时必须逐个检查调用方与被调用方。 - 二期入库主状态归 `firstleg`,订单货物主数据仍归 `order`,托盘/库位资源归 `warehouse`,文件对象归 `file`,OCR 供应商适配归 `integration-service`;禁止通过跨库查询绕过内部 API。 +## 一期/二期/三期后端阶段索引 + +| 阶段 | 后端边界与入口 | 开始工作前阅读 | 状态边界 | +|---|---|---|---| +| 一期:头程订单闭环 | `auth/` 登录与账号、`iam/` 客户/RBAC/资质审核、`warehouse/` 公共仓与主数据、`order/` 订单主数据、`firstleg/` 履约任务、`file/` 资质文件 | `../docs/一期/README.md` → `../docs/一期/一期开发进度表.md` → `../docs/一期/一期头程订单闭环设计.md`;再读目标模块 `AGENTS.md`、Controller/DTO/OpenAPI 与迁移脚本 | 客户审核与必填资质通过后才具备下单资格;订单状态由 `order/` 主导,履约分配由 `firstleg/` 主导;不得把二期入库状态回写为一期订单状态 | +| 二期:到仓与头程计费 | `firstleg/` 入库、测量、审核、FBA 计费与完成编排;`warehouse/` 托盘/库位预占占用;`file/` 测量图片;`order/` 仅提供货物内部查询;`integration-service/` OCR | `../docs/二期/README.md` → `../docs/二期/二期需求优化版-v2-测量计费入库主流程.md` → `../docs/二期/二期V2需求确认清单.md`/`二期计费财务需求确认表.md` → 联调报告;旧 `二期开发进度表.md` 仅作历史参考 | 当前技术验收终点为 `WAIT_SPLIT + APPROVED + CONFIRMED`;`WAIT_SPLIT` 等待三期分柜,二期不得实现分柜、装柜、PDA 或完整财务应收应付 | +| 三期:国内出仓 | 当前 NO-GO;待契约确认后再进入 `order/`、`firstleg/`、`warehouse/`、`file/` 的出仓扩展,并与 PDA/外部接口协作 | `../docs/三期/README.md` → `../docs/三期/三期开发规划.md` → `../docs/三期/三期需求确认表.md` → `../docs/三期/三期开发进度表.md`、`../docs/三期/三期页面与原型清单.md`;先解除 P3-Q1/Q2/Q5/Q9/Q11/Q12/Q13 | 阶段终点为国内出仓、等待装船;确认项未解除前不得把复用接口或原型当作正式三期契约 | + +跨阶段修改必须先锁定 `order`/`firstleg` 状态机归属,再同步检查 `warehouse`、`file`、`auth`、`iam` 的内部 DTO、权限码、令牌和数据库增量;不得跨库读取或跳过内部 API。 + ## 配置、数据库与验证入口 - 服务本地配置在各模块 `src/main/resources/application.yml`;Nacos 环境配置集中在 `config/nacos/local/` 和 `config/nacos/cn/`。 @@ -96,8 +106,7 @@ - 本地环境切换看 `docs/数据库环境切换说明.md`、`scripts/local-env.ps1` 与 `config/nacos/local/`;接口契约优先读目标模块 `src/main/resources/openapi/` 和 Controller,回归入口在 `scripts/`,历史资质文件迁移使用 `scripts/migrate-local-qualification-file.ps1`。 - 平台管理与头程履约补齐的本地数据库只读核验、SQL 清单和回归结果见 `docs/2026-07-31平台管理与头程履约补齐回归报告.md`。 - IAM 授角、订单主数据、File、Gateway CORS 与文件日志的本轮结果见 `docs/2026-07-31-P0-P2问题修复回归报告.md`。 -- 本轮测试环境数据库增量统一从 `deploy/sql/2026-07-31一期回归测试环境增量迁移.sql` 执行,执行边界与核验方式见 `deploy/sql/README.md`。 -- 二期入库新建或存量测试环境升级使用 `deploy/sql/2026-08-04-二期入库新增表字段-MySQL8一键执行.sql`;旧的 `2026-08-03-二期入库表结构-TEST环境一键执行.sql` 只保留为早期基线参考,不替代 8 月 4 日最终增量入口。 +- 测试环境数据库增量统一从 `deploy/sql/头程数据库统一增量-MySQL8.sql` 执行,执行边界与末尾核验方式见 `deploy/sql/README.md`;历史日期脚本只用于追溯,不能作为当前部署入口。 - CI 总控入口是 `Jenkinsfile`,负责按变更或勾选项并行调度 11 个独立服务 Job;单服务构建、镜像与部署逻辑在 `Jenkinsfile.service`。Job 名必须以模块名结尾,公共模块或 `deploy/` 变化会触发全部服务。 - 从本目录运行全量校验:`mvn -DskipTests validate`、`mvn test`。单模块修改优先运行 `mvn -pl -am test`。 - 公共导出中心测试环境真实任务验收使用 `scripts/export-center-test-env-acceptance.ps1`;脚本只调用 Gateway,不负责部署或停止 Broker/File/IAM,故障注入由有权限的运维配合。 diff --git a/auth/AGENTS.md b/auth/AGENTS.md index ae2d1ae61..cb6348abe 100644 --- a/auth/AGENTS.md +++ b/auth/AGENTS.md @@ -30,3 +30,9 @@ - 平台统一用户管理变更账号客户归属时由 IAM 调用 `PUT /internal/auth/accounts/{id}/scope` 同步 Auth 的客户隔离兼容字段、成员和应用端;修改该历史契约必须同时检查 `iam/client/AuthAccountClient.java` 与 `PlatformUserManagementService.java`。 - 登录、刷新等业务失败仍是 HTTP 200 + 非 `"200"` body code;Security 入口产生的真实 401 保留给客户端 Token 刷新流程。 - 从父目录运行 `mvn -pl auth -am test`,认证接口变更再运行相关 `scripts/` 回归。 + +## 分期快速索引 + +- 一期:负责登录、注册、账号状态和 Token;先读 `../../docs/一期/README.md`、`../../docs/一期/一期开发进度表.md`,状态边界是平台账号 `tenant_id=0`、客户账号 `tenant_id>0`,不得把 Auth 变成租户管理入口。 +- 二期:无独立登录流程;仅需保证入库/计费接口沿用现有 JWT、应用域和客户隔离。涉及 `tenant_id`、Claim 或内部令牌时,先读 `../../docs/二期/README.md` 与主流程文档,再联查 `firstleg/`、`iam/`。 +- 三期:当前 NO-GO,不新增出仓账号或角色;待 `../../docs/三期/三期需求确认表.md` 解除阻断后,才评估权限码和 PDA 身份协作。 diff --git a/deploy/sql/头程数据库统一增量-MySQL8.sql b/deploy/sql/头程数据库统一增量-MySQL8.sql index 6250afaf5..816b2349c 100644 --- a/deploy/sql/头程数据库统一增量-MySQL8.sql +++ b/deploy/sql/头程数据库统一增量-MySQL8.sql @@ -2492,7 +2492,7 @@ CREATE TABLE IF NOT EXISTS fl_inbound_measurement_item ( total_weight_kg DECIMAL(18,3) NULL COMMENT '本箱规总重量kg', total_volume_cbm DECIMAL(18,4) NOT NULL COMMENT '本箱规总体积m3', volume_weight_kg DECIMAL(18,3) NOT NULL COMMENT '本箱规材积重kg', - calculation_rule_version VARCHAR(32) NOT NULL COMMENT '体积计算和舍入规则版本', + calculation_rule_version VARCHAR(64) NOT NULL COMMENT '体积计算和舍入规则版本', source_image_file_id BIGINT UNSIGNED NULL COMMENT '测量设备图片文件ID', machine_no VARCHAR(64) NULL COMMENT '本次测量设备编号', device_measured_at DATETIME(3) NULL COMMENT '本次设备测量时间', @@ -2986,6 +2986,9 @@ PREPARE phase2_measure_statement FROM @phase2_measure_sql; EXECUTE phase2_measure_statement; DEALLOCATE PREPARE phase2_measure_statement; +ALTER TABLE fl_inbound_measurement_item + MODIFY COLUMN calculation_rule_version VARCHAR(64) NOT NULL COMMENT '体积计算和舍入规则版本'; + DROP PROCEDURE IF EXISTS phase2_measure_add_column; CREATE TABLE IF NOT EXISTS fl_inbound_weight_revision ( diff --git a/docs/头程项目目录结构与服务说明.md b/docs/头程项目目录结构与服务说明.md index 237a71b44..91a3f12ad 100644 --- a/docs/头程项目目录结构与服务说明.md +++ b/docs/头程项目目录结构与服务说明.md @@ -257,6 +257,13 @@ Nacos 服务发现允许部分服务交换顺序,但联调时按上述顺序 缺少 `Idempotency-Key` 返回 `S0500`、跨客户资质文件读取返回 `B0001`。订单条件必填 `A0422`、 已提交订单编辑 `A0409`、密码恢复和报告脱敏均已通过。后续发布验证应以该报告为对照,确认上述 5 项全部关闭。 +部署完成后的最终验收报告为 `reports/client-test-env-20260808032107-59bca758.json`: +163 项全部通过,0 失败、0 跳过,`success=true`。发布前 5 个失败项和 2 个依赖跳过项均已关闭, +包括角色停用、角色权限收缩和成员角色清空后的旧会话撤销,缺少 `Idempotency-Key` 返回 `A0400`, +以及跨客户资质文件读取返回 `A0404`。角色停用后,旧 Token 查询实时权限也必须返回 +HTTP 401 / `A0401`,不得再按 HTTP 200 + 空权限处理;只有使用新会话查询停用角色的有效权限时才返回空集合。 +账号原密码恢复和报告脱敏检查同时通过。本报告作为本轮 Client 全量 HTTP 验收的最终通过基线。 + ## 9. 开发和拆分约束 - 每个业务服务只访问自己的数据库;禁止跨库 Join 和直接读取其他服务表。 diff --git a/file/AGENTS.md b/file/AGENTS.md index dcf8113b5..916438e0d 100644 --- a/file/AGENTS.md +++ b/file/AGENTS.md @@ -50,3 +50,9 @@ - 旧文件清理只接受 File 自身生成的 `/api/merchant/v1/files/qualifications/{uuid}.{ext}`,并且不得删除本次新上传的 `documentUrl`;不能仅从任意 URL 截取文件名后删除。 - 平台上传要求平台身份以及 `platform:customer:create` 或 `platform:customer:edit`,平台下载属于客户档案只读能力并要求 `platform:customer:view`;不得复用审核权限,也不能只依赖 Gateway 路由或前端按钮隐藏。 - `LocalQualificationStorage` 当前生成的 `documentUrl` 使用商户读取路径,但文件实际按 `storage-root/qualifications/{tenantId}/{uuid.ext}` 隔离;变更 URL 形态时同步检查 IAM 已存元数据、平台下载路由和迁移脚本。 + +## 分期快速索引 + +- 一期:资质文件入口为 `QualificationFileController`、`PlatformQualificationFileController`,先读 `../../docs/一期/README.md`、客户审核闭环文档;文件内容归 File,审核状态/元数据归 IAM,上传成功不等于客户已具备下单资格。 +- 二期:测量图片入口为 `PlatformMeasurementImageController` 与 `InternalMeasurementImageController`,先读 `../../docs/二期/README.md`、主流程和第三方测量联调说明;重量图片可触发 OCR,第三方尺寸证据不得触发重量 OCR,必须绑定客户、入库单和业务类型。 +- 三期:当前 NO-GO;暂不新增装柜、柜封、报关或出仓附件模型。待 `../../docs/三期/三期需求确认表.md` 确认后,再与 Firstleg/PDA 锁定文件证据生命周期和权限码。 diff --git a/firstleg/AGENTS.md b/firstleg/AGENTS.md index 9acffc455..5a761ace5 100644 --- a/firstleg/AGENTS.md +++ b/firstleg/AGENTS.md @@ -35,7 +35,7 @@ | 费用计算、确认、发布与快照 | `controller/PlatformFbaPricingController.java` → `service/FbaPricingService.java` | 自动计费和完成入库 `AutomaticInboundCompletionService.java`、`InboundCompletionOrchestrator.java`;测试 `service/FbaPricingServiceTest.java`、`InboundCompletionOrchestratorTest.java` | | 商户入库费用查询 | `controller/MerchantInboundBillingController.java` → `service/MerchantInboundBillingService.java` | 测试 `service/MerchantInboundBillingServiceTest.java`、`controller/MerchantInboundBillingControllerContractTest.java` | | 状态、幂等、历史和 Outbox | `domain/InboundProcessStatus.java`、`service/InboundIdempotencyService.java` | `repository/InboundWorkflowRepository.java`、`entity/Inbound*.java`、`mapper/Inbound*.java`;测试 `service/InboundIdempotencyServiceTest.java`、`repository/InboundWorkflowSqlContractTest.java` | -| 二期表结构和增量 | `src/main/resources/db/phase2-inbound-schema.sql`、`phase2-inbound-workflow-migration.sql`、`phase2-inbound-measurement-maintenance.sql`、`phase2-measurement-openapi.sql`、`phase2-third-party-single-measurement-migration.sql`、`phase2-fba-pricing-migration.sql` | 测试/存量环境统一入口为 `../deploy/sql/2026-08-04-二期入库新增表字段-MySQL8一键执行.sql`,执行说明见 `../deploy/sql/README.md` | +| 二期表结构和增量 | `src/main/resources/db/phase2-inbound-schema.sql`、`phase2-inbound-workflow-migration.sql`、`phase2-inbound-measurement-maintenance.sql`、`phase2-measurement-openapi.sql`、`phase2-third-party-single-measurement-migration.sql`、`phase2-fba-pricing-migration.sql` | 测试/存量环境统一入口为 `../deploy/sql/头程数据库统一增量-MySQL8.sql`,执行说明见 `../deploy/sql/README.md`;历史日期脚本仅作追溯 | ## 修改与验证 @@ -52,3 +52,9 @@ - 从父目录运行 `mvn -pl firstleg -am test`。 - 数据库执行顺序:新库执行 `firstleg.sql`;已有库在此后执行 `phase1-firstleg-task-list-index.sql`,为任务列表、按订单查询和分配历史分页补齐索引。 - 二期数据库不得只执行单个建表脚本覆盖存量库;测试/存量环境按 `../deploy/sql/README.md` 使用 8 月 4 日统一脚本,并确认末尾核验全部为 `PASS`。 + +## 分期快速索引 + +- 一期:履约任务与分配入口为 `PlatformFulfillmentAssignmentController`,先读 `../../docs/一期/README.md`、`../../docs/一期/一期开发进度表.md` 和 `../../docs/一期/一期头程订单闭环设计.md`;订单交易状态仍归 `order/`,本模块只管理任务状态、分配历史和幂等。 +- 二期:入库主线从 `PlatformInboundOrderController`、`PlatformInboundMeasurementController`、`PlatformInboundMeasurementReviewController` 到 `PlatformFbaPricingController`;先读 `../../docs/二期/README.md`、主流程、需求确认清单及联调报告。验收终点为 `WAIT_SPLIT + APPROVED + CONFIRMED`,自动完成入库不得越过测量审核、计费确认和发布门禁。 +- 三期:当前 NO-GO;后续国内出仓、分柜、装柜、PDA 拣货与船期协作需先解除 P3 阻断并重新定义状态机,不能把二期 `WAIT_SPLIT` 直接当作三期实现。 diff --git a/firstleg/src/main/java/com/baiyue/firstleg/loading/entity/LoadingPickTaskEntity.java b/firstleg/src/main/java/com/baiyue/firstleg/loading/entity/InboundLoadingPickTaskEntity.java similarity index 88% rename from firstleg/src/main/java/com/baiyue/firstleg/loading/entity/LoadingPickTaskEntity.java rename to firstleg/src/main/java/com/baiyue/firstleg/loading/entity/InboundLoadingPickTaskEntity.java index 08d58558c..3ab58fe98 100644 --- a/firstleg/src/main/java/com/baiyue/firstleg/loading/entity/LoadingPickTaskEntity.java +++ b/firstleg/src/main/java/com/baiyue/firstleg/loading/entity/InboundLoadingPickTaskEntity.java @@ -10,8 +10,8 @@ import java.time.LocalDateTime; @Getter @Setter -@TableName("fl_loading_pick_task") -public class LoadingPickTaskEntity { +@TableName("fl_inbound_loading_pick_task") +public class InboundLoadingPickTaskEntity { @TableId(type = IdType.ASSIGN_ID) private Long id; private Long tenantId; private Long inboundId; diff --git a/firstleg/src/main/java/com/baiyue/firstleg/loading/mapper/InboundLoadingPickTaskMapper.java b/firstleg/src/main/java/com/baiyue/firstleg/loading/mapper/InboundLoadingPickTaskMapper.java index c3b7700c4..9e71d55d6 100644 --- a/firstleg/src/main/java/com/baiyue/firstleg/loading/mapper/InboundLoadingPickTaskMapper.java +++ b/firstleg/src/main/java/com/baiyue/firstleg/loading/mapper/InboundLoadingPickTaskMapper.java @@ -1,14 +1,14 @@ package com.baiyue.firstleg.loading.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.baiyue.firstleg.loading.entity.LoadingPickTaskEntity; +import com.baiyue.firstleg.loading.entity.InboundLoadingPickTaskEntity; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Update; @Mapper -public interface InboundLoadingPickTaskMapper extends BaseMapper { - @Update("UPDATE fl_loading_pick_task SET status=#{toStatus}, updated_by=#{operatorId}, updated_by_name=#{operatorName}, " +public interface InboundLoadingPickTaskMapper extends BaseMapper { + @Update("UPDATE fl_inbound_loading_pick_task SET status=#{toStatus}, updated_by=#{operatorId}, updated_by_name=#{operatorName}, " + "remark=COALESCE(#{remark}, remark), expected_count=COALESCE(#{expectedCount}, expected_count), " + "picked_count=COALESCE(#{pickedCount}, picked_count), version=version+1 WHERE tenant_id=#{tenantId} AND inbound_id=#{inboundId} " + "AND status=#{fromStatus} AND version=#{expectedVersion}") diff --git a/firstleg/src/main/java/com/baiyue/firstleg/loading/repository/LoadingRepository.java b/firstleg/src/main/java/com/baiyue/firstleg/loading/repository/LoadingRepository.java index dedb358a6..029b0e777 100644 --- a/firstleg/src/main/java/com/baiyue/firstleg/loading/repository/LoadingRepository.java +++ b/firstleg/src/main/java/com/baiyue/firstleg/loading/repository/LoadingRepository.java @@ -8,7 +8,7 @@ import com.baiyue.firstleg.loading.mapper.LoadingEvidenceMapper; import com.baiyue.firstleg.loading.mapper.LoadingInboundMapper; import com.baiyue.firstleg.loading.mapper.LoadingOperationMapper; import com.baiyue.firstleg.loading.mapper.InboundLoadingPickTaskMapper; -import com.baiyue.firstleg.loading.entity.LoadingPickTaskEntity; +import com.baiyue.firstleg.loading.entity.InboundLoadingPickTaskEntity; import jakarta.annotation.Resource; import org.springframework.stereotype.Repository; @@ -75,11 +75,11 @@ public class LoadingRepository { operations.complete(tenantId, inboundId, operatorId, operation, key, resultJson); } - public LoadingPickTaskEntity findPickTask(long tenantId, long inboundId) { - return picks.selectOne(new LambdaQueryWrapper() - .eq(LoadingPickTaskEntity::getTenantId, tenantId).eq(LoadingPickTaskEntity::getInboundId, inboundId)); + public InboundLoadingPickTaskEntity findPickTask(long tenantId, long inboundId) { + return picks.selectOne(new LambdaQueryWrapper() + .eq(InboundLoadingPickTaskEntity::getTenantId, tenantId).eq(InboundLoadingPickTaskEntity::getInboundId, inboundId)); } - public void createPickTask(LoadingPickTaskEntity task) { picks.insert(task); } + public void createPickTask(InboundLoadingPickTaskEntity task) { picks.insert(task); } public int changePickStatus(long tenantId, long inboundId, String from, String to, long operatorId, String operatorName, String remark, Integer expectedCount, Integer pickedCount, int version) { diff --git a/firstleg/src/main/java/com/baiyue/firstleg/loading/service/LoadingDeliveryService.java b/firstleg/src/main/java/com/baiyue/firstleg/loading/service/LoadingDeliveryService.java index 0d6755382..e04fc364f 100644 --- a/firstleg/src/main/java/com/baiyue/firstleg/loading/service/LoadingDeliveryService.java +++ b/firstleg/src/main/java/com/baiyue/firstleg/loading/service/LoadingDeliveryService.java @@ -10,7 +10,7 @@ import com.baiyue.firstleg.loading.dto.LoadingRequests.*; import com.baiyue.firstleg.loading.dto.LoadingResponses.*; import com.baiyue.firstleg.loading.entity.LoadingEvidenceEntity; import com.baiyue.firstleg.loading.entity.LoadingOperationEntity; -import com.baiyue.firstleg.loading.entity.LoadingPickTaskEntity; +import com.baiyue.firstleg.loading.entity.InboundLoadingPickTaskEntity; import com.baiyue.firstleg.loading.domain.PickingStatus; import com.baiyue.firstleg.loading.dto.LoadingResponses.PickingResponse; import com.baiyue.firstleg.loading.mapper.LoadingInboundMapper.Snapshot; @@ -120,10 +120,10 @@ public class LoadingDeliveryService { LoadingActionResponse replay = claimOrReplay(tenantId, inboundId, operatorId, "START_PICKING", key, hash); if (replay != null) return pickResponse(tenantId, inboundId); requireLoadingStage(tenantId, inboundId); - LoadingPickTaskEntity task = repository.findPickTask(tenantId, inboundId); + InboundLoadingPickTaskEntity task = repository.findPickTask(tenantId, inboundId); if (task == null) { if (request.expectedVersion() != 0) throw concurrent(); - task = new LoadingPickTaskEntity(); task.setTenantId(tenantId); task.setInboundId(inboundId); + task = new InboundLoadingPickTaskEntity(); task.setTenantId(tenantId); task.setInboundId(inboundId); task.setStatus(PickingStatus.IN_PROGRESS); task.setVersion(0); task.setExpectedCount(request.expectedCount()); task.setPickedCount(request.pickedCount()); task.setRemark(request.remark()); task.setUpdatedBy(operatorId); task.setUpdatedByName(operatorName); @@ -143,9 +143,9 @@ public class LoadingDeliveryService { LoadingActionResponse replay = claimOrReplay(tenantId, inboundId, operatorId, "COMPLETE_PICKING", key, hash); if (replay != null) return pickResponse(tenantId, inboundId); requireLoadingStage(tenantId, inboundId); - LoadingPickTaskEntity task = repository.findPickTask(tenantId, inboundId); + InboundLoadingPickTaskEntity task = repository.findPickTask(tenantId, inboundId); if (task == null) { - task = new LoadingPickTaskEntity(); task.setTenantId(tenantId); task.setInboundId(inboundId); + task = new InboundLoadingPickTaskEntity(); task.setTenantId(tenantId); task.setInboundId(inboundId); task.setStatus(PickingStatus.COMPLETED); task.setVersion(0); task.setExpectedCount(request.expectedCount()); task.setPickedCount(request.pickedCount()); task.setRemark(request.remark()); task.setUpdatedBy(operatorId); task.setUpdatedByName(operatorName); @@ -164,7 +164,7 @@ public class LoadingDeliveryService { } private PickingResponse pickResponse(long tenantId, long inboundId) { - LoadingPickTaskEntity task = repository.findPickTask(tenantId, inboundId); + InboundLoadingPickTaskEntity task = repository.findPickTask(tenantId, inboundId); if (task == null) return null; return new PickingResponse(task.getId(), task.getInboundId(), task.getStatus(), task.getVersion(), task.getExpectedCount(), task.getPickedCount(), task.getRemark()); diff --git a/firstleg/src/main/java/com/baiyue/firstleg/repository/UnifiedInboundReadRepository.java b/firstleg/src/main/java/com/baiyue/firstleg/repository/UnifiedInboundReadRepository.java index 258a54b1d..2ca7baca5 100644 --- a/firstleg/src/main/java/com/baiyue/firstleg/repository/UnifiedInboundReadRepository.java +++ b/firstleg/src/main/java/com/baiyue/firstleg/repository/UnifiedInboundReadRepository.java @@ -2,7 +2,7 @@ package com.baiyue.firstleg.repository; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baiyue.firstleg.loading.entity.LoadingEvidenceEntity; -import com.baiyue.firstleg.loading.entity.LoadingPickTaskEntity; +import com.baiyue.firstleg.loading.entity.InboundLoadingPickTaskEntity; import com.baiyue.firstleg.loading.mapper.LoadingEvidenceMapper; import com.baiyue.firstleg.loading.mapper.InboundLoadingPickTaskMapper; import com.baiyue.firstleg.split.entity.PreloadPlanEntity; @@ -34,10 +34,10 @@ public class UnifiedInboundReadRepository { .eq(PreloadPlanEntity::getInboundId, inboundId)); } - public LoadingPickTaskEntity findPick(long tenantId, long inboundId) { - return picks.selectOne(new LambdaQueryWrapper() - .eq(LoadingPickTaskEntity::getTenantId, tenantId) - .eq(LoadingPickTaskEntity::getInboundId, inboundId)); + public InboundLoadingPickTaskEntity findPick(long tenantId, long inboundId) { + return picks.selectOne(new LambdaQueryWrapper() + .eq(InboundLoadingPickTaskEntity::getTenantId, tenantId) + .eq(InboundLoadingPickTaskEntity::getInboundId, inboundId)); } public List findEvidence(long tenantId, long inboundId) { @@ -55,12 +55,12 @@ public class UnifiedInboundReadRepository { .collect(Collectors.toMap(PreloadPlanEntity::getInboundId, Function.identity(), (left, right) -> left)); } - public Map findPicks(Map tenantByInbound) { + public Map findPicks(Map tenantByInbound) { if (tenantByInbound.isEmpty()) return Map.of(); - return picks.selectList(new LambdaQueryWrapper() - .in(LoadingPickTaskEntity::getInboundId, tenantByInbound.keySet())) + return picks.selectList(new LambdaQueryWrapper() + .in(InboundLoadingPickTaskEntity::getInboundId, tenantByInbound.keySet())) .stream().filter(item -> owns(tenantByInbound, item.getInboundId(), item.getTenantId())) - .collect(Collectors.toMap(LoadingPickTaskEntity::getInboundId, Function.identity(), (left, right) -> left)); + .collect(Collectors.toMap(InboundLoadingPickTaskEntity::getInboundId, Function.identity(), (left, right) -> left)); } public Map> findEvidence(Map tenantByInbound) { diff --git a/firstleg/src/main/java/com/baiyue/firstleg/service/MeasurementBatchService.java b/firstleg/src/main/java/com/baiyue/firstleg/service/MeasurementBatchService.java index f51611c52..b5e728c08 100644 --- a/firstleg/src/main/java/com/baiyue/firstleg/service/MeasurementBatchService.java +++ b/firstleg/src/main/java/com/baiyue/firstleg/service/MeasurementBatchService.java @@ -163,7 +163,8 @@ public class MeasurementBatchService { item.setVolumeWeightKg(totalVolume.multiply(VOLUME_WEIGHT_FACTOR).setScale(3, RoundingMode.CEILING)); item.setCalculationRuleVersion(weighted.calculationRuleVersion()); item.setSourceImageFileId(source.intelligentImageFileId()); - item.setOverLimitWarning(source.overLimitWarning()); + item.setOverLimitWarning(weighted.warning() == null + ? source.overLimitWarning() : weighted.warning()); item.setOuterLengthCm(weighted.outerLengthCm()); item.setOuterWidthCm(weighted.outerWidthCm()); item.setOuterHeightCm(weighted.outerHeightCm()); diff --git a/firstleg/src/main/java/com/baiyue/firstleg/service/UnifiedInboundQueryService.java b/firstleg/src/main/java/com/baiyue/firstleg/service/UnifiedInboundQueryService.java index b5cd37f46..3de46b138 100644 --- a/firstleg/src/main/java/com/baiyue/firstleg/service/UnifiedInboundQueryService.java +++ b/firstleg/src/main/java/com/baiyue/firstleg/service/UnifiedInboundQueryService.java @@ -84,7 +84,7 @@ public class UnifiedInboundQueryService { private UnifiedInboundSummary summary(InboundOrderEntity inbound, InboundOrderDetail detail, com.baiyue.firstleg.split.entity.PreloadPlanEntity preload, - com.baiyue.firstleg.loading.entity.LoadingPickTaskEntity pick, + com.baiyue.firstleg.loading.entity.InboundLoadingPickTaskEntity pick, List evidence, LocalDateTime deliveryAt, InboundTransportSnapshotEntity transport) { String mainStatus = mainStatus(inbound.getProcessStatus()); diff --git a/firstleg/src/main/resources/db/phase2-inbound-schema.sql b/firstleg/src/main/resources/db/phase2-inbound-schema.sql index 0d6b610ab..1512d76e0 100644 --- a/firstleg/src/main/resources/db/phase2-inbound-schema.sql +++ b/firstleg/src/main/resources/db/phase2-inbound-schema.sql @@ -217,7 +217,7 @@ CREATE TABLE IF NOT EXISTS fl_inbound_measurement_item ( total_weight_kg DECIMAL(18,3) NULL COMMENT '本箱规总重量kg', total_volume_cbm DECIMAL(18,4) NOT NULL COMMENT '本箱规总体积m3', volume_weight_kg DECIMAL(18,3) NOT NULL COMMENT '本箱规材积重kg', - calculation_rule_version VARCHAR(32) NOT NULL COMMENT '体积计算和舍入规则版本', + calculation_rule_version VARCHAR(64) NOT NULL COMMENT '体积计算和舍入规则版本', source_image_file_id BIGINT UNSIGNED NULL COMMENT '测量设备图片文件ID', machine_no VARCHAR(64) NULL COMMENT '本次测量设备编号', device_measured_at DATETIME(3) NULL COMMENT '本次设备测量时间', diff --git a/firstleg/src/main/resources/db/phase3-smart-loading-schema.sql b/firstleg/src/main/resources/db/phase3-smart-loading-schema.sql index 235f68c4d..1516779b2 100644 --- a/firstleg/src/main/resources/db/phase3-smart-loading-schema.sql +++ b/firstleg/src/main/resources/db/phase3-smart-loading-schema.sql @@ -228,6 +228,92 @@ CREATE TABLE IF NOT EXISTS fl_loading_plan_history ( REFERENCES fl_loading_plan_item (id) ) ENGINE=InnoDB COMMENT='智能装柜追加式不可变操作历史'; +-- fl_loading_pick_task 曾被另一套入库汇总模型复用。先按字段签名识别并迁走, +-- 再创建智能装柜任务表;未知或混合结构必须人工处理,禁止静默套用错误表型。 +DROP PROCEDURE IF EXISTS migrate_legacy_loading_pick_task; +DELIMITER $$ +CREATE PROCEDURE migrate_legacy_loading_pick_task() +BEGIN + DECLARE source_exists INT DEFAULT 0; + DECLARE source_smart_columns INT DEFAULT 0; + DECLARE source_inbound_columns INT DEFAULT 0; + DECLARE target_exists INT DEFAULT 0; + DECLARE target_inbound_columns INT DEFAULT 0; + + SELECT COUNT(*) INTO source_exists + FROM information_schema.tables + WHERE table_schema = 'baiyue_firstleg' AND table_name = 'fl_loading_pick_task'; + IF source_exists = 1 THEN + SELECT COUNT(*) INTO source_smart_columns + FROM information_schema.columns + WHERE table_schema = 'baiyue_firstleg' AND table_name = 'fl_loading_pick_task' + AND column_name IN ('loading_plan_id', 'container_no', 'task_status'); + SELECT COUNT(*) INTO source_inbound_columns + FROM information_schema.columns + WHERE table_schema = 'baiyue_firstleg' AND table_name = 'fl_loading_pick_task' + AND column_name IN ('tenant_id', 'inbound_id', 'status', 'expected_count', 'picked_count'); + + IF source_smart_columns = 3 AND source_inbound_columns = 0 THEN + SET source_exists = 1; + ELSEIF source_smart_columns = 0 AND source_inbound_columns = 5 THEN + SELECT COUNT(*) INTO target_exists + FROM information_schema.tables + WHERE table_schema = 'baiyue_firstleg' + AND table_name = 'fl_inbound_loading_pick_task'; + IF target_exists = 0 THEN + RENAME TABLE fl_loading_pick_task TO fl_inbound_loading_pick_task; + ELSE + SELECT COUNT(*) INTO target_inbound_columns + FROM information_schema.columns + WHERE table_schema = 'baiyue_firstleg' + AND table_name = 'fl_inbound_loading_pick_task' + AND column_name IN ('tenant_id', 'inbound_id', 'status', 'expected_count', 'picked_count'); + IF target_inbound_columns <> 5 THEN + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = '拣货任务迁移失败:fl_inbound_loading_pick_task 不是入库汇总结构'; + END IF; + INSERT INTO fl_inbound_loading_pick_task + (id, tenant_id, inbound_id, status, version, expected_count, picked_count, + remark, updated_by, updated_by_name, created_at, updated_at) + SELECT source.id, source.tenant_id, source.inbound_id, source.status, source.version, + source.expected_count, source.picked_count, source.remark, source.updated_by, + source.updated_by_name, source.created_at, source.updated_at + FROM fl_loading_pick_task source + LEFT JOIN fl_inbound_loading_pick_task target + ON target.id = source.id + WHERE target.id IS NULL; + IF EXISTS ( + SELECT 1 + FROM fl_loading_pick_task source + LEFT JOIN fl_inbound_loading_pick_task target ON target.id = source.id + WHERE target.id IS NULL + OR NOT (target.tenant_id <=> source.tenant_id) + OR NOT (target.inbound_id <=> source.inbound_id) + OR NOT (target.status <=> source.status) + OR NOT (target.version <=> source.version) + OR NOT (target.expected_count <=> source.expected_count) + OR NOT (target.picked_count <=> source.picked_count) + OR NOT (target.remark <=> source.remark) + OR NOT (target.updated_by <=> source.updated_by) + OR NOT (target.updated_by_name <=> source.updated_by_name) + OR NOT (target.created_at <=> source.created_at) + OR NOT (target.updated_at <=> source.updated_at) + ) THEN + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = '拣货任务迁移失败:新旧入库汇总任务存在主键冲突'; + END IF; + DROP TABLE fl_loading_pick_task; + END IF; + ELSE + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = '拣货任务迁移失败:fl_loading_pick_task 字段签名未知或混合'; + END IF; + END IF; +END$$ +DELIMITER ; +CALL migrate_legacy_loading_pick_task(); +DROP PROCEDURE migrate_legacy_loading_pick_task; + CREATE TABLE IF NOT EXISTS fl_loading_pick_task ( id BIGINT UNSIGNED NOT NULL COMMENT 'PDA拣货任务ID', loading_plan_id BIGINT UNSIGNED NOT NULL COMMENT '装柜计划ID', diff --git a/firstleg/src/test/java/com/baiyue/firstleg/repository/CustomerDimensionConfigSqlContractTest.java b/firstleg/src/test/java/com/baiyue/firstleg/repository/CustomerDimensionConfigSqlContractTest.java index 69ac70404..b3dea1243 100644 --- a/firstleg/src/test/java/com/baiyue/firstleg/repository/CustomerDimensionConfigSqlContractTest.java +++ b/firstleg/src/test/java/com/baiyue/firstleg/repository/CustomerDimensionConfigSqlContractTest.java @@ -103,6 +103,19 @@ class CustomerDimensionConfigSqlContractTest { .contains("客户尺寸计算配置权限码、固定ID或父节点不正确"); } + @Test + void measurementRuleVersionFitsAllBoxTypeNamesAndUpgradesExistingTables() throws Exception { + String schema = resource("db/phase2-inbound-schema.sql"); + String unified = Files.readString( + Path.of("..", "deploy", "sql", "头程数据库统一增量-MySQL8.sql"), + StandardCharsets.UTF_8); + + assertThat(schema).contains("calculation_rule_version VARCHAR(64) NOT NULL"); + assertThat(unified) + .contains("calculation_rule_version VARCHAR(64) NOT NULL") + .contains("MODIFY COLUMN calculation_rule_version VARCHAR(64) NOT NULL"); + } + @Test void unifiedMigrationUpgradesOnlyRecognizedLegacyTableAndBackfillsIdempotently() throws Exception { String sql = Files.readString(Path.of("..", "deploy", "sql", "头程数据库统一增量-MySQL8.sql"), diff --git a/firstleg/src/test/java/com/baiyue/firstleg/repository/LoadingPickTaskMappingContractTest.java b/firstleg/src/test/java/com/baiyue/firstleg/repository/LoadingPickTaskMappingContractTest.java new file mode 100644 index 000000000..8f967f19a --- /dev/null +++ b/firstleg/src/test/java/com/baiyue/firstleg/repository/LoadingPickTaskMappingContractTest.java @@ -0,0 +1,37 @@ +package com.baiyue.firstleg.repository; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.baiyue.firstleg.entity.LoadingPickTaskEntity; +import com.baiyue.firstleg.loading.entity.InboundLoadingPickTaskEntity; +import com.baiyue.firstleg.loading.mapper.InboundLoadingPickTaskMapper; +import org.apache.ibatis.annotations.Update; +import org.junit.jupiter.api.Test; + +import java.lang.reflect.Method; + +import static org.assertj.core.api.Assertions.assertThat; + +class LoadingPickTaskMappingContractTest { + @Test + void detailedAndInboundPickEntitiesUseDistinctTables() { + assertThat(LoadingPickTaskEntity.class.getAnnotation(TableName.class).value()) + .isEqualTo("fl_loading_pick_task"); + assertThat(InboundLoadingPickTaskEntity.class.getAnnotation(TableName.class).value()) + .isEqualTo("fl_inbound_loading_pick_task") + .isNotEqualTo(LoadingPickTaskEntity.class.getAnnotation(TableName.class).value()); + } + + @Test + void inboundMapperUsesInboundTaskTableAndFields() throws Exception { + Method method = InboundLoadingPickTaskMapper.class.getDeclaredMethod( + "changeStatus", long.class, long.class, String.class, String.class, + long.class, String.class, String.class, Integer.class, Integer.class, int.class); + String sql = method.getAnnotation(Update.class).value()[0]; + + assertThat(sql) + .contains("UPDATE fl_inbound_loading_pick_task") + .contains("tenant_id=#{tenantId}") + .contains("inbound_id=#{inboundId}") + .doesNotContain("fl_loading_pick_task"); + } +} diff --git a/firstleg/src/test/java/com/baiyue/firstleg/service/CartonMeasurementServiceTest.java b/firstleg/src/test/java/com/baiyue/firstleg/service/CartonMeasurementServiceTest.java index 34988b2e7..3469dddb9 100644 --- a/firstleg/src/test/java/com/baiyue/firstleg/service/CartonMeasurementServiceTest.java +++ b/firstleg/src/test/java/com/baiyue/firstleg/service/CartonMeasurementServiceTest.java @@ -112,6 +112,30 @@ class CartonMeasurementServiceTest { verify(images).delete("internal-token", 90001L, 10001L, 70001L, 88001L); } + @Test + void oversizeScanKeepsImageAndActualDimensionsForManualReview() { + InboundMeasurementEntity measurement = measurement(30001L, "RECEIVED", 0); + when(repository.findItemByBoxCode(10001L, "RK-001#5-1")).thenReturn(null); + when(repository.findLatestEditableMeasurement(10001L, 70001L)).thenReturn(measurement); + when(repository.listItems(10001L, 30001L)).thenAnswer(invocation -> List.of(insertedItem.get())); + when(repository.updateMeasurement(measurement)).thenReturn(true); + CartonMeasurementCommand oversize = new CartonMeasurementCommand( + "RK-001#5-1", new BigDecimal("60.100"), new BigDecimal("50.100"), + new BigDecimal("50.100"), new BigDecimal("12.500"), "MJ-01", + LocalDateTime.parse("2026-08-07T10:30:00"), + new MockMultipartFile("image", "measure.jpg", "image/jpeg", "image".getBytes())); + + CartonMeasurementResult result = service.upsert(10001L, 90001L, oversize); + + assertThat(result.created()).isTrue(); + assertThat(insertedItem.get().getSourceImageFileId()).isEqualTo(99001L); + assertThat(insertedItem.get().getLengthCm()).isEqualByComparingTo("60.100"); + assertThat(insertedItem.get().getCalculationRuleVersion()) + .isEqualTo("ACTUAL_DIMENSION_OVERSIZE_V1"); + assertThat(insertedItem.get().getOverLimitWarning()).contains("人工复核"); + verify(images, never()).delete(any(), any(Long.TYPE), any(Long.TYPE), any(Long.TYPE), any(Long.TYPE)); + } + @Test void submittedInboundRejectsDeviceBeforeUploadingImage() { when(repository.findInbound(10001L, 70001L)).thenReturn(inbound("MEASURE_PENDING")); diff --git a/gateway/AGENTS.md b/gateway/AGENTS.md index 3b46efe90..89a1454b3 100644 --- a/gateway/AGENTS.md +++ b/gateway/AGENTS.md @@ -28,3 +28,9 @@ - 普通业务响应由下游服务返回 HTTP 200 + body code;Gateway 自身的认证/会话失败仍保留真实 401/403,不能为了统一响应改成 HTTP 200。 - CORS 生产来源必须为明确 HTTPS 域名,不能放宽为 `*`。 - 从父目录运行 `mvn -pl gateway -am test`。 + +## 分期快速索引 + +- 一期:承载 Admin/Client 登录后的应用域、JWT 会话、客户隔离和 CORS;先读 `../../docs/一期/README.md` 与一期闭环设计,网关只做入口认证,不替代 `auth`、`iam`、`order` 的业务授权。 +- 二期:新增到仓、测量、计费和第三方测量联调路由时,先读 `../../docs/二期/README.md`、主流程和联调报告;保持 `tenant_id>0` 客户隔离、`tenant_id=0` 平台公共资源及内部服务令牌边界,不把内部测量接口暴露到外部 Gateway。 +- 三期:当前 NO-GO;不得提前开放分柜、订舱、PDA、装柜、报关或港务路由。待 `../../docs/三期/三期需求确认表.md` 的 P3 阻断项解除并锁定契约后,再同步公开路径、App Scope、权限码和 Swagger 聚合。 diff --git a/iam/AGENTS.md b/iam/AGENTS.md index a9ac1f02d..965a35983 100644 --- a/iam/AGENTS.md +++ b/iam/AGENTS.md @@ -53,3 +53,9 @@ - 存量库新增一期客户档案字段时执行 `phase1-customer-profile.sql`;该脚本只扩展 `iam_tenant`,可重复执行,不得把运单数、财务金额、套餐计费、代客登录或物理删除能力并入 IAM。 - `deploy/scripts/initialize-test-databases.sh` 的 IAM 客户档案和 Warehouse 主数据脚本顺序必须与当前文件保持一致;测试环境正式增量仍以 `../deploy/sql/README.md` 指定的统一迁移为准。 - 从父目录运行 `mvn -pl iam -am test`,再按影响执行一期认证/IAM API 回归。 + +## 分期快速索引 + +- 一期入口:`PlatformTenantController`(客户建档/审核)、`PlatformUserManagementController`/`RbacController`(平台用户与 RBAC)、`ProfileResourceController`(企业资料);先读 `../../docs/一期/README.md` → `../../docs/一期/一期开发进度表.md` → `../../docs/一期/一期头程订单闭环设计.md`。状态边界为客户审核与两类必填资质均 `APPROVED` 后才允许下单。 +- 二期协作:IAM 不承载入库或计费状态,仅为 `firstleg/` 提供客户资格/授权快照;先读 `../../docs/二期/README.md` 与 `../../docs/二期/二期V2需求确认清单.md`,确认 `tenant_id>0` 客户隔离和 `tenant_id=0` 平台公共资源边界不变。 +- 三期:当前 NO-GO;不提前新增出仓角色、租户层或 PDA 权限。待 `../../docs/三期/三期需求确认表.md` 的 P3 阻断项解除后,再同步权限资源、角色种子与 Auth Claim 消费者。 diff --git a/integration-service/AGENTS.md b/integration-service/AGENTS.md index f56b4535a..0f949f629 100644 --- a/integration-service/AGENTS.md +++ b/integration-service/AGENTS.md @@ -37,3 +37,9 @@ - OCR 原始响应和第三方密钥不得写入应用日志,真实供应商调用必须保持默认关闭。 - 单图接口只接收 File 传入的受控图片内容,不负责保存 `file_object`、入库单或重量确认记录;响应 DTO 或错误语义变化时同步检查 File 的 `WeightOcrClient`、`MeasurementImageService` 和契约测试。 - 从父目录运行 `mvn -pl integration-service -am test`。 + +## 分期快速索引 + +- 一期:不承载一期订单主流程;仅提供可复用的第三方适配基础,不得把供应商 DTO 直接变成订单或客户领域模型。范围依据先读 `../../docs/一期/README.md`。 +- 二期:当前主要消费者是 `file/` 的重量 OCR 链路;先读 `../../docs/二期/README.md`、主流程和第三方测量联调说明。真实 OCR 凭证未配置时只能验证失败后人工修正的降级链路,不能伪造识别成功。 +- 三期:当前 NO-GO;不提前接入自动报关、船期、港务或其他外部业务接口。待 `../../docs/三期/三期需求确认表.md` 解除相关阻断项后,再为每个供应商单独确认契约、开关、超时、重试、幂等和审计边界。 diff --git a/order/AGENTS.md b/order/AGENTS.md index 31981c4ef..2b2fb1893 100644 --- a/order/AGENTS.md +++ b/order/AGENTS.md @@ -48,3 +48,9 @@ - `POST /api/platform/v1/orders/first-leg/{id}/submit?tenantId={tenantId}`:平台代客提交订单,校验 `platform:order:submit`,必须携带 `Idempotency-Key`。 - `src/main/resources/openapi/order-v1.yaml` 是静态 OpenAPI 入口;`ord_idempotency_record` 以客户隔离兼容字段、操作人、操作和幂等键建立唯一约束。 - 数据库执行顺序:新库先执行 `order.sql`,已有库执行 `phase1-order-extension.sql`;后者包含幂等表创建,必须在部署订单写接口前完成。 + +## 分期快速索引 + +- 一期:订单创建/提交/审核/接单/取消入口均在 `MerchantFirstLegOrderController`、`PlatformFirstLegOrderController`;先读 `../../docs/一期/README.md`、`../../docs/一期/一期开发进度表.md` 和 `../../docs/一期/一期头程订单闭环设计.md`。订单主状态由 `OrderStatus` 管理,提交资格由 IAM 审核与必填资质决定。 +- 二期:Order 仅提供 `InternalOrderCargoController` 供 Firstleg 校验订单货物和快照,不承载入库测量、计费或托盘状态;先读 `../../docs/二期/README.md` 与主流程文档。二期终点停在 `WAIT_SPLIT`,不得在此模块加入分柜/装柜状态。 +- 三期:当前 NO-GO;国内出仓状态机和排柜/订舱契约待 `../../docs/三期/三期需求确认表.md` 确认后再扩展,暂复用现有订单主数据和快照能力,不把原型动作当已确定 API。 diff --git a/reports/admin-supplemental-expanded.json b/reports/admin-supplemental-expanded.json new file mode 100644 index 000000000..d4d34d951 --- /dev/null +++ b/reports/admin-supplemental-expanded.json @@ -0,0 +1,1391 @@ +{ + "reportName": "后台管理测试环境 HTTP API 验收", + "marker": "ADMIN-API-20260808032536000", + "gateway": "http://8.163.30.128:9000", + "generatedAt": "2026-08-08T03:25:38.294Z", + "startedAt": "2026-08-08T03:25:36.000Z", + "success": false, + "fatal": null, + "summary": { + "total": 75, + "passed": 74, + "failed": 1 + }, + "modules": [ + { + "name": "supplemental", + "startedAt": "2026-08-08T03:25:36.380Z", + "finishedAt": "2026-08-08T03:25:38.294Z", + "success": false, + "passed": 73, + "failed": 1, + "fatal": null + } + ], + "scenarios": [], + "deploymentBlockers": [], + "createdResources": {}, + "excluded": [ + { + "scope": "dashboard", + "reason": "首页为静态演示数据,不调用后端 API" + }, + { + "scope": "hidden-prototypes", + "reason": "隐藏原型页面尚无已确认后端契约" + } + ], + "securityNote": "报告不保存登录密码、Access Token、Refresh Token、图片二进制或 OCR 原文全文。", + "steps": [ + { + "module": "authentication", + "scenario": null, + "name": "平台管理员登录", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/auth/login" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "c1f5c5ad-b4fc-4ab4-afb2-a7e1d45c32e1, 90eac2e9-92d3-4bce-b97c-aa26353416a3", + "traceId": "a03dcdd5ca124120839f928a76a0510e", + "evidence": "", + "checkedAt": "2026-08-08T03:25:36.379Z" + }, + { + "module": "supplemental", + "scenario": null, + "name": "order-service 状态响应使用统一成功体", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "1513ad62-e899-4b85-a729-1fe8af7fc01d, a2d800ee-3883-4203-aea9-2cef31a18010", + "traceId": "f468f7fe9a124570a08a581424291ba8", + "evidence": "HTTP=200, code=200", + "checkedAt": "2026-08-08T03:25:36.418Z" + }, + { + "module": "supplemental", + "scenario": null, + "name": "order-service 状态字段完整且 readiness 语义明确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "1513ad62-e899-4b85-a729-1fe8af7fc01d, a2d800ee-3883-4203-aea9-2cef31a18010", + "traceId": "f468f7fe9a124570a08a581424291ba8", + "evidence": "service=order-service, status=UP, readiness=UP", + "checkedAt": "2026-08-08T03:25:36.418Z" + }, + { + "module": "supplemental", + "scenario": null, + "name": "firstleg-service 状态响应使用统一成功体", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "bb12c6ca-39e7-4442-ac18-387cacac54e9, 8887178a-b520-4469-b31d-c84d855f43d8", + "traceId": "d16e933af84547e583a2f760c3cc7807", + "evidence": "HTTP=200, code=200", + "checkedAt": "2026-08-08T03:25:36.459Z" + }, + { + "module": "supplemental", + "scenario": null, + "name": "firstleg-service 状态字段完整且 readiness 语义明确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "bb12c6ca-39e7-4442-ac18-387cacac54e9, 8887178a-b520-4469-b31d-c84d855f43d8", + "traceId": "d16e933af84547e583a2f760c3cc7807", + "evidence": "service=firstleg-service, status=UP, readiness=UP", + "checkedAt": "2026-08-08T03:25:36.459Z" + }, + { + "module": "supplemental", + "scenario": null, + "name": "file-service 状态响应使用统一成功体", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/files/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "e8abdc0b-24de-4f6e-b79c-baf341c0e6be, 51855fc1-09ff-4256-9b58-ec2254b2558c", + "traceId": "b578738cb7674ad9a7e93e35ffaaf8d9", + "evidence": "HTTP=200, code=200", + "checkedAt": "2026-08-08T03:25:36.487Z" + }, + { + "module": "supplemental", + "scenario": null, + "name": "file-service 状态字段完整且 readiness 语义明确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/files/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "e8abdc0b-24de-4f6e-b79c-baf341c0e6be, 51855fc1-09ff-4256-9b58-ec2254b2558c", + "traceId": "b578738cb7674ad9a7e93e35ffaaf8d9", + "evidence": "service=file-service, status=UP, readiness=UP", + "checkedAt": "2026-08-08T03:25:36.487Z" + }, + { + "module": "supplemental", + "scenario": null, + "name": "warehouse-service 状态响应使用统一成功体", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/warehouses/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "fc5e45b8-e8eb-48ea-b81c-06ebf2f2bf9b, 2b2d27e8-7678-47cc-9459-a137107db067", + "traceId": "be7deb2fa9c24630b2f0ddc787695e8b", + "evidence": "HTTP=200, code=200", + "checkedAt": "2026-08-08T03:25:36.521Z" + }, + { + "module": "supplemental", + "scenario": null, + "name": "warehouse-service 状态字段完整且 readiness 语义明确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/warehouses/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "fc5e45b8-e8eb-48ea-b81c-06ebf2f2bf9b, 2b2d27e8-7678-47cc-9459-a137107db067", + "traceId": "be7deb2fa9c24630b2f0ddc787695e8b", + "evidence": "service=warehouse-service, status=UP, readiness=UP", + "checkedAt": "2026-08-08T03:25:36.521Z" + }, + { + "module": "supplemental", + "scenario": null, + "name": "平台接口未携带令牌返回 401", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/status" + }, + "http": 401, + "code": "A0401", + "message": "未登录或令牌已失效", + "requestId": "f1373743-665", + "traceId": null, + "evidence": "HTTP=401, code=A0401", + "checkedAt": "2026-08-08T03:25:36.540Z" + }, + { + "module": "supplemental", + "scenario": null, + "name": "平台接口伪造令牌返回 401", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/status" + }, + "http": 401, + "code": "A0401", + "message": "未登录或令牌已失效", + "requestId": "c3c915cf-666", + "traceId": null, + "evidence": "HTTP=401, code=A0401", + "checkedAt": "2026-08-08T03:25:36.557Z" + }, + { + "module": "supplemental", + "scenario": null, + "name": "未认证请求不返回业务成功码", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/status" + }, + "http": 401, + "code": "A0401", + "message": "未登录或令牌已失效", + "requestId": "f1373743-667", + "traceId": null, + "evidence": "HTTP=401, code=A0401", + "checkedAt": "2026-08-08T03:25:36.572Z" + }, + { + "module": "supplemental", + "scenario": "master-data-readonly", + "name": "仓库分页查询", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/warehouse-admin?page=1&size=5&status=ACTIVE" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "607181c5-41bb-427a-a81b-2ab67bb37834, c1c811ae-61f3-4a19-86da-d30d01e14923", + "traceId": "eafb60897f524a4aa96e926e45583940", + "evidence": "path=/api/platform/v1/warehouse-admin?page=1&size=5&status=ACTIVE", + "checkedAt": "2026-08-08T03:25:36.602Z" + }, + { + "module": "supplemental", + "scenario": "master-data-readonly", + "name": "仓库分页结构与记录数组正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/warehouse-admin?page=1&size=5&status=ACTIVE" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "607181c5-41bb-427a-a81b-2ab67bb37834, c1c811ae-61f3-4a19-86da-d30d01e14923", + "traceId": "eafb60897f524a4aa96e926e45583940", + "evidence": "records=5, current=1, size=5", + "checkedAt": "2026-08-08T03:25:36.602Z" + }, + { + "module": "supplemental", + "scenario": "master-data-readonly", + "name": "仓库筛选分页查询", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/warehouse-admin?page=1&size=5&tenantId=0&warehouseType=FBA" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "98f25529-0cb2-41bc-9095-74eb4f753811, 8feda78e-0751-44f8-b1d7-64eb4ab99bca", + "traceId": "c083362d4acd4114a2a2941cffb58e15", + "evidence": "path=/api/platform/v1/warehouse-admin?page=1&size=5&tenantId=0&warehouseType=FBA", + "checkedAt": "2026-08-08T03:25:36.635Z" + }, + { + "module": "supplemental", + "scenario": "master-data-readonly", + "name": "仓库筛选分页结构与记录数组正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/warehouse-admin?page=1&size=5&tenantId=0&warehouseType=FBA" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "98f25529-0cb2-41bc-9095-74eb4f753811, 8feda78e-0751-44f8-b1d7-64eb4ab99bca", + "traceId": "c083362d4acd4114a2a2941cffb58e15", + "evidence": "records=5, current=1, size=5", + "checkedAt": "2026-08-08T03:25:36.635Z" + }, + { + "module": "supplemental", + "scenario": "master-data-readonly", + "name": "仓库非法状态安全失败", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/warehouse-admin?page=1&size=5&status=NOT_A_STATUS" + }, + "http": 200, + "code": "A0422", + "message": "status: must match \"ACTIVE|INACTIVE\"", + "requestId": "5aef2c6e-eb15-4c41-bef6-bfdad4261daf", + "traceId": "618914aff1824e7bb13ecf9fab6b7119", + "evidence": "HTTP=200, code=A0422", + "checkedAt": "2026-08-08T03:25:36.658Z" + }, + { + "module": "supplemental", + "scenario": "master-data-readonly", + "name": "仓库客户作用域安全失败", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/warehouse-admin?page=1&size=5&tenantId=10001" + }, + "http": 200, + "code": "A0400", + "message": "Platform resource scope must be 0 / 平台公共资源作用域必须为0", + "requestId": "2e9b7b5e-8e2c-4be7-a450-c197613bae25", + "traceId": "fb9da59139e64164850dd9e1c7763100", + "evidence": "HTTP=200, code=A0400", + "checkedAt": "2026-08-08T03:25:36.691Z" + }, + { + "module": "supplemental", + "scenario": "warehouse-resources", + "name": "库位分页查询", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/locations?page=1&size=5&tenantId=0" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "88c38d25-6ee1-4f18-8a53-0e54c0ff15e0, b71e2acd-b6d0-4dad-89af-cab310463139", + "traceId": "be7a979ff290482ea413188065becdb5", + "evidence": "path=/api/platform/v1/locations?page=1&size=5&tenantId=0", + "checkedAt": "2026-08-08T03:25:36.724Z" + }, + { + "module": "supplemental", + "scenario": "warehouse-resources", + "name": "库位分页结构与记录数组正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/locations?page=1&size=5&tenantId=0" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "88c38d25-6ee1-4f18-8a53-0e54c0ff15e0, b71e2acd-b6d0-4dad-89af-cab310463139", + "traceId": "be7a979ff290482ea413188065becdb5", + "evidence": "records=3, current=1, size=5", + "checkedAt": "2026-08-08T03:25:36.724Z" + }, + { + "module": "supplemental", + "scenario": "warehouse-resources", + "name": "托盘分页查询", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/pallets?page=1&size=5&tenantId=0" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "21d147bd-af43-4940-93ec-498136667752, 3ad8c2d3-6554-4e38-8001-91b041518201", + "traceId": "ee97129fea244114b25919631854f4fe", + "evidence": "path=/api/platform/v1/pallets?page=1&size=5&tenantId=0", + "checkedAt": "2026-08-08T03:25:36.750Z" + }, + { + "module": "supplemental", + "scenario": "warehouse-resources", + "name": "托盘分页结构与记录数组正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/pallets?page=1&size=5&tenantId=0" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "21d147bd-af43-4940-93ec-498136667752, 3ad8c2d3-6554-4e38-8001-91b041518201", + "traceId": "ee97129fea244114b25919631854f4fe", + "evidence": "records=3, current=1, size=5", + "checkedAt": "2026-08-08T03:25:36.750Z" + }, + { + "module": "supplemental", + "scenario": "warehouse-resources", + "name": "库位仓库筛选分页查询", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/locations?page=1&size=5&tenantId=0&warehouseId=193000000000000001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "b9d11413-fdd8-49ef-adb4-231734736252, 4f2927a0-9336-4118-b67e-5a2a0df2e85e", + "traceId": "e38235f41ad548cea8064ac574bb6c15", + "evidence": "path=/api/platform/v1/locations?page=1&size=5&tenantId=0&warehouseId=193000000000000001", + "checkedAt": "2026-08-08T03:25:36.786Z" + }, + { + "module": "supplemental", + "scenario": "warehouse-resources", + "name": "库位仓库筛选分页结构与记录数组正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/locations?page=1&size=5&tenantId=0&warehouseId=193000000000000001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "b9d11413-fdd8-49ef-adb4-231734736252, 4f2927a0-9336-4118-b67e-5a2a0df2e85e", + "traceId": "e38235f41ad548cea8064ac574bb6c15", + "evidence": "records=0, current=1, size=5", + "checkedAt": "2026-08-08T03:25:36.786Z" + }, + { + "module": "supplemental", + "scenario": "warehouse-resources", + "name": "托盘仓库筛选分页查询", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/pallets?page=1&size=5&tenantId=0&warehouseId=193000000000000001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "843f2c4b-6cec-4fc6-98d9-194b9ff69d0c, 44fd5c70-37d0-45dc-83d8-0efe10fcb28b", + "traceId": "f9afd388ccd0402cbec8a02bd629b161", + "evidence": "path=/api/platform/v1/pallets?page=1&size=5&tenantId=0&warehouseId=193000000000000001", + "checkedAt": "2026-08-08T03:25:36.816Z" + }, + { + "module": "supplemental", + "scenario": "warehouse-resources", + "name": "托盘仓库筛选分页结构与记录数组正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/pallets?page=1&size=5&tenantId=0&warehouseId=193000000000000001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "843f2c4b-6cec-4fc6-98d9-194b9ff69d0c, 44fd5c70-37d0-45dc-83d8-0efe10fcb28b", + "traceId": "f9afd388ccd0402cbec8a02bd629b161", + "evidence": "records=0, current=1, size=5", + "checkedAt": "2026-08-08T03:25:36.816Z" + }, + { + "module": "supplemental", + "scenario": "warehouse-resources", + "name": "库位客户作用域安全失败", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/locations?page=1&size=5&tenantId=10001" + }, + "http": 200, + "code": "A0400", + "message": "平台公共资源作用域必须为0", + "requestId": "48aa9361-8aab-43b2-9ac2-7368ca88fb66", + "traceId": "f714f494202f4992b2cecead0be7318a", + "evidence": "HTTP=200, code=A0400", + "checkedAt": "2026-08-08T03:25:36.843Z" + }, + { + "module": "supplemental", + "scenario": "warehouse-resources", + "name": "托盘客户作用域安全失败", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/pallets?page=1&size=5&tenantId=10001" + }, + "http": 200, + "code": "A0400", + "message": "平台公共资源作用域必须为0", + "requestId": "a717abc2-984b-4770-ae42-089e578d47cc", + "traceId": "502c8204493b4df890262f7a8b290af7", + "evidence": "HTTP=200, code=A0400", + "checkedAt": "2026-08-08T03:25:36.875Z" + }, + { + "module": "supplemental", + "scenario": "warehouse-resources", + "name": "库位非法状态安全失败", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/locations?page=1&size=5&tenantId=0&status=ALLOCATED" + }, + "http": 200, + "code": "A0422", + "message": "status: must match \"^(AVAILABLE|RESERVED|OCCUPIED|DISABLED)$\"", + "requestId": "92b76276-a0eb-4961-a0fc-5fa85fa758c8", + "traceId": "ca4259650bcf4fa99cd3a4a73dfb856f", + "evidence": "HTTP=200, code=A0422", + "checkedAt": "2026-08-08T03:25:36.905Z" + }, + { + "module": "supplemental", + "scenario": "warehouse-resources", + "name": "库位过期版本/不存在资源不泄露或误修改数据", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/locations/999999999999?tenantId=0&warehouseId=999999999999" + }, + "http": 200, + "code": "A0404", + "message": "库位不存在或超出当前企业仓库数据范围", + "requestId": "c2ed8dd6-488c-48b7-b203-66b5d9e6dc08", + "traceId": "1d2c2eca876c4c2db1aa6ddbe99ee7e2", + "evidence": "HTTP=200, code=A0404", + "checkedAt": "2026-08-08T03:25:36.939Z" + }, + { + "module": "supplemental", + "scenario": "warehouse-resources", + "name": "托盘占用资源保护边界不泄露或误修改数据", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/pallets/999999999999?tenantId=0&warehouseId=999999999999" + }, + "http": 200, + "code": "A0404", + "message": "托盘不存在或不属于当前租户和仓库", + "requestId": "dfac4841-cf1e-46a1-967a-bc104a47e6e4", + "traceId": "7b578de78da842cfb900e35a90ba3ff6", + "evidence": "HTTP=200, code=A0404", + "checkedAt": "2026-08-08T03:25:36.969Z" + }, + { + "module": "supplemental", + "scenario": "shared-master-data", + "name": "快递公司分页查询", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/express-companies?page=1&size=5&tenantId=0&status=ACTIVE" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "74508bb3-52b9-4ff1-b9c0-56fdcea19e36, dd63c2ae-3c1d-4cbf-91a7-e3f7ca59c7e2", + "traceId": "5c90e444dcb9494f834000ee069c2546", + "evidence": "path=/api/platform/v1/express-companies?page=1&size=5&tenantId=0&status=ACTIVE", + "checkedAt": "2026-08-08T03:25:36.995Z" + }, + { + "module": "supplemental", + "scenario": "shared-master-data", + "name": "快递公司分页结构与记录数组正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/express-companies?page=1&size=5&tenantId=0&status=ACTIVE" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "74508bb3-52b9-4ff1-b9c0-56fdcea19e36, dd63c2ae-3c1d-4cbf-91a7-e3f7ca59c7e2", + "traceId": "5c90e444dcb9494f834000ee069c2546", + "evidence": "records=4, current=1, size=5", + "checkedAt": "2026-08-08T03:25:36.995Z" + }, + { + "module": "supplemental", + "scenario": "shared-master-data", + "name": "快递公司停用筛选分页查询", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/express-companies?page=1&size=5&tenantId=0&status=INACTIVE" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "b1e005d7-0519-41ba-b123-018c6a732a0b, 301aa9c4-7033-44c4-9fa3-3ef29362e15c", + "traceId": "37f4886da53a4d91a6b7c0ebd3dc4da1", + "evidence": "path=/api/platform/v1/express-companies?page=1&size=5&tenantId=0&status=INACTIVE", + "checkedAt": "2026-08-08T03:25:37.036Z" + }, + { + "module": "supplemental", + "scenario": "shared-master-data", + "name": "快递公司停用筛选分页结构与记录数组正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/express-companies?page=1&size=5&tenantId=0&status=INACTIVE" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "b1e005d7-0519-41ba-b123-018c6a732a0b, 301aa9c4-7033-44c4-9fa3-3ef29362e15c", + "traceId": "37f4886da53a4d91a6b7c0ebd3dc4da1", + "evidence": "records=4, current=1, size=5", + "checkedAt": "2026-08-08T03:25:37.036Z" + }, + { + "module": "supplemental", + "scenario": "shared-master-data", + "name": "快递公司状态枚举过滤不混入其他状态", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/express-companies?page=1&size=5&tenantId=0&status=INACTIVE" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "b1e005d7-0519-41ba-b123-018c6a732a0b, 301aa9c4-7033-44c4-9fa3-3ef29362e15c", + "traceId": "37f4886da53a4d91a6b7c0ebd3dc4da1", + "evidence": "records=4", + "checkedAt": "2026-08-08T03:25:37.036Z" + }, + { + "module": "supplemental", + "scenario": "shared-master-data", + "name": "快递公司无效筛选参数安全失败", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/express-companies?page=1&size=5&tenantId=0&status=UNKNOWN" + }, + "http": 200, + "code": "A0422", + "message": "status: must match \"^(ACTIVE|INACTIVE)$\"", + "requestId": "dd1c1747-77d2-425a-860d-e812a9942a2b", + "traceId": "d631ed3b3f1c4c428638b77fc332f458", + "evidence": "HTTP=200, code=A0422", + "checkedAt": "2026-08-08T03:25:37.063Z" + }, + { + "module": "supplemental", + "scenario": "shared-master-data", + "name": "往来单位分页查询", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/partners?page=1&size=5&tenantId=0&status=ACTIVE" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "77805f81-9577-4b3c-9ba2-02c0b4b1eb67, fccf7259-88b4-478f-9619-845109d2e8f1", + "traceId": "ddbe761bf7b94eee969fa8af8afa55d3", + "evidence": "path=/api/platform/v1/partners?page=1&size=5&tenantId=0&status=ACTIVE", + "checkedAt": "2026-08-08T03:25:37.099Z" + }, + { + "module": "supplemental", + "scenario": "shared-master-data", + "name": "往来单位分页结构与记录数组正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/partners?page=1&size=5&tenantId=0&status=ACTIVE" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "77805f81-9577-4b3c-9ba2-02c0b4b1eb67, fccf7259-88b4-478f-9619-845109d2e8f1", + "traceId": "ddbe761bf7b94eee969fa8af8afa55d3", + "evidence": "records=5, current=1, size=5", + "checkedAt": "2026-08-08T03:25:37.099Z" + }, + { + "module": "supplemental", + "scenario": "shared-master-data", + "name": "往来单位停用筛选分页查询", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/partners?page=1&size=5&tenantId=0&status=INACTIVE" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "3c381c31-1f7a-4629-84d1-3888655a980d, de722a9e-2eae-4e05-a09a-a8b383fdcc68", + "traceId": "20e47934d8af4427a0ce2bc604e74b1b", + "evidence": "path=/api/platform/v1/partners?page=1&size=5&tenantId=0&status=INACTIVE", + "checkedAt": "2026-08-08T03:25:37.142Z" + }, + { + "module": "supplemental", + "scenario": "shared-master-data", + "name": "往来单位停用筛选分页结构与记录数组正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/partners?page=1&size=5&tenantId=0&status=INACTIVE" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "3c381c31-1f7a-4629-84d1-3888655a980d, de722a9e-2eae-4e05-a09a-a8b383fdcc68", + "traceId": "20e47934d8af4427a0ce2bc604e74b1b", + "evidence": "records=3, current=1, size=5", + "checkedAt": "2026-08-08T03:25:37.142Z" + }, + { + "module": "supplemental", + "scenario": "shared-master-data", + "name": "往来单位状态枚举过滤不混入其他状态", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/partners?page=1&size=5&tenantId=0&status=INACTIVE" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "3c381c31-1f7a-4629-84d1-3888655a980d, de722a9e-2eae-4e05-a09a-a8b383fdcc68", + "traceId": "20e47934d8af4427a0ce2bc604e74b1b", + "evidence": "records=3", + "checkedAt": "2026-08-08T03:25:37.142Z" + }, + { + "module": "supplemental", + "scenario": "shared-master-data", + "name": "往来单位无效筛选参数安全失败", + "passed": false, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/partners?page=1&size=5&tenantId=0&types=UNKNOWN_TYPE" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "db38f335-fb4e-4384-af6c-ca8c95dc750f, c679581d-5503-4b96-b2a7-94dd69fd1d24", + "traceId": "e971f86f945c42128e07d7693c3d38b4", + "evidence": "HTTP=200, code=200", + "checkedAt": "2026-08-08T03:25:37.176Z" + }, + { + "module": "supplemental", + "scenario": "shared-master-data", + "name": "仓库导入模板为 XLSX 且不记录二进制", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/warehouse-admin/import-template" + }, + "http": 200, + "code": null, + "message": "3852 bytes (application/vnd.openxmlformats-officedocument.spreadsheetml.sheet)", + "requestId": "d95a7d28-bd7a-4e7f-b045-bc2125f30999, 0eaa1473-e60f-4cc0-9f39-9721b8e39835", + "traceId": "55626c3e4b5f44cc979f18f9a4a05176", + "evidence": "HTTP=200, bytes=3852, contentType=application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + "checkedAt": "2026-08-08T03:25:37.244Z" + }, + { + "module": "supplemental", + "scenario": "shared-master-data", + "name": "快递公司导入模板为 XLSX 且不记录二进制", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/express-companies/import-template" + }, + "http": 200, + "code": null, + "message": "3691 bytes (application/vnd.openxmlformats-officedocument.spreadsheetml.sheet)", + "requestId": "ced5859d-7df3-408f-8325-b439b9588d44, 6a602d51-cf2f-47e8-9b3b-ac3ab07121ab", + "traceId": "513b28a2427c473b900fab2d197e36ab", + "evidence": "HTTP=200, bytes=3691, contentType=application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + "checkedAt": "2026-08-08T03:25:37.298Z" + }, + { + "module": "supplemental", + "scenario": "shared-master-data", + "name": "往来单位导入模板为 XLSX 且不记录二进制", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/partners/import-template" + }, + "http": 200, + "code": null, + "message": "3829 bytes (application/vnd.openxmlformats-officedocument.spreadsheetml.sheet)", + "requestId": "2a1e72a8-a674-450e-94d4-96075b0c6ce2, e7a31eee-1291-4353-9429-46233e98fe05", + "traceId": "e1d05ac7bbfa428ca5de1e0bfff08a77", + "evidence": "HTTP=200, bytes=3829, contentType=application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + "checkedAt": "2026-08-08T03:25:37.357Z" + }, + { + "module": "supplemental", + "scenario": "price-book-readonly", + "name": "船期价格表 PENDING_CONFIRMATION 状态过滤", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/fba-pricing/carrier-rates/price-books?status=PENDING_CONFIRMATION" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "971c9582-983d-490a-bea8-da9fbde8c17d, 2ca55d43-b3a0-4fde-9876-52c33af594e1", + "traceId": "2dd9ea167d1e4a279abac6b9fe769ee2", + "evidence": "count=1", + "checkedAt": "2026-08-08T03:25:37.412Z" + }, + { + "module": "supplemental", + "scenario": "price-book-readonly", + "name": "船期价格表 PENDING_CONFIRMATION 结果状态一致", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/fba-pricing/carrier-rates/price-books?status=PENDING_CONFIRMATION" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "971c9582-983d-490a-bea8-da9fbde8c17d, 2ca55d43-b3a0-4fde-9876-52c33af594e1", + "traceId": "2dd9ea167d1e4a279abac6b9fe769ee2", + "evidence": "count=1", + "checkedAt": "2026-08-08T03:25:37.412Z" + }, + { + "module": "supplemental", + "scenario": "price-book-readonly", + "name": "船期价格表 ACTIVE 状态过滤", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/fba-pricing/carrier-rates/price-books?status=ACTIVE" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "6e42e278-dd4f-4800-ba1d-928451e79de8, 1e19e474-4186-41c0-8b10-139e55d859c9", + "traceId": "27541074399e42538725f964318addfd", + "evidence": "count=1", + "checkedAt": "2026-08-08T03:25:37.442Z" + }, + { + "module": "supplemental", + "scenario": "price-book-readonly", + "name": "船期价格表 ACTIVE 结果状态一致", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/fba-pricing/carrier-rates/price-books?status=ACTIVE" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "6e42e278-dd4f-4800-ba1d-928451e79de8, 1e19e474-4186-41c0-8b10-139e55d859c9", + "traceId": "27541074399e42538725f964318addfd", + "evidence": "count=1", + "checkedAt": "2026-08-08T03:25:37.442Z" + }, + { + "module": "supplemental", + "scenario": "price-book-readonly", + "name": "船期价格表 SUPERSEDED 状态过滤", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/fba-pricing/carrier-rates/price-books?status=SUPERSEDED" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "6391ae38-804f-43a8-b922-03e0751ecde4, f94da3fb-3b63-4de0-8b4f-3ed30130b266", + "traceId": "5541eff468af4dc5b4390d7d5a95cf17", + "evidence": "count=4", + "checkedAt": "2026-08-08T03:25:37.472Z" + }, + { + "module": "supplemental", + "scenario": "price-book-readonly", + "name": "船期价格表 SUPERSEDED 结果状态一致", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/fba-pricing/carrier-rates/price-books?status=SUPERSEDED" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "6391ae38-804f-43a8-b922-03e0751ecde4, f94da3fb-3b63-4de0-8b4f-3ed30130b266", + "traceId": "5541eff468af4dc5b4390d7d5a95cf17", + "evidence": "count=4", + "checkedAt": "2026-08-08T03:25:37.472Z" + }, + { + "module": "supplemental", + "scenario": "price-book-readonly", + "name": "读取现有生效价格版本用于下载安全检查", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/fba-pricing/carrier-rates/price-books?status=ACTIVE" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "a34d9d9b-4a36-4a11-8b26-df80fefbb94e, 5d2a6345-7621-4d0d-8ed5-e3030fa2509f", + "traceId": "d7fdcf654fb1423abe35e57c5d8cd7d1", + "evidence": "", + "checkedAt": "2026-08-08T03:25:37.503Z" + }, + { + "module": "supplemental", + "scenario": "price-book-readonly", + "name": "现有生效价格源文件下载为 XLSX", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/fba-pricing/carrier-rates/price-books/2085910455296503809/source" + }, + "http": 200, + "code": null, + "message": "1343413 bytes (application/vnd.openxmlformats-officedocument.spreadsheetml.sheet)", + "requestId": "90397ca9-ceb9-4aad-a697-7e9127c3ce8b, 7b63e12d-b612-47fb-831a-b3c5c4a982f2, 691fd7d0-22ca-40e8-ade0-f02ffe2572b1", + "traceId": "a3967be961484ac4a6bea77eb0e0b84d, 7bcd0c92be4d497e9d4544cf4861c2f4", + "evidence": "versionId=2085910455296503809, bytes=1343413, contentType=application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + "checkedAt": "2026-08-08T03:25:37.718Z" + }, + { + "module": "supplemental", + "scenario": "download-readonly", + "name": "下载中心 PENDING 状态分页", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/files/export-tasks?page=1&size=5&status=PENDING" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "f424cc17-60cd-4a06-90d0-b79ce16ea053, 5c61c511-e4a0-4eda-8b09-d3cd98e1c8f5", + "traceId": "d5802754ba184d8aac43d20c6fc9c7a6", + "evidence": "", + "checkedAt": "2026-08-08T03:25:37.748Z" + }, + { + "module": "supplemental", + "scenario": "download-readonly", + "name": "下载中心 PENDING 过滤结果状态一致", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/files/export-tasks?page=1&size=5&status=PENDING" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "f424cc17-60cd-4a06-90d0-b79ce16ea053, 5c61c511-e4a0-4eda-8b09-d3cd98e1c8f5", + "traceId": "d5802754ba184d8aac43d20c6fc9c7a6", + "evidence": "records=0", + "checkedAt": "2026-08-08T03:25:37.748Z" + }, + { + "module": "supplemental", + "scenario": "download-readonly", + "name": "下载中心 RUNNING 状态分页", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/files/export-tasks?page=1&size=5&status=RUNNING" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "72aec517-0271-4436-9eef-b6dbf792332e, d7a42d79-1b62-42fc-aff9-e2e71d3b758b", + "traceId": "da1e015379a84142aa7d5de9e5e78554", + "evidence": "", + "checkedAt": "2026-08-08T03:25:37.777Z" + }, + { + "module": "supplemental", + "scenario": "download-readonly", + "name": "下载中心 RUNNING 过滤结果状态一致", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/files/export-tasks?page=1&size=5&status=RUNNING" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "72aec517-0271-4436-9eef-b6dbf792332e, d7a42d79-1b62-42fc-aff9-e2e71d3b758b", + "traceId": "da1e015379a84142aa7d5de9e5e78554", + "evidence": "records=0", + "checkedAt": "2026-08-08T03:25:37.777Z" + }, + { + "module": "supplemental", + "scenario": "download-readonly", + "name": "下载中心 SUCCEEDED 状态分页", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/files/export-tasks?page=1&size=5&status=SUCCEEDED" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "91384b2b-47e0-4d16-aa80-22388cec9a99, 4cc7a8b0-7427-4bce-b4ff-4c7e0ef3755b", + "traceId": "1d749b4ef12a45d680c5e66dcf2ebef5", + "evidence": "", + "checkedAt": "2026-08-08T03:25:37.813Z" + }, + { + "module": "supplemental", + "scenario": "download-readonly", + "name": "下载中心 SUCCEEDED 过滤结果状态一致", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/files/export-tasks?page=1&size=5&status=SUCCEEDED" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "91384b2b-47e0-4d16-aa80-22388cec9a99, 4cc7a8b0-7427-4bce-b4ff-4c7e0ef3755b", + "traceId": "1d749b4ef12a45d680c5e66dcf2ebef5", + "evidence": "records=5", + "checkedAt": "2026-08-08T03:25:37.813Z" + }, + { + "module": "supplemental", + "scenario": "download-readonly", + "name": "下载中心 FAILED 状态分页", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/files/export-tasks?page=1&size=5&status=FAILED" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "90139c85-e4a0-4f1f-a49a-3be39cb3488f, cb955f19-4c6e-4410-8a07-3c1eb03c2dd5", + "traceId": "add37c49cac7488d8ae9f67c5b21e74d", + "evidence": "", + "checkedAt": "2026-08-08T03:25:37.868Z" + }, + { + "module": "supplemental", + "scenario": "download-readonly", + "name": "下载中心 FAILED 过滤结果状态一致", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/files/export-tasks?page=1&size=5&status=FAILED" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "90139c85-e4a0-4f1f-a49a-3be39cb3488f, cb955f19-4c6e-4410-8a07-3c1eb03c2dd5", + "traceId": "add37c49cac7488d8ae9f67c5b21e74d", + "evidence": "records=0", + "checkedAt": "2026-08-08T03:25:37.868Z" + }, + { + "module": "supplemental", + "scenario": "download-readonly", + "name": "下载中心 EXPIRED 状态分页", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/files/export-tasks?page=1&size=5&status=EXPIRED" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "c3b76317-bb6e-4bf1-ae6e-ad1b7f36d2ec, 6b943a80-15f8-4e9a-beab-a132d7ec4469", + "traceId": "207725910baa4c07ad1290e2dbc28472", + "evidence": "", + "checkedAt": "2026-08-08T03:25:37.915Z" + }, + { + "module": "supplemental", + "scenario": "download-readonly", + "name": "下载中心 EXPIRED 过滤结果状态一致", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/files/export-tasks?page=1&size=5&status=EXPIRED" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "c3b76317-bb6e-4bf1-ae6e-ad1b7f36d2ec, 6b943a80-15f8-4e9a-beab-a132d7ec4469", + "traceId": "207725910baa4c07ad1290e2dbc28472", + "evidence": "records=0", + "checkedAt": "2026-08-08T03:25:37.915Z" + }, + { + "module": "supplemental", + "scenario": "download-readonly", + "name": "不存在下载任务详情安全失败", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/files/export-tasks/999999999999" + }, + "http": 200, + "code": "A0404", + "message": "导出任务不存在", + "requestId": "1bd92d1b-be48-4864-902d-ba99723d4c26", + "traceId": "10179535796b4902a0af93e73fb047f5", + "evidence": "HTTP=200, code=A0404", + "checkedAt": "2026-08-08T03:25:37.954Z" + }, + { + "module": "supplemental", + "scenario": "download-readonly", + "name": "不存在下载任务文件安全失败", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/files/export-tasks/999999999999/download" + }, + "http": 200, + "code": "A0404", + "message": "导出任务不存在", + "requestId": "b06142d4-6c53-4717-ac82-a20cb0b17c53", + "traceId": "6a76344f3f9141c0920f546ede17cf83", + "evidence": "HTTP=200, code=A0404", + "checkedAt": "2026-08-08T03:25:37.988Z" + }, + { + "module": "supplemental", + "scenario": "download-readonly", + "name": "未授权下载请求被拒绝", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/files/export-tasks/999999999999/download" + }, + "http": 401, + "code": "A0401", + "message": "未登录或令牌已失效", + "requestId": "c3c915cf-702", + "traceId": null, + "evidence": "HTTP=401, code=A0401", + "checkedAt": "2026-08-08T03:25:38.017Z" + }, + { + "module": "supplemental", + "scenario": "iam-readonly", + "name": "平台用户只读列表", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/users?page=1&size=5" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "34baef48-5af0-48db-b4e7-700d677cbd8f, 92f6e37c-6da4-4597-87dc-92074e5a7818", + "traceId": "802c2952ab104e8c9b3a0372d4583613", + "evidence": "", + "checkedAt": "2026-08-08T03:25:38.106Z" + }, + { + "module": "supplemental", + "scenario": "iam-readonly", + "name": "平台用户列表结构正确且包含内置保护标识", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/users?page=1&size=5" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "34baef48-5af0-48db-b4e7-700d677cbd8f, 92f6e37c-6da4-4597-87dc-92074e5a7818", + "traceId": "802c2952ab104e8c9b3a0372d4583613", + "evidence": "records=5, builtInField=protectedAccount", + "checkedAt": "2026-08-08T03:25:38.106Z" + }, + { + "module": "supplemental", + "scenario": "iam-readonly", + "name": "平台角色只读列表", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/roles" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "369727b8-9c58-48c0-a4d5-cf1563e7527d, 4d85b2b9-2f6e-43b7-b7b7-c86e7be4c40d", + "traceId": "d52602c0a8114bdb91bfad5fd190cfac", + "evidence": "", + "checkedAt": "2026-08-08T03:25:38.168Z" + }, + { + "module": "supplemental", + "scenario": "iam-readonly", + "name": "平台角色列表结构正确且包含内置保护标识", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/roles" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "369727b8-9c58-48c0-a4d5-cf1563e7527d, 4d85b2b9-2f6e-43b7-b7b7-c86e7be4c40d", + "traceId": "d52602c0a8114bdb91bfad5fd190cfac", + "evidence": "records=9, builtInField=roleType", + "checkedAt": "2026-08-08T03:25:38.168Z" + }, + { + "module": "supplemental", + "scenario": "iam-readonly", + "name": "菜单权限只读列表", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/permissions" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "3e1c0736-db52-4a59-9035-6819650305ed, 2265ddca-3c5a-4f05-8cf7-73e720eec4ec", + "traceId": "336964ec41744a64add20fa6f1736ac5", + "evidence": "", + "checkedAt": "2026-08-08T03:25:38.229Z" + }, + { + "module": "supplemental", + "scenario": "iam-readonly", + "name": "菜单权限列表结构正确且包含内置保护标识", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/permissions" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "3e1c0736-db52-4a59-9035-6819650305ed, 2265ddca-3c5a-4f05-8cf7-73e720eec4ec", + "traceId": "336964ec41744a64add20fa6f1736ac5", + "evidence": "records=120, builtInField=builtIn", + "checkedAt": "2026-08-08T03:25:38.229Z" + }, + { + "module": "supplemental", + "scenario": "iam-readonly", + "name": "角色列表伪造令牌拒绝访问", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/roles" + }, + "http": 401, + "code": "A0401", + "message": "未登录或令牌已失效", + "requestId": "c3c915cf-706", + "traceId": null, + "evidence": "HTTP=401, code=A0401", + "checkedAt": "2026-08-08T03:25:38.257Z" + }, + { + "module": "supplemental", + "scenario": "iam-readonly", + "name": "菜单权限未携带令牌拒绝访问", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/permissions" + }, + "http": 401, + "code": "A0401", + "message": "未登录或令牌已失效", + "requestId": "f1373743-707", + "traceId": null, + "evidence": "HTTP=401, code=A0401", + "checkedAt": "2026-08-08T03:25:38.294Z" + } + ] +} diff --git a/reports/admin-supplemental.json b/reports/admin-supplemental.json new file mode 100644 index 000000000..d28e90701 --- /dev/null +++ b/reports/admin-supplemental.json @@ -0,0 +1,257 @@ +{ + "reportName": "后台管理测试环境 HTTP API 验收", + "marker": "ADMIN-API-20260808030949923", + "gateway": "http://8.163.30.128:9000", + "generatedAt": "2026-08-08T03:09:50.497Z", + "startedAt": "2026-08-08T03:09:49.923Z", + "success": true, + "fatal": null, + "summary": { + "total": 12, + "passed": 12, + "failed": 0 + }, + "modules": [ + { + "name": "supplemental", + "startedAt": "2026-08-08T03:09:50.302Z", + "finishedAt": "2026-08-08T03:09:50.497Z", + "success": true, + "passed": 11, + "failed": 0, + "fatal": null + } + ], + "scenarios": [], + "deploymentBlockers": [], + "createdResources": {}, + "excluded": [ + { + "scope": "dashboard", + "reason": "首页为静态演示数据,不调用后端 API" + }, + { + "scope": "hidden-prototypes", + "reason": "隐藏原型页面尚无已确认后端契约" + } + ], + "securityNote": "报告不保存登录密码、Access Token、Refresh Token、图片二进制或 OCR 原文全文。", + "steps": [ + { + "module": "authentication", + "scenario": null, + "name": "平台管理员登录", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/auth/login" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "1f1e9c3b-11bb-4931-a6dd-fa576b7c95b5, abee7733-84b8-457d-b55f-91b7aa54f42d", + "traceId": "b0a64f960ec54ff89eb325abb5cc1c8d", + "evidence": "", + "checkedAt": "2026-08-08T03:09:50.301Z" + }, + { + "module": "supplemental", + "scenario": null, + "name": "order-service 状态响应使用统一成功体", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "a5f466bf-ae64-4aa5-95ea-8d1968682163, dc93264c-bc52-42c6-a7e1-3dd7adff8559", + "traceId": "0c23c4de34694a139a2c895073ee0934", + "evidence": "HTTP=200, code=200", + "checkedAt": "2026-08-08T03:09:50.344Z" + }, + { + "module": "supplemental", + "scenario": null, + "name": "order-service 状态字段完整且 readiness 语义明确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "a5f466bf-ae64-4aa5-95ea-8d1968682163, dc93264c-bc52-42c6-a7e1-3dd7adff8559", + "traceId": "0c23c4de34694a139a2c895073ee0934", + "evidence": "service=order-service, status=UP, readiness=UP", + "checkedAt": "2026-08-08T03:09:50.344Z" + }, + { + "module": "supplemental", + "scenario": null, + "name": "firstleg-service 状态响应使用统一成功体", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "04765fab-c4bf-4c63-af3d-2a7d6a3f955e, 89a82465-cb1e-484d-b78f-5844bb9d8f81", + "traceId": "f6e4f3759e6841769a8e905154d5f5f8", + "evidence": "HTTP=200, code=200", + "checkedAt": "2026-08-08T03:09:50.371Z" + }, + { + "module": "supplemental", + "scenario": null, + "name": "firstleg-service 状态字段完整且 readiness 语义明确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "04765fab-c4bf-4c63-af3d-2a7d6a3f955e, 89a82465-cb1e-484d-b78f-5844bb9d8f81", + "traceId": "f6e4f3759e6841769a8e905154d5f5f8", + "evidence": "service=firstleg-service, status=UP, readiness=UP", + "checkedAt": "2026-08-08T03:09:50.371Z" + }, + { + "module": "supplemental", + "scenario": null, + "name": "file-service 状态响应使用统一成功体", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/files/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "c14fe096-d5ae-447f-96ee-37802b84b58a, 439bfbc2-6441-4087-9962-53afff6c1f5f", + "traceId": "1fca0eae5e20493582ab64ce34c30181", + "evidence": "HTTP=200, code=200", + "checkedAt": "2026-08-08T03:09:50.400Z" + }, + { + "module": "supplemental", + "scenario": null, + "name": "file-service 状态字段完整且 readiness 语义明确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/files/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "c14fe096-d5ae-447f-96ee-37802b84b58a, 439bfbc2-6441-4087-9962-53afff6c1f5f", + "traceId": "1fca0eae5e20493582ab64ce34c30181", + "evidence": "service=file-service, status=UP, readiness=UP", + "checkedAt": "2026-08-08T03:09:50.400Z" + }, + { + "module": "supplemental", + "scenario": null, + "name": "warehouse-service 状态响应使用统一成功体", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/warehouses/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "b20712d9-2747-412b-9b98-f16e68e09b6a, 4206f98c-81e1-4bfc-b5ba-d679e825e211", + "traceId": "1900c4aea06346d49219bcabbe1647de", + "evidence": "HTTP=200, code=200", + "checkedAt": "2026-08-08T03:09:50.439Z" + }, + { + "module": "supplemental", + "scenario": null, + "name": "warehouse-service 状态字段完整且 readiness 语义明确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/warehouses/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "b20712d9-2747-412b-9b98-f16e68e09b6a, 4206f98c-81e1-4bfc-b5ba-d679e825e211", + "traceId": "1900c4aea06346d49219bcabbe1647de", + "evidence": "service=warehouse-service, status=UP, readiness=UP", + "checkedAt": "2026-08-08T03:09:50.439Z" + }, + { + "module": "supplemental", + "scenario": null, + "name": "平台接口未携带令牌返回 401", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/status" + }, + "http": 401, + "code": "A0401", + "message": "未登录或令牌已失效", + "requestId": "feab15f3-239", + "traceId": null, + "evidence": "HTTP=401, code=A0401", + "checkedAt": "2026-08-08T03:09:50.468Z" + }, + { + "module": "supplemental", + "scenario": null, + "name": "平台接口伪造令牌返回 401", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/status" + }, + "http": 401, + "code": "A0401", + "message": "未登录或令牌已失效", + "requestId": "5a78b8b2-240", + "traceId": null, + "evidence": "HTTP=401, code=A0401", + "checkedAt": "2026-08-08T03:09:50.481Z" + }, + { + "module": "supplemental", + "scenario": null, + "name": "未认证请求不返回业务成功码", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/status" + }, + "http": 401, + "code": "A0401", + "message": "未登录或令牌已失效", + "requestId": "feab15f3-241", + "traceId": null, + "evidence": "HTTP=401, code=A0401", + "checkedAt": "2026-08-08T03:09:50.497Z" + } + ] +} diff --git a/reports/admin-test-env-acceptance-20260808032703.json b/reports/admin-test-env-acceptance-20260808032703.json new file mode 100644 index 000000000..c63253daf --- /dev/null +++ b/reports/admin-test-env-acceptance-20260808032703.json @@ -0,0 +1,6399 @@ +{ + "reportName": "后台管理测试环境 HTTP API 验收", + "marker": "ADMIN-API-20260808032703277", + "gateway": "http://8.163.30.128:9000", + "generatedAt": "2026-08-08T03:27:32.358Z", + "startedAt": "2026-08-08T03:27:03.277Z", + "success": false, + "fatal": null, + "summary": { + "total": 341, + "passed": 337, + "failed": 4 + }, + "modules": [ + { + "name": "customers", + "startedAt": "2026-08-08T03:27:03.650Z", + "finishedAt": "2026-08-08T03:27:04.785Z", + "success": true, + "passed": 38, + "failed": 0, + "fatal": null + }, + { + "name": "system", + "startedAt": "2026-08-08T03:27:04.787Z", + "finishedAt": "2026-08-08T03:27:07.298Z", + "success": true, + "passed": 41, + "failed": 0, + "fatal": null + }, + { + "name": "master-data", + "startedAt": "2026-08-08T03:27:07.299Z", + "finishedAt": "2026-08-08T03:27:08.745Z", + "success": true, + "passed": 42, + "failed": 0, + "fatal": null + }, + { + "name": "orders", + "startedAt": "2026-08-08T03:27:08.746Z", + "finishedAt": "2026-08-08T03:27:11.366Z", + "success": true, + "passed": 49, + "failed": 0, + "fatal": null + }, + { + "name": "pricing", + "startedAt": "2026-08-08T03:27:11.367Z", + "finishedAt": "2026-08-08T03:27:17.807Z", + "success": true, + "passed": 26, + "failed": 0, + "fatal": null + }, + { + "name": "downloads", + "startedAt": "2026-08-08T03:27:17.808Z", + "finishedAt": "2026-08-08T03:27:24.161Z", + "success": true, + "passed": 8, + "failed": 0, + "fatal": null + }, + { + "name": "inbound-weight-ocr", + "startedAt": "2026-08-08T03:27:24.163Z", + "finishedAt": "2026-08-08T03:27:29.857Z", + "success": true, + "passed": 52, + "failed": 0, + "fatal": null + }, + { + "name": "inbound-measurement", + "startedAt": "2026-08-08T03:27:29.858Z", + "finishedAt": "2026-08-08T03:27:30.794Z", + "success": false, + "passed": 7, + "failed": 3, + "fatal": null + }, + { + "name": "supplemental", + "startedAt": "2026-08-08T03:27:30.795Z", + "finishedAt": "2026-08-08T03:27:32.358Z", + "success": false, + "passed": 73, + "failed": 1, + "fatal": null + } + ], + "scenarios": [ + { + "name": "customer-dimension-rules", + "module": "customers", + "success": true, + "deploymentBlocked": false, + "passed": 13, + "failed": 0 + }, + { + "name": "price-book-lifecycle", + "module": "pricing", + "success": true, + "deploymentBlocked": false, + "passed": 26, + "failed": 0 + }, + { + "name": "weight-image-recognition-and-confirmation", + "module": "inbound-weight-ocr", + "success": true, + "deploymentBlocked": false, + "passed": 52, + "failed": 0 + }, + { + "name": "mojia-carton-measurement", + "module": "inbound-measurement", + "success": false, + "deploymentBlocked": true, + "passed": 7, + "failed": 3 + } + ], + "deploymentBlockers": [ + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "模拟墨家首次扫描单箱", + "evidence": "boxCode=RK-2085930785815724033#4-1, machineNo=MJ-ADMIN-E2E-01", + "code": "A0409", + "requestId": "e7a8aef5-5849-4d0c-9bdf-a868abf863fa", + "traceId": "8fb7b145a3c7497e89b3f72986bbdf26" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "首次扫描新增一条且默认代表1箱", + "evidence": "created=undefined, confirmedPackageCount=missing", + "code": "A0409", + "requestId": "e7a8aef5-5849-4d0c-9bdf-a868abf863fa", + "traceId": "8fb7b145a3c7497e89b3f72986bbdf26" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "重复打印及指定箱补打后原箱码仍可解析", + "evidence": "boxCodeStable=false, resolvedInboundId=2085930789957578753", + "code": "A0409", + "requestId": "e7a8aef5-5849-4d0c-9bdf-a868abf863fa", + "traceId": "8fb7b145a3c7497e89b3f72986bbdf26" + } + ], + "createdResources": { + "customer": { + "tenantId": "2085930761823309826", + "marker": "ADMIN-API-20260808032703277", + "contactPhone": "16159623650" + }, + "systemPermission": { + "id": "2085930766504153089", + "code": "platform:acceptance:808032703277" + }, + "systemRole": { + "id": "2085930767196213250", + "code": "ADMIN_ACCEPT_808032703277", + "finalStatus": "DISABLED", + "retainedBecauseAssigned": true + }, + "systemUser": { + "membershipId": "2085930768337063939", + "username": "admin_accept_808032703277", + "finalStatus": "DISABLED" + }, + "warehouse": { + "id": "2085930777423429633", + "code": "AW808032703277", + "finalStatus": "INACTIVE" + }, + "location": { + "id": "2085930778413285378", + "warehouseId": "2085930777423429633", + "deleted": false + }, + "pallet": { + "id": "2085930779596079106", + "warehouseId": "2085930777423429633", + "deleted": true + }, + "expressCompany": { + "id": "2085930780426551297", + "code": "EX808032703277", + "finalStatus": "INACTIVE" + }, + "partner": { + "id": "2085930781437378561", + "code": "PT808032703277", + "finalStatus": "INACTIVE" + }, + "orders": { + "marker": "ADMIN-API-20260808032703277", + "tenantId": "10001", + "orderId": "2085930785815724033", + "productImageFileId": "2085930785350156289", + "boxTypes": [ + "SMALL", + "MEDIUM", + "LARGE", + "EXTRA_LARGE" + ], + "inboundId": "2085930789957578753", + "orderNo": "FL2085930785815724033", + "inboundCode": "RK-2085930785815724033", + "processStatus": "WAIT_MEASURE", + "taskId": "2085930789932412929" + }, + "ocrInbound": { + "tenantId": "10001", + "inboundId": "2085930789957578753", + "marker": "ADMIN-API-20260808032703277" + }, + "testInbound": { + "tenantId": "10001", + "inboundId": "2085930789957578753", + "marker": "ADMIN-API-20260808032703277" + }, + "priceBookVersion": { + "versionId": "2085930794353209345", + "marker": "ADMIN-API-20260808032703277", + "sourceSha256": "3170fd3aa8795cd816ca9600f87a6a2a06b15d0cf6042d4592f33d4b30c7b8ab" + }, + "exportTask": { + "id": "2085930821039489026" + }, + "inboundWeightOcr": { + "tenantId": "10001", + "inboundId": "2085930789957578753", + "resultIds": [ + "2085930859155206145", + "2085930868932128770" + ], + "cleaned": true + } + }, + "excluded": [ + { + "scope": "dashboard", + "reason": "首页为静态演示数据,不调用后端 API" + }, + { + "scope": "hidden-prototypes", + "reason": "隐藏原型页面尚无已确认后端契约" + } + ], + "securityNote": "报告不保存登录密码、Access Token、Refresh Token、图片二进制或 OCR 原文全文。", + "steps": [ + { + "module": "authentication", + "scenario": null, + "name": "平台管理员登录", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/auth/login" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "51eb555e-5267-4c5f-a955-ba4dbce5f5d8, b0c83eb8-ad3c-4f88-ac5c-36f7b486d8fe", + "traceId": "33e8dec3a9b3421881039bffba02bffc", + "evidence": "", + "checkedAt": "2026-08-08T03:27:03.650Z" + }, + { + "module": "customers", + "scenario": null, + "name": "检查测试联系电话可用性", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/contact-phone-availability?contactPhone=16159623650" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "3b2e4417-c7c0-4a94-9b9a-3d05db397bac, e3fd9aee-fce9-40fd-ba6d-709506811335", + "traceId": "04e9b5e72dc04759afdb5bddbd8c6a28", + "evidence": "attempt=1", + "checkedAt": "2026-08-08T03:27:03.702Z" + }, + { + "module": "customers", + "scenario": null, + "name": "创建客户", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/iam/tenants" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "1fcb71b1-d5e2-49e5-a73c-46b0b8a05a7e, faa751a2-ed36-4df4-b19b-60f3af686570", + "traceId": "cf16bbf9920746f58b1768abc5f91667", + "evidence": "", + "checkedAt": "2026-08-08T03:27:04.087Z" + }, + { + "module": "customers", + "scenario": null, + "name": "创建响应客户字段完整", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/iam/tenants" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "1fcb71b1-d5e2-49e5-a73c-46b0b8a05a7e, faa751a2-ed36-4df4-b19b-60f3af686570", + "traceId": "cf16bbf9920746f58b1768abc5f91667", + "evidence": "missing=none", + "checkedAt": "2026-08-08T03:27:04.088Z" + }, + { + "module": "customers", + "scenario": null, + "name": "新客户基础字段正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/iam/tenants" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "1fcb71b1-d5e2-49e5-a73c-46b0b8a05a7e, faa751a2-ed36-4df4-b19b-60f3af686570", + "traceId": "cf16bbf9920746f58b1768abc5f91667", + "evidence": "tenantId=2085930761823309826, status=PROFILE_REQUIRED", + "checkedAt": "2026-08-08T03:27:04.088Z" + }, + { + "module": "customers", + "scenario": "customer-owner-provisioning", + "name": "创建客户生成初始密码", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/iam/tenants" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "1fcb71b1-d5e2-49e5-a73c-46b0b8a05a7e, faa751a2-ed36-4df4-b19b-60f3af686570", + "traceId": "cf16bbf9920746f58b1768abc5f91667", + "evidence": "generated=true, length=16", + "checkedAt": "2026-08-08T03:27:04.088Z" + }, + { + "module": "customers", + "scenario": "customer-owner-provisioning", + "name": "管理员用户名默认使用联系电话", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/iam/tenants" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "1fcb71b1-d5e2-49e5-a73c-46b0b8a05a7e, faa751a2-ed36-4df4-b19b-60f3af686570", + "traceId": "cf16bbf9920746f58b1768abc5f91667", + "evidence": "matches=true", + "checkedAt": "2026-08-08T03:27:04.088Z" + }, + { + "module": "customers", + "scenario": null, + "name": "待完善客户的审核字段保持为空", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/iam/tenants" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "1fcb71b1-d5e2-49e5-a73c-46b0b8a05a7e, faa751a2-ed36-4df4-b19b-60f3af686570", + "traceId": "cf16bbf9920746f58b1768abc5f91667", + "evidence": "creditCode=omitted, approvedAt=omitted", + "checkedAt": "2026-08-08T03:27:04.088Z" + }, + { + "module": "customers", + "scenario": "customer-dimension-rules", + "name": "新客户尺寸规则可查询", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/customer-dimension-config?tenantId=2085930761823309826" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "1f10f97d-de4c-4384-aa61-cc931f12e90e, d4c8293a-0040-4b43-a5d1-3d3e4f6e921e", + "traceId": "7f75fca187f0446d943019ff5e480518", + "evidence": "tenantId=2085930761823309826", + "checkedAt": "2026-08-08T03:27:04.124Z" + }, + { + "module": "customers", + "scenario": "customer-dimension-rules", + "name": "固定四箱规顺序完整且无重复", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/customer-dimension-config?tenantId=2085930761823309826" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "1f10f97d-de4c-4384-aa61-cc931f12e90e, d4c8293a-0040-4b43-a5d1-3d3e4f6e921e", + "traceId": "7f75fca187f0446d943019ff5e480518", + "evidence": "count=4, order=SMALL,MEDIUM,LARGE,EXTRA_LARGE", + "checkedAt": "2026-08-08T03:27:04.124Z" + }, + { + "module": "customers", + "scenario": "customer-dimension-rules", + "name": "四箱规默认内径、加边和备注正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/customer-dimension-config?tenantId=2085930761823309826" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "1f10f97d-de4c-4384-aa61-cc931f12e90e, d4c8293a-0040-4b43-a5d1-3d3e4f6e921e", + "traceId": "7f75fca187f0446d943019ff5e480518", + "evidence": "defaults=matched", + "checkedAt": "2026-08-08T03:27:04.124Z" + }, + { + "module": "customers", + "scenario": "customer-dimension-rules", + "name": "客户 ID、规则 ID 为字符串且初始版本为0", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/customer-dimension-config?tenantId=2085930761823309826" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "1f10f97d-de4c-4384-aa61-cc931f12e90e, d4c8293a-0040-4b43-a5d1-3d3e4f6e921e", + "traceId": "7f75fca187f0446d943019ff5e480518", + "evidence": "groupTenantIdType=string, rows=string/v0,string/v0,string/v0,string/v0", + "checkedAt": "2026-08-08T03:27:04.124Z" + }, + { + "module": "customers", + "scenario": "customer-dimension-rules", + "name": "默认规则外径与 HALF_UP 三位 CBM 正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/customer-dimension-config?tenantId=2085930761823309826" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "1f10f97d-de4c-4384-aa61-cc931f12e90e, d4c8293a-0040-4b43-a5d1-3d3e4f6e921e", + "traceId": "7f75fca187f0446d943019ff5e480518", + "evidence": "derivedRows=4", + "checkedAt": "2026-08-08T03:27:04.124Z" + }, + { + "module": "customers", + "scenario": "customer-dimension-rules", + "name": "PUT 每行只发送约定7字段并整组保存", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/customer-dimension-config?tenantId=2085930761823309826" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "1f10f97d-de4c-4384-aa61-cc931f12e90e, d4c8293a-0040-4b43-a5d1-3d3e4f6e921e", + "traceId": "7f75fca187f0446d943019ff5e480518", + "evidence": "fields=boxType,innerLengthCm,innerWidthCm,innerHeightCm,edgeAdditionCm,remark,version", + "checkedAt": "2026-08-08T03:27:04.124Z" + }, + { + "module": "customers", + "scenario": "customer-dimension-rules", + "name": "一次 PUT 保存四条三位小数规则", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/first-leg/customer-dimension-config?tenantId=2085930761823309826" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "f16ecf0d-2f16-49ef-9db7-b67105d24ffd, 54f9ea9d-2106-4efd-b161-e637551877e4", + "traceId": "f5996926d658494ca015a831db57fc33", + "evidence": "rows=4", + "checkedAt": "2026-08-08T03:27:04.234Z" + }, + { + "module": "customers", + "scenario": "customer-dimension-rules", + "name": "修改后四行版本+1且派生外径/CBM正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/first-leg/customer-dimension-config?tenantId=2085930761823309826" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "f16ecf0d-2f16-49ef-9db7-b67105d24ffd, 54f9ea9d-2106-4efd-b161-e637551877e4", + "traceId": "f5996926d658494ca015a831db57fc33", + "evidence": "versions=1,1,1,1", + "checkedAt": "2026-08-08T03:27:04.234Z" + }, + { + "module": "customers", + "scenario": "customer-dimension-rules", + "name": "旧 version 重放 PUT 返回冲突", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/first-leg/customer-dimension-config?tenantId=2085930761823309826" + }, + "http": 200, + "code": "A0409", + "message": "箱规尺寸配置已被修改,请刷新后重试", + "requestId": "6253ba73-cbd5-4203-beb8-7d4465c9bc07", + "traceId": "ecb11139f9ed4686a0bd7a6bb1af8575", + "evidence": "HTTP=200, code=A0409", + "checkedAt": "2026-08-08T03:27:04.278Z" + }, + { + "module": "customers", + "scenario": "customer-dimension-rules", + "name": "冲突后重新查询四条规则", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/customer-dimension-config?tenantId=2085930761823309826" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "461ac275-6ad1-4f4c-9909-dbdf8f0cdeff, c5f3934c-5821-4702-bef1-51f12317b676", + "traceId": "3fec928875c04c85848c98e71bd92549", + "evidence": "", + "checkedAt": "2026-08-08T03:27:04.326Z" + }, + { + "module": "customers", + "scenario": "customer-dimension-rules", + "name": "冲突请求未造成四行部分更新", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/customer-dimension-config?tenantId=2085930761823309826" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "461ac275-6ad1-4f4c-9909-dbdf8f0cdeff, c5f3934c-5821-4702-bef1-51f12317b676", + "traceId": "3fec928875c04c85848c98e71bd92549", + "evidence": "unchangedRows=4", + "checkedAt": "2026-08-08T03:27:04.326Z" + }, + { + "module": "customers", + "scenario": "customer-dimension-rules", + "name": "恢复本轮修改前的四箱规配置", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/first-leg/customer-dimension-config?tenantId=2085930761823309826" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "a672bb18-ebff-45e2-9f02-fe5493f283d5, 3181dcc9-7380-43e0-bdfa-b76d7fb24a70", + "traceId": "81312643580944499c3f0d7a607e14b7", + "evidence": "restore=original-values", + "checkedAt": "2026-08-08T03:27:04.381Z" + }, + { + "module": "customers", + "scenario": "customer-dimension-rules", + "name": "尺寸规则恢复后回显与初始值一致", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/first-leg/customer-dimension-config?tenantId=2085930761823309826" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "a672bb18-ebff-45e2-9f02-fe5493f283d5, 3181dcc9-7380-43e0-bdfa-b76d7fb24a70", + "traceId": "81312643580944499c3f0d7a607e14b7", + "evidence": "restoredRows=4", + "checkedAt": "2026-08-08T03:27:04.381Z" + }, + { + "module": "customers", + "scenario": null, + "name": "查询客户列表", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants?page=1&size=20&keyword=%E5%90%8E%E5%8F%B0%E5%AE%A2%E6%88%B7%E9%AA%8C%E6%94%B6-808032703277" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "e2152750-98ea-496c-8ced-28e3e5a0a2a0, c53b5fa8-57d7-4aa4-8840-61a0f33cb475", + "traceId": "ac4cb3b197e441cc82d1f4956051a662", + "evidence": "", + "checkedAt": "2026-08-08T03:27:04.424Z" + }, + { + "module": "customers", + "scenario": null, + "name": "列表包含新客户且字段完整", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants?page=1&size=20&keyword=%E5%90%8E%E5%8F%B0%E5%AE%A2%E6%88%B7%E9%AA%8C%E6%94%B6-808032703277" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "e2152750-98ea-496c-8ced-28e3e5a0a2a0, c53b5fa8-57d7-4aa4-8840-61a0f33cb475", + "traceId": "ac4cb3b197e441cc82d1f4956051a662", + "evidence": "found=true, missing=none", + "checkedAt": "2026-08-08T03:27:04.424Z" + }, + { + "module": "customers", + "scenario": null, + "name": "查询客户详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085930761823309826" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "fbd287c8-eaa1-49a9-80bd-c9ab45c376b5, 86ff4272-cdbb-4150-8b41-4755797cc50c", + "traceId": "3e33414490674f608d17570c2babec27", + "evidence": "", + "checkedAt": "2026-08-08T03:27:04.460Z" + }, + { + "module": "customers", + "scenario": null, + "name": "客户详情基本信息正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085930761823309826" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "fbd287c8-eaa1-49a9-80bd-c9ab45c376b5, 86ff4272-cdbb-4150-8b41-4755797cc50c", + "traceId": "3e33414490674f608d17570c2babec27", + "evidence": "tenantId=2085930761823309826", + "checkedAt": "2026-08-08T03:27:04.460Z" + }, + { + "module": "customers", + "scenario": null, + "name": "编辑客户", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/tenants/2085930761823309826" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "cfea3f2d-15d7-444b-8f41-69ad359a2b6f, 559c47de-5014-442f-8f27-575528b52f7b", + "traceId": "fa908070d7404409b152226eb7659fce", + "evidence": "", + "checkedAt": "2026-08-08T03:27:04.509Z" + }, + { + "module": "customers", + "scenario": null, + "name": "客户编辑正确回显", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/tenants/2085930761823309826" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "cfea3f2d-15d7-444b-8f41-69ad359a2b6f, 559c47de-5014-442f-8f27-575528b52f7b", + "traceId": "fa908070d7404409b152226eb7659fce", + "evidence": "tenantId=2085930761823309826", + "checkedAt": "2026-08-08T03:27:04.510Z" + }, + { + "module": "customers", + "scenario": null, + "name": "回查客户编辑结果", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085930761823309826" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "312ebb6e-2e14-490f-992a-6a7efcea0ae0, 5d706c60-c80e-453d-9c10-26dc7034b5ca", + "traceId": "f0318c046c0b41fcbf96276ee6910e80", + "evidence": "", + "checkedAt": "2026-08-08T03:27:04.536Z" + }, + { + "module": "customers", + "scenario": null, + "name": "客户编辑已持久化", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085930761823309826" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "312ebb6e-2e14-490f-992a-6a7efcea0ae0, 5d706c60-c80e-453d-9c10-26dc7034b5ca", + "traceId": "f0318c046c0b41fcbf96276ee6910e80", + "evidence": "tenantId=2085930761823309826", + "checkedAt": "2026-08-08T03:27:04.536Z" + }, + { + "module": "customers", + "scenario": null, + "name": "业务概况查询资质", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085930761823309826/qualifications" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "8ff1aafd-b2e1-4102-a4e0-79b22712596e, 265acb17-98f0-49ef-adf1-ed9441df6095", + "traceId": "3dfb03294d5b41f1a5421c811941ef8a", + "evidence": "", + "checkedAt": "2026-08-08T03:27:04.564Z" + }, + { + "module": "customers", + "scenario": null, + "name": "资质概况结构正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085930761823309826/qualifications" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "8ff1aafd-b2e1-4102-a4e0-79b22712596e, 265acb17-98f0-49ef-adf1-ed9441df6095", + "traceId": "3dfb03294d5b41f1a5421c811941ef8a", + "evidence": "count=0", + "checkedAt": "2026-08-08T03:27:04.564Z" + }, + { + "module": "customers", + "scenario": null, + "name": "业务概况查询成员", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085930761823309826/members" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "49f31365-153f-4fce-a5e8-150f9886ae36, 83282137-622b-4b57-9ce6-43bf3337485f", + "traceId": "2291422fd0764c6c9aeb88fc883bc6c8", + "evidence": "", + "checkedAt": "2026-08-08T03:27:04.606Z" + }, + { + "module": "customers", + "scenario": "customer-owner-provisioning", + "name": "联系电话账号是企业管理员", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/2085930761823309826/members" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "49f31365-153f-4fce-a5e8-150f9886ae36, 83282137-622b-4b57-9ce6-43bf3337485f", + "traceId": "2291422fd0764c6c9aeb88fc883bc6c8", + "evidence": "ownerFound=true, matches=true", + "checkedAt": "2026-08-08T03:27:04.606Z" + }, + { + "module": "customers", + "scenario": null, + "name": "业务概况查询运单数量", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/tenant-counts?tenantIds=2085930761823309826" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "f48fb524-2544-4f03-a165-3786e5d5d174, 3f1a1e23-cab7-43e3-b0e0-cb43db65a56b", + "traceId": "b0385dbf211343b3b57946b149425b76", + "evidence": "", + "checkedAt": "2026-08-08T03:27:04.644Z" + }, + { + "module": "customers", + "scenario": null, + "name": "业务概况返回当前客户运单数", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/tenant-counts?tenantIds=2085930761823309826" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "f48fb524-2544-4f03-a165-3786e5d5d174, 3f1a1e23-cab7-43e3-b0e0-cb43db65a56b", + "traceId": "b0385dbf211343b3b57946b149425b76", + "evidence": "orderCount=0", + "checkedAt": "2026-08-08T03:27:04.644Z" + }, + { + "module": "customers", + "scenario": null, + "name": "查询客户运单记录", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg?tenantId=2085930761823309826&page=1&size=10" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "2f86b681-6627-4328-a2f0-854b3ef8edda, d24f6570-a271-42d6-b2bd-f2b9232f2ebf", + "traceId": "98f58421ea13424c8bab4b828f0ee717", + "evidence": "", + "checkedAt": "2026-08-08T03:27:04.676Z" + }, + { + "module": "customers", + "scenario": null, + "name": "运单记录分页结构正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg?tenantId=2085930761823309826&page=1&size=10" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "2f86b681-6627-4328-a2f0-854b3ef8edda, d24f6570-a271-42d6-b2bd-f2b9232f2ebf", + "traceId": "98f58421ea13424c8bab4b828f0ee717", + "evidence": "records=0, total=0", + "checkedAt": "2026-08-08T03:27:04.676Z" + }, + { + "module": "customers", + "scenario": "customer-draft-archive", + "name": "归档测试客户", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/iam/tenants/2085930761823309826/archive" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "533a1ed7-9688-4675-a6b0-0a0aaa37114c, 4b2c1488-af65-46b7-a184-b21bd33f6243", + "traceId": "f6331d09d4c545bd99226c18ec0b1ec7", + "evidence": "tenantId=2085930761823309826", + "checkedAt": "2026-08-08T03:27:04.785Z" + }, + { + "module": "customers", + "scenario": "customer-draft-archive", + "name": "测试客户归档后处于停用状态", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/iam/tenants/2085930761823309826/archive" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "533a1ed7-9688-4675-a6b0-0a0aaa37114c, 4b2c1488-af65-46b7-a184-b21bd33f6243", + "traceId": "f6331d09d4c545bd99226c18ec0b1ec7", + "evidence": "status=DISABLED", + "checkedAt": "2026-08-08T03:27:04.785Z" + }, + { + "module": "system", + "scenario": null, + "name": "查询菜单权限资源", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/permissions" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "ce113c80-3c90-4381-a749-ae0ed28f241c, d0ce324c-7d1b-42c8-8ed6-d6f76ac62dbd", + "traceId": "bde89bd315984fdfad956bf85bb5730d", + "evidence": "", + "checkedAt": "2026-08-08T03:27:04.829Z" + }, + { + "module": "system", + "scenario": null, + "name": "权限资源返回数组", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/permissions" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "ce113c80-3c90-4381-a749-ae0ed28f241c, d0ce324c-7d1b-42c8-8ed6-d6f76ac62dbd", + "traceId": "bde89bd315984fdfad956bf85bb5730d", + "evidence": "count=120", + "checkedAt": "2026-08-08T03:27:04.829Z" + }, + { + "module": "system", + "scenario": null, + "name": "创建自定义权限资源", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/iam/permissions" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "354eff66-c62c-45b5-acb6-a701279fbc14, 52ee9a19-8a3f-468f-9088-5db6d814e925", + "traceId": "ebb837eedc6c4f8b98177ee22e34af94", + "evidence": "", + "checkedAt": "2026-08-08T03:27:04.871Z" + }, + { + "module": "system", + "scenario": null, + "name": "权限创建字段正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/iam/permissions" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "354eff66-c62c-45b5-acb6-a701279fbc14, 52ee9a19-8a3f-468f-9088-5db6d814e925", + "traceId": "ebb837eedc6c4f8b98177ee22e34af94", + "evidence": "permissionId=2085930766504153089", + "checkedAt": "2026-08-08T03:27:04.871Z" + }, + { + "module": "system", + "scenario": null, + "name": "编辑自定义权限资源", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/permissions/2085930766504153089" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "a72c0dca-b7c8-4e40-804f-9c42d8f484dc, 139d123b-9867-4a47-9517-cf11251485ba", + "traceId": "cd1dca53bb90435d9aa707f67eb5bb89", + "evidence": "", + "checkedAt": "2026-08-08T03:27:04.921Z" + }, + { + "module": "system", + "scenario": null, + "name": "权限编辑正确回显", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/permissions/2085930766504153089" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "a72c0dca-b7c8-4e40-804f-9c42d8f484dc, 139d123b-9867-4a47-9517-cf11251485ba", + "traceId": "cd1dca53bb90435d9aa707f67eb5bb89", + "evidence": "permissionId=2085930766504153089", + "checkedAt": "2026-08-08T03:27:04.921Z" + }, + { + "module": "system", + "scenario": null, + "name": "停用自定义权限", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/permissions/2085930766504153089/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "40b353a2-7b01-490f-9c9e-2694590d6e31, 868d349c-9f19-4305-b16e-8aa8a5ec09b4", + "traceId": "e797e1eeeb1446519e1d1bc80007c6d1", + "evidence": "", + "checkedAt": "2026-08-08T03:27:04.963Z" + }, + { + "module": "system", + "scenario": null, + "name": "权限状态回显 DISABLED", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/permissions/2085930766504153089/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "40b353a2-7b01-490f-9c9e-2694590d6e31, 868d349c-9f19-4305-b16e-8aa8a5ec09b4", + "traceId": "e797e1eeeb1446519e1d1bc80007c6d1", + "evidence": "status=DISABLED", + "checkedAt": "2026-08-08T03:27:04.963Z" + }, + { + "module": "system", + "scenario": null, + "name": "启用自定义权限", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/permissions/2085930766504153089/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "01253c05-8a9e-48a9-b28a-c349ea5d2ff5, 69f28689-c05d-4bcf-ad05-a34bdb051f9b", + "traceId": "d1b989e553d3455ab4ff6280c56c0a87", + "evidence": "", + "checkedAt": "2026-08-08T03:27:05.006Z" + }, + { + "module": "system", + "scenario": null, + "name": "权限状态回显 ACTIVE", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/permissions/2085930766504153089/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "01253c05-8a9e-48a9-b28a-c349ea5d2ff5, 69f28689-c05d-4bcf-ad05-a34bdb051f9b", + "traceId": "d1b989e553d3455ab4ff6280c56c0a87", + "evidence": "status=ACTIVE", + "checkedAt": "2026-08-08T03:27:05.006Z" + }, + { + "module": "system", + "scenario": null, + "name": "创建平台自定义角色", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/iam/roles" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "54c307f0-3eea-44f3-afa6-b97b8e28bef3, 10b5e667-20de-4a4b-a922-67445a135ab1", + "traceId": "4df7cd88dd2b40bebd67a02e2a54d7f4", + "evidence": "", + "checkedAt": "2026-08-08T03:27:05.033Z" + }, + { + "module": "system", + "scenario": null, + "name": "角色创建字段正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/iam/roles" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "54c307f0-3eea-44f3-afa6-b97b8e28bef3, 10b5e667-20de-4a4b-a922-67445a135ab1", + "traceId": "4df7cd88dd2b40bebd67a02e2a54d7f4", + "evidence": "roleId=2085930767196213250", + "checkedAt": "2026-08-08T03:27:05.033Z" + }, + { + "module": "system", + "scenario": null, + "name": "编辑平台自定义角色", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/roles/2085930767196213250" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "554bcd44-3fb0-4178-8230-28d14be457c7, afda8b69-87e4-4136-8ea5-8e5b7babb4ee", + "traceId": "0c2d9261c24842579d2f43f5b8e0e5d1", + "evidence": "", + "checkedAt": "2026-08-08T03:27:05.069Z" + }, + { + "module": "system", + "scenario": null, + "name": "角色编辑正确回显", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/roles/2085930767196213250" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "554bcd44-3fb0-4178-8230-28d14be457c7, afda8b69-87e4-4136-8ea5-8e5b7babb4ee", + "traceId": "0c2d9261c24842579d2f43f5b8e0e5d1", + "evidence": "roleId=2085930767196213250", + "checkedAt": "2026-08-08T03:27:05.069Z" + }, + { + "module": "system", + "scenario": null, + "name": "角色全量保存权限", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/roles/permissions" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "1082c40b-1d4f-4b6c-a82b-156f880a4ae7, 4dd90b61-c90b-4611-8b79-85d810db8a9b", + "traceId": "20f6986803b34469b8e340398348ba1c", + "evidence": "", + "checkedAt": "2026-08-08T03:27:05.101Z" + }, + { + "module": "system", + "scenario": null, + "name": "回查平台角色列表", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/roles" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "8418ce8a-cbf4-4a42-bdfb-2cdd57ffca6d, 84aab2a7-0282-4f48-a55e-00dad848281c", + "traceId": "5d35bd9cd89a4164ab1563ffdefdc41d", + "evidence": "", + "checkedAt": "2026-08-08T03:27:05.147Z" + }, + { + "module": "system", + "scenario": null, + "name": "角色权限 ID 正确回显", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/roles" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "8418ce8a-cbf4-4a42-bdfb-2cdd57ffca6d, 84aab2a7-0282-4f48-a55e-00dad848281c", + "traceId": "5d35bd9cd89a4164ab1563ffdefdc41d", + "evidence": "permissionIds=2085930766504153089", + "checkedAt": "2026-08-08T03:27:05.147Z" + }, + { + "module": "system", + "scenario": null, + "name": "停用自定义角色", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/roles/2085930767196213250/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "7939b573-09de-4976-b26e-87123fe2e667, 298cbfbe-d78e-4418-bc65-a4c18f37fd91", + "traceId": "eb87008d26d74716b609a17f04cdffbe", + "evidence": "", + "checkedAt": "2026-08-08T03:27:05.175Z" + }, + { + "module": "system", + "scenario": null, + "name": "角色状态回显 DISABLED", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/roles/2085930767196213250/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "7939b573-09de-4976-b26e-87123fe2e667, 298cbfbe-d78e-4418-bc65-a4c18f37fd91", + "traceId": "eb87008d26d74716b609a17f04cdffbe", + "evidence": "status=DISABLED", + "checkedAt": "2026-08-08T03:27:05.175Z" + }, + { + "module": "system", + "scenario": null, + "name": "启用自定义角色", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/roles/2085930767196213250/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "f9acd0a4-8f91-45e0-abea-8c76a85ab8b2, 9cbf90dd-2d4d-468b-8450-ec3596a00b1b", + "traceId": "c0357d2eddb946eab7314d1494f0006a", + "evidence": "", + "checkedAt": "2026-08-08T03:27:05.209Z" + }, + { + "module": "system", + "scenario": null, + "name": "角色状态回显 ACTIVE", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/roles/2085930767196213250/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "f9acd0a4-8f91-45e0-abea-8c76a85ab8b2, 9cbf90dd-2d4d-468b-8450-ec3596a00b1b", + "traceId": "c0357d2eddb946eab7314d1494f0006a", + "evidence": "status=ACTIVE", + "checkedAt": "2026-08-08T03:27:05.209Z" + }, + { + "module": "system", + "scenario": null, + "name": "查询内部用户可选平台角色", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/users/options" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "f0c9ffee-534d-41bd-b4ed-bd0607ac9b3a, 44e4ad35-1138-4cab-81f9-2abc11499697", + "traceId": "39c1f1ff866b439d989ddd03a54e8983", + "evidence": "", + "checkedAt": "2026-08-08T03:27:05.236Z" + }, + { + "module": "system", + "scenario": null, + "name": "用户选项包含平台与测试角色", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/users/options" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "f0c9ffee-534d-41bd-b4ed-bd0607ac9b3a, 44e4ad35-1138-4cab-81f9-2abc11499697", + "traceId": "39c1f1ff866b439d989ddd03a54e8983", + "evidence": "tenants=1, roles=10", + "checkedAt": "2026-08-08T03:27:05.236Z" + }, + { + "module": "system", + "scenario": null, + "name": "检查测试联系电话可用性", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/tenants/contact-phone-availability?contactPhone=16159625236" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "9c9aa75b-d86f-4476-a1ec-3d0cad10a2c1, 92da27dd-0e0c-49da-87f1-2084bbcbc5a8", + "traceId": "d6af5ea6f4e2457996bb2d65660ecdcb", + "evidence": "attempt=1", + "checkedAt": "2026-08-08T03:27:05.264Z" + }, + { + "module": "system", + "scenario": null, + "name": "创建平台内部用户", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/iam/users" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "fa8758e9-301a-4ae0-98cf-deb8ba64cf25, 0087036d-8a4d-4a3a-8244-3882c9a2bbc5", + "traceId": "dfab6dc140244b70b780eafdfc557c82", + "evidence": "", + "checkedAt": "2026-08-08T03:27:05.629Z" + }, + { + "module": "system", + "scenario": null, + "name": "内部用户账号、平台范围和角色正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/iam/users" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "fa8758e9-301a-4ae0-98cf-deb8ba64cf25, 0087036d-8a4d-4a3a-8244-3882c9a2bbc5", + "traceId": "dfab6dc140244b70b780eafdfc557c82", + "evidence": "membershipId=2085930768337063939", + "checkedAt": "2026-08-08T03:27:05.629Z" + }, + { + "module": "system", + "scenario": null, + "name": "按账号查询平台内部用户", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/users?page=1&size=20&keyword=admin_accept_808032703277" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "6f159035-6ba6-4cda-911c-d777264d4870, ae8bf909-66b1-4dbe-b5f1-c263781d45a9", + "traceId": "98713afe199b48ff910f41e001967b98", + "evidence": "", + "checkedAt": "2026-08-08T03:27:05.684Z" + }, + { + "module": "system", + "scenario": null, + "name": "用户列表包含新账号且字段完整", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/users?page=1&size=20&keyword=admin_accept_808032703277" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "6f159035-6ba6-4cda-911c-d777264d4870, ae8bf909-66b1-4dbe-b5f1-c263781d45a9", + "traceId": "98713afe199b48ff910f41e001967b98", + "evidence": "records=1, missing=none, lastLoginAt=omitted", + "checkedAt": "2026-08-08T03:27:05.684Z" + }, + { + "module": "system", + "scenario": null, + "name": "编辑平台内部用户", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/users/2085930768337063939" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "9c34b814-137c-48d3-8388-d5f435d1b1f1, 6881ed9c-c55a-4f83-9c88-f5bb913f86f3", + "traceId": "7212973e358049d6ac19fec50cd6a17f", + "evidence": "", + "checkedAt": "2026-08-08T03:27:05.805Z" + }, + { + "module": "system", + "scenario": null, + "name": "用户编辑正确回显", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/users/2085930768337063939" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "9c34b814-137c-48d3-8388-d5f435d1b1f1, 6881ed9c-c55a-4f83-9c88-f5bb913f86f3", + "traceId": "7212973e358049d6ac19fec50cd6a17f", + "evidence": "membershipId=2085930768337063939", + "checkedAt": "2026-08-08T03:27:05.805Z" + }, + { + "module": "system", + "scenario": null, + "name": "新建内部用户可使用初始密码登录", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/auth/login" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "68d9fc42-8c3e-40c2-995d-215a1003049c, c8a670ea-6ac0-436e-bb92-392b4426fd76", + "traceId": "4f35bc4788ab478aa0f0f70e58839963", + "evidence": "username=admin_accept_808032703277", + "checkedAt": "2026-08-08T03:27:06.144Z" + }, + { + "module": "system", + "scenario": null, + "name": "重置平台内部用户密码", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/users/2085930768337063939/password" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "406d3923-16a0-43d7-bf33-4116e3cb08b9, 78186624-2459-4309-8145-3e6acad86dd9", + "traceId": "4bb455a4e55c4c7bb6b658efe008875e", + "evidence": "", + "checkedAt": "2026-08-08T03:27:06.538Z" + }, + { + "module": "system", + "scenario": null, + "name": "内部用户使用重置密码登录", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/auth/login" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "5b698146-921d-441b-af62-2241c206ddb0, 2dbb282b-270c-483e-8d07-85c8dc1feb7a", + "traceId": "4a0fedb81d99457b81ce237262039ce2", + "evidence": "username=admin_accept_808032703277", + "checkedAt": "2026-08-08T03:27:06.879Z" + }, + { + "module": "system", + "scenario": null, + "name": "停用平台内部用户", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/users/2085930768337063939/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "3390a0bb-bb2b-492f-b665-5575d1f0f650, 47d88297-70bc-4127-8737-ba341186ab02", + "traceId": "ec82fdce7bd74253960cbd4db2d1905d", + "evidence": "", + "checkedAt": "2026-08-08T03:27:07.003Z" + }, + { + "module": "system", + "scenario": null, + "name": "内部用户停用状态正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/users/2085930768337063939/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "3390a0bb-bb2b-492f-b665-5575d1f0f650, 47d88297-70bc-4127-8737-ba341186ab02", + "traceId": "ec82fdce7bd74253960cbd4db2d1905d", + "evidence": "status=DISABLED", + "checkedAt": "2026-08-08T03:27:07.003Z" + }, + { + "module": "system", + "scenario": null, + "name": "停用用户禁止登录", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/auth/login" + }, + "http": 200, + "code": "A0403", + "message": "账号已禁用", + "requestId": "74ecca03-e2fb-477c-b692-e889b2dcf0c2", + "traceId": "ce43ed8db108453281861ccbea259ff7", + "evidence": "HTTP=200, code=A0403", + "checkedAt": "2026-08-08T03:27:07.040Z" + }, + { + "module": "system", + "scenario": null, + "name": "清空测试角色权限", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/roles/permissions" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "a2a0da32-b7a2-4489-a96e-a133a2adc4fa, fe1db110-efab-4d99-89cf-e16aaa3a3e68", + "traceId": "a86c502e7be64d34bad7f59f4618cbb3", + "evidence": "", + "checkedAt": "2026-08-08T03:27:07.132Z" + }, + { + "module": "system", + "scenario": "system-role-protection", + "name": "已分配成员的角色禁止删除", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "DELETE", + "path": "/api/platform/v1/iam/roles/2085930767196213250" + }, + "http": 200, + "code": "A0409", + "message": "角色已分配给成员,不能删除", + "requestId": "0c04056b-8894-42c1-a4a1-d1d83e91c260", + "traceId": "b0f40e3c8799454f949ad6c3b0474941", + "evidence": "HTTP=200, code=A0409", + "checkedAt": "2026-08-08T03:27:07.164Z" + }, + { + "module": "system", + "scenario": null, + "name": "清理时停用测试角色", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/roles/2085930767196213250/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "f49824ea-1701-4156-ae29-8347998182eb, 854e2178-d69f-4112-9803-c28bd7283cdd", + "traceId": "ba1ac07613d6407794bb5464aed3be9e", + "evidence": "", + "checkedAt": "2026-08-08T03:27:07.259Z" + }, + { + "module": "system", + "scenario": null, + "name": "保留测试角色处于停用状态", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/iam/roles/2085930767196213250/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "f49824ea-1701-4156-ae29-8347998182eb, 854e2178-d69f-4112-9803-c28bd7283cdd", + "traceId": "ba1ac07613d6407794bb5464aed3be9e", + "evidence": "status=DISABLED", + "checkedAt": "2026-08-08T03:27:07.259Z" + }, + { + "module": "system", + "scenario": null, + "name": "删除临时权限资源", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "DELETE", + "path": "/api/platform/v1/iam/permissions/2085930766504153089" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "4d6f8a78-df82-400a-a044-f322862ff2b7, e8b9e5f5-370c-4949-b816-3c71a7c3cc37", + "traceId": "0d1b08a68f99426f8edb9a674d9a84ea", + "evidence": "", + "checkedAt": "2026-08-08T03:27:07.298Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "查询平台仓库列表", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/warehouse-admin?page=1&size=20" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "b6ce06cb-01ea-48b1-b662-870eba3b73a5, b3378899-41b9-40cf-b4f1-87c0d53600d1", + "traceId": "ace0b5ef751348e1941d88b435be35f6", + "evidence": "", + "checkedAt": "2026-08-08T03:27:07.339Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "仓库列表分页结构正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/warehouse-admin?page=1&size=20" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "b6ce06cb-01ea-48b1-b662-870eba3b73a5, b3378899-41b9-40cf-b4f1-87c0d53600d1", + "traceId": "ace0b5ef751348e1941d88b435be35f6", + "evidence": "total=269", + "checkedAt": "2026-08-08T03:27:07.339Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "创建平台公共仓库", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/warehouse-admin" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "62d3cfe0-6dff-40bb-97b3-de7d1c3c33d4, 1abf951d-ceac-4b20-9c66-67089404e55a", + "traceId": "ed9f4fac7f4a4a229f37dc7be52e3c0f", + "evidence": "", + "checkedAt": "2026-08-08T03:27:07.495Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "仓库创建返回字符串兼容 ID", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/warehouse-admin" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "62d3cfe0-6dff-40bb-97b3-de7d1c3c33d4, 1abf951d-ceac-4b20-9c66-67089404e55a", + "traceId": "ed9f4fac7f4a4a229f37dc7be52e3c0f", + "evidence": "warehouseId=2085930777423429633", + "checkedAt": "2026-08-08T03:27:07.495Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "查询平台仓库详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/warehouse-admin/2085930777423429633?tenantId=0" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "45bcd589-739f-4e1a-8795-31e768d7d023, 4eb390c5-4ae4-4b15-aa07-40cb880086d8", + "traceId": "2b9e53d2b5b7442196a6371b6f2a48ba", + "evidence": "", + "checkedAt": "2026-08-08T03:27:07.535Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "仓库详情、地址和能力正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/warehouse-admin/2085930777423429633?tenantId=0" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "45bcd589-739f-4e1a-8795-31e768d7d023, 4eb390c5-4ae4-4b15-aa07-40cb880086d8", + "traceId": "2b9e53d2b5b7442196a6371b6f2a48ba", + "evidence": "addresses=1, capabilities=1", + "checkedAt": "2026-08-08T03:27:07.536Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "编辑平台仓库", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/warehouse-admin/2085930777423429633?tenantId=0" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "ef8713c2-b214-457d-82bf-1bc07b57127f, 83c0325e-686c-430f-8c58-d849901f617a", + "traceId": "283d1d6f5150419c8b7c10315f53ba9b", + "evidence": "", + "checkedAt": "2026-08-08T03:27:07.617Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "回查编辑后的平台仓库", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/warehouse-admin/2085930777423429633?tenantId=0" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "ce613e43-9dc9-4a56-be12-06d6fbafb30a, 91ccd446-9284-48a6-b859-bea9b4143458", + "traceId": "3c7775d113244315bf9e82ab40d0a992", + "evidence": "", + "checkedAt": "2026-08-08T03:27:07.645Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "仓库编辑已持久化", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/warehouse-admin/2085930777423429633?tenantId=0" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "ce613e43-9dc9-4a56-be12-06d6fbafb30a, 91ccd446-9284-48a6-b859-bea9b4143458", + "traceId": "3c7775d113244315bf9e82ab40d0a992", + "evidence": "warehouseId=2085930777423429633", + "checkedAt": "2026-08-08T03:27:07.645Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "创建仓库库位", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/locations?tenantId=0" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "e0b96753-d650-4212-b288-28d389a8180d, 0954cc10-2010-4dee-98c5-f3b1e3f564ef", + "traceId": "a12fd9d81dc844d89e62ea7d605a6040", + "evidence": "", + "checkedAt": "2026-08-08T03:27:07.714Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "查询库位详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/locations/2085930778413285378?tenantId=0&warehouseId=2085930777423429633" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "33a0528b-3b7b-41e3-ab46-70c274e021cc, 104606ad-7467-4a9d-8800-0e3158602551", + "traceId": "46815955e9f94f938bb64b585bc9de46", + "evidence": "", + "checkedAt": "2026-08-08T03:27:07.756Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "库位详情关联正确仓库", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/locations/2085930778413285378?tenantId=0&warehouseId=2085930777423429633" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "33a0528b-3b7b-41e3-ab46-70c274e021cc, 104606ad-7467-4a9d-8800-0e3158602551", + "traceId": "46815955e9f94f938bb64b585bc9de46", + "evidence": "locationId=2085930778413285378", + "checkedAt": "2026-08-08T03:27:07.756Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "编辑库位", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/locations/2085930778413285378?tenantId=0&warehouseId=2085930777423429633" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "88d479a1-2a60-4513-8c2e-f5fb2eb1b786, d79e0a69-dd88-4d07-b692-7698ad11ed6e", + "traceId": "1e7a8b65676a46b8a4be3494ac73bda6", + "evidence": "", + "checkedAt": "2026-08-08T03:27:07.805Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "回查编辑后的库位", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/locations/2085930778413285378?tenantId=0&warehouseId=2085930777423429633" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "b0f4200c-e1e4-41c1-82d6-fb1f1ba08cf2, f276af4d-3fdf-44d5-b4b3-3f067c5b3200", + "traceId": "f6621b873ca1414abdd6a1f9cde0a03a", + "evidence": "", + "checkedAt": "2026-08-08T03:27:07.850Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "库位编辑与版本递增正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/locations/2085930778413285378?tenantId=0&warehouseId=2085930777423429633" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "b0f4200c-e1e4-41c1-82d6-fb1f1ba08cf2, f276af4d-3fdf-44d5-b4b3-3f067c5b3200", + "traceId": "f6621b873ca1414abdd6a1f9cde0a03a", + "evidence": "version=1", + "checkedAt": "2026-08-08T03:27:07.850Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "停用库位", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PATCH", + "path": "/api/platform/v1/locations/2085930778413285378/status?tenantId=0&warehouseId=2085930777423429633" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "b4902d8a-fc01-4b48-a0c6-38c5a83af7d6, 7e50b85d-7f8d-4b15-bda6-02f8247b3fa5", + "traceId": "99572859376b466fbe0ad0f9ef1af43f", + "evidence": "", + "checkedAt": "2026-08-08T03:27:07.889Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "删除未占用测试库位", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "DELETE", + "path": "/api/platform/v1/locations/2085930778413285378?tenantId=0&warehouseId=2085930777423429633&version=2" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "524758e2-e29e-4169-92c0-8fbf38dc1e05, 8120be3d-e84d-4a67-9282-0d55bd36a582", + "traceId": "0d7a5103091f4b2ebe44a4b1e07709ab", + "evidence": "", + "checkedAt": "2026-08-08T03:27:07.930Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "创建仓库托盘", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/pallets?tenantId=0" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "d3f64585-5f9f-44f1-a6bf-a6bacb956b41, 1501f547-0c09-402f-8825-8eb9fc09cff6", + "traceId": "cdacd8280ce54adf8724e78ddd9afe58", + "evidence": "", + "checkedAt": "2026-08-08T03:27:07.993Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "查询托盘详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/pallets/2085930779596079106?tenantId=0&warehouseId=2085930777423429633" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "1bba7086-d4e1-42ed-8e28-54f68ea48bed, 999875ea-231d-4c1b-ba8f-fbe8e29a5140", + "traceId": "63b98cbaad7e4b11adc99507bbd8da4c", + "evidence": "", + "checkedAt": "2026-08-08T03:27:08.030Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "托盘详情关联正确仓库", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/pallets/2085930779596079106?tenantId=0&warehouseId=2085930777423429633" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "1bba7086-d4e1-42ed-8e28-54f68ea48bed, 999875ea-231d-4c1b-ba8f-fbe8e29a5140", + "traceId": "63b98cbaad7e4b11adc99507bbd8da4c", + "evidence": "palletId=2085930779596079106", + "checkedAt": "2026-08-08T03:27:08.030Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "编辑托盘", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/pallets/2085930779596079106?tenantId=0&warehouseId=2085930777423429633" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "1f21d1b8-9d15-4f84-aa3e-5cf41ae536ee, 2f05ac0b-98c6-45d0-aa86-8f51e4d9e879", + "traceId": "f881a1c6216140f1804144b4a860e353", + "evidence": "", + "checkedAt": "2026-08-08T03:27:08.075Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "回查编辑后的托盘", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/pallets/2085930779596079106?tenantId=0&warehouseId=2085930777423429633" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "1b902231-ae11-450c-90e0-7cac2b935162, 0f2c172c-d904-468a-82a4-f82aee0aeb5f", + "traceId": "ca4d97037be84bb19a1f0501f0a1c871", + "evidence": "", + "checkedAt": "2026-08-08T03:27:08.108Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "托盘编辑已持久化", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/pallets/2085930779596079106?tenantId=0&warehouseId=2085930777423429633" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "1b902231-ae11-450c-90e0-7cac2b935162, 0f2c172c-d904-468a-82a4-f82aee0aeb5f", + "traceId": "ca4d97037be84bb19a1f0501f0a1c871", + "evidence": "palletId=2085930779596079106", + "checkedAt": "2026-08-08T03:27:08.108Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "删除未使用测试托盘", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "DELETE", + "path": "/api/platform/v1/pallets/2085930779596079106?tenantId=0&warehouseId=2085930777423429633" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "45196b6b-13ae-4b03-964f-7c262a6519fc, c54592a7-eb9b-4cd5-b378-05d229152bc8", + "traceId": "829df412774d43edb54c77f10ab7fad3", + "evidence": "", + "checkedAt": "2026-08-08T03:27:08.146Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "创建快递公司", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/express-companies?tenantId=0" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "69084021-93ce-49d5-b4c3-323986cb0ade, d076fb69-2b73-4829-a54d-1c26102d6c0d", + "traceId": "620c657203564ca190d478bb49e087e8", + "evidence": "", + "checkedAt": "2026-08-08T03:27:08.188Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "查询快递公司详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/express-companies/2085930780426551297?tenantId=0" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "f6ebae5a-0734-4f31-b55f-dd47f3c2fa14, 646c4218-ceeb-4a06-b535-de1cc1dd3ffb", + "traceId": "4015252bd99b4410a09a2136bd1d07f9", + "evidence": "", + "checkedAt": "2026-08-08T03:27:08.232Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "快递公司详情正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/express-companies/2085930780426551297?tenantId=0" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "f6ebae5a-0734-4f31-b55f-dd47f3c2fa14, 646c4218-ceeb-4a06-b535-de1cc1dd3ffb", + "traceId": "4015252bd99b4410a09a2136bd1d07f9", + "evidence": "expressId=2085930780426551297", + "checkedAt": "2026-08-08T03:27:08.232Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "编辑快递公司", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/express-companies/2085930780426551297?tenantId=0" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "4795f7f6-4207-40f8-8928-a3f08094cbff, 3c5d6a5a-f8a1-46e7-bbb0-4c2b01ae21c5", + "traceId": "a7feacb2ccc94e699de2b7f607dfedc7", + "evidence": "", + "checkedAt": "2026-08-08T03:27:08.273Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "停用快递公司", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PATCH", + "path": "/api/platform/v1/express-companies/2085930780426551297/status?tenantId=0" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "0f44bbd1-64bc-460e-a6b1-463655ccc0c0, c26ee177-dbfe-4d25-bc24-1ba932ddb656", + "traceId": "fd9f9f0365c443cc9ecb7f70bee3605e", + "evidence": "", + "checkedAt": "2026-08-08T03:27:08.323Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "筛选快递公司列表", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/express-companies?page=1&size=20&keyword=EX808032703277" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "9bf27620-a1d7-4b5b-9de7-44ac396ae09b, abdd4caa-d16a-4dcb-b652-2cdbbb038efb", + "traceId": "cb5d62613cc14789b9b1f3d6c3037bea", + "evidence": "", + "checkedAt": "2026-08-08T03:27:08.366Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "快递公司列表回显停用状态", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/express-companies?page=1&size=20&keyword=EX808032703277" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "9bf27620-a1d7-4b5b-9de7-44ac396ae09b, abdd4caa-d16a-4dcb-b652-2cdbbb038efb", + "traceId": "cb5d62613cc14789b9b1f3d6c3037bea", + "evidence": "records=1", + "checkedAt": "2026-08-08T03:27:08.366Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "创建往来单位", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/partners?tenantId=0" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "b88046bc-5414-46cd-a883-36aa8c30dfa0, 8f6e5dc8-6b61-468d-9d38-39155db2ee80", + "traceId": "786191b21bfa4d9386659cd28398a884", + "evidence": "", + "checkedAt": "2026-08-08T03:27:08.433Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "查询往来单位详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/partners/2085930781437378561?tenantId=0" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "00c15040-c460-473e-abd8-6a18031d56a6, 992c9dbb-583c-4748-a4bc-997bbc3348d1", + "traceId": "7ae0923aa14c4be98d0046ad6681ef6f", + "evidence": "", + "checkedAt": "2026-08-08T03:27:08.457Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "往来单位详情正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/partners/2085930781437378561?tenantId=0" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "00c15040-c460-473e-abd8-6a18031d56a6, 992c9dbb-583c-4748-a4bc-997bbc3348d1", + "traceId": "7ae0923aa14c4be98d0046ad6681ef6f", + "evidence": "partnerId=2085930781437378561", + "checkedAt": "2026-08-08T03:27:08.457Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "编辑往来单位", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PUT", + "path": "/api/platform/v1/partners/2085930781437378561?tenantId=0" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "bfed8206-3899-4d51-815e-d69cef2031c0, dfa39b82-3b0a-4002-b5a4-41d665f0c65b", + "traceId": "8e2f507ed18141a0b3fb7d53d1d13a8a", + "evidence": "", + "checkedAt": "2026-08-08T03:27:08.504Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "停用往来单位", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PATCH", + "path": "/api/platform/v1/partners/2085930781437378561/status?tenantId=0" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "29c4de94-538f-48b1-a81a-7646f49566aa, 03841c56-7345-4f82-95f7-4607553c085d", + "traceId": "4f2d683d4b7e4c36b3fe08e0234ef028", + "evidence": "", + "checkedAt": "2026-08-08T03:27:08.537Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "筛选往来单位列表", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/partners?page=1&size=20&keyword=PT808032703277" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "5959db72-27f7-4b6f-9155-e433ea6c5a8b, 2da851cf-a89c-49f2-a909-a527c9c37544", + "traceId": "7e862702b7f9453799778758d6603657", + "evidence": "", + "checkedAt": "2026-08-08T03:27:08.566Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "往来单位列表回显编辑与停用状态", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/partners?page=1&size=20&keyword=PT808032703277" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "5959db72-27f7-4b6f-9155-e433ea6c5a8b, 2da851cf-a89c-49f2-a909-a527c9c37544", + "traceId": "7e862702b7f9453799778758d6603657", + "evidence": "records=1", + "checkedAt": "2026-08-08T03:27:08.567Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "下载仓库导入模板", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/warehouse-admin/import-template" + }, + "http": 200, + "code": null, + "message": "3852 bytes (application/vnd.openxmlformats-officedocument.spreadsheetml.sheet)", + "requestId": "b4312af1-b69c-4590-a367-de37c6f10c64, 82307b17-dcbd-4140-b780-564836d645b3", + "traceId": "bbffd375d73d4ea296d2751a1652c1e2", + "evidence": "bytes=3852, contentType=application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + "checkedAt": "2026-08-08T03:27:08.612Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "下载快递公司导入模板", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/express-companies/import-template" + }, + "http": 200, + "code": null, + "message": "3691 bytes (application/vnd.openxmlformats-officedocument.spreadsheetml.sheet)", + "requestId": "786f6012-5915-490b-b7ae-0930024af4c8, 3f097ec3-bbd5-4cfa-9924-5eb9dca9b730", + "traceId": "11740ab65cf24e548a09b75a7a5650a8", + "evidence": "bytes=3691, contentType=application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + "checkedAt": "2026-08-08T03:27:08.670Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "下载往来单位导入模板", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/partners/import-template" + }, + "http": 200, + "code": null, + "message": "3829 bytes (application/vnd.openxmlformats-officedocument.spreadsheetml.sheet)", + "requestId": "c3c87584-825b-463e-b186-73c8cfe0a59f, 496ce5ce-7146-4e39-8767-5e8a59e7104d", + "traceId": "5c3dce6714304583bd87aca8657ff6a6", + "evidence": "bytes=3829, contentType=application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + "checkedAt": "2026-08-08T03:27:08.703Z" + }, + { + "module": "master-data", + "scenario": null, + "name": "停用测试仓库", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "PATCH", + "path": "/api/platform/v1/warehouse-admin/2085930777423429633/status?tenantId=0&status=INACTIVE" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "f4741f32-19a1-4b98-a625-adc0e0dcfbcf, 5dd5bb24-45fe-4b5a-ad24-7f5aaa4a3403", + "traceId": "df86fcb240b34720a37772203189123a", + "evidence": "", + "checkedAt": "2026-08-08T03:27:08.744Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 测试账号登录", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/auth/login" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "fcfa6d5f-b58b-4ddf-8a1a-3c9ff07e6014, 187e944d-9c7c-4fc5-8db4-11be94d268dd", + "traceId": "67ecdedc57dd4ccbb43e9efce048af44", + "evidence": "username=merchant_admin", + "checkedAt": "2026-08-08T03:27:09.084Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 查询当前企业资料", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/iam/tenant/profile" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "5ef9d461-995c-41d8-a80c-a410cfe3ced9, 41f886bc-3e55-427a-b119-9a872c717cd5", + "traceId": "1ad4e7bdc76a468cb27cdfb039909ff1", + "evidence": "", + "checkedAt": "2026-08-08T03:27:09.120Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 测试企业已审核且客户 ID 有效", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/iam/tenant/profile" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "5ef9d461-995c-41d8-a80c-a410cfe3ced9, 41f886bc-3e55-427a-b119-9a872c717cd5", + "traceId": "1ad4e7bdc76a468cb27cdfb039909ff1", + "evidence": "tenantId=10001, status=ACTIVE", + "checkedAt": "2026-08-08T03:27:09.121Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "Admin 查询客户固定箱型", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/customer-dimension-config?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "b4ea5295-47d6-4b15-8a37-5a957c9f70c1, c749d97f-ba0f-4e26-b88f-d6f527d30540", + "traceId": "624db45120fc4e0a98c6e64e41acaafa", + "evidence": "tenantId=10001", + "checkedAt": "2026-08-08T03:27:09.153Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "固定四箱型顺序、内径及每边加2cm正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/customer-dimension-config?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "b4ea5295-47d6-4b15-8a37-5a957c9f70c1, c749d97f-ba0f-4e26-b88f-d6f527d30540", + "traceId": "624db45120fc4e0a98c6e64e41acaafa", + "evidence": "types=SMALL,MEDIUM,LARGE,EXTRA_LARGE", + "checkedAt": "2026-08-08T03:27:09.153Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 查询国内收货仓", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/warehouses?page=1&size=200&status=ACTIVE&warehouseType=DOMESTIC" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "2845d555-8d4b-40e4-9294-4a1d459af550, a9500abc-b0df-4fa7-8577-a53bb1eb5e29", + "traceId": "99dce77c5b4b436fadf9565baacf6b09", + "evidence": "", + "checkedAt": "2026-08-08T03:27:09.188Z" + }, + { + "module": "orders", + "scenario": null, + "name": "存在可用国内收货仓", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/warehouses?page=1&size=200&status=ACTIVE&warehouseType=DOMESTIC" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "2845d555-8d4b-40e4-9294-4a1d459af550, a9500abc-b0df-4fa7-8577-a53bb1eb5e29", + "traceId": "99dce77c5b4b436fadf9565baacf6b09", + "evidence": "count=2", + "checkedAt": "2026-08-08T03:27:09.188Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 查询 FBA 目的仓", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/warehouses?page=1&size=200&status=ACTIVE&warehouseType=FBA" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "62793e94-18df-4274-8f38-7ac4036b0e1a, f8e69310-5d89-442f-98f4-a241559da32c", + "traceId": "ba756176e7354fc19a8e4901ed5ab79f", + "evidence": "", + "checkedAt": "2026-08-08T03:27:09.251Z" + }, + { + "module": "orders", + "scenario": null, + "name": "存在可用 FBA 目的仓", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/warehouses?page=1&size=200&status=ACTIVE&warehouseType=FBA" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "62793e94-18df-4274-8f38-7ac4036b0e1a, f8e69310-5d89-442f-98f4-a241559da32c", + "traceId": "ba756176e7354fc19a8e4901ed5ab79f", + "evidence": "count=200", + "checkedAt": "2026-08-08T03:27:09.251Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 查询可用计费渠道", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/first-leg/pricing/channels?originWarehouseId=193000000000200001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "1ec0fa54-2c46-4c43-a311-fa71519d738a, 6680104b-3d3b-4047-b00c-7e4b24005559", + "traceId": "b371aeb456e24868951ea4bc2ceef1e7", + "evidence": "", + "checkedAt": "2026-08-08T03:27:09.299Z" + }, + { + "module": "orders", + "scenario": null, + "name": "存在带计价税制的可用渠道", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/first-leg/pricing/channels?originWarehouseId=193000000000200001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "1ec0fa54-2c46-4c43-a311-fa71519d738a, 6680104b-3d3b-4047-b00c-7e4b24005559", + "traceId": "b371aeb456e24868951ea4bc2ceef1e7", + "evidence": "count=15", + "checkedAt": "2026-08-08T03:27:09.299Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 查询发货客户候选", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/partners/candidates?type=SHIPPER" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "12afc75b-147d-447d-a904-891634c7d51b, 3eeec42d-6b9f-4a27-b205-d69303d4e76a", + "traceId": "b94f6581175644889f8bd6ac613dab39", + "evidence": "", + "checkedAt": "2026-08-08T03:27:09.326Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "Client 上传产品图片", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/merchant/v1/files/product-images" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "141f7c6e-d775-431b-8ff6-5bb097e2d3eb, 877df6b5-0dea-4485-b87d-6ca326843e7d", + "traceId": "4c8fd4bc70e64be7b21be61b2104f712", + "evidence": "contentType=image/png", + "checkedAt": "2026-08-08T03:27:09.364Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "产品图片上传返回字符串文件 ID", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/merchant/v1/files/product-images" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "141f7c6e-d775-431b-8ff6-5bb097e2d3eb, 877df6b5-0dea-4485-b87d-6ca326843e7d", + "traceId": "4c8fd4bc70e64be7b21be61b2104f712", + "evidence": "fileIdType=string, contentType=image/png", + "checkedAt": "2026-08-08T03:27:09.364Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "Client 可下载本轮产品图片", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/files/product-images/2085930785350156289" + }, + "http": 200, + "code": null, + "message": null, + "requestId": "e4b1985e-2341-4c8c-971f-486b3cfffa05, 1f88b15f-026b-4e88-9d4c-d05873309372", + "traceId": "05340ccd7b034714841e266ad2969b8a", + "evidence": "bytes=68, contentType=image/png", + "checkedAt": "2026-08-08T03:27:09.402Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "Client 创建四箱型隔离订单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/merchant/v1/orders/first-leg" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "31dd2ee3-6a06-409e-9272-f31a706e6adb, 08de47de-7f20-4d7b-9352-422e979967af", + "traceId": "c4949d2d17db40e985fb5ccfeb887063", + "evidence": "marker=ADMIN-API-20260808032703277", + "checkedAt": "2026-08-08T03:27:09.482Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 创建订单幂等重放", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/merchant/v1/orders/first-leg" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "130bfd46-7c73-478f-a17d-d06e80eada72, cf631c3a-c0ea-449c-bef5-141d2fcb956b", + "traceId": "236dabe3558c4491b96ae200e1199577", + "evidence": "", + "checkedAt": "2026-08-08T03:27:09.516Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 创建幂等结果一致", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/merchant/v1/orders/first-leg" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "130bfd46-7c73-478f-a17d-d06e80eada72, cf631c3a-c0ea-449c-bef5-141d2fcb956b", + "traceId": "236dabe3558c4491b96ae200e1199577", + "evidence": "orderId=2085930785815724033, replayedId=2085930785815724033", + "checkedAt": "2026-08-08T03:27:09.517Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 查询隔离订单草稿", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/orders/first-leg/2085930785815724033" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "fdbcf634-c6a7-4d27-9a2e-368cc81fd7ec, a80cc8ee-2b45-4335-82d8-cfe44bd4f649", + "traceId": "19e7147b10f149a3bd869f039e472f05", + "evidence": "", + "checkedAt": "2026-08-08T03:27:09.547Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 草稿身份、marker 和状态正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/orders/first-leg/2085930785815724033" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "fdbcf634-c6a7-4d27-9a2e-368cc81fd7ec, a80cc8ee-2b45-4335-82d8-cfe44bd4f649", + "traceId": "19e7147b10f149a3bd869f039e472f05", + "evidence": "orderNo=FL2085930785815724033, status=DRAFT", + "checkedAt": "2026-08-08T03:27:09.547Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "四箱型产品字段及图片契约完整回显", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/orders/first-leg/2085930785815724033" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "fdbcf634-c6a7-4d27-9a2e-368cc81fd7ec, a80cc8ee-2b45-4335-82d8-cfe44bd4f649", + "traceId": "19e7147b10f149a3bd869f039e472f05", + "evidence": "cargoes=4, imageFileId=2085930785350156289", + "checkedAt": "2026-08-08T03:27:09.547Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 提交隔离订单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/merchant/v1/orders/first-leg/2085930785815724033/submit" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "eea6a9be-2786-4258-9d13-47a262472661, 426dcad9-fab1-49ab-87f5-5971fc9d02b2", + "traceId": "bc63fb4d55a240ae9347c29a225002ee", + "evidence": "orderId=2085930785815724033", + "checkedAt": "2026-08-08T03:27:09.615Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 回查已提交订单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/orders/first-leg/2085930785815724033" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "e3d6b493-e6c6-4eec-99a2-ffc0078cb021, 94f2097d-8bd2-48ac-b5a7-ff10eff40a13", + "traceId": "876f531e9bfd4bc79d97f5ecfb17d7f3", + "evidence": "", + "checkedAt": "2026-08-08T03:27:09.657Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 订单已进入待审核状态", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/orders/first-leg/2085930785815724033" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "e3d6b493-e6c6-4eec-99a2-ffc0078cb021, 94f2097d-8bd2-48ac-b5a7-ff10eff40a13", + "traceId": "876f531e9bfd4bc79d97f5ecfb17d7f3", + "evidence": "status=SUBMITTED", + "checkedAt": "2026-08-08T03:27:09.657Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 查询统一订单列表", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders?page=1&size=100&tenantId=10001&orderNo=FL2085930785815724033" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "57dece53-af33-45b4-8f7a-f4d204bb202d, cb99fe2e-c547-470f-97a2-9970e81570b5", + "traceId": "63bb173d11e446fb93c941ce4b8e00db", + "evidence": "", + "checkedAt": "2026-08-08T03:27:09.693Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 统一订单列表只核对本轮订单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders?page=1&size=100&tenantId=10001&orderNo=FL2085930785815724033" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "57dece53-af33-45b4-8f7a-f4d204bb202d, cb99fe2e-c547-470f-97a2-9970e81570b5", + "traceId": "63bb173d11e446fb93c941ce4b8e00db", + "evidence": "orderId=2085930785815724033, found=true", + "checkedAt": "2026-08-08T03:27:09.693Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 查询统一订单详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/2085930785815724033?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "5ac6bd62-a1b5-4122-bd2b-77bc87a08417, d929bac3-50ec-49ec-a61d-b99dfed8bead", + "traceId": "b37372b831fc40a595a291a43ea7050c", + "evidence": "", + "checkedAt": "2026-08-08T03:27:09.733Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 统一订单详情身份与待审核状态正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/2085930785815724033?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "5ac6bd62-a1b5-4122-bd2b-77bc87a08417, d929bac3-50ec-49ec-a61d-b99dfed8bead", + "traceId": "b37372b831fc40a595a291a43ea7050c", + "evidence": "mainStatus=PENDING_REVIEW, timeline=2", + "checkedAt": "2026-08-08T03:27:09.733Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 查询头程订单列表", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg?tenantId=10001&keyword=FL2085930785815724033&page=1&size=100" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "1af43403-6da9-4238-9e45-76e98a2c3e60, 9d0034ea-7029-44f2-bdb4-1014f266f336", + "traceId": "8e501fcef1634152934159154a6acbab", + "evidence": "", + "checkedAt": "2026-08-08T03:27:09.768Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 头程订单列表只核对本轮订单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg?tenantId=10001&keyword=FL2085930785815724033&page=1&size=100" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "1af43403-6da9-4238-9e45-76e98a2c3e60, 9d0034ea-7029-44f2-bdb4-1014f266f336", + "traceId": "8e501fcef1634152934159154a6acbab", + "evidence": "orderId=2085930785815724033, found=true", + "checkedAt": "2026-08-08T03:27:09.768Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 查询头程订单详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/2085930785815724033?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "3e89f1f8-a6da-4011-a655-3cf1ec8112e8, cd15fe13-67fc-4f30-b03e-4787a87b3528", + "traceId": "5c0aa5c79fbe4f0b94bec7b522c6838b", + "evidence": "", + "checkedAt": "2026-08-08T03:27:09.816Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 头程订单详情聚合结构完整", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/2085930785815724033?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "3e89f1f8-a6da-4011-a655-3cf1ec8112e8, cd15fe13-67fc-4f30-b03e-4787a87b3528", + "traceId": "5c0aa5c79fbe4f0b94bec7b522c6838b", + "evidence": "cargoes=4, history=2", + "checkedAt": "2026-08-08T03:27:09.816Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "四箱型产品字段及图片契约完整回显", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/2085930785815724033?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "3e89f1f8-a6da-4011-a655-3cf1ec8112e8, cd15fe13-67fc-4f30-b03e-4787a87b3528", + "traceId": "5c0aa5c79fbe4f0b94bec7b522c6838b", + "evidence": "cargoes=4, imageFileId=2085930785350156289", + "checkedAt": "2026-08-08T03:27:09.816Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 为本轮订单添加内部备注", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/orders/first-leg/2085930785815724033/internal-notes?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "6d8a4151-62dd-4bec-b558-e7773fc18593, 9b1927ee-80db-48b0-83a3-e80617ab8e94", + "traceId": "b1e36c26a0cf4b179e2a34b2932b62b9", + "evidence": "", + "checkedAt": "2026-08-08T03:27:09.862Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 审核通过本轮订单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/orders/first-leg/2085930785815724033/approve?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "cef36ec2-a9ce-4936-adfb-151463743e93, 4fb695da-a66b-4f17-82be-9e15e4e89d52", + "traceId": "d083000a99884256a04fe049637607c8", + "evidence": "orderId=2085930785815724033", + "checkedAt": "2026-08-08T03:27:09.915Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "审核后生成隔离入库单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/2085930785815724033?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "8daa8b40-689d-4b34-9eaa-cfa5aeb9eead, 551270c0-03d8-4d21-8d1a-14cbfd76a1d9", + "traceId": "a664bcf02c144639ad8c5d779abe99ff", + "evidence": "inboundId=2085930789957578753", + "checkedAt": "2026-08-08T03:27:11.048Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "Admin 查询本轮入库单详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085930789957578753?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "fa9d14e7-1f00-4185-ac67-af9c6eb112a3, 45c1ed15-db5e-44e7-b52b-1953bdebe979", + "traceId": "7e5962ffae8f4cfb9384bed22cd39828", + "evidence": "inboundId=2085930789957578753", + "checkedAt": "2026-08-08T03:27:11.107Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "隔离入库单 marker 来源与可测量状态正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085930789957578753?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "fa9d14e7-1f00-4185-ac67-af9c6eb112a3, 45c1ed15-db5e-44e7-b52b-1953bdebe979", + "traceId": "7e5962ffae8f4cfb9384bed22cd39828", + "evidence": "markerFound=true, status=WAIT_MEASURE", + "checkedAt": "2026-08-08T03:27:11.107Z" + }, + { + "module": "orders", + "scenario": null, + "name": "入库单详情包含托盘库位、文件、备注和状态历史", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085930789957578753?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "fa9d14e7-1f00-4185-ac67-af9c6eb112a3, 45c1ed15-db5e-44e7-b52b-1953bdebe979", + "traceId": "7e5962ffae8f4cfb9384bed22cd39828", + "evidence": "inboundId=2085930789957578753, history=1", + "checkedAt": "2026-08-08T03:27:11.107Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 查询入库单列表", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds?tenantId=10001&inboundCode=RK-2085930785815724033&page=1&size=100" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "7bd82354-d930-44a8-bca1-5ca2f9719bae, c2971aac-895b-448a-a613-bcd7766b198a", + "traceId": "acf3a0f63adc4ac9aeb5569bdee7fb1f", + "evidence": "", + "checkedAt": "2026-08-08T03:27:11.168Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 入库单列表只核对本轮入库单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds?tenantId=10001&inboundCode=RK-2085930785815724033&page=1&size=100" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "7bd82354-d930-44a8-bca1-5ca2f9719bae, c2971aac-895b-448a-a613-bcd7766b198a", + "traceId": "acf3a0f63adc4ac9aeb5569bdee7fb1f", + "evidence": "inboundId=2085930789957578753, total=1", + "checkedAt": "2026-08-08T03:27:11.168Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "Admin 查询本轮订单履约任务", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/tasks/by-order/2085930785815724033?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "38b0b58d-5c46-48f1-bd33-c177129ffe45, 3279b087-6bf5-4e6d-9519-379ed4845584", + "traceId": "0451b7cb00c14decbdb4cac4c3bad9f7", + "evidence": "新订单应生成可查询的履约任务", + "checkedAt": "2026-08-08T03:27:11.214Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "履约任务与本轮订单和客户一致", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/tasks/by-order/2085930785815724033?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "38b0b58d-5c46-48f1-bd33-c177129ffe45, 3279b087-6bf5-4e6d-9519-379ed4845584", + "traceId": "0451b7cb00c14decbdb4cac4c3bad9f7", + "evidence": "taskId=2085930789932412929, status=PENDING_ASSIGNMENT", + "checkedAt": "2026-08-08T03:27:11.214Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 查询本轮履约任务分配历史", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/tasks/2085930789932412929/assignment-history?tenantId=10001&page=1&size=20" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "b5d74592-2df0-4559-a384-71b8bb56286a, b5e47099-94e2-424c-b8a8-db4668435f33", + "traceId": "7854e4938c34497d8a63aa3a0b967a3b", + "evidence": "", + "checkedAt": "2026-08-08T03:27:11.273Z" + }, + { + "module": "orders", + "scenario": null, + "name": "履约分配历史分页结构正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/tasks/2085930789932412929/assignment-history?tenantId=10001&page=1&size=20" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "b5d74592-2df0-4559-a384-71b8bb56286a, b5e47099-94e2-424c-b8a8-db4668435f33", + "traceId": "7854e4938c34497d8a63aa3a0b967a3b", + "evidence": "taskId=2085930789932412929, total=0", + "checkedAt": "2026-08-08T03:27:11.273Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 受理本轮订单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/orders/first-leg/2085930785815724033/accept?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "1c0bda5e-a43d-49a5-ad13-c3c95faf5d30, bd2bb922-1344-4085-ac06-027a420b0cff", + "traceId": "9ec870d71372460291c8d8d630d94233", + "evidence": "", + "checkedAt": "2026-08-08T03:27:11.306Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 启动本轮订单履约", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/orders/first-leg/2085930785815724033/start?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "af47cd0c-db3c-44a1-ab6e-96ae13ff7a5b, 25e196ef-c430-4ee2-80d8-af7f2a7fa172", + "traceId": "9a2ef5ca63d940348ec480c6c80c4bec", + "evidence": "", + "checkedAt": "2026-08-08T03:27:11.337Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 回查本轮订单履约状态", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/2085930785815724033?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "f06d7c5d-64b9-45e6-a3ca-f6a6a89fdb29, 5daedd0c-5a67-4319-b4d3-e75e79424d59", + "traceId": "c64fe6fcdb8443e4a8608a5a3cb3940c", + "evidence": "", + "checkedAt": "2026-08-08T03:27:11.366Z" + }, + { + "module": "orders", + "scenario": null, + "name": "本轮订单已进入处理中且保留状态历史", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/2085930785815724033?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "f06d7c5d-64b9-45e6-a3ca-f6a6a89fdb29, 5daedd0c-5a67-4319-b4d3-e75e79424d59", + "traceId": "c64fe6fcdb8443e4a8608a5a3cb3940c", + "evidence": "status=PROCESSING, history=5", + "checkedAt": "2026-08-08T03:27:11.366Z" + }, + { + "module": "pricing", + "scenario": "price-book-lifecycle", + "name": "查询发布前船期价格版本", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/fba-pricing/carrier-rates/price-books" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "548ef9a1-a62b-4e18-b062-07914859b0bc, 10dbb4bf-a777-43ea-9f8a-f3c069b9ae05", + "traceId": "81ef366e36794370ba52359e2761f994", + "evidence": "", + "checkedAt": "2026-08-08T03:27:11.396Z" + }, + { + "module": "pricing", + "scenario": "price-book-lifecycle", + "name": "发布前最多一份生效版本", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/fba-pricing/carrier-rates/price-books" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "548ef9a1-a62b-4e18-b062-07914859b0bc, 10dbb4bf-a777-43ea-9f8a-f3c069b9ae05", + "traceId": "81ef366e36794370ba52359e2761f994", + "evidence": "versions=10, active=1", + "checkedAt": "2026-08-08T03:27:11.396Z" + }, + { + "module": "pricing", + "scenario": "price-book-lifecycle", + "name": "船期价格测试文件已隔离", + "passed": true, + "deploymentBlocker": false, + "request": null, + "http": null, + "code": null, + "message": null, + "requestId": null, + "traceId": null, + "evidence": "fileName=ADMIN-API-20260808032703277-2026.08.03柏悦价格表 船期2026.08.12.xlsx, bytes=1343413, sha256=3170fd3aa8795cd816ca9600f87a6a2a06b15d0cf6042d4592f33d4b30c7b8ab", + "checkedAt": "2026-08-08T03:27:11.408Z" + }, + { + "module": "pricing", + "scenario": "price-book-lifecycle", + "name": "上传并解析船期价格表", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/fba-pricing/carrier-rates/price-books" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "04b4d399-4c8a-4816-b675-37c84c55db2e, 29601d0c-9859-4d04-860b-b47c6f531338", + "traceId": "9997fd771e964a32a8b51df6eb6b23a1", + "evidence": "fileName=ADMIN-API-20260808032703277-2026.08.03柏悦价格表 船期2026.08.12.xlsx, bytes=1343413, sha256=3170fd3aa8795cd816ca9600f87a6a2a06b15d0cf6042d4592f33d4b30c7b8ab", + "checkedAt": "2026-08-08T03:27:15.066Z" + }, + { + "module": "pricing", + "scenario": "price-book-lifecycle", + "name": "上传返回隔离的待确认版本", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/fba-pricing/carrier-rates/price-books" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "04b4d399-4c8a-4816-b675-37c84c55db2e, 29601d0c-9859-4d04-860b-b47c6f531338", + "traceId": "9997fd771e964a32a8b51df6eb6b23a1", + "evidence": "versionId=2085930794353209345, status=PENDING_CONFIRMATION, fileName=ADMIN-API-20260808032703277-2026.08.03柏悦价格表 船期2026.08.12.xlsx, shaMatched=true", + "checkedAt": "2026-08-08T03:27:15.066Z" + }, + { + "module": "pricing", + "scenario": "price-book-lifecycle", + "name": "解析出15个固定渠道且编码唯一", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/fba-pricing/carrier-rates/price-books" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "04b4d399-4c8a-4816-b675-37c84c55db2e, 29601d0c-9859-4d04-860b-b47c6f531338", + "traceId": "9997fd771e964a32a8b51df6eb6b23a1", + "evidence": "channelCount=15, unique=15, missing=none", + "checkedAt": "2026-08-08T03:27:15.066Z" + }, + { + "module": "pricing", + "scenario": "price-book-lifecycle", + "name": "解析价格行完整且可追溯到 Excel", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/fba-pricing/carrier-rates/price-books" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "04b4d399-4c8a-4816-b675-37c84c55db2e, 29601d0c-9859-4d04-860b-b47c6f531338", + "traceId": "9997fd771e964a32a8b51df6eb6b23a1", + "evidence": "rateCount=2157, declared=2157, valid=true", + "checkedAt": "2026-08-08T03:27:15.067Z" + }, + { + "module": "pricing", + "scenario": "price-book-lifecycle", + "name": "解析阻断仅包含可确认的仓库映射问题", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/fba-pricing/carrier-rates/price-books" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "04b4d399-4c8a-4816-b675-37c84c55db2e, 29601d0c-9859-4d04-860b-b47c6f531338", + "traceId": "9997fd771e964a32a8b51df6eb6b23a1", + "evidence": "blocking=0, unexpected=none, infrastructure=none", + "checkedAt": "2026-08-08T03:27:15.067Z" + }, + { + "module": "pricing", + "scenario": "price-book-lifecycle", + "name": "上传后回查价格版本列表", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/fba-pricing/carrier-rates/price-books" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "26208587-ce00-4ebc-9375-0986f4ccf7c3, 0bf07773-41de-4bf5-9740-a0dc9880abd3", + "traceId": "d93f8dbb639e43a4af70ab6c391c0c4f", + "evidence": "", + "checkedAt": "2026-08-08T03:27:15.123Z" + }, + { + "module": "pricing", + "scenario": "price-book-lifecycle", + "name": "上传只生成待确认版本且不替换当前生效版本", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/fba-pricing/carrier-rates/price-books" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "26208587-ce00-4ebc-9375-0986f4ccf7c3, 0bf07773-41de-4bf5-9740-a0dc9880abd3", + "traceId": "d93f8dbb639e43a4af70ab6c391c0c4f", + "evidence": "pending=PENDING_CONFIRMATION, activeBefore=2085910455296503809, activeAfterUpload=2085910455296503809", + "checkedAt": "2026-08-08T03:27:15.123Z" + }, + { + "module": "pricing", + "scenario": "price-book-lifecycle", + "name": "查询待确认版本渠道和价格预览", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/fba-pricing/carrier-rates/price-books/2085930794353209345" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "ae72f88c-c8ea-48cb-ba5b-fdfdb9a54d2b, 791d1cc0-4391-475f-8f1b-81a6685c3ee4", + "traceId": "64581584848a4a6ea031cc15715f77c0", + "evidence": "", + "checkedAt": "2026-08-08T03:27:15.272Z" + }, + { + "module": "pricing", + "scenario": "price-book-lifecycle", + "name": "详情与上传解析结果一致", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/fba-pricing/carrier-rates/price-books/2085930794353209345" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "ae72f88c-c8ea-48cb-ba5b-fdfdb9a54d2b, 791d1cc0-4391-475f-8f1b-81a6685c3ee4", + "traceId": "64581584848a4a6ea031cc15715f77c0", + "evidence": "versionId=2085930794353209345, channels=15, rates=2157, issues=2", + "checkedAt": "2026-08-08T03:27:15.272Z" + }, + { + "module": "pricing", + "scenario": "price-book-lifecycle", + "name": "下载原始 XLSX 且内容散列一致", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/fba-pricing/carrier-rates/price-books/2085930794353209345/source" + }, + "http": 200, + "code": null, + "message": "1343413 bytes (application/vnd.openxmlformats-officedocument.spreadsheetml.sheet)", + "requestId": "7da4a035-4056-4c3a-8719-961249a9046c, 17a76555-a3b7-48f6-9abd-c99716afad26, 5e50dcfe-16d8-4db4-8a16-63a1f125b8c4", + "traceId": "d88a0335dec549f8b69da4b5184f87fe, 85e7a88bca314e2da9722a8d0c4260f6", + "evidence": "bytes=1343413, contentType=application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, zipMagic=true, sha256=3170fd3aa8795cd816ca9600f87a6a2a06b15d0cf6042d4592f33d4b30c7b8ab", + "checkedAt": "2026-08-08T03:27:15.439Z" + }, + { + "module": "pricing", + "scenario": "price-book-lifecycle", + "name": "查询启用的平台公共国内仓", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/warehouse-admin?page=1&size=200&status=ACTIVE&warehouseType=DOMESTIC" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "d4b85c38-e48c-49a1-8279-59bef8dec262, 82f51398-aead-413f-93ad-0c489c8ebad6", + "traceId": "771f5739411440919d8d25d6c020c65d", + "evidence": "", + "checkedAt": "2026-08-08T03:27:15.488Z" + }, + { + "module": "pricing", + "scenario": "price-book-lifecycle", + "name": "查询启用的平台公共海外仓", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/warehouse-admin?page=1&size=200&status=ACTIVE&warehouseType=OVERSEAS" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "d0c45a9b-7168-423c-b0cd-e962cb6aa9e3, 74713883-f4e6-40ff-a990-874cecbbdc9d", + "traceId": "d508b6c4bb3c4610b31a59d017410fcc", + "evidence": "", + "checkedAt": "2026-08-08T03:27:15.538Z" + }, + { + "module": "pricing", + "scenario": "price-book-lifecycle", + "name": "国内起运仓和目的海外仓均精确映射", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/warehouse-admin?page=1&size=200&status=ACTIVE&warehouseType=OVERSEAS" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "d0c45a9b-7168-423c-b0cd-e962cb6aa9e3, 74713883-f4e6-40ff-a990-874cecbbdc9d", + "traceId": "d508b6c4bb3c4610b31a59d017410fcc", + "evidence": "origins=CN-DONGGUAN-01->193000000000200002,CN-YIWU-01->193000000000200001, overseas=纽约仓->193000000000200004,洛杉矶仓->193000000000200003, missing=none", + "checkedAt": "2026-08-08T03:27:15.539Z" + }, + { + "module": "pricing", + "scenario": "price-book-lifecycle", + "name": "确认仓库映射并立即生效", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/fba-pricing/carrier-rates/price-books/2085930794353209345/publish" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "6861872e-a951-41ee-9648-77f61021991d, 3a02c3fd-7555-4468-a54c-a561f06b7ce8", + "traceId": "9e97135855ef4d9ba2feab906acf63eb", + "evidence": "versionId=2085930794353209345, originMappings=2, overseasMappings=2", + "checkedAt": "2026-08-08T03:27:17.546Z" + }, + { + "module": "pricing", + "scenario": "price-book-lifecycle", + "name": "发布后价格版本为 ACTIVE 且无阻断", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/fba-pricing/carrier-rates/price-books/2085930794353209345/publish" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "6861872e-a951-41ee-9648-77f61021991d, 3a02c3fd-7555-4468-a54c-a561f06b7ce8", + "traceId": "9e97135855ef4d9ba2feab906acf63eb", + "evidence": "status=ACTIVE, blocking=0, publishedAt=2026-08-08T11:27:16.329, channels=15, rates=2157", + "checkedAt": "2026-08-08T03:27:17.547Z" + }, + { + "module": "pricing", + "scenario": "price-book-lifecycle", + "name": "发布后回查当前生效和历史版本", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/fba-pricing/carrier-rates/price-books" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "e672cdc7-3926-4e8a-a8c6-c9b641c13686, c214bde4-3b77-4278-bd21-0b5e6073f27f", + "traceId": "c351745758f64b8bade54e983a8f9c5b", + "evidence": "", + "checkedAt": "2026-08-08T03:27:17.606Z" + }, + { + "module": "pricing", + "scenario": "price-book-lifecycle", + "name": "始终只有一份当前生效版本", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/fba-pricing/carrier-rates/price-books" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "e672cdc7-3926-4e8a-a8c6-c9b641c13686, c214bde4-3b77-4278-bd21-0b5e6073f27f", + "traceId": "c351745758f64b8bade54e983a8f9c5b", + "evidence": "active=2085930794353209345", + "checkedAt": "2026-08-08T03:27:17.606Z" + }, + { + "module": "pricing", + "scenario": "price-book-lifecycle", + "name": "上一生效版本已保留为历史版本", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/fba-pricing/carrier-rates/price-books" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "e672cdc7-3926-4e8a-a8c6-c9b641c13686, c214bde4-3b77-4278-bd21-0b5e6073f27f", + "traceId": "c351745758f64b8bade54e983a8f9c5b", + "evidence": "previous=2085910455296503809, superseded=true", + "checkedAt": "2026-08-08T03:27:17.606Z" + }, + { + "module": "pricing", + "scenario": "price-book-lifecycle", + "name": "查询当前生效价格版本详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/fba-pricing/carrier-rates/price-books/2085930794353209345" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "9e3ffdfc-fa42-4b37-be48-d52401c4c024, 926ae581-eafd-436e-83a6-e416d382cf51", + "traceId": "53de774d96e04d7283788221197cbd04", + "evidence": "", + "checkedAt": "2026-08-08T03:27:17.720Z" + }, + { + "module": "pricing", + "scenario": "price-book-lifecycle", + "name": "当前生效版本预览数据完整", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/fba-pricing/carrier-rates/price-books/2085930794353209345" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "9e3ffdfc-fa42-4b37-be48-d52401c4c024, 926ae581-eafd-436e-83a6-e416d382cf51", + "traceId": "53de774d96e04d7283788221197cbd04", + "evidence": "status=ACTIVE, channels=15, rates=2157", + "checkedAt": "2026-08-08T03:27:17.720Z" + }, + { + "module": "pricing", + "scenario": "price-book-lifecycle", + "name": "已生效版本禁止重复发布", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/fba-pricing/carrier-rates/price-books/2085930794353209345/publish" + }, + "http": 200, + "code": "A0409", + "message": "只有待确认上传记录可以确认并生效", + "requestId": "f0542342-6782-497c-bbaa-5c512ad0a8df", + "traceId": "96c25e05c33e4cdba5b11eebb528ce07", + "evidence": "HTTP=200, code=A0409", + "checkedAt": "2026-08-08T03:27:17.761Z" + }, + { + "module": "pricing", + "scenario": "price-book-lifecycle", + "name": "重复发布被拒绝后回查版本状态", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/fba-pricing/carrier-rates/price-books" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "aa476fb6-1910-4217-8012-739c58c6de2b, d23ba837-18ef-40e2-a8ba-e1a3313b8aea", + "traceId": "c2c03aab73cc4a21818c0c0c5ab1a4d9", + "evidence": "", + "checkedAt": "2026-08-08T03:27:17.807Z" + }, + { + "module": "pricing", + "scenario": "price-book-lifecycle", + "name": "重复发布未改变唯一生效版本", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/fba-pricing/carrier-rates/price-books" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "aa476fb6-1910-4217-8012-739c58c6de2b, d23ba837-18ef-40e2-a8ba-e1a3313b8aea", + "traceId": "c2c03aab73cc4a21818c0c0c5ab1a4d9", + "evidence": "active=2085930794353209345", + "checkedAt": "2026-08-08T03:27:17.807Z" + }, + { + "module": "downloads", + "scenario": null, + "name": "创建客户列表导出任务", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/files/export-tasks" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "6468dd65-2ae6-423d-9653-91425c6d5977, 7070b11b-66a8-41d1-81b5-2a5673f30e09", + "traceId": "456c19bcfdfd41bbbbfcdd4dd69d4a27", + "evidence": "", + "checkedAt": "2026-08-08T03:27:17.892Z" + }, + { + "module": "downloads", + "scenario": null, + "name": "导出任务创建字段正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/files/export-tasks" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "6468dd65-2ae6-423d-9653-91425c6d5977, 7070b11b-66a8-41d1-81b5-2a5673f30e09", + "traceId": "456c19bcfdfd41bbbbfcdd4dd69d4a27", + "evidence": "taskId=2085930821039489026, status=PENDING", + "checkedAt": "2026-08-08T03:27:17.892Z" + }, + { + "module": "downloads", + "scenario": null, + "name": "查询下载中心任务列表", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/files/export-tasks?page=1&size=20&exportType=CUSTOMER_LIST" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "14d9d84c-640e-457e-a6a1-06606ad253aa, 1f62cda1-595f-432f-8b85-a43e48418eb3", + "traceId": "72bf048c925a4c739471653559aa16f7", + "evidence": "", + "checkedAt": "2026-08-08T03:27:17.947Z" + }, + { + "module": "downloads", + "scenario": null, + "name": "下载中心列表包含新任务", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/files/export-tasks?page=1&size=20&exportType=CUSTOMER_LIST" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "14d9d84c-640e-457e-a6a1-06606ad253aa, 1f62cda1-595f-432f-8b85-a43e48418eb3", + "traceId": "72bf048c925a4c739471653559aa16f7", + "evidence": "records=6", + "checkedAt": "2026-08-08T03:27:17.947Z" + }, + { + "module": "downloads", + "scenario": null, + "name": "轮询导出任务直到终态", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/files/export-tasks/2085930821039489026" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "e0ad71fc-9d35-425c-aed7-7bc6c75e7edd, 789c0c2e-45a2-42fa-92cf-f4ad94ea7fe6", + "traceId": "2fe9b0a9da90428a915860248401ef48", + "evidence": "status=SUCCEEDED, processedRows=0", + "checkedAt": "2026-08-08T03:27:24.093Z" + }, + { + "module": "downloads", + "scenario": null, + "name": "查询导出任务详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/files/export-tasks/2085930821039489026" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "db3887bc-a814-4e94-8c85-8ec225edecd7, 14ca2c15-809e-4f01-aca8-d42db4035de1", + "traceId": "416833d0366e47309d233e7c9f61f950", + "evidence": "", + "checkedAt": "2026-08-08T03:27:24.136Z" + }, + { + "module": "downloads", + "scenario": null, + "name": "导出详情行数和文件元数据正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/files/export-tasks/2085930821039489026" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "db3887bc-a814-4e94-8c85-8ec225edecd7, 14ca2c15-809e-4f01-aca8-d42db4035de1", + "traceId": "416833d0366e47309d233e7c9f61f950", + "evidence": "processedRows=0, sizeBytes=4066", + "checkedAt": "2026-08-08T03:27:24.136Z" + }, + { + "module": "downloads", + "scenario": null, + "name": "下载并校验客户列表 XLSX", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/files/export-tasks/2085930821039489026/download" + }, + "http": 200, + "code": null, + "message": "4066 bytes (application/vnd.openxmlformats-officedocument.spreadsheetml.sheet)", + "requestId": "b1237732-6e73-48cc-ae84-99b0eab9aeab, f0893344-6dca-4831-b989-37d6b9f11e95", + "traceId": "1f1c93c510cd46cd97ac46d4c6becbc7", + "evidence": "bytes=4066, contentType=application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + "checkedAt": "2026-08-08T03:27:24.161Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "仅选择带本轮测试标记的可编辑入库单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085930789957578753?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "fba54f35-0c2c-4827-85be-af32b2b45c3e, 6ccb22b1-83ce-4397-a120-218891fa0d24", + "traceId": "0ab607e0a00446199ecb6bbc3ada73bf", + "evidence": "tenantId=10001, inboundId=2085930789957578753, status=WAIT_MEASURE", + "checkedAt": "2026-08-08T03:27:24.203Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "读取 OCR 测试前重量工作区", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/inbounds/2085930789957578753/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "9ba40b7e-8a9a-473d-87ce-337a0e47e6f0, 28f1559f-77a7-48e8-bcb0-4f8458f2cbcd", + "traceId": "b5bc023a9ad645ffa185a945e790d08b", + "evidence": "inboundId=2085930789957578753", + "checkedAt": "2026-08-08T03:27:24.251Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "测试入库单身份与基线可追踪", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/inbounds/2085930789957578753/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "9ba40b7e-8a9a-473d-87ce-337a0e47e6f0, 28f1559f-77a7-48e8-bcb0-4f8458f2cbcd", + "traceId": "b5bc023a9ad645ffa185a945e790d08b", + "evidence": "existingResults=0, baselineWeight=null", + "checkedAt": "2026-08-08T03:27:24.251Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "未认证请求不能上传称重图片", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/files/measurements/10001/2085930789957578753" + }, + "http": 401, + "code": "A0401", + "message": "未登录或令牌已失效", + "requestId": "3ad5915c-856", + "traceId": null, + "evidence": "HTTP=401, code=A0401", + "checkedAt": "2026-08-08T03:27:24.273Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "非图片类型被拒绝且不模拟成功", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/files/measurements/10001/2085930789957578753" + }, + "http": 200, + "code": "A0400", + "message": "称重图片仅支持JPG、PNG、BMP", + "requestId": "0a56b8b7-7449-435a-aaec-19470ce3541c", + "traceId": "cd9d153044764744b06ae1179feed617", + "evidence": "HTTP=200, code=A0400", + "checkedAt": "2026-08-08T03:27:24.304Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "超过5MB图片被拒绝", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/files/measurements/10001/2085930789957578753" + }, + "http": 200, + "code": "A0400", + "message": "称重图片不能超过5MB", + "requestId": "58407ce0-29fc-49f0-a3f3-93ac90f9d47a", + "traceId": "b4fdc9a4a11640d49851c2a8c07e62aa", + "evidence": "HTTP=200, code=A0400", + "checkedAt": "2026-08-08T03:27:24.608Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "上传称重图片并执行 OCR", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/files/measurements/10001/2085930789957578753" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "ec759fc8-c5f9-4451-ac1c-e1bfc186d3bf, 92c67b42-ed28-4c74-8ed9-b406cc691e67", + "traceId": "b7e888b80be04a4a9c2c6e2c562db695", + "evidence": "file=orig_1cf27695-b2c3-44b3-98e3-c0be8b80f79a.JPG, size=3701469", + "checkedAt": "2026-08-08T03:27:25.992Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "上传响应保持文件 ID 字符串契约", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/files/measurements/10001/2085930789957578753" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "ec759fc8-c5f9-4451-ac1c-e1bfc186d3bf, 92c67b42-ed28-4c74-8ed9-b406cc691e67", + "traceId": "b7e888b80be04a4a9c2c6e2c562db695", + "evidence": "fileIdType=string, status=RECOGNIZED", + "checkedAt": "2026-08-08T03:27:25.992Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "OCR 上传响应字段完整且置信度受限", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/files/measurements/10001/2085930789957578753" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "ec759fc8-c5f9-4451-ac1c-e1bfc186d3bf, 92c67b42-ed28-4c74-8ed9-b406cc691e67", + "traceId": "b7e888b80be04a4a9c2c6e2c562db695", + "evidence": "status=RECOGNIZED, hasWeight=true, confidence=0.50972", + "checkedAt": "2026-08-08T03:27:25.992Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "重试当前称重图片 OCR", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/files/measurements/10001/2085930789957578753/2085930851393667074/recognize" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "2ec5a15c-be68-4e36-97b6-378d33de6962, 1b177c6e-60f9-44d8-a5f7-48b67a27d479", + "traceId": "4b54090dacde4c41840f56527d4eff6f", + "evidence": "fileId=2085930851393667074", + "checkedAt": "2026-08-08T03:27:26.909Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "OCR 重试保持文件身份并返回识别契约", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/files/measurements/10001/2085930789957578753/2085930851393667074/recognize" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "2ec5a15c-be68-4e36-97b6-378d33de6962, 1b177c6e-60f9-44d8-a5f7-48b67a27d479", + "traceId": "4b54090dacde4c41840f56527d4eff6f", + "evidence": "sameFile=true, status=RECOGNIZED", + "checkedAt": "2026-08-08T03:27:26.909Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "登记 OCR 原值", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/first-leg/inbounds/2085930789957578753/weight-results?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "5655e905-4340-4188-a1de-d9dbfd7150ae, c763284f-d408-488b-8d9f-532d3603a0a6", + "traceId": "4635189827fe41a592bc24159ba64c5e", + "evidence": "fileId=2085930851393667074", + "checkedAt": "2026-08-08T03:27:26.958Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "重量结果 ID、文件 ID 和初始版本契约正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/first-leg/inbounds/2085930789957578753/weight-results?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "5655e905-4340-4188-a1de-d9dbfd7150ae, c763284f-d408-488b-8d9f-532d3603a0a6", + "traceId": "4635189827fe41a592bc24159ba64c5e", + "evidence": "resultIdType=string, fileIdType=string, version=0", + "checkedAt": "2026-08-08T03:27:26.958Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "鉴权读取原始称重图片", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/files/measurements/10001/2085930789957578753/2085930851393667074" + }, + "http": 200, + "code": null, + "message": "3701469 bytes (image/jpeg)", + "requestId": "6cac2bde-31ec-4531-81b1-2858be5ffa73, 7d886619-02d5-4854-b9fa-21516506e337", + "traceId": "35c6c6ad34164e61a6ccb84dfad0f5f2", + "evidence": "contentType=image/jpeg, bytes=3701469", + "checkedAt": "2026-08-08T03:27:27.169Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "缩略图返回受限尺寸 JPEG", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/files/measurements/10001/2085930789957578753/2085930851393667074/thumbnail" + }, + "http": 200, + "code": null, + "message": "18677 bytes (image/jpeg)", + "requestId": "b08f1734-35d7-45e3-b770-6887c9d3ceb6, de010aa0-2c77-4361-b1c3-e1c750ee5d90", + "traceId": "53003bd8a23646c4b70b686bf818ad56", + "evidence": "contentType=image/jpeg, bytes=18677, dimensions=240x320", + "checkedAt": "2026-08-08T03:27:27.565Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "登记后回查 OCR 重量结果", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/inbounds/2085930789957578753/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "ec64215e-ed0d-4a0b-b9ac-e87d8868a839, 0d5630de-4028-470a-991e-88ba75c840fc", + "traceId": "395f75a5a44f4650baa6767df22e9cfb", + "evidence": "inboundId=2085930789957578753", + "checkedAt": "2026-08-08T03:27:27.597Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "工作区保留本轮 OCR 原值且未覆盖历史结果", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/inbounds/2085930789957578753/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "ec64215e-ed0d-4a0b-b9ac-e87d8868a839, 0d5630de-4028-470a-991e-88ba75c840fc", + "traceId": "395f75a5a44f4650baa6767df22e9cfb", + "evidence": "resultFound=true, baselineCount=0, currentCount=1", + "checkedAt": "2026-08-08T03:27:27.597Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "旧版本确认返回并发冲突", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/first-leg/inbounds/2085930789957578753/weight-results/2085930859155206145/confirm?tenantId=10001" + }, + "http": 200, + "code": "A0409", + "message": "数据版本已变化,请刷新后重试", + "requestId": "eb5b451e-4774-4075-8a86-79a578700213", + "traceId": "adaa77b1a8fe413e85bbb37b5067e4ab", + "evidence": "HTTP=200, code=A0409", + "checkedAt": "2026-08-08T03:27:27.632Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "确认 OCR 重量并计入实际总毛重", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/first-leg/inbounds/2085930789957578753/weight-results/2085930859155206145/confirm?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "28d3eb2b-88bb-4fbf-a1e5-8d19a2519e56, fe86b2c6-cffc-488d-8112-afb91ff90ef1", + "traceId": "373947e849c6480b8bb9669dc7f1916b", + "evidence": "usedOriginal=true", + "checkedAt": "2026-08-08T03:27:27.696Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "确认结果状态、版本和最终KG正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/first-leg/inbounds/2085930789957578753/weight-results/2085930859155206145/confirm?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "28d3eb2b-88bb-4fbf-a1e5-8d19a2519e56, fe86b2c6-cffc-488d-8112-afb91ff90ef1", + "traceId": "373947e849c6480b8bb9669dc7f1916b", + "evidence": "status=CONFIRMED, version=1, finalKg=285.5", + "checkedAt": "2026-08-08T03:27:27.696Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "确认后回查实际总毛重", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/inbounds/2085930789957578753/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "d23e6db4-99fc-4732-9a68-06ca2965f63e, ae82a5ce-74a9-4a13-8048-7c0c0fee522f", + "traceId": "16771984585b4c52a8d988e6066f3c46", + "evidence": "inboundId=2085930789957578753", + "checkedAt": "2026-08-08T03:27:27.738Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "确认后实际总毛重按服务端结果重算", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/inbounds/2085930789957578753/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "d23e6db4-99fc-4732-9a68-06ca2965f63e, ae82a5ce-74a9-4a13-8048-7c0c0fee522f", + "traceId": "16771984585b4c52a8d988e6066f3c46", + "evidence": "baseline=null, added=285.5, actual=285.5", + "checkedAt": "2026-08-08T03:27:27.738Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "旧版本删除返回并发冲突", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "DELETE", + "path": "/api/platform/v1/first-leg/inbounds/2085930789957578753/weight-results/2085930859155206145?tenantId=10001&version=0" + }, + "http": 200, + "code": "A0409", + "message": "数据版本已变化,请刷新后重试", + "requestId": "b1d1036e-0d8a-4509-baa1-f63cc02debd9", + "traceId": "caaab9abecf04623be3e355f96f0b49d", + "evidence": "HTTP=200, code=A0409", + "checkedAt": "2026-08-08T03:27:27.772Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "删除本轮已确认图片及重量结果", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "DELETE", + "path": "/api/platform/v1/first-leg/inbounds/2085930789957578753/weight-results/2085930859155206145?tenantId=10001&version=1" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "24664dc9-2943-47c9-b6e7-d5b906c2a154, 9d11d61b-9bb1-4866-86c5-7124b5fb2786", + "traceId": "8d72a4b86bfb46858942d4e6e70a9c64", + "evidence": "resultId=2085930859155206145, version=1", + "checkedAt": "2026-08-08T03:27:27.832Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "删除后回查重量工作区", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/inbounds/2085930789957578753/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "c2615b91-7379-4b24-a0c3-05afa9e971dd, a1a028cd-cd4c-4ad5-9f75-f433f79a040d", + "traceId": "907d6ba4bb79498193abd389c25c7a2c", + "evidence": "inboundId=2085930789957578753", + "checkedAt": "2026-08-08T03:27:27.878Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "删除后结果消失且总毛重恢复基线", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/inbounds/2085930789957578753/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "c2615b91-7379-4b24-a0c3-05afa9e971dd, a1a028cd-cd4c-4ad5-9f75-f433f79a040d", + "traceId": "907d6ba4bb79498193abd389c25c7a2c", + "evidence": "resultMissing=true, baseline=null, actual=null", + "checkedAt": "2026-08-08T03:27:27.878Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "删除结果后原始图片不可再读取", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/files/measurements/10001/2085930789957578753/2085930851393667074" + }, + "http": 200, + "code": "A0404", + "message": "称重图片不存在", + "requestId": "895d6761-05f9-418a-bdeb-d711f375e333", + "traceId": "57d03b8e0a6041fab1526fcdf83cf6e9", + "evidence": "HTTP=200, code=A0404", + "checkedAt": "2026-08-08T03:27:27.925Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "上传称重图片并执行 OCR", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/files/measurements/10001/2085930789957578753" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "19757b62-dffe-4373-bc8e-b48cfb554612, 2578fa96-b817-42ad-9246-cf5d4ded4521", + "traceId": "6258a81e0b864db6ae567b345c653e68", + "evidence": "file=orig_1cf27695-b2c3-44b3-98e3-c0be8b80f79a.JPG, size=3701469", + "checkedAt": "2026-08-08T03:27:29.259Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "上传响应保持文件 ID 字符串契约", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/files/measurements/10001/2085930789957578753" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "19757b62-dffe-4373-bc8e-b48cfb554612, 2578fa96-b817-42ad-9246-cf5d4ded4521", + "traceId": "6258a81e0b864db6ae567b345c653e68", + "evidence": "fileIdType=string, status=RECOGNIZED", + "checkedAt": "2026-08-08T03:27:29.259Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "OCR 上传响应字段完整且置信度受限", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/files/measurements/10001/2085930789957578753" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "19757b62-dffe-4373-bc8e-b48cfb554612, 2578fa96-b817-42ad-9246-cf5d4ded4521", + "traceId": "6258a81e0b864db6ae567b345c653e68", + "evidence": "status=RECOGNIZED, hasWeight=true, confidence=0.50972", + "checkedAt": "2026-08-08T03:27:29.259Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "登记人工录入重量结果", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/first-leg/inbounds/2085930789957578753/weight-results?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "b1db7167-cb1e-4a6a-b1e4-33397c806844, 2eebd91d-0819-418c-814f-a42963c357df", + "traceId": "953a9b73d2814db1b95255c36164c517", + "evidence": "fileId=2085930865226481665", + "checkedAt": "2026-08-08T03:27:29.295Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "重量结果 ID、文件 ID 和初始版本契约正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/first-leg/inbounds/2085930789957578753/weight-results?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "b1db7167-cb1e-4a6a-b1e4-33397c806844, 2eebd91d-0819-418c-814f-a42963c357df", + "traceId": "953a9b73d2814db1b95255c36164c517", + "evidence": "resultIdType=string, fileIdType=string, version=0", + "checkedAt": "2026-08-08T03:27:29.295Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "零重量确认被拒绝", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/first-leg/inbounds/2085930789957578753/weight-results/2085930868932128770/confirm?tenantId=10001" + }, + "http": 200, + "code": "A0422", + "message": "adjustedWeightValue: must be greater than or equal to 0.001", + "requestId": "6d028e50-80c0-4921-9d82-c71a44eafa50", + "traceId": "0392de4e0da741adab21ef607f50e149", + "evidence": "HTTP=200, code=A0422", + "checkedAt": "2026-08-08T03:27:29.390Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "零重量确认被拒绝后回查工作区", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/inbounds/2085930789957578753/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "9209e72d-eb3f-4a13-9d00-e5957dc5a474, a1b85f36-97a2-4c6c-8c69-569356eefad2", + "traceId": "150894cb86854c17987caaa41b663b2f", + "evidence": "inboundId=2085930789957578753", + "checkedAt": "2026-08-08T03:27:29.434Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "零重量确认被拒绝未改变重量结果", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/inbounds/2085930789957578753/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "9209e72d-eb3f-4a13-9d00-e5957dc5a474, a1b85f36-97a2-4c6c-8c69-569356eefad2", + "traceId": "150894cb86854c17987caaa41b663b2f", + "evidence": "version=0, status=NEEDS_MANUAL", + "checkedAt": "2026-08-08T03:27:29.434Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "负重量确认被拒绝", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/first-leg/inbounds/2085930789957578753/weight-results/2085930868932128770/confirm?tenantId=10001" + }, + "http": 200, + "code": "A0422", + "message": "adjustedWeightValue: must be greater than or equal to 0.001", + "requestId": "17eac2e5-5ec4-483b-b64f-ea1d80832401", + "traceId": "0ec032c81feb460ab6348cf00a4f4cdd", + "evidence": "HTTP=200, code=A0422", + "checkedAt": "2026-08-08T03:27:29.469Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "负重量确认被拒绝后回查工作区", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/inbounds/2085930789957578753/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "84328d62-66c8-4d3d-bdc5-5c9e6160ee17, aee03092-574a-45da-b227-bddcc8cfd172", + "traceId": "1d3da31827d848c7830fc8f645a77a09", + "evidence": "inboundId=2085930789957578753", + "checkedAt": "2026-08-08T03:27:29.513Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "负重量确认被拒绝未改变重量结果", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/inbounds/2085930789957578753/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "84328d62-66c8-4d3d-bdc5-5c9e6160ee17, aee03092-574a-45da-b227-bddcc8cfd172", + "traceId": "1d3da31827d848c7830fc8f645a77a09", + "evidence": "version=0, status=NEEDS_MANUAL", + "checkedAt": "2026-08-08T03:27:29.513Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "LB 0.001换算为零后被拒绝", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/first-leg/inbounds/2085930789957578753/weight-results/2085930868932128770/confirm?tenantId=10001" + }, + "http": 200, + "code": "A0422", + "message": "换算后重量不能小于 0.001 KG", + "requestId": "b9a1d803-a242-4e4c-8b4e-b1b9c656a5bd", + "traceId": "7217dad550924528a8e55dbcb52bd7f5", + "evidence": "HTTP=200, code=A0422", + "checkedAt": "2026-08-08T03:27:29.541Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "LB 0.001换算为零后被拒绝后回查工作区", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/inbounds/2085930789957578753/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "88f7a6fd-0900-4f95-acd1-7ac0ec3f2df7, 0df123b3-a286-4828-a7be-f91746eb4f56", + "traceId": "9ffd7f7c3ae54c739bf911b1f36ac1af", + "evidence": "inboundId=2085930789957578753", + "checkedAt": "2026-08-08T03:27:29.571Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "LB 0.001换算为零后被拒绝未改变重量结果", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/inbounds/2085930789957578753/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "88f7a6fd-0900-4f95-acd1-7ac0ec3f2df7, 0df123b3-a286-4828-a7be-f91746eb4f56", + "traceId": "9ffd7f7c3ae54c739bf911b1f36ac1af", + "evidence": "version=0, status=NEEDS_MANUAL", + "checkedAt": "2026-08-08T03:27:29.572Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "超出15位整数重量被拒绝", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/first-leg/inbounds/2085930789957578753/weight-results/2085930868932128770/confirm?tenantId=10001" + }, + "http": 200, + "code": "A0422", + "message": "adjustedWeightValue: numeric value out of bounds (<15 digits>.<3 digits> expected)", + "requestId": "7cf910ac-7ef5-404e-a768-f46932d1ccd9", + "traceId": "c4e43ab29af94960916e69dea18fe1c9", + "evidence": "HTTP=200, code=A0422", + "checkedAt": "2026-08-08T03:27:29.602Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "超出15位整数重量被拒绝后回查工作区", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/inbounds/2085930789957578753/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "35cc80e7-bdbe-4e33-b4eb-c134dd7f31c1, b5bc4038-5768-4a2a-bbeb-9305f0322c66", + "traceId": "ac2cb720e40e4cdab02288d26957830b", + "evidence": "inboundId=2085930789957578753", + "checkedAt": "2026-08-08T03:27:29.640Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "超出15位整数重量被拒绝未改变重量结果", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/inbounds/2085930789957578753/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "35cc80e7-bdbe-4e33-b4eb-c134dd7f31c1, b5bc4038-5768-4a2a-bbeb-9305f0322c66", + "traceId": "ac2cb720e40e4cdab02288d26957830b", + "evidence": "version=0, status=NEEDS_MANUAL", + "checkedAt": "2026-08-08T03:27:29.640Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "人工改重与确认原子完成", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/first-leg/inbounds/2085930789957578753/weight-results/2085930868932128770/confirm?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "fb482ca7-8f5a-41d0-8f0a-dc9f2ab63d3d, 8f6c881e-ae8c-4489-aca4-5df1c7d32d04", + "traceId": "f166a5aebd404d8da85ae1455271cb8e", + "evidence": "adjusted=10.125 LB", + "checkedAt": "2026-08-08T03:27:29.693Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "LB 人工改重保留输入并正确换算最终KG", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/first-leg/inbounds/2085930789957578753/weight-results/2085930868932128770/confirm?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "fb482ca7-8f5a-41d0-8f0a-dc9f2ab63d3d, 8f6c881e-ae8c-4489-aca4-5df1c7d32d04", + "traceId": "f166a5aebd404d8da85ae1455271cb8e", + "evidence": "adjusted=10.125 LB, finalKg=4.593, expectedKg=4.593", + "checkedAt": "2026-08-08T03:27:29.693Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "删除本轮人工改重图片及结果", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "DELETE", + "path": "/api/platform/v1/first-leg/inbounds/2085930789957578753/weight-results/2085930868932128770?tenantId=10001&version=2" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "ef82709f-5da3-47a5-8227-4b8f54254e48, fb40f73c-9f98-4d79-aaca-7ca62118ea2d", + "traceId": "98681d3a468048f79ba05c0b529d3c17", + "evidence": "resultId=2085930868932128770, version=2", + "checkedAt": "2026-08-08T03:27:29.742Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "删除后回查重量工作区", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/inbounds/2085930789957578753/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "b23cc608-7298-446d-bc0f-e4598022e3aa, ede04512-aa0e-4d7e-bf15-29e3cdfc1f82", + "traceId": "c689f2c8a9824879a6363699bf0138c5", + "evidence": "inboundId=2085930789957578753", + "checkedAt": "2026-08-08T03:27:29.777Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "删除后结果消失且总毛重恢复基线", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/inbounds/2085930789957578753/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "b23cc608-7298-446d-bc0f-e4598022e3aa, ede04512-aa0e-4d7e-bf15-29e3cdfc1f82", + "traceId": "c689f2c8a9824879a6363699bf0138c5", + "evidence": "resultMissing=true, baseline=null, actual=null", + "checkedAt": "2026-08-08T03:27:29.777Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "删除结果后原始图片不可再读取", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/files/measurements/10001/2085930789957578753/2085930865226481665" + }, + "http": 200, + "code": "A0404", + "message": "称重图片不存在", + "requestId": "65925ddd-24bc-4259-b6dc-e9672b02b4a6", + "traceId": "a7e1845cc36f40aabb34fb77be558c28", + "evidence": "HTTP=200, code=A0404", + "checkedAt": "2026-08-08T03:27:29.820Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "最终清理后回查重量工作区", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/inbounds/2085930789957578753/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "773d29a8-f92d-49ee-a9fd-b698a119eb7d, c50d69a7-7e08-418c-a0d3-1203af98459a", + "traceId": "d237cdc1469d4164921d98260f777677", + "evidence": "inboundId=2085930789957578753", + "checkedAt": "2026-08-08T03:27:29.857Z" + }, + { + "module": "inbound-weight-ocr", + "scenario": "weight-image-recognition-and-confirmation", + "name": "仅清理本轮结果且订单总毛重恢复运行前基线", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/inbounds/2085930789957578753/measurement?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "773d29a8-f92d-49ee-a9fd-b698a119eb7d, c50d69a7-7e08-418c-a0d3-1203af98459a", + "traceId": "d237cdc1469d4164921d98260f777677", + "evidence": "leftovers=0, baseline=null, actual=null", + "checkedAt": "2026-08-08T03:27:29.857Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "查询隔离入库单详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085930789957578753?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "b91d6d47-7a06-401e-b767-fb3fdefa6ae4, 25faa986-4260-4846-96a4-8dbd06238eef", + "traceId": "8070640b94834ff98cbd14ea854faddd", + "evidence": "inboundId=2085930789957578753, tenantId=10001", + "checkedAt": "2026-08-08T03:27:29.895Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "隔离入库单身份与可测量状态正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085930789957578753?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "b91d6d47-7a06-401e-b767-fb3fdefa6ae4, 25faa986-4260-4846-96a4-8dbd06238eef", + "traceId": "8070640b94834ff98cbd14ea854faddd", + "evidence": "identity=true, status=MEASURING", + "checkedAt": "2026-08-08T03:27:29.896Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "生成箱唛 PDF 并冻结稳定箱码", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/inbounds/2085930789957578753/carton-label-pdf?tenantId=10001" + }, + "http": 200, + "code": null, + "message": "13837 bytes (application/pdf)", + "requestId": "7465a3b2-dba5-4e1f-be4c-59f57300d004, c72bf345-554d-4efa-80ba-e415c27504b5, ea36d1a2-6de2-47ca-8c92-e3ffed18845c", + "traceId": "ea65b20904d24aa195a30100ee10d7a1, f9a4b799353f454ea2fd683854b8f007", + "evidence": "contentType=application/pdf, bytes=13837", + "checkedAt": "2026-08-08T03:27:30.410Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "首次打印后回查冻结箱数", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085930789957578753?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "f6acc27c-e204-4855-91d8-84b998a2c422, 5fbad2e7-0367-4e91-99cc-7d9e141f142d", + "traceId": "6bf05a9048d24323874ca5fb61f9e6ae", + "evidence": "", + "checkedAt": "2026-08-08T03:27:30.441Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "首次打印按订单货物冻结原始总箱数", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085930789957578753?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "f6acc27c-e204-4855-91d8-84b998a2c422, 5fbad2e7-0367-4e91-99cc-7d9e141f142d", + "traceId": "6bf05a9048d24323874ca5fb61f9e6ae", + "evidence": "inboundCodeStable=true, totalPackageCount=4", + "checkedAt": "2026-08-08T03:27:30.441Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "重复整单打印复用已冻结箱码映射", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/inbounds/2085930789957578753/carton-label-pdf?tenantId=10001" + }, + "http": 200, + "code": null, + "message": "13837 bytes (application/pdf)", + "requestId": "d0ba468b-270d-43b5-9324-68da2010edcc, 5c32706c-76c2-4b60-bc99-ee3da9d62729, 1e138325-1fff-4773-9960-810c45e1250e", + "traceId": "90e1e1e23952436c863b8bf270c606a7, 3daadeee8d90457d810c695f85ac2ab7", + "evidence": "boxCode=RK-2085930785815724033#4-1, contentType=application/pdf, bytes=13837", + "checkedAt": "2026-08-08T03:27:30.607Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "指定第1箱补打复用已冻结箱码映射", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/inbounds/2085930789957578753/carton-label-pdf?tenantId=10001&cartonIndex=1" + }, + "http": 200, + "code": null, + "message": "7667 bytes (application/pdf)", + "requestId": "4d8c2400-8b46-4956-98aa-b73893067540, 22ba630f-653b-49fb-803a-34f7b1338890, 5e9b3c95-ce58-40a6-9b63-44c9360de281", + "traceId": "744e5951733e40368df80e0601d2ac60, 2c1c381bc4614aeeb737bb8c3c48a571", + "evidence": "boxCode=RK-2085930785815724033#4-1, cartonIndex=1, contentType=application/pdf, bytes=7667", + "checkedAt": "2026-08-08T03:27:30.756Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "模拟墨家首次扫描单箱", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "POST", + "path": "/api/platform/v1/first-leg/inbounds/2085930789957578753/measurement/carton-scans?tenantId=10001" + }, + "http": 200, + "code": "A0409", + "message": "测量已提交,设备不能新增或覆盖数据", + "requestId": "e7a8aef5-5849-4d0c-9bdf-a868abf863fa", + "traceId": "8fb7b145a3c7497e89b3f72986bbdf26", + "evidence": "boxCode=RK-2085930785815724033#4-1, machineNo=MJ-ADMIN-E2E-01", + "checkedAt": "2026-08-08T03:27:30.794Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "首次扫描新增一条且默认代表1箱", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "POST", + "path": "/api/platform/v1/first-leg/inbounds/2085930789957578753/measurement/carton-scans?tenantId=10001" + }, + "http": 200, + "code": "A0409", + "message": "测量已提交,设备不能新增或覆盖数据", + "requestId": "e7a8aef5-5849-4d0c-9bdf-a868abf863fa", + "traceId": "8fb7b145a3c7497e89b3f72986bbdf26", + "evidence": "created=undefined, confirmedPackageCount=missing", + "checkedAt": "2026-08-08T03:27:30.794Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "重复打印及指定箱补打后原箱码仍可解析", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "POST", + "path": "/api/platform/v1/first-leg/inbounds/2085930789957578753/measurement/carton-scans?tenantId=10001" + }, + "http": 200, + "code": "A0409", + "message": "测量已提交,设备不能新增或覆盖数据", + "requestId": "e7a8aef5-5849-4d0c-9bdf-a868abf863fa", + "traceId": "8fb7b145a3c7497e89b3f72986bbdf26", + "evidence": "boxCodeStable=false, resolvedInboundId=2085930789957578753", + "checkedAt": "2026-08-08T03:27:30.794Z" + }, + { + "module": "supplemental", + "scenario": null, + "name": "order-service 状态响应使用统一成功体", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "77a1b382-643c-4810-90c7-ccb50623fbf8, c9ccabb9-8c9a-4d5e-99e4-ad2ec84f7567", + "traceId": "ebc981cd1a064e29a807125ebee3c5fa", + "evidence": "HTTP=200, code=200", + "checkedAt": "2026-08-08T03:27:30.826Z" + }, + { + "module": "supplemental", + "scenario": null, + "name": "order-service 状态字段完整且 readiness 语义明确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "77a1b382-643c-4810-90c7-ccb50623fbf8, c9ccabb9-8c9a-4d5e-99e4-ad2ec84f7567", + "traceId": "ebc981cd1a064e29a807125ebee3c5fa", + "evidence": "service=order-service, status=UP, readiness=UP", + "checkedAt": "2026-08-08T03:27:30.826Z" + }, + { + "module": "supplemental", + "scenario": null, + "name": "firstleg-service 状态响应使用统一成功体", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "4b686cd2-916f-4ac6-a67f-a8c774c21aa8, 1befe03e-5599-4e93-a31d-a956b8c43626", + "traceId": "361125588393419eb1d73828160be299", + "evidence": "HTTP=200, code=200", + "checkedAt": "2026-08-08T03:27:30.857Z" + }, + { + "module": "supplemental", + "scenario": null, + "name": "firstleg-service 状态字段完整且 readiness 语义明确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "4b686cd2-916f-4ac6-a67f-a8c774c21aa8, 1befe03e-5599-4e93-a31d-a956b8c43626", + "traceId": "361125588393419eb1d73828160be299", + "evidence": "service=firstleg-service, status=UP, readiness=UP", + "checkedAt": "2026-08-08T03:27:30.857Z" + }, + { + "module": "supplemental", + "scenario": null, + "name": "file-service 状态响应使用统一成功体", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/files/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "18fd86b7-2452-4235-b5e5-256f30649c65, 5428e81b-99d4-4c84-867c-7afe648ec9ad", + "traceId": "5da03c0247ff43eb9fb97d4c3fb40aa2", + "evidence": "HTTP=200, code=200", + "checkedAt": "2026-08-08T03:27:30.890Z" + }, + { + "module": "supplemental", + "scenario": null, + "name": "file-service 状态字段完整且 readiness 语义明确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/files/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "18fd86b7-2452-4235-b5e5-256f30649c65, 5428e81b-99d4-4c84-867c-7afe648ec9ad", + "traceId": "5da03c0247ff43eb9fb97d4c3fb40aa2", + "evidence": "service=file-service, status=UP, readiness=UP", + "checkedAt": "2026-08-08T03:27:30.890Z" + }, + { + "module": "supplemental", + "scenario": null, + "name": "warehouse-service 状态响应使用统一成功体", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/warehouses/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "240c5981-88b2-44c1-bcb4-9601fdd80ddb, b6b23d37-c1b1-476e-b947-c04896275b59", + "traceId": "779aeedd0422411cbbb7bb0caba5d2a6", + "evidence": "HTTP=200, code=200", + "checkedAt": "2026-08-08T03:27:30.920Z" + }, + { + "module": "supplemental", + "scenario": null, + "name": "warehouse-service 状态字段完整且 readiness 语义明确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/warehouses/status" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "240c5981-88b2-44c1-bcb4-9601fdd80ddb, b6b23d37-c1b1-476e-b947-c04896275b59", + "traceId": "779aeedd0422411cbbb7bb0caba5d2a6", + "evidence": "service=warehouse-service, status=UP, readiness=UP", + "checkedAt": "2026-08-08T03:27:30.920Z" + }, + { + "module": "supplemental", + "scenario": null, + "name": "平台接口未携带令牌返回 401", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/status" + }, + "http": 401, + "code": "A0401", + "message": "未登录或令牌已失效", + "requestId": "3ad5915c-897", + "traceId": null, + "evidence": "HTTP=401, code=A0401", + "checkedAt": "2026-08-08T03:27:30.934Z" + }, + { + "module": "supplemental", + "scenario": null, + "name": "平台接口伪造令牌返回 401", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/status" + }, + "http": 401, + "code": "A0401", + "message": "未登录或令牌已失效", + "requestId": "12070bc5-898", + "traceId": null, + "evidence": "HTTP=401, code=A0401", + "checkedAt": "2026-08-08T03:27:30.957Z" + }, + { + "module": "supplemental", + "scenario": null, + "name": "未认证请求不返回业务成功码", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/status" + }, + "http": 401, + "code": "A0401", + "message": "未登录或令牌已失效", + "requestId": "3ad5915c-899", + "traceId": null, + "evidence": "HTTP=401, code=A0401", + "checkedAt": "2026-08-08T03:27:30.974Z" + }, + { + "module": "supplemental", + "scenario": "master-data-readonly", + "name": "仓库分页查询", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/warehouse-admin?page=1&size=5&status=ACTIVE" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "facfc360-3598-4f15-ba2b-08e97b76f7d4, 4157b8b2-bbc0-4de5-8646-e86afab2d4c1", + "traceId": "231bc8755246491087ca5423d7005ff6", + "evidence": "path=/api/platform/v1/warehouse-admin?page=1&size=5&status=ACTIVE", + "checkedAt": "2026-08-08T03:27:31.003Z" + }, + { + "module": "supplemental", + "scenario": "master-data-readonly", + "name": "仓库分页结构与记录数组正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/warehouse-admin?page=1&size=5&status=ACTIVE" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "facfc360-3598-4f15-ba2b-08e97b76f7d4, 4157b8b2-bbc0-4de5-8646-e86afab2d4c1", + "traceId": "231bc8755246491087ca5423d7005ff6", + "evidence": "records=5, current=1, size=5", + "checkedAt": "2026-08-08T03:27:31.003Z" + }, + { + "module": "supplemental", + "scenario": "master-data-readonly", + "name": "仓库筛选分页查询", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/warehouse-admin?page=1&size=5&tenantId=0&warehouseType=FBA" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "21ecb4a2-e493-46eb-9d05-56af066dede1, cf8a9be1-cba9-4c88-9db8-678181e70b4e", + "traceId": "d9b872c713c84145aca7f30320985f5e", + "evidence": "path=/api/platform/v1/warehouse-admin?page=1&size=5&tenantId=0&warehouseType=FBA", + "checkedAt": "2026-08-08T03:27:31.032Z" + }, + { + "module": "supplemental", + "scenario": "master-data-readonly", + "name": "仓库筛选分页结构与记录数组正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/warehouse-admin?page=1&size=5&tenantId=0&warehouseType=FBA" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "21ecb4a2-e493-46eb-9d05-56af066dede1, cf8a9be1-cba9-4c88-9db8-678181e70b4e", + "traceId": "d9b872c713c84145aca7f30320985f5e", + "evidence": "records=5, current=1, size=5", + "checkedAt": "2026-08-08T03:27:31.032Z" + }, + { + "module": "supplemental", + "scenario": "master-data-readonly", + "name": "仓库非法状态安全失败", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/warehouse-admin?page=1&size=5&status=NOT_A_STATUS" + }, + "http": 200, + "code": "A0422", + "message": "status: must match \"ACTIVE|INACTIVE\"", + "requestId": "35eb0dd3-6dbd-469f-b928-9120da46bc36", + "traceId": "7749b2c76faa4fd3a30902eee13a5208", + "evidence": "HTTP=200, code=A0422", + "checkedAt": "2026-08-08T03:27:31.053Z" + }, + { + "module": "supplemental", + "scenario": "master-data-readonly", + "name": "仓库客户作用域安全失败", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/warehouse-admin?page=1&size=5&tenantId=10001" + }, + "http": 200, + "code": "A0400", + "message": "Platform resource scope must be 0 / 平台公共资源作用域必须为0", + "requestId": "588f2220-46a1-4f76-98bb-c7fbb47b9b67", + "traceId": "2e3b50b197dd4669a074ecbd2e8c48c7", + "evidence": "HTTP=200, code=A0400", + "checkedAt": "2026-08-08T03:27:31.090Z" + }, + { + "module": "supplemental", + "scenario": "warehouse-resources", + "name": "库位分页查询", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/locations?page=1&size=5&tenantId=0" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "22165461-004a-455e-aa92-3c3e6eac48e4, d6b59b9e-0fea-4ca8-b3ef-9c433122e678", + "traceId": "9a57004e5a664cac88da018b29a2edc6", + "evidence": "path=/api/platform/v1/locations?page=1&size=5&tenantId=0", + "checkedAt": "2026-08-08T03:27:31.124Z" + }, + { + "module": "supplemental", + "scenario": "warehouse-resources", + "name": "库位分页结构与记录数组正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/locations?page=1&size=5&tenantId=0" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "22165461-004a-455e-aa92-3c3e6eac48e4, d6b59b9e-0fea-4ca8-b3ef-9c433122e678", + "traceId": "9a57004e5a664cac88da018b29a2edc6", + "evidence": "records=3, current=1, size=5", + "checkedAt": "2026-08-08T03:27:31.124Z" + }, + { + "module": "supplemental", + "scenario": "warehouse-resources", + "name": "托盘分页查询", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/pallets?page=1&size=5&tenantId=0" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "3ffa5581-b37c-443a-8612-8fda1857186a, 74c7095e-23e5-4972-aefa-092dedd36d93", + "traceId": "45ac5dd152d04e12a576ef6bdc9c6b50", + "evidence": "path=/api/platform/v1/pallets?page=1&size=5&tenantId=0", + "checkedAt": "2026-08-08T03:27:31.155Z" + }, + { + "module": "supplemental", + "scenario": "warehouse-resources", + "name": "托盘分页结构与记录数组正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/pallets?page=1&size=5&tenantId=0" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "3ffa5581-b37c-443a-8612-8fda1857186a, 74c7095e-23e5-4972-aefa-092dedd36d93", + "traceId": "45ac5dd152d04e12a576ef6bdc9c6b50", + "evidence": "records=3, current=1, size=5", + "checkedAt": "2026-08-08T03:27:31.155Z" + }, + { + "module": "supplemental", + "scenario": "warehouse-resources", + "name": "库位仓库筛选分页查询", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/locations?page=1&size=5&tenantId=0&warehouseId=193000000000000001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "6bbb2af3-e4e8-4ba6-9db3-85d9da5c7489, 356b390f-2e00-42b7-a426-474a86961600", + "traceId": "584e110e497c419694dc74b6e031477c", + "evidence": "path=/api/platform/v1/locations?page=1&size=5&tenantId=0&warehouseId=193000000000000001", + "checkedAt": "2026-08-08T03:27:31.187Z" + }, + { + "module": "supplemental", + "scenario": "warehouse-resources", + "name": "库位仓库筛选分页结构与记录数组正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/locations?page=1&size=5&tenantId=0&warehouseId=193000000000000001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "6bbb2af3-e4e8-4ba6-9db3-85d9da5c7489, 356b390f-2e00-42b7-a426-474a86961600", + "traceId": "584e110e497c419694dc74b6e031477c", + "evidence": "records=0, current=1, size=5", + "checkedAt": "2026-08-08T03:27:31.187Z" + }, + { + "module": "supplemental", + "scenario": "warehouse-resources", + "name": "托盘仓库筛选分页查询", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/pallets?page=1&size=5&tenantId=0&warehouseId=193000000000000001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "5c298e4d-87c6-424c-8717-8ade4e542e02, 8dda4ecd-d1a6-4de5-83ea-ee32f5253260", + "traceId": "a6ffeb8b88ce4393a64ce635623bca0d", + "evidence": "path=/api/platform/v1/pallets?page=1&size=5&tenantId=0&warehouseId=193000000000000001", + "checkedAt": "2026-08-08T03:27:31.215Z" + }, + { + "module": "supplemental", + "scenario": "warehouse-resources", + "name": "托盘仓库筛选分页结构与记录数组正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/pallets?page=1&size=5&tenantId=0&warehouseId=193000000000000001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "5c298e4d-87c6-424c-8717-8ade4e542e02, 8dda4ecd-d1a6-4de5-83ea-ee32f5253260", + "traceId": "a6ffeb8b88ce4393a64ce635623bca0d", + "evidence": "records=0, current=1, size=5", + "checkedAt": "2026-08-08T03:27:31.215Z" + }, + { + "module": "supplemental", + "scenario": "warehouse-resources", + "name": "库位客户作用域安全失败", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/locations?page=1&size=5&tenantId=10001" + }, + "http": 200, + "code": "A0400", + "message": "平台公共资源作用域必须为0", + "requestId": "fcca6600-9e92-4d9d-8e5a-d0e3b0121867", + "traceId": "8f25bc5504644e4d82b22d0713f26299", + "evidence": "HTTP=200, code=A0400", + "checkedAt": "2026-08-08T03:27:31.246Z" + }, + { + "module": "supplemental", + "scenario": "warehouse-resources", + "name": "托盘客户作用域安全失败", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/pallets?page=1&size=5&tenantId=10001" + }, + "http": 200, + "code": "A0400", + "message": "平台公共资源作用域必须为0", + "requestId": "de5536b4-54f6-4a56-8820-51dcb818e41e", + "traceId": "1918e55b8c364c69a808e193800c38b6", + "evidence": "HTTP=200, code=A0400", + "checkedAt": "2026-08-08T03:27:31.277Z" + }, + { + "module": "supplemental", + "scenario": "warehouse-resources", + "name": "库位非法状态安全失败", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/locations?page=1&size=5&tenantId=0&status=ALLOCATED" + }, + "http": 200, + "code": "A0422", + "message": "status: must match \"^(AVAILABLE|RESERVED|OCCUPIED|DISABLED)$\"", + "requestId": "c8be99a7-2298-4b42-bc19-2b765ea411b0", + "traceId": "f035109bfe5c407d877540d6cd0fcff1", + "evidence": "HTTP=200, code=A0422", + "checkedAt": "2026-08-08T03:27:31.305Z" + }, + { + "module": "supplemental", + "scenario": "warehouse-resources", + "name": "库位过期版本/不存在资源不泄露或误修改数据", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/locations/999999999999?tenantId=0&warehouseId=999999999999" + }, + "http": 200, + "code": "A0404", + "message": "库位不存在或超出当前企业仓库数据范围", + "requestId": "d57948c3-8203-46f9-ac3f-5f9ac086109a", + "traceId": "7a35aba3c5d54655954da883efdc2be6", + "evidence": "HTTP=200, code=A0404", + "checkedAt": "2026-08-08T03:27:31.337Z" + }, + { + "module": "supplemental", + "scenario": "warehouse-resources", + "name": "托盘占用资源保护边界不泄露或误修改数据", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/pallets/999999999999?tenantId=0&warehouseId=999999999999" + }, + "http": 200, + "code": "A0404", + "message": "托盘不存在或不属于当前租户和仓库", + "requestId": "27458329-f5d5-49bc-bac5-ccb6799f45e9", + "traceId": "006a374f65e045fe9a7ca5dfc0062b9d", + "evidence": "HTTP=200, code=A0404", + "checkedAt": "2026-08-08T03:27:31.374Z" + }, + { + "module": "supplemental", + "scenario": "shared-master-data", + "name": "快递公司分页查询", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/express-companies?page=1&size=5&tenantId=0&status=ACTIVE" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "e246b571-812d-4cb5-a0d0-79ccf70d01d5, 71434852-f2ed-470d-8bc2-c890312235c1", + "traceId": "489e8bcf2f734600945802e26d3ad39a", + "evidence": "path=/api/platform/v1/express-companies?page=1&size=5&tenantId=0&status=ACTIVE", + "checkedAt": "2026-08-08T03:27:31.405Z" + }, + { + "module": "supplemental", + "scenario": "shared-master-data", + "name": "快递公司分页结构与记录数组正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/express-companies?page=1&size=5&tenantId=0&status=ACTIVE" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "e246b571-812d-4cb5-a0d0-79ccf70d01d5, 71434852-f2ed-470d-8bc2-c890312235c1", + "traceId": "489e8bcf2f734600945802e26d3ad39a", + "evidence": "records=4, current=1, size=5", + "checkedAt": "2026-08-08T03:27:31.405Z" + }, + { + "module": "supplemental", + "scenario": "shared-master-data", + "name": "快递公司停用筛选分页查询", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/express-companies?page=1&size=5&tenantId=0&status=INACTIVE" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "d098a8b3-401a-4cb6-b4f9-75a4cd7d1c7d, 7913f0ac-ee6f-42bc-8d7d-ea67d9c806b0", + "traceId": "bed26d2072be4f7ba4bb2f3e0edb52c7", + "evidence": "path=/api/platform/v1/express-companies?page=1&size=5&tenantId=0&status=INACTIVE", + "checkedAt": "2026-08-08T03:27:31.435Z" + }, + { + "module": "supplemental", + "scenario": "shared-master-data", + "name": "快递公司停用筛选分页结构与记录数组正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/express-companies?page=1&size=5&tenantId=0&status=INACTIVE" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "d098a8b3-401a-4cb6-b4f9-75a4cd7d1c7d, 7913f0ac-ee6f-42bc-8d7d-ea67d9c806b0", + "traceId": "bed26d2072be4f7ba4bb2f3e0edb52c7", + "evidence": "records=5, current=1, size=5", + "checkedAt": "2026-08-08T03:27:31.435Z" + }, + { + "module": "supplemental", + "scenario": "shared-master-data", + "name": "快递公司状态枚举过滤不混入其他状态", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/express-companies?page=1&size=5&tenantId=0&status=INACTIVE" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "d098a8b3-401a-4cb6-b4f9-75a4cd7d1c7d, 7913f0ac-ee6f-42bc-8d7d-ea67d9c806b0", + "traceId": "bed26d2072be4f7ba4bb2f3e0edb52c7", + "evidence": "records=5", + "checkedAt": "2026-08-08T03:27:31.435Z" + }, + { + "module": "supplemental", + "scenario": "shared-master-data", + "name": "快递公司无效筛选参数安全失败", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/express-companies?page=1&size=5&tenantId=0&status=UNKNOWN" + }, + "http": 200, + "code": "A0422", + "message": "status: must match \"^(ACTIVE|INACTIVE)$\"", + "requestId": "c8e7db49-f6e4-4ea6-8510-aead210125f1", + "traceId": "9b73ce69b3334b5f9ba5f733b9caf0b9", + "evidence": "HTTP=200, code=A0422", + "checkedAt": "2026-08-08T03:27:31.464Z" + }, + { + "module": "supplemental", + "scenario": "shared-master-data", + "name": "往来单位分页查询", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/partners?page=1&size=5&tenantId=0&status=ACTIVE" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "406a88b8-e2d8-44be-90b8-7b953147e344, 37de910e-9468-4bdd-b114-c1239f0e43a6", + "traceId": "1ea8d2e2af594201bf403571efb3b778", + "evidence": "path=/api/platform/v1/partners?page=1&size=5&tenantId=0&status=ACTIVE", + "checkedAt": "2026-08-08T03:27:31.504Z" + }, + { + "module": "supplemental", + "scenario": "shared-master-data", + "name": "往来单位分页结构与记录数组正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/partners?page=1&size=5&tenantId=0&status=ACTIVE" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "406a88b8-e2d8-44be-90b8-7b953147e344, 37de910e-9468-4bdd-b114-c1239f0e43a6", + "traceId": "1ea8d2e2af594201bf403571efb3b778", + "evidence": "records=5, current=1, size=5", + "checkedAt": "2026-08-08T03:27:31.504Z" + }, + { + "module": "supplemental", + "scenario": "shared-master-data", + "name": "往来单位停用筛选分页查询", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/partners?page=1&size=5&tenantId=0&status=INACTIVE" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "49302809-f15c-4d68-963f-f388c7e1699e, 81c3d4b5-546e-4f89-845d-bd6206b0868b", + "traceId": "4cc08b39081f4dfe957669f92074e99f", + "evidence": "path=/api/platform/v1/partners?page=1&size=5&tenantId=0&status=INACTIVE", + "checkedAt": "2026-08-08T03:27:31.549Z" + }, + { + "module": "supplemental", + "scenario": "shared-master-data", + "name": "往来单位停用筛选分页结构与记录数组正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/partners?page=1&size=5&tenantId=0&status=INACTIVE" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "49302809-f15c-4d68-963f-f388c7e1699e, 81c3d4b5-546e-4f89-845d-bd6206b0868b", + "traceId": "4cc08b39081f4dfe957669f92074e99f", + "evidence": "records=4, current=1, size=5", + "checkedAt": "2026-08-08T03:27:31.549Z" + }, + { + "module": "supplemental", + "scenario": "shared-master-data", + "name": "往来单位状态枚举过滤不混入其他状态", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/partners?page=1&size=5&tenantId=0&status=INACTIVE" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "49302809-f15c-4d68-963f-f388c7e1699e, 81c3d4b5-546e-4f89-845d-bd6206b0868b", + "traceId": "4cc08b39081f4dfe957669f92074e99f", + "evidence": "records=4", + "checkedAt": "2026-08-08T03:27:31.549Z" + }, + { + "module": "supplemental", + "scenario": "shared-master-data", + "name": "往来单位无效筛选参数安全失败", + "passed": false, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/partners?page=1&size=5&tenantId=0&types=UNKNOWN_TYPE" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "a6f1d085-217b-45b5-ae89-82fed905b651, cdab4305-94cf-43c1-b0f3-38482fd21399", + "traceId": "c5354d4f61cd4fff85f250e0f7254837", + "evidence": "HTTP=200, code=200", + "checkedAt": "2026-08-08T03:27:31.585Z" + }, + { + "module": "supplemental", + "scenario": "shared-master-data", + "name": "仓库导入模板为 XLSX 且不记录二进制", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/warehouse-admin/import-template" + }, + "http": 200, + "code": null, + "message": "3852 bytes (application/vnd.openxmlformats-officedocument.spreadsheetml.sheet)", + "requestId": "d7d72f91-449a-4a29-b545-f9d04e10cdac, 55c9b2c0-3138-4060-8f49-19459ee1a1f7", + "traceId": "3f009148b11744bd992d284d582aeafe", + "evidence": "HTTP=200, bytes=3852, contentType=application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + "checkedAt": "2026-08-08T03:27:31.625Z" + }, + { + "module": "supplemental", + "scenario": "shared-master-data", + "name": "快递公司导入模板为 XLSX 且不记录二进制", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/express-companies/import-template" + }, + "http": 200, + "code": null, + "message": "3691 bytes (application/vnd.openxmlformats-officedocument.spreadsheetml.sheet)", + "requestId": "06c5f7b7-eb0c-4c17-abe8-970e82a60423, 86ef2353-c083-4194-abf3-92c71de166ad", + "traceId": "0ffcbe1f60aa4e8490fb0b1b841f8238", + "evidence": "HTTP=200, bytes=3691, contentType=application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + "checkedAt": "2026-08-08T03:27:31.663Z" + }, + { + "module": "supplemental", + "scenario": "shared-master-data", + "name": "往来单位导入模板为 XLSX 且不记录二进制", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/partners/import-template" + }, + "http": 200, + "code": null, + "message": "3829 bytes (application/vnd.openxmlformats-officedocument.spreadsheetml.sheet)", + "requestId": "2317cc33-b181-4df6-a397-983611d183db, 65293a6d-5edc-4e42-8b68-098ddff4c13f", + "traceId": "525bca21b79f4486bf90a9b4c2fd7174", + "evidence": "HTTP=200, bytes=3829, contentType=application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + "checkedAt": "2026-08-08T03:27:31.707Z" + }, + { + "module": "supplemental", + "scenario": "price-book-readonly", + "name": "船期价格表 PENDING_CONFIRMATION 状态过滤", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/fba-pricing/carrier-rates/price-books?status=PENDING_CONFIRMATION" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "17d9a02c-a93e-4017-b8b9-a9bbca0997c2, 05a2131c-8a16-4253-b35d-391f3287090e", + "traceId": "2db0c5ae8d30486a93bb16dd07a5000c", + "evidence": "count=1", + "checkedAt": "2026-08-08T03:27:31.745Z" + }, + { + "module": "supplemental", + "scenario": "price-book-readonly", + "name": "船期价格表 PENDING_CONFIRMATION 结果状态一致", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/fba-pricing/carrier-rates/price-books?status=PENDING_CONFIRMATION" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "17d9a02c-a93e-4017-b8b9-a9bbca0997c2, 05a2131c-8a16-4253-b35d-391f3287090e", + "traceId": "2db0c5ae8d30486a93bb16dd07a5000c", + "evidence": "count=1", + "checkedAt": "2026-08-08T03:27:31.745Z" + }, + { + "module": "supplemental", + "scenario": "price-book-readonly", + "name": "船期价格表 ACTIVE 状态过滤", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/fba-pricing/carrier-rates/price-books?status=ACTIVE" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "966c294b-3d27-4c0c-a419-3659f0e15ea6, 23f7f522-d503-4577-9e4b-5784c55f7369", + "traceId": "417f61553722495a97f6d875371f9edc", + "evidence": "count=1", + "checkedAt": "2026-08-08T03:27:31.775Z" + }, + { + "module": "supplemental", + "scenario": "price-book-readonly", + "name": "船期价格表 ACTIVE 结果状态一致", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/fba-pricing/carrier-rates/price-books?status=ACTIVE" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "966c294b-3d27-4c0c-a419-3659f0e15ea6, 23f7f522-d503-4577-9e4b-5784c55f7369", + "traceId": "417f61553722495a97f6d875371f9edc", + "evidence": "count=1", + "checkedAt": "2026-08-08T03:27:31.775Z" + }, + { + "module": "supplemental", + "scenario": "price-book-readonly", + "name": "船期价格表 SUPERSEDED 状态过滤", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/fba-pricing/carrier-rates/price-books?status=SUPERSEDED" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "9aa8d448-b75f-4103-9c13-dcedc2852f64, a9678321-6fd9-4b63-8247-755e2bd3f388", + "traceId": "645ba20e0b41415f895ae2a07622dbe8", + "evidence": "count=5", + "checkedAt": "2026-08-08T03:27:31.806Z" + }, + { + "module": "supplemental", + "scenario": "price-book-readonly", + "name": "船期价格表 SUPERSEDED 结果状态一致", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/fba-pricing/carrier-rates/price-books?status=SUPERSEDED" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "9aa8d448-b75f-4103-9c13-dcedc2852f64, a9678321-6fd9-4b63-8247-755e2bd3f388", + "traceId": "645ba20e0b41415f895ae2a07622dbe8", + "evidence": "count=5", + "checkedAt": "2026-08-08T03:27:31.806Z" + }, + { + "module": "supplemental", + "scenario": "price-book-readonly", + "name": "读取现有生效价格版本用于下载安全检查", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/fba-pricing/carrier-rates/price-books?status=ACTIVE" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "a7f039f5-7ddd-4d3e-9821-6e793724c73e, 627861d0-aafc-4d86-bdcc-e94b4c44f9c6", + "traceId": "4370a954b83a4ffdae615c6969ecf38c", + "evidence": "", + "checkedAt": "2026-08-08T03:27:31.836Z" + }, + { + "module": "supplemental", + "scenario": "price-book-readonly", + "name": "现有生效价格源文件下载为 XLSX", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/fba-pricing/carrier-rates/price-books/2085930794353209345/source" + }, + "http": 200, + "code": null, + "message": "1343413 bytes (application/vnd.openxmlformats-officedocument.spreadsheetml.sheet)", + "requestId": "e044c1f6-7bd9-452c-8c14-fdd7235a93a4, 28ee62db-5ec2-46a2-baa2-6a3d70be161f, 149e0d3f-11a4-4062-8acb-9ec7e1bbadc7", + "traceId": "a2282682af5540d5be7133901d585317, daf7a0e80c4d415d949f048de72495db", + "evidence": "versionId=2085930794353209345, bytes=1343413, contentType=application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + "checkedAt": "2026-08-08T03:27:31.936Z" + }, + { + "module": "supplemental", + "scenario": "download-readonly", + "name": "下载中心 PENDING 状态分页", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/files/export-tasks?page=1&size=5&status=PENDING" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "2251b584-eba9-40c6-8a72-f990d221f641, fc5feff7-7328-49a8-a370-29d52cd0a293", + "traceId": "ab2a595def8441cca323829c72698ab7", + "evidence": "", + "checkedAt": "2026-08-08T03:27:31.963Z" + }, + { + "module": "supplemental", + "scenario": "download-readonly", + "name": "下载中心 PENDING 过滤结果状态一致", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/files/export-tasks?page=1&size=5&status=PENDING" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "2251b584-eba9-40c6-8a72-f990d221f641, fc5feff7-7328-49a8-a370-29d52cd0a293", + "traceId": "ab2a595def8441cca323829c72698ab7", + "evidence": "records=0", + "checkedAt": "2026-08-08T03:27:31.963Z" + }, + { + "module": "supplemental", + "scenario": "download-readonly", + "name": "下载中心 RUNNING 状态分页", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/files/export-tasks?page=1&size=5&status=RUNNING" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "15f85a5a-59dc-4bd4-8d01-202ab30f5de7, 9f45e305-aead-48c5-b846-c24fb5cb4dd2", + "traceId": "bad2548cdd89496da1f4f992b1de1985", + "evidence": "", + "checkedAt": "2026-08-08T03:27:31.993Z" + }, + { + "module": "supplemental", + "scenario": "download-readonly", + "name": "下载中心 RUNNING 过滤结果状态一致", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/files/export-tasks?page=1&size=5&status=RUNNING" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "15f85a5a-59dc-4bd4-8d01-202ab30f5de7, 9f45e305-aead-48c5-b846-c24fb5cb4dd2", + "traceId": "bad2548cdd89496da1f4f992b1de1985", + "evidence": "records=0", + "checkedAt": "2026-08-08T03:27:31.993Z" + }, + { + "module": "supplemental", + "scenario": "download-readonly", + "name": "下载中心 SUCCEEDED 状态分页", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/files/export-tasks?page=1&size=5&status=SUCCEEDED" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "2cf2bcab-46c5-4633-9c5d-b5c1c28d3210, ff38a862-4d50-4fbb-aca4-21e98579ac79", + "traceId": "f27e81c620c84005839f1861f917a82e", + "evidence": "", + "checkedAt": "2026-08-08T03:27:32.026Z" + }, + { + "module": "supplemental", + "scenario": "download-readonly", + "name": "下载中心 SUCCEEDED 过滤结果状态一致", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/files/export-tasks?page=1&size=5&status=SUCCEEDED" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "2cf2bcab-46c5-4633-9c5d-b5c1c28d3210, ff38a862-4d50-4fbb-aca4-21e98579ac79", + "traceId": "f27e81c620c84005839f1861f917a82e", + "evidence": "records=5", + "checkedAt": "2026-08-08T03:27:32.026Z" + }, + { + "module": "supplemental", + "scenario": "download-readonly", + "name": "下载中心 FAILED 状态分页", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/files/export-tasks?page=1&size=5&status=FAILED" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "ceeace41-193c-4124-90f5-2d5c3ce74f44, 390a482a-acd0-4702-92d9-1e7effd7016a", + "traceId": "5d9309e24b004f51816c52167eece9e5", + "evidence": "", + "checkedAt": "2026-08-08T03:27:32.051Z" + }, + { + "module": "supplemental", + "scenario": "download-readonly", + "name": "下载中心 FAILED 过滤结果状态一致", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/files/export-tasks?page=1&size=5&status=FAILED" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "ceeace41-193c-4124-90f5-2d5c3ce74f44, 390a482a-acd0-4702-92d9-1e7effd7016a", + "traceId": "5d9309e24b004f51816c52167eece9e5", + "evidence": "records=0", + "checkedAt": "2026-08-08T03:27:32.051Z" + }, + { + "module": "supplemental", + "scenario": "download-readonly", + "name": "下载中心 EXPIRED 状态分页", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/files/export-tasks?page=1&size=5&status=EXPIRED" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "13b589cd-ccac-43b1-8a0d-49103e568020, bc1f8f26-149c-4b65-8e76-0e2c464638af", + "traceId": "ec0884e5512c457cb967b11d82579cc4", + "evidence": "", + "checkedAt": "2026-08-08T03:27:32.089Z" + }, + { + "module": "supplemental", + "scenario": "download-readonly", + "name": "下载中心 EXPIRED 过滤结果状态一致", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/files/export-tasks?page=1&size=5&status=EXPIRED" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "13b589cd-ccac-43b1-8a0d-49103e568020, bc1f8f26-149c-4b65-8e76-0e2c464638af", + "traceId": "ec0884e5512c457cb967b11d82579cc4", + "evidence": "records=0", + "checkedAt": "2026-08-08T03:27:32.089Z" + }, + { + "module": "supplemental", + "scenario": "download-readonly", + "name": "不存在下载任务详情安全失败", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/files/export-tasks/999999999999" + }, + "http": 200, + "code": "A0404", + "message": "导出任务不存在", + "requestId": "151671d5-2c06-4e08-b6dc-23ac9d49ed5a", + "traceId": "315eb2ff513c4c9c876cb3bc3ea1243d", + "evidence": "HTTP=200, code=A0404", + "checkedAt": "2026-08-08T03:27:32.116Z" + }, + { + "module": "supplemental", + "scenario": "download-readonly", + "name": "不存在下载任务文件安全失败", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/files/export-tasks/999999999999/download" + }, + "http": 200, + "code": "A0404", + "message": "导出任务不存在", + "requestId": "786dd773-b14b-4aa9-a12c-c60033364cf6", + "traceId": "5f4d39170de9498f8df5dc56eb365f76", + "evidence": "HTTP=200, code=A0404", + "checkedAt": "2026-08-08T03:27:32.148Z" + }, + { + "module": "supplemental", + "scenario": "download-readonly", + "name": "未授权下载请求被拒绝", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/files/export-tasks/999999999999/download" + }, + "http": 401, + "code": "A0401", + "message": "未登录或令牌已失效", + "requestId": "12070bc5-934", + "traceId": null, + "evidence": "HTTP=401, code=A0401", + "checkedAt": "2026-08-08T03:27:32.173Z" + }, + { + "module": "supplemental", + "scenario": "iam-readonly", + "name": "平台用户只读列表", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/users?page=1&size=5" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "a35ce12b-8293-4ad8-9fb2-00e65d441908, f2c42c49-15f3-4365-833e-271530afa20d", + "traceId": "06de44ccf9a14e61a2d0e67cf1ca0371", + "evidence": "", + "checkedAt": "2026-08-08T03:27:32.245Z" + }, + { + "module": "supplemental", + "scenario": "iam-readonly", + "name": "平台用户列表结构正确且包含内置保护标识", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/users?page=1&size=5" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "a35ce12b-8293-4ad8-9fb2-00e65d441908, f2c42c49-15f3-4365-833e-271530afa20d", + "traceId": "06de44ccf9a14e61a2d0e67cf1ca0371", + "evidence": "records=5, builtInField=protectedAccount", + "checkedAt": "2026-08-08T03:27:32.245Z" + }, + { + "module": "supplemental", + "scenario": "iam-readonly", + "name": "平台角色只读列表", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/roles" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "b9d8975c-283c-4f70-bb2f-b9586df2849b, 7d889a7a-d348-4f5d-aa20-2edb83287ed7", + "traceId": "3937e2da116049c1b188427f6446aaa8", + "evidence": "", + "checkedAt": "2026-08-08T03:27:32.279Z" + }, + { + "module": "supplemental", + "scenario": "iam-readonly", + "name": "平台角色列表结构正确且包含内置保护标识", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/roles" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "b9d8975c-283c-4f70-bb2f-b9586df2849b, 7d889a7a-d348-4f5d-aa20-2edb83287ed7", + "traceId": "3937e2da116049c1b188427f6446aaa8", + "evidence": "records=10, builtInField=roleType", + "checkedAt": "2026-08-08T03:27:32.279Z" + }, + { + "module": "supplemental", + "scenario": "iam-readonly", + "name": "菜单权限只读列表", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/permissions" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "cfcf73fd-5947-4ea4-ba2b-1bfdeb6efbf5, a022c2db-fae7-4d72-9ed1-cd2c63f1ce34", + "traceId": "24f24339b5c145cc8cdfb7f5b35eda09", + "evidence": "", + "checkedAt": "2026-08-08T03:27:32.320Z" + }, + { + "module": "supplemental", + "scenario": "iam-readonly", + "name": "菜单权限列表结构正确且包含内置保护标识", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/permissions" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "cfcf73fd-5947-4ea4-ba2b-1bfdeb6efbf5, a022c2db-fae7-4d72-9ed1-cd2c63f1ce34", + "traceId": "24f24339b5c145cc8cdfb7f5b35eda09", + "evidence": "records=120, builtInField=builtIn", + "checkedAt": "2026-08-08T03:27:32.320Z" + }, + { + "module": "supplemental", + "scenario": "iam-readonly", + "name": "角色列表伪造令牌拒绝访问", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/roles" + }, + "http": 401, + "code": "A0401", + "message": "未登录或令牌已失效", + "requestId": "12070bc5-938", + "traceId": null, + "evidence": "HTTP=401, code=A0401", + "checkedAt": "2026-08-08T03:27:32.341Z" + }, + { + "module": "supplemental", + "scenario": "iam-readonly", + "name": "菜单权限未携带令牌拒绝访问", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/iam/permissions" + }, + "http": 401, + "code": "A0401", + "message": "未登录或令牌已失效", + "requestId": "3ad5915c-939", + "traceId": null, + "evidence": "HTTP=401, code=A0401", + "checkedAt": "2026-08-08T03:27:32.358Z" + } + ] +} diff --git a/reports/admin-test-env-acceptance-20260808032811.json b/reports/admin-test-env-acceptance-20260808032811.json new file mode 100644 index 000000000..86380c2cc --- /dev/null +++ b/reports/admin-test-env-acceptance-20260808032811.json @@ -0,0 +1,1195 @@ +{ + "reportName": "后台管理测试环境 HTTP API 验收", + "marker": "ADMIN-API-20260808032811577", + "gateway": "http://8.163.30.128:9000", + "generatedAt": "2026-08-08T03:28:14.986Z", + "startedAt": "2026-08-08T03:28:11.577Z", + "success": false, + "fatal": null, + "summary": { + "total": 60, + "passed": 57, + "failed": 3 + }, + "modules": [ + { + "name": "orders", + "startedAt": "2026-08-08T03:28:11.957Z", + "finishedAt": "2026-08-08T03:28:14.422Z", + "success": true, + "passed": 49, + "failed": 0, + "fatal": null + }, + { + "name": "inbound-measurement", + "startedAt": "2026-08-08T03:28:14.423Z", + "finishedAt": "2026-08-08T03:28:14.986Z", + "success": false, + "passed": 7, + "failed": 3, + "fatal": null + } + ], + "scenarios": [ + { + "name": "mojia-carton-measurement", + "module": "inbound-measurement", + "success": false, + "deploymentBlocked": true, + "passed": 7, + "failed": 3 + } + ], + "deploymentBlockers": [ + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "模拟墨家首次扫描单箱", + "evidence": "boxCode=RK-2085931050820239362#4-1, machineNo=MJ-ADMIN-E2E-01", + "code": "A0422", + "requestId": "ccf6c191-a85d-45dc-ba55-023dded0d7d0", + "traceId": "9110ac254d1c4577a565fc66234ab3e1" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "首次扫描新增一条且默认代表1箱", + "evidence": "created=undefined, confirmedPackageCount=missing", + "code": "A0422", + "requestId": "ccf6c191-a85d-45dc-ba55-023dded0d7d0", + "traceId": "9110ac254d1c4577a565fc66234ab3e1" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "重复打印及指定箱补打后原箱码仍可解析", + "evidence": "boxCodeStable=false, resolvedInboundId=2085931054454583297", + "code": "A0422", + "requestId": "ccf6c191-a85d-45dc-ba55-023dded0d7d0", + "traceId": "9110ac254d1c4577a565fc66234ab3e1" + } + ], + "createdResources": { + "orders": { + "marker": "ADMIN-API-20260808032811577", + "tenantId": "10001", + "orderId": "2085931050820239362", + "productImageFileId": "2085931050388226050", + "boxTypes": [ + "SMALL", + "MEDIUM", + "LARGE", + "EXTRA_LARGE" + ], + "inboundId": "2085931054454583297", + "orderNo": "FL2085931050820239362", + "inboundCode": "RK-2085931050820239362", + "processStatus": "WAIT_MEASURE", + "taskId": "2085931054450388994" + }, + "ocrInbound": { + "tenantId": "10001", + "inboundId": "2085931054454583297", + "marker": "ADMIN-API-20260808032811577" + }, + "testInbound": { + "tenantId": "10001", + "inboundId": "2085931054454583297", + "marker": "ADMIN-API-20260808032811577" + } + }, + "excluded": [ + { + "scope": "dashboard", + "reason": "首页为静态演示数据,不调用后端 API" + }, + { + "scope": "hidden-prototypes", + "reason": "隐藏原型页面尚无已确认后端契约" + } + ], + "securityNote": "报告不保存登录密码、Access Token、Refresh Token、图片二进制或 OCR 原文全文。", + "steps": [ + { + "module": "authentication", + "scenario": null, + "name": "平台管理员登录", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/auth/login" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "95bdc664-30d0-4981-a516-0c6f7019031c, fcc2a3ef-7122-45d5-9f12-b138c00a8f7e", + "traceId": "afaea3a93421489bb4aa9f36d8fb614f", + "evidence": "", + "checkedAt": "2026-08-08T03:28:11.956Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 测试账号登录", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/auth/login" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "1a7a16d5-0c77-400b-b3b6-a05eb9a6940e, 179b8889-15ae-472f-8315-73cbdad26c4d", + "traceId": "8694f13ff8934afb8c8f071e6b301b7c", + "evidence": "username=merchant_admin", + "checkedAt": "2026-08-08T03:28:12.298Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 查询当前企业资料", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/iam/tenant/profile" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "8a793475-0410-4c6e-9bac-73abb8314189, ea60b5e1-cbec-40b6-8ebc-e4a300995df6", + "traceId": "70892d7cc1ea4fb38fa82e95f0938c14", + "evidence": "", + "checkedAt": "2026-08-08T03:28:12.320Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 测试企业已审核且客户 ID 有效", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/iam/tenant/profile" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "8a793475-0410-4c6e-9bac-73abb8314189, ea60b5e1-cbec-40b6-8ebc-e4a300995df6", + "traceId": "70892d7cc1ea4fb38fa82e95f0938c14", + "evidence": "tenantId=10001, status=ACTIVE", + "checkedAt": "2026-08-08T03:28:12.320Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "Admin 查询客户固定箱型", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/customer-dimension-config?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "663b7448-34b6-437f-93ac-191875fb0c66, 0d636943-cde9-4667-a526-b33a6e072a4d", + "traceId": "70c4fc3582e744f5bdf8a1d07e8ba923", + "evidence": "tenantId=10001", + "checkedAt": "2026-08-08T03:28:12.358Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "固定四箱型顺序、内径及每边加2cm正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/customer-dimension-config?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "663b7448-34b6-437f-93ac-191875fb0c66, 0d636943-cde9-4667-a526-b33a6e072a4d", + "traceId": "70c4fc3582e744f5bdf8a1d07e8ba923", + "evidence": "types=SMALL,MEDIUM,LARGE,EXTRA_LARGE", + "checkedAt": "2026-08-08T03:28:12.358Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 查询国内收货仓", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/warehouses?page=1&size=200&status=ACTIVE&warehouseType=DOMESTIC" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "7277b673-32b0-486e-8462-e82c5036d5f1, c4a28d49-a717-4088-a9eb-6e3f69c5e8f1", + "traceId": "0ac23b9467c34b80a7205e217948f832", + "evidence": "", + "checkedAt": "2026-08-08T03:28:12.391Z" + }, + { + "module": "orders", + "scenario": null, + "name": "存在可用国内收货仓", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/warehouses?page=1&size=200&status=ACTIVE&warehouseType=DOMESTIC" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "7277b673-32b0-486e-8462-e82c5036d5f1, c4a28d49-a717-4088-a9eb-6e3f69c5e8f1", + "traceId": "0ac23b9467c34b80a7205e217948f832", + "evidence": "count=2", + "checkedAt": "2026-08-08T03:28:12.391Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 查询 FBA 目的仓", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/warehouses?page=1&size=200&status=ACTIVE&warehouseType=FBA" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "b7150ce9-d890-4e81-8dc4-28d71e3d8136, 13964fd9-aeb4-4ea2-92e4-4b0aeb527238", + "traceId": "e3531f9a12634de89a90e90ca5aed1aa", + "evidence": "", + "checkedAt": "2026-08-08T03:28:12.446Z" + }, + { + "module": "orders", + "scenario": null, + "name": "存在可用 FBA 目的仓", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/warehouses?page=1&size=200&status=ACTIVE&warehouseType=FBA" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "b7150ce9-d890-4e81-8dc4-28d71e3d8136, 13964fd9-aeb4-4ea2-92e4-4b0aeb527238", + "traceId": "e3531f9a12634de89a90e90ca5aed1aa", + "evidence": "count=200", + "checkedAt": "2026-08-08T03:28:12.446Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 查询可用计费渠道", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/first-leg/pricing/channels?originWarehouseId=193000000000200001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "bc432fc6-d8ff-4f96-8b47-54bb4ec087d6, dba7fb49-ebba-45e0-b669-d5f78a04cacf", + "traceId": "a21657dcc5da4f74adc9a4bd88393b7f", + "evidence": "", + "checkedAt": "2026-08-08T03:28:12.487Z" + }, + { + "module": "orders", + "scenario": null, + "name": "存在带计价税制的可用渠道", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/first-leg/pricing/channels?originWarehouseId=193000000000200001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "bc432fc6-d8ff-4f96-8b47-54bb4ec087d6, dba7fb49-ebba-45e0-b669-d5f78a04cacf", + "traceId": "a21657dcc5da4f74adc9a4bd88393b7f", + "evidence": "count=15", + "checkedAt": "2026-08-08T03:28:12.487Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 查询发货客户候选", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/partners/candidates?type=SHIPPER" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "f3efbd72-7c35-4b95-9b41-fa812be05e25, 58c09d52-1610-4e59-a5b3-ee5b42c35127", + "traceId": "7d7f14ab447b488eaf7df6679ff55a0f", + "evidence": "", + "checkedAt": "2026-08-08T03:28:12.511Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "Client 上传产品图片", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/merchant/v1/files/product-images" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "2fd0fc66-43ed-4c6c-a923-8e4fcc1fd662, 1d0c2b89-7bce-457b-b1d3-0843c8838fd4", + "traceId": "bdfd6e8f02c546cb9621b9487a6244a2", + "evidence": "contentType=image/png", + "checkedAt": "2026-08-08T03:28:12.554Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "产品图片上传返回字符串文件 ID", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/merchant/v1/files/product-images" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "2fd0fc66-43ed-4c6c-a923-8e4fcc1fd662, 1d0c2b89-7bce-457b-b1d3-0843c8838fd4", + "traceId": "bdfd6e8f02c546cb9621b9487a6244a2", + "evidence": "fileIdType=string, contentType=image/png", + "checkedAt": "2026-08-08T03:28:12.554Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "Client 可下载本轮产品图片", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/files/product-images/2085931050388226050" + }, + "http": 200, + "code": null, + "message": null, + "requestId": "64a9d14a-4c01-4f96-8a71-d86e458a09aa, d5908027-d316-425b-9aa7-fe8abd7acd0a", + "traceId": "08287a016c4c473e83bd38762b6acbd6", + "evidence": "bytes=68, contentType=image/png", + "checkedAt": "2026-08-08T03:28:12.593Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "Client 创建四箱型隔离订单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/merchant/v1/orders/first-leg" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "d0b579b1-bf56-4a83-b993-bc27976a39ed, 588a388c-f0ca-45ce-9216-86c2f5c467f9", + "traceId": "6de6b16ba657451dbf93e91dec41ad52", + "evidence": "marker=ADMIN-API-20260808032811577", + "checkedAt": "2026-08-08T03:28:12.663Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 创建订单幂等重放", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/merchant/v1/orders/first-leg" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "872e830d-73af-4645-adbf-9a7b277d3231, 9989047a-e14c-4c9d-9e90-129945798d0e", + "traceId": "46a1d3e365c84387ae39b0a3f7992546", + "evidence": "", + "checkedAt": "2026-08-08T03:28:12.707Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 创建幂等结果一致", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/merchant/v1/orders/first-leg" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "872e830d-73af-4645-adbf-9a7b277d3231, 9989047a-e14c-4c9d-9e90-129945798d0e", + "traceId": "46a1d3e365c84387ae39b0a3f7992546", + "evidence": "orderId=2085931050820239362, replayedId=2085931050820239362", + "checkedAt": "2026-08-08T03:28:12.707Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 查询隔离订单草稿", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/orders/first-leg/2085931050820239362" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "568d0091-aaaf-452c-bf7e-7389e4d6352b, 773d36ad-f4a1-4b1a-973e-61b549865de8", + "traceId": "1736486dff6d41199f0c63a097131014", + "evidence": "", + "checkedAt": "2026-08-08T03:28:12.738Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 草稿身份、marker 和状态正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/orders/first-leg/2085931050820239362" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "568d0091-aaaf-452c-bf7e-7389e4d6352b, 773d36ad-f4a1-4b1a-973e-61b549865de8", + "traceId": "1736486dff6d41199f0c63a097131014", + "evidence": "orderNo=FL2085931050820239362, status=DRAFT", + "checkedAt": "2026-08-08T03:28:12.738Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "四箱型产品字段及图片契约完整回显", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/orders/first-leg/2085931050820239362" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "568d0091-aaaf-452c-bf7e-7389e4d6352b, 773d36ad-f4a1-4b1a-973e-61b549865de8", + "traceId": "1736486dff6d41199f0c63a097131014", + "evidence": "cargoes=4, imageFileId=2085931050388226050", + "checkedAt": "2026-08-08T03:28:12.738Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 提交隔离订单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/merchant/v1/orders/first-leg/2085931050820239362/submit" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "3b2d9c38-682f-462c-9448-de132cb4a712, eb893203-79dd-48ca-b013-3e64828ac29c", + "traceId": "e46f99b1c91c4d2dbc060255a29ffae9", + "evidence": "orderId=2085931050820239362", + "checkedAt": "2026-08-08T03:28:12.811Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 回查已提交订单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/orders/first-leg/2085931050820239362" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "f2ffb8b6-0087-4638-ac8e-a54327e66d78, 45173b68-40ce-4216-9144-3fb1f2238e95", + "traceId": "06e13458530d4b639aeb8aa25a4c8f1b", + "evidence": "", + "checkedAt": "2026-08-08T03:28:12.842Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Client 订单已进入待审核状态", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/merchant/v1/orders/first-leg/2085931050820239362" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "f2ffb8b6-0087-4638-ac8e-a54327e66d78, 45173b68-40ce-4216-9144-3fb1f2238e95", + "traceId": "06e13458530d4b639aeb8aa25a4c8f1b", + "evidence": "status=SUBMITTED", + "checkedAt": "2026-08-08T03:28:12.842Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 查询统一订单列表", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders?page=1&size=100&tenantId=10001&orderNo=FL2085931050820239362" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "4c9df302-df28-45a4-8f87-8925e652ab62, ac7df325-d7a5-4c7e-8266-d17ae40ab778", + "traceId": "3d3e9527f6b843ca92ccb2b8efb8f6bd", + "evidence": "", + "checkedAt": "2026-08-08T03:28:12.884Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 统一订单列表只核对本轮订单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders?page=1&size=100&tenantId=10001&orderNo=FL2085931050820239362" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "4c9df302-df28-45a4-8f87-8925e652ab62, ac7df325-d7a5-4c7e-8266-d17ae40ab778", + "traceId": "3d3e9527f6b843ca92ccb2b8efb8f6bd", + "evidence": "orderId=2085931050820239362, found=true", + "checkedAt": "2026-08-08T03:28:12.884Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 查询统一订单详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/2085931050820239362?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "10985f28-8282-4f5c-88c5-c834aafbc776, e62c17fe-e37d-4bab-a742-d949be560d11", + "traceId": "e2a2961f974c4e3aa187f4b835ce9681", + "evidence": "", + "checkedAt": "2026-08-08T03:28:12.923Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 统一订单详情身份与待审核状态正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/2085931050820239362?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "10985f28-8282-4f5c-88c5-c834aafbc776, e62c17fe-e37d-4bab-a742-d949be560d11", + "traceId": "e2a2961f974c4e3aa187f4b835ce9681", + "evidence": "mainStatus=PENDING_REVIEW, timeline=2", + "checkedAt": "2026-08-08T03:28:12.923Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 查询头程订单列表", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg?tenantId=10001&keyword=FL2085931050820239362&page=1&size=100" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "4c454425-eda8-4e3c-80a7-8a7398362e73, 45def8c5-a09f-4e01-994f-8a34e060885d", + "traceId": "306c1333fba7481d9a140c688d216b81", + "evidence": "", + "checkedAt": "2026-08-08T03:28:12.954Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 头程订单列表只核对本轮订单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg?tenantId=10001&keyword=FL2085931050820239362&page=1&size=100" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "4c454425-eda8-4e3c-80a7-8a7398362e73, 45def8c5-a09f-4e01-994f-8a34e060885d", + "traceId": "306c1333fba7481d9a140c688d216b81", + "evidence": "orderId=2085931050820239362, found=true", + "checkedAt": "2026-08-08T03:28:12.954Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 查询头程订单详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/2085931050820239362?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "3130b77c-bf3f-405e-a1d3-383421978964, f7b9a04f-2fb6-4c59-bba1-3ef7b56a902d", + "traceId": "d2ec90d1928c4925b7ada21dd13d77d2", + "evidence": "", + "checkedAt": "2026-08-08T03:28:12.983Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 头程订单详情聚合结构完整", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/2085931050820239362?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "3130b77c-bf3f-405e-a1d3-383421978964, f7b9a04f-2fb6-4c59-bba1-3ef7b56a902d", + "traceId": "d2ec90d1928c4925b7ada21dd13d77d2", + "evidence": "cargoes=4, history=2", + "checkedAt": "2026-08-08T03:28:12.983Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "四箱型产品字段及图片契约完整回显", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/2085931050820239362?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "3130b77c-bf3f-405e-a1d3-383421978964, f7b9a04f-2fb6-4c59-bba1-3ef7b56a902d", + "traceId": "d2ec90d1928c4925b7ada21dd13d77d2", + "evidence": "cargoes=4, imageFileId=2085931050388226050", + "checkedAt": "2026-08-08T03:28:12.983Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 为本轮订单添加内部备注", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/orders/first-leg/2085931050820239362/internal-notes?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "49acb196-074e-4be2-a873-a28e0a8a426c, 36167040-c4c3-4a21-bc3f-ac2dec0c61ba", + "traceId": "fa6b0ce7111e45b99618b481f53aedee", + "evidence": "", + "checkedAt": "2026-08-08T03:28:13.018Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 审核通过本轮订单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/orders/first-leg/2085931050820239362/approve?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "1156eecd-3326-4467-add5-be73ef41d367, 78847880-839e-44cb-b9ea-316195d94289", + "traceId": "c75d666d03614121a92eafdde5ca469b", + "evidence": "orderId=2085931050820239362", + "checkedAt": "2026-08-08T03:28:13.050Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "审核后生成隔离入库单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/2085931050820239362?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "0272518d-7afc-4a04-b098-f9369cc25ce8, 46ac67f3-fccc-4aed-9efc-606c9ee1afa5", + "traceId": "79d4959948f2490f98a05373dd0ec787", + "evidence": "inboundId=2085931054454583297", + "checkedAt": "2026-08-08T03:28:14.157Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "Admin 查询本轮入库单详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085931054454583297?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "c315f123-fca0-4e74-bcc2-ea3ec6e8f9e1, 2e7ad8a4-7ab3-467b-aaea-49d0e699884b", + "traceId": "c38992fd546d4646a14794ca832c3ffd", + "evidence": "inboundId=2085931054454583297", + "checkedAt": "2026-08-08T03:28:14.190Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "隔离入库单 marker 来源与可测量状态正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085931054454583297?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "c315f123-fca0-4e74-bcc2-ea3ec6e8f9e1, 2e7ad8a4-7ab3-467b-aaea-49d0e699884b", + "traceId": "c38992fd546d4646a14794ca832c3ffd", + "evidence": "markerFound=true, status=WAIT_MEASURE", + "checkedAt": "2026-08-08T03:28:14.190Z" + }, + { + "module": "orders", + "scenario": null, + "name": "入库单详情包含托盘库位、文件、备注和状态历史", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085931054454583297?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "c315f123-fca0-4e74-bcc2-ea3ec6e8f9e1, 2e7ad8a4-7ab3-467b-aaea-49d0e699884b", + "traceId": "c38992fd546d4646a14794ca832c3ffd", + "evidence": "inboundId=2085931054454583297, history=1", + "checkedAt": "2026-08-08T03:28:14.190Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 查询入库单列表", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds?tenantId=10001&inboundCode=RK-2085931050820239362&page=1&size=100" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "aeca1bae-c7f1-4126-8b03-2617375cae9b, d2be1e2e-f4f1-4759-af8d-611952d3874b", + "traceId": "6ed5092b5b5441baa2cbe0f9a97915a3", + "evidence": "", + "checkedAt": "2026-08-08T03:28:14.226Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 入库单列表只核对本轮入库单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds?tenantId=10001&inboundCode=RK-2085931050820239362&page=1&size=100" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "aeca1bae-c7f1-4126-8b03-2617375cae9b, d2be1e2e-f4f1-4759-af8d-611952d3874b", + "traceId": "6ed5092b5b5441baa2cbe0f9a97915a3", + "evidence": "inboundId=2085931054454583297, total=1", + "checkedAt": "2026-08-08T03:28:14.226Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "Admin 查询本轮订单履约任务", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/tasks/by-order/2085931050820239362?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "6a9e5707-2ace-433d-9860-f374f59075e1, dfd0db41-c45d-4a57-9869-cfb659923c95", + "traceId": "1bc1ede7b726463e8a582dc4b8659e5a", + "evidence": "新订单应生成可查询的履约任务", + "checkedAt": "2026-08-08T03:28:14.263Z" + }, + { + "module": "orders", + "scenario": "isolated-order-chain", + "name": "履约任务与本轮订单和客户一致", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/tasks/by-order/2085931050820239362?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "6a9e5707-2ace-433d-9860-f374f59075e1, dfd0db41-c45d-4a57-9869-cfb659923c95", + "traceId": "1bc1ede7b726463e8a582dc4b8659e5a", + "evidence": "taskId=2085931054450388994, status=PENDING_ASSIGNMENT", + "checkedAt": "2026-08-08T03:28:14.263Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 查询本轮履约任务分配历史", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/tasks/2085931054450388994/assignment-history?tenantId=10001&page=1&size=20" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "67097708-6afd-4753-8494-dd54f7f1f3d5, 7fd9574e-032c-4489-9e8a-58155b7f0b84", + "traceId": "8be96a0add4f414dbf935021a71e635a", + "evidence": "", + "checkedAt": "2026-08-08T03:28:14.298Z" + }, + { + "module": "orders", + "scenario": null, + "name": "履约分配历史分页结构正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/first-leg/tasks/2085931054450388994/assignment-history?tenantId=10001&page=1&size=20" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "67097708-6afd-4753-8494-dd54f7f1f3d5, 7fd9574e-032c-4489-9e8a-58155b7f0b84", + "traceId": "8be96a0add4f414dbf935021a71e635a", + "evidence": "taskId=2085931054450388994, total=0", + "checkedAt": "2026-08-08T03:28:14.298Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 受理本轮订单", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/orders/first-leg/2085931050820239362/accept?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "d8f35b88-01bc-4e98-8c33-74d281009c80, 91fddb7e-79a3-4b26-af6f-e37ec20c56db", + "traceId": "ce326074a21d46a4a29eec4a75f0c62a", + "evidence": "", + "checkedAt": "2026-08-08T03:28:14.333Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 启动本轮订单履约", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/v1/orders/first-leg/2085931050820239362/start?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "99a39a08-c557-4cb5-a462-cf2344893a49, 207fead7-890b-464b-9073-ce6299cc0c42", + "traceId": "d0577941025845c9916ebef6f73fcc5e", + "evidence": "", + "checkedAt": "2026-08-08T03:28:14.381Z" + }, + { + "module": "orders", + "scenario": null, + "name": "Admin 回查本轮订单履约状态", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/2085931050820239362?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "55774ee3-2dc8-4788-acf7-bb4d237e264a, f26ddd05-5ce8-4e9e-a04d-1b2940c4735c", + "traceId": "a3c61f03f935419ba26b2c56a60b14fc", + "evidence": "", + "checkedAt": "2026-08-08T03:28:14.422Z" + }, + { + "module": "orders", + "scenario": null, + "name": "本轮订单已进入处理中且保留状态历史", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/v1/orders/first-leg/2085931050820239362?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "55774ee3-2dc8-4788-acf7-bb4d237e264a, f26ddd05-5ce8-4e9e-a04d-1b2940c4735c", + "traceId": "a3c61f03f935419ba26b2c56a60b14fc", + "evidence": "status=PROCESSING, history=5", + "checkedAt": "2026-08-08T03:28:14.422Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "查询隔离入库单详情", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085931054454583297?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "2fcced52-0bd5-4556-bec2-42d03da7c537, 4d2f23da-0e1d-435d-8536-13da68d49f3e", + "traceId": "3a92932ada97406dad20aaaca07aa25e", + "evidence": "inboundId=2085931054454583297, tenantId=10001", + "checkedAt": "2026-08-08T03:28:14.453Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "隔离入库单身份与可测量状态正确", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085931054454583297?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "2fcced52-0bd5-4556-bec2-42d03da7c537, 4d2f23da-0e1d-435d-8536-13da68d49f3e", + "traceId": "3a92932ada97406dad20aaaca07aa25e", + "evidence": "identity=true, status=WAIT_MEASURE", + "checkedAt": "2026-08-08T03:28:14.454Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "生成箱唛 PDF 并冻结稳定箱码", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/inbounds/2085931054454583297/carton-label-pdf?tenantId=10001" + }, + "http": 200, + "code": null, + "message": "13912 bytes (application/pdf)", + "requestId": "a088ca3c-8890-422f-878b-931513d5b38e, 58ced8db-dadd-40a0-94a4-5d65dddcdd18, d71612e5-128a-4ca7-abbc-ac4dac4933a2", + "traceId": "400d50a9da404997996852f89661edbb, 5da8f9ffbc8f43eb851dba61914f42bb", + "evidence": "contentType=application/pdf, bytes=13912", + "checkedAt": "2026-08-08T03:28:14.617Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "首次打印后回查冻结箱数", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085931054454583297?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "9495e1d1-9d45-4657-a497-17607de3312e, 644fd49b-892f-4e8b-8e78-7945b4259622", + "traceId": "5238470e495e409a9bc61f4fb775c48f", + "evidence": "", + "checkedAt": "2026-08-08T03:28:14.655Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "首次打印按订单货物冻结原始总箱数", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "GET", + "path": "/api/platform/inbounds/2085931054454583297?tenantId=10001" + }, + "http": 200, + "code": "200", + "message": "success", + "requestId": "9495e1d1-9d45-4657-a497-17607de3312e, 644fd49b-892f-4e8b-8e78-7945b4259622", + "traceId": "5238470e495e409a9bc61f4fb775c48f", + "evidence": "inboundCodeStable=true, totalPackageCount=4", + "checkedAt": "2026-08-08T03:28:14.655Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "重复整单打印复用已冻结箱码映射", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/inbounds/2085931054454583297/carton-label-pdf?tenantId=10001" + }, + "http": 200, + "code": null, + "message": "13912 bytes (application/pdf)", + "requestId": "ebf34e36-e993-4e57-b397-a9d3498b45d6, 39b284b0-5136-4629-8c98-9f80d12d1296, 9ef79c16-6fbb-43cb-9d47-8802f661de6f", + "traceId": "0c8ef3d2659543ecbfa98cb5842914a8, cefc93dbacce4ecd839b0c6df0cd82c5", + "evidence": "boxCode=RK-2085931050820239362#4-1, contentType=application/pdf, bytes=13912", + "checkedAt": "2026-08-08T03:28:14.795Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "指定第1箱补打复用已冻结箱码映射", + "passed": true, + "deploymentBlocker": false, + "request": { + "method": "POST", + "path": "/api/platform/inbounds/2085931054454583297/carton-label-pdf?tenantId=10001&cartonIndex=1" + }, + "http": 200, + "code": null, + "message": "7742 bytes (application/pdf)", + "requestId": "90e47db4-b52b-46d2-8283-7aba12679382, 99b781ae-772f-4a4b-a94f-a8c8ad98e307, 347b857e-4c8e-4556-b023-005adfab62ef", + "traceId": "82adde44ab3a48f7a48b4fe1cf55ac37, ad5c7958ba6d49b98c6a8fca6d6cb7bc", + "evidence": "boxCode=RK-2085931050820239362#4-1, cartonIndex=1, contentType=application/pdf, bytes=7742", + "checkedAt": "2026-08-08T03:28:14.909Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "模拟墨家首次扫描单箱", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "POST", + "path": "/api/platform/v1/first-leg/inbounds/2085931054454583297/measurement/carton-scans?tenantId=10001" + }, + "http": 200, + "code": "A0422", + "message": "实测尺寸超出客户最大箱规,请先调整客户箱规后再提交测量", + "requestId": "ccf6c191-a85d-45dc-ba55-023dded0d7d0", + "traceId": "9110ac254d1c4577a565fc66234ab3e1", + "evidence": "boxCode=RK-2085931050820239362#4-1, machineNo=MJ-ADMIN-E2E-01", + "checkedAt": "2026-08-08T03:28:14.986Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "首次扫描新增一条且默认代表1箱", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "POST", + "path": "/api/platform/v1/first-leg/inbounds/2085931054454583297/measurement/carton-scans?tenantId=10001" + }, + "http": 200, + "code": "A0422", + "message": "实测尺寸超出客户最大箱规,请先调整客户箱规后再提交测量", + "requestId": "ccf6c191-a85d-45dc-ba55-023dded0d7d0", + "traceId": "9110ac254d1c4577a565fc66234ab3e1", + "evidence": "created=undefined, confirmedPackageCount=missing", + "checkedAt": "2026-08-08T03:28:14.986Z" + }, + { + "module": "inbound-measurement", + "scenario": "mojia-carton-measurement", + "name": "重复打印及指定箱补打后原箱码仍可解析", + "passed": false, + "deploymentBlocker": true, + "request": { + "method": "POST", + "path": "/api/platform/v1/first-leg/inbounds/2085931054454583297/measurement/carton-scans?tenantId=10001" + }, + "http": 200, + "code": "A0422", + "message": "实测尺寸超出客户最大箱规,请先调整客户箱规后再提交测量", + "requestId": "ccf6c191-a85d-45dc-ba55-023dded0d7d0", + "traceId": "9110ac254d1c4577a565fc66234ab3e1", + "evidence": "boxCodeStable=false, resolvedInboundId=2085931054454583297", + "checkedAt": "2026-08-08T03:28:14.986Z" + } + ] +} diff --git a/reports/client-phase2-test-env-20260808033152-30c7cede.json b/reports/client-phase2-test-env-20260808033152-30c7cede.json new file mode 100644 index 000000000..4f585e03b --- /dev/null +++ b/reports/client-phase2-test-env-20260808033152-30c7cede.json @@ -0,0 +1,140 @@ +{ + "marker": "20260808033152-30c7cede", + "gateway": "http://8.163.30.128:9000", + "generatedAt": "2026-08-08T03:31:52.981Z", + "completedAt": "2026-08-08T03:31:53.854Z", + "success": false, + "fatal": { + "name": "Error", + "message": "business code: expected=\"200\" actual=\"A0400\"" + }, + "testAccount": { + "username": "merchant_admin" + }, + "expectedTerminalState": { + "processStatus": "WAIT_SPLIT", + "measureReviewStatus": "APPROVED", + "feeStatus": "CONFIRMED" + }, + "resources": { + "tenantId": "10001", + "terminalInboundId": "2085909619958919170", + "terminalOrderId": "2085909608158265345", + "terminalInboundCode": "RK-2085909608158265345", + "pendingOrderId": "2085931050820239362", + "foreignOrderId": null, + "measurementImageFileIds": [], + "weightImageFileIds": [] + }, + "steps": [ + { + "module": "phase2-session", + "name": "client login", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:31:52.983Z", + "durationMs": 374, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-phase2-5ca244f4-1bed-4cce-a87f-9e53cd7eb893, client-phase2-5ca244f4-1bed-4cce-a87f-9e53cd7eb893", + "traceId": "b54f117ac5314d4c8154024ef181e6cd", + "evidence": { + "username": "merchant_admin" + } + }, + { + "module": "phase2-session", + "name": "load current enterprise profile", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:31:53.357Z", + "durationMs": 41, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-phase2-30b4cae2-7ed3-4ae8-9265-77c442c0cf70, client-phase2-30b4cae2-7ed3-4ae8-9265-77c442c0cf70", + "traceId": "4094b52e45fb4365af92ebfa37ea55d7", + "evidence": { + "tenantId": "10001", + "tenantName": "一期演示企业", + "status": "ACTIVE" + } + }, + { + "module": "phase2-session", + "name": "client has order view permission", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:31:53.398Z", + "durationMs": 25, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-phase2-b9da4226-9130-444a-8eda-5d810e5b2323, client-phase2-b9da4226-9130-444a-8eda-5d810e5b2323", + "traceId": "fb669cc4e4df4acbb1b576c1454d3da5", + "evidence": { + "permissionCount": 27 + } + }, + { + "module": "phase2-fixture", + "name": "platform fixture account login", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:31:53.423Z", + "durationMs": 354, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-phase2-649afafa-3728-47af-a530-a318ceb664f7, client-phase2-649afafa-3728-47af-a530-a318ceb664f7", + "traceId": "b60c28e9cda9483cac29b08c032ec8a4", + "evidence": { + "username": "platform_admin" + } + }, + { + "module": "phase2-fixture", + "name": "discover current enterprise inbound fixtures", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:31:53.778Z", + "durationMs": 47, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-phase2-45e96f9f-e7d9-461e-bb2b-682cc5ebb460, client-phase2-45e96f9f-e7d9-461e-bb2b-682cc5ebb460", + "traceId": "ae24d3d7603e4edd900dc4b6b6a693aa", + "evidence": { + "total": "23", + "statusCounts": { + "WAIT_MEASURE|NOT_SUBMITTED|UNPRICED": 10, + "MEASURING|NOT_SUBMITTED|UNPRICED": 9, + "WAIT_SPLIT|APPROVED|UNPRICED": 1, + "WAIT_SPLIT|APPROVED|CONFIRMED": 2, + "WAIT_SPLIT|APPROVED|CALCULATED": 1 + } + } + }, + { + "module": "phase2-fixture", + "name": "terminal state filters find selected inbound", + "passed": false, + "skipped": false, + "startedAt": "2026-08-08T03:31:53.825Z", + "durationMs": 29, + "http": 200, + "code": "A0400", + "message": "入库流程状态不合法", + "requestId": "client-phase2-ffdeb1e9-3493-42b4-928d-252d7d02fb75, client-phase2-ffdeb1e9-3493-42b4-928d-252d7d02fb75", + "traceId": "2f7c91ce5a284300ba40513c6e3c51e8", + "evidence": { + "inboundId": "2085909619958919170" + }, + "error": { + "name": "Error", + "message": "business code: expected=\"200\" actual=\"A0400\"" + } + } + ] +} diff --git a/reports/client-phase2-test-env-20260808033235-68aeee0f.json b/reports/client-phase2-test-env-20260808033235-68aeee0f.json new file mode 100644 index 000000000..81274e7db --- /dev/null +++ b/reports/client-phase2-test-env-20260808033235-68aeee0f.json @@ -0,0 +1,281 @@ +{ + "marker": "20260808033235-68aeee0f", + "gateway": "http://8.163.30.128:9000", + "generatedAt": "2026-08-08T03:32:35.635Z", + "completedAt": "2026-08-08T03:32:36.765Z", + "success": false, + "fatal": { + "name": "Error", + "message": "unified inbound process status: expected=\"WAIT_SPLIT\" actual=undefined" + }, + "testAccount": { + "username": "merchant_admin" + }, + "expectedTerminalState": { + "processStatus": "WAIT_SPLIT", + "measureReviewStatus": "APPROVED", + "feeStatus": "CONFIRMED" + }, + "resources": { + "tenantId": "10001", + "terminalInboundId": "2085909619958919170", + "terminalOrderId": "2085909608158265345", + "terminalInboundCode": "RK-2085909608158265345", + "pendingOrderId": "2085931050820239362", + "foreignOrderId": "2085665774056833025", + "measurementImageFileIds": [], + "weightImageFileIds": [] + }, + "steps": [ + { + "module": "phase2-session", + "name": "client login", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:32:35.639Z", + "durationMs": 388, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-phase2-85e84081-79ba-406f-8015-138be32cb552, client-phase2-85e84081-79ba-406f-8015-138be32cb552", + "traceId": "f42a864524af465cba6a8c6200b4f234", + "evidence": { + "username": "merchant_admin" + } + }, + { + "module": "phase2-session", + "name": "load current enterprise profile", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:32:36.027Z", + "durationMs": 36, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-phase2-1ca35db4-77a8-4dc7-aa6f-75aebdc4ef13, client-phase2-1ca35db4-77a8-4dc7-aa6f-75aebdc4ef13", + "traceId": "1e6ae512dcbf404b92af584481e67c9a", + "evidence": { + "tenantId": "10001", + "tenantName": "一期演示企业", + "status": "ACTIVE" + } + }, + { + "module": "phase2-session", + "name": "client has order view permission", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:32:36.063Z", + "durationMs": 29, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-phase2-096d6bf0-8bc7-48c0-a765-6b0603fc0c72, client-phase2-096d6bf0-8bc7-48c0-a765-6b0603fc0c72", + "traceId": "74d55387cbbe48738e57c7c6869bede9", + "evidence": { + "permissionCount": 27 + } + }, + { + "module": "phase2-fixture", + "name": "platform fixture account login", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:32:36.092Z", + "durationMs": 346, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-phase2-4b57e735-10d1-4f18-a4c0-673acb627ffd, client-phase2-4b57e735-10d1-4f18-a4c0-673acb627ffd", + "traceId": "75ccb2e620574a2ea42b5bbc374f610e", + "evidence": { + "username": "platform_admin" + } + }, + { + "module": "phase2-fixture", + "name": "discover current enterprise inbound fixtures", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:32:36.439Z", + "durationMs": 47, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-phase2-5fa80e12-1433-4a24-b0e7-6d98de4f03e4, client-phase2-5fa80e12-1433-4a24-b0e7-6d98de4f03e4", + "traceId": "b144c312406641c6830d0dcc9867826c", + "evidence": { + "total": "23", + "statusCounts": { + "WAIT_MEASURE|NOT_SUBMITTED|UNPRICED": 10, + "MEASURING|NOT_SUBMITTED|UNPRICED": 9, + "WAIT_SPLIT|APPROVED|UNPRICED": 1, + "WAIT_SPLIT|APPROVED|CONFIRMED": 2, + "WAIT_SPLIT|APPROVED|CALCULATED": 1 + } + } + }, + { + "module": "phase2-fixture", + "name": "terminal state filters find selected inbound", + "passed": false, + "skipped": false, + "startedAt": "2026-08-08T03:32:36.486Z", + "durationMs": 28, + "http": 200, + "code": "A0400", + "message": "入库流程状态不合法", + "requestId": "client-phase2-32c11a8c-89ac-43e8-b821-2a0c691e368e, client-phase2-32c11a8c-89ac-43e8-b821-2a0c691e368e", + "traceId": "165e30521b784f57b26ca872b67e851c", + "evidence": { + "inboundId": "2085909619958919170" + }, + "error": { + "name": "Error", + "message": "business code: expected=\"200\" actual=\"A0400\"" + } + }, + { + "module": "phase2-fixture", + "name": "load platform terminal inbound reference detail", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:32:36.514Z", + "durationMs": 40, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-phase2-508a51db-5fa9-4230-ab6a-886a0800e1aa, client-phase2-508a51db-5fa9-4230-ab6a-886a0800e1aa", + "traceId": "3242b70df83b48f38ed2aaab148ad526", + "evidence": { + "inboundId": "2085909619958919170", + "orderId": "2085909608158265345", + "processStatus": "WAIT_SPLIT", + "measureReviewStatus": "APPROVED", + "feeStatus": "CONFIRMED" + } + }, + { + "module": "phase2-fixture", + "name": "discover foreign terminal fixture for isolation", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:32:36.554Z", + "durationMs": 77, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-phase2-e9048af6-751a-4d20-907b-c6927551e605, client-phase2-e9048af6-751a-4d20-907b-c6927551e605", + "traceId": "7341d4ca976e406dafbaf99946f6ccce", + "evidence": { + "total": "263" + } + }, + { + "module": "phase2-client-visibility", + "name": "unfinished inbound billing remains unavailable", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:32:36.631Z", + "durationMs": 26, + "http": 200, + "code": "A0404", + "message": "入库费用尚未由客服审核并发布", + "requestId": "client-phase2-ec7e1084-4771-4826-abf5-3a2dba46b35c, client-phase2-ec7e1084-4771-4826-abf5-3a2dba46b35c", + "traceId": "55e4cb1379f84194904afa01ca512f33", + "evidence": { + "orderId": "2085931050820239362", + "processStatus": "WAIT_MEASURE", + "feeStatus": "UNPRICED", + "rejectionCode": "A0404" + } + }, + { + "module": "phase2-client-visibility", + "name": "unknown order inbound billing is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:32:36.657Z", + "durationMs": 32, + "http": 200, + "code": "A0404", + "message": "订单尚未生成入库单", + "requestId": "client-phase2-0e5386b8-8e94-4b39-8985-72212f8abea6, client-phase2-0e5386b8-8e94-4b39-8985-72212f8abea6", + "traceId": "8d7a1a400fde487f9cf8cde02816833d", + "evidence": { + "orderId": 1, + "rejectionCode": "A0404" + } + }, + { + "module": "phase2-client-billing", + "name": "terminal inbound billing is visible to client", + "passed": false, + "skipped": false, + "startedAt": "2026-08-08T03:32:36.689Z", + "durationMs": 38, + "http": 200, + "code": "A0404", + "message": "入库费用尚未由客服审核并发布", + "requestId": "client-phase2-5e202092-4bcd-4b1b-80f7-ebdce6a082c0, client-phase2-5e202092-4bcd-4b1b-80f7-ebdce6a082c0", + "traceId": "0b5d5257ee3e48579fe20b2eaf1dd167", + "evidence": { + "rejectionCode": "A0404" + }, + "error": { + "name": "Error", + "message": "business code: expected=\"200\" actual=\"A0404\"" + } + }, + { + "module": "phase2-client-billing", + "name": "terminal billing aggregate contract", + "passed": true, + "skipped": true, + "startedAt": "2026-08-08T03:32:36.727Z", + "durationMs": 0, + "http": null, + "code": null, + "message": "Terminal billing endpoint did not return a visible aggregate", + "requestId": null, + "traceId": null, + "evidence": null + }, + { + "module": "phase2-client-images", + "name": "published measurement and weight image access", + "passed": true, + "skipped": true, + "startedAt": "2026-08-08T03:32:36.727Z", + "durationMs": 0, + "http": null, + "code": null, + "message": "Terminal billing endpoint did not return image references", + "requestId": null, + "traceId": null, + "evidence": null + }, + { + "module": "phase2-unified-orders", + "name": "unified order list exposes phase-two terminal state", + "passed": false, + "skipped": false, + "startedAt": "2026-08-08T03:32:36.727Z", + "durationMs": 38, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-phase2-be5cd526-769a-4364-be2d-9e1a923a0272, client-phase2-be5cd526-769a-4364-be2d-9e1a923a0272", + "traceId": "cd41c009b91a4234861633b2eeb02641", + "evidence": { + "orderId": "2085909608158265345", + "mainStatus": "INBOUNDED" + }, + "error": { + "name": "Error", + "message": "unified inbound process status: expected=\"WAIT_SPLIT\" actual=undefined" + } + } + ] +} diff --git a/reports/client-test-env-20260808031955-989a499b.json b/reports/client-test-env-20260808031955-989a499b.json new file mode 100644 index 000000000..8fafcddfa --- /dev/null +++ b/reports/client-test-env-20260808031955-989a499b.json @@ -0,0 +1,3194 @@ +{ + "marker": "20260808031955-989a499b", + "gateway": "http://8.163.30.128:9000", + "generatedAt": "2026-08-08T03:19:55.962Z", + "completedAt": "2026-08-08T03:20:12.372Z", + "success": false, + "fatal": null, + "testAccount": { + "username": "client_20260808031955_7db794", + "companyName": "客户端全链路测试企业-20260808031955-989a499b", + "legalPhone": "13959195963" + }, + "resources": { + "tenantId": "2085928969274249218", + "membershipId": "2085928969274249220", + "reviewId": "2085928975829946370", + "businessLicenseQualificationId": "2085928974533906434", + "businessLicenseDocumentUrl": "/api/merchant/v1/files/qualifications/51f454a8-47c4-4226-b58c-c46d477f3755.png", + "productImageFileId": "2085929012468187137", + "enterpriseAddressId": "2085928980879888385", + "receivingWarehouseId": "193000000000200001", + "destinationWarehouseId": "193000000000000001", + "channelCode": "EXX_RAIL_NY", + "roleId": null, + "testMembershipId": "2085928984952557572", + "orderIds": [ + "2085928973758955521", + "2085929015710384129", + "2085929019917271041" + ] + }, + "steps": [ + { + "module": "registration", + "name": "enterprise self-registration", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:19:55.963Z", + "durationMs": 608, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-27d6824c-e348-4e3d-8b72-8dcc1ade1829, client-e2e-27d6824c-e348-4e3d-8b72-8dcc1ade1829", + "traceId": "3e56bee60306480c82f3ae205d31b9ac", + "evidence": { + "tenantId": "2085928969274249218", + "membershipId": "2085928969274249220", + "tenantStatus": "PROFILE_REQUIRED", + "nextStep": "LOGIN_AND_COMPLETE_QUALIFICATIONS" + } + }, + { + "module": "registration", + "name": "duplicate username is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:19:56.574Z", + "durationMs": 39, + "http": 200, + "code": "A0409", + "message": "Username already exists", + "requestId": "client-e2e-c56deb50-1bdd-40e9-9d67-26a4e172b043, client-e2e-c56deb50-1bdd-40e9-9d67-26a4e172b043", + "traceId": "788c5eacdef24152815cdcd1b06f2eea", + "evidence": null + }, + { + "module": "registration", + "name": "login before approval", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:19:56.614Z", + "durationMs": 355, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-cc0339e2-3083-4254-90c4-a409a93504a1, client-e2e-cc0339e2-3083-4254-90c4-a409a93504a1", + "traceId": "97ec785c247f49d79155e539f03d70aa", + "evidence": { + "username": "client_20260808031955_7db794" + } + }, + { + "module": "registration", + "name": "profile is incomplete before qualifications", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:19:56.972Z", + "durationMs": 36, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-7f904595-839c-4234-96b5-30c287ef74d8, client-e2e-7f904595-839c-4234-96b5-30c287ef74d8", + "traceId": "f8167f01429447709de1c966e6707e50", + "evidence": { + "id": "2085928969274249218", + "status": "PROFILE_REQUIRED", + "tenantName": "客户端全链路测试企业-20260808031955-989a499b" + } + }, + { + "module": "pre-approval-master-data", + "name": "load active domestic receiving warehouses", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:19:57.009Z", + "durationMs": 36, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-a6c681a9-a895-4b4d-9710-7a3c62187ea3, client-e2e-a6c681a9-a895-4b4d-9710-7a3c62187ea3", + "traceId": "baa603a2ffb044939ade506a16766b98", + "evidence": { + "total": "2", + "warehouseCount": 2 + } + }, + { + "module": "pre-approval-master-data", + "name": "load active FBA destination warehouses", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:19:57.046Z", + "durationMs": 71, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-45dd03dd-66b9-4dc1-962c-5c49c1a9bc0c, client-e2e-45dd03dd-66b9-4dc1-962c-5c49c1a9bc0c", + "traceId": "25f95e8609614a68a7fb9c110da9e9cc", + "evidence": { + "total": "253", + "warehouseCount": 200 + } + }, + { + "module": "pre-approval-master-data", + "name": "load receiving warehouse detail", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:19:57.118Z", + "durationMs": 39, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-fd2b99b5-b08a-46b1-ad87-2f4fa0452526, client-e2e-fd2b99b5-b08a-46b1-ad87-2f4fa0452526", + "traceId": "d39c540577fa47b2bc595cccb43ec613", + "evidence": { + "id": "193000000000200001", + "name": "义乌仓" + } + }, + { + "module": "pre-approval-master-data", + "name": "load active pricing channels", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:19:57.158Z", + "durationMs": 58, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-8baf6547-887f-474f-a8f9-b0d481945aaf, client-e2e-8baf6547-887f-474f-a8f9-b0d481945aaf", + "traceId": "c4bedf40a1d1448d98149bb48ba61c38", + "evidence": { + "channels": [ + { + "channelCode": "EXX_RAIL_NY", + "priceModel": "FBA_WAREHOUSE_RATE", + "pricingTaxModes": [ + "TAX_INCLUDED", + "TAX_EXCLUDED" + ] + }, + { + "channelCode": "EXX_TRUCK", + "priceModel": "FBA_WAREHOUSE_RATE", + "pricingTaxModes": [ + "TAX_INCLUDED", + "TAX_EXCLUDED" + ] + }, + { + "channelCode": "HEDE_PARCEL", + "priceModel": "REGION_WEIGHT_TIER", + "pricingTaxModes": [ + "TAX_INCLUDED" + ] + }, + { + "channelCode": "HEDE_TRUCK", + "priceModel": "FBA_WAREHOUSE_RATE", + "pricingTaxModes": [ + "TAX_INCLUDED", + "TAX_EXCLUDED" + ] + }, + { + "channelCode": "MATSON_CLX_PARCEL", + "priceModel": "REGION_WEIGHT_TIER", + "pricingTaxModes": [ + "TAX_INCLUDED" + ] + }, + { + "channelCode": "MATSON_CLX_TRUCK", + "priceModel": "FBA_WAREHOUSE_RATE", + "pricingTaxModes": [ + "TAX_INCLUDED", + "TAX_EXCLUDED" + ] + }, + { + "channelCode": "MATSON_MAX_PARCEL", + "priceModel": "REGION_WEIGHT_TIER", + "pricingTaxModes": [ + "TAX_INCLUDED" + ] + }, + { + "channelCode": "MATSON_MAX_TRUCK", + "priceModel": "FBA_WAREHOUSE_RATE", + "pricingTaxModes": [ + "TAX_INCLUDED", + "TAX_EXCLUDED" + ] + }, + { + "channelCode": "OA_CHICAGO_RAIL", + "priceModel": "FBA_WAREHOUSE_RATE", + "pricingTaxModes": [ + "TAX_INCLUDED", + "TAX_EXCLUDED" + ] + }, + { + "channelCode": "OA_HOUSTON_TRUCK", + "priceModel": "FBA_WAREHOUSE_RATE", + "pricingTaxModes": [ + "TAX_INCLUDED", + "TAX_EXCLUDED" + ] + }, + { + "channelCode": "OA_LA_FULL_TRUCK", + "priceModel": "FBA_WAREHOUSE_RATE", + "pricingTaxModes": [ + "TAX_INCLUDED", + "TAX_EXCLUDED" + ] + }, + { + "channelCode": "OA_LA_TRUCK", + "priceModel": "FBA_WAREHOUSE_RATE", + "pricingTaxModes": [ + "TAX_INCLUDED", + "TAX_EXCLUDED" + ] + }, + { + "channelCode": "OA_NEW_YORK_TRUCK", + "priceModel": "FBA_WAREHOUSE_RATE", + "pricingTaxModes": [ + "TAX_INCLUDED", + "TAX_EXCLUDED" + ] + }, + { + "channelCode": "OA_PARCEL", + "priceModel": "REGION_WEIGHT_TIER", + "pricingTaxModes": [ + "TAX_INCLUDED" + ] + }, + { + "channelCode": "OA_SAVANNAH_TRUCK", + "priceModel": "FBA_WAREHOUSE_RATE", + "pricingTaxModes": [ + "TAX_INCLUDED", + "TAX_EXCLUDED" + ] + } + ] + } + }, + { + "module": "pre-approval-master-data", + "name": "load public shipper candidates", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:19:57.217Z", + "durationMs": 30, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-44dcfa5f-664c-49b1-85b6-0a4c801d6e7a, client-e2e-44dcfa5f-664c-49b1-85b6-0a4c801d6e7a", + "traceId": "856f181eb5c54c52b6797a6198c49cbb", + "evidence": { + "candidateCount": 3 + } + }, + { + "module": "pre-approval-product-image", + "name": "upload product image", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:19:57.248Z", + "durationMs": 34, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-8d0541b9-9fa8-45f6-8723-6abb26453ce6, client-e2e-8d0541b9-9fa8-45f6-8723-6abb26453ce6", + "traceId": "fe909f47cb2b4df38f513450e08220d4", + "evidence": { + "fileId": "2085928973071089665", + "fileName": "product-20260808031955-989a499b.png", + "contentType": "image/png", + "sizeBytes": "68" + } + }, + { + "module": "order-validation", + "name": "missing pricingTaxMode is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:19:57.283Z", + "durationMs": 69, + "http": 200, + "code": "A0422", + "message": "pricingTaxMode: must not be blank", + "requestId": "client-e2e-efd1278c-1295-442a-9611-e3e4187b0b76, client-e2e-efd1278c-1295-442a-9611-e3e4187b0b76", + "traceId": "1c9f6d8c838945038dc3d3ca4ef7dc66", + "evidence": null + }, + { + "module": "order-before-approval", + "name": "create draft before approval", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:19:57.353Z", + "durationMs": 95, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-ad747334-54f5-4b30-a1c1-45d90a0fe6bd, client-e2e-ad747334-54f5-4b30-a1c1-45d90a0fe6bd", + "traceId": "4e727798879441028af44683a3e92049", + "evidence": { + "orderId": "2085928973758955521", + "status": "DRAFT" + } + }, + { + "module": "order-before-approval", + "name": "create draft idempotent replay", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:19:57.449Z", + "durationMs": 32, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-f3cee89f-23d4-4c39-a522-64b4ca7d7fc4, client-e2e-f3cee89f-23d4-4c39-a522-64b4ca7d7fc4", + "traceId": "b2745fbf078243889db0db60b2e6ed5e", + "evidence": { + "orderId": "2085928973758955521", + "replayed": true + } + }, + { + "module": "order-before-approval", + "name": "submit is blocked before approval", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:19:57.481Z", + "durationMs": 56, + "http": 200, + "code": "A0403", + "message": "Enterprise information must be approved before ordering", + "requestId": "client-e2e-ed9ac2ec-c4c0-4e96-b7ab-b828269ba86a, client-e2e-ed9ac2ec-c4c0-4e96-b7ab-b828269ba86a", + "traceId": "273739eeb0144285a5fe09f9f6e5abb5", + "evidence": { + "orderId": "2085928973758955521", + "rejectionCode": "A0403" + } + }, + { + "module": "qualification-review", + "name": "upload required qualification package", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:19:57.538Z", + "durationMs": 120, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-2eda2880-b9fa-45ef-821a-4217aac0afb1, client-e2e-2eda2880-b9fa-45ef-821a-4217aac0afb1", + "traceId": "4be71d6e35da438eb48885c19aa62d91", + "evidence": { + "businessLicenseQualificationId": "2085928974533906434", + "legalPersonIdQualificationId": "2085928974554877954", + "tenantStatus": "PROFILE_REQUIRED" + } + }, + { + "module": "qualification-review", + "name": "upload optional qualification FREIGHT_FORWARDER_CERTIFICATE", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:19:57.659Z", + "durationMs": 68, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-37fc3ff2-51a8-44e1-bc3d-efb87fc169ab, client-e2e-37fc3ff2-51a8-44e1-bc3d-efb87fc169ab", + "traceId": "a9bb8f55c9f340be9e64bde5f0c67ede", + "evidence": { + "qualificationType": "FREIGHT_FORWARDER_CERTIFICATE", + "qualificationId": "2085928974911393793", + "tenantStatus": "PROFILE_REQUIRED" + } + }, + { + "module": "qualification-review", + "name": "upload optional qualification BANK_ACCOUNT_LICENSE", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:19:57.728Z", + "durationMs": 44, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-a11a7ff4-7ef4-44bf-ba41-2880068e4682, client-e2e-a11a7ff4-7ef4-44bf-ba41-2880068e4682", + "traceId": "ec7cf38a2dc54c0b976ab8f99fed1e2d", + "evidence": { + "qualificationType": "BANK_ACCOUNT_LICENSE", + "qualificationId": "2085928975112720385", + "tenantStatus": "PROFILE_REQUIRED" + } + }, + { + "module": "qualification-review", + "name": "duplicate optional qualification requires explicit replacement", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:19:57.773Z", + "durationMs": 37, + "http": 200, + "code": "A0409", + "message": "Qualification type already uploaded / 该类资质已上传", + "requestId": "client-e2e-37c15e99-3172-47f1-ba2e-c0bbf3b07354, client-e2e-37c15e99-3172-47f1-ba2e-c0bbf3b07354", + "traceId": "859674f2c39d48b7a0fc904739187e40", + "evidence": { + "qualificationType": "FREIGHT_FORWARDER_CERTIFICATE", + "rejectionCode": "A0409" + } + }, + { + "module": "qualification-review", + "name": "replace optional qualification explicitly", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:19:57.811Z", + "durationMs": 56, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-aadcf93e-7050-4ded-8f98-e6ae1c28b73b, client-e2e-aadcf93e-7050-4ded-8f98-e6ae1c28b73b", + "traceId": "0cc8eb20961047049abc09063a4bee2c", + "evidence": { + "qualificationType": "FREIGHT_FORWARDER_CERTIFICATE", + "qualificationId": "2085928975511179266", + "replaced": true + } + }, + { + "module": "qualification-review", + "name": "required qualifications are pending", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:19:57.867Z", + "durationMs": 23, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-f8f56399-d3a7-4a7b-bcd7-08a71703e80e, client-e2e-f8f56399-d3a7-4a7b-bcd7-08a71703e80e", + "traceId": "4f20fbcb525448ddb465c530b973f29b", + "evidence": { + "qualifications": [ + { + "qualificationId": "2085928974533906434", + "qualificationType": "BUSINESS_LICENSE", + "status": "PENDING" + }, + { + "qualificationId": "2085928974554877954", + "qualificationType": "LEGAL_PERSON_ID", + "status": "PENDING" + }, + { + "qualificationId": "2085928975112720385", + "qualificationType": "BANK_ACCOUNT_LICENSE", + "status": "PENDING" + }, + { + "qualificationId": "2085928975511179266", + "qualificationType": "FREIGHT_FORWARDER_CERTIFICATE", + "status": "PENDING" + }, + { + "qualificationId": "2085928974911393793", + "qualificationType": "FREIGHT_FORWARDER_CERTIFICATE", + "status": "SUPERSEDED" + } + ] + } + }, + { + "module": "qualification-review", + "name": "submit enterprise review", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:19:57.890Z", + "durationMs": 51, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-f5a7bef6-08ba-40b1-a44e-f788069f3dab, client-e2e-f5a7bef6-08ba-40b1-a44e-f788069f3dab", + "traceId": "84647967c1344486b128855c952d5d21", + "evidence": { + "tenantId": "2085928969274249218", + "status": "PENDING" + } + }, + { + "module": "qualification-review", + "name": "platform reviewer login", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:19:57.941Z", + "durationMs": 339, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-352f8546-f941-480c-96d7-3ee0d983da7c, client-e2e-352f8546-f941-480c-96d7-3ee0d983da7c", + "traceId": "3e362fd73ea24cf9a39d59a0368aab27", + "evidence": { + "username": "platform_admin" + } + }, + { + "module": "qualification-review", + "name": "platform finds pending review", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:19:58.282Z", + "durationMs": 37, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-cad5ede9-3cef-4a7f-9a28-4da2af466915, client-e2e-cad5ede9-3cef-4a7f-9a28-4da2af466915", + "traceId": "9320099d0c6a4bce93fc7a7fb046f8b0", + "evidence": { + "reviewId": "2085928975829946370", + "tenantId": "2085928969274249218", + "status": "PENDING" + } + }, + { + "module": "qualification-review", + "name": "platform sees required qualifications", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:19:58.319Z", + "durationMs": 31, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-5efd9aba-bdaa-47a0-b2e6-6bce9cbc1444, client-e2e-5efd9aba-bdaa-47a0-b2e6-6bce9cbc1444", + "traceId": "47f2f0424e634399befd0a83d9775e17", + "evidence": { + "qualifications": [ + { + "qualificationId": "2085928974533906434", + "qualificationType": "BUSINESS_LICENSE", + "status": "PENDING" + }, + { + "qualificationId": "2085928974554877954", + "qualificationType": "LEGAL_PERSON_ID", + "status": "PENDING" + }, + { + "qualificationId": "2085928975112720385", + "qualificationType": "BANK_ACCOUNT_LICENSE", + "status": "PENDING" + }, + { + "qualificationId": "2085928975511179266", + "qualificationType": "FREIGHT_FORWARDER_CERTIFICATE", + "status": "PENDING" + }, + { + "qualificationId": "2085928974911393793", + "qualificationType": "FREIGHT_FORWARDER_CERTIFICATE", + "status": "SUPERSEDED" + } + ] + } + }, + { + "module": "qualification-review", + "name": "platform approves enterprise", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:19:58.350Z", + "durationMs": 66, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-2310b333-281e-4e91-b49f-61c05d43f1ec, client-e2e-2310b333-281e-4e91-b49f-61c05d43f1ec", + "traceId": "c85433218f03439d906f2f34a743ad7b", + "evidence": { + "tenantId": "2085928969274249218", + "administratorCreated": false, + "generatedCredentialsReturned": false + } + }, + { + "module": "qualification-review", + "name": "registered account remains enterprise owner", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:19:58.417Z", + "durationMs": 37, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-43fa245a-63d7-46fd-878a-804f4c701ef3, client-e2e-43fa245a-63d7-46fd-878a-804f4c701ef3", + "traceId": "a3a30506d1804698ae161ba36a321b48", + "evidence": { + "membershipId": "2085928969274249220", + "username": "client_20260808031955_7db794", + "memberType": "OWNER", + "status": "ACTIVE" + } + }, + { + "module": "merchant-session", + "name": "client re-login after approval", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:19:58.455Z", + "durationMs": 346, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-3d1aa3ea-1c81-4034-8e82-a0664dd69857, client-e2e-3d1aa3ea-1c81-4034-8e82-a0664dd69857", + "traceId": "690b0b42ef904765ac98f019a65c2443", + "evidence": { + "username": "client_20260808031955_7db794" + } + }, + { + "module": "merchant-session", + "name": "profile is active after approval", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:19:58.802Z", + "durationMs": 24, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-cdc38098-bea7-43eb-96f6-d5173b4f92f3, client-e2e-cdc38098-bea7-43eb-96f6-d5173b4f92f3", + "traceId": "120ca8666cb543c4855472d565e2950f", + "evidence": { + "id": "2085928969274249218", + "status": "ACTIVE", + "tenantName": "客户端全链路测试企业-20260808031955-989a499b" + } + }, + { + "module": "merchant-session", + "name": "required qualifications are approved", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:19:58.827Z", + "durationMs": 29, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-f25cbe37-479a-4199-a0a7-746e236475cb, client-e2e-f25cbe37-479a-4199-a0a7-746e236475cb", + "traceId": "d850f14a455749de8fdd036cdab1b0b8", + "evidence": { + "qualifications": [ + { + "qualificationId": "2085928974533906434", + "qualificationType": "BUSINESS_LICENSE", + "status": "APPROVED" + }, + { + "qualificationId": "2085928974554877954", + "qualificationType": "LEGAL_PERSON_ID", + "status": "APPROVED" + }, + { + "qualificationId": "2085928975112720385", + "qualificationType": "BANK_ACCOUNT_LICENSE", + "status": "APPROVED" + }, + { + "qualificationId": "2085928975511179266", + "qualificationType": "FREIGHT_FORWARDER_CERTIFICATE", + "status": "APPROVED" + }, + { + "qualificationId": "2085928974911393793", + "qualificationType": "FREIGHT_FORWARDER_CERTIFICATE", + "status": "SUPERSEDED" + } + ] + } + }, + { + "module": "merchant-session", + "name": "preview approved qualification file", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:19:58.857Z", + "durationMs": 32, + "http": 200, + "code": null, + "message": null, + "requestId": "client-e2e-4aae18f2-087a-4cea-92a4-7782e39a3921, client-e2e-4aae18f2-087a-4cea-92a4-7782e39a3921", + "traceId": "924ee9e8c2004f52a7aa77c9d3baacb4", + "evidence": { + "sizeBytes": 68, + "contentType": "image/png" + } + }, + { + "module": "profile-management", + "name": "load enterprise profile for editing", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:19:58.890Z", + "durationMs": 29, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-aa296207-a14e-489d-a63e-ed3c8fe64df9, client-e2e-aa296207-a14e-489d-a63e-ed3c8fe64df9", + "traceId": "3a171c2cb12b441c8b37961460b17786", + "evidence": { + "id": "2085928969274249218", + "tenantName": "客户端全链路测试企业-20260808031955-989a499b", + "status": "ACTIVE" + } + }, + { + "module": "profile-management", + "name": "edit enterprise profile", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:19:58.920Z", + "durationMs": 57, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-194b460c-4101-442f-b80f-802c04850edb, client-e2e-194b460c-4101-442f-b80f-802c04850edb", + "traceId": "5e7da47c515741f19cda374034bf1205", + "evidence": { + "id": "2085928969274249218", + "tenantName": "客户端全链路测试企业-20260808031955-989a499b-已编辑", + "contactName": "企业联系人-20260808031955-989a499b", + "status": "ACTIVE" + } + }, + { + "module": "profile-management", + "name": "enterprise profile edit is persisted", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:19:58.978Z", + "durationMs": 34, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-d9f7f1a7-a59f-402d-8023-2c597b7bb982, client-e2e-d9f7f1a7-a59f-402d-8023-2c597b7bb982", + "traceId": "ca20674d1c9645a5b3a2ddcd2f73afe6", + "evidence": { + "id": "2085928969274249218", + "tenantName": "客户端全链路测试企业-20260808031955-989a499b-已编辑", + "contactEmail": "company_20260808031955989a499b@example.com" + } + }, + { + "module": "profile-validation", + "name": "invalid enterprise contact email is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:19:59.013Z", + "durationMs": 53, + "http": 200, + "code": "A0422", + "message": "contactEmail: must be a well-formed email address", + "requestId": "client-e2e-555f1f2b-0b1b-41d3-ad29-7821d2daddf1, client-e2e-555f1f2b-0b1b-41d3-ad29-7821d2daddf1", + "traceId": "cfe1a50cdf834923bf9aeccbc8f97196", + "evidence": { + "rejectionCode": "A0422" + } + }, + { + "module": "profile-validation", + "name": "blank enterprise address detail is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:19:59.066Z", + "durationMs": 42, + "http": 200, + "code": "A0422", + "message": "detail: must not be blank", + "requestId": "client-e2e-4bd4a5a5-01f5-42fc-a8d7-4e8b8edadc90, client-e2e-4bd4a5a5-01f5-42fc-a8d7-4e8b8edadc90", + "traceId": "3e55406f53c04674ba63eb516263f852", + "evidence": { + "rejectionCode": "A0422" + } + }, + { + "module": "profile-management", + "name": "add enterprise operating address", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:19:59.109Z", + "durationMs": 33, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-ef3e54c4-9397-4dd5-946e-ffa6adb5e0b9, client-e2e-ef3e54c4-9397-4dd5-946e-ffa6adb5e0b9", + "traceId": "f114671ff73a4b1bad0b15d840ec90a0", + "evidence": { + "id": "2085928980879888385", + "addressType": "OPERATING", + "city": "深圳市", + "isDefault": true + } + }, + { + "module": "profile-management", + "name": "enterprise address list contains created address", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:19:59.143Z", + "durationMs": 27, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-01eec343-9546-46ae-aeea-102847e683cb, client-e2e-01eec343-9546-46ae-aeea-102847e683cb", + "traceId": "beb784cee5a34a8faccda62ebe1e62c0", + "evidence": { + "addressCount": 2, + "addressId": "2085928980879888385" + } + }, + { + "module": "profile-management", + "name": "platform can read created enterprise address", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:19:59.170Z", + "durationMs": 34, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-4d67996b-18ab-42e3-91c9-0d4f3ebb1c1f, client-e2e-4d67996b-18ab-42e3-91c9-0d4f3ebb1c1f", + "traceId": "e573a38c5d6543179ccdc5b468b42060", + "evidence": { + "addressCount": 2, + "addressId": "2085928980879888385" + } + }, + { + "module": "profile-management", + "name": "load personal profile", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:19:59.205Z", + "durationMs": 26, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-fcb71b53-84f9-46ac-b200-7ed1d9dfdf63, client-e2e-fcb71b53-84f9-46ac-b200-7ed1d9dfdf63", + "traceId": "08d51fe6604b41eb936f6c4369e51827", + "evidence": { + "userId": "2085928969274249219", + "username": "client_20260808031955_7db794", + "displayName": "测试管理员-20260808031955-989a499b" + } + }, + { + "module": "profile-validation", + "name": "invalid personal email is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:19:59.232Z", + "durationMs": 32, + "http": 200, + "code": "A0422", + "message": "email: must be a well-formed email address", + "requestId": "client-e2e-501340e0-58b4-4d02-9c30-d447ae143cc4, client-e2e-501340e0-58b4-4d02-9c30-d447ae143cc4", + "traceId": "18818f0105de4ab3a96b231551a87c90", + "evidence": { + "rejectionCode": "A0422" + } + }, + { + "module": "profile-management", + "name": "edit personal profile", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:19:59.265Z", + "durationMs": 39, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-028d6330-734f-4683-a286-633c13abf4b3, client-e2e-028d6330-734f-4683-a286-633c13abf4b3", + "traceId": "8d5f0365eee54c18845380877a741882", + "evidence": { + "userId": "2085928969274249219", + "username": "client_20260808031955_7db794", + "displayName": "测试企业管理员-20260808031955-989a499b" + } + }, + { + "module": "profile-management", + "name": "re-login after personal profile token revocation", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:19:59.305Z", + "durationMs": 347, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-71eb6673-daa0-43f9-847b-477c1d42641e, client-e2e-71eb6673-daa0-43f9-847b-477c1d42641e", + "traceId": "68aa3d72eb10476f865604cac8b37d32", + "evidence": { + "username": "client_20260808031955_7db794" + } + }, + { + "module": "profile-management", + "name": "personal profile edit is persisted", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:19:59.654Z", + "durationMs": 28, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-bb673f08-d89b-45ca-9ea5-60f55ecdbd43, client-e2e-bb673f08-d89b-45ca-9ea5-60f55ecdbd43", + "traceId": "718de2e58b92418cba5ad49c7ff3bace", + "evidence": { + "userId": "2085928969274249219", + "username": "client_20260808031955_7db794", + "displayName": "测试企业管理员-20260808031955-989a499b" + } + }, + { + "module": "rbac-member", + "name": "load merchant permission resources", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:19:59.683Z", + "durationMs": 30, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-767044c9-d837-4858-bc9a-1e93fc62e4cf, client-e2e-767044c9-d837-4858-bc9a-1e93fc62e4cf", + "traceId": "4882c3372e3c4174998c0ba520272c46", + "evidence": { + "permissionCount": 27 + } + }, + { + "module": "menu-permissions", + "name": "load owner effective permissions", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:19:59.714Z", + "durationMs": 31, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-dfcc0548-9a32-458f-8fa7-d808ca9427ad, client-e2e-dfcc0548-9a32-458f-8fa7-d808ca9427ad", + "traceId": "8e988b2af21c4e6f8cb7bac12a227b5b", + "evidence": { + "backendPermissionCount": 27, + "visibleClientMenus": [ + "account:profile:view", + "company:member:list", + "company:permission:list", + "company:profile:view", + "company:role:list", + "dashboard:view", + "order:first-leg:list" + ] + } + }, + { + "module": "rbac-member", + "name": "load initial merchant roles", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:19:59.745Z", + "durationMs": 28, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-f2684fc0-37ee-49c7-ab5c-d695f5c3a897, client-e2e-f2684fc0-37ee-49c7-ab5c-d695f5c3a897", + "traceId": "64654b5be8434764be8192d3fcb14d1d", + "evidence": { + "roleCount": 0 + } + }, + { + "module": "rbac-member", + "name": "create custom role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:19:59.773Z", + "durationMs": 42, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-e88726d9-4b25-47b3-8fc3-e2cfe12ff4ca, client-e2e-e88726d9-4b25-47b3-8fc3-e2cfe12ff4ca", + "traceId": "18ce3174ef994d1a83e3430964638f22", + "evidence": { + "roleId": "2085928983694266369", + "roleCode": "E2E_20260808031955_989a499b", + "roleType": "CUSTOM", + "status": "ACTIVE" + } + }, + { + "module": "rbac-member", + "name": "grant permissions to custom role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:19:59.815Z", + "durationMs": 55, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-efe70666-1ec8-48d5-be11-4f68a30e50e3, client-e2e-efe70666-1ec8-48d5-be11-4f68a30e50e3", + "traceId": "5b0f22bebfd1416e995847d326993dc1", + "evidence": { + "roleId": "2085928983694266369", + "permissionIds": [ + "5301010", + "5301011" + ], + "permissionCodes": [ + "merchant:order:list", + "merchant:order:view" + ] + } + }, + { + "module": "rbac-member", + "name": "custom role permission detail is persisted", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:19:59.871Z", + "durationMs": 30, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-8c44e56e-7b48-4998-9f51-045ecb662269, client-e2e-8c44e56e-7b48-4998-9f51-045ecb662269", + "traceId": "f3479985c8cd4fcf92f2059af63182fd", + "evidence": { + "roleId": "2085928983694266369", + "roleName": "订单只读-20260808031955-989a499b", + "permissionIds": [ + "5301011", + "5301010" + ] + } + }, + { + "module": "rbac-member", + "name": "edit custom role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:19:59.901Z", + "durationMs": 35, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-469bd6bc-7c77-4db5-9fc8-2fb227ff6c9d, client-e2e-469bd6bc-7c77-4db5-9fc8-2fb227ff6c9d", + "traceId": "c46cd16c2269452ebe8dbe19d76b3710", + "evidence": { + "roleId": "2085928983694266369", + "roleName": "订单查询员-20260808031955-989a499b", + "description": "edited 20260808031955-989a499b" + } + }, + { + "module": "rbac-member", + "name": "disable custom role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:19:59.937Z", + "durationMs": 51, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-df97af04-b43f-4038-bd1a-e164fb47cd9d, client-e2e-df97af04-b43f-4038-bd1a-e164fb47cd9d", + "traceId": "90cd98f74ad54c3a9e3c0e902d976963", + "evidence": { + "roleId": "2085928983694266369", + "status": "DISABLED" + } + }, + { + "module": "rbac-member", + "name": "enable custom role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:19:59.989Z", + "durationMs": 44, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-ab692e1b-70a6-4e7a-aabc-d0ad4b0d5c04, client-e2e-ab692e1b-70a6-4e7a-aabc-d0ad4b0d5c04", + "traceId": "57a0022330d94a9b9732a3368bde5c39", + "evidence": { + "roleId": "2085928983694266369", + "status": "ACTIVE" + } + }, + { + "module": "member-validation", + "name": "member with weak password and invalid email is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:00.034Z", + "durationMs": 46, + "http": 200, + "code": "A0422", + "message": "password: 密码必须同时包含字母和数字;email: must be a well-formed email address", + "requestId": "client-e2e-e117bbf2-c4cc-4f5d-bfd5-bd56d2390586, client-e2e-e117bbf2-c4cc-4f5d-bfd5-bd56d2390586", + "traceId": "304389a9d7714dcb976839107c9ea82d", + "evidence": { + "rejectionCode": "A0422" + } + }, + { + "module": "rbac-member", + "name": "create enterprise member with role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:00.080Z", + "durationMs": 375, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-00453b94-a63a-4f81-b655-fd3d898c595c, client-e2e-00453b94-a63a-4f81-b655-fd3d898c595c", + "traceId": "e28c3724a9a34cc0b1c1d56c15f3c757", + "evidence": { + "membershipId": "2085928984952557572", + "memberType": "EMPLOYEE", + "status": "ACTIVE", + "roleIds": [ + "2085928983694266369" + ] + } + }, + { + "module": "rbac-member", + "name": "enterprise member list contains created member and roles", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:00.456Z", + "durationMs": 37, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-114fe472-fc7f-4bb9-ad40-608a0c695c91, client-e2e-114fe472-fc7f-4bb9-ad40-608a0c695c91", + "traceId": "0274fd9b06744dc1be5ade59d61006e4", + "evidence": { + "memberCount": 2, + "membershipId": "2085928984952557572" + } + }, + { + "module": "rbac-member", + "name": "enterprise member detail matches created fields and roles", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:00.494Z", + "durationMs": 26, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-016ff2f0-a0f9-4f3f-b423-9d4737f21d9a, client-e2e-016ff2f0-a0f9-4f3f-b423-9d4737f21d9a", + "traceId": "bd874ec94d1f41e1aea5882b262dd04d", + "evidence": { + "membershipId": "2085928984952557572", + "status": "ACTIVE", + "roleIds": [ + "2085928983694266369" + ] + } + }, + { + "module": "rbac-member", + "name": "duplicate member username is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:00.520Z", + "durationMs": 32, + "http": 200, + "code": "A0409", + "message": "企业成员编号已存在", + "requestId": "client-e2e-a539872d-e3c1-40a0-a3cc-94a75a6c97b4, client-e2e-a539872d-e3c1-40a0-a3cc-94a75a6c97b4", + "traceId": "a0357e4740744ad1b61a4ae2a680c9f3", + "evidence": { + "username": "member_20260808032000_70275", + "rejectionCode": "A0409" + } + }, + { + "module": "rbac-member", + "name": "assigned custom role cannot be deleted", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:00.552Z", + "durationMs": 34, + "http": 200, + "code": "A0409", + "message": "角色已分配给成员,不能删除", + "requestId": "client-e2e-02db3763-6086-4c4c-8447-370e3fb83cbf, client-e2e-02db3763-6086-4c4c-8447-370e3fb83cbf", + "traceId": "ffca729b87e84aabb2596632b6117535", + "evidence": { + "roleId": "2085928983694266369", + "rejectionCode": "A0409" + } + }, + { + "module": "rbac-member", + "name": "enterprise owner cannot be disabled", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:00.586Z", + "durationMs": 32, + "http": 200, + "code": "A0403", + "message": "企业所有者不能被停用", + "requestId": "client-e2e-06393527-6e01-498a-b195-88fdf4985f01, client-e2e-06393527-6e01-498a-b195-88fdf4985f01", + "traceId": "f119ab0fa71a4b87bf33567459bef591", + "evidence": { + "membershipId": "2085928969274249220", + "rejectionCode": "A0403" + } + }, + { + "module": "rbac-member", + "name": "enterprise owner cannot be edited through member API", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:00.619Z", + "durationMs": 31, + "http": 200, + "code": "A0403", + "message": "不能通过成员管理接口创建或转让企业所有者", + "requestId": "client-e2e-290bba65-649c-4654-b3df-40e21bf24a05, client-e2e-290bba65-649c-4654-b3df-40e21bf24a05", + "traceId": "f3b92420eb744759b4a89189d78c0b80", + "evidence": { + "membershipId": "2085928969274249220", + "rejectionCode": "A0403" + } + }, + { + "module": "rbac-member", + "name": "new enterprise member can login", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:00.651Z", + "durationMs": 350, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-1e95f0f5-4473-4c1d-8f92-4f610528a9c0, client-e2e-1e95f0f5-4473-4c1d-8f92-4f610528a9c0", + "traceId": "aa7a6acf07c4418887637357b4812e62", + "evidence": { + "username": "member_20260808032000_70275" + } + }, + { + "module": "rbac-member", + "name": "member can use granted order list permission", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:01.002Z", + "durationMs": 83, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-d31d30a3-d254-492c-b13e-0b6f07c0aa81, client-e2e-d31d30a3-d254-492c-b13e-0b6f07c0aa81", + "traceId": "0275fcd6624644239624c626dd53ee54", + "evidence": { + "total": "1" + } + }, + { + "module": "rbac-member", + "name": "member can view order with granted permission", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:01.086Z", + "durationMs": 40, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-16045467-a94d-4b34-ad09-7f15c5501a8b, client-e2e-16045467-a94d-4b34-ad09-7f15c5501a8b", + "traceId": "82e19c41026849539c908f4973d3ebe8", + "evidence": { + "orderId": "2085928973758955521", + "status": "DRAFT" + } + }, + { + "module": "menu-permissions", + "name": "read-only member effective permissions match role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:01.127Z", + "durationMs": 27, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-3ceeb66d-5b4a-429e-94c8-c62db04f6353, client-e2e-3ceeb66d-5b4a-429e-94c8-c62db04f6353", + "traceId": "6a5b1d095a124001a68fdee3f72029db", + "evidence": { + "backendPermissions": [ + "merchant:order:view", + "merchant:order:list" + ], + "visibleClientMenus": [ + "account:profile:view", + "dashboard:view", + "order:first-leg:list" + ] + } + }, + { + "module": "menu-permissions", + "name": "disable assigned role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:01.155Z", + "durationMs": 284, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-293bd509-816a-42ed-960f-80596fabab1f, client-e2e-293bd509-816a-42ed-960f-80596fabab1f", + "traceId": "d7e97a0b84c745a68f07587712a4e958", + "evidence": { + "roleId": "2085928983694266369", + "status": "DISABLED" + } + }, + { + "module": "menu-permissions", + "name": "disabled role is reflected by live permission query", + "passed": false, + "skipped": false, + "startedAt": "2026-08-08T03:20:01.439Z", + "durationMs": 19, + "http": 401, + "code": "A0401", + "message": "登录会话已过期、已退出或 Redis 不可用", + "requestId": "client-e2e-f53ed45d-fa11-4847-ac00-0c7892b405db", + "traceId": null, + "evidence": { + "visibleClientMenus": [ + "account:profile:view", + "dashboard:view" + ] + }, + "error": { + "name": "Error", + "message": "HTTP status: expected=200 actual=401" + } + }, + { + "module": "menu-permissions", + "name": "disabled role blocks stale token order access", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:01.459Z", + "durationMs": 30, + "http": 401, + "code": "A0401", + "message": "登录会话已过期、已退出或 Redis 不可用", + "requestId": "client-e2e-7a34a147-ccee-4e6e-8170-5f47f9f694ee", + "traceId": null, + "evidence": { + "rejectionCode": "A0401", + "message": "登录会话已过期、已退出或 Redis 不可用" + } + }, + { + "module": "menu-permissions", + "name": "member login succeeds while role is disabled", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:01.489Z", + "durationMs": 355, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-6c75ecab-5817-46e1-9405-8045e7ce954a, client-e2e-6c75ecab-5817-46e1-9405-8045e7ce954a", + "traceId": "b2e6166f1bf148d1a6958ebd20800cdb", + "evidence": { + "username": "member_20260808032000_70275" + } + }, + { + "module": "menu-permissions", + "name": "disabled role removes member menus and permissions", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:01.845Z", + "durationMs": 29, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-66b551a3-67b2-40b4-9f7e-57a1c8d49d64, client-e2e-66b551a3-67b2-40b4-9f7e-57a1c8d49d64", + "traceId": "c506917a563e415baae0b41d8c1b3443", + "evidence": { + "backendPermissions": [], + "visibleClientMenus": [ + "account:profile:view", + "dashboard:view" + ] + } + }, + { + "module": "menu-permissions", + "name": "disabled role blocks member order list", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:01.875Z", + "durationMs": 28, + "http": 200, + "code": "A0403", + "message": "Access denied", + "requestId": "client-e2e-e25c4153-9e51-458c-bbcc-b28a64378056, client-e2e-e25c4153-9e51-458c-bbcc-b28a64378056", + "traceId": "ead31d3db7b840e6b26e17133da2b1b2", + "evidence": { + "rejectionCode": "A0403" + } + }, + { + "module": "menu-permissions", + "name": "re-enable assigned role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:01.904Z", + "durationMs": 164, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-3f2d70cc-9644-473a-b684-5151b03aedd8, client-e2e-3f2d70cc-9644-473a-b684-5151b03aedd8", + "traceId": "689278a1647b4e4ea2d81d6b2e9cae74", + "evidence": { + "roleId": "2085928983694266369", + "status": "ACTIVE" + } + }, + { + "module": "menu-permissions", + "name": "member re-login after role is enabled", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:02.069Z", + "durationMs": 348, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-a9696b2d-e878-4520-a2fa-1ecee767e061, client-e2e-a9696b2d-e878-4520-a2fa-1ecee767e061", + "traceId": "dd2c810876fa49238bf0a585e2497cb9", + "evidence": { + "username": "member_20260808032000_70275" + } + }, + { + "module": "menu-permissions", + "name": "re-enabled role restores member menus", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:02.418Z", + "durationMs": 30, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-0942c39b-dc9a-491a-a042-12701f2f9c4f, client-e2e-0942c39b-dc9a-491a-a042-12701f2f9c4f", + "traceId": "b91b0aea5b674a39aac367b572ce7352", + "evidence": { + "backendPermissions": [ + "merchant:order:view", + "merchant:order:list" + ], + "visibleClientMenus": [ + "account:profile:view", + "dashboard:view", + "order:first-leg:list" + ] + } + }, + { + "module": "menu-permissions", + "name": "remove order view permission from assigned role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:02.449Z", + "durationMs": 140, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-632fc58e-226f-4f48-ac07-1081631711b9, client-e2e-632fc58e-226f-4f48-ac07-1081631711b9", + "traceId": "83b3c8c5d4ea4d038206f06e041632e7", + "evidence": { + "roleId": "2085928983694266369", + "permissionCodes": [ + "merchant:order:list" + ] + } + }, + { + "module": "menu-permissions", + "name": "permission removal revokes stale member token", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:02.590Z", + "durationMs": 19, + "http": 401, + "code": "A0401", + "message": "登录会话已过期、已退出或 Redis 不可用", + "requestId": "client-e2e-63ffc17d-7dcc-4983-9ec9-084c1e3d8147", + "traceId": null, + "evidence": { + "rejectionCode": "A0401", + "message": "登录会话已过期、已退出或 Redis 不可用" + } + }, + { + "module": "menu-permissions", + "name": "member re-login after permission removal", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:02.609Z", + "durationMs": 332, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-548253a7-4e43-4bf5-bb00-4e7c27366243, client-e2e-548253a7-4e43-4bf5-bb00-4e7c27366243", + "traceId": "cdd65f195a0445ce85d3420c5d245c9d", + "evidence": { + "username": "member_20260808032000_70275" + } + }, + { + "module": "menu-permissions", + "name": "permission removal is reflected after re-login", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:02.942Z", + "durationMs": 35, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-6ebc38ee-ed6e-472a-8ab1-41db17608261, client-e2e-6ebc38ee-ed6e-472a-8ab1-41db17608261", + "traceId": "b0f674ea33fc468b8958387141a28837", + "evidence": { + "backendPermissions": [ + "merchant:order:list" + ] + } + }, + { + "module": "menu-permissions", + "name": "member without view permission cannot read order detail", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:02.978Z", + "durationMs": 25, + "http": 200, + "code": "A0403", + "message": "Access denied", + "requestId": "client-e2e-7fe2a881-ecde-441a-a36c-5009708d45c8, client-e2e-7fe2a881-ecde-441a-a36c-5009708d45c8", + "traceId": "af5d2e8e29604af998d57b4cc394688c", + "evidence": { + "rejectionCode": "A0403" + } + }, + { + "module": "menu-permissions", + "name": "restore assigned role permissions", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:03.003Z", + "durationMs": 153, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-d1d6b9e6-b93c-41f7-a1e2-555673181796, client-e2e-d1d6b9e6-b93c-41f7-a1e2-555673181796", + "traceId": "e50ab1b6ddfb4a71ac93113136c0359c", + "evidence": { + "roleId": "2085928983694266369", + "permissionCodes": [ + "merchant:order:list", + "merchant:order:view" + ] + } + }, + { + "module": "menu-permissions", + "name": "member re-login after permission restoration", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:03.157Z", + "durationMs": 351, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-fb57ba9b-9329-4093-9197-90baa6062a82, client-e2e-fb57ba9b-9329-4093-9197-90baa6062a82", + "traceId": "31a3110ce1f6422aa4d9bb7a19468f6c", + "evidence": { + "username": "member_20260808032000_70275" + } + }, + { + "module": "menu-permissions", + "name": "restored permission allows order detail again", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:03.508Z", + "durationMs": 27, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-bdca487d-a749-479b-8c86-df2f255d1829, client-e2e-bdca487d-a749-479b-8c86-df2f255d1829", + "traceId": "a758bb3d925247c691dab0c5f7d5218f", + "evidence": { + "orderId": "2085928973758955521" + } + }, + { + "module": "rbac-member", + "name": "edit enterprise member", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:03.535Z", + "durationMs": 43, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-c1a858aa-cadf-4ccd-adbb-aa3647380d03, client-e2e-c1a858aa-cadf-4ccd-adbb-aa3647380d03", + "traceId": "726cb74f4bb44bfaa8a29603ff43c1a6", + "evidence": { + "membershipId": "2085928984952557572", + "displayName": "已编辑订单成员-20260808031955-989a499b", + "status": "ACTIVE" + } + }, + { + "module": "rbac-member", + "name": "reset enterprise member password", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:03.579Z", + "durationMs": 440, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-5b0b63c0-99f9-46b9-827d-4efa17be39d0, client-e2e-5b0b63c0-99f9-46b9-827d-4efa17be39d0", + "traceId": "7e91aaedb787442e8cadbec026dd3f00", + "evidence": { + "membershipId": "2085928984952557572" + } + }, + { + "module": "rbac-member", + "name": "member old password is rejected after reset", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:04.019Z", + "durationMs": 327, + "http": 200, + "code": "A0401", + "message": "用户名或密码错误", + "requestId": "client-e2e-1f0d5db0-1e6a-4c2c-ba8d-efe886287d40, client-e2e-1f0d5db0-1e6a-4c2c-ba8d-efe886287d40", + "traceId": "85933fd985484ce1b38a7217f49426f5", + "evidence": { + "username": "member_20260808032000_70275", + "rejectionCode": "A0401" + } + }, + { + "module": "rbac-member", + "name": "member can login with reset password", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:04.346Z", + "durationMs": 343, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-11c7eb63-1ce7-457d-a9af-a8f2a9d8d06a, client-e2e-11c7eb63-1ce7-457d-a9af-a8f2a9d8d06a", + "traceId": "333654c2939e42db90c9554c83857867", + "evidence": { + "username": "member_20260808032000_70275" + } + }, + { + "module": "rbac-member", + "name": "disable enterprise member", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:04.690Z", + "durationMs": 164, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-f85d25ca-234a-4830-9bbf-54301389a68c, client-e2e-f85d25ca-234a-4830-9bbf-54301389a68c", + "traceId": "8a282b3565874040a54dd23d5859988c", + "evidence": { + "membershipId": "2085928984952557572", + "status": "DISABLED" + } + }, + { + "module": "rbac-member", + "name": "disabled member stale token is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:04.854Z", + "durationMs": 27, + "http": 401, + "code": "A0401", + "message": "登录会话已过期、已退出或 Redis 不可用", + "requestId": "client-e2e-f2be0f99-5ecb-4a74-a374-f8fe60a7257a", + "traceId": null, + "evidence": { + "membershipId": "2085928984952557572", + "rejectionCode": "A0401" + } + }, + { + "module": "rbac-member", + "name": "disabled member login is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:04.881Z", + "durationMs": 27, + "http": 200, + "code": "A0403", + "message": "账号已禁用", + "requestId": "client-e2e-353a158e-a3c4-4fbb-98be-0c8580ebcb27, client-e2e-353a158e-a3c4-4fbb-98be-0c8580ebcb27", + "traceId": "a2489164fd174057bb066e645ae2a8d8", + "evidence": { + "username": "member_20260808032000_70275", + "rejectionCode": "A0403" + } + }, + { + "module": "rbac-member", + "name": "enable enterprise member", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:04.908Z", + "durationMs": 164, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-0974ddb4-2b31-4b0b-8324-0adc876f12ca, client-e2e-0974ddb4-2b31-4b0b-8324-0adc876f12ca", + "traceId": "bba505b6c4214957a38740aca1e9860b", + "evidence": { + "membershipId": "2085928984952557572", + "status": "ACTIVE" + } + }, + { + "module": "rbac-member", + "name": "member re-login after account is enabled", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:05.072Z", + "durationMs": 349, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-80eeb65f-5f29-4755-a0eb-7635cd4681a7, client-e2e-80eeb65f-5f29-4755-a0eb-7635cd4681a7", + "traceId": "4d4c429e5e06445b881e135d76f84f14", + "evidence": { + "username": "member_20260808032000_70275" + } + }, + { + "module": "rbac-member", + "name": "re-enabled member can list orders before roles are cleared", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:05.421Z", + "durationMs": 51, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-4e1e92b0-2c6a-4ac8-916f-f169e6fd302c, client-e2e-4e1e92b0-2c6a-4ac8-916f-f169e6fd302c", + "traceId": "03b92377ddc5430db6d930cde0b2abec", + "evidence": { + "total": "1" + } + }, + { + "module": "rbac-member", + "name": "clear enterprise member roles", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:05.472Z", + "durationMs": 198, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-dadc8625-accf-4404-b9b8-7bdcdca172bf, client-e2e-dadc8625-accf-4404-b9b8-7bdcdca172bf", + "traceId": "4c4649b98c484ac99e99cbe342a1e2ab", + "evidence": { + "membershipId": "2085928984952557572", + "roleIds": [] + } + }, + { + "module": "rbac-member", + "name": "member role clearing is persisted", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:05.670Z", + "durationMs": 35, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-a388c89f-3854-4646-8c31-e656e696cf4b, client-e2e-a388c89f-3854-4646-8c31-e656e696cf4b", + "traceId": "cdc84389ea764223beae244c37bb7f17", + "evidence": { + "membershipId": "2085928984952557572", + "roleIds": [] + } + }, + { + "module": "rbac-member", + "name": "role clearing revokes stale member token", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:05.705Z", + "durationMs": 20, + "http": 401, + "code": "A0401", + "message": "登录会话已过期、已退出或 Redis 不可用", + "requestId": "client-e2e-12d994b9-dcd0-4ba1-bb90-177ba6e4f056", + "traceId": null, + "evidence": { + "rejectionCode": "A0401" + } + }, + { + "module": "rbac-member", + "name": "member re-login after role clearing", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:05.725Z", + "durationMs": 348, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-825b783c-4b9c-4283-8c01-fd412130a879, client-e2e-825b783c-4b9c-4283-8c01-fd412130a879", + "traceId": "62b7d05af498486b94e367393328e9fe", + "evidence": { + "username": "member_20260808032000_70275" + } + }, + { + "module": "rbac-member", + "name": "member without roles cannot list orders", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:06.073Z", + "durationMs": 22, + "http": 200, + "code": "A0403", + "message": "Access denied", + "requestId": "client-e2e-95db059b-2e5f-4c67-93bb-2c51cdaec00e, client-e2e-95db059b-2e5f-4c67-93bb-2c51cdaec00e", + "traceId": "8a570d33232442d4b738e8765318be9e", + "evidence": { + "rejectionCode": "A0403" + } + }, + { + "module": "rbac-member", + "name": "disable test member after verification", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:06.095Z", + "durationMs": 122, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-d0145ca7-fe14-48d8-8636-3302fe29a9ed, client-e2e-d0145ca7-fe14-48d8-8636-3302fe29a9ed", + "traceId": "bfd5bc8ba0d74447beeff4f926273c36", + "evidence": { + "membershipId": "2085928984952557572", + "status": "DISABLED" + } + }, + { + "module": "rbac-member", + "name": "delete unassigned custom role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:06.217Z", + "durationMs": 39, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-de813d82-9c85-4d25-8f68-9637ba7e4376, client-e2e-de813d82-9c85-4d25-8f68-9637ba7e4376", + "traceId": "c3490fc7e69c4c7095af647be7538ae3", + "evidence": { + "roleId": "2085928983694266369" + } + }, + { + "module": "order-master-data", + "name": "load active domestic receiving warehouses", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:06.257Z", + "durationMs": 100, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-74097c70-75f2-441d-a5dc-2402825b0cfc, client-e2e-74097c70-75f2-441d-a5dc-2402825b0cfc", + "traceId": "08f0be20e44e4070b547c84a14efe561", + "evidence": { + "total": "2", + "warehouseCount": 2 + } + }, + { + "module": "order-master-data", + "name": "load active FBA destination warehouses", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:06.358Z", + "durationMs": 53, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-bc95418c-d1b2-4de3-9409-32492433a29a, client-e2e-bc95418c-d1b2-4de3-9409-32492433a29a", + "traceId": "71c6ae1f018e4f9babc9ccbb3c290632", + "evidence": { + "total": "253", + "warehouseCount": 200 + } + }, + { + "module": "order-master-data", + "name": "load receiving warehouse detail", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:06.412Z", + "durationMs": 40, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-70b8549f-b2b2-4b09-9938-0718e6508ba4, client-e2e-70b8549f-b2b2-4b09-9938-0718e6508ba4", + "traceId": "2f84a424eb77472ea0d4f86ad64e40c3", + "evidence": { + "id": "193000000000200001", + "name": "义乌仓" + } + }, + { + "module": "order-master-data", + "name": "load active pricing channels", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:06.453Z", + "durationMs": 40, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-042c40b1-d6c8-44e1-aff4-cf72f22beb3d, client-e2e-042c40b1-d6c8-44e1-aff4-cf72f22beb3d", + "traceId": "11a151c7506c402386cbb7b5185528d8", + "evidence": { + "channels": [ + { + "channelCode": "EXX_RAIL_NY", + "priceModel": "FBA_WAREHOUSE_RATE", + "pricingTaxModes": [ + "TAX_INCLUDED", + "TAX_EXCLUDED" + ] + }, + { + "channelCode": "EXX_TRUCK", + "priceModel": "FBA_WAREHOUSE_RATE", + "pricingTaxModes": [ + "TAX_INCLUDED", + "TAX_EXCLUDED" + ] + }, + { + "channelCode": "HEDE_PARCEL", + "priceModel": "REGION_WEIGHT_TIER", + "pricingTaxModes": [ + "TAX_INCLUDED" + ] + }, + { + "channelCode": "HEDE_TRUCK", + "priceModel": "FBA_WAREHOUSE_RATE", + "pricingTaxModes": [ + "TAX_INCLUDED", + "TAX_EXCLUDED" + ] + }, + { + "channelCode": "MATSON_CLX_PARCEL", + "priceModel": "REGION_WEIGHT_TIER", + "pricingTaxModes": [ + "TAX_INCLUDED" + ] + }, + { + "channelCode": "MATSON_CLX_TRUCK", + "priceModel": "FBA_WAREHOUSE_RATE", + "pricingTaxModes": [ + "TAX_INCLUDED", + "TAX_EXCLUDED" + ] + }, + { + "channelCode": "MATSON_MAX_PARCEL", + "priceModel": "REGION_WEIGHT_TIER", + "pricingTaxModes": [ + "TAX_INCLUDED" + ] + }, + { + "channelCode": "MATSON_MAX_TRUCK", + "priceModel": "FBA_WAREHOUSE_RATE", + "pricingTaxModes": [ + "TAX_INCLUDED", + "TAX_EXCLUDED" + ] + }, + { + "channelCode": "OA_CHICAGO_RAIL", + "priceModel": "FBA_WAREHOUSE_RATE", + "pricingTaxModes": [ + "TAX_INCLUDED", + "TAX_EXCLUDED" + ] + }, + { + "channelCode": "OA_HOUSTON_TRUCK", + "priceModel": "FBA_WAREHOUSE_RATE", + "pricingTaxModes": [ + "TAX_INCLUDED", + "TAX_EXCLUDED" + ] + }, + { + "channelCode": "OA_LA_FULL_TRUCK", + "priceModel": "FBA_WAREHOUSE_RATE", + "pricingTaxModes": [ + "TAX_INCLUDED", + "TAX_EXCLUDED" + ] + }, + { + "channelCode": "OA_LA_TRUCK", + "priceModel": "FBA_WAREHOUSE_RATE", + "pricingTaxModes": [ + "TAX_INCLUDED", + "TAX_EXCLUDED" + ] + }, + { + "channelCode": "OA_NEW_YORK_TRUCK", + "priceModel": "FBA_WAREHOUSE_RATE", + "pricingTaxModes": [ + "TAX_INCLUDED", + "TAX_EXCLUDED" + ] + }, + { + "channelCode": "OA_PARCEL", + "priceModel": "REGION_WEIGHT_TIER", + "pricingTaxModes": [ + "TAX_INCLUDED" + ] + }, + { + "channelCode": "OA_SAVANNAH_TRUCK", + "priceModel": "FBA_WAREHOUSE_RATE", + "pricingTaxModes": [ + "TAX_INCLUDED", + "TAX_EXCLUDED" + ] + } + ] + } + }, + { + "module": "order-master-data", + "name": "load public shipper candidates", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:06.494Z", + "durationMs": 33, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-82d66f5f-3f9d-4340-877e-5f9a82c3409b, client-e2e-82d66f5f-3f9d-4340-877e-5f9a82c3409b", + "traceId": "448d8dfb031940db8d270c32b2b4a2c5", + "evidence": { + "candidateCount": 3 + } + }, + { + "module": "pricing-estimate", + "name": "probe configured price 1", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:06.528Z", + "durationMs": 60, + "http": 200, + "code": "A0404", + "message": "当前条件没有匹配价格", + "requestId": "client-e2e-268410d5-4791-4401-885f-799d2e97d0f5, client-e2e-268410d5-4791-4401-885f-799d2e97d0f5", + "traceId": "9819156dc91a4cd8b6bf9ff9239267c9", + "evidence": { + "matched": false, + "destinationWarehouseId": "193000000000000001", + "destinationCode": "ABE2", + "channelCode": "EXX_RAIL_NY", + "code": "A0404", + "message": "当前条件没有匹配价格" + } + }, + { + "module": "pricing-estimate", + "name": "probe configured price 2", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:06.588Z", + "durationMs": 42, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-6c57e364-9b9d-4a85-b42c-8d04edaafb5b, client-e2e-6c57e364-9b9d-4a85-b42c-8d04edaafb5b", + "traceId": "d58e0e2a52b94564a674efed110457b3", + "evidence": { + "matched": true, + "destinationWarehouseId": "193000000000000002", + "destinationCode": "ABE3", + "priceBookVersionId": "2085910455296503809", + "channelCode": "EXX_RAIL_NY", + "priceModel": "FBA_WAREHOUSE_RATE", + "pricingTaxMode": "TAX_INCLUDED", + "chargeableQuantity": 20.5, + "chargeUnit": "KG", + "unitPrice": 11.7, + "estimatedAmount": 239.85, + "currency": "CNY" + } + }, + { + "module": "order-product-image", + "name": "upload product image", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:06.631Z", + "durationMs": 41, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-0f11929f-eec2-49ee-bb05-a8f1e5d375de, client-e2e-0f11929f-eec2-49ee-bb05-a8f1e5d375de", + "traceId": "3f6a903e77314085994767011bd347fc", + "evidence": { + "fileId": "2085929012468187137", + "fileName": "product-20260808031955-989a499b.png", + "contentType": "image/png", + "sizeBytes": "68" + } + }, + { + "module": "order-product-image", + "name": "invalid product image MIME type is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:06.673Z", + "durationMs": 31, + "http": 200, + "code": "A0400", + "message": "产品图片仅支持JPG、PNG", + "requestId": "client-e2e-484902af-9300-4f5e-abbb-9aeaa0ae8b09, client-e2e-484902af-9300-4f5e-abbb-9aeaa0ae8b09", + "traceId": "b8fa3111aca84dd7aad9a7229392c188", + "evidence": { + "rejectionCode": "A0400", + "message": "产品图片仅支持JPG、PNG" + } + }, + { + "module": "order-product-image", + "name": "empty product image is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:06.705Z", + "durationMs": 37, + "http": 200, + "code": "A0400", + "message": "产品图片不能为空", + "requestId": "client-e2e-4fa84de7-82aa-46db-a938-45924ba27004, client-e2e-4fa84de7-82aa-46db-a938-45924ba27004", + "traceId": "1b0f61aa54424f519cdbcaca42e40a87", + "evidence": { + "rejectionCode": "A0400", + "message": "产品图片不能为空" + } + }, + { + "module": "order-product-image", + "name": "forged product image signature is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:06.742Z", + "durationMs": 33, + "http": 200, + "code": "A0400", + "message": "上传内容不是有效图片", + "requestId": "client-e2e-de2c575a-7bd5-4b59-9685-ae61d2ac211c, client-e2e-de2c575a-7bd5-4b59-9685-ae61d2ac211c", + "traceId": "e98ba34f6f3d4ffa9dba180bab061891", + "evidence": { + "rejectionCode": "A0400", + "message": "上传内容不是有效图片" + } + }, + { + "module": "order-product-image", + "name": "product image over 5MB is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:06.778Z", + "durationMs": 196, + "http": 200, + "code": "A0400", + "message": "产品图片不能超过5MB", + "requestId": "client-e2e-76b6b8a4-8350-42e4-8ae8-1d6fa7ee4014, client-e2e-76b6b8a4-8350-42e4-8ae8-1d6fa7ee4014", + "traceId": "6f74d5ef016c477d811eb4f1832f0533", + "evidence": { + "rejectionCode": "A0400", + "message": "产品图片不能超过5MB" + } + }, + { + "module": "order-lifecycle", + "name": "download own product image", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:06.974Z", + "durationMs": 33, + "http": 200, + "code": null, + "message": null, + "requestId": "client-e2e-42bbfd13-81a6-477a-8a85-935c445acedd, client-e2e-42bbfd13-81a6-477a-8a85-935c445acedd", + "traceId": "dc240312a2674f4d9a181995f9db107d", + "evidence": { + "sizeBytes": 68, + "contentType": "image/png" + } + }, + { + "module": "order-validation", + "name": "FBA order missing Amazon identifiers is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:07.008Z", + "durationMs": 29, + "http": 200, + "code": "A0422", + "message": "FBA orders require Amazon warehouse code, Shipment ID and Reference ID", + "requestId": "client-e2e-2cf5d1f9-80a9-449c-b3ac-5b4836d26e4d, client-e2e-2cf5d1f9-80a9-449c-b3ac-5b4836d26e4d", + "traceId": "337a11b857e64a4088af62ee9f4e2d2a", + "evidence": { + "rejectionCode": "A0422", + "message": "FBA orders require Amazon warehouse code, Shipment ID and Reference ID" + } + }, + { + "module": "order-validation", + "name": "FBA cargo missing SKU UPC shipment and reference is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:07.037Z", + "durationMs": 36, + "http": 200, + "code": "A0422", + "message": "FBA cargo requires SKU NO., UPC NO., Shipment ID and Reference ID.", + "requestId": "client-e2e-04cf7cd7-74cc-4641-82d7-10be82bfb9d4, client-e2e-04cf7cd7-74cc-4641-82d7-10be82bfb9d4", + "traceId": "749332db396647e1baa4a7945d56372a", + "evidence": { + "rejectionCode": "A0422", + "message": "FBA cargo requires SKU NO., UPC NO., Shipment ID and Reference ID." + } + }, + { + "module": "order-validation", + "name": "PICKUP order without sender is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:07.073Z", + "durationMs": 32, + "http": 200, + "code": "A0422", + "message": "上门提货时必须填写发货信息", + "requestId": "client-e2e-31b7e7a6-7d42-49a6-acea-f0957a901315, client-e2e-31b7e7a6-7d42-49a6-acea-f0957a901315", + "traceId": "267a81519b6146de96ae0fc486a2ccfa", + "evidence": { + "rejectionCode": "A0422", + "message": "上门提货时必须填写发货信息" + } + }, + { + "module": "order-validation", + "name": "PRIVATE destination without receiver is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:07.105Z", + "durationMs": 35, + "http": 200, + "code": "A0422", + "message": "私人地址必须填写收货信息", + "requestId": "client-e2e-df44a1c6-bca7-455a-b3c4-72377eba0c7a, client-e2e-df44a1c6-bca7-455a-b3c4-72377eba0c7a", + "traceId": "9ebe551447be4d6f872a6217847cea75", + "evidence": { + "rejectionCode": "A0422", + "message": "私人地址必须填写收货信息" + } + }, + { + "module": "order-validation", + "name": "invalid product image file ID is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:07.141Z", + "durationMs": 43, + "http": 200, + "code": "A0422", + "message": "产品图片文件ID无效", + "requestId": "client-e2e-d6869b82-7c3b-4833-abc1-12c2dd0b8870, client-e2e-d6869b82-7c3b-4833-abc1-12c2dd0b8870", + "traceId": "4fcfad4138574473a293b30c1503d254", + "evidence": { + "rejectionCode": "A0422", + "message": "产品图片文件ID无效" + } + }, + { + "module": "order-validation", + "name": "zero package count weight and volume are rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:07.184Z", + "durationMs": 84, + "http": 200, + "code": "A0422", + "message": "cargoes[0].grossWeightKg: must be greater than or equal to 0.001;cargoes[0].packageCount: must be greater than or equal to 1;cargoes[0].volumeCbm: must be greater than or equal to 0.0001", + "requestId": "client-e2e-fdff702f-00cf-4151-a4c4-a263e6324c75, client-e2e-fdff702f-00cf-4151-a4c4-a263e6324c75", + "traceId": "434e9f0d072b4506bf1e7f47842660c8", + "evidence": { + "rejectionCode": "A0422", + "message": "cargoes[0].grossWeightKg: must be greater than or equal to 0.001;cargoes[0].packageCount: must be greater than or equal to 1;cargoes[0].volumeCbm: must be greater than or equal to 0.0001" + } + }, + { + "module": "order-validation", + "name": "customer remark over 1000 characters is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:07.269Z", + "durationMs": 29, + "http": 200, + "code": "A0422", + "message": "customerRemark: size must be between 0 and 1000", + "requestId": "client-e2e-8d75ea07-536e-4f10-8c60-7c472eb5dcfb, client-e2e-8d75ea07-536e-4f10-8c60-7c472eb5dcfb", + "traceId": "3d0cf3d43c0247b8a75ff508c6acd91c", + "evidence": { + "rejectionCode": "A0422", + "message": "customerRemark: size must be between 0 and 1000" + } + }, + { + "module": "order-validation", + "name": "missing Idempotency-Key is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:07.299Z", + "durationMs": 28, + "http": 200, + "code": "A0400", + "message": "Bad request", + "requestId": "client-e2e-d55f4e03-49af-4a1f-858d-1fca9aa78fea, client-e2e-d55f4e03-49af-4a1f-858d-1fca9aa78fea", + "traceId": "954216bfc70d408ca9a4562cf452c127", + "evidence": { + "rejectionCode": "A0400", + "message": "Bad request" + } + }, + { + "module": "order-validation", + "name": "Idempotency-Key over 128 characters is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:07.327Z", + "durationMs": 25, + "http": 200, + "code": "A0422", + "message": "Idempotency-Key length must not exceed 128", + "requestId": "client-e2e-5e769b4c-0173-484e-9d9c-44930ada2723, client-e2e-5e769b4c-0173-484e-9d9c-44930ada2723", + "traceId": "d13cc255dd1c4acf9df8e051fe5a0572", + "evidence": { + "rejectionCode": "A0422", + "message": "Idempotency-Key length must not exceed 128" + } + }, + { + "module": "order-lifecycle", + "name": "create valid draft after approval", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:07.353Z", + "durationMs": 99, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-d42f0b26-9d08-48e1-be7c-7c1a14b38e91, client-e2e-d42f0b26-9d08-48e1-be7c-7c1a14b38e91", + "traceId": "5639d7fbda654fabbf94553057e60ce4", + "evidence": { + "orderId": "2085929015710384129" + } + }, + { + "module": "order-lifecycle", + "name": "create order idempotent replay", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:07.452Z", + "durationMs": 37, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-e6e33a2f-61f8-4de0-8a4a-912262d2c2e0, client-e2e-e6e33a2f-61f8-4de0-8a4a-912262d2c2e0", + "traceId": "8973a2352cef4b8a83af34907b76263c", + "evidence": { + "orderId": "2085929015710384129", + "replayed": true + } + }, + { + "module": "order-boundary", + "name": "same idempotency key with different payload is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:07.490Z", + "durationMs": 33, + "http": 200, + "code": "A0409", + "message": "Idempotency-Key conflicts with a different request", + "requestId": "client-e2e-86028ddb-2015-4884-9649-134ed207d3f0, client-e2e-86028ddb-2015-4884-9649-134ed207d3f0", + "traceId": "9f43784e802c425ebadbdab1bb6e0a80", + "evidence": { + "orderId": "2085929015710384129", + "rejectionCode": "A0409" + } + }, + { + "module": "order-lifecycle", + "name": "edit draft", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:07.524Z", + "durationMs": 92, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-37b8c53a-d401-4199-982e-ddad0c1d071b, client-e2e-37b8c53a-d401-4199-982e-ddad0c1d071b", + "traceId": "30f5bf3bd84447f7ac2eaed2183fe12a", + "evidence": { + "orderId": "2085929015710384129", + "customerRemark": "edited-20260808031955-989a499b" + } + }, + { + "module": "order-lifecycle", + "name": "order detail preserves complete product fields", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:07.616Z", + "durationMs": 44, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-9b34e7e6-0cbd-42fa-a2b9-5bc1f98d7c95, client-e2e-9b34e7e6-0cbd-42fa-a2b9-5bc1f98d7c95", + "traceId": "ecccdf94d0174c78b47a17caa7904db0", + "evidence": { + "orderId": "2085929015710384129", + "orderNo": "FL2085929015710384129", + "status": "DRAFT", + "cargo": { + "id": "2085929016423415810", + "skuNo": "SKU-ACTIVE-20260808031955-989a499b", + "cargoName": "蓝牙音箱", + "cargoNameEn": "Bluetooth Speaker", + "packageCount": 2, + "totalQuantity": 24, + "grossWeightKg": 20.5, + "volumeCbm": 0.024, + "shipmentId": "SHIP-ACTIVE-20260808031955-989a499b", + "referenceId": "REF-ACTIVE-20260808031955-989a499b", + "productImageFileId": "2085929012468187137" + } + } + }, + { + "module": "order-lifecycle", + "name": "order list contains edited draft", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:07.660Z", + "durationMs": 41, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-4931d564-7e4b-4c79-bb09-78f055a22c8a, client-e2e-4931d564-7e4b-4c79-bb09-78f055a22c8a", + "traceId": "d8fc2449860f4e78875cca0d77241954", + "evidence": { + "total": "1", + "orderId": "2085929015710384129", + "orderNo": "FL2085929015710384129", + "status": "DRAFT" + } + }, + { + "module": "order-filters", + "name": "order keyword filter finds draft by order number", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:07.702Z", + "durationMs": 50, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-fa7d7ea8-7cf4-40ab-bba4-6b491adcb6c6, client-e2e-fa7d7ea8-7cf4-40ab-bba4-6b491adcb6c6", + "traceId": "312240e78a454e0a9a86c6a788be015a", + "evidence": { + "total": "1", + "orderId": "2085929015710384129" + } + }, + { + "module": "order-filters", + "name": "DRAFT status filter contains draft", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:07.753Z", + "durationMs": 47, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-b92ec12c-b2a6-4307-9d26-5979db24a3c7, client-e2e-b92ec12c-b2a6-4307-9d26-5979db24a3c7", + "traceId": "204a0b3bf9c640e8a0948c4764e51fa2", + "evidence": { + "total": "2", + "orderId": "2085929015710384129", + "status": "DRAFT" + } + }, + { + "module": "order-lifecycle", + "name": "submit order", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:07.800Z", + "durationMs": 90, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-c9d400b0-7537-4bbd-b435-715922baef97, client-e2e-c9d400b0-7537-4bbd-b435-715922baef97", + "traceId": "e742dcb850af4f4fa65678f0549c2737", + "evidence": { + "orderId": "2085929015710384129" + } + }, + { + "module": "order-lifecycle", + "name": "submit order idempotent replay", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:07.890Z", + "durationMs": 31, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-bb16cf8f-ec99-4558-89f3-02a530f836cb, client-e2e-bb16cf8f-ec99-4558-89f3-02a530f836cb", + "traceId": "60e8a9fe89e44a59a97b4fbc6a2a039e", + "evidence": { + "orderId": "2085929015710384129", + "replayed": true + } + }, + { + "module": "order-lifecycle", + "name": "submitted status is persisted", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:07.921Z", + "durationMs": 29, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-deeecde3-97f4-4e4e-a501-14959c35dcb7, client-e2e-deeecde3-97f4-4e4e-a501-14959c35dcb7", + "traceId": "775235a1cab4476cbb64e1ac93014b2c", + "evidence": { + "orderId": "2085929015710384129", + "orderNo": "FL2085929015710384129", + "status": "SUBMITTED" + } + }, + { + "module": "order-filters", + "name": "SUBMITTED status filter contains submitted order", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:07.951Z", + "durationMs": 46, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-f2bc99a1-8ddf-46e6-9e96-2de022bce7c8, client-e2e-f2bc99a1-8ddf-46e6-9e96-2de022bce7c8", + "traceId": "f8517b452b7c404ba9f69c68ccf91a2d", + "evidence": { + "total": "1", + "orderId": "2085929015710384129", + "status": "SUBMITTED" + } + }, + { + "module": "order-filters", + "name": "warehouse channel and destination filters contain submitted order", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:07.997Z", + "durationMs": 48, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-c27ce365-41d4-40d3-bbef-038f5f0e69d5, client-e2e-c27ce365-41d4-40d3-bbef-038f5f0e69d5", + "traceId": "4a2872916c0540698d0f0768d7609fd2", + "evidence": { + "total": "2", + "orderId": "2085929015710384129" + } + }, + { + "module": "order-filters", + "name": "sender phone filter contains submitted order", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:08.045Z", + "durationMs": 53, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-590f040e-b6d5-4b12-8dcc-811cfd82056e, client-e2e-590f040e-b6d5-4b12-8dcc-811cfd82056e", + "traceId": "a4395b4c6d14436aa2f7dd9e4e983467", + "evidence": { + "total": "2", + "orderId": "2085929015710384129" + } + }, + { + "module": "order-filters", + "name": "unmatched keyword returns an empty order page", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:08.098Z", + "durationMs": 29, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-5d0caa16-0ec8-4374-b594-20a4da5608a9, client-e2e-5d0caa16-0ec8-4374-b594-20a4da5608a9", + "traceId": "0885ec6830f14a38bad5647ff7d0f69a", + "evidence": { + "total": "0" + } + }, + { + "module": "order-validation", + "name": "invalid order status filter is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:08.128Z", + "durationMs": 40, + "http": 200, + "code": "A0422", + "message": "status: Failed to convert value of type 'java.lang.String' to required type 'com.baiyue.order.entity.OrderStatus'; Failed to convert from type [java.lang.String] to type [com.baiyue.order.entity.OrderStatus] for value [UNKNOWN]", + "requestId": "client-e2e-128d2fb2-f9a5-4873-9945-996df5695a9f, client-e2e-128d2fb2-f9a5-4873-9945-996df5695a9f", + "traceId": "5aabc94c6962488aba188e3e8173d3cd", + "evidence": { + "rejectionCode": "A0422", + "message": "status: Failed to convert value of type 'java.lang.String' to required type 'com.baiyue.order.entity.OrderStatus'; Failed to convert from type [java.lang.String] to type [com.baiyue.order.entity.OrderStatus] for value [UNKNOWN]" + } + }, + { + "module": "order-boundary", + "name": "unknown order detail is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:08.169Z", + "durationMs": 29, + "http": 200, + "code": "A0404", + "message": "Order not found", + "requestId": "client-e2e-f3bcc6a2-165e-4a56-8d35-2bcb37c26b1d, client-e2e-f3bcc6a2-165e-4a56-8d35-2bcb37c26b1d", + "traceId": "657fcf4f75d34a26a2119da6a72d5c31", + "evidence": { + "orderId": 1, + "rejectionCode": "A0404" + } + }, + { + "module": "order-boundary", + "name": "submitted order cannot be edited by client", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:08.198Z", + "durationMs": 66, + "http": 200, + "code": "A0409", + "message": "当前订单状态不允许编辑订单资料", + "requestId": "client-e2e-349f6a6f-5777-4ac1-9d81-a419d7d6c2f9, client-e2e-349f6a6f-5777-4ac1-9d81-a419d7d6c2f9", + "traceId": "26fee3464f9e4dca82405a36a691d9a9", + "evidence": { + "orderId": "2085929015710384129", + "rejectionCode": "A0409", + "message": "当前订单状态不允许编辑订单资料" + } + }, + { + "module": "unified-orders", + "name": "unified order list contains submitted order", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:08.264Z", + "durationMs": 53, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-d647b06e-be61-43ca-a9ff-70892f99ee47, client-e2e-d647b06e-be61-43ca-a9ff-70892f99ee47", + "traceId": "3bf5ccf670e34909adcfe8db4c57f91b", + "evidence": { + "total": "1", + "orderId": "2085929015710384129", + "mainStatus": "PENDING_REVIEW", + "internalOrderStatus": "SUBMITTED" + } + }, + { + "module": "unified-orders", + "name": "unified order detail returns timeline", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:08.318Z", + "durationMs": 41, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-37beb11a-ed20-4edd-a173-03cfbf6812d1, client-e2e-37beb11a-ed20-4edd-a173-03cfbf6812d1", + "traceId": "dbb013b42f544f0c858a08b4438d50c3", + "evidence": { + "orderId": "2085929015710384129", + "mainStatus": "PENDING_REVIEW", + "timelineCount": 3 + } + }, + { + "module": "order-lifecycle", + "name": "create second draft for cancellation", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:08.360Z", + "durationMs": 93, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-b6fd5247-4f41-4229-9a32-ded006c198fa, client-e2e-b6fd5247-4f41-4229-9a32-ded006c198fa", + "traceId": "3f5d5e1aab6c4d6c807aa507656ca422", + "evidence": { + "orderId": "2085929019917271041" + } + }, + { + "module": "order-lifecycle", + "name": "cancel second draft", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:08.453Z", + "durationMs": 50, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-e41dfe40-2105-403e-8f5a-9f63db379b51, client-e2e-e41dfe40-2105-403e-8f5a-9f63db379b51", + "traceId": "d7d8aeaa73524109846ea87243110b4a", + "evidence": { + "orderId": "2085929019917271041" + } + }, + { + "module": "order-lifecycle", + "name": "cancelled status is persisted", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:08.504Z", + "durationMs": 37, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-f8cb0543-57b8-48ca-baa9-2869bb45e5ca, client-e2e-f8cb0543-57b8-48ca-baa9-2869bb45e5ca", + "traceId": "81a735f4de074c5b8b93f4552ce2d827", + "evidence": { + "orderId": "2085929019917271041", + "status": "CANCELLED" + } + }, + { + "module": "order-boundary", + "name": "cancelled order cannot be cancelled again", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:08.541Z", + "durationMs": 27, + "http": 200, + "code": "A0409", + "message": "该操作已完成,请勿重复提交", + "requestId": "client-e2e-94f34ec4-af9b-4eb5-a3c6-125e24d4501c, client-e2e-94f34ec4-af9b-4eb5-a3c6-125e24d4501c", + "traceId": "02c76da9ebe54869bfe699e09531a4ae", + "evidence": { + "orderId": "2085929019917271041", + "rejectionCode": "A0409", + "message": "该操作已完成,请勿重复提交" + } + }, + { + "module": "order-boundary", + "name": "cancelled order cannot be submitted", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:08.568Z", + "durationMs": 43, + "http": 200, + "code": "A0409", + "message": "订单状态不允许当前操作: CANCELLED -> SUBMITTED", + "requestId": "client-e2e-7b3bdf33-429d-4704-8206-9f7f56a2c4be, client-e2e-7b3bdf33-429d-4704-8206-9f7f56a2c4be", + "traceId": "7b8b1f8da8394691975506d0e3b39829", + "evidence": { + "orderId": "2085929019917271041", + "rejectionCode": "A0409", + "message": "订单状态不允许当前操作: CANCELLED -> SUBMITTED" + } + }, + { + "module": "order-boundary", + "name": "invalid order page size is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:08.612Z", + "durationMs": 33, + "http": 200, + "code": "A0422", + "message": "size: must be less than or equal to 200", + "requestId": "client-e2e-e25421e1-49aa-4c6f-91c0-a007f85830b3, client-e2e-e25421e1-49aa-4c6f-91c0-a007f85830b3", + "traceId": "76cb1dae71a5462fbb8e36d940c062c3", + "evidence": { + "rejectionCode": "A0422" + } + }, + { + "module": "isolation", + "name": "existing client login", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:08.645Z", + "durationMs": 345, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-8747e048-c01e-412d-b4df-a5f5fb78d795, client-e2e-8747e048-c01e-412d-b4df-a5f5fb78d795", + "traceId": "5fdbfca695664401abf7414916880b06", + "evidence": { + "username": "merchant_admin" + } + }, + { + "module": "isolation", + "name": "cross-client order access is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:08.992Z", + "durationMs": 28, + "http": 200, + "code": "A0404", + "message": "Order not found", + "requestId": "client-e2e-3167d781-bd6a-4546-a8ff-d58ddf3d77d6, client-e2e-3167d781-bd6a-4546-a8ff-d58ddf3d77d6", + "traceId": "5125ec40f6c849ed84a16d0583fabbf9", + "evidence": { + "orderId": "2085929015710384129", + "rejectionCode": "A0404" + } + }, + { + "module": "isolation", + "name": "cross-client product image access is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:09.021Z", + "durationMs": 32, + "http": 200, + "code": "A0404", + "message": "产品图片不存在", + "requestId": "client-e2e-635518a4-07bf-47f5-9ed3-10307f793084, client-e2e-635518a4-07bf-47f5-9ed3-10307f793084", + "traceId": "2af8c0b9023f4e48b819f54a42bc25a4", + "evidence": { + "fileId": "2085929012468187137", + "rejectionCode": "A0404" + } + }, + { + "module": "isolation", + "name": "cross-client member detail access is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:09.053Z", + "durationMs": 35, + "http": 200, + "code": "A0404", + "message": "成员不存在", + "requestId": "client-e2e-9388ae77-7ffb-4d99-9945-87e58429674e, client-e2e-9388ae77-7ffb-4d99-9945-87e58429674e", + "traceId": "7414535ccbab49968814952c508f10b2", + "evidence": { + "membershipId": "2085928984952557572", + "rejectionCode": "A0404" + } + }, + { + "module": "isolation", + "name": "existing client address list excludes new enterprise address", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:09.089Z", + "durationMs": 24, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-c0434bc4-1b26-41e9-9042-8cde6aaf46ba, client-e2e-c0434bc4-1b26-41e9-9042-8cde6aaf46ba", + "traceId": "7e8f30da4f2c468aa3c47dff59dfb28f", + "evidence": { + "addressCount": 0, + "excludedAddressId": "2085928980879888385" + } + }, + { + "module": "isolation", + "name": "existing client qualification list excludes new enterprise qualification", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:09.113Z", + "durationMs": 35, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-096783f5-d960-4093-ad07-0c7b54d97e9f, client-e2e-096783f5-d960-4093-ad07-0c7b54d97e9f", + "traceId": "0122599c0aa3493ba08828c8bcf7b4d6", + "evidence": { + "qualificationCount": 3, + "excludedQualificationId": "2085928974533906434" + } + }, + { + "module": "isolation", + "name": "cross-client qualification file access is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:09.149Z", + "durationMs": 24, + "http": 200, + "code": "A0404", + "message": "File not found", + "requestId": "client-e2e-9a51033a-6791-4a40-b9c3-60efe0f7e8d0, client-e2e-9a51033a-6791-4a40-b9c3-60efe0f7e8d0", + "traceId": "5c88c456bd134c699bdaba79b3368673", + "evidence": { + "qualificationId": "2085928974533906434", + "rejectionCode": "A0404" + } + }, + { + "module": "account-security", + "name": "rotate refresh token", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:09.174Z", + "durationMs": 44, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-15556106-6cb6-4892-b7c0-dc0004b3bd38, client-e2e-15556106-6cb6-4892-b7c0-dc0004b3bd38", + "traceId": "7d0d3d7858e94150a61d579980745d29", + "evidence": { + "rotated": true + } + }, + { + "module": "account-security", + "name": "consumed refresh token cannot be replayed", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:09.218Z", + "durationMs": 34, + "http": 200, + "code": "A0401", + "message": "刷新令牌无效或已过期", + "requestId": "client-e2e-f9ee67b9-4de8-4bd0-99bf-f09ebe6db1fe, client-e2e-f9ee67b9-4de8-4bd0-99bf-f09ebe6db1fe", + "traceId": "67a6dbaacdd7492898013df78799dc9d", + "evidence": { + "rejectionCode": "A0401" + } + }, + { + "module": "account-security", + "name": "change owner password to temporary value", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:09.252Z", + "durationMs": 1029, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-76218463-8930-45e8-add3-346df0d90ec0, client-e2e-76218463-8930-45e8-add3-346df0d90ec0", + "traceId": "ed138c3ff2d9471b9dc8f963f622fb2b", + "evidence": { + "username": "client_20260808031955_7db794", + "passwordChanged": true + } + }, + { + "module": "account-security", + "name": "original password is rejected after change", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:10.282Z", + "durationMs": 331, + "http": 200, + "code": "A0401", + "message": "用户名或密码错误", + "requestId": "client-e2e-0145708e-06a4-412e-a8ee-637305c0f553, client-e2e-0145708e-06a4-412e-a8ee-637305c0f553", + "traceId": "ce572f158aca4dc383a6272e8775aaa8", + "evidence": { + "username": "client_20260808031955_7db794", + "rejectionCode": "A0401" + } + }, + { + "module": "account-security", + "name": "temporary password login succeeds", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:10.614Z", + "durationMs": 341, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-088f04d5-f506-4dee-8383-d3bd9ca09384, client-e2e-088f04d5-f506-4dee-8383-d3bd9ca09384", + "traceId": "642f65f666fe467e9f825404c21bc477", + "evidence": { + "username": "client_20260808031955_7db794" + } + }, + { + "module": "account-security", + "name": "restore owner password", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:10.955Z", + "durationMs": 989, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-44d95faf-504e-4a5a-ac0e-ddccf573ddef, client-e2e-44d95faf-504e-4a5a-ac0e-ddccf573ddef", + "traceId": "abd7452ad6f34c7395af85729f46b8c5", + "evidence": { + "username": "client_20260808031955_7db794", + "passwordRestored": true + } + }, + { + "module": "account-security", + "name": "restored owner password login succeeds", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:11.945Z", + "durationMs": 341, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-8ecc598d-8d1a-4f60-988b-4c0120df7edf, client-e2e-8ecc598d-8d1a-4f60-988b-4c0120df7edf", + "traceId": "0e61fc1a80ac4a0788760a16261bcfd0", + "evidence": { + "username": "client_20260808031955_7db794", + "passwordRestored": true + } + }, + { + "module": "account-security", + "name": "logout current client session", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:12.286Z", + "durationMs": 32, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-46cb80fa-8340-4fe5-8942-3acbf1d65eb7, client-e2e-46cb80fa-8340-4fe5-8942-3acbf1d65eb7", + "traceId": "bfe0e62f8d314ce9a545df1e09d4722e", + "evidence": { + "username": "client_20260808031955_7db794" + } + }, + { + "module": "account-security", + "name": "logged-out refresh token is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:12.319Z", + "durationMs": 27, + "http": 200, + "code": "A0401", + "message": "刷新令牌无效或已过期", + "requestId": "client-e2e-724259d7-1395-4bfa-b1f9-e37a5a1a50a1, client-e2e-724259d7-1395-4bfa-b1f9-e37a5a1a50a1", + "traceId": "bd24193bc2044f50baf12d5f496ebc5d", + "evidence": { + "rejectionCode": "A0401" + } + }, + { + "module": "account-security", + "name": "repeated logout with revoked session is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:20:12.347Z", + "durationMs": 25, + "http": 401, + "code": "A0401", + "message": "未登录或令牌已失效", + "requestId": "client-e2e-7017d51e-eda4-4103-a113-96567c38b250", + "traceId": null, + "evidence": { + "repeated": true, + "rejectionCode": "A0401" + } + } + ], + "futureModules": [ + "measurement", + "ocr", + "mojia", + "billing" + ] +} diff --git a/reports/client-test-env-20260808032107-59bca758.json b/reports/client-test-env-20260808032107-59bca758.json new file mode 100644 index 000000000..1fafc95b7 --- /dev/null +++ b/reports/client-test-env-20260808032107-59bca758.json @@ -0,0 +1,3188 @@ +{ + "marker": "20260808032107-59bca758", + "gateway": "http://8.163.30.128:9000", + "generatedAt": "2026-08-08T03:21:07.557Z", + "completedAt": "2026-08-08T03:21:23.225Z", + "success": true, + "fatal": null, + "testAccount": { + "username": "client_20260808032107_024af1", + "companyName": "客户端全链路测试企业-20260808032107-59bca758", + "legalPhone": "13959267559" + }, + "resources": { + "tenantId": "2085929269531889665", + "membershipId": "2085929269531889667", + "reviewId": "2085929275026427905", + "businessLicenseQualificationId": "2085929273797496834", + "businessLicenseDocumentUrl": "/api/merchant/v1/files/qualifications/0dc50e5f-9f9b-4ef4-abc0-e7c09dcacc97.png", + "productImageFileId": "2085929310632869889", + "enterpriseAddressId": "2085929280101535746", + "receivingWarehouseId": "193000000000200001", + "destinationWarehouseId": "193000000000000001", + "channelCode": "EXX_RAIL_NY", + "roleId": null, + "testMembershipId": "2085929284870459395", + "orderIds": [ + "2085929273286787073", + "2085929313522745345", + "2085929317431836673" + ] + }, + "steps": [ + { + "module": "registration", + "name": "enterprise self-registration", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:07.560Z", + "durationMs": 444, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-a8b9bb3e-7adb-422e-82f8-3bf99bba401e, client-e2e-a8b9bb3e-7adb-422e-82f8-3bf99bba401e", + "traceId": "7284d292f1a44077adc46f86419bc3d6", + "evidence": { + "tenantId": "2085929269531889665", + "membershipId": "2085929269531889667", + "tenantStatus": "PROFILE_REQUIRED", + "nextStep": "LOGIN_AND_COMPLETE_QUALIFICATIONS" + } + }, + { + "module": "registration", + "name": "duplicate username is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:08.005Z", + "durationMs": 55, + "http": 200, + "code": "A0409", + "message": "Username already exists", + "requestId": "client-e2e-3b142084-1179-4d40-849e-e12cc3a00f24, client-e2e-3b142084-1179-4d40-849e-e12cc3a00f24", + "traceId": "180782ea951d462d928c0ded00b2d2d6", + "evidence": null + }, + { + "module": "registration", + "name": "login before approval", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:08.061Z", + "durationMs": 357, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-67e3af49-4685-4bb7-b028-722e8bfc8959, client-e2e-67e3af49-4685-4bb7-b028-722e8bfc8959", + "traceId": "30f44dff099442d3a78bc8b74578c084", + "evidence": { + "username": "client_20260808032107_024af1" + } + }, + { + "module": "registration", + "name": "profile is incomplete before qualifications", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:08.419Z", + "durationMs": 31, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-227013df-8bf3-4b74-a09b-2f163f184f27, client-e2e-227013df-8bf3-4b74-a09b-2f163f184f27", + "traceId": "473d4eff0537449781c0b96719fd1ab3", + "evidence": { + "id": "2085929269531889665", + "status": "PROFILE_REQUIRED", + "tenantName": "客户端全链路测试企业-20260808032107-59bca758" + } + }, + { + "module": "pre-approval-master-data", + "name": "load active domestic receiving warehouses", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:08.451Z", + "durationMs": 30, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-a304afcc-3d2e-48f2-838a-2675a0db018e, client-e2e-a304afcc-3d2e-48f2-838a-2675a0db018e", + "traceId": "2c1bc4197d454b2d82462ffda2603454", + "evidence": { + "total": "2", + "warehouseCount": 2 + } + }, + { + "module": "pre-approval-master-data", + "name": "load active FBA destination warehouses", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:08.482Z", + "durationMs": 73, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-c63815cb-b87c-4e67-a9b1-1b666f95c783, client-e2e-c63815cb-b87c-4e67-a9b1-1b666f95c783", + "traceId": "9524fde426714760814f7996a3165f89", + "evidence": { + "total": "253", + "warehouseCount": 200 + } + }, + { + "module": "pre-approval-master-data", + "name": "load receiving warehouse detail", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:08.556Z", + "durationMs": 35, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-8eba94f2-d7cb-4772-9ec8-6e923d1212a5, client-e2e-8eba94f2-d7cb-4772-9ec8-6e923d1212a5", + "traceId": "b9285ec6228b462595ffdce11293fc9e", + "evidence": { + "id": "193000000000200001", + "name": "义乌仓" + } + }, + { + "module": "pre-approval-master-data", + "name": "load active pricing channels", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:08.592Z", + "durationMs": 55, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-5fb37aeb-ea96-4563-b270-8ab44c780593, client-e2e-5fb37aeb-ea96-4563-b270-8ab44c780593", + "traceId": "f1b8ff63de9447338fe7268f0b9d9240", + "evidence": { + "channels": [ + { + "channelCode": "EXX_RAIL_NY", + "priceModel": "FBA_WAREHOUSE_RATE", + "pricingTaxModes": [ + "TAX_INCLUDED", + "TAX_EXCLUDED" + ] + }, + { + "channelCode": "EXX_TRUCK", + "priceModel": "FBA_WAREHOUSE_RATE", + "pricingTaxModes": [ + "TAX_INCLUDED", + "TAX_EXCLUDED" + ] + }, + { + "channelCode": "HEDE_PARCEL", + "priceModel": "REGION_WEIGHT_TIER", + "pricingTaxModes": [ + "TAX_INCLUDED" + ] + }, + { + "channelCode": "HEDE_TRUCK", + "priceModel": "FBA_WAREHOUSE_RATE", + "pricingTaxModes": [ + "TAX_INCLUDED", + "TAX_EXCLUDED" + ] + }, + { + "channelCode": "MATSON_CLX_PARCEL", + "priceModel": "REGION_WEIGHT_TIER", + "pricingTaxModes": [ + "TAX_INCLUDED" + ] + }, + { + "channelCode": "MATSON_CLX_TRUCK", + "priceModel": "FBA_WAREHOUSE_RATE", + "pricingTaxModes": [ + "TAX_INCLUDED", + "TAX_EXCLUDED" + ] + }, + { + "channelCode": "MATSON_MAX_PARCEL", + "priceModel": "REGION_WEIGHT_TIER", + "pricingTaxModes": [ + "TAX_INCLUDED" + ] + }, + { + "channelCode": "MATSON_MAX_TRUCK", + "priceModel": "FBA_WAREHOUSE_RATE", + "pricingTaxModes": [ + "TAX_INCLUDED", + "TAX_EXCLUDED" + ] + }, + { + "channelCode": "OA_CHICAGO_RAIL", + "priceModel": "FBA_WAREHOUSE_RATE", + "pricingTaxModes": [ + "TAX_INCLUDED", + "TAX_EXCLUDED" + ] + }, + { + "channelCode": "OA_HOUSTON_TRUCK", + "priceModel": "FBA_WAREHOUSE_RATE", + "pricingTaxModes": [ + "TAX_INCLUDED", + "TAX_EXCLUDED" + ] + }, + { + "channelCode": "OA_LA_FULL_TRUCK", + "priceModel": "FBA_WAREHOUSE_RATE", + "pricingTaxModes": [ + "TAX_INCLUDED", + "TAX_EXCLUDED" + ] + }, + { + "channelCode": "OA_LA_TRUCK", + "priceModel": "FBA_WAREHOUSE_RATE", + "pricingTaxModes": [ + "TAX_INCLUDED", + "TAX_EXCLUDED" + ] + }, + { + "channelCode": "OA_NEW_YORK_TRUCK", + "priceModel": "FBA_WAREHOUSE_RATE", + "pricingTaxModes": [ + "TAX_INCLUDED", + "TAX_EXCLUDED" + ] + }, + { + "channelCode": "OA_PARCEL", + "priceModel": "REGION_WEIGHT_TIER", + "pricingTaxModes": [ + "TAX_INCLUDED" + ] + }, + { + "channelCode": "OA_SAVANNAH_TRUCK", + "priceModel": "FBA_WAREHOUSE_RATE", + "pricingTaxModes": [ + "TAX_INCLUDED", + "TAX_EXCLUDED" + ] + } + ] + } + }, + { + "module": "pre-approval-master-data", + "name": "load public shipper candidates", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:08.648Z", + "durationMs": 38, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-3b63231b-2175-42c5-8408-9182ab74d85e, client-e2e-3b63231b-2175-42c5-8408-9182ab74d85e", + "traceId": "25760465f0c5444d90f0942f61ba2d43", + "evidence": { + "candidateCount": 3 + } + }, + { + "module": "pre-approval-product-image", + "name": "upload product image", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:08.688Z", + "durationMs": 45, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-c7b87143-b6a6-4295-902a-2e1f702323a3, client-e2e-c7b87143-b6a6-4295-902a-2e1f702323a3", + "traceId": "bcb254f69b4c40578906e1f4839067e9", + "evidence": { + "fileId": "2085929272749916161", + "fileName": "product-20260808032107-59bca758.png", + "contentType": "image/png", + "sizeBytes": "68" + } + }, + { + "module": "order-validation", + "name": "missing pricingTaxMode is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:08.734Z", + "durationMs": 43, + "http": 200, + "code": "A0422", + "message": "pricingTaxMode: must not be blank", + "requestId": "client-e2e-16d7870e-b69b-4f26-95fe-6f15b2b9f181, client-e2e-16d7870e-b69b-4f26-95fe-6f15b2b9f181", + "traceId": "180cba1d28a3483d8864c331c18d7c2d", + "evidence": null + }, + { + "module": "order-before-approval", + "name": "create draft before approval", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:08.777Z", + "durationMs": 87, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-330768f8-a0ee-40e5-b0ee-81469daa2eaa, client-e2e-330768f8-a0ee-40e5-b0ee-81469daa2eaa", + "traceId": "c6a7188d672346fdb221da2a8ca51ada", + "evidence": { + "orderId": "2085929273286787073", + "status": "DRAFT" + } + }, + { + "module": "order-before-approval", + "name": "create draft idempotent replay", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:08.865Z", + "durationMs": 35, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-d982af19-a4c6-4f60-b970-7de643925210, client-e2e-d982af19-a4c6-4f60-b970-7de643925210", + "traceId": "04c1b6180abd4314b9881b032043d13d", + "evidence": { + "orderId": "2085929273286787073", + "replayed": true + } + }, + { + "module": "order-before-approval", + "name": "submit is blocked before approval", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:08.901Z", + "durationMs": 37, + "http": 200, + "code": "A0403", + "message": "Enterprise information must be approved before ordering", + "requestId": "client-e2e-c05ef246-241d-4d0d-be07-d4269f7db180, client-e2e-c05ef246-241d-4d0d-be07-d4269f7db180", + "traceId": "eb5b648bbbb947f8b4726072d76e5912", + "evidence": { + "orderId": "2085929273286787073", + "rejectionCode": "A0403" + } + }, + { + "module": "qualification-review", + "name": "upload required qualification package", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:08.939Z", + "durationMs": 53, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-2d71042b-09c8-43e4-967b-73841a4e2274, client-e2e-2d71042b-09c8-43e4-967b-73841a4e2274", + "traceId": "0b99fbf514b1497995915ada6e16d5e6", + "evidence": { + "businessLicenseQualificationId": "2085929273797496834", + "legalPersonIdQualificationId": "2085929273810079746", + "tenantStatus": "PROFILE_REQUIRED" + } + }, + { + "module": "qualification-review", + "name": "upload optional qualification FREIGHT_FORWARDER_CERTIFICATE", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:08.993Z", + "durationMs": 62, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-6d12910c-0756-4061-811e-44d72979fca5, client-e2e-6d12910c-0756-4061-811e-44d72979fca5", + "traceId": "52e56f224fe14e37b7bd5e3f2aa3e79d", + "evidence": { + "qualificationType": "FREIGHT_FORWARDER_CERTIFICATE", + "qualificationId": "2085929274070126594", + "tenantStatus": "PROFILE_REQUIRED" + } + }, + { + "module": "qualification-review", + "name": "upload optional qualification BANK_ACCOUNT_LICENSE", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:09.055Z", + "durationMs": 47, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-ef677232-1d65-436c-8e3c-64ec145229e6, client-e2e-ef677232-1d65-436c-8e3c-64ec145229e6", + "traceId": "58dbd496faf24fc9ac711a6537ddde1c", + "evidence": { + "qualificationType": "BANK_ACCOUNT_LICENSE", + "qualificationId": "2085929274271453185", + "tenantStatus": "PROFILE_REQUIRED" + } + }, + { + "module": "qualification-review", + "name": "duplicate optional qualification requires explicit replacement", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:09.103Z", + "durationMs": 54, + "http": 200, + "code": "A0409", + "message": "Qualification type already uploaded / 该类资质已上传", + "requestId": "client-e2e-80ee142d-89a7-4ed5-8ba6-a8ea448b25b5, client-e2e-80ee142d-89a7-4ed5-8ba6-a8ea448b25b5", + "traceId": "daafc657e7e644e68967f6fc35b42f09", + "evidence": { + "qualificationType": "FREIGHT_FORWARDER_CERTIFICATE", + "rejectionCode": "A0409" + } + }, + { + "module": "qualification-review", + "name": "replace optional qualification explicitly", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:09.158Z", + "durationMs": 48, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-64b73984-2f96-4620-9d10-82f109d262b2, client-e2e-64b73984-2f96-4620-9d10-82f109d262b2", + "traceId": "3633c6bcc83c469da640f40eb43698f4", + "evidence": { + "qualificationType": "FREIGHT_FORWARDER_CERTIFICATE", + "qualificationId": "2085929274720243713", + "replaced": true + } + }, + { + "module": "qualification-review", + "name": "required qualifications are pending", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:09.207Z", + "durationMs": 27, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-0aced113-91bb-4c99-ad5a-5234e8820452, client-e2e-0aced113-91bb-4c99-ad5a-5234e8820452", + "traceId": "267d74e490844f9a9329e55d86579228", + "evidence": { + "qualifications": [ + { + "qualificationId": "2085929273797496834", + "qualificationType": "BUSINESS_LICENSE", + "status": "PENDING" + }, + { + "qualificationId": "2085929273810079746", + "qualificationType": "LEGAL_PERSON_ID", + "status": "PENDING" + }, + { + "qualificationId": "2085929274271453185", + "qualificationType": "BANK_ACCOUNT_LICENSE", + "status": "PENDING" + }, + { + "qualificationId": "2085929274720243713", + "qualificationType": "FREIGHT_FORWARDER_CERTIFICATE", + "status": "PENDING" + }, + { + "qualificationId": "2085929274070126594", + "qualificationType": "FREIGHT_FORWARDER_CERTIFICATE", + "status": "SUPERSEDED" + } + ] + } + }, + { + "module": "qualification-review", + "name": "submit enterprise review", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:09.235Z", + "durationMs": 47, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-66a385bf-f707-4b94-9951-3a0b751eeae4, client-e2e-66a385bf-f707-4b94-9951-3a0b751eeae4", + "traceId": "4a5c20c276514573970a6d2f1b5a0bd2", + "evidence": { + "tenantId": "2085929269531889665", + "status": "PENDING" + } + }, + { + "module": "qualification-review", + "name": "platform reviewer login", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:09.282Z", + "durationMs": 343, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-c3f0c5cc-c064-4cee-a83f-7977eedcc74d, client-e2e-c3f0c5cc-c064-4cee-a83f-7977eedcc74d", + "traceId": "0b0459ff9a4147e594f3fb71d4850fef", + "evidence": { + "username": "platform_admin" + } + }, + { + "module": "qualification-review", + "name": "platform finds pending review", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:09.626Z", + "durationMs": 50, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-4aea8f92-9d6c-44cd-806e-6b115e650d8c, client-e2e-4aea8f92-9d6c-44cd-806e-6b115e650d8c", + "traceId": "e0a5135ce75f4e4a87ceb15e871d5b46", + "evidence": { + "reviewId": "2085929275026427905", + "tenantId": "2085929269531889665", + "status": "PENDING" + } + }, + { + "module": "qualification-review", + "name": "platform sees required qualifications", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:09.677Z", + "durationMs": 43, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-f3193638-76e1-4a50-90be-8cb05d93da02, client-e2e-f3193638-76e1-4a50-90be-8cb05d93da02", + "traceId": "1830f3b5a1274a669d82363cb6ac747a", + "evidence": { + "qualifications": [ + { + "qualificationId": "2085929273797496834", + "qualificationType": "BUSINESS_LICENSE", + "status": "PENDING" + }, + { + "qualificationId": "2085929273810079746", + "qualificationType": "LEGAL_PERSON_ID", + "status": "PENDING" + }, + { + "qualificationId": "2085929274271453185", + "qualificationType": "BANK_ACCOUNT_LICENSE", + "status": "PENDING" + }, + { + "qualificationId": "2085929274720243713", + "qualificationType": "FREIGHT_FORWARDER_CERTIFICATE", + "status": "PENDING" + }, + { + "qualificationId": "2085929274070126594", + "qualificationType": "FREIGHT_FORWARDER_CERTIFICATE", + "status": "SUPERSEDED" + } + ] + } + }, + { + "module": "qualification-review", + "name": "platform approves enterprise", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:09.721Z", + "durationMs": 59, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-dcf36100-d0c8-48e6-996b-e2694e8fabe2, client-e2e-dcf36100-d0c8-48e6-996b-e2694e8fabe2", + "traceId": "7868c057694242d38e507ddd16c5dcde", + "evidence": { + "tenantId": "2085929269531889665", + "administratorCreated": false, + "generatedCredentialsReturned": false + } + }, + { + "module": "qualification-review", + "name": "registered account remains enterprise owner", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:09.781Z", + "durationMs": 36, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-94ac1c1b-25d8-4205-9510-776426791932, client-e2e-94ac1c1b-25d8-4205-9510-776426791932", + "traceId": "863ca1085b314ff990c303d49320a16e", + "evidence": { + "membershipId": "2085929269531889667", + "username": "client_20260808032107_024af1", + "memberType": "OWNER", + "status": "ACTIVE" + } + }, + { + "module": "merchant-session", + "name": "client re-login after approval", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:09.817Z", + "durationMs": 341, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-f32442b2-a696-499f-bdc8-0836246312dc, client-e2e-f32442b2-a696-499f-bdc8-0836246312dc", + "traceId": "8cb3c7bc163d4b009f60f8269468ba73", + "evidence": { + "username": "client_20260808032107_024af1" + } + }, + { + "module": "merchant-session", + "name": "profile is active after approval", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:10.160Z", + "durationMs": 39, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-2ecf8171-81d8-4f1c-98cf-97a9aaf028f8, client-e2e-2ecf8171-81d8-4f1c-98cf-97a9aaf028f8", + "traceId": "16b816b34942485ab1e3d3dc1bc6dccc", + "evidence": { + "id": "2085929269531889665", + "status": "ACTIVE", + "tenantName": "客户端全链路测试企业-20260808032107-59bca758" + } + }, + { + "module": "merchant-session", + "name": "required qualifications are approved", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:10.200Z", + "durationMs": 29, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-fc043ea0-d526-437d-b49c-8dc6f302880a, client-e2e-fc043ea0-d526-437d-b49c-8dc6f302880a", + "traceId": "9b77fe5024074696a958f70bcd99112d", + "evidence": { + "qualifications": [ + { + "qualificationId": "2085929273797496834", + "qualificationType": "BUSINESS_LICENSE", + "status": "APPROVED" + }, + { + "qualificationId": "2085929273810079746", + "qualificationType": "LEGAL_PERSON_ID", + "status": "APPROVED" + }, + { + "qualificationId": "2085929274271453185", + "qualificationType": "BANK_ACCOUNT_LICENSE", + "status": "APPROVED" + }, + { + "qualificationId": "2085929274720243713", + "qualificationType": "FREIGHT_FORWARDER_CERTIFICATE", + "status": "APPROVED" + }, + { + "qualificationId": "2085929274070126594", + "qualificationType": "FREIGHT_FORWARDER_CERTIFICATE", + "status": "SUPERSEDED" + } + ] + } + }, + { + "module": "merchant-session", + "name": "preview approved qualification file", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:10.231Z", + "durationMs": 34, + "http": 200, + "code": null, + "message": null, + "requestId": "client-e2e-2c8e1a8f-3084-42e6-ac1d-8b47959135b8, client-e2e-2c8e1a8f-3084-42e6-ac1d-8b47959135b8", + "traceId": "a292ee2437024eb9b76c9dd04322baf9", + "evidence": { + "sizeBytes": 68, + "contentType": "image/png" + } + }, + { + "module": "profile-management", + "name": "load enterprise profile for editing", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:10.266Z", + "durationMs": 24, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-ea5ed54b-8460-4080-8f7b-8a3ff8501a4e, client-e2e-ea5ed54b-8460-4080-8f7b-8a3ff8501a4e", + "traceId": "dc5dd06d8d64486ba6683d247bdff4b3", + "evidence": { + "id": "2085929269531889665", + "tenantName": "客户端全链路测试企业-20260808032107-59bca758", + "status": "ACTIVE" + } + }, + { + "module": "profile-management", + "name": "edit enterprise profile", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:10.291Z", + "durationMs": 43, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-60a6231d-cb0c-42b4-91d7-20c28927e6a4, client-e2e-60a6231d-cb0c-42b4-91d7-20c28927e6a4", + "traceId": "a3e2cfa1c3a84496803b61d5aaec9d60", + "evidence": { + "id": "2085929269531889665", + "tenantName": "客户端全链路测试企业-20260808032107-59bca758-已编辑", + "contactName": "企业联系人-20260808032107-59bca758", + "status": "ACTIVE" + } + }, + { + "module": "profile-management", + "name": "enterprise profile edit is persisted", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:10.335Z", + "durationMs": 38, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-f826cd52-ae68-49ed-96cc-345ebed49a77, client-e2e-f826cd52-ae68-49ed-96cc-345ebed49a77", + "traceId": "bad03701e28b445da23f844b1103a8cd", + "evidence": { + "id": "2085929269531889665", + "tenantName": "客户端全链路测试企业-20260808032107-59bca758-已编辑", + "contactEmail": "company_2026080803210759bca758@example.com" + } + }, + { + "module": "profile-validation", + "name": "invalid enterprise contact email is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:10.374Z", + "durationMs": 37, + "http": 200, + "code": "A0422", + "message": "contactEmail: must be a well-formed email address", + "requestId": "client-e2e-21a76857-6912-4faf-8b7e-3ceaf75a9bbd, client-e2e-21a76857-6912-4faf-8b7e-3ceaf75a9bbd", + "traceId": "97ee6f3a684d434f9a34d28be68f75b8", + "evidence": { + "rejectionCode": "A0422" + } + }, + { + "module": "profile-validation", + "name": "blank enterprise address detail is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:10.412Z", + "durationMs": 43, + "http": 200, + "code": "A0422", + "message": "detail: must not be blank", + "requestId": "client-e2e-277c1a1f-e38f-42c2-804a-9d545c5d7203, client-e2e-277c1a1f-e38f-42c2-804a-9d545c5d7203", + "traceId": "da11e347160b4419bfed66b2e4bdb210", + "evidence": { + "rejectionCode": "A0422" + } + }, + { + "module": "profile-management", + "name": "add enterprise operating address", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:10.455Z", + "durationMs": 33, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-e0c45d07-0865-40de-8919-cea7fd579ce5, client-e2e-e0c45d07-0865-40de-8919-cea7fd579ce5", + "traceId": "4083030d7e7045e2ac1679cf4d9fbfb6", + "evidence": { + "id": "2085929280101535746", + "addressType": "OPERATING", + "city": "深圳市", + "isDefault": true + } + }, + { + "module": "profile-management", + "name": "enterprise address list contains created address", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:10.488Z", + "durationMs": 33, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-83dbd1fa-b75c-4f4a-aa94-031fa2cf2c1a, client-e2e-83dbd1fa-b75c-4f4a-aa94-031fa2cf2c1a", + "traceId": "45a122f0f8594c5a9d5448333ba29d83", + "evidence": { + "addressCount": 2, + "addressId": "2085929280101535746" + } + }, + { + "module": "profile-management", + "name": "platform can read created enterprise address", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:10.521Z", + "durationMs": 46, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-03611475-212c-4d99-886f-af1786b62ef5, client-e2e-03611475-212c-4d99-886f-af1786b62ef5", + "traceId": "c959acbdbc7b46e5834d894c32f6710e", + "evidence": { + "addressCount": 2, + "addressId": "2085929280101535746" + } + }, + { + "module": "profile-management", + "name": "load personal profile", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:10.567Z", + "durationMs": 47, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-b5ecc7b6-a71b-4191-88ef-98d274086ee8, client-e2e-b5ecc7b6-a71b-4191-88ef-98d274086ee8", + "traceId": "beb01afc4eaa4f64a11912b1027a248f", + "evidence": { + "userId": "2085929269531889666", + "username": "client_20260808032107_024af1", + "displayName": "测试管理员-20260808032107-59bca758" + } + }, + { + "module": "profile-validation", + "name": "invalid personal email is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:10.614Z", + "durationMs": 46, + "http": 200, + "code": "A0422", + "message": "email: must be a well-formed email address", + "requestId": "client-e2e-85282534-cf0b-4a52-9687-d4d3f3425409, client-e2e-85282534-cf0b-4a52-9687-d4d3f3425409", + "traceId": "7e03401a68d84f46853292b5573888f0", + "evidence": { + "rejectionCode": "A0422" + } + }, + { + "module": "profile-management", + "name": "edit personal profile", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:10.661Z", + "durationMs": 53, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-6ea63b21-0301-4b5e-a67d-44bc9d37195f, client-e2e-6ea63b21-0301-4b5e-a67d-44bc9d37195f", + "traceId": "692f3fc16ee546498274e429e46df1db", + "evidence": { + "userId": "2085929269531889666", + "username": "client_20260808032107_024af1", + "displayName": "测试企业管理员-20260808032107-59bca758" + } + }, + { + "module": "profile-management", + "name": "re-login after personal profile token revocation", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:10.715Z", + "durationMs": 345, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-5ca03da9-f256-4ba8-892b-d1a7968c273c, client-e2e-5ca03da9-f256-4ba8-892b-d1a7968c273c", + "traceId": "5cd7973fce8e454abc22bea783aea9be", + "evidence": { + "username": "client_20260808032107_024af1" + } + }, + { + "module": "profile-management", + "name": "personal profile edit is persisted", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:11.061Z", + "durationMs": 49, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-0cf1b809-1b7c-4cfb-8bb6-868fa85a8bbd, client-e2e-0cf1b809-1b7c-4cfb-8bb6-868fa85a8bbd", + "traceId": "22a86f0a37ff44eea02b37b8818eaa76", + "evidence": { + "userId": "2085929269531889666", + "username": "client_20260808032107_024af1", + "displayName": "测试企业管理员-20260808032107-59bca758" + } + }, + { + "module": "rbac-member", + "name": "load merchant permission resources", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:11.111Z", + "durationMs": 46, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-94045b6b-0669-407b-a147-7fae247b52f7, client-e2e-94045b6b-0669-407b-a147-7fae247b52f7", + "traceId": "8e77a05fea13403290ed8e567ccca25e", + "evidence": { + "permissionCount": 27 + } + }, + { + "module": "menu-permissions", + "name": "load owner effective permissions", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:11.158Z", + "durationMs": 46, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-ea217b5f-943a-4842-a4e4-5ba4854d1722, client-e2e-ea217b5f-943a-4842-a4e4-5ba4854d1722", + "traceId": "2f2b56ea95504720b16876bd7edb3a20", + "evidence": { + "backendPermissionCount": 27, + "visibleClientMenus": [ + "account:profile:view", + "company:member:list", + "company:permission:list", + "company:profile:view", + "company:role:list", + "dashboard:view", + "order:first-leg:list" + ] + } + }, + { + "module": "rbac-member", + "name": "load initial merchant roles", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:11.205Z", + "durationMs": 42, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-e0c3674a-6e08-4ade-8dbb-45cf133c603d, client-e2e-e0c3674a-6e08-4ade-8dbb-45cf133c603d", + "traceId": "19a074470e444442becf1c211ad1bb44", + "evidence": { + "roleCount": 0 + } + }, + { + "module": "rbac-member", + "name": "create custom role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:11.248Z", + "durationMs": 34, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-48b79194-d4db-4158-8f81-14ab297bc33c, client-e2e-48b79194-d4db-4158-8f81-14ab297bc33c", + "traceId": "f5a6334846834384852fdadb74ba371a", + "evidence": { + "roleId": "2085929283440201730", + "roleCode": "E2E_20260808032107_59bca758", + "roleType": "CUSTOM", + "status": "ACTIVE" + } + }, + { + "module": "rbac-member", + "name": "grant permissions to custom role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:11.283Z", + "durationMs": 52, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-28af332b-f5f0-4f9b-bd32-efc0b18803ca, client-e2e-28af332b-f5f0-4f9b-bd32-efc0b18803ca", + "traceId": "2d2b7c1eea004a1f9f4e8e882d646922", + "evidence": { + "roleId": "2085929283440201730", + "permissionIds": [ + "5301010", + "5301011" + ], + "permissionCodes": [ + "merchant:order:list", + "merchant:order:view" + ] + } + }, + { + "module": "rbac-member", + "name": "custom role permission detail is persisted", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:11.336Z", + "durationMs": 28, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-d5ee01f4-36af-41c9-9c67-fdde59aa123b, client-e2e-d5ee01f4-36af-41c9-9c67-fdde59aa123b", + "traceId": "ac0a059d08b14f8aa370e3904f6d6ca0", + "evidence": { + "roleId": "2085929283440201730", + "roleName": "订单只读-20260808032107-59bca758", + "permissionIds": [ + "5301011", + "5301010" + ] + } + }, + { + "module": "rbac-member", + "name": "edit custom role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:11.365Z", + "durationMs": 58, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-325d1aa3-e22a-4f63-ac10-48c460e797f3, client-e2e-325d1aa3-e22a-4f63-ac10-48c460e797f3", + "traceId": "62a68895ab8543489cbc2f8e567ac4e7", + "evidence": { + "roleId": "2085929283440201730", + "roleName": "订单查询员-20260808032107-59bca758", + "description": "edited 20260808032107-59bca758" + } + }, + { + "module": "rbac-member", + "name": "disable custom role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:11.424Z", + "durationMs": 60, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-e77a9acf-941b-4d79-ad04-5118e00a52f8, client-e2e-e77a9acf-941b-4d79-ad04-5118e00a52f8", + "traceId": "9a0f0b5ac11e42ba80f150069192a121", + "evidence": { + "roleId": "2085929283440201730", + "status": "DISABLED" + } + }, + { + "module": "rbac-member", + "name": "enable custom role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:11.485Z", + "durationMs": 45, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-bfc8f525-5383-4944-8607-0481257796ea, client-e2e-bfc8f525-5383-4944-8607-0481257796ea", + "traceId": "c6319e146c5849d2bd787e586481d418", + "evidence": { + "roleId": "2085929283440201730", + "status": "ACTIVE" + } + }, + { + "module": "member-validation", + "name": "member with weak password and invalid email is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:11.531Z", + "durationMs": 46, + "http": 200, + "code": "A0422", + "message": "password: 密码必须同时包含字母和数字;email: must be a well-formed email address", + "requestId": "client-e2e-ba6146e3-9f51-4b1d-be85-75be3734a07a, client-e2e-ba6146e3-9f51-4b1d-be85-75be3734a07a", + "traceId": "58a8115691d54913a8b77ad866b381fe", + "evidence": { + "rejectionCode": "A0422" + } + }, + { + "module": "rbac-member", + "name": "create enterprise member with role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:11.578Z", + "durationMs": 357, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-0e2d2db6-9ae5-4f93-81be-04a41b49e846, client-e2e-0e2d2db6-9ae5-4f93-81be-04a41b49e846", + "traceId": "a02845e3f23645038ab67759a56f5d5c", + "evidence": { + "membershipId": "2085929284870459395", + "memberType": "EMPLOYEE", + "status": "ACTIVE", + "roleIds": [ + "2085929283440201730" + ] + } + }, + { + "module": "rbac-member", + "name": "enterprise member list contains created member and roles", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:11.935Z", + "durationMs": 26, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-c1d102b7-c038-4181-b078-ab8aad026f21, client-e2e-c1d102b7-c038-4181-b078-ab8aad026f21", + "traceId": "b3919f94ef924cc89986ff748acfd7f2", + "evidence": { + "memberCount": 2, + "membershipId": "2085929284870459395" + } + }, + { + "module": "rbac-member", + "name": "enterprise member detail matches created fields and roles", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:11.963Z", + "durationMs": 27, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-3fae5c87-b3bb-42f9-8997-15815561a6c8, client-e2e-3fae5c87-b3bb-42f9-8997-15815561a6c8", + "traceId": "40f221c8e1ef448b8463ac5b66049206", + "evidence": { + "membershipId": "2085929284870459395", + "status": "ACTIVE", + "roleIds": [ + "2085929283440201730" + ] + } + }, + { + "module": "rbac-member", + "name": "duplicate member username is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:11.990Z", + "durationMs": 34, + "http": 200, + "code": "A0409", + "message": "企业成员编号已存在", + "requestId": "client-e2e-e9baffd7-015f-46e4-8d0e-b30ac1cf4472, client-e2e-e9baffd7-015f-46e4-8d0e-b30ac1cf4472", + "traceId": "fa4b8ab3c9f647f6be64ed27deb45415", + "evidence": { + "username": "member_20260808032111_71de6", + "rejectionCode": "A0409" + } + }, + { + "module": "rbac-member", + "name": "assigned custom role cannot be deleted", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:12.025Z", + "durationMs": 36, + "http": 200, + "code": "A0409", + "message": "角色已分配给成员,不能删除", + "requestId": "client-e2e-f3688fbc-95db-4c7f-8a8a-965ecf443309, client-e2e-f3688fbc-95db-4c7f-8a8a-965ecf443309", + "traceId": "51a29f555fe746d48e906e1acd5dc99e", + "evidence": { + "roleId": "2085929283440201730", + "rejectionCode": "A0409" + } + }, + { + "module": "rbac-member", + "name": "enterprise owner cannot be disabled", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:12.061Z", + "durationMs": 42, + "http": 200, + "code": "A0403", + "message": "企业所有者不能被停用", + "requestId": "client-e2e-c5575ca2-1b9d-43d2-9421-920b824ba639, client-e2e-c5575ca2-1b9d-43d2-9421-920b824ba639", + "traceId": "495cc532503646a883e1b3b4b7363836", + "evidence": { + "membershipId": "2085929269531889667", + "rejectionCode": "A0403" + } + }, + { + "module": "rbac-member", + "name": "enterprise owner cannot be edited through member API", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:12.104Z", + "durationMs": 40, + "http": 200, + "code": "A0403", + "message": "不能通过成员管理接口创建或转让企业所有者", + "requestId": "client-e2e-81adbeb7-c112-49bc-a21f-e7a098932279, client-e2e-81adbeb7-c112-49bc-a21f-e7a098932279", + "traceId": "18e0ebaa57ee41b08e35a144d857dbeb", + "evidence": { + "membershipId": "2085929269531889667", + "rejectionCode": "A0403" + } + }, + { + "module": "rbac-member", + "name": "new enterprise member can login", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:12.145Z", + "durationMs": 345, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-6ffe6bbc-7eb8-48ed-97ac-bee9fac5de24, client-e2e-6ffe6bbc-7eb8-48ed-97ac-bee9fac5de24", + "traceId": "2eccef603ebb451983b8239ad6a45eac", + "evidence": { + "username": "member_20260808032111_71de6" + } + }, + { + "module": "rbac-member", + "name": "member can use granted order list permission", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:12.490Z", + "durationMs": 41, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-57eda8f7-688e-4711-afe7-78f280689748, client-e2e-57eda8f7-688e-4711-afe7-78f280689748", + "traceId": "2fd378fc9d4d4817877e977cbb54a86e", + "evidence": { + "total": "1" + } + }, + { + "module": "rbac-member", + "name": "member can view order with granted permission", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:12.532Z", + "durationMs": 38, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-c670907a-263e-4817-bce6-2bfacc0e65e4, client-e2e-c670907a-263e-4817-bce6-2bfacc0e65e4", + "traceId": "d8e708e4c08f44efb31f100ebf70a7bf", + "evidence": { + "orderId": "2085929273286787073", + "status": "DRAFT" + } + }, + { + "module": "menu-permissions", + "name": "read-only member effective permissions match role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:12.571Z", + "durationMs": 24, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-f5a3dbc7-1a93-4a87-80f8-bd49fe9f8c98, client-e2e-f5a3dbc7-1a93-4a87-80f8-bd49fe9f8c98", + "traceId": "ec5edeff1a014f5a9a2f8a009d877ca5", + "evidence": { + "backendPermissions": [ + "merchant:order:view", + "merchant:order:list" + ], + "visibleClientMenus": [ + "account:profile:view", + "dashboard:view", + "order:first-leg:list" + ] + } + }, + { + "module": "menu-permissions", + "name": "disable assigned role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:12.595Z", + "durationMs": 103, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-c38af3bf-ed4b-4cca-bf55-739d1a280a47, client-e2e-c38af3bf-ed4b-4cca-bf55-739d1a280a47", + "traceId": "63fafcfc9b0048b19c154138d761cb50", + "evidence": { + "roleId": "2085929283440201730", + "status": "DISABLED" + } + }, + { + "module": "menu-permissions", + "name": "disabled role revokes stale token permission query", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:12.698Z", + "durationMs": 32, + "http": 401, + "code": "A0401", + "message": "登录会话已过期、已退出或 Redis 不可用", + "requestId": "client-e2e-e577b34f-af6a-450f-b0e0-26fe06280f8b", + "traceId": null, + "evidence": { + "rejectionCode": "A0401", + "message": "登录会话已过期、已退出或 Redis 不可用" + } + }, + { + "module": "menu-permissions", + "name": "disabled role blocks stale token order access", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:12.730Z", + "durationMs": 31, + "http": 401, + "code": "A0401", + "message": "登录会话已过期、已退出或 Redis 不可用", + "requestId": "client-e2e-46d00632-7837-4c2a-8dca-78cb46290239", + "traceId": null, + "evidence": { + "rejectionCode": "A0401", + "message": "登录会话已过期、已退出或 Redis 不可用" + } + }, + { + "module": "menu-permissions", + "name": "member login succeeds while role is disabled", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:12.762Z", + "durationMs": 352, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-106f94cd-09e6-4742-8e21-a8f3a5a620cf, client-e2e-106f94cd-09e6-4742-8e21-a8f3a5a620cf", + "traceId": "337d1846ff0a4e44a1f08bbf598a610c", + "evidence": { + "username": "member_20260808032111_71de6" + } + }, + { + "module": "menu-permissions", + "name": "disabled role removes member menus and permissions", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:13.115Z", + "durationMs": 28, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-c97367f0-463c-45b8-83fd-4529f93ffbd7, client-e2e-c97367f0-463c-45b8-83fd-4529f93ffbd7", + "traceId": "789a4b7b34644c8b8989a1f3b1254ffc", + "evidence": { + "backendPermissions": [], + "visibleClientMenus": [ + "account:profile:view", + "dashboard:view" + ] + } + }, + { + "module": "menu-permissions", + "name": "disabled role blocks member order list", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:13.143Z", + "durationMs": 23, + "http": 200, + "code": "A0403", + "message": "Access denied", + "requestId": "client-e2e-b655b680-5171-43bb-a32f-95ea08ac3d32, client-e2e-b655b680-5171-43bb-a32f-95ea08ac3d32", + "traceId": "9845a5e02cc049e5b5e68fb45fdefb30", + "evidence": { + "rejectionCode": "A0403" + } + }, + { + "module": "menu-permissions", + "name": "re-enable assigned role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:13.167Z", + "durationMs": 386, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-514a9349-9163-4925-a356-b20e409abda0, client-e2e-514a9349-9163-4925-a356-b20e409abda0", + "traceId": "1d1a8c14baea46e9bcc04725ffcb1c2e", + "evidence": { + "roleId": "2085929283440201730", + "status": "ACTIVE" + } + }, + { + "module": "menu-permissions", + "name": "member re-login after role is enabled", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:13.553Z", + "durationMs": 360, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-533e58e0-c5b6-4805-8fda-de0242261726, client-e2e-533e58e0-c5b6-4805-8fda-de0242261726", + "traceId": "8126960140f14cd386cc0a2d06d8583a", + "evidence": { + "username": "member_20260808032111_71de6" + } + }, + { + "module": "menu-permissions", + "name": "re-enabled role restores member menus", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:13.914Z", + "durationMs": 40, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-df489b1b-0e23-48a6-a7d3-91452eae7aaa, client-e2e-df489b1b-0e23-48a6-a7d3-91452eae7aaa", + "traceId": "3e4d0a5da078430e8f3cc0621408460f", + "evidence": { + "backendPermissions": [ + "merchant:order:view", + "merchant:order:list" + ], + "visibleClientMenus": [ + "account:profile:view", + "dashboard:view", + "order:first-leg:list" + ] + } + }, + { + "module": "menu-permissions", + "name": "remove order view permission from assigned role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:13.955Z", + "durationMs": 130, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-054fd6e8-4bb4-4198-91b7-b7c1a15a27ad, client-e2e-054fd6e8-4bb4-4198-91b7-b7c1a15a27ad", + "traceId": "7579763c4356446dad6a5c497600ca20", + "evidence": { + "roleId": "2085929283440201730", + "permissionCodes": [ + "merchant:order:list" + ] + } + }, + { + "module": "menu-permissions", + "name": "permission removal revokes stale member token", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:14.085Z", + "durationMs": 29, + "http": 401, + "code": "A0401", + "message": "登录会话已过期、已退出或 Redis 不可用", + "requestId": "client-e2e-2fd59441-622f-44e1-a233-b1e340b3b850", + "traceId": null, + "evidence": { + "rejectionCode": "A0401", + "message": "登录会话已过期、已退出或 Redis 不可用" + } + }, + { + "module": "menu-permissions", + "name": "member re-login after permission removal", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:14.114Z", + "durationMs": 345, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-3d3e709e-22c9-4687-890e-382bc119f67e, client-e2e-3d3e709e-22c9-4687-890e-382bc119f67e", + "traceId": "5666cd80b5c7426fb3be51fe3c81ce88", + "evidence": { + "username": "member_20260808032111_71de6" + } + }, + { + "module": "menu-permissions", + "name": "permission removal is reflected after re-login", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:14.460Z", + "durationMs": 42, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-5a6f85f7-8ac4-42d1-9ea8-392f40677e15, client-e2e-5a6f85f7-8ac4-42d1-9ea8-392f40677e15", + "traceId": "635f9da211584692a41d83b150e9cfd9", + "evidence": { + "backendPermissions": [ + "merchant:order:list" + ] + } + }, + { + "module": "menu-permissions", + "name": "member without view permission cannot read order detail", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:14.502Z", + "durationMs": 34, + "http": 200, + "code": "A0403", + "message": "Access denied", + "requestId": "client-e2e-2e8f9ae0-07f2-41a3-a1c4-ad833784ba8a, client-e2e-2e8f9ae0-07f2-41a3-a1c4-ad833784ba8a", + "traceId": "e7709afdf9da410e8d16e41ec3dc7fc2", + "evidence": { + "rejectionCode": "A0403" + } + }, + { + "module": "menu-permissions", + "name": "restore assigned role permissions", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:14.536Z", + "durationMs": 110, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-bc66d943-0d94-469c-9333-5111f28cfd00, client-e2e-bc66d943-0d94-469c-9333-5111f28cfd00", + "traceId": "54bad3bc91644bb18126f0713998ef60", + "evidence": { + "roleId": "2085929283440201730", + "permissionCodes": [ + "merchant:order:list", + "merchant:order:view" + ] + } + }, + { + "module": "menu-permissions", + "name": "member re-login after permission restoration", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:14.646Z", + "durationMs": 344, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-7ecb8069-8431-4597-b6ea-a9f0075d26fc, client-e2e-7ecb8069-8431-4597-b6ea-a9f0075d26fc", + "traceId": "693204b8181d4f00ab91bf615078811b", + "evidence": { + "username": "member_20260808032111_71de6" + } + }, + { + "module": "menu-permissions", + "name": "restored permission allows order detail again", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:14.990Z", + "durationMs": 38, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-2f9fabdd-8467-4641-b59c-0cc8b31bb77a, client-e2e-2f9fabdd-8467-4641-b59c-0cc8b31bb77a", + "traceId": "9b89fd6552c34b5cbe3918f98506291e", + "evidence": { + "orderId": "2085929273286787073" + } + }, + { + "module": "rbac-member", + "name": "edit enterprise member", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:15.028Z", + "durationMs": 36, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-0b5bd4fd-a9a1-48f7-bf1b-af525b379374, client-e2e-0b5bd4fd-a9a1-48f7-bf1b-af525b379374", + "traceId": "7778f2d62c6d4cafb86506624dea2a56", + "evidence": { + "membershipId": "2085929284870459395", + "displayName": "已编辑订单成员-20260808032107-59bca758", + "status": "ACTIVE" + } + }, + { + "module": "rbac-member", + "name": "reset enterprise member password", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:15.064Z", + "durationMs": 404, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-9a0ef229-77f2-4875-9dc8-79ee70bb54b5, client-e2e-9a0ef229-77f2-4875-9dc8-79ee70bb54b5", + "traceId": "e04acc4a99be49b2b30c6c4df2575890", + "evidence": { + "membershipId": "2085929284870459395" + } + }, + { + "module": "rbac-member", + "name": "member old password is rejected after reset", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:15.468Z", + "durationMs": 336, + "http": 200, + "code": "A0401", + "message": "用户名或密码错误", + "requestId": "client-e2e-23b5b737-3565-4c6a-a7fe-4f576498439b, client-e2e-23b5b737-3565-4c6a-a7fe-4f576498439b", + "traceId": "558536c91ac447d7bbd78bcc7f3d4341", + "evidence": { + "username": "member_20260808032111_71de6", + "rejectionCode": "A0401" + } + }, + { + "module": "rbac-member", + "name": "member can login with reset password", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:15.806Z", + "durationMs": 334, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-df7504a0-4967-48fc-93eb-a9b49de21889, client-e2e-df7504a0-4967-48fc-93eb-a9b49de21889", + "traceId": "24d7fa96ef594e08bb454cfd65be36fc", + "evidence": { + "username": "member_20260808032111_71de6" + } + }, + { + "module": "rbac-member", + "name": "disable enterprise member", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:16.140Z", + "durationMs": 91, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-1d20eb6a-8c7e-4568-970c-82b3c45f387a, client-e2e-1d20eb6a-8c7e-4568-970c-82b3c45f387a", + "traceId": "5be563158da04721a1e3eed76c874bef", + "evidence": { + "membershipId": "2085929284870459395", + "status": "DISABLED" + } + }, + { + "module": "rbac-member", + "name": "disabled member stale token is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:16.232Z", + "durationMs": 24, + "http": 401, + "code": "A0401", + "message": "登录会话已过期、已退出或 Redis 不可用", + "requestId": "client-e2e-98ab1ec9-339b-4a97-8593-8bd3bac6b1da", + "traceId": null, + "evidence": { + "membershipId": "2085929284870459395", + "rejectionCode": "A0401" + } + }, + { + "module": "rbac-member", + "name": "disabled member login is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:16.256Z", + "durationMs": 38, + "http": 200, + "code": "A0403", + "message": "账号已禁用", + "requestId": "client-e2e-ad07af82-3c5f-4892-be6e-be1e59255050, client-e2e-ad07af82-3c5f-4892-be6e-be1e59255050", + "traceId": "bfbe34151b9842d9bc0e61f03de3b20d", + "evidence": { + "username": "member_20260808032111_71de6", + "rejectionCode": "A0403" + } + }, + { + "module": "rbac-member", + "name": "enable enterprise member", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:16.294Z", + "durationMs": 106, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-14d10f82-258c-4440-911e-3916d6ba7ded, client-e2e-14d10f82-258c-4440-911e-3916d6ba7ded", + "traceId": "ff041ba3e7e54b79853016a9460586d1", + "evidence": { + "membershipId": "2085929284870459395", + "status": "ACTIVE" + } + }, + { + "module": "rbac-member", + "name": "member re-login after account is enabled", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:16.401Z", + "durationMs": 333, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-57412d0f-37f5-4936-a634-74b488fb34bc, client-e2e-57412d0f-37f5-4936-a634-74b488fb34bc", + "traceId": "5cd5c6b024e44364a230e10772ec6fd7", + "evidence": { + "username": "member_20260808032111_71de6" + } + }, + { + "module": "rbac-member", + "name": "re-enabled member can list orders before roles are cleared", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:16.735Z", + "durationMs": 45, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-d5c10872-205b-43b8-b10d-bab8c0a25bca, client-e2e-d5c10872-205b-43b8-b10d-bab8c0a25bca", + "traceId": "c6814e5172df4a18992bf1f31a02e407", + "evidence": { + "total": "1" + } + }, + { + "module": "rbac-member", + "name": "clear enterprise member roles", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:16.781Z", + "durationMs": 99, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-c568360b-54a2-46b7-b19c-59599b184cf5, client-e2e-c568360b-54a2-46b7-b19c-59599b184cf5", + "traceId": "4cecf1912633405a8a0ac95dea19269d", + "evidence": { + "membershipId": "2085929284870459395", + "roleIds": [] + } + }, + { + "module": "rbac-member", + "name": "member role clearing is persisted", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:16.880Z", + "durationMs": 24, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-8f144348-c0d0-4c89-8e2c-c0079676780c, client-e2e-8f144348-c0d0-4c89-8e2c-c0079676780c", + "traceId": "d13055e66b204ef4b50a5476ecc15caf", + "evidence": { + "membershipId": "2085929284870459395", + "roleIds": [] + } + }, + { + "module": "rbac-member", + "name": "role clearing revokes stale member token", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:16.904Z", + "durationMs": 22, + "http": 401, + "code": "A0401", + "message": "登录会话已过期、已退出或 Redis 不可用", + "requestId": "client-e2e-51546bd3-6f10-4d86-a843-a936f5300d7c", + "traceId": null, + "evidence": { + "rejectionCode": "A0401" + } + }, + { + "module": "rbac-member", + "name": "member re-login after role clearing", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:16.927Z", + "durationMs": 349, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-10a6e369-6bf7-474f-9cee-f98b68367622, client-e2e-10a6e369-6bf7-474f-9cee-f98b68367622", + "traceId": "36cca4527ad84f7b8c4fc18c952e01ba", + "evidence": { + "username": "member_20260808032111_71de6" + } + }, + { + "module": "rbac-member", + "name": "member without roles cannot list orders", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:17.279Z", + "durationMs": 26, + "http": 200, + "code": "A0403", + "message": "Access denied", + "requestId": "client-e2e-b53320dd-5427-41fd-94bf-cdc68a87d0a9, client-e2e-b53320dd-5427-41fd-94bf-cdc68a87d0a9", + "traceId": "ea458f264da34b34802208d068ae0523", + "evidence": { + "rejectionCode": "A0403" + } + }, + { + "module": "rbac-member", + "name": "disable test member after verification", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:17.305Z", + "durationMs": 105, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-8562c78c-fec9-4926-ab95-b135f2013aa3, client-e2e-8562c78c-fec9-4926-ab95-b135f2013aa3", + "traceId": "1f11753f18f84cbda302f9661cf0d323", + "evidence": { + "membershipId": "2085929284870459395", + "status": "DISABLED" + } + }, + { + "module": "rbac-member", + "name": "delete unassigned custom role", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:17.410Z", + "durationMs": 43, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-9aaa5e88-57b7-424c-9c60-2c63d105dbfe, client-e2e-9aaa5e88-57b7-424c-9c60-2c63d105dbfe", + "traceId": "9a7537a7b5544dc9aefcd019c9fdde67", + "evidence": { + "roleId": "2085929283440201730" + } + }, + { + "module": "order-master-data", + "name": "load active domestic receiving warehouses", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:17.454Z", + "durationMs": 43, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-676f270e-2b54-46db-a333-7f6a3a8d573e, client-e2e-676f270e-2b54-46db-a333-7f6a3a8d573e", + "traceId": "0af5aaf6031c4a59add12f873b1a10b4", + "evidence": { + "total": "2", + "warehouseCount": 2 + } + }, + { + "module": "order-master-data", + "name": "load active FBA destination warehouses", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:17.498Z", + "durationMs": 56, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-e4ebae20-0730-45fe-a0c6-187c5b817f7c, client-e2e-e4ebae20-0730-45fe-a0c6-187c5b817f7c", + "traceId": "db70e52c4683485f97fe2dd7b715d412", + "evidence": { + "total": "253", + "warehouseCount": 200 + } + }, + { + "module": "order-master-data", + "name": "load receiving warehouse detail", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:17.555Z", + "durationMs": 35, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-967fe064-59c3-407e-b45e-e59b4020a4f3, client-e2e-967fe064-59c3-407e-b45e-e59b4020a4f3", + "traceId": "a0eaafbdc9964ab488aa4bd7df96d5cb", + "evidence": { + "id": "193000000000200001", + "name": "义乌仓" + } + }, + { + "module": "order-master-data", + "name": "load active pricing channels", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:17.590Z", + "durationMs": 35, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-610a6478-2b2e-4f0a-bafd-fd2c3764bc07, client-e2e-610a6478-2b2e-4f0a-bafd-fd2c3764bc07", + "traceId": "613b959258e4433389d132b19c17fc91", + "evidence": { + "channels": [ + { + "channelCode": "EXX_RAIL_NY", + "priceModel": "FBA_WAREHOUSE_RATE", + "pricingTaxModes": [ + "TAX_INCLUDED", + "TAX_EXCLUDED" + ] + }, + { + "channelCode": "EXX_TRUCK", + "priceModel": "FBA_WAREHOUSE_RATE", + "pricingTaxModes": [ + "TAX_INCLUDED", + "TAX_EXCLUDED" + ] + }, + { + "channelCode": "HEDE_PARCEL", + "priceModel": "REGION_WEIGHT_TIER", + "pricingTaxModes": [ + "TAX_INCLUDED" + ] + }, + { + "channelCode": "HEDE_TRUCK", + "priceModel": "FBA_WAREHOUSE_RATE", + "pricingTaxModes": [ + "TAX_INCLUDED", + "TAX_EXCLUDED" + ] + }, + { + "channelCode": "MATSON_CLX_PARCEL", + "priceModel": "REGION_WEIGHT_TIER", + "pricingTaxModes": [ + "TAX_INCLUDED" + ] + }, + { + "channelCode": "MATSON_CLX_TRUCK", + "priceModel": "FBA_WAREHOUSE_RATE", + "pricingTaxModes": [ + "TAX_INCLUDED", + "TAX_EXCLUDED" + ] + }, + { + "channelCode": "MATSON_MAX_PARCEL", + "priceModel": "REGION_WEIGHT_TIER", + "pricingTaxModes": [ + "TAX_INCLUDED" + ] + }, + { + "channelCode": "MATSON_MAX_TRUCK", + "priceModel": "FBA_WAREHOUSE_RATE", + "pricingTaxModes": [ + "TAX_INCLUDED", + "TAX_EXCLUDED" + ] + }, + { + "channelCode": "OA_CHICAGO_RAIL", + "priceModel": "FBA_WAREHOUSE_RATE", + "pricingTaxModes": [ + "TAX_INCLUDED", + "TAX_EXCLUDED" + ] + }, + { + "channelCode": "OA_HOUSTON_TRUCK", + "priceModel": "FBA_WAREHOUSE_RATE", + "pricingTaxModes": [ + "TAX_INCLUDED", + "TAX_EXCLUDED" + ] + }, + { + "channelCode": "OA_LA_FULL_TRUCK", + "priceModel": "FBA_WAREHOUSE_RATE", + "pricingTaxModes": [ + "TAX_INCLUDED", + "TAX_EXCLUDED" + ] + }, + { + "channelCode": "OA_LA_TRUCK", + "priceModel": "FBA_WAREHOUSE_RATE", + "pricingTaxModes": [ + "TAX_INCLUDED", + "TAX_EXCLUDED" + ] + }, + { + "channelCode": "OA_NEW_YORK_TRUCK", + "priceModel": "FBA_WAREHOUSE_RATE", + "pricingTaxModes": [ + "TAX_INCLUDED", + "TAX_EXCLUDED" + ] + }, + { + "channelCode": "OA_PARCEL", + "priceModel": "REGION_WEIGHT_TIER", + "pricingTaxModes": [ + "TAX_INCLUDED" + ] + }, + { + "channelCode": "OA_SAVANNAH_TRUCK", + "priceModel": "FBA_WAREHOUSE_RATE", + "pricingTaxModes": [ + "TAX_INCLUDED", + "TAX_EXCLUDED" + ] + } + ] + } + }, + { + "module": "order-master-data", + "name": "load public shipper candidates", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:17.626Z", + "durationMs": 39, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-da38e81a-dcfb-4ab5-8919-3fda87eeafe5, client-e2e-da38e81a-dcfb-4ab5-8919-3fda87eeafe5", + "traceId": "6d519e9c97704480a269a4771034e867", + "evidence": { + "candidateCount": 3 + } + }, + { + "module": "pricing-estimate", + "name": "probe configured price 1", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:17.666Z", + "durationMs": 33, + "http": 200, + "code": "A0404", + "message": "当前条件没有匹配价格", + "requestId": "client-e2e-467a59d0-6b01-458a-9b12-dd829e63a8dd, client-e2e-467a59d0-6b01-458a-9b12-dd829e63a8dd", + "traceId": "381716422426461cb0ab0710cfbd3bac", + "evidence": { + "matched": false, + "destinationWarehouseId": "193000000000000001", + "destinationCode": "ABE2", + "channelCode": "EXX_RAIL_NY", + "code": "A0404", + "message": "当前条件没有匹配价格" + } + }, + { + "module": "pricing-estimate", + "name": "probe configured price 2", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:17.700Z", + "durationMs": 26, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-d4329683-72b6-4ebf-8708-4f35fb89651b, client-e2e-d4329683-72b6-4ebf-8708-4f35fb89651b", + "traceId": "960a821599bf4787970dcfe7713843ac", + "evidence": { + "matched": true, + "destinationWarehouseId": "193000000000000002", + "destinationCode": "ABE3", + "priceBookVersionId": "2085910455296503809", + "channelCode": "EXX_RAIL_NY", + "priceModel": "FBA_WAREHOUSE_RATE", + "pricingTaxMode": "TAX_INCLUDED", + "chargeableQuantity": 20.5, + "chargeUnit": "KG", + "unitPrice": 11.7, + "estimatedAmount": 239.85, + "currency": "CNY" + } + }, + { + "module": "order-product-image", + "name": "upload product image", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:17.727Z", + "durationMs": 35, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-365b6c18-e096-4a1b-9e4e-a7f229457384, client-e2e-365b6c18-e096-4a1b-9e4e-a7f229457384", + "traceId": "e258d34e5c5e49f5b0363f6bdbbc9723", + "evidence": { + "fileId": "2085929310632869889", + "fileName": "product-20260808032107-59bca758.png", + "contentType": "image/png", + "sizeBytes": "68" + } + }, + { + "module": "order-product-image", + "name": "invalid product image MIME type is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:17.763Z", + "durationMs": 24, + "http": 200, + "code": "A0400", + "message": "产品图片仅支持JPG、PNG", + "requestId": "client-e2e-a48b9828-1e96-4258-bb9e-6c7bd47a7540, client-e2e-a48b9828-1e96-4258-bb9e-6c7bd47a7540", + "traceId": "04cc8522971b4bb7b72c0aa4492e594d", + "evidence": { + "rejectionCode": "A0400", + "message": "产品图片仅支持JPG、PNG" + } + }, + { + "module": "order-product-image", + "name": "empty product image is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:17.787Z", + "durationMs": 30, + "http": 200, + "code": "A0400", + "message": "产品图片不能为空", + "requestId": "client-e2e-febf717a-1540-46a4-9582-b8ea72d8181f, client-e2e-febf717a-1540-46a4-9582-b8ea72d8181f", + "traceId": "d6bd64910d01430bbd7985d676133996", + "evidence": { + "rejectionCode": "A0400", + "message": "产品图片不能为空" + } + }, + { + "module": "order-product-image", + "name": "forged product image signature is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:17.817Z", + "durationMs": 24, + "http": 200, + "code": "A0400", + "message": "上传内容不是有效图片", + "requestId": "client-e2e-ef1a6aec-a301-44fe-ba18-8fc1865e4a46, client-e2e-ef1a6aec-a301-44fe-ba18-8fc1865e4a46", + "traceId": "dcb6c0d3270d44a78219b363f2f04c81", + "evidence": { + "rejectionCode": "A0400", + "message": "上传内容不是有效图片" + } + }, + { + "module": "order-product-image", + "name": "product image over 5MB is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:17.844Z", + "durationMs": 207, + "http": 200, + "code": "A0400", + "message": "产品图片不能超过5MB", + "requestId": "client-e2e-d3061eec-679b-4ec0-84ae-b3493f7c48de, client-e2e-d3061eec-679b-4ec0-84ae-b3493f7c48de", + "traceId": "f7c4c5946d194b6d8dfa5673258f7a36", + "evidence": { + "rejectionCode": "A0400", + "message": "产品图片不能超过5MB" + } + }, + { + "module": "order-lifecycle", + "name": "download own product image", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:18.052Z", + "durationMs": 30, + "http": 200, + "code": null, + "message": null, + "requestId": "client-e2e-d4e6c59e-8572-49d5-a6c2-8196f91714c1, client-e2e-d4e6c59e-8572-49d5-a6c2-8196f91714c1", + "traceId": "735631fe56c244158f71e34a2d0bf627", + "evidence": { + "sizeBytes": 68, + "contentType": "image/png" + } + }, + { + "module": "order-validation", + "name": "FBA order missing Amazon identifiers is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:18.083Z", + "durationMs": 35, + "http": 200, + "code": "A0422", + "message": "FBA orders require Amazon warehouse code, Shipment ID and Reference ID", + "requestId": "client-e2e-76af913e-18bc-4877-8cbf-283ddb7fb9db, client-e2e-76af913e-18bc-4877-8cbf-283ddb7fb9db", + "traceId": "34a49a37166844e095ae87d4979b1e91", + "evidence": { + "rejectionCode": "A0422", + "message": "FBA orders require Amazon warehouse code, Shipment ID and Reference ID" + } + }, + { + "module": "order-validation", + "name": "FBA cargo missing SKU UPC shipment and reference is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:18.119Z", + "durationMs": 44, + "http": 200, + "code": "A0422", + "message": "FBA cargo requires SKU NO., UPC NO., Shipment ID and Reference ID.", + "requestId": "client-e2e-a6f9eb69-9a80-4182-990b-ffaaca18b414, client-e2e-a6f9eb69-9a80-4182-990b-ffaaca18b414", + "traceId": "3f7304f4c5df4fa9bb53e270eb2fa805", + "evidence": { + "rejectionCode": "A0422", + "message": "FBA cargo requires SKU NO., UPC NO., Shipment ID and Reference ID." + } + }, + { + "module": "order-validation", + "name": "PICKUP order without sender is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:18.164Z", + "durationMs": 31, + "http": 200, + "code": "A0422", + "message": "上门提货时必须填写发货信息", + "requestId": "client-e2e-4ab98690-5bed-42f3-a1c8-2cd3366a5776, client-e2e-4ab98690-5bed-42f3-a1c8-2cd3366a5776", + "traceId": "1cf2f76c779545d3a6a647ec95b79661", + "evidence": { + "rejectionCode": "A0422", + "message": "上门提货时必须填写发货信息" + } + }, + { + "module": "order-validation", + "name": "PRIVATE destination without receiver is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:18.196Z", + "durationMs": 28, + "http": 200, + "code": "A0422", + "message": "私人地址必须填写收货信息", + "requestId": "client-e2e-1c938009-2b5c-4c93-816c-10af195afe41, client-e2e-1c938009-2b5c-4c93-816c-10af195afe41", + "traceId": "0aa7e9242968414a9df11c37fb302cf5", + "evidence": { + "rejectionCode": "A0422", + "message": "私人地址必须填写收货信息" + } + }, + { + "module": "order-validation", + "name": "invalid product image file ID is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:18.225Z", + "durationMs": 31, + "http": 200, + "code": "A0422", + "message": "产品图片文件ID无效", + "requestId": "client-e2e-759d9a04-88b0-4dd4-9822-45b070c8aba1, client-e2e-759d9a04-88b0-4dd4-9822-45b070c8aba1", + "traceId": "bffb4d42eb844333831e859b6a8733d4", + "evidence": { + "rejectionCode": "A0422", + "message": "产品图片文件ID无效" + } + }, + { + "module": "order-validation", + "name": "zero package count weight and volume are rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:18.257Z", + "durationMs": 28, + "http": 200, + "code": "A0422", + "message": "cargoes[0].packageCount: must be greater than or equal to 1;cargoes[0].volumeCbm: must be greater than or equal to 0.0001;cargoes[0].grossWeightKg: must be greater than or equal to 0.001", + "requestId": "client-e2e-06b0d527-0f95-4cd3-9326-05f31c95adfe, client-e2e-06b0d527-0f95-4cd3-9326-05f31c95adfe", + "traceId": "172185845ce140cb8ed4347a5eb6699f", + "evidence": { + "rejectionCode": "A0422", + "message": "cargoes[0].packageCount: must be greater than or equal to 1;cargoes[0].volumeCbm: must be greater than or equal to 0.0001;cargoes[0].grossWeightKg: must be greater than or equal to 0.001" + } + }, + { + "module": "order-validation", + "name": "customer remark over 1000 characters is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:18.286Z", + "durationMs": 21, + "http": 200, + "code": "A0422", + "message": "customerRemark: size must be between 0 and 1000", + "requestId": "client-e2e-8117c4ae-e966-45b0-89cf-2a1649a6e811, client-e2e-8117c4ae-e966-45b0-89cf-2a1649a6e811", + "traceId": "16bcad00beb2426292ae41f261127c70", + "evidence": { + "rejectionCode": "A0422", + "message": "customerRemark: size must be between 0 and 1000" + } + }, + { + "module": "order-validation", + "name": "missing Idempotency-Key is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:18.308Z", + "durationMs": 37, + "http": 200, + "code": "A0400", + "message": "Bad request", + "requestId": "client-e2e-457de03f-e168-495e-bb8c-261aeb0796cc, client-e2e-457de03f-e168-495e-bb8c-261aeb0796cc", + "traceId": "72707579af75406ab2ccf9bd68f5adab", + "evidence": { + "rejectionCode": "A0400", + "message": "Bad request" + } + }, + { + "module": "order-validation", + "name": "Idempotency-Key over 128 characters is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:18.346Z", + "durationMs": 30, + "http": 200, + "code": "A0422", + "message": "Idempotency-Key length must not exceed 128", + "requestId": "client-e2e-0bdda743-839d-423f-8d74-27ccfd5421e1, client-e2e-0bdda743-839d-423f-8d74-27ccfd5421e1", + "traceId": "c5583d6a667b4b5e988b89c298aa86f7", + "evidence": { + "rejectionCode": "A0422", + "message": "Idempotency-Key length must not exceed 128" + } + }, + { + "module": "order-lifecycle", + "name": "create valid draft after approval", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:18.377Z", + "durationMs": 75, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-1008c04b-f3f4-4549-a4ec-913e9813e3a5, client-e2e-1008c04b-f3f4-4549-a4ec-913e9813e3a5", + "traceId": "b0e1f3b955394b1ebcd411229bbe7ce9", + "evidence": { + "orderId": "2085929313522745345" + } + }, + { + "module": "order-lifecycle", + "name": "create order idempotent replay", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:18.453Z", + "durationMs": 41, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-bfb7f11d-2abb-440f-bb53-3b83cb8ce80e, client-e2e-bfb7f11d-2abb-440f-bb53-3b83cb8ce80e", + "traceId": "92e2e68517f242888d35b7c983749df7", + "evidence": { + "orderId": "2085929313522745345", + "replayed": true + } + }, + { + "module": "order-boundary", + "name": "same idempotency key with different payload is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:18.495Z", + "durationMs": 43, + "http": 200, + "code": "A0409", + "message": "Idempotency-Key conflicts with a different request", + "requestId": "client-e2e-1ce3dd0b-edc6-4f24-a3a3-1c5751f84735, client-e2e-1ce3dd0b-edc6-4f24-a3a3-1c5751f84735", + "traceId": "9b5d423733294bb3ab04306dd7c6da7a", + "evidence": { + "orderId": "2085929313522745345", + "rejectionCode": "A0409" + } + }, + { + "module": "order-lifecycle", + "name": "edit draft", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:18.538Z", + "durationMs": 73, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-3809d510-ef0b-4549-8f61-060d27c90896, client-e2e-3809d510-ef0b-4549-8f61-060d27c90896", + "traceId": "3f4e56e2dd2541e4a91c943bc1e48b88", + "evidence": { + "orderId": "2085929313522745345", + "customerRemark": "edited-20260808032107-59bca758" + } + }, + { + "module": "order-lifecycle", + "name": "order detail preserves complete product fields", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:18.612Z", + "durationMs": 30, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-d2c253d6-2a14-4527-b6f9-3f8e96f5598a, client-e2e-d2c253d6-2a14-4527-b6f9-3f8e96f5598a", + "traceId": "d9ec42817be34579806c277657d65d5d", + "evidence": { + "orderId": "2085929313522745345", + "orderNo": "FL2085929313522745345", + "status": "DRAFT", + "cargo": { + "id": "2085929314185445377", + "skuNo": "SKU-ACTIVE-20260808032107-59bca758", + "cargoName": "蓝牙音箱", + "cargoNameEn": "Bluetooth Speaker", + "packageCount": 2, + "totalQuantity": 24, + "grossWeightKg": 20.5, + "volumeCbm": 0.024, + "shipmentId": "SHIP-ACTIVE-20260808032107-59bca758", + "referenceId": "REF-ACTIVE-20260808032107-59bca758", + "productImageFileId": "2085929310632869889" + } + } + }, + { + "module": "order-lifecycle", + "name": "order list contains edited draft", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:18.642Z", + "durationMs": 41, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-caba328e-ce00-45cb-80eb-a5a06588aa8a, client-e2e-caba328e-ce00-45cb-80eb-a5a06588aa8a", + "traceId": "a8015685ae0f4480ae21e61abd562716", + "evidence": { + "total": "1", + "orderId": "2085929313522745345", + "orderNo": "FL2085929313522745345", + "status": "DRAFT" + } + }, + { + "module": "order-filters", + "name": "order keyword filter finds draft by order number", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:18.684Z", + "durationMs": 51, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-300ee38c-5d40-475a-a353-53d9dbda87fe, client-e2e-300ee38c-5d40-475a-a353-53d9dbda87fe", + "traceId": "be7c89fae8034c82a6ac04b872b91cd3", + "evidence": { + "total": "1", + "orderId": "2085929313522745345" + } + }, + { + "module": "order-filters", + "name": "DRAFT status filter contains draft", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:18.736Z", + "durationMs": 51, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-461cbdd4-e071-48a7-aaa7-c87452a23ec5, client-e2e-461cbdd4-e071-48a7-aaa7-c87452a23ec5", + "traceId": "2b669738284b4f0eb570642cd1cf4b6b", + "evidence": { + "total": "2", + "orderId": "2085929313522745345", + "status": "DRAFT" + } + }, + { + "module": "order-lifecycle", + "name": "submit order", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:18.787Z", + "durationMs": 91, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-afa09ba8-c314-4794-8e94-93bf77a96beb, client-e2e-afa09ba8-c314-4794-8e94-93bf77a96beb", + "traceId": "1f015da0cf774b93918fc8deba7d56df", + "evidence": { + "orderId": "2085929313522745345" + } + }, + { + "module": "order-lifecycle", + "name": "submit order idempotent replay", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:18.878Z", + "durationMs": 30, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-d67239f4-7144-4e6b-8036-1768a3b87751, client-e2e-d67239f4-7144-4e6b-8036-1768a3b87751", + "traceId": "6576afb444ec4ca185d8d387f6b8e175", + "evidence": { + "orderId": "2085929313522745345", + "replayed": true + } + }, + { + "module": "order-lifecycle", + "name": "submitted status is persisted", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:18.908Z", + "durationMs": 30, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-c706855f-9263-437e-b680-abfbeab07eb1, client-e2e-c706855f-9263-437e-b680-abfbeab07eb1", + "traceId": "ce3eb024a1924b35bce173d37c52e23c", + "evidence": { + "orderId": "2085929313522745345", + "orderNo": "FL2085929313522745345", + "status": "SUBMITTED" + } + }, + { + "module": "order-filters", + "name": "SUBMITTED status filter contains submitted order", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:18.939Z", + "durationMs": 39, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-77794833-7194-4840-964b-de351150bc50, client-e2e-77794833-7194-4840-964b-de351150bc50", + "traceId": "de9a9a06ee9240c99c30fac72af171cd", + "evidence": { + "total": "1", + "orderId": "2085929313522745345", + "status": "SUBMITTED" + } + }, + { + "module": "order-filters", + "name": "warehouse channel and destination filters contain submitted order", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:18.978Z", + "durationMs": 51, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-d9509326-478a-410e-9bab-74854063a5f7, client-e2e-d9509326-478a-410e-9bab-74854063a5f7", + "traceId": "51395567fa364ff6a2103c39d80abc1a", + "evidence": { + "total": "2", + "orderId": "2085929313522745345" + } + }, + { + "module": "order-filters", + "name": "sender phone filter contains submitted order", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:19.030Z", + "durationMs": 47, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-f875fa20-c8f5-4dc2-ae1a-e6a0d05a14ce, client-e2e-f875fa20-c8f5-4dc2-ae1a-e6a0d05a14ce", + "traceId": "c63711824d914d8dbb0f7dc0c9dcd651", + "evidence": { + "total": "2", + "orderId": "2085929313522745345" + } + }, + { + "module": "order-filters", + "name": "unmatched keyword returns an empty order page", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:19.078Z", + "durationMs": 32, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-7a4269cc-61c5-433c-a1c8-a188b0c58d8d, client-e2e-7a4269cc-61c5-433c-a1c8-a188b0c58d8d", + "traceId": "29abfed574024a4bbb3ee501486b955a", + "evidence": { + "total": "0" + } + }, + { + "module": "order-validation", + "name": "invalid order status filter is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:19.110Z", + "durationMs": 24, + "http": 200, + "code": "A0422", + "message": "status: Failed to convert value of type 'java.lang.String' to required type 'com.baiyue.order.entity.OrderStatus'; Failed to convert from type [java.lang.String] to type [com.baiyue.order.entity.OrderStatus] for value [UNKNOWN]", + "requestId": "client-e2e-a3757add-ff0b-434c-bbfe-8e93d754b697, client-e2e-a3757add-ff0b-434c-bbfe-8e93d754b697", + "traceId": "fc67f1343fc64384b3fc03a4908cf8f5", + "evidence": { + "rejectionCode": "A0422", + "message": "status: Failed to convert value of type 'java.lang.String' to required type 'com.baiyue.order.entity.OrderStatus'; Failed to convert from type [java.lang.String] to type [com.baiyue.order.entity.OrderStatus] for value [UNKNOWN]" + } + }, + { + "module": "order-boundary", + "name": "unknown order detail is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:19.135Z", + "durationMs": 34, + "http": 200, + "code": "A0404", + "message": "Order not found", + "requestId": "client-e2e-289e1a8e-4ec7-4c53-a7b4-8392e2193171, client-e2e-289e1a8e-4ec7-4c53-a7b4-8392e2193171", + "traceId": "656b51b87e094461aab4c1409bf07c10", + "evidence": { + "orderId": 1, + "rejectionCode": "A0404" + } + }, + { + "module": "order-boundary", + "name": "submitted order cannot be edited by client", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:19.170Z", + "durationMs": 57, + "http": 200, + "code": "A0409", + "message": "当前订单状态不允许编辑订单资料", + "requestId": "client-e2e-554d9976-9fda-4d2a-add5-f2453f6b3ec8, client-e2e-554d9976-9fda-4d2a-add5-f2453f6b3ec8", + "traceId": "de4f5757bc1447778604610dedfe17ac", + "evidence": { + "orderId": "2085929313522745345", + "rejectionCode": "A0409", + "message": "当前订单状态不允许编辑订单资料" + } + }, + { + "module": "unified-orders", + "name": "unified order list contains submitted order", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:19.228Z", + "durationMs": 45, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-be52e0c9-73f6-4443-99f6-c0cb5f236666, client-e2e-be52e0c9-73f6-4443-99f6-c0cb5f236666", + "traceId": "665a7cb3fe1a42e7bc3a9570a4ed7289", + "evidence": { + "total": "1", + "orderId": "2085929313522745345", + "mainStatus": "PENDING_REVIEW", + "internalOrderStatus": "SUBMITTED" + } + }, + { + "module": "unified-orders", + "name": "unified order detail returns timeline", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:19.274Z", + "durationMs": 37, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-e5964a83-5fe0-47a7-91ca-ce4d824ddcfd, client-e2e-e5964a83-5fe0-47a7-91ca-ce4d824ddcfd", + "traceId": "93053007c3594302bbc9fc08e61d7a8e", + "evidence": { + "orderId": "2085929313522745345", + "mainStatus": "PENDING_REVIEW", + "timelineCount": 3 + } + }, + { + "module": "order-lifecycle", + "name": "create second draft for cancellation", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:19.312Z", + "durationMs": 76, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-6c07252c-533f-4eba-a1f7-ab0c90a43f91, client-e2e-6c07252c-533f-4eba-a1f7-ab0c90a43f91", + "traceId": "92788ff8d2394cf7a50b5210053ce731", + "evidence": { + "orderId": "2085929317431836673" + } + }, + { + "module": "order-lifecycle", + "name": "cancel second draft", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:19.388Z", + "durationMs": 36, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-79efc661-9bf3-4e8d-b05d-7daacc2a6d47, client-e2e-79efc661-9bf3-4e8d-b05d-7daacc2a6d47", + "traceId": "4b8b477fe89a409595fd5b8bc3b037d7", + "evidence": { + "orderId": "2085929317431836673" + } + }, + { + "module": "order-lifecycle", + "name": "cancelled status is persisted", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:19.425Z", + "durationMs": 42, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-ea61ecc1-a744-47cf-8bff-c3260d0a9f24, client-e2e-ea61ecc1-a744-47cf-8bff-c3260d0a9f24", + "traceId": "4a2c689682824f9c8e710e6175ab4137", + "evidence": { + "orderId": "2085929317431836673", + "status": "CANCELLED" + } + }, + { + "module": "order-boundary", + "name": "cancelled order cannot be cancelled again", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:19.467Z", + "durationMs": 28, + "http": 200, + "code": "A0409", + "message": "该操作已完成,请勿重复提交", + "requestId": "client-e2e-f8256a70-b69f-4cd1-b760-ffa9d6c0c308, client-e2e-f8256a70-b69f-4cd1-b760-ffa9d6c0c308", + "traceId": "3f9a06b915534a6ca91e9224958cd160", + "evidence": { + "orderId": "2085929317431836673", + "rejectionCode": "A0409", + "message": "该操作已完成,请勿重复提交" + } + }, + { + "module": "order-boundary", + "name": "cancelled order cannot be submitted", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:19.495Z", + "durationMs": 40, + "http": 200, + "code": "A0409", + "message": "订单状态不允许当前操作: CANCELLED -> SUBMITTED", + "requestId": "client-e2e-93842327-e822-4e1c-92e0-e92cb8ed657a, client-e2e-93842327-e822-4e1c-92e0-e92cb8ed657a", + "traceId": "3272dbbbe2794407bb63539463492927", + "evidence": { + "orderId": "2085929317431836673", + "rejectionCode": "A0409", + "message": "订单状态不允许当前操作: CANCELLED -> SUBMITTED" + } + }, + { + "module": "order-boundary", + "name": "invalid order page size is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:19.536Z", + "durationMs": 35, + "http": 200, + "code": "A0422", + "message": "size: must be less than or equal to 200", + "requestId": "client-e2e-3afbb9e4-250b-4d6c-9e27-695aa662af9c, client-e2e-3afbb9e4-250b-4d6c-9e27-695aa662af9c", + "traceId": "428a8de3b19e49469cbbeeacf337c72b", + "evidence": { + "rejectionCode": "A0422" + } + }, + { + "module": "isolation", + "name": "existing client login", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:19.572Z", + "durationMs": 345, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-08a2c32a-6017-4db4-85ea-d3da53d90021, client-e2e-08a2c32a-6017-4db4-85ea-d3da53d90021", + "traceId": "5bf3a9d117cd4eb8b37570c087f36824", + "evidence": { + "username": "merchant_admin" + } + }, + { + "module": "isolation", + "name": "cross-client order access is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:19.918Z", + "durationMs": 27, + "http": 200, + "code": "A0404", + "message": "Order not found", + "requestId": "client-e2e-6d792f28-0180-4447-92ac-0ad9fe71f0f9, client-e2e-6d792f28-0180-4447-92ac-0ad9fe71f0f9", + "traceId": "7e2a79c6c600429f8fdaa200d1c8449a", + "evidence": { + "orderId": "2085929313522745345", + "rejectionCode": "A0404" + } + }, + { + "module": "isolation", + "name": "cross-client product image access is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:19.946Z", + "durationMs": 34, + "http": 200, + "code": "A0404", + "message": "产品图片不存在", + "requestId": "client-e2e-4c194325-4efb-497d-ae14-3e8b30c6cd2e, client-e2e-4c194325-4efb-497d-ae14-3e8b30c6cd2e", + "traceId": "2a9c7472d05440c8a9971302a11a8ecf", + "evidence": { + "fileId": "2085929310632869889", + "rejectionCode": "A0404" + } + }, + { + "module": "isolation", + "name": "cross-client member detail access is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:19.980Z", + "durationMs": 23, + "http": 200, + "code": "A0404", + "message": "成员不存在", + "requestId": "client-e2e-af9231f1-a421-49ef-a600-cc895e7a5bbd, client-e2e-af9231f1-a421-49ef-a600-cc895e7a5bbd", + "traceId": "5504878f2c0b4ba5b269ef39b91de3be", + "evidence": { + "membershipId": "2085929284870459395", + "rejectionCode": "A0404" + } + }, + { + "module": "isolation", + "name": "existing client address list excludes new enterprise address", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:20.003Z", + "durationMs": 36, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-01b5b9cb-737e-4708-84f7-ca7c6f5f0ec7, client-e2e-01b5b9cb-737e-4708-84f7-ca7c6f5f0ec7", + "traceId": "16406a6eaf894306b9d45e71ad4aa736", + "evidence": { + "addressCount": 0, + "excludedAddressId": "2085929280101535746" + } + }, + { + "module": "isolation", + "name": "existing client qualification list excludes new enterprise qualification", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:20.039Z", + "durationMs": 27, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-2fa0a4fd-6c6e-43bd-9884-b56e3324ca0d, client-e2e-2fa0a4fd-6c6e-43bd-9884-b56e3324ca0d", + "traceId": "18014c6599e342a98c80c757c6fd02fe", + "evidence": { + "qualificationCount": 3, + "excludedQualificationId": "2085929273797496834" + } + }, + { + "module": "isolation", + "name": "cross-client qualification file access is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:20.067Z", + "durationMs": 34, + "http": 200, + "code": "A0404", + "message": "File not found", + "requestId": "client-e2e-36486daa-73ba-4ae3-aadf-ed9fda82807f, client-e2e-36486daa-73ba-4ae3-aadf-ed9fda82807f", + "traceId": "9dfb7d7a8990458a9f8220f5e492fadb", + "evidence": { + "qualificationId": "2085929273797496834", + "rejectionCode": "A0404" + } + }, + { + "module": "account-security", + "name": "rotate refresh token", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:20.102Z", + "durationMs": 39, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-2b6f6e73-565a-471f-8b31-666ffae78c55, client-e2e-2b6f6e73-565a-471f-8b31-666ffae78c55", + "traceId": "64075cd7139943c386c3b2493be6ae01", + "evidence": { + "rotated": true + } + }, + { + "module": "account-security", + "name": "consumed refresh token cannot be replayed", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:20.142Z", + "durationMs": 35, + "http": 200, + "code": "A0401", + "message": "刷新令牌无效或已过期", + "requestId": "client-e2e-ab56690c-fcb3-4928-989a-46f3feeeeb24, client-e2e-ab56690c-fcb3-4928-989a-46f3feeeeb24", + "traceId": "2132db3b1429480da05d492ff54a7d8f", + "evidence": { + "rejectionCode": "A0401" + } + }, + { + "module": "account-security", + "name": "change owner password to temporary value", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:20.178Z", + "durationMs": 964, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-e0335f9d-0b78-463e-a78d-7eff88f32e64, client-e2e-e0335f9d-0b78-463e-a78d-7eff88f32e64", + "traceId": "3c6e77fff40b4297b31666c176bd3c19", + "evidence": { + "username": "client_20260808032107_024af1", + "passwordChanged": true + } + }, + { + "module": "account-security", + "name": "original password is rejected after change", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:21.144Z", + "durationMs": 337, + "http": 200, + "code": "A0401", + "message": "用户名或密码错误", + "requestId": "client-e2e-f517a29f-3fad-46d8-b0ef-220404b60df9, client-e2e-f517a29f-3fad-46d8-b0ef-220404b60df9", + "traceId": "cd5a2b8fe2a34f08b7e1a7ea01f7af4e", + "evidence": { + "username": "client_20260808032107_024af1", + "rejectionCode": "A0401" + } + }, + { + "module": "account-security", + "name": "temporary password login succeeds", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:21.481Z", + "durationMs": 335, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-c8de63b7-cea4-45de-94e6-6135643180ab, client-e2e-c8de63b7-cea4-45de-94e6-6135643180ab", + "traceId": "0cdbfbe738b640f3841579b163029e04", + "evidence": { + "username": "client_20260808032107_024af1" + } + }, + { + "module": "account-security", + "name": "restore owner password", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:21.817Z", + "durationMs": 969, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-15623045-1bc4-4acb-a4ac-83ecfade9534, client-e2e-15623045-1bc4-4acb-a4ac-83ecfade9534", + "traceId": "ddaec5119a50426187641b8ab16dc7eb", + "evidence": { + "username": "client_20260808032107_024af1", + "passwordRestored": true + } + }, + { + "module": "account-security", + "name": "restored owner password login succeeds", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:22.786Z", + "durationMs": 343, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-632e7199-7198-41b5-8ce8-bc02e16854b6, client-e2e-632e7199-7198-41b5-8ce8-bc02e16854b6", + "traceId": "a3fbb93df05f4bbf89d19b7f3c3ae082", + "evidence": { + "username": "client_20260808032107_024af1", + "passwordRestored": true + } + }, + { + "module": "account-security", + "name": "logout current client session", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:23.130Z", + "durationMs": 34, + "http": 200, + "code": "200", + "message": "success", + "requestId": "client-e2e-212c9530-19c5-4d2c-a164-9d633a103c70, client-e2e-212c9530-19c5-4d2c-a164-9d633a103c70", + "traceId": "ef097f25b09446609ee6db03814ba67e", + "evidence": { + "username": "client_20260808032107_024af1" + } + }, + { + "module": "account-security", + "name": "logged-out refresh token is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:23.165Z", + "durationMs": 34, + "http": 200, + "code": "A0401", + "message": "刷新令牌无效或已过期", + "requestId": "client-e2e-0da16781-4cf9-4720-940c-f1c239498afd, client-e2e-0da16781-4cf9-4720-940c-f1c239498afd", + "traceId": "1280414e74034e9f94951e28f2480495", + "evidence": { + "rejectionCode": "A0401" + } + }, + { + "module": "account-security", + "name": "repeated logout with revoked session is rejected", + "passed": true, + "skipped": false, + "startedAt": "2026-08-08T03:21:23.199Z", + "durationMs": 26, + "http": 401, + "code": "A0401", + "message": "未登录或令牌已失效", + "requestId": "client-e2e-ebd3bc4f-ed2b-4ece-8e51-52f85d553141", + "traceId": null, + "evidence": { + "repeated": true, + "rejectionCode": "A0401" + } + } + ], + "futureModules": [ + "measurement", + "ocr", + "mojia", + "billing" + ] +} diff --git a/scripts/admin-test-env-acceptance.mjs b/scripts/admin-test-env-acceptance.mjs index 66b84b3d0..c6b373a53 100644 --- a/scripts/admin-test-env-acceptance.mjs +++ b/scripts/admin-test-env-acceptance.mjs @@ -11,7 +11,7 @@ import process from 'node:process' const DEFAULT_GATEWAY = 'http://8.163.30.128:9000' const DEFAULT_USERNAME = 'platform_admin' const DEFAULT_PASSWORD = 'ChangeMe123!' -const DEFAULT_MODULES = ['customers', 'system', 'master-data', 'orders', 'pricing', 'downloads', 'inbound-weight-ocr', 'inbound-measurement'] +const DEFAULT_MODULES = ['customers', 'system', 'master-data', 'orders', 'pricing', 'downloads', 'inbound-weight-ocr', 'inbound-measurement', 'supplemental'] const WEIGHT_IMAGE_PATH = 'C:/Users/BY-OY/Desktop/上传图片包/测量图片/测量图片/orig_1cf27695-b2c3-44b3-98e3-c0be8b80f79a.JPG' const CUSTOMER_FIELDS = [ 'id', 'tenantCode', 'tenantName', 'status', 'legalName', 'legalRepresentative', diff --git a/scripts/admin-test-env-modules/OWNERSHIP.md b/scripts/admin-test-env-modules/OWNERSHIP.md index 3747cdcc6..b57ada418 100644 --- a/scripts/admin-test-env-modules/OWNERSHIP.md +++ b/scripts/admin-test-env-modules/OWNERSHIP.md @@ -10,6 +10,7 @@ | `019fdac1-ae04-7032-bac0-968497ea54ad` | 墨家测量 | `inbound-measurement.mjs` | | `019fd5af-2e85-74b0-94e5-98c1b9ea4d3e` | 船期价格表 | `pricing.mjs` | | `019fdbb1-ca56-7263-8914-a29d96cc5177` | 客户端创建订单 | `orders.mjs`,负责创建隔离测试订单并补 Admin 状态流程 | +| `019fdf57-193c-7513-ac22-4ea62adaaf96` | Admin 补充边界验收 | `supplemental.mjs`,只读/负向/保护性契约,不创建或删除历史资源 | ## 统一交付要求 diff --git a/scripts/admin-test-env-modules/supplemental.mjs b/scripts/admin-test-env-modules/supplemental.mjs new file mode 100644 index 000000000..24a95aa72 --- /dev/null +++ b/scripts/admin-test-env-modules/supplemental.mjs @@ -0,0 +1,235 @@ +// Admin HTTP acceptance gaps that are intentionally independent from the CRUD +// modules. This module is read-only: it never creates or mutates business data. + +const HEALTH_ENDPOINTS = [ + { path: '/api/platform/v1/orders/status', service: 'order-service' }, + { path: '/api/platform/v1/first-leg/status', service: 'firstleg-service' }, + { path: '/api/platform/v1/files/status', service: 'file-service' }, + { path: '/api/platform/v1/warehouses/status', service: 'warehouse-service', allows503: true }, +] + +function codeOf(response) { + return response?.body?.code == null ? 'missing' : String(response.body.code) +} + +function isMissingRoute(response) { + return response?.http === 404 || response?.http === 405 + || /Not Found|No handler|No static resource/i.test(String(response?.raw || response?.body?.message || '')) +} + +function isBusinessFailure(response) { + const code = codeOf(response) + return [400, 401, 403, 404, 409].includes(response?.http) + || (response?.http === 200 && code !== '200') +} + +function pageShape(data) { + return data && Array.isArray(data.records) + && Number(data.current ?? data.page ?? 1) >= 1 + && Number(data.size ?? 0) >= 0 +} + +function xlsx(response) { + return response?.http === 200 && response.bytes?.length > 4 + && response.bytes[0] === 0x50 && response.bytes[1] === 0x4b +} + +async function checkPage(context, module, name, path, options = {}) { + const response = await context.request('GET', path) + const data = context.apiSuccess(module, `${name}分页查询`, response, `path=${path}`, options) + context.assert(module, `${name}分页结构与记录数组正确`, response, pageShape(data), + `records=${data?.records?.length ?? 'n/a'}, current=${data?.current ?? data?.page ?? 'n/a'}, size=${data?.size ?? 'n/a'}`, options) + return { response, data } +} + +export async function run(context) { + const module = 'supplemental' + const scenario = 'service-health-and-auth-boundary' + const blocker = { scenario, deploymentBlocker: true } + + // Health endpoints are part of the deployed service contract. Warehouse is + // special: a schema/readiness failure is intentionally HTTP 503, not a fake + // success, so retain that signal in the report. + for (const endpoint of HEALTH_ENDPOINTS) { + const response = await context.request('GET', endpoint.path) + const notReadyEnvelope = endpoint.allows503 && response.http === 503 && codeOf(response) === '200' + const data = notReadyEnvelope + ? response.body?.data + : context.apiSuccess(module, `${endpoint.service} 状态响应使用统一成功体`, response, + `HTTP=${response.http}, code=${codeOf(response)}`, isMissingRoute(response) ? blocker : {}) + if (notReadyEnvelope) { + context.addStep(module, `${endpoint.service} readiness 失败仍返回统一响应体`, response, true, + `HTTP=503, code=${codeOf(response)}, status=${data?.status || 'missing'}`) + } + const shape = data && data.service === endpoint.service && typeof data.status === 'string' + && (endpoint.service !== 'warehouse-service' || typeof data.message === 'string') + const ready = response.http === 200 && codeOf(response) === '200' && data?.status === 'UP' + const notReady = endpoint.allows503 && response.http === 503 && codeOf(response) === '200' + && data && data.service === endpoint.service && data.status !== 'UP' && typeof data.message === 'string' + context.assert(module, `${endpoint.service} 状态字段完整且 readiness 语义明确`, response, + shape && (ready || notReady), + `service=${data?.service || 'missing'}, status=${data?.status || 'missing'}, readiness=${ready ? 'UP' : notReady ? 'NOT_READY' : 'invalid'}`, + isMissingRoute(response) ? blocker : {}) + } + + // Gateway must reject both absent and malformed bearer credentials before a + // platform handler is reached. This specifically guards against accidental + // route-level permitAll changes. No token or response body is persisted. + for (const [name, token] of [['未携带令牌', ''], ['伪造令牌', 'invalid-admin-token']]) { + const response = await context.request('GET', '/api/platform/v1/orders/status', undefined, token) + const rejected = response.http === 401 && ['A0401', '401'].includes(codeOf(response)) + context.addStep(module, `平台接口${name}返回 401`, response, rejected, + `HTTP=${response.http}, code=${codeOf(response)}`) + } + + // A route that exists but is not protected is an authorization regression; + // keep the check separate so a service outage does not look like a pass. + const protectedResponse = await context.request('GET', '/api/platform/v1/orders/status', undefined, '') + context.assert(module, '未认证请求不返回业务成功码', protectedResponse, + !(protectedResponse.http === 200 && codeOf(protectedResponse) === '200'), + `HTTP=${protectedResponse.http}, code=${codeOf(protectedResponse)}`) + + // Warehouse/master-data read-only boundary checks. All resources are + // platform-public (tenantId=0); passing a customer scope must fail instead + // of silently widening or narrowing the result set. + const warehousePage = await checkPage(context, module, '仓库', + '/api/platform/v1/warehouse-admin?page=1&size=5&status=ACTIVE', { scenario: 'master-data-readonly' }) + const warehouseId = String(warehousePage.data?.records?.[0]?.id || '') + if (warehouseId) { + await checkPage(context, module, '仓库筛选', + `/api/platform/v1/warehouse-admin?page=1&size=5&tenantId=0&warehouseType=${encodeURIComponent(warehousePage.data.records[0].warehouseType || 'DOMESTIC')}`, + { scenario: 'master-data-readonly' }) + } + for (const [name, path] of [ + ['仓库非法状态', '/api/platform/v1/warehouse-admin?page=1&size=5&status=NOT_A_STATUS'], + ['仓库客户作用域', '/api/platform/v1/warehouse-admin?page=1&size=5&tenantId=10001'], + ]) { + const response = await context.request('GET', path) + context.addStep(module, `${name}安全失败`, response, isBusinessFailure(response), + `HTTP=${response.http}, code=${codeOf(response)}`, { scenario: 'master-data-readonly', deploymentBlocker: isMissingRoute(response) }) + } + + const locationBase = '/api/platform/v1/locations?page=1&size=5&tenantId=0' + const palletBase = '/api/platform/v1/pallets?page=1&size=5&tenantId=0' + const locations = await checkPage(context, module, '库位', locationBase, { scenario: 'warehouse-resources' }) + const pallets = await checkPage(context, module, '托盘', palletBase, { scenario: 'warehouse-resources' }) + if (warehouseId) { + await checkPage(context, module, '库位仓库筛选', `${locationBase}&warehouseId=${warehouseId}`, { scenario: 'warehouse-resources' }) + await checkPage(context, module, '托盘仓库筛选', `${palletBase}&warehouseId=${warehouseId}`, { scenario: 'warehouse-resources' }) + } + const resourceScopeChecks = [ + ['库位客户作用域', '/api/platform/v1/locations?page=1&size=5&tenantId=10001'], + ['托盘客户作用域', '/api/platform/v1/pallets?page=1&size=5&tenantId=10001'], + ['库位非法状态', `${locationBase}&status=ALLOCATED`], + ] + for (const [name, path] of resourceScopeChecks) { + const response = await context.request('GET', path) + context.addStep(module, `${name}安全失败`, response, isBusinessFailure(response), + `HTTP=${response.http}, code=${codeOf(response)}`, { scenario: 'warehouse-resources', deploymentBlocker: isMissingRoute(response) }) + } + // A stale version is checked without identifying or mutating an existing + // resource; the sentinel ID must be rejected as not found/invalid. + for (const [name, path] of [ + ['库位过期版本/不存在资源', '/api/platform/v1/locations/999999999999?tenantId=0&warehouseId=999999999999'], + ['托盘占用资源保护边界', '/api/platform/v1/pallets/999999999999?tenantId=0&warehouseId=999999999999'], + ]) { + const response = await context.request('GET', path) + context.addStep(module, `${name}不泄露或误修改数据`, response, isBusinessFailure(response), + `HTTP=${response.http}, code=${codeOf(response)}`, { scenario: 'warehouse-resources', deploymentBlocker: isMissingRoute(response) }) + } + + // Shared express/partner master data: status/type filters and safe template + // downloads. We do not upload arbitrary or real customer workbooks. + for (const [label, base, invalid] of [ + ['快递公司', '/api/platform/v1/express-companies', 'UNKNOWN'], + ['往来单位', '/api/platform/v1/partners', 'UNKNOWN_TYPE'], + ]) { + await checkPage(context, module, label, `${base}?page=1&size=5&tenantId=0&status=ACTIVE`, { scenario: 'shared-master-data' }) + const inactive = await checkPage(context, module, `${label}停用筛选`, `${base}?page=1&size=5&tenantId=0&status=INACTIVE`, { scenario: 'shared-master-data' }) + context.assert(module, `${label}状态枚举过滤不混入其他状态`, inactive.response, + inactive.data?.records?.every?.((item) => item.status === 'INACTIVE'), `records=${inactive.data?.records?.length ?? 'n/a'}`, { scenario: 'shared-master-data' }) + const invalidPath = label === '往来单位' + ? `${base}?page=1&size=5&tenantId=0&types=${invalid}` + : `${base}?page=1&size=5&tenantId=0&status=${invalid}` + const invalidResponse = await context.request('GET', invalidPath) + context.addStep(module, `${label}无效筛选参数安全失败`, invalidResponse, isBusinessFailure(invalidResponse), + `HTTP=${invalidResponse.http}, code=${codeOf(invalidResponse)}`, { scenario: 'shared-master-data', deploymentBlocker: isMissingRoute(invalidResponse) }) + } + for (const [label, path] of [ + ['仓库导入模板', '/api/platform/v1/warehouse-admin/import-template'], + ['快递公司导入模板', '/api/platform/v1/express-companies/import-template'], + ['往来单位导入模板', '/api/platform/v1/partners/import-template'], + ]) { + const response = await context.requestBinary('GET', path) + context.addStep(module, `${label}为 XLSX 且不记录二进制`, response, xlsx(response), + `HTTP=${response.http}, bytes=${response.bytes?.length ?? 0}, contentType=${response.contentType || 'missing'}`, + { scenario: 'shared-master-data', deploymentBlocker: isMissingRoute(response) }) + } + + // Price-book lifecycle is read-only here; pricing.mjs remains the sole owner + // of uploads/publication. Verify all supported status filters and source + // download evidence from an already existing active/history version. + const pricePath = '/api/platform/v1/fba-pricing/carrier-rates/price-books' + for (const status of ['PENDING_CONFIRMATION', 'ACTIVE', 'SUPERSEDED']) { + const response = await context.request('GET', `${pricePath}?status=${status}`) + const versions = context.apiSuccess(module, `船期价格表 ${status} 状态过滤`, response, `count=${Array.isArray(response.body?.data) ? response.body.data.length : 'n/a'}`, { scenario: 'price-book-readonly', deploymentBlocker: isMissingRoute(response) }) + context.assert(module, `船期价格表 ${status} 结果状态一致`, response, + Array.isArray(versions) && versions.every((item) => item.status === status), `count=${versions?.length ?? 'n/a'}`, { scenario: 'price-book-readonly', deploymentBlocker: isMissingRoute(response) }) + } + const activeVersionsResponse = await context.request('GET', `${pricePath}?status=ACTIVE`) + const activeVersions = context.apiSuccess(module, '读取现有生效价格版本用于下载安全检查', activeVersionsResponse, '', { scenario: 'price-book-readonly', deploymentBlocker: isMissingRoute(activeVersionsResponse) }) + const activeVersionId = String(activeVersions?.[0]?.id || '') + if (activeVersionId) { + const sourceResponse = await context.requestBinary('GET', `${pricePath}/${encodeURIComponent(activeVersionId)}/source`) + context.addStep(module, '现有生效价格源文件下载为 XLSX', sourceResponse, xlsx(sourceResponse), + `versionId=${activeVersionId}, bytes=${sourceResponse.bytes?.length ?? 0}, contentType=${sourceResponse.contentType || 'missing'}`, { scenario: 'price-book-readonly' }) + } else { + context.assert(module, '存在可供安全下载核验的生效价格版本', activeVersionsResponse, false, '当前无 ACTIVE 价格版本,无法安全执行源文件下载核验', { scenario: 'price-book-readonly', deploymentBlocker: true }) + } + + // Download center: list/status pagination and negative access checks only; + // downloads.mjs owns task creation and successful-file polling. + for (const status of ['PENDING', 'RUNNING', 'SUCCEEDED', 'FAILED', 'EXPIRED']) { + const response = await context.request('GET', `/api/platform/v1/files/export-tasks?page=1&size=5&status=${status}`) + const data = context.apiSuccess(module, `下载中心 ${status} 状态分页`, response, '', { scenario: 'download-readonly', deploymentBlocker: isMissingRoute(response) }) + context.assert(module, `下载中心 ${status} 过滤结果状态一致`, response, + pageShape(data) && data.records.every((item) => item.status === status), `records=${data?.records?.length ?? 'n/a'}`, { scenario: 'download-readonly', deploymentBlocker: isMissingRoute(response) }) + } + for (const [name, path] of [ + ['不存在下载任务详情', '/api/platform/v1/files/export-tasks/999999999999'], + ['不存在下载任务文件', '/api/platform/v1/files/export-tasks/999999999999/download'], + ]) { + const response = await context.request('GET', path, undefined, context.token) + context.addStep(module, `${name}安全失败`, response, isBusinessFailure(response), `HTTP=${response.http}, code=${codeOf(response)}`, { scenario: 'download-readonly', deploymentBlocker: isMissingRoute(response) }) + } + const unauthDownload = await context.request('GET', '/api/platform/v1/files/export-tasks/999999999999/download', undefined, '') + context.addStep(module, '未授权下载请求被拒绝', unauthDownload, unauthDownload.http === 401, + `HTTP=${unauthDownload.http}, code=${codeOf(unauthDownload)}`, { scenario: 'download-readonly' }) + + // IAM lists are intentionally read-only. The RBAC endpoints are list-shaped + // arrays (not paginated in the current contract); retain that fact instead of + // pretending pagination exists, and verify built-in markers are exposed. + for (const [label, path, builtInField] of [ + ['平台用户', '/api/platform/v1/iam/users?page=1&size=5', 'protectedAccount'], + ['平台角色', '/api/platform/v1/iam/roles', 'roleType'], + ['菜单权限', '/api/platform/v1/iam/permissions', 'builtIn'], + ]) { + const response = await context.request('GET', path) + const data = context.apiSuccess(module, `${label}只读列表`, response, '', { scenario: 'iam-readonly', deploymentBlocker: isMissingRoute(response) }) + const records = label === '平台用户' ? data?.records : data + context.assert(module, `${label}列表结构正确且包含内置保护标识`, response, + label === '平台用户' ? pageShape(data) + : Array.isArray(records) && records.some((item) => label === '平台角色' + ? item.roleType === 'SYSTEM' + : Object.hasOwn(item, builtInField)), + `records=${records?.length ?? 'n/a'}, builtInField=${builtInField}`, { scenario: 'iam-readonly', deploymentBlocker: isMissingRoute(response) }) + } + for (const [name, path] of [ + ['角色列表伪造令牌', '/api/platform/v1/iam/roles'], + ['菜单权限未携带令牌', '/api/platform/v1/iam/permissions'], + ]) { + const response = await context.request('GET', path, undefined, name.includes('伪造') ? 'invalid-admin-token' : '') + context.addStep(module, `${name}拒绝访问`, response, response.http === 401, + `HTTP=${response.http}, code=${codeOf(response)}`, { scenario: 'iam-readonly' }) + } +} diff --git a/scripts/client-phase2-test-env-acceptance.mjs b/scripts/client-phase2-test-env-acceptance.mjs new file mode 100644 index 000000000..985e24e90 --- /dev/null +++ b/scripts/client-phase2-test-env-acceptance.mjs @@ -0,0 +1,670 @@ +#!/usr/bin/env node + +/** + * Client phase-two test-environment acceptance flow. + * + * The platform account is used only to discover deterministic inbound fixtures. + * All phase-two product assertions are executed with the Client account. + * + * Run directly and enter credentials when prompted: + * node scripts/client-phase2-test-env-acceptance.mjs + */ + +import { mkdir, writeFile } from 'node:fs/promises' +import { randomUUID } from 'node:crypto' +import { resolve } from 'node:path' +import { createInterface } from 'node:readline/promises' + +const args = parseArgs(process.argv.slice(2)) +const gateway = trimSlash(args.gateway ?? process.env.CLIENT_PHASE2_TEST_GATEWAY + ?? 'http://8.163.30.128:9000') +const clientUsername = args['client-username'] ?? process.env.CLIENT_PHASE2_USERNAME + ?? await promptText('二期客户端账号', 'merchant_admin') +const clientPassword = args['client-password'] ?? process.env.CLIENT_PHASE2_PASSWORD + ?? await promptSecret('二期客户端密码') +const platformUsername = args['platform-username'] ?? process.env.PLATFORM_USERNAME + ?? await promptText('平台夹具查询账号', 'platform_admin') +const platformPassword = args['platform-password'] ?? process.env.PLATFORM_PASSWORD + ?? await promptSecret('平台夹具查询密码') +const forcedOrderId = args['order-id'] ?? process.env.CLIENT_PHASE2_ORDER_ID ?? null +const reportDir = resolve(args['report-dir'] ?? process.env.CLIENT_PHASE2_REPORT_DIR ?? 'reports') +const timeoutMs = Number(args['timeout-ms'] ?? process.env.CLIENT_PHASE2_TIMEOUT_MS ?? 30_000) + +if (!clientPassword || !platformPassword) { + console.error('Client and platform passwords are required') + process.exit(2) +} +if (!Number.isFinite(timeoutMs) || timeoutMs < 1_000) { + console.error('--timeout-ms must be at least 1000') + process.exit(2) +} + +const now = new Date() +const marker = `${compactTimestamp(now)}-${randomUUID().slice(0, 8)}` +const reportPath = resolve(reportDir, `client-phase2-test-env-${marker}.json`) +const report = { + marker, + gateway, + generatedAt: now.toISOString(), + completedAt: null, + success: false, + fatal: null, + testAccount: { username: clientUsername }, + expectedTerminalState: { + processStatus: 'WAIT_SPLIT', + measureReviewStatus: 'APPROVED', + feeStatus: 'CONFIRMED', + }, + resources: { + tenantId: null, + terminalInboundId: null, + terminalOrderId: null, + terminalInboundCode: null, + pendingOrderId: null, + foreignOrderId: null, + measurementImageFileIds: [], + weightImageFileIds: [], + }, + steps: [], +} + +let clientToken +let platformToken +let terminalFixture +let pendingFixture +let foreignFixture +let platformTerminalDetail +let merchantBilling + +try { + await sessionModule() + await fixtureDiscoveryModule() + await unpublishedVisibilityModule() + await terminalBillingModule() + await unifiedOrderModule() + await isolationModule() + report.success = report.steps.every((step) => step.passed) +} catch (error) { + report.fatal = sanitizeError(error) + report.success = false +} finally { + report.completedAt = new Date().toISOString() + await mkdir(reportDir, { recursive: true }) + await writeFile(reportPath, `${JSON.stringify(report, null, 2)}\n`, 'utf8') + printSummary() +} + +process.exitCode = report.success ? 0 : 1 + +async function sessionModule() { + const clientLogin = await apiStep('phase2-session', 'client login', { + method: 'POST', path: '/api/auth/login', + body: { username: clientUsername, password: clientPassword }, + }, ({ json }) => { + requireSuccess(json) + assertPresent(json.data?.accessToken, 'client accessToken') + }, () => ({ username: clientUsername })) + clientToken = clientLogin.json.data.accessToken + + const profile = await apiStep('phase2-session', 'load current enterprise profile', { + method: 'GET', path: '/api/merchant/v1/iam/tenant/profile', token: clientToken, + }, ({ json }) => { + requireSuccess(json) + assertPresent(json.data?.id, 'enterprise id') + assertEqual(json.data?.status, 'ACTIVE', 'enterprise status') + }, ({ json }) => ({ tenantId: json.data.id, tenantName: json.data.tenantName, status: json.data.status })) + report.resources.tenantId = String(profile.json.data.id) + + await apiStep('phase2-session', 'client has order view permission', { + method: 'GET', path: '/api/merchant/v1/iam/authorization/permissions', token: clientToken, + }, ({ json }) => { + requireSuccess(json) + assertTrue(arrayData(json.data).includes('merchant:order:view'), 'merchant:order:view permission is required') + }, ({ json }) => ({ permissionCount: arrayData(json.data).length })) + + const platformLogin = await apiStep('phase2-fixture', 'platform fixture account login', { + method: 'POST', path: '/api/auth/login', + body: { username: platformUsername, password: platformPassword }, + }, ({ json }) => { + requireSuccess(json) + assertPresent(json.data?.accessToken, 'platform accessToken') + }, () => ({ username: platformUsername })) + platformToken = platformLogin.json.data.accessToken +} + +async function fixtureDiscoveryModule() { + const ownInbounds = await apiStep('phase2-fixture', 'discover current enterprise inbound fixtures', { + method: 'GET', + path: `/api/platform/inbounds?tenantId=${report.resources.tenantId}&page=1&size=200`, + token: platformToken, + }, ({ json }) => { + requireSuccess(json) + assertTrue(Array.isArray(json.data?.records), 'inbound records must be an array') + }, ({ json }) => ({ total: json.data?.total, statusCounts: statusCounts(json.data?.records) })) + + const ownRows = pageRecords(ownInbounds.json.data) + terminalFixture = forcedOrderId + ? ownRows.find((row) => String(row.orderId) === String(forcedOrderId)) + : ownRows.find(isTerminalFixture) + if (!terminalFixture) { + throw new Error(forcedOrderId + ? `Configured orderId=${forcedOrderId} is not visible in tenant ${report.resources.tenantId}` + : `Tenant ${report.resources.tenantId} has no WAIT_SPLIT + APPROVED + CONFIRMED fixture`) + } + assertTerminalFixture(terminalFixture) + report.resources.terminalInboundId = String(terminalFixture.id) + report.resources.terminalOrderId = String(terminalFixture.orderId) + report.resources.terminalInboundCode = terminalFixture.inboundCode + + pendingFixture = ownRows.find((row) => String(row.orderId) !== report.resources.terminalOrderId + && !isTerminalFixture(row)) + report.resources.pendingOrderId = pendingFixture == null ? null : String(pendingFixture.orderId) + + await softApiStep('phase2-fixture', 'terminal state filters find selected inbound', { + method: 'GET', + path: `/api/platform/inbounds?tenantId=${report.resources.tenantId}` + + '&processStatus=WAIT_SPLIT&measureReviewStatus=APPROVED&feeStatus=CONFIRMED&page=1&size=200', + token: platformToken, + }, ({ json }) => { + requireSuccess(json) + const row = pageRecords(json.data) + .find((item) => String(item.id) === report.resources.terminalInboundId) + assertPresent(row, 'terminal inbound filter row') + assertTerminalFixture(row) + }, ({ json }) => ({ total: json.data?.total, inboundId: report.resources.terminalInboundId })) + const detail = await apiStep('phase2-fixture', 'load platform terminal inbound reference detail', { + method: 'GET', + path: `/api/platform/inbounds/${report.resources.terminalInboundId}?tenantId=${report.resources.tenantId}`, + token: platformToken, + }, ({ json }) => { + requireSuccess(json) + assertEqual(String(json.data?.summary?.id), report.resources.terminalInboundId, 'inbound id') + assertEqual(String(json.data?.summary?.orderId), report.resources.terminalOrderId, 'order id') + assertTerminalFixture(json.data?.summary) + }, ({ json }) => ({ + inboundId: json.data.summary.id, + orderId: json.data.summary.orderId, + processStatus: json.data.summary.processStatus, + measureReviewStatus: json.data.summary.measureReviewStatus, + feeStatus: json.data.summary.feeStatus, + })) + platformTerminalDetail = detail.json.data + + const allTerminal = await apiStep('phase2-fixture', 'discover foreign terminal fixture for isolation', { + method: 'GET', + path: '/api/platform/inbounds?page=1&size=200', + token: platformToken, + }, ({ json }) => { + requireSuccess(json) + assertTrue(Array.isArray(json.data?.records), 'terminal fixture records must be an array') + }, ({ json }) => ({ total: json.data?.total })) + foreignFixture = pageRecords(allTerminal.json.data) + .find((row) => isTerminalFixture(row) && String(row.tenantId) !== report.resources.tenantId) + report.resources.foreignOrderId = foreignFixture == null ? null : String(foreignFixture.orderId) +} + +async function unpublishedVisibilityModule() { + if (!pendingFixture) { + recordSkipped('phase2-client-visibility', 'unfinished inbound billing remains unavailable', + 'Current enterprise has no non-terminal inbound fixture') + return + } + await apiStep('phase2-client-visibility', 'unfinished inbound billing remains unavailable', { + method: 'GET', + path: `/api/merchant/v1/first-leg/orders/${pendingFixture.orderId}/inbound-billing`, + token: clientToken, + }, ({ json, status }) => { + assertEqual(status, 200, 'HTTP status') + assertEqual(String(json?.code), 'A0404', 'business code') + }, ({ json }) => ({ + orderId: pendingFixture.orderId, + processStatus: pendingFixture.processStatus, + feeStatus: pendingFixture.feeStatus, + rejectionCode: json?.code, + })) + + await apiStep('phase2-client-visibility', 'unknown order inbound billing is rejected', { + method: 'GET', path: '/api/merchant/v1/first-leg/orders/1/inbound-billing', token: clientToken, + }, ({ json, status }) => { + assertEqual(status, 200, 'HTTP status') + assertEqual(String(json?.code), 'A0404', 'business code') + }, ({ json }) => ({ orderId: 1, rejectionCode: json?.code })) +} + +async function terminalBillingModule() { + const response = await softApiStep('phase2-client-billing', + 'terminal inbound billing is visible to client', { + method: 'GET', + path: `/api/merchant/v1/first-leg/orders/${report.resources.terminalOrderId}/inbound-billing`, + token: clientToken, + }, ({ json }) => { + requireSuccess(json) + assertPresent(json.data?.inbound?.summary, 'merchant inbound summary') + assertPresent(json.data?.latestFee, 'merchant latest fee') + assertEqual(String(json.data.inbound.summary.id), report.resources.terminalInboundId, 'inbound id') + assertEqual(String(json.data.inbound.summary.orderId), report.resources.terminalOrderId, 'order id') + assertTerminalFixture(json.data.inbound.summary) + assertEqual(json.data.latestFee.feeStatus, 'CONFIRMED', 'latest fee status') + }, ({ json }) => ({ + inboundId: json?.data?.inbound?.summary?.id, + orderId: json?.data?.inbound?.summary?.orderId, + processStatus: json?.data?.inbound?.summary?.processStatus, + measureReviewStatus: json?.data?.inbound?.summary?.measureReviewStatus, + feeStatus: json?.data?.latestFee?.feeStatus, + rejectionCode: json?.code, + })) + if (!response) { + recordSkipped('phase2-client-billing', 'terminal billing aggregate contract', + 'Terminal billing endpoint did not return a visible aggregate') + recordSkipped('phase2-client-images', 'published measurement and weight image access', + 'Terminal billing endpoint did not return image references') + return + } + merchantBilling = response.json.data + + await localStep('phase2-client-billing', 'terminal billing aggregate contract', () => { + const summary = merchantBilling.inbound.summary + const fee = merchantBilling.latestFee + assertStringId(summary.id, 'inbound summary id') + assertStringId(summary.orderId, 'inbound order id') + assertStringId(fee.feeId, 'fee id') + assertStringId(fee.inboundId, 'fee inbound id') + assertEqual(String(fee.inboundId), String(summary.id), 'fee inbound relation') + assertEqual(fee.inboundCode, summary.inboundCode, 'fee inbound code') + assertEqual(fee.customerId == null ? null : String(fee.customerId), report.resources.tenantId, + 'fee customer isolation') + assertTrue(Number(fee.actualWeightKg) > 0, 'actual weight must be positive') + assertTrue(Number(fee.actualVolumeCbm) > 0, 'actual volume must be positive') + assertTrue(Number(fee.chargeableQuantity) > 0, 'chargeable quantity must be positive') + assertTrue(Number(fee.unitPrice) >= 0, 'unit price must not be negative') + assertMoneyEqual(Number(fee.subtotalAmount) + Number(fee.additionalAmount), + Number(fee.totalAmount), 'fee amount composition') + assertEqual(fee.chargeUnit, fee.chargeMode, 'fee charge unit') + assertTrue(['KG', 'CBM'].includes(fee.chargeMode), 'charge mode must be KG or CBM') + }, { + inboundId: report.resources.terminalInboundId, + feeId: merchantBilling.latestFee.feeId, + feeNo: merchantBilling.latestFee.feeNo, + chargeMode: merchantBilling.latestFee.chargeMode, + chargeableQuantity: merchantBilling.latestFee.chargeableQuantity, + totalAmount: merchantBilling.latestFee.totalAmount, + currency: merchantBilling.latestFee.currency, + }) + + await localStep('phase2-client-billing', 'client aggregate excludes platform internal collections', () => { + assertEqual(arrayData(merchantBilling.inbound.internalNotes).length, 0, 'merchant internal note count') + assertEqual(arrayData(merchantBilling.inbound.statusHistory).length, 0, 'merchant status history count') + for (const file of arrayData(merchantBilling.inbound.files)) { + assertTrue(['PUBLIC', 'MERCHANT'].includes(file.visibility), + `merchant file visibility must be PUBLIC or MERCHANT, actual=${file.visibility}`) + } + assertEqual(merchantBilling.inbound.publicRemark ?? null, + platformTerminalDetail.publicRemark ?? null, 'public remark') + }, { + internalNoteCount: arrayData(merchantBilling.inbound.internalNotes).length, + statusHistoryCount: arrayData(merchantBilling.inbound.statusHistory).length, + visibleFileCount: arrayData(merchantBilling.inbound.files).length, + }) + + await localStep('phase2-client-billing', 'measurement and billing basis are internally consistent', () => { + const summary = merchantBilling.measurementSummary + const basis = merchantBilling.billingBasis + const fee = merchantBilling.latestFee + assertPresent(summary?.measurementId, 'measurement id') + assertEqual(summary.measurementStatus, 'SUBMITTED', 'measurement status') + assertTrue(Number(summary.actualPackageCount) > 0, 'actual package count must be positive') + assertTrue(Number(summary.actualGrossWeightKg) > 0, 'measurement gross weight must be positive') + assertTrue(Number(summary.actualVolumeCbm) > 0, 'measurement volume must be positive') + assertNumberEqual(basis.actualWeightKg, fee.actualWeightKg, 'billing actual weight') + assertNumberEqual(basis.actualVolumeCbm, fee.actualVolumeCbm, 'billing actual volume') + assertNumberEqual(basis.convertedQuantity, fee.convertedQuantity, 'billing converted quantity') + assertNumberEqual(basis.chargeableQuantity, fee.chargeableQuantity, 'billing chargeable quantity') + }, { + measurementId: merchantBilling.measurementSummary?.measurementId, + measurementStatus: merchantBilling.measurementSummary?.measurementStatus, + measurementItemCount: arrayData(merchantBilling.measurementItems).length, + weightResultCount: arrayData(merchantBilling.weightResults).length, + chargeableBasis: merchantBilling.billingBasis?.chargeableBasis, + }) + + const measurementImages = arrayData(merchantBilling.measurementImages) + const weightImages = arrayData(merchantBilling.weightImages) + report.resources.measurementImageFileIds = measurementImages.map((item) => String(item.fileId)) + report.resources.weightImageFileIds = weightImages.map((item) => String(item.fileId)) + const images = [...measurementImages, ...weightImages] + if (images.length === 0) { + recordSkipped('phase2-client-images', 'published measurement and weight image access', + 'Terminal billing aggregate contains no image references') + } else { + for (const image of images.slice(0, 4)) { + await apiStep('phase2-client-images', `download ${image.imageType} image ${image.fileId}`, { + method: 'GET', path: apiPath(image.previewUrl), token: clientToken, responseType: 'bytes', + }, ({ status, bytes, headers }) => { + assertEqual(status, 200, 'HTTP status') + assertTrue(bytes?.length > 0, 'downloaded image must not be empty') + assertTrue((headers.get('content-type') ?? '').startsWith('image/'), + 'download content type must be an image') + }, ({ bytes, headers }) => ({ + fileId: image.fileId, + imageType: image.imageType, + sizeBytes: bytes.length, + contentType: headers.get('content-type'), + })) + } + } + + await apiStep('phase2-client-images', 'unreferenced inbound image is rejected', { + method: 'GET', + path: `/api/merchant/v1/first-leg/orders/${report.resources.terminalOrderId}/inbound-billing/images/1`, + token: clientToken, + }, ({ json, status }) => { + assertEqual(status, 200, 'HTTP status') + assertEqual(String(json?.code), 'A0404', 'business code') + }, ({ json }) => ({ fileId: 1, rejectionCode: json?.code })) +} + +async function unifiedOrderModule() { + const orderNo = terminalFixture.orderNo + await apiStep('phase2-unified-orders', 'unified order list exposes phase-two terminal state', { + method: 'GET', + path: `/api/merchant/v1/orders?page=1&size=50&orderNo=${encodeURIComponent(orderNo)}`, + token: clientToken, + }, ({ json }) => { + requireSuccess(json) + const row = pageRecords(json.data) + .find((item) => String(item.orderId) === report.resources.terminalOrderId) + assertPresent(row, 'unified terminal order row') + assertEqual(row.mainStatus, 'INBOUNDED', 'unified main status') + assertEqual(String(row.inboundId), report.resources.terminalInboundId, 'unified inbound id') + assertEqual(row.measurement?.reviewStatus, 'APPROVED', 'unified measurement review status') + assertTrue(Number(row.actualGrossWeightKg) > 0, 'unified actual gross weight must be positive') + assertTrue(Number(row.actualVolumeCbm) > 0, 'unified actual volume must be positive') + }, ({ json }) => { + const row = pageRecords(json.data) + .find((item) => String(item.orderId) === report.resources.terminalOrderId) + return { orderId: row?.orderId, mainStatus: row?.mainStatus, + inboundId: row?.inboundId, measurementReviewStatus: row?.measurement?.reviewStatus, + actualGrossWeightKg: row?.actualGrossWeightKg, actualVolumeCbm: row?.actualVolumeCbm } + }) + + await apiStep('phase2-unified-orders', 'unified order detail includes phase-two timeline', { + method: 'GET', path: `/api/merchant/v1/orders/${report.resources.terminalOrderId}`, token: clientToken, + }, ({ json }) => { + requireSuccess(json) + assertEqual(String(json.data?.summary?.orderId), report.resources.terminalOrderId, 'unified order id') + assertEqual(json.data?.summary?.mainStatus, 'INBOUNDED', 'unified main status') + assertTrue(arrayData(json.data?.timeline).some((item) => item.status === 'INBOUNDED'), + 'unified timeline must contain INBOUNDED') + }, ({ json }) => ({ + orderId: json.data?.summary?.orderId, + mainStatus: json.data?.summary?.mainStatus, + timelineCount: arrayData(json.data?.timeline).length, + })) +} + +async function isolationModule() { + if (!foreignFixture) { + recordSkipped('phase2-isolation', 'cross-enterprise terminal billing is rejected', + 'No foreign WAIT_SPLIT + APPROVED + CONFIRMED fixture is visible to the platform account') + return + } + await apiStep('phase2-isolation', 'cross-enterprise terminal billing is rejected', { + method: 'GET', + path: `/api/merchant/v1/first-leg/orders/${foreignFixture.orderId}/inbound-billing`, + token: clientToken, + }, ({ json, status }) => { + assertEqual(status, 200, 'HTTP status') + assertTrue(['A0403', 'A0404'].includes(String(json?.code)), + `expected A0403/A0404, actual=${json?.code}`) + }, ({ json }) => ({ + orderId: foreignFixture.orderId, + tenantId: foreignFixture.tenantId, + rejectionCode: json?.code, + })) +} + +async function apiStep(module, name, request, validate, evidenceBuilder = defaultEvidence) { + const startedAt = new Date().toISOString() + const started = Date.now() + let response + try { + response = await httpRequest(request) + validate(response) + report.steps.push(makeStep(module, name, true, startedAt, started, response, evidenceBuilder(response))) + console.log(`PASS [${module}] ${name}`) + return response + } catch (error) { + let evidence = null + if (response) { + try { evidence = evidenceBuilder(response) } catch { evidence = defaultEvidence(response) } + } + const step = makeStep(module, name, false, startedAt, started, response, evidence) + step.error = sanitizeError(error) + report.steps.push(step) + console.error(`FAIL [${module}] ${name}: ${error.message}`) + throw error + } +} + +async function softApiStep(module, name, request, validate, evidenceBuilder = defaultEvidence) { + try { return await apiStep(module, name, request, validate, evidenceBuilder) } catch { return null } +} + +async function localStep(module, name, validate, evidence = null) { + const startedAt = new Date().toISOString() + const started = Date.now() + try { + validate() + report.steps.push(makeStep(module, name, true, startedAt, started, null, evidence)) + console.log(`PASS [${module}] ${name}`) + } catch (error) { + const step = makeStep(module, name, false, startedAt, started, null, evidence) + step.error = sanitizeError(error) + report.steps.push(step) + console.error(`FAIL [${module}] ${name}: ${error.message}`) + throw error + } +} + +async function httpRequest({ method = 'GET', path, token, headers = {}, body, responseType = 'json' }) { + const requestHeaders = { Accept: 'application/json', 'X-Request-Id': `client-phase2-${randomUUID()}`, ...headers } + if (token) requestHeaders.Authorization = `Bearer ${token}` + let requestBody = body + if (body != null && !(body instanceof FormData)) { + requestHeaders['Content-Type'] = 'application/json' + requestBody = JSON.stringify(body) + } + const response = await fetch(`${gateway}${path}`, { + method, headers: requestHeaders, body: requestBody, signal: AbortSignal.timeout(timeoutMs), + }) + const result = { status: response.status, headers: response.headers, json: null, bytes: null, text: null } + if (responseType === 'bytes') { + result.bytes = new Uint8Array(await response.arrayBuffer()) + return result + } + const text = await response.text() + result.text = text + if (text) { + try { result.json = JSON.parse(text) } + catch { throw new Error(`Expected JSON but received ${text.slice(0, 200)}`) } + } + return result +} + +function makeStep(module, name, passed, startedAt, started, response, evidence) { + return { + module, name, passed, skipped: false, startedAt, durationMs: Date.now() - started, + http: response?.status ?? null, + code: response?.json?.code == null ? null : String(response.json.code), + message: response?.json?.message ?? null, + requestId: headerOrBody(response, 'x-request-id', 'requestId'), + traceId: headerOrBody(response, 'x-trace-id', 'traceId'), + evidence, + } +} + +function recordSkipped(module, name, reason) { + report.steps.push({ + module, name, passed: true, skipped: true, startedAt: new Date().toISOString(), durationMs: 0, + http: null, code: null, message: reason, requestId: null, traceId: null, evidence: null, + }) + console.log(`SKIP [${module}] ${name}: ${reason}`) +} + +function requireSuccess(json) { + assertPresent(json, 'response body') + assertEqual(String(json.code), '200', 'business code') +} + +function isTerminalFixture(row) { + return row?.processStatus === 'WAIT_SPLIT' + && row?.measureReviewStatus === 'APPROVED' + && row?.feeStatus === 'CONFIRMED' +} + +function assertTerminalFixture(row) { + assertPresent(row, 'terminal inbound fixture') + assertEqual(row.processStatus, 'WAIT_SPLIT', 'process status') + assertEqual(row.measureReviewStatus, 'APPROVED', 'measurement review status') + assertEqual(row.feeStatus, 'CONFIRMED', 'fee status') +} + +function statusCounts(values) { + const counts = {} + for (const row of arrayData(values)) { + const key = `${row.processStatus ?? 'UNKNOWN'}|${row.measureReviewStatus ?? 'NONE'}|${row.feeStatus ?? 'NONE'}` + counts[key] = (counts[key] ?? 0) + 1 + } + return counts +} + +function assertStringId(value, label) { + assertPresent(value, label) + assertEqual(typeof value, 'string', `${label} type`) + assertTrue(/^\d+$/.test(value), `${label} must contain only digits`) +} + +function assertNumberEqual(actual, expected, label) { + assertEqual(Number(actual), Number(expected), label) +} + +function assertMoneyEqual(actual, expected, label) { + assertEqual(Math.round(Number(actual) * 100), Math.round(Number(expected) * 100), label) +} + +function defaultEvidence({ json }) { + if (!json || json.data == null) return null + if (typeof json.data !== 'object') return { data: json.data } + return null +} + +function pageRecords(data) { + if (Array.isArray(data)) return data + return arrayData(data?.records ?? data?.items ?? data?.content) +} + +function arrayData(value) { return Array.isArray(value) ? value : [] } + +function headerOrBody(response, headerName, bodyName) { + return response?.headers?.get(headerName) + ?? response?.json?.[bodyName] + ?? response?.json?.data?.[bodyName] + ?? null +} + +function assertEqual(actual, expected, label) { + if (actual !== expected) throw new Error(`${label}: expected=${format(expected)} actual=${format(actual)}`) +} + +function assertPresent(value, label) { + if (value == null || value === '') throw new Error(`${label} is required`) +} + +function assertTrue(value, message) { + if (!value) throw new Error(message) +} + +function apiPath(value) { + const url = new URL(String(value), `${gateway}/`) + return `${url.pathname}${url.search}` +} + +function printSummary() { + const failed = report.steps.filter((step) => !step.passed) + const skipped = report.steps.filter((step) => step.skipped) + console.log(JSON.stringify({ + success: report.success, + marker, + passed: report.steps.filter((step) => step.passed && !step.skipped).length, + failed: failed.length, + skipped: skipped.length, + reportPath, + }, null, 2)) +} + +function parseArgs(values) { + const parsed = {} + for (let index = 0; index < values.length; index += 1) { + const value = values[index] + if (!value.startsWith('--')) continue + const [rawKey, inlineValue] = value.slice(2).split('=', 2) + parsed[rawKey] = inlineValue ?? values[index + 1] + if (inlineValue == null) index += 1 + } + return parsed +} + +function compactTimestamp(value) { + return value.toISOString().replace(/[-:TZ.]/g, '').slice(0, 14) +} + +function trimSlash(value) { return String(value).replace(/\/+$/, '') } + +function format(value) { return typeof value === 'string' ? JSON.stringify(value) : String(value) } + +function sanitizeError(error) { + return { name: error?.name ?? 'Error', message: error?.message ?? String(error) } +} + +async function promptText(label, defaultValue = '') { + if (!process.stdin.isTTY || !process.stdout.isTTY) return defaultValue + const reader = createInterface({ input: process.stdin, output: process.stdout }) + try { + const suffix = defaultValue ? ` [${defaultValue}]` : '' + const value = await reader.question(`${label}${suffix}: `) + return value.trim() || defaultValue + } finally { + reader.close() + } +} + +async function promptSecret(label) { + if (!process.stdin.isTTY || !process.stdout.isTTY) return undefined + const input = process.stdin + const output = process.stdout + output.write(`${label}: `) + input.setRawMode(true) + input.resume() + input.setEncoding('utf8') + let value = '' + try { + for await (const chunk of input) { + for (const character of chunk) { + if (character === '\r' || character === '\n') { + output.write('\n') + return value + } + if (character === '\u0003') throw new Error('Input cancelled') + if (character === '\u007f' || character === '\b') { + if (value.length > 0) value = value.slice(0, -1) + continue + } + value += character + } + } + return value + } finally { + input.setRawMode(false) + input.pause() + } +} diff --git a/scripts/client-test-env-acceptance.mjs b/scripts/client-test-env-acceptance.mjs index 16164fee9..51c8b8ed8 100644 --- a/scripts/client-test-env-acceptance.mjs +++ b/scripts/client-test-env-acceptance.mjs @@ -725,13 +725,12 @@ async function rbacAndMemberModule() { assertEqual(json.data?.status, 'DISABLED', 'role status') }, ({ json }) => ({ roleId: json.data.id, status: json.data.status })) if (disabledRole) { - await softApiStep('menu-permissions', 'disabled role is reflected by live permission query', { + await softApiStep('menu-permissions', 'disabled role revokes stale token permission query', { method: 'GET', path: '/api/merchant/v1/iam/authorization/permissions', token: memberToken, }, ({ json, status }) => { - assertEqual(status, 200, 'HTTP status') - requireSuccess(json) - assertEqual(arrayData(json.data).length, 0, 'effective backend permission count') - }, ({ json }) => ({ backendPermissions: json?.data, visibleClientMenus: visibleClientMenus(arrayData(json?.data)) })) + assertEqual(status, 401, 'HTTP status') + assertEqual(String(json?.code), 'A0401', 'business code') + }, ({ json }) => ({ rejectionCode: json?.code, message: json?.message })) await softApiStep('menu-permissions', 'disabled role blocks stale token order access', { method: 'GET', path: '/api/merchant/v1/orders/first-leg?page=1&size=20', token: memberToken, }, ({ json, status }) => { diff --git a/warehouse/AGENTS.md b/warehouse/AGENTS.md index 1435ecbab..3debd115e 100644 --- a/warehouse/AGENTS.md +++ b/warehouse/AGENTS.md @@ -28,7 +28,7 @@ | 请求与详情 DTO | `dto/WarehouseRequests.java`、`WarehouseDetailResponse.java`、`MasterDataQueries.java` | | 仓库、地址、能力、往来单位与快递公司持久化 | `entity/`、`mapper/`、`repository/`;往来单位多类型关联为 `PartnerTypeEntity.java` 与 `wh_partner_type` | | 表结构、伙伴、快递公司与种子数据 | `src/main/resources/db/warehouse.sql`、`warehouse-partner.sql`、`warehouse-express-company.sql`、`phase1-warehouse-schema-migration.sql`、`warehouse-seed.sql` | -| 二期托盘库位表与迁移 | `src/main/resources/db/phase2-pallet-location-schema.sql`、`phase2-pallet-location-schema-migration.sql`、`phase2-location-overflow-migration.sql`;统一部署入口 `../deploy/sql/2026-08-04-二期入库新增表字段-MySQL8一键执行.sql` | +| 二期托盘库位表与迁移 | `src/main/resources/db/phase2-pallet-location-schema.sql`、`phase2-pallet-location-schema-migration.sql`、`phase2-location-overflow-migration.sql`;统一部署入口 `../deploy/sql/头程数据库统一增量-MySQL8.sql`,历史日期脚本仅作追溯 | | 测试 | `src/test/java/com/baiyue/warehouse/` | ## 修改与验证 @@ -49,3 +49,9 @@ - Warehouse 的数据库访问异常和 readiness/结构状态探针都保留真实 HTTP 503;其他由公共异常处理器捕获的业务失败才使用 HTTP 200 + body code。 - 从父目录运行 `mvn -pl warehouse -am test`,再运行 `scripts/order-warehouse-real-api-regression.ps1`。 - 二期直接验证至少运行 `PalletApplicationServiceTest`、`LocationApplicationServiceTest`、`LocationResourceServiceTest`、`PalletLocationAllocationServiceTest` 及两个平台 Controller 契约测试;存量数据库迁移后确认统一脚本末尾 Warehouse 核验全部为 `PASS`。 + +## 分期快速索引 + +- 一期:`PlatformWarehouseController`、`InternalWarehouseController`、Partner/Express Controller 提供平台公共仓与主数据;先读 `../../docs/一期/README.md`、`../../docs/一期/一期头程订单闭环设计.md`。资源归属固定 `tenant_id=0`,不得绑定客户或由客户筛选候选范围。 +- 二期:`PlatformPalletController`、`PlatformLocationController`、`InternalPalletLocationController` 支撑托盘/库位预占、确认、释放;先读 `../../docs/二期/README.md`、主流程文档和 8 月 4 日迁移说明。入库状态仍归 `firstleg/`,Warehouse 只维护资源容量与占用。 +- 三期:当前 NO-GO;暂不实现分柜、装柜、出仓库存扣减或 PDA 专用资源。解除 `../../docs/三期/三期需求确认表.md` 阻断项后,再锁定资源状态机与 Firstleg 内部 DTO。 diff --git a/warehouse/src/main/java/com/baiyue/warehouse/dto/MasterDataQueries.java b/warehouse/src/main/java/com/baiyue/warehouse/dto/MasterDataQueries.java index e8aac8088..242fa64d7 100644 --- a/warehouse/src/main/java/com/baiyue/warehouse/dto/MasterDataQueries.java +++ b/warehouse/src/main/java/com/baiyue/warehouse/dto/MasterDataQueries.java @@ -28,7 +28,16 @@ public final class MasterDataQueries { @Pattern(regexp = "^(CUSTOMER|SUPPLIER|BOTH|CARRIER|CUSTOMS_BROKER|SHIPPER|CONSIGNEE)$") String type, @Schema(description = "状态", allowableValues = {"ACTIVE", "INACTIVE"}) @Pattern(regexp = "^(ACTIVE|INACTIVE)$") String status + , + @Schema(description = "往来单位类型集合(可重复传参)", allowableValues = { + "CUSTOMER", "SUPPLIER", "CARRIER", "CUSTOMS_BROKER", "SHIPPER", "CONSIGNEE"}) + @Size(max = 6) List<@Pattern(regexp = "^(CUSTOMER|SUPPLIER|CARRIER|CUSTOMS_BROKER|SHIPPER|CONSIGNEE)$") String> types ) { + /** 保持旧版五参数构造契约兼容。 */ + public PartnerPageQuery(long page, long size, String keyword, String type, String status) { + this(page, size, keyword, type, status, null); + } + public PartnerPageQuery { if (page == 0) { page = 1;